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 "hdf_log.h"
223d0407baSopenharmony_ci#include "osal_mem.h"
233d0407baSopenharmony_ci#include "spi_core.h"
243d0407baSopenharmony_ci#include "spi_if.h"
253d0407baSopenharmony_ci
263d0407baSopenharmony_ci#include "lz_hardware.h"
273d0407baSopenharmony_ci
283d0407baSopenharmony_ci#define PRINT_ERR(fmt, args...)     do { \
293d0407baSopenharmony_ci    printf("%s, %d, error: "fmt, __func__, __LINE__, ##args); \
303d0407baSopenharmony_ci} while (0)
313d0407baSopenharmony_ci
323d0407baSopenharmony_ci#define PRINT_WARR(fmt, args...)    do { \
333d0407baSopenharmony_ci    if (1) printf("%s, %d, warr: "fmt, __func__, __LINE__, ##args); \
343d0407baSopenharmony_ci} while (0)
353d0407baSopenharmony_ci
363d0407baSopenharmony_ci#define PRINT_LOG(fmt, args...)    do { \
373d0407baSopenharmony_ci    if (1) printf("%s, %d, log: "fmt, __func__, __LINE__, ##args); \
383d0407baSopenharmony_ci} while (0)
393d0407baSopenharmony_ci
403d0407baSopenharmony_cistruct spi_params {
413d0407baSopenharmony_ci    uint32_t bus;
423d0407baSopenharmony_ci    uint32_t id;
433d0407baSopenharmony_ci    uint32_t func_mode;
443d0407baSopenharmony_ci    uint32_t cs_gpio;
453d0407baSopenharmony_ci    uint32_t cs_func;
463d0407baSopenharmony_ci    uint32_t cs_type;
473d0407baSopenharmony_ci    uint32_t cs_drv;
483d0407baSopenharmony_ci    uint32_t cs_dir;
493d0407baSopenharmony_ci    uint32_t cs_val;
503d0407baSopenharmony_ci    uint32_t clk_gpio;
513d0407baSopenharmony_ci    uint32_t clk_func;
523d0407baSopenharmony_ci    uint32_t clk_type;
533d0407baSopenharmony_ci    uint32_t clk_drv;
543d0407baSopenharmony_ci    uint32_t clk_dir;
553d0407baSopenharmony_ci    uint32_t clk_val;
563d0407baSopenharmony_ci    uint32_t mosi_gpio;
573d0407baSopenharmony_ci    uint32_t mosi_func;
583d0407baSopenharmony_ci    uint32_t mosi_type;
593d0407baSopenharmony_ci    uint32_t mosi_drv;
603d0407baSopenharmony_ci    uint32_t mosi_dir;
613d0407baSopenharmony_ci    uint32_t mosi_val;
623d0407baSopenharmony_ci    uint32_t miso_gpio;
633d0407baSopenharmony_ci    uint32_t miso_func;
643d0407baSopenharmony_ci    uint32_t miso_type;
653d0407baSopenharmony_ci    uint32_t miso_drv;
663d0407baSopenharmony_ci    uint32_t miso_dir;
673d0407baSopenharmony_ci    uint32_t miso_val;
683d0407baSopenharmony_ci    uint32_t bitsPerWord;
693d0407baSopenharmony_ci    uint32_t firstBit;
703d0407baSopenharmony_ci    uint32_t mode;
713d0407baSopenharmony_ci    uint32_t csm;
723d0407baSopenharmony_ci    uint32_t speed;
733d0407baSopenharmony_ci    uint32_t isSlave;
743d0407baSopenharmony_ci};
753d0407baSopenharmony_ci
763d0407baSopenharmony_cistatic int32_t spidrv_readdrs(struct DeviceResourceNode *node, struct spi_params *params)
773d0407baSopenharmony_ci{
783d0407baSopenharmony_ci    int32_t ret;
793d0407baSopenharmony_ci    struct DeviceResourceIface *iface = NULL;
803d0407baSopenharmony_ci
813d0407baSopenharmony_ci    if (node == NULL) {
823d0407baSopenharmony_ci        PRINT_ERR("%s: node is null\n", __func__);
833d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
843d0407baSopenharmony_ci    }
853d0407baSopenharmony_ci    if (params == NULL) {
863d0407baSopenharmony_ci        PRINT_ERR("%s: params is null\n", __func__);
873d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
883d0407baSopenharmony_ci    }
893d0407baSopenharmony_ci
903d0407baSopenharmony_ci    iface = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);
913d0407baSopenharmony_ci    if (iface == NULL) {
923d0407baSopenharmony_ci        PRINT_ERR("%s: iface is null\n", __func__);
933d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
943d0407baSopenharmony_ci    }
953d0407baSopenharmony_ci    if (iface->GetUint32 == NULL) {
963d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32 is null\n", __func__);
973d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
983d0407baSopenharmony_ci    }
993d0407baSopenharmony_ci
1003d0407baSopenharmony_ci    memset_s(params, sizeof(struct spi_params), 0, sizeof(struct spi_params));
1013d0407baSopenharmony_ci
1023d0407baSopenharmony_ci    ret = iface->GetUint32(node, "bus", &params->bus, 0);
1033d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
1043d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(bus) failed\n", __func__);
1053d0407baSopenharmony_ci        return HDF_FAILURE;
1063d0407baSopenharmony_ci    }
1073d0407baSopenharmony_ci
1083d0407baSopenharmony_ci    ret = iface->GetUint32(node, "id", &params->id, 0);
1093d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
1103d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(id) failed\n", __func__);
1113d0407baSopenharmony_ci        return HDF_FAILURE;
1123d0407baSopenharmony_ci    }
1133d0407baSopenharmony_ci
1143d0407baSopenharmony_ci    ret = iface->GetUint32(node, "func_mode", &params->func_mode, 0);
1153d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
1163d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(func_mode) failed\n", __func__);
1173d0407baSopenharmony_ci        return HDF_FAILURE;
1183d0407baSopenharmony_ci    }
1193d0407baSopenharmony_ci
1203d0407baSopenharmony_ci    ret = iface->GetUint32(node, "cs_gpio", &params->cs_gpio, 0);
1213d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
1223d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(cs_gpio) failed\n", __func__);
1233d0407baSopenharmony_ci        return HDF_FAILURE;
1243d0407baSopenharmony_ci    }
1253d0407baSopenharmony_ci
1263d0407baSopenharmony_ci    ret = iface->GetUint32(node, "cs_func", &params->cs_func, 0);
1273d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
1283d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(cs_func) failed\n", __func__);
1293d0407baSopenharmony_ci        return HDF_FAILURE;
1303d0407baSopenharmony_ci    }
1313d0407baSopenharmony_ci
1323d0407baSopenharmony_ci    ret = iface->GetUint32(node, "cs_type", &params->cs_type, 0);
1333d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
1343d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(cs_type) failed\n", __func__);
1353d0407baSopenharmony_ci        return HDF_FAILURE;
1363d0407baSopenharmony_ci    }
1373d0407baSopenharmony_ci
1383d0407baSopenharmony_ci    ret = iface->GetUint32(node, "cs_drv", &params->cs_drv, 0);
1393d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
1403d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(cs_drv) failed\n", __func__);
1413d0407baSopenharmony_ci        return HDF_FAILURE;
1423d0407baSopenharmony_ci    }
1433d0407baSopenharmony_ci
1443d0407baSopenharmony_ci    ret = iface->GetUint32(node, "cs_dir", &params->cs_dir, 0);
1453d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
1463d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(cs_dir) failed\n", __func__);
1473d0407baSopenharmony_ci        return HDF_FAILURE;
1483d0407baSopenharmony_ci    }
1493d0407baSopenharmony_ci
1503d0407baSopenharmony_ci    ret = iface->GetUint32(node, "cs_val", &params->cs_val, 0);
1513d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
1523d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(cs_val) failed\n", __func__);
1533d0407baSopenharmony_ci        return HDF_FAILURE;
1543d0407baSopenharmony_ci    }
1553d0407baSopenharmony_ci
1563d0407baSopenharmony_ci    ret = iface->GetUint32(node, "clk_gpio", &params->clk_gpio, 0);
1573d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
1583d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(clk_gpio) failed\n", __func__);
1593d0407baSopenharmony_ci        return HDF_FAILURE;
1603d0407baSopenharmony_ci    }
1613d0407baSopenharmony_ci
1623d0407baSopenharmony_ci    ret = iface->GetUint32(node, "clk_func", &params->clk_func, 0);
1633d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
1643d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(clk_func) failed\n", __func__);
1653d0407baSopenharmony_ci        return HDF_FAILURE;
1663d0407baSopenharmony_ci    }
1673d0407baSopenharmony_ci
1683d0407baSopenharmony_ci    ret = iface->GetUint32(node, "clk_type", &params->clk_type, 0);
1693d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
1703d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(clk_type) failed\n", __func__);
1713d0407baSopenharmony_ci        return HDF_FAILURE;
1723d0407baSopenharmony_ci    }
1733d0407baSopenharmony_ci
1743d0407baSopenharmony_ci    ret = iface->GetUint32(node, "clk_drv", &params->clk_drv, 0);
1753d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
1763d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(clk_drv) failed\n", __func__);
1773d0407baSopenharmony_ci        return HDF_FAILURE;
1783d0407baSopenharmony_ci    }
1793d0407baSopenharmony_ci
1803d0407baSopenharmony_ci    ret = iface->GetUint32(node, "clk_dir", &params->clk_dir, 0);
1813d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
1823d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(clk_dir) failed\n", __func__);
1833d0407baSopenharmony_ci        return HDF_FAILURE;
1843d0407baSopenharmony_ci    }
1853d0407baSopenharmony_ci
1863d0407baSopenharmony_ci    ret = iface->GetUint32(node, "clk_val", &params->clk_val, 0);
1873d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
1883d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(clk_val) failed\n", __func__);
1893d0407baSopenharmony_ci        return HDF_FAILURE;
1903d0407baSopenharmony_ci    }
1913d0407baSopenharmony_ci
1923d0407baSopenharmony_ci    ret = iface->GetUint32(node, "mosi_gpio", &params->mosi_gpio, 0);
1933d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
1943d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(mosi_gpio) failed\n", __func__);
1953d0407baSopenharmony_ci        return HDF_FAILURE;
1963d0407baSopenharmony_ci    }
1973d0407baSopenharmony_ci
1983d0407baSopenharmony_ci    ret = iface->GetUint32(node, "mosi_func", &params->mosi_func, 0);
1993d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2003d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(mosi_func) failed\n", __func__);
2013d0407baSopenharmony_ci        return HDF_FAILURE;
2023d0407baSopenharmony_ci    }
2033d0407baSopenharmony_ci
2043d0407baSopenharmony_ci    ret = iface->GetUint32(node, "mosi_type", &params->mosi_type, 0);
2053d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2063d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(mosi_type) failed\n", __func__);
2073d0407baSopenharmony_ci        return HDF_FAILURE;
2083d0407baSopenharmony_ci    }
2093d0407baSopenharmony_ci
2103d0407baSopenharmony_ci    ret = iface->GetUint32(node, "mosi_drv", &params->mosi_drv, 0);
2113d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2123d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(mosi_drv) failed\n", __func__);
2133d0407baSopenharmony_ci        return HDF_FAILURE;
2143d0407baSopenharmony_ci    }
2153d0407baSopenharmony_ci
2163d0407baSopenharmony_ci    ret = iface->GetUint32(node, "mosi_dir", &params->mosi_dir, 0);
2173d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2183d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(mosi_dir) failed\n", __func__);
2193d0407baSopenharmony_ci        return HDF_FAILURE;
2203d0407baSopenharmony_ci    }
2213d0407baSopenharmony_ci
2223d0407baSopenharmony_ci    ret = iface->GetUint32(node, "mosi_val", &params->mosi_val, 0);
2233d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2243d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(mosi_val) failed\n", __func__);
2253d0407baSopenharmony_ci        return HDF_FAILURE;
2263d0407baSopenharmony_ci    }
2273d0407baSopenharmony_ci
2283d0407baSopenharmony_ci    ret = iface->GetUint32(node, "miso_gpio", &params->miso_gpio, 0);
2293d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2303d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(miso_gpio) failed\n", __func__);
2313d0407baSopenharmony_ci        return HDF_FAILURE;
2323d0407baSopenharmony_ci    }
2333d0407baSopenharmony_ci
2343d0407baSopenharmony_ci    ret = iface->GetUint32(node, "miso_func", &params->miso_func, 0);
2353d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2363d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(miso_func) failed\n", __func__);
2373d0407baSopenharmony_ci        return HDF_FAILURE;
2383d0407baSopenharmony_ci    }
2393d0407baSopenharmony_ci
2403d0407baSopenharmony_ci    ret = iface->GetUint32(node, "miso_type", &params->miso_type, 0);
2413d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2423d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(miso_type) failed\n", __func__);
2433d0407baSopenharmony_ci        return HDF_FAILURE;
2443d0407baSopenharmony_ci    }
2453d0407baSopenharmony_ci
2463d0407baSopenharmony_ci    ret = iface->GetUint32(node, "miso_drv", &params->miso_drv, 0);
2473d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2483d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(miso_drv) failed\n", __func__);
2493d0407baSopenharmony_ci        return HDF_FAILURE;
2503d0407baSopenharmony_ci    }
2513d0407baSopenharmony_ci
2523d0407baSopenharmony_ci    ret = iface->GetUint32(node, "miso_dir", &params->miso_dir, 0);
2533d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2543d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(miso_dir) failed\n", __func__);
2553d0407baSopenharmony_ci        return HDF_FAILURE;
2563d0407baSopenharmony_ci    }
2573d0407baSopenharmony_ci
2583d0407baSopenharmony_ci    ret = iface->GetUint32(node, "miso_val", &params->miso_val, 0);
2593d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2603d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(miso_val) failed\n", __func__);
2613d0407baSopenharmony_ci        return HDF_FAILURE;
2623d0407baSopenharmony_ci    }
2633d0407baSopenharmony_ci
2643d0407baSopenharmony_ci    ret = iface->GetUint32(node, "bitsPerWord", &params->bitsPerWord, 0);
2653d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2663d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(bitsPerWord) failed\n", __func__);
2673d0407baSopenharmony_ci        return HDF_FAILURE;
2683d0407baSopenharmony_ci    }
2693d0407baSopenharmony_ci
2703d0407baSopenharmony_ci    ret = iface->GetUint32(node, "firstBit", &params->firstBit, 0);
2713d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2723d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(firstBit) failed\n", __func__);
2733d0407baSopenharmony_ci        return HDF_FAILURE;
2743d0407baSopenharmony_ci    }
2753d0407baSopenharmony_ci
2763d0407baSopenharmony_ci    ret = iface->GetUint32(node, "mode", &params->mode, 0);
2773d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2783d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(mode) failed\n", __func__);
2793d0407baSopenharmony_ci        return HDF_FAILURE;
2803d0407baSopenharmony_ci    }
2813d0407baSopenharmony_ci
2823d0407baSopenharmony_ci    ret = iface->GetUint32(node, "csm", &params->csm, 0);
2833d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2843d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(csm) failed\n", __func__);
2853d0407baSopenharmony_ci        return HDF_FAILURE;
2863d0407baSopenharmony_ci    }
2873d0407baSopenharmony_ci
2883d0407baSopenharmony_ci    ret = iface->GetUint32(node, "speed", &params->speed, 0);
2893d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2903d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(speed) failed\n", __func__);
2913d0407baSopenharmony_ci        return HDF_FAILURE;
2923d0407baSopenharmony_ci    }
2933d0407baSopenharmony_ci
2943d0407baSopenharmony_ci    ret = iface->GetUint32(node, "isSlave", &params->isSlave, 0);
2953d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
2963d0407baSopenharmony_ci        PRINT_ERR("%s: GetUint32(isSlave) failed\n", __func__);
2973d0407baSopenharmony_ci        return HDF_FAILURE;
2983d0407baSopenharmony_ci    }
2993d0407baSopenharmony_ci
3003d0407baSopenharmony_ci    return HDF_SUCCESS;
3013d0407baSopenharmony_ci}
3023d0407baSopenharmony_ci
3033d0407baSopenharmony_cistatic int32_t spidrv_initdevice(const struct spi_params *params)
3043d0407baSopenharmony_ci{
3053d0407baSopenharmony_ci    unsigned int ret;
3063d0407baSopenharmony_ci    SpiBusIo bus;
3073d0407baSopenharmony_ci    LzSpiConfig config;
3083d0407baSopenharmony_ci    unsigned int bus_id;
3093d0407baSopenharmony_ci
3103d0407baSopenharmony_ci    if (params == NULL) {
3113d0407baSopenharmony_ci        PRINT_ERR("%s: params is null\n", __func__);
3123d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
3133d0407baSopenharmony_ci    }
3143d0407baSopenharmony_ci
3153d0407baSopenharmony_ci    bus_id = (unsigned int)params->bus;
3163d0407baSopenharmony_ci
3173d0407baSopenharmony_ci    memset_s(&bus, sizeof(bus), 0, sizeof(bus));
3183d0407baSopenharmony_ci    bus.id = (FuncID)params->id;
3193d0407baSopenharmony_ci    bus.mode = (FuncMode)params->func_mode;
3203d0407baSopenharmony_ci    bus.cs.gpio = (GpioID)params->cs_gpio;
3213d0407baSopenharmony_ci    bus.cs.func = (MuxFunc)params->cs_func;
3223d0407baSopenharmony_ci    bus.cs.type = (PullType)params->cs_type;
3233d0407baSopenharmony_ci    bus.cs.drv = (DriveLevel)params->cs_drv;
3243d0407baSopenharmony_ci    bus.cs.dir = (LzGpioDir)params->cs_dir;
3253d0407baSopenharmony_ci    bus.cs.val = (LzGpioValue)params->cs_val;
3263d0407baSopenharmony_ci    bus.mosi.gpio = (GpioID)params->mosi_gpio;
3273d0407baSopenharmony_ci    bus.mosi.func = (MuxFunc)params->mosi_func;
3283d0407baSopenharmony_ci    bus.mosi.type = (PullType)params->mosi_type;
3293d0407baSopenharmony_ci    bus.mosi.drv = (DriveLevel)params->mosi_drv;
3303d0407baSopenharmony_ci    bus.mosi.dir = (LzGpioDir)params->mosi_dir;
3313d0407baSopenharmony_ci    bus.mosi.val = (LzGpioValue)params->mosi_val;
3323d0407baSopenharmony_ci    bus.miso.gpio = (GpioID)params->miso_gpio;
3333d0407baSopenharmony_ci    bus.miso.func = (MuxFunc)params->miso_func;
3343d0407baSopenharmony_ci    bus.miso.type = (PullType)params->miso_type;
3353d0407baSopenharmony_ci    bus.miso.drv = (DriveLevel)params->miso_drv;
3363d0407baSopenharmony_ci    bus.miso.dir = (LzGpioDir)params->miso_dir;
3373d0407baSopenharmony_ci    bus.miso.val = (LzGpioValue)params->miso_val;
3383d0407baSopenharmony_ci
3393d0407baSopenharmony_ci    memset_s(&config, sizeof(config), 0, sizeof(config));
3403d0407baSopenharmony_ci    config.bitsPerWord = (unsigned int)params->bitsPerWord;
3413d0407baSopenharmony_ci    config.firstBit = (unsigned int)params->firstBit;
3423d0407baSopenharmony_ci    config.mode = (unsigned int)params->mode;
3433d0407baSopenharmony_ci    config.csm = (unsigned int)params->csm;
3443d0407baSopenharmony_ci    config.speed = (unsigned int)params->speed;
3453d0407baSopenharmony_ci    config.isSlave = (unsigned int)params->isSlave;
3463d0407baSopenharmony_ci
3473d0407baSopenharmony_ci    ret = SpiIoInit(bus);
3483d0407baSopenharmony_ci    if (ret != LZ_HARDWARE_SUCCESS) {
3493d0407baSopenharmony_ci        PRINT_ERR("%s: SpiIoInit failed(%u)\n", __func__, ret);
3503d0407baSopenharmony_ci    }
3513d0407baSopenharmony_ci
3523d0407baSopenharmony_ci    ret = LzSpiInit(bus_id, config);
3533d0407baSopenharmony_ci    if (ret != LZ_HARDWARE_SUCCESS) {
3543d0407baSopenharmony_ci        PRINT_ERR("%s: LzSpiInit failed(%u)\n", __func__, ret);
3553d0407baSopenharmony_ci    }
3563d0407baSopenharmony_ci
3573d0407baSopenharmony_ci    return HDF_SUCCESS;
3583d0407baSopenharmony_ci}
3593d0407baSopenharmony_ci
3603d0407baSopenharmony_cistatic void spidrv_deinitdevice(const struct spi_params *params)
3613d0407baSopenharmony_ci{
3623d0407baSopenharmony_ci    unsigned int bus_id;
3633d0407baSopenharmony_ci
3643d0407baSopenharmony_ci    if (params == NULL) {
3653d0407baSopenharmony_ci        PRINT_ERR("%s: params is null\n", __func__);
3663d0407baSopenharmony_ci        return;
3673d0407baSopenharmony_ci    }
3683d0407baSopenharmony_ci
3693d0407baSopenharmony_ci    bus_id = (unsigned int)params->bus;
3703d0407baSopenharmony_ci    LzSpiDeinit(bus_id);
3713d0407baSopenharmony_ci}
3723d0407baSopenharmony_ci
3733d0407baSopenharmony_cistatic int32_t spidrv_open(struct SpiCntlr *cntlr)
3743d0407baSopenharmony_ci{
3753d0407baSopenharmony_ci    int32_t ret;
3763d0407baSopenharmony_ci    struct spi_params *params = NULL;
3773d0407baSopenharmony_ci
3783d0407baSopenharmony_ci    if (cntlr == NULL) {
3793d0407baSopenharmony_ci        PRINT_ERR("%s: cntlr is null\n", __func__);
3803d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
3813d0407baSopenharmony_ci    }
3823d0407baSopenharmony_ci    if (cntlr->priv == NULL) {
3833d0407baSopenharmony_ci        PRINT_ERR("%s: cntlr->priv is null\n", __func__);
3843d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
3853d0407baSopenharmony_ci    }
3863d0407baSopenharmony_ci
3873d0407baSopenharmony_ci    params = (struct spi_params *)cntlr->priv;
3883d0407baSopenharmony_ci
3893d0407baSopenharmony_ci    ret = spidrv_initdevice(params);
3903d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
3913d0407baSopenharmony_ci        PRINT_ERR("%s: spidrv_initdevice error\n", __func__);
3923d0407baSopenharmony_ci        return HDF_FAILURE;
3933d0407baSopenharmony_ci    }
3943d0407baSopenharmony_ci
3953d0407baSopenharmony_ci    return HDF_SUCCESS;
3963d0407baSopenharmony_ci}
3973d0407baSopenharmony_ci
3983d0407baSopenharmony_cistatic int32_t spidrv_close(struct SpiCntlr *cntlr)
3993d0407baSopenharmony_ci{
4003d0407baSopenharmony_ci    struct spi_params *params = NULL;
4013d0407baSopenharmony_ci
4023d0407baSopenharmony_ci    if (cntlr == NULL) {
4033d0407baSopenharmony_ci        PRINT_ERR("%s: cntlr is null\n", __func__);
4043d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
4053d0407baSopenharmony_ci    }
4063d0407baSopenharmony_ci    if (cntlr->priv == NULL) {
4073d0407baSopenharmony_ci        PRINT_ERR("%s: cntlr->priv is null\n", __func__);
4083d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
4093d0407baSopenharmony_ci    }
4103d0407baSopenharmony_ci
4113d0407baSopenharmony_ci    params = (struct spi_params *)cntlr->priv;
4123d0407baSopenharmony_ci
4133d0407baSopenharmony_ci    /* 销毁硬件设备 */
4143d0407baSopenharmony_ci    spidrv_deinitdevice(params);
4153d0407baSopenharmony_ci
4163d0407baSopenharmony_ci    return HDF_SUCCESS;
4173d0407baSopenharmony_ci}
4183d0407baSopenharmony_ci
4193d0407baSopenharmony_cistatic int32_t spidrv_setcfg(struct SpiCntlr *cntlr, struct SpiCfg *cfg)
4203d0407baSopenharmony_ci{
4213d0407baSopenharmony_ci    struct spi_params *params = NULL;
4223d0407baSopenharmony_ci
4233d0407baSopenharmony_ci    if (cntlr == NULL) {
4243d0407baSopenharmony_ci        PRINT_ERR("%s: cntlr is null\n", __func__);
4253d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
4263d0407baSopenharmony_ci    }
4273d0407baSopenharmony_ci    if (cntlr->priv == NULL) {
4283d0407baSopenharmony_ci        PRINT_ERR("%s: cntlr->priv is null\n", __func__);
4293d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
4303d0407baSopenharmony_ci    }
4313d0407baSopenharmony_ci    if (cfg == NULL) {
4323d0407baSopenharmony_ci        PRINT_ERR("%s: cfg is null\n", __func__);
4333d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
4343d0407baSopenharmony_ci    }
4353d0407baSopenharmony_ci
4363d0407baSopenharmony_ci    params = (struct spi_params *)cntlr->priv;
4373d0407baSopenharmony_ci
4383d0407baSopenharmony_ci    params->speed = cfg->maxSpeedHz;
4393d0407baSopenharmony_ci    params->bitsPerWord = cfg->bitsPerWord;
4403d0407baSopenharmony_ci
4413d0407baSopenharmony_ci    /* LiteOS的标准定义转化为LzHardware的定义 */
4423d0407baSopenharmony_ci    params->mode = 0;
4433d0407baSopenharmony_ci    if (cfg->mode & SPI_CLK_PHASE) {
4443d0407baSopenharmony_ci        params->mode |= SPI_CPHA;
4453d0407baSopenharmony_ci    }
4463d0407baSopenharmony_ci    if (cfg->mode & SPI_CLK_POLARITY) {
4473d0407baSopenharmony_ci        params->mode |= SPI_CPOL;
4483d0407baSopenharmony_ci    }
4493d0407baSopenharmony_ci    if (cfg->mode & SPI_MODE_3WIRE) {
4503d0407baSopenharmony_ci        PRINT_ERR("%s: SPI_MODE_3WIRE is not support!\n", __func__);
4513d0407baSopenharmony_ci    }
4523d0407baSopenharmony_ci    if (cfg->mode & SPI_MODE_LOOP) {
4533d0407baSopenharmony_ci        PRINT_ERR("%s: SPI_MODE_3WIRE is not support!\n", __func__);
4543d0407baSopenharmony_ci    }
4553d0407baSopenharmony_ci    if ((cfg->mode & SPI_MODE_LSBFE) == 0) {
4563d0407baSopenharmony_ci        params->mode |= SPI_MSB;
4573d0407baSopenharmony_ci    }
4583d0407baSopenharmony_ci    if (cfg->mode & SPI_MODE_NOCS) {
4593d0407baSopenharmony_ci        PRINT_ERR("%s: SPI_MODE_NOCS is not support!\n", __func__);
4603d0407baSopenharmony_ci    }
4613d0407baSopenharmony_ci    if (cfg->mode & SPI_MODE_CS_HIGH) {
4623d0407baSopenharmony_ci        PRINT_ERR("%s: SPI_MODE_CS_HIGH is not support!\n", __func__);
4633d0407baSopenharmony_ci    }
4643d0407baSopenharmony_ci    if (cfg->mode & SPI_MODE_READY) {
4653d0407baSopenharmony_ci        PRINT_ERR("%s: SPI_MODE_READY is not support!\n", __func__);
4663d0407baSopenharmony_ci    }
4673d0407baSopenharmony_ci    if (params->isSlave == 0) {
4683d0407baSopenharmony_ci        params->mode |= SPI_SLAVE;
4693d0407baSopenharmony_ci    } else {
4703d0407baSopenharmony_ci        params->mode &= ~(SPI_SLAVE);
4713d0407baSopenharmony_ci    }
4723d0407baSopenharmony_ci
4733d0407baSopenharmony_ci    switch (cfg->transferMode) {
4743d0407baSopenharmony_ci        case SPI_INTERRUPT_TRANSFER:
4753d0407baSopenharmony_ci            break;
4763d0407baSopenharmony_ci
4773d0407baSopenharmony_ci        case SPI_POLLING_TRANSFER:
4783d0407baSopenharmony_ci            PRINT_ERR("%s: SPI_POLLING_TRANSFER is not support!\n", __func__);
4793d0407baSopenharmony_ci            break;
4803d0407baSopenharmony_ci
4813d0407baSopenharmony_ci        case SPI_DMA_TRANSFER:
4823d0407baSopenharmony_ci            PRINT_ERR("%s: SPI_DMA_TRANSFER is not support!\n", __func__);
4833d0407baSopenharmony_ci            break;
4843d0407baSopenharmony_ci
4853d0407baSopenharmony_ci        default:
4863d0407baSopenharmony_ci            PRINT_ERR("%s: %d is not support!\n", __func__, cfg->transferMode);
4873d0407baSopenharmony_ci            break;
4883d0407baSopenharmony_ci    }
4893d0407baSopenharmony_ci
4903d0407baSopenharmony_ci    spidrv_initdevice(params);
4913d0407baSopenharmony_ci
4923d0407baSopenharmony_ci    return HDF_SUCCESS;
4933d0407baSopenharmony_ci}
4943d0407baSopenharmony_ci
4953d0407baSopenharmony_cistatic int32_t spidrv_getcfg(struct SpiCntlr *cntlr, struct SpiCfg *cfg)
4963d0407baSopenharmony_ci{
4973d0407baSopenharmony_ci    struct spi_params *params = NULL;
4983d0407baSopenharmony_ci
4993d0407baSopenharmony_ci    if (cntlr == NULL) {
5003d0407baSopenharmony_ci        PRINT_ERR("%s: cntlr is null\n", __func__);
5013d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
5023d0407baSopenharmony_ci    }
5033d0407baSopenharmony_ci    if (cntlr->priv == NULL) {
5043d0407baSopenharmony_ci        PRINT_ERR("%s: cntlr->priv is null\n", __func__);
5053d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
5063d0407baSopenharmony_ci    }
5073d0407baSopenharmony_ci    if (cfg == NULL) {
5083d0407baSopenharmony_ci        PRINT_ERR("%s: cfg is null\n", __func__);
5093d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
5103d0407baSopenharmony_ci    }
5113d0407baSopenharmony_ci
5123d0407baSopenharmony_ci    params = (struct spi_params *)cntlr->priv;
5133d0407baSopenharmony_ci
5143d0407baSopenharmony_ci    cfg->maxSpeedHz = params->speed;
5153d0407baSopenharmony_ci    cfg->bitsPerWord = params->bitsPerWord;
5163d0407baSopenharmony_ci
5173d0407baSopenharmony_ci    /* LzHardware的定义转化为LiteOS的标准定义 */
5183d0407baSopenharmony_ci    cfg->mode = 0;
5193d0407baSopenharmony_ci    if (params->mode & SPI_CPHA) {
5203d0407baSopenharmony_ci        cfg->mode |= SPI_CLK_PHASE;
5213d0407baSopenharmony_ci    }
5223d0407baSopenharmony_ci    if (params->mode & SPI_CPOL) {
5233d0407baSopenharmony_ci        cfg->mode |= SPI_CLK_POLARITY;
5243d0407baSopenharmony_ci    }
5253d0407baSopenharmony_ci    if ((params->mode & SPI_MSB) == 0) {
5263d0407baSopenharmony_ci        cfg->mode |= SPI_MODE_LSBFE;
5273d0407baSopenharmony_ci    }
5283d0407baSopenharmony_ci
5293d0407baSopenharmony_ci    cfg->transferMode = SPI_INTERRUPT_TRANSFER;
5303d0407baSopenharmony_ci
5313d0407baSopenharmony_ci    return HDF_SUCCESS;
5323d0407baSopenharmony_ci}
5333d0407baSopenharmony_ci
5343d0407baSopenharmony_cistatic int32_t spidrv_transfer(struct SpiCntlr *cntlr, struct SpiMsg *msgs, uint32_t count)
5353d0407baSopenharmony_ci{
5363d0407baSopenharmony_ci    unsigned int ret;
5373d0407baSopenharmony_ci    struct spi_params *params = NULL;
5383d0407baSopenharmony_ci    unsigned int bus_id;
5393d0407baSopenharmony_ci    uint32_t i;
5403d0407baSopenharmony_ci    struct SpiMsg *msg;
5413d0407baSopenharmony_ci    LzSpiMsg lz_spi_msg;
5423d0407baSopenharmony_ci
5433d0407baSopenharmony_ci    if (cntlr == NULL) {
5443d0407baSopenharmony_ci        PRINT_ERR("%s: cntlr is null\n", __func__);
5453d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
5463d0407baSopenharmony_ci    }
5473d0407baSopenharmony_ci    if (cntlr->priv == NULL) {
5483d0407baSopenharmony_ci        PRINT_ERR("%s: cntlr->priv is null\n", __func__);
5493d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
5503d0407baSopenharmony_ci    }
5513d0407baSopenharmony_ci    if (msgs == NULL) {
5523d0407baSopenharmony_ci        PRINT_ERR("%s: msgs is null\n", __func__);
5533d0407baSopenharmony_ci        return HDF_ERR_INVALID_PARAM;
5543d0407baSopenharmony_ci    }
5553d0407baSopenharmony_ci
5563d0407baSopenharmony_ci    params = (struct spi_params *)cntlr->priv;
5573d0407baSopenharmony_ci    bus_id = (unsigned int)params->bus;
5583d0407baSopenharmony_ci
5593d0407baSopenharmony_ci    for (i = 0; i < count; i++) {
5603d0407baSopenharmony_ci        msg = &msgs[i];
5613d0407baSopenharmony_ci
5623d0407baSopenharmony_ci        if ((msg->wbuf != NULL) && (msg->rbuf != NULL)) {
5633d0407baSopenharmony_ci            ret = LzSpiWriteAndRead(bus_id, 0, msg->wbuf, msg->rbuf, msg->len);
5643d0407baSopenharmony_ci            if (ret != LZ_HARDWARE_SUCCESS) {
5653d0407baSopenharmony_ci                PRINT_ERR("%s: LzSpiWriteAndRead error\n", __func__);
5663d0407baSopenharmony_ci                return HDF_ERR_IO;
5673d0407baSopenharmony_ci            }
5683d0407baSopenharmony_ci        } else if ((msg->wbuf != NULL) && (msg->rbuf == NULL)) {
5693d0407baSopenharmony_ci            ret = LzSpiWrite(bus_id, 0, msg->wbuf, msg->len);
5703d0407baSopenharmony_ci            if (ret != LZ_HARDWARE_SUCCESS) {
5713d0407baSopenharmony_ci                PRINT_ERR("%s: LzSpiWrite error\n", __func__);
5723d0407baSopenharmony_ci                return HDF_ERR_IO;
5733d0407baSopenharmony_ci            }
5743d0407baSopenharmony_ci        } else if ((msg->wbuf == NULL) && (msg->rbuf != NULL)) {
5753d0407baSopenharmony_ci            ret = LzSpiRead(bus_id, 0, msg->rbuf, msg->len);
5763d0407baSopenharmony_ci            if (ret != LZ_HARDWARE_SUCCESS) {
5773d0407baSopenharmony_ci                PRINT_ERR("%s: LzSpiRead error\n", __func__);
5783d0407baSopenharmony_ci                return HDF_ERR_IO;
5793d0407baSopenharmony_ci            }
5803d0407baSopenharmony_ci        } else {
5813d0407baSopenharmony_ci            PRINT_ERR("%s: i = %d, msg->wbuf or msg->rbuf is null\n", __func__, i);
5823d0407baSopenharmony_ci            return HDF_ERR_INVALID_PARAM;
5833d0407baSopenharmony_ci        }
5843d0407baSopenharmony_ci    }
5853d0407baSopenharmony_ci
5863d0407baSopenharmony_ci    return HDF_SUCCESS;
5873d0407baSopenharmony_ci}
5883d0407baSopenharmony_ci
5893d0407baSopenharmony_cistatic struct SpiCntlrMethod m_spi_method = {
5903d0407baSopenharmony_ci    .Open = spidrv_open,
5913d0407baSopenharmony_ci    .Close = spidrv_close,
5923d0407baSopenharmony_ci    .SetCfg = spidrv_setcfg,
5933d0407baSopenharmony_ci    .GetCfg = spidrv_getcfg,
5943d0407baSopenharmony_ci    .Transfer = spidrv_transfer,
5953d0407baSopenharmony_ci};
5963d0407baSopenharmony_ci
5973d0407baSopenharmony_cistatic int32_t spidrv_bind(struct HdfDeviceObject *device)
5983d0407baSopenharmony_ci{
5993d0407baSopenharmony_ci    return HDF_SUCCESS;
6003d0407baSopenharmony_ci}
6013d0407baSopenharmony_ci
6023d0407baSopenharmony_cistatic int32_t spidrv_init(struct HdfDeviceObject *device)
6033d0407baSopenharmony_ci{
6043d0407baSopenharmony_ci    int32_t ret;
6053d0407baSopenharmony_ci    struct SpiCntlr *cntlr = NULL;
6063d0407baSopenharmony_ci    struct spi_params *params = NULL;
6073d0407baSopenharmony_ci
6083d0407baSopenharmony_ci    HDF_LOGI("%s: Enter", __func__);
6093d0407baSopenharmony_ci    if ((device == NULL) || (device->property == NULL)) {
6103d0407baSopenharmony_ci        PRINT_ERR("%s: device or property is null\n", __func__);
6113d0407baSopenharmony_ci        return HDF_ERR_INVALID_OBJECT;
6123d0407baSopenharmony_ci    }
6133d0407baSopenharmony_ci
6143d0407baSopenharmony_ci    cntlr = (struct SpiCntlr *)OsalMemAlloc(sizeof(struct SpiCntlr));
6153d0407baSopenharmony_ci    params = (struct spi_params *)OsalMemAlloc(sizeof(struct spi_params));
6163d0407baSopenharmony_ci
6173d0407baSopenharmony_ci    if (cntlr == NULL) {
6183d0407baSopenharmony_ci        PRINT_ERR("%s: cntlr is null\n", __func__);
6193d0407baSopenharmony_ci        if (cntlr != NULL) {
6203d0407baSopenharmony_ci            OsalMemFree(cntlr);
6213d0407baSopenharmony_ci            cntlr = NULL;
6223d0407baSopenharmony_ci        }
6233d0407baSopenharmony_ci        if (params != NULL) {
6243d0407baSopenharmony_ci            OsalMemFree(params);
6253d0407baSopenharmony_ci            params = NULL;
6263d0407baSopenharmony_ci        }
6273d0407baSopenharmony_ci        return HDF_ERR_MALLOC_FAIL;
6283d0407baSopenharmony_ci    }
6293d0407baSopenharmony_ci    if (params == NULL) {
6303d0407baSopenharmony_ci        PRINT_ERR("%s: params is null\n", __func__);
6313d0407baSopenharmony_ci        if (cntlr != NULL) {
6323d0407baSopenharmony_ci            OsalMemFree(cntlr);
6333d0407baSopenharmony_ci            cntlr = NULL;
6343d0407baSopenharmony_ci        }
6353d0407baSopenharmony_ci        if (params != NULL) {
6363d0407baSopenharmony_ci            OsalMemFree(params);
6373d0407baSopenharmony_ci            params = NULL;
6383d0407baSopenharmony_ci        }
6393d0407baSopenharmony_ci        return HDF_ERR_MALLOC_FAIL;
6403d0407baSopenharmony_ci    }
6413d0407baSopenharmony_ci
6423d0407baSopenharmony_ci    ret = spidrv_readdrs(device->property, params);
6433d0407baSopenharmony_ci    if (ret != HDF_SUCCESS) {
6443d0407baSopenharmony_ci        PRINT_ERR("%s: cntlr is null\n", __func__);
6453d0407baSopenharmony_ci        if (cntlr != NULL) {
6463d0407baSopenharmony_ci            OsalMemFree(cntlr);
6473d0407baSopenharmony_ci            cntlr = NULL;
6483d0407baSopenharmony_ci        }
6493d0407baSopenharmony_ci        if (params != NULL) {
6503d0407baSopenharmony_ci            OsalMemFree(params);
6513d0407baSopenharmony_ci            params = NULL;
6523d0407baSopenharmony_ci        }
6533d0407baSopenharmony_ci        return ret;
6543d0407baSopenharmony_ci    }
6553d0407baSopenharmony_ci
6563d0407baSopenharmony_ci    /* 数据对齐 */
6573d0407baSopenharmony_ci    cntlr->busNum = params->bus;
6583d0407baSopenharmony_ci    cntlr->numCs = 1;
6593d0407baSopenharmony_ci    cntlr->curCs = 0;
6603d0407baSopenharmony_ci    cntlr->priv = (void *)params;
6613d0407baSopenharmony_ci    /* 注册回调函数,并初始化SpiCntlr */
6623d0407baSopenharmony_ci    cntlr->method = &m_spi_method;
6633d0407baSopenharmony_ci    device->service = &cntlr->service;
6643d0407baSopenharmony_ci    cntlr->device = device;
6653d0407baSopenharmony_ci    cntlr->priv = (void *)params;
6663d0407baSopenharmony_ci
6673d0407baSopenharmony_ci    PRINT_LOG("spi service: %s init success!\n", HdfDeviceGetServiceName(device));
6683d0407baSopenharmony_ci    return HDF_SUCCESS;
6693d0407baSopenharmony_ci}
6703d0407baSopenharmony_ci
6713d0407baSopenharmony_cistatic void spidrv_release(struct HdfDeviceObject *device)
6723d0407baSopenharmony_ci{
6733d0407baSopenharmony_ci    struct SpiCntlr *cntlr = NULL;
6743d0407baSopenharmony_ci    struct spi_params *params = NULL;
6753d0407baSopenharmony_ci
6763d0407baSopenharmony_ci    HDF_LOGI("%s: Enter", __func__);
6773d0407baSopenharmony_ci    if ((device == NULL) || (device->property == NULL)) {
6783d0407baSopenharmony_ci        PRINT_ERR("%s: device or property is null\n", __func__);
6793d0407baSopenharmony_ci        return;
6803d0407baSopenharmony_ci    }
6813d0407baSopenharmony_ci
6823d0407baSopenharmony_ci    cntlr = SpiCntlrFromDevice(device);
6833d0407baSopenharmony_ci    if (cntlr == NULL) {
6843d0407baSopenharmony_ci        PRINT_ERR("%s: cntlr is null\n", __func__);
6853d0407baSopenharmony_ci        return;
6863d0407baSopenharmony_ci    }
6873d0407baSopenharmony_ci
6883d0407baSopenharmony_ci    params = (struct spi_params *)cntlr->priv;
6893d0407baSopenharmony_ci
6903d0407baSopenharmony_ci    /* 销毁SPI参数 */
6913d0407baSopenharmony_ci    if (params != NULL) {
6923d0407baSopenharmony_ci        OsalMemFree(params);
6933d0407baSopenharmony_ci        params = NULL;
6943d0407baSopenharmony_ci    }
6953d0407baSopenharmony_ci
6963d0407baSopenharmony_ci    /* 销毁SpiCntlr */
6973d0407baSopenharmony_ci    cntlr->priv = NULL;
6983d0407baSopenharmony_ci    if (cntlr != NULL) {
6993d0407baSopenharmony_ci        OsalMemFree(cntlr);
7003d0407baSopenharmony_ci        cntlr = NULL;
7013d0407baSopenharmony_ci    }
7023d0407baSopenharmony_ci
7033d0407baSopenharmony_ci    PRINT_LOG("spi service: %s release!\n", HdfDeviceGetServiceName(device));
7043d0407baSopenharmony_ci}
7053d0407baSopenharmony_ci
7063d0407baSopenharmony_cistruct HdfDriverEntry g_spiDriverEntry = {
7073d0407baSopenharmony_ci    .moduleVersion = 1,
7083d0407baSopenharmony_ci    .moduleName = "HDF_PLATFORM_SPI",
7093d0407baSopenharmony_ci    .Init = spidrv_init,
7103d0407baSopenharmony_ci    .Release = spidrv_release,
7113d0407baSopenharmony_ci    .Bind = spidrv_bind,
7123d0407baSopenharmony_ci};
7133d0407baSopenharmony_ci
7143d0407baSopenharmony_ciHDF_INIT(g_spiDriverEntry);
715