mirror of
https://xff.cz/git/u-boot/
synced 2025-09-03 17:52:07 +02:00
pmu: stpmic1: change specific NVM api to MISC
Use MISC u-class to export the NVM register (starting at 0xF8 offset) and avoid specific API. - SHADOW have offset < 0. - NVM have register > 0 Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
This commit is contained in:
committed by
Patrice Chotard
parent
0c8620d2ff
commit
234a60244c
@@ -40,8 +40,17 @@ int fuse_read(u32 bank, u32 word, u32 *val)
|
|||||||
|
|
||||||
#ifdef CONFIG_PMIC_STPMIC1
|
#ifdef CONFIG_PMIC_STPMIC1
|
||||||
case STM32MP_NVM_BANK:
|
case STM32MP_NVM_BANK:
|
||||||
|
ret = uclass_get_device_by_driver(UCLASS_MISC,
|
||||||
|
DM_GET_DRIVER(stpmic1_nvm),
|
||||||
|
&dev);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
*val = 0;
|
*val = 0;
|
||||||
ret = stpmic1_shadow_read_byte(word, (u8 *)val);
|
ret = misc_read(dev, -word, val, 1);
|
||||||
|
if (ret != 1)
|
||||||
|
ret = -EINVAL;
|
||||||
|
else
|
||||||
|
ret = 0;
|
||||||
break;
|
break;
|
||||||
#endif /* CONFIG_PMIC_STPMIC1 */
|
#endif /* CONFIG_PMIC_STPMIC1 */
|
||||||
|
|
||||||
@@ -76,7 +85,16 @@ int fuse_prog(u32 bank, u32 word, u32 val)
|
|||||||
|
|
||||||
#ifdef CONFIG_PMIC_STPMIC1
|
#ifdef CONFIG_PMIC_STPMIC1
|
||||||
case STM32MP_NVM_BANK:
|
case STM32MP_NVM_BANK:
|
||||||
ret = stpmic1_nvm_write_byte(word, (u8 *)&val);
|
ret = uclass_get_device_by_driver(UCLASS_MISC,
|
||||||
|
DM_GET_DRIVER(stpmic1_nvm),
|
||||||
|
&dev);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
ret = misc_write(dev, word, &val, 1);
|
||||||
|
if (ret != 1)
|
||||||
|
ret = -EINVAL;
|
||||||
|
else
|
||||||
|
ret = 0;
|
||||||
break;
|
break;
|
||||||
#endif /* CONFIG_PMIC_STPMIC1 */
|
#endif /* CONFIG_PMIC_STPMIC1 */
|
||||||
|
|
||||||
@@ -110,8 +128,17 @@ int fuse_sense(u32 bank, u32 word, u32 *val)
|
|||||||
|
|
||||||
#ifdef CONFIG_PMIC_STPMIC1
|
#ifdef CONFIG_PMIC_STPMIC1
|
||||||
case STM32MP_NVM_BANK:
|
case STM32MP_NVM_BANK:
|
||||||
|
ret = uclass_get_device_by_driver(UCLASS_MISC,
|
||||||
|
DM_GET_DRIVER(stpmic1_nvm),
|
||||||
|
&dev);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
*val = 0;
|
*val = 0;
|
||||||
ret = stpmic1_nvm_read_byte(word, (u8 *)val);
|
ret = misc_read(dev, word, val, 1);
|
||||||
|
if (ret != 1)
|
||||||
|
ret = -EINVAL;
|
||||||
|
else
|
||||||
|
ret = 0;
|
||||||
break;
|
break;
|
||||||
#endif /* CONFIG_PMIC_STPMIC1 */
|
#endif /* CONFIG_PMIC_STPMIC1 */
|
||||||
|
|
||||||
@@ -146,7 +173,16 @@ int fuse_override(u32 bank, u32 word, u32 val)
|
|||||||
|
|
||||||
#ifdef CONFIG_PMIC_STPMIC1
|
#ifdef CONFIG_PMIC_STPMIC1
|
||||||
case STM32MP_NVM_BANK:
|
case STM32MP_NVM_BANK:
|
||||||
ret = stpmic1_shadow_write_byte(word, (u8 *)&val);
|
ret = uclass_get_device_by_driver(UCLASS_MISC,
|
||||||
|
DM_GET_DRIVER(stpmic1_nvm),
|
||||||
|
&dev);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
ret = misc_write(dev, -word, &val, 1);
|
||||||
|
if (ret != 1)
|
||||||
|
ret = -EINVAL;
|
||||||
|
else
|
||||||
|
ret = 0;
|
||||||
break;
|
break;
|
||||||
#endif /* CONFIG_PMIC_STPMIC1 */
|
#endif /* CONFIG_PMIC_STPMIC1 */
|
||||||
|
|
||||||
|
@@ -7,6 +7,7 @@
|
|||||||
#include <dm.h>
|
#include <dm.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <i2c.h>
|
#include <i2c.h>
|
||||||
|
#include <misc.h>
|
||||||
#include <sysreset.h>
|
#include <sysreset.h>
|
||||||
#include <dm/device.h>
|
#include <dm/device.h>
|
||||||
#include <dm/lists.h>
|
#include <dm/lists.h>
|
||||||
@@ -69,6 +70,7 @@ static int stpmic1_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
|
|||||||
|
|
||||||
static int stpmic1_bind(struct udevice *dev)
|
static int stpmic1_bind(struct udevice *dev)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
#if CONFIG_IS_ENABLED(DM_REGULATOR)
|
#if CONFIG_IS_ENABLED(DM_REGULATOR)
|
||||||
ofnode regulators_node;
|
ofnode regulators_node;
|
||||||
int children;
|
int children;
|
||||||
@@ -86,6 +88,13 @@ static int stpmic1_bind(struct udevice *dev)
|
|||||||
dev_dbg(dev, "no child found\n");
|
dev_dbg(dev, "no child found\n");
|
||||||
#endif /* DM_REGULATOR */
|
#endif /* DM_REGULATOR */
|
||||||
|
|
||||||
|
if (!IS_ENABLED(CONFIG_SPL_BUILD)) {
|
||||||
|
ret = device_bind_driver(dev, "stpmic1-nvm",
|
||||||
|
"stpmic1-nvm", NULL);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
if (CONFIG_IS_ENABLED(SYSRESET))
|
if (CONFIG_IS_ENABLED(SYSRESET))
|
||||||
return device_bind_driver(dev, "stpmic1-sysreset",
|
return device_bind_driver(dev, "stpmic1-sysreset",
|
||||||
"stpmic1-sysreset", NULL);
|
"stpmic1-sysreset", NULL);
|
||||||
@@ -113,32 +122,38 @@ U_BOOT_DRIVER(pmic_stpmic1) = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#ifndef CONFIG_SPL_BUILD
|
#ifndef CONFIG_SPL_BUILD
|
||||||
static int stpmic1_nvm_rw(u8 addr, u8 *buf, int buf_len, enum pmic_nvm_op op)
|
static int stpmic1_nvm_rw(struct udevice *dev, u8 addr, u8 *buf, int buf_len,
|
||||||
|
enum pmic_nvm_op op)
|
||||||
{
|
{
|
||||||
struct udevice *dev;
|
|
||||||
unsigned long timeout;
|
unsigned long timeout;
|
||||||
u8 cmd = STPMIC1_NVM_CMD_READ;
|
u8 cmd = STPMIC1_NVM_CMD_READ;
|
||||||
int ret;
|
int ret, len = buf_len;
|
||||||
|
|
||||||
ret = uclass_get_device_by_driver(UCLASS_PMIC,
|
|
||||||
DM_GET_DRIVER(pmic_stpmic1), &dev);
|
|
||||||
if (ret)
|
|
||||||
/* No PMIC on power discrete board */
|
|
||||||
return -EOPNOTSUPP;
|
|
||||||
|
|
||||||
if (addr < STPMIC1_NVM_START_ADDRESS)
|
if (addr < STPMIC1_NVM_START_ADDRESS)
|
||||||
return -EACCES;
|
return -EACCES;
|
||||||
|
if (addr + buf_len > STPMIC1_NVM_START_ADDRESS + STPMIC1_NVM_SIZE)
|
||||||
|
len = STPMIC1_NVM_START_ADDRESS + STPMIC1_NVM_SIZE - addr;
|
||||||
|
|
||||||
if (op == SHADOW_READ)
|
if (op == SHADOW_READ) {
|
||||||
return pmic_read(dev, addr, buf, buf_len);
|
ret = pmic_read(dev, addr, buf, len);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
else
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
if (op == SHADOW_WRITE)
|
if (op == SHADOW_WRITE) {
|
||||||
return pmic_write(dev, addr, buf, buf_len);
|
ret = pmic_write(dev, addr, buf, len);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
else
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
if (op == NVM_WRITE) {
|
if (op == NVM_WRITE) {
|
||||||
cmd = STPMIC1_NVM_CMD_PROGRAM;
|
cmd = STPMIC1_NVM_CMD_PROGRAM;
|
||||||
|
|
||||||
ret = pmic_write(dev, addr, buf, buf_len);
|
ret = pmic_write(dev, addr, buf, len);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -168,51 +183,50 @@ static int stpmic1_nvm_rw(u8 addr, u8 *buf, int buf_len, enum pmic_nvm_op op)
|
|||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
|
|
||||||
if (op == NVM_READ) {
|
if (op == NVM_READ) {
|
||||||
ret = pmic_read(dev, addr, buf, buf_len);
|
ret = pmic_read(dev, addr, buf, len);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
int stpmic1_shadow_read_byte(u8 addr, u8 *buf)
|
static int stpmic1_nvm_read(struct udevice *dev, int offset,
|
||||||
|
void *buf, int size)
|
||||||
{
|
{
|
||||||
return stpmic1_nvm_rw(addr, buf, 1, SHADOW_READ);
|
enum pmic_nvm_op op = NVM_READ;
|
||||||
|
|
||||||
|
if (offset < 0) {
|
||||||
|
op = SHADOW_READ;
|
||||||
|
offset = -offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
return stpmic1_nvm_rw(dev->parent, offset, buf, size, op);
|
||||||
}
|
}
|
||||||
|
|
||||||
int stpmic1_shadow_write_byte(u8 addr, u8 *buf)
|
static int stpmic1_nvm_write(struct udevice *dev, int offset,
|
||||||
|
const void *buf, int size)
|
||||||
{
|
{
|
||||||
return stpmic1_nvm_rw(addr, buf, 1, SHADOW_WRITE);
|
enum pmic_nvm_op op = NVM_WRITE;
|
||||||
|
|
||||||
|
if (offset < 0) {
|
||||||
|
op = SHADOW_WRITE;
|
||||||
|
offset = -offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
return stpmic1_nvm_rw(dev->parent, offset, (void *)buf, size, op);
|
||||||
}
|
}
|
||||||
|
|
||||||
int stpmic1_nvm_read_byte(u8 addr, u8 *buf)
|
static const struct misc_ops stpmic1_nvm_ops = {
|
||||||
{
|
.read = stpmic1_nvm_read,
|
||||||
return stpmic1_nvm_rw(addr, buf, 1, NVM_READ);
|
.write = stpmic1_nvm_write,
|
||||||
}
|
};
|
||||||
|
|
||||||
int stpmic1_nvm_write_byte(u8 addr, u8 *buf)
|
U_BOOT_DRIVER(stpmic1_nvm) = {
|
||||||
{
|
.name = "stpmic1-nvm",
|
||||||
return stpmic1_nvm_rw(addr, buf, 1, NVM_WRITE);
|
.id = UCLASS_MISC,
|
||||||
}
|
.ops = &stpmic1_nvm_ops,
|
||||||
|
};
|
||||||
int stpmic1_nvm_read_all(u8 *buf, int buf_len)
|
|
||||||
{
|
|
||||||
if (buf_len != STPMIC1_NVM_SIZE)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
return stpmic1_nvm_rw(STPMIC1_NVM_START_ADDRESS,
|
|
||||||
buf, buf_len, NVM_READ);
|
|
||||||
}
|
|
||||||
|
|
||||||
int stpmic1_nvm_write_all(u8 *buf, int buf_len)
|
|
||||||
{
|
|
||||||
if (buf_len != STPMIC1_NVM_SIZE)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
return stpmic1_nvm_rw(STPMIC1_NVM_START_ADDRESS,
|
|
||||||
buf, buf_len, NVM_WRITE);
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_SPL_BUILD */
|
#endif /* CONFIG_SPL_BUILD */
|
||||||
|
|
||||||
#ifdef CONFIG_SYSRESET
|
#ifdef CONFIG_SYSRESET
|
||||||
|
@@ -108,11 +108,4 @@ enum {
|
|||||||
STPMIC1_PWR_SW2,
|
STPMIC1_PWR_SW2,
|
||||||
STPMIC1_MAX_PWR_SW,
|
STPMIC1_MAX_PWR_SW,
|
||||||
};
|
};
|
||||||
|
|
||||||
int stpmic1_shadow_read_byte(u8 addr, u8 *buf);
|
|
||||||
int stpmic1_shadow_write_byte(u8 addr, u8 *buf);
|
|
||||||
int stpmic1_nvm_read_byte(u8 addr, u8 *buf);
|
|
||||||
int stpmic1_nvm_write_byte(u8 addr, u8 *buf);
|
|
||||||
int stpmic1_nvm_read_all(u8 *buf, int buf_len);
|
|
||||||
int stpmic1_nvm_write_all(u8 *buf, int buf_len);
|
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user