You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

197 lines
3.7 KiB

/*
* Copyright (c) Hisilicon Technologies Co., Ltd. 2019-2021. All rights reserved.
* Description: Define otp driver
* Author : Hisilicon
* Create: 2019/06/19
*/
#include "drv_otp.h"
#include "drv_otp_ext.h"
#include "hal_otp.h"
static struct otp_mgmt g_otp_mgmt = {{0}};
struct otp_mgmt *priv_get_otp_mgmt(td_void)
{
return &g_otp_mgmt;
}
static otp_export_func g_otp_export_funcs = {
.write_byte = ext_drv_otp_write_byte,
.read_byte = ext_drv_otp_read_byte,
};
td_s32 drv_otp_init(td_void)
{
td_s32 ret;
struct otp_mgmt *mgmt = priv_get_otp_mgmt();
ret = osal_mutex_init(&mgmt->lock);
if (ret != TD_SUCCESS) {
print_err_func(osal_mutex_init, ret);
return ret;
}
ret = osal_exportfunc_register(SOC_ID_OTP, "SOC_OTP", (td_void *)&g_otp_export_funcs);
if (ret != TD_SUCCESS) {
print_err_func(osal_exportfunc_register, ret);
osal_mutex_destroy(&mgmt->lock);
return ret;
}
soc_print("OTP osal_exportfunc_register success\n");
return hal_otp_init();
}
td_void drv_otp_deinit(td_void)
{
struct otp_mgmt *mgmt = priv_get_otp_mgmt();
hal_otp_deinit();
osal_exportfunc_unregister(SOC_ID_OTP);
osal_mutex_destroy(&mgmt->lock);
return;
}
static td_void _mutex_lock(td_void)
{
struct otp_mgmt *mgmt = priv_get_otp_mgmt();
osal_mutex_lock(&mgmt->lock);
}
static td_void _mutex_unlock(td_void)
{
struct otp_mgmt *mgmt = priv_get_otp_mgmt();
osal_mutex_unlock(&mgmt->lock);
}
td_s32 otp_open_impl(td_void *private_data)
{
if (private_data == TD_NULL) {
return SOC_ERR_OTP_PTR_NULL;
}
private_data = (td_void *)(uintptr_t)(td_ulong)osal_get_pid();
return TD_SUCCESS;
}
td_s32 otp_release_impl(td_void *private_data)
{
if (private_data == TD_NULL) {
return SOC_ERR_OTP_PTR_NULL;
}
private_data = TD_NULL;
return TD_SUCCESS;
}
td_s32 ext_drv_otp_reset(td_void)
{
td_s32 ret;
_mutex_lock();
ret = hal_otp_reset();
_mutex_unlock();
return ret;
}
EXPORT_SYMBOL(ext_drv_otp_reset);
td_s32 ext_drv_otp_read(td_u32 addr, td_u32 *value)
{
td_s32 ret;
_mutex_lock();
ret = hal_otp_read(addr, value);
_mutex_unlock();
return ret;
}
EXPORT_SYMBOL(ext_drv_otp_read);
td_s32 ext_drv_otp_read_byte(td_u32 addr, td_u8 *value)
{
td_s32 ret;
_mutex_lock();
ret = hal_otp_read_byte(addr, value);
_mutex_unlock();
return ret;
}
EXPORT_SYMBOL(ext_drv_otp_read_byte);
td_s32 ext_drv_otp_read_bits_onebyte(td_u32 addr, td_u32 start_bit, td_u32 bit_width, td_u8 *value)
{
td_s32 ret;
_mutex_lock();
ret = hal_otp_read_bits_onebyte(addr, start_bit, bit_width, value);
_mutex_unlock();
return ret;
}
EXPORT_SYMBOL(hal_otp_read_bits_onebyte);
td_s32 ext_drv_otp_write(td_u32 addr, td_u32 value)
{
td_s32 ret;
_mutex_lock();
ret = hal_otp_write(addr, value);
_mutex_unlock();
return ret;
}
EXPORT_SYMBOL(ext_drv_otp_write);
td_s32 ext_drv_otp_write_byte(td_u32 addr, td_u8 value)
{
td_s32 ret;
_mutex_lock();
ret = hal_otp_write_byte(addr, value);
_mutex_unlock();
return ret;
}
EXPORT_SYMBOL(ext_drv_otp_write_byte);
td_s32 ext_drv_otp_write_bit(td_u32 addr, td_u32 bit_pos)
{
td_s32 ret;
_mutex_lock();
ret = hal_otp_write_bit(addr, bit_pos);
_mutex_unlock();
return ret;
}
EXPORT_SYMBOL(ext_drv_otp_write_bit);
td_s32 ext_drv_otp_write_bits_onebyte(td_u32 addr, td_u32 start_bit, td_u32 bit_width, td_u8 value)
{
td_s32 ret;
_mutex_lock();
ret = hal_otp_write_bits_onebyte(addr, start_bit, bit_width, value);
_mutex_unlock();
return ret;
}
EXPORT_SYMBOL(ext_drv_otp_write_bits_onebyte);