Merge tag 'u-boot-atmel-fixes-2020.07-a' of https://gitlab.denx.de/u-boot/custodians...
[oweals/u-boot.git] / drivers / misc / stm32mp_fuse.c
index 2d661351a17cc70dbf764130d609d5978551cacd..0eed3459734b0a0711eb2f17f975b871447df80b 100644 (file)
@@ -5,19 +5,22 @@
 
 #include <common.h>
 #include <command.h>
+#include <fuse.h>
 #include <misc.h>
 #include <errno.h>
 #include <dm/device.h>
 #include <dm/uclass.h>
+#include <power/stpmic1.h>
 
 #define STM32MP_OTP_BANK       0
+#define STM32MP_NVM_BANK       1
 
 /*
  * The 'fuse' command API
  */
 int fuse_read(u32 bank, u32 word, u32 *val)
 {
-       int ret = 0;
+       int ret;
        struct udevice *dev;
 
        switch (bank) {
@@ -29,7 +32,27 @@ int fuse_read(u32 bank, u32 word, u32 *val)
                        return ret;
                ret = misc_read(dev, word * 4 + STM32_BSEC_SHADOW_OFFSET,
                                val, 4);
+               if (ret != 4)
+                       ret = -EINVAL;
+               else
+                       ret = 0;
+               break;
+
+#ifdef CONFIG_PMIC_STPMIC1
+       case STM32MP_NVM_BANK:
+               ret = uclass_get_device_by_driver(UCLASS_MISC,
+                                                 DM_GET_DRIVER(stpmic1_nvm),
+                                                 &dev);
+               if (ret)
+                       return ret;
+               *val = 0;
+               ret = misc_read(dev, -word, val, 1);
+               if (ret != 1)
+                       ret = -EINVAL;
+               else
+                       ret = 0;
                break;
+#endif /* CONFIG_PMIC_STPMIC1 */
 
        default:
                printf("stm32mp %s: wrong value for bank %i\n", __func__, bank);
@@ -54,7 +77,26 @@ int fuse_prog(u32 bank, u32 word, u32 val)
                        return ret;
                ret = misc_write(dev, word * 4 + STM32_BSEC_OTP_OFFSET,
                                 &val, 4);
+               if (ret != 4)
+                       ret = -EINVAL;
+               else
+                       ret = 0;
+               break;
+
+#ifdef CONFIG_PMIC_STPMIC1
+       case STM32MP_NVM_BANK:
+               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;
+#endif /* CONFIG_PMIC_STPMIC1 */
 
        default:
                printf("stm32mp %s: wrong value for bank %i\n", __func__, bank);
@@ -78,8 +120,28 @@ int fuse_sense(u32 bank, u32 word, u32 *val)
                if (ret)
                        return ret;
                ret = misc_read(dev, word * 4 + STM32_BSEC_OTP_OFFSET, val, 4);
+               if (ret != 4)
+                       ret = -EINVAL;
+               else
+                       ret = 0;
                break;
 
+#ifdef CONFIG_PMIC_STPMIC1
+       case STM32MP_NVM_BANK:
+               ret = uclass_get_device_by_driver(UCLASS_MISC,
+                                                 DM_GET_DRIVER(stpmic1_nvm),
+                                                 &dev);
+               if (ret)
+                       return ret;
+               *val = 0;
+               ret = misc_read(dev, word, val, 1);
+               if (ret != 1)
+                       ret = -EINVAL;
+               else
+                       ret = 0;
+               break;
+#endif /* CONFIG_PMIC_STPMIC1 */
+
        default:
                printf("stm32mp %s: wrong value for bank %i\n", __func__, bank);
                ret = -EINVAL;
@@ -103,7 +165,26 @@ int fuse_override(u32 bank, u32 word, u32 val)
                        return ret;
                ret = misc_write(dev, word * 4 + STM32_BSEC_SHADOW_OFFSET,
                                 &val, 4);
+               if (ret != 4)
+                       ret = -EINVAL;
+               else
+                       ret = 0;
+               break;
+
+#ifdef CONFIG_PMIC_STPMIC1
+       case STM32MP_NVM_BANK:
+               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;
+#endif /* CONFIG_PMIC_STPMIC1 */
 
        default:
                printf("stm32mp %s: wrong value for bank %i\n",