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
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);
|
|
|