13d0407baSopenharmony_ci/*
23d0407baSopenharmony_ci * Copyright (c) 2022 FuZhou Lockzhiner Electronic Co., Ltd. All rights reserved.
33d0407baSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43d0407baSopenharmony_ci * you may not use this file except in compliance with the License.
53d0407baSopenharmony_ci * You may obtain a copy of the License at
63d0407baSopenharmony_ci *
73d0407baSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
83d0407baSopenharmony_ci *
93d0407baSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103d0407baSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113d0407baSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123d0407baSopenharmony_ci * See the License for the specific language governing permissions and
133d0407baSopenharmony_ci * limitations under the License.
143d0407baSopenharmony_ci */
153d0407baSopenharmony_ci#include <stdio.h>
163d0407baSopenharmony_ci#include <stdint.h>
173d0407baSopenharmony_ci#include <stdlib.h>
183d0407baSopenharmony_ci
193d0407baSopenharmony_ci#include "hdf_device_desc.h"
203d0407baSopenharmony_ci#include "device_resource_if.h"
213d0407baSopenharmony_ci#include "osal_mem.h"
223d0407baSopenharmony_ci#include "i2c_core.h"
233d0407baSopenharmony_ci#include "i2c_if.h"
243d0407baSopenharmony_ci
253d0407baSopenharmony_ci#include "lz_hardware.h"
263d0407baSopenharmony_ci
273d0407baSopenharmony_ci#define PRINT_ERR(fmt, args...)     do { \
283d0407baSopenharmony_ci    printf("%s, %d, error: "fmt, __func__, __LINE__, ##args); \
293d0407baSopenharmony_ci} while (0)
303d0407baSopenharmony_ci
313d0407baSopenharmony_ci#define PRINT_WARR(fmt, args...)    do { \
323d0407baSopenharmony_ci    if (1) printf("%s, %d, warr: "fmt, __func__, __LINE__, ##args); \
333d0407baSopenharmony_ci} while (0)
343d0407baSopenharmony_ci
353d0407baSopenharmony_ci#define PRINT_LOG(fmt, args...)    do { \
363d0407baSopenharmony_ci    if (1) printf("%s, %d, log: "fmt, __func__, __LINE__, ##args); \
373d0407baSopenharmony_ci} while (0)
383d0407baSopenharmony_ci
393d0407baSopenharmony_cistruct i2c_bus {
403d0407baSopenharmony_ci    uint32_t bus;
413d0407baSopenharmony_ci    uint32_t id;
423d0407baSopenharmony_ci    uint32_t mode;
433d0407baSopenharmony_ci    uint32_t freq;
443d0407baSopenharmony_ci    uint32_t scl_gpio;
453d0407baSopenharmony_ci    uint32_t scl_func;
463d0407baSopenharmony_ci    uint32_t scl_type;
473d0407baSopenharmony_ci    uint32_t scl_drv;
483d0407baSopenharmony_ci    uint32_t scl_dir;
493d0407baSopenharmony_ci    uint32_t scl_val;
503d0407baSopenharmony_ci    uint32_t scl_mux;
513d0407baSopenharmony_ci    uint32_t sda_gpio;
523d0407baSopenharmony_ci    uint32_t sda_func;
533d0407baSopenharmony_ci    uint32_t sda_type;
543d0407baSopenharmony_ci    uint32_t sda_drv;
553d0407baSopenharmony_ci    uint32_t sda_dir;
563d0407baSopenharmony_ci    uint32_t sda_val;
573d0407baSopenharmony_ci    uint32_t sda_mux;
583d0407baSopenharmony_ci};
593d0407baSopenharmony_ci
603d0407baSopenharmony_cistatic int32_t i2cdrv_initdevice(const struct i2c_bus *bus)
613d0407baSopenharmony_ci{
623d0407baSopenharmony_ci    unsigned int ret;
633d0407baSopenharmony_ci    I2cBusIo i2cBus;
643d0407baSopenharmony_ci    unsigned int i2cBusId;
653d0407baSopenharmony_ci    unsigned int i2cFreq;
663d0407baSopenharmony_ci    GpioID sclGpio, sdaGpio;
673d0407baSopenharmony_ci    MuxFunc sclMux, sdaMux;
683d0407baSopenharmony_ci
693d0407baSopenharmony_ci    if (bus == NULL) {
703d0407baSopenharmony_ci        PRINT_ERR("%s: bus is null\n", __func__);
713d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
723d0407baSopenharmony_ci    }
733d0407baSopenharmony_ci
743d0407baSopenharmony_ci    i2cBusId = (unsigned int)(bus->bus);
753d0407baSopenharmony_ci    i2cFreq = (unsigned int)(bus->freq);
763d0407baSopenharmony_ci    /* 初始化i2c配置结构体 */
773d0407baSopenharmony_ci    i2cBus.id = (FuncID)(bus->id);
783d0407baSopenharmony_ci    i2cBus.mode = (FuncMode)(bus->mode);
793d0407baSopenharmony_ci    i2cBus.scl.gpio = (GpioID)(bus->scl_gpio);
803d0407baSopenharmony_ci    i2cBus.scl.func = (MuxFunc)(bus->scl_func);
813d0407baSopenharmony_ci    i2cBus.scl.type = (PullType)(bus->scl_type);
823d0407baSopenharmony_ci    i2cBus.scl.drv = (DriveLevel)(bus->scl_drv);
833d0407baSopenharmony_ci    i2cBus.scl.dir = (LzGpioDir)(bus->scl_dir);
843d0407baSopenharmony_ci    i2cBus.scl.val = (LzGpioValue)(bus->scl_val);
853d0407baSopenharmony_ci    i2cBus.sda.gpio = (GpioID)(bus->sda_gpio);
863d0407baSopenharmony_ci    i2cBus.sda.func = (MuxFunc)(bus->sda_func);
873d0407baSopenharmony_ci    i2cBus.sda.type = (PullType)(bus->sda_type);
883d0407baSopenharmony_ci    i2cBus.sda.drv = (DriveLevel)(bus->sda_drv);
893d0407baSopenharmony_ci    i2cBus.sda.dir = (LzGpioDir)(bus->sda_dir);
903d0407baSopenharmony_ci    i2cBus.sda.val = (LzGpioValue)(bus->sda_val);
913d0407baSopenharmony_ci    /* 初始化引脚复用寄存器 */
923d0407baSopenharmony_ci    sclGpio = (GpioID)(bus->scl_gpio);
933d0407baSopenharmony_ci    sclMux = (MuxFunc)(bus->scl_mux);
943d0407baSopenharmony_ci    sdaGpio = (GpioID)(bus->sda_gpio);
953d0407baSopenharmony_ci    sdaMux = (MuxFunc)(bus->sda_mux);
963d0407baSopenharmony_ci
973d0407baSopenharmony_ci    ret = I2cIoInit(i2cBus);
983d0407baSopenharmony_ci    if (ret != LZ_HARDWARE_SUCCESS) {
993d0407baSopenharmony_ci        PRINT_ERR("%s: I2cIoInit failed(%u)\n", __func__, ret);
1003d0407baSopenharmony_ci        return HDF_FAILURE;
1013d0407baSopenharmony_ci    }
1023d0407baSopenharmony_ci
1033d0407baSopenharmony_ci    ret = LzI2cInit(i2cBusId, i2cFreq);
1043d0407baSopenharmony_ci    if (ret != LZ_HARDWARE_SUCCESS) {
1053d0407baSopenharmony_ci        PRINT_ERR("%s: LzI2cInit failed(%u)\n", __func__, ret);
1063d0407baSopenharmony_ci        return HDF_FAILURE;
1073d0407baSopenharmony_ci    }
1083d0407baSopenharmony_ci
1093d0407baSopenharmony_ci    PinctrlSet(sclGpio, sclMux, PULL_KEEP, DRIVE_KEEP);
1103d0407baSopenharmony_ci    PinctrlSet(sdaGpio, sdaMux, PULL_KEEP, DRIVE_KEEP);
1113d0407baSopenharmony_ci
1123d0407baSopenharmony_ci    return HDF_SUCCESS;
1133d0407baSopenharmony_ci}
1143d0407baSopenharmony_ci
1153d0407baSopenharmony_cistatic void i2cdrv_deinitdevice(const struct i2c_bus *bus)
1163d0407baSopenharmony_ci{
1173d0407baSopenharmony_ci    unsigned int i2cBusId;
1183d0407baSopenharmony_ci
1193d0407baSopenharmony_ci    if (bus == NULL) {
1203d0407baSopenharmony_ci        PRINT_ERR("%s: bus is null\n", __func__);
1213d0407baSopenharmony_ci        return;
1223d0407baSopenharmony_ci    }
1233d0407baSopenharmony_ci
1243d0407baSopenharmony_ci    i2cBusId = (unsigned int)(bus->bus);
1253d0407baSopenharmony_ci    LzI2cDeinit(i2cBusId);
1263d0407baSopenharmony_ci}
1273d0407baSopenharmony_ci
1283d0407baSopenharmony_cistatic int32_t i2cdrv_readdrs(struct DeviceResourceNode *node, struct i2c_bus *bus)
1293d0407baSopenharmony_ci{
1303d0407baSopenharmony_ci    int32_t ret;
1313d0407baSopenharmony_ci    struct DeviceResourceIface *iface = NULL;
1323d0407baSopenharmony_ci
1333d0407baSopenharmony_ci    if (node == NULL) {
1343d0407baSopenharmony_ci        PRINT_ERR("%s: node is null\n", __func__);
1353d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1363d0407baSopenharmony_ci    }
1373d0407baSopenharmony_ci    if (bus == NULL) {
1383d0407baSopenharmony_ci        PRINT_ERR("%s: bus is null\n", __func__);
1393d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1403d0407baSopenharmony_ci    }
1413d0407baSopenharmony_ci
1423d0407baSopenharmony_ci    iface = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);
1433d0407baSopenharmony_ci    if (iface == NULL) {
1443d0407baSopenharmony_ci        PRINT_ERR("%s: iface is null\n", __func__);
1453d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1463d0407baSopenharmony_ci    }
1473d0407baSopenharmony_ci    if (iface->GetUint32 == NULL) {
1483d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32 is null\n", __func__);
1493d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
1503d0407baSopenharmony_ci    }
1513d0407baSopenharmony_ci
1523d0407baSopenharmony_ci    memset_s(bus, sizeof(struct i2c_bus), 0, sizeof(struct i2c_bus));
1533d0407baSopenharmony_ci
1543d0407baSopenharmony_ci    ret = iface->GetUint32(node, "bus", &bus->bus, 0);
1553d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
1563d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(bus) failed\n", __func__);
1573d0407baSopenharmony_ci        return HDF_FAILURE;
1583d0407baSopenharmony_ci    }
1593d0407baSopenharmony_ci
1603d0407baSopenharmony_ci    ret = iface->GetUint32(node, "id", &bus->id, 0);
1613d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
1623d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(id) failed\n", __func__);
1633d0407baSopenharmony_ci        return HDF_FAILURE;
1643d0407baSopenharmony_ci    }
1653d0407baSopenharmony_ci
1663d0407baSopenharmony_ci    ret = iface->GetUint32(node, "mode", &bus->mode, 0);
1673d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
1683d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(mode) failed\n", __func__);
1693d0407baSopenharmony_ci        return HDF_FAILURE;
1703d0407baSopenharmony_ci    }
1713d0407baSopenharmony_ci
1723d0407baSopenharmony_ci    ret = iface->GetUint32(node, "freq", &bus->freq, 0);
1733d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
1743d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(freq) failed\n", __func__);
1753d0407baSopenharmony_ci        return HDF_FAILURE;
1763d0407baSopenharmony_ci    }
1773d0407baSopenharmony_ci
1783d0407baSopenharmony_ci    ret = iface->GetUint32(node, "scl_gpio", &bus->scl_gpio, 0);
1793d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
1803d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(scl_gpio) failed\n", __func__);
1813d0407baSopenharmony_ci        return HDF_FAILURE;
1823d0407baSopenharmony_ci    }
1833d0407baSopenharmony_ci
1843d0407baSopenharmony_ci    ret = iface->GetUint32(node, "scl_func", &bus->scl_func, 0);
1853d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
1863d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(scl_func) failed\n", __func__);
1873d0407baSopenharmony_ci        return HDF_FAILURE;
1883d0407baSopenharmony_ci    }
1893d0407baSopenharmony_ci
1903d0407baSopenharmony_ci    ret = iface->GetUint32(node, "scl_type", &bus->scl_type, 0);
1913d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
1923d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(scl_type) failed\n", __func__);
1933d0407baSopenharmony_ci        return HDF_FAILURE;
1943d0407baSopenharmony_ci    }
1953d0407baSopenharmony_ci
1963d0407baSopenharmony_ci    ret = iface->GetUint32(node, "scl_drv", &bus->scl_drv, 0);
1973d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
1983d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(scl_drv) failed\n", __func__);
1993d0407baSopenharmony_ci        return HDF_FAILURE;
2003d0407baSopenharmony_ci    }
2013d0407baSopenharmony_ci
2023d0407baSopenharmony_ci    ret = iface->GetUint32(node, "scl_dir", &bus->scl_dir, 0);
2033d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2043d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(scl_dir) failed\n", __func__);
2053d0407baSopenharmony_ci        return HDF_FAILURE;
2063d0407baSopenharmony_ci    }
2073d0407baSopenharmony_ci
2083d0407baSopenharmony_ci    ret = iface->GetUint32(node, "scl_val", &bus->scl_val, 0);
2093d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2103d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(scl_val) failed\n", __func__);
2113d0407baSopenharmony_ci        return HDF_FAILURE;
2123d0407baSopenharmony_ci    }
2133d0407baSopenharmony_ci
2143d0407baSopenharmony_ci    ret = iface->GetUint32(node, "scl_mux", &bus->scl_mux, 0);
2153d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2163d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(scl_mux) failed\n", __func__);
2173d0407baSopenharmony_ci        return HDF_FAILURE;
2183d0407baSopenharmony_ci    }
2193d0407baSopenharmony_ci
2203d0407baSopenharmony_ci    ret = iface->GetUint32(node, "sda_gpio", &bus->sda_gpio, 0);
2213d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2223d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(sda_gpio) failed\n", __func__);
2233d0407baSopenharmony_ci        return HDF_FAILURE;
2243d0407baSopenharmony_ci    }
2253d0407baSopenharmony_ci
2263d0407baSopenharmony_ci    ret = iface->GetUint32(node, "sda_func", &bus->sda_func, 0);
2273d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2283d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(sda_func) failed\n", __func__);
2293d0407baSopenharmony_ci        return HDF_FAILURE;
2303d0407baSopenharmony_ci    }
2313d0407baSopenharmony_ci
2323d0407baSopenharmony_ci    ret = iface->GetUint32(node, "sda_type", &bus->sda_type, 0);
2333d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2343d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(sda_type) failed\n", __func__);
2353d0407baSopenharmony_ci        return HDF_FAILURE;
2363d0407baSopenharmony_ci    }
2373d0407baSopenharmony_ci
2383d0407baSopenharmony_ci    ret = iface->GetUint32(node, "sda_drv", &bus->sda_drv, 0);
2393d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2403d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(sda_drv) failed\n", __func__);
2413d0407baSopenharmony_ci        return HDF_FAILURE;
2423d0407baSopenharmony_ci    }
2433d0407baSopenharmony_ci
2443d0407baSopenharmony_ci    ret = iface->GetUint32(node, "sda_dir", &bus->sda_dir, 0);
2453d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2463d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(sda_dir) failed\n", __func__);
2473d0407baSopenharmony_ci        return HDF_FAILURE;
2483d0407baSopenharmony_ci    }
2493d0407baSopenharmony_ci
2503d0407baSopenharmony_ci    ret = iface->GetUint32(node, "sda_val", &bus->sda_val, 0);
2513d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2523d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(sda_val) failed\n", __func__);
2533d0407baSopenharmony_ci        return HDF_FAILURE;
2543d0407baSopenharmony_ci    }
2553d0407baSopenharmony_ci
2563d0407baSopenharmony_ci    ret = iface->GetUint32(node, "sda_mux", &bus->sda_mux, 0);
2573d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2583d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(sda_mux) failed\n", __func__);
2593d0407baSopenharmony_ci        return HDF_FAILURE;
2603d0407baSopenharmony_ci    }
2613d0407baSopenharmony_ci
2623d0407baSopenharmony_ci    return HDF_SUCCESS;
2633d0407baSopenharmony_ci}
2643d0407baSopenharmony_ci
2653d0407baSopenharmony_cistatic int32_t i2cdrv_transfer(struct I2cCntlr *cntlr, struct I2cMsg *msgs, int16_t count)
2663d0407baSopenharmony_ci{
2673d0407baSopenharmony_ci#define I2C_MSGS_MAX        2 // LzI2cMsgs最大数组个数
2683d0407baSopenharmony_ci    int16_t i;
2693d0407baSopenharmony_ci    unsigned int ret;
2703d0407baSopenharmony_ci    unsigned int i2cBusId;
2713d0407baSopenharmony_ci    struct i2c_bus *bus;
2723d0407baSopenharmony_ci    struct I2cMsg *msg, *msg2;
2733d0407baSopenharmony_ci    unsigned short addr;
2743d0407baSopenharmony_ci    unsigned char *buf;
2753d0407baSopenharmony_ci    unsigned short buf_len;
2763d0407baSopenharmony_ci    LzI2cMsg lzI2cMsgs[I2C_MSGS_MAX];
2773d0407baSopenharmony_ci
2783d0407baSopenharmony_ci    if (cntlr == NULL) {
2793d0407baSopenharmony_ci        PRINT_ERR("%s: cntlr is null\n", __func__);
2803d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
2813d0407baSopenharmony_ci    }
2823d0407baSopenharmony_ci    if (cntlr->priv == NULL) {
2833d0407baSopenharmony_ci        PRINT_ERR("%s: cntlr->priv is null\n", __func__);
2843d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
2853d0407baSopenharmony_ci    }
2863d0407baSopenharmony_ci    if (msgs == NULL) {
2873d0407baSopenharmony_ci        PRINT_ERR("%s: msgs is null\n", __func__);
2883d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
2893d0407baSopenharmony_ci    }
2903d0407baSopenharmony_ci
2913d0407baSopenharmony_ci    bus = (struct i2c_bus *)cntlr->priv;
2923d0407baSopenharmony_ci    i2cBusId = (unsigned int)(bus->bus);
2933d0407baSopenharmony_ci
2943d0407baSopenharmony_ci    for (i = 0; i < count; i++) {
2953d0407baSopenharmony_ci        msg = &msgs[i];
2963d0407baSopenharmony_ci
2973d0407baSopenharmony_ci        if (msg->flags == I2C_FLAG_READ) {
2983d0407baSopenharmony_ci            addr = (unsigned short)(msg->addr);
2993d0407baSopenharmony_ci            *buf = (unsigned char *)(msg->buf);
3003d0407baSopenharmony_ci            buf_len = (unsigned short)(msg->len);
3013d0407baSopenharmony_ci
3023d0407baSopenharmony_ci            ret = LzI2cRead(i2cBusId, addr, buf, buf_len);
3033d0407baSopenharmony_ci            if (ret != LZ_HARDWARE_SUCCESS) {
3043d0407baSopenharmony_ci                PRINT_ERR("%s: LzI2cRead failed(%u)\n", __func__, ret);
3053d0407baSopenharmony_ci                return i;
3063d0407baSopenharmony_ci            }
3073d0407baSopenharmony_ci        } else if (msg->flags == I2C_FLAG_STOP) {
3083d0407baSopenharmony_ci            /* 本字符串是写,下一个字符串是读,一起操作 */
3093d0407baSopenharmony_ci            i++;
3103d0407baSopenharmony_ci            msg2 = &msgs[i];
3113d0407baSopenharmony_ci
3123d0407baSopenharmony_ci            lzI2cMsgs[0].addr = (unsigned short)(msg->addr);
3133d0407baSopenharmony_ci            lzI2cMsgs[0].flags = (unsigned short)(msg->flags);
3143d0407baSopenharmony_ci            lzI2cMsgs[0].len = (unsigned short)(msg->len);
3153d0407baSopenharmony_ci            lzI2cMsgs[0].buf = (unsigned char *)(msg->buf);
3163d0407baSopenharmony_ci
3173d0407baSopenharmony_ci            lzI2cMsgs[1].addr = (unsigned short)(msg2->addr);
3183d0407baSopenharmony_ci            lzI2cMsgs[1].flags = (unsigned short)(msg2->flags);
3193d0407baSopenharmony_ci            lzI2cMsgs[1].len = (unsigned short)(msg2->len);
3203d0407baSopenharmony_ci            lzI2cMsgs[1].buf = (unsigned char *)(msg2->buf);
3213d0407baSopenharmony_ci
3223d0407baSopenharmony_ci            ret = LzI2cTransfer(i2cBusId, &lzI2cMsgs[0], I2C_MSGS_MAX);
3233d0407baSopenharmony_ci            if (ret != LZ_HARDWARE_SUCCESS) {
3243d0407baSopenharmony_ci                PRINT_ERR("%s: LzI2cTransfer failed(%u)\n", __func__, ret);
3253d0407baSopenharmony_ci                return i;
3263d0407baSopenharmony_ci            }
3273d0407baSopenharmony_ci        } else {
3283d0407baSopenharmony_ci            addr = (unsigned short)(msg->addr);
3293d0407baSopenharmony_ci            *buf = (unsigned char *)(msg->buf);
3303d0407baSopenharmony_ci            buf_len = (unsigned short)(msg->len);
3313d0407baSopenharmony_ci
3323d0407baSopenharmony_ci            ret = LzI2cWrite(i2cBusId, addr, buf, buf_len);
3333d0407baSopenharmony_ci            if (ret != LZ_HARDWARE_SUCCESS) {
3343d0407baSopenharmony_ci                PRINT_ERR("%s: LzI2cWrite failed(%u)\n", __func__, ret);
3353d0407baSopenharmony_ci                return i;
3363d0407baSopenharmony_ci            }
3373d0407baSopenharmony_ci        }
3383d0407baSopenharmony_ci    }
3393d0407baSopenharmony_ci
3403d0407baSopenharmony_ci    return i;
3413d0407baSopenharmony_ci}
3423d0407baSopenharmony_ci
3433d0407baSopenharmony_cistatic struct I2cMethod m_i2c_method = {
3443d0407baSopenharmony_ci    .transfer = i2cdrv_transfer,
3453d0407baSopenharmony_ci};
3463d0407baSopenharmony_ci
3473d0407baSopenharmony_cistatic int32_t i2cdrv_init(struct HdfDeviceObject *device)
3483d0407baSopenharmony_ci{
3493d0407baSopenharmony_ci    int32_t ret;
3503d0407baSopenharmony_ci    struct I2cCntlr *cntlr = NULL;
3513d0407baSopenharmony_ci    struct i2c_bus *bus = NULL;
3523d0407baSopenharmony_ci
3533d0407baSopenharmony_ci    PLAT_LOGI("%s: Enter", __func__);
3543d0407baSopenharmony_ci    if ((device == NULL) || (device->property == NULL)) {
3553d0407baSopenharmony_ci        PRINT_ERR("%s: device or property is null\n", __func__);
3563d0407baSopenharmony_ci        return HDF_ERR_INVALID_OBJECT;
3573d0407baSopenharmony_ci    }
3583d0407baSopenharmony_ci
3593d0407baSopenharmony_ci    cntlr = (struct I2cCntlr *)OsalMemAlloc(sizeof(struct I2cCntlr));
3603d0407baSopenharmony_ci    bus = (struct i2c_bus *)OsalMemAlloc(sizeof(struct i2c_bus));
3613d0407baSopenharmony_ci
3623d0407baSopenharmony_ci    if (cntlr == NULL) {
3633d0407baSopenharmony_ci        PRINT_ERR("%s: cntlr is null\n", __func__);
3643d0407baSopenharmony_ci        if (bus != NULL) {
3653d0407baSopenharmony_ci            OsalMemFree(bus);
3663d0407baSopenharmony_ci            bus = NULL;
3673d0407baSopenharmony_ci        }
3683d0407baSopenharmony_ci        if (cntlr != NULL) {
3693d0407baSopenharmony_ci            OsalMemFree(cntlr);
3703d0407baSopenharmony_ci            cntlr = NULL;
3713d0407baSopenharmony_ci        }
3723d0407baSopenharmony_ci        return HDF_ERR_MALLOC_FAIL;
3733d0407baSopenharmony_ci    }
3743d0407baSopenharmony_ci    if (bus == NULL) {
3753d0407baSopenharmony_ci        PRINT_ERR("%s: bus is null\n", __func__);
3763d0407baSopenharmony_ci        if (bus != NULL) {
3773d0407baSopenharmony_ci            OsalMemFree(bus);
3783d0407baSopenharmony_ci            bus = NULL;
3793d0407baSopenharmony_ci        }
3803d0407baSopenharmony_ci        if (cntlr != NULL) {
3813d0407baSopenharmony_ci            OsalMemFree(cntlr);
3823d0407baSopenharmony_ci            cntlr = NULL;
3833d0407baSopenharmony_ci        }
3843d0407baSopenharmony_ci        return HDF_ERR_MALLOC_FAIL;
3853d0407baSopenharmony_ci    }
3863d0407baSopenharmony_ci
3873d0407baSopenharmony_ci    memset_s(cntlr, sizeof(struct I2cCntlr), 0, sizeof(struct I2cCntlr));
3883d0407baSopenharmony_ci    cntlr->ops = &m_i2c_method;
3893d0407baSopenharmony_ci    device->priv = (void *)cntlr;
3903d0407baSopenharmony_ci
3913d0407baSopenharmony_ci    ret = i2cdrv_readdrs(device->property, bus);
3923d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
3933d0407baSopenharmony_ci        PRINT_ERR("%s: i2cdrv_readdrs error\n", __func__);
3943d0407baSopenharmony_ci        cntlr->priv = NULL;
3953d0407baSopenharmony_ci        cntlr->ops = NULL;
3963d0407baSopenharmony_ci        device->priv = NULL;
3973d0407baSopenharmony_ci        if (bus != NULL) {
3983d0407baSopenharmony_ci            OsalMemFree(bus);
3993d0407baSopenharmony_ci            bus = NULL;
4003d0407baSopenharmony_ci        }
4013d0407baSopenharmony_ci        if (cntlr != NULL) {
4023d0407baSopenharmony_ci            OsalMemFree(cntlr);
4033d0407baSopenharmony_ci            cntlr = NULL;
4043d0407baSopenharmony_ci        }
4053d0407baSopenharmony_ci        return ret;
4063d0407baSopenharmony_ci    }
4073d0407baSopenharmony_ci
4083d0407baSopenharmony_ci    ret = i2cdrv_initdevice(bus);
4093d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
4103d0407baSopenharmony_ci        PRINT_ERR("%s: i2cdrv_readdrs error\n", __func__);
4113d0407baSopenharmony_ci        i2cdrv_deinitdevice(bus);
4123d0407baSopenharmony_ci        cntlr->priv = NULL;
4133d0407baSopenharmony_ci        cntlr->ops = NULL;
4143d0407baSopenharmony_ci        device->priv = NULL;
4153d0407baSopenharmony_ci        if (bus != NULL) {
4163d0407baSopenharmony_ci            OsalMemFree(bus);
4173d0407baSopenharmony_ci            bus = NULL;
4183d0407baSopenharmony_ci        }
4193d0407baSopenharmony_ci        if (cntlr != NULL) {
4203d0407baSopenharmony_ci            OsalMemFree(cntlr);
4213d0407baSopenharmony_ci            cntlr = NULL;
4223d0407baSopenharmony_ci        }
4233d0407baSopenharmony_ci        return ret;
4243d0407baSopenharmony_ci    }
4253d0407baSopenharmony_ci
4263d0407baSopenharmony_ci    cntlr->priv = (void *)bus;
4273d0407baSopenharmony_ci
4283d0407baSopenharmony_ci    ret = I2cCntlrAdd(cntlr);
4293d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
4303d0407baSopenharmony_ci        PRINT_ERR("%s: i2c cntlr add failed\n", __func__);
4313d0407baSopenharmony_ci        I2cCntlrRemove(cntlr);
4323d0407baSopenharmony_ci        i2cdrv_deinitdevice(bus);
4333d0407baSopenharmony_ci        cntlr->priv = NULL;
4343d0407baSopenharmony_ci        cntlr->ops = NULL;
4353d0407baSopenharmony_ci        device->priv = NULL;
4363d0407baSopenharmony_ci        if (bus != NULL) {
4373d0407baSopenharmony_ci            OsalMemFree(bus);
4383d0407baSopenharmony_ci            bus = NULL;
4393d0407baSopenharmony_ci        }
4403d0407baSopenharmony_ci        if (cntlr != NULL) {
4413d0407baSopenharmony_ci            OsalMemFree(cntlr);
4423d0407baSopenharmony_ci            cntlr = NULL;
4433d0407baSopenharmony_ci        }
4443d0407baSopenharmony_ci        return ret;
4453d0407baSopenharmony_ci    }
4463d0407baSopenharmony_ci
4473d0407baSopenharmony_ci    PRINT_LOG("i2c service: %s init success!\n", HdfDeviceGetServiceName(device));
4483d0407baSopenharmony_ci    return HDF_SUCCESS;
4493d0407baSopenharmony_ci}
4503d0407baSopenharmony_ci
4513d0407baSopenharmony_cistatic void i2cdrv_release(struct HdfDeviceObject *device)
4523d0407baSopenharmony_ci{
4533d0407baSopenharmony_ci    struct I2cCntlr *cntlr = NULL;
4543d0407baSopenharmony_ci    struct i2c_bus *bus = NULL;
4553d0407baSopenharmony_ci
4563d0407baSopenharmony_ci    if (device == NULL) {
4573d0407baSopenharmony_ci        PRINT_ERR("%s: device is null\n", __func__);
4583d0407baSopenharmony_ci        return;
4593d0407baSopenharmony_ci    }
4603d0407baSopenharmony_ci
4613d0407baSopenharmony_ci    cntlr = (struct I2cCntlr *)device->priv;
4623d0407baSopenharmony_ci    if (cntlr == NULL) {
4633d0407baSopenharmony_ci        PRINT_ERR("%s: cntlr is null\n", __func__);
4643d0407baSopenharmony_ci        return;
4653d0407baSopenharmony_ci    }
4663d0407baSopenharmony_ci
4673d0407baSopenharmony_ci    bus = (struct i2c_bus *)cntlr->priv;
4683d0407baSopenharmony_ci    if (bus == NULL) {
4693d0407baSopenharmony_ci        PRINT_ERR("%s: bus is null\n", __func__);
4703d0407baSopenharmony_ci        return;
4713d0407baSopenharmony_ci    }
4723d0407baSopenharmony_ci
4733d0407baSopenharmony_ci    I2cCntlrRemove(cntlr);
4743d0407baSopenharmony_ci    i2cdrv_deinitdevice(bus);
4753d0407baSopenharmony_ci    cntlr->priv = NULL;
4763d0407baSopenharmony_ci    cntlr->ops = NULL;
4773d0407baSopenharmony_ci    device->priv = NULL;
4783d0407baSopenharmony_ci    if (bus != NULL) {
4793d0407baSopenharmony_ci        OsalMemFree(bus);
4803d0407baSopenharmony_ci        bus = NULL;
4813d0407baSopenharmony_ci    }
4823d0407baSopenharmony_ci    if (cntlr != NULL) {
4833d0407baSopenharmony_ci        OsalMemFree(cntlr);
4843d0407baSopenharmony_ci        cntlr = NULL;
4853d0407baSopenharmony_ci    }
4863d0407baSopenharmony_ci
4873d0407baSopenharmony_ci    PRINT_LOG("i2c service: %s release\n", HdfDeviceGetServiceName(device));
4883d0407baSopenharmony_ci}
4893d0407baSopenharmony_ci
4903d0407baSopenharmony_cistatic int32_t i2cdrv_bind(struct HdfDeviceObject *device)
4913d0407baSopenharmony_ci{
4923d0407baSopenharmony_ci    return HDF_SUCCESS;
4933d0407baSopenharmony_ci}
4943d0407baSopenharmony_ci
4953d0407baSopenharmony_cistruct HdfDriverEntry g_i2cDriverEntry = {
4963d0407baSopenharmony_ci    .moduleVersion = 1,
4973d0407baSopenharmony_ci    .moduleName = "HDF_PLATFORM_I2C",
4983d0407baSopenharmony_ci    .Init = i2cdrv_init,
4993d0407baSopenharmony_ci    .Release = i2cdrv_release,
5003d0407baSopenharmony_ci    .Bind = i2cdrv_bind,
5013d0407baSopenharmony_ci};
5023d0407baSopenharmony_ci
5033d0407baSopenharmony_ciHDF_INIT(g_i2cDriverEntry);
504