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