mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-08-28 21:09:00 +09:00
![Simon Glass](/assets/img/avatar_default.png)
At present these functions return 0 on success. For some devices we want to know how many bytes were transferred. It seems useful to adjust the API to be more like the POSIX read() and write() functions. Update these two methods, a test and all users. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Patrick Delaunay <patrick.delaunay@st.com>
129 lines
2.2 KiB
C
129 lines
2.2 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
* Copyright (C) 2018, STMicroelectronics - All Rights Reserved
|
|
*/
|
|
|
|
#include <common.h>
|
|
#include <command.h>
|
|
#include <misc.h>
|
|
#include <errno.h>
|
|
#include <dm/device.h>
|
|
#include <dm/uclass.h>
|
|
|
|
#define STM32MP_OTP_BANK 0
|
|
|
|
/*
|
|
* The 'fuse' command API
|
|
*/
|
|
int fuse_read(u32 bank, u32 word, u32 *val)
|
|
{
|
|
int ret = 0;
|
|
struct udevice *dev;
|
|
|
|
switch (bank) {
|
|
case STM32MP_OTP_BANK:
|
|
ret = uclass_get_device_by_driver(UCLASS_MISC,
|
|
DM_GET_DRIVER(stm32mp_bsec),
|
|
&dev);
|
|
if (ret)
|
|
return ret;
|
|
ret = misc_read(dev, word * 4 + STM32_BSEC_SHADOW_OFFSET,
|
|
val, 4);
|
|
if (ret < 0)
|
|
return ret;
|
|
ret = 0;
|
|
break;
|
|
|
|
default:
|
|
printf("stm32mp %s: wrong value for bank %i\n", __func__, bank);
|
|
ret = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int fuse_prog(u32 bank, u32 word, u32 val)
|
|
{
|
|
struct udevice *dev;
|
|
int ret;
|
|
|
|
switch (bank) {
|
|
case STM32MP_OTP_BANK:
|
|
ret = uclass_get_device_by_driver(UCLASS_MISC,
|
|
DM_GET_DRIVER(stm32mp_bsec),
|
|
&dev);
|
|
if (ret)
|
|
return ret;
|
|
ret = misc_write(dev, word * 4 + STM32_BSEC_OTP_OFFSET,
|
|
&val, 4);
|
|
if (ret < 0)
|
|
return ret;
|
|
ret = 0;
|
|
break;
|
|
|
|
default:
|
|
printf("stm32mp %s: wrong value for bank %i\n", __func__, bank);
|
|
ret = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int fuse_sense(u32 bank, u32 word, u32 *val)
|
|
{
|
|
struct udevice *dev;
|
|
int ret;
|
|
|
|
switch (bank) {
|
|
case STM32MP_OTP_BANK:
|
|
ret = uclass_get_device_by_driver(UCLASS_MISC,
|
|
DM_GET_DRIVER(stm32mp_bsec),
|
|
&dev);
|
|
if (ret)
|
|
return ret;
|
|
ret = misc_read(dev, word * 4 + STM32_BSEC_OTP_OFFSET, val, 4);
|
|
if (ret < 0)
|
|
return ret;
|
|
ret = 0;
|
|
break;
|
|
|
|
default:
|
|
printf("stm32mp %s: wrong value for bank %i\n", __func__, bank);
|
|
ret = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int fuse_override(u32 bank, u32 word, u32 val)
|
|
{
|
|
struct udevice *dev;
|
|
int ret;
|
|
|
|
switch (bank) {
|
|
case STM32MP_OTP_BANK:
|
|
ret = uclass_get_device_by_driver(UCLASS_MISC,
|
|
DM_GET_DRIVER(stm32mp_bsec),
|
|
&dev);
|
|
if (ret)
|
|
return ret;
|
|
ret = misc_write(dev, word * 4 + STM32_BSEC_SHADOW_OFFSET,
|
|
&val, 4);
|
|
if (ret < 0)
|
|
return ret;
|
|
ret = 0;
|
|
break;
|
|
|
|
default:
|
|
printf("stm32mp %s: wrong value for bank %i\n",
|
|
__func__, bank);
|
|
ret = -EINVAL;
|
|
break;
|
|
}
|
|
|
|
return ret;
|
|
}
|