Merge https://gitlab.denx.de/u-boot/custodians/u-boot-mpc85xx
[oweals/u-boot.git] / drivers / misc / stm32mp_fuse.c
index 801d946b773bbbc6216b9bfa344d6cdc62688179..0eed3459734b0a0711eb2f17f975b871447df80b 100644 (file)
@@ -20,7 +20,7 @@
  */
 int fuse_read(u32 bank, u32 word, u32 *val)
 {
-       int ret = 0;
+       int ret;
        struct udevice *dev;
 
        switch (bank) {
@@ -32,15 +32,25 @@ 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 < 0)
-                       return ret;
-               ret = 0;
+               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 = stpmic1_shadow_read_byte(word, (u8 *)val);
+               ret = misc_read(dev, -word, val, 1);
+               if (ret != 1)
+                       ret = -EINVAL;
+               else
+                       ret = 0;
                break;
 #endif /* CONFIG_PMIC_STPMIC1 */
 
@@ -67,14 +77,24 @@ 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 < 0)
-                       return ret;
-               ret = 0;
+               if (ret != 4)
+                       ret = -EINVAL;
+               else
+                       ret = 0;
                break;
 
 #ifdef CONFIG_PMIC_STPMIC1
        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;
 #endif /* CONFIG_PMIC_STPMIC1 */
 
@@ -100,15 +120,25 @@ 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 < 0)
-                       return ret;
-               ret = 0;
+               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 = stpmic1_nvm_read_byte(word, (u8 *)val);
+               ret = misc_read(dev, word, val, 1);
+               if (ret != 1)
+                       ret = -EINVAL;
+               else
+                       ret = 0;
                break;
 #endif /* CONFIG_PMIC_STPMIC1 */
 
@@ -135,14 +165,24 @@ 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 < 0)
-                       return ret;
-               ret = 0;
+               if (ret != 4)
+                       ret = -EINVAL;
+               else
+                       ret = 0;
                break;
 
 #ifdef CONFIG_PMIC_STPMIC1
        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;
 #endif /* CONFIG_PMIC_STPMIC1 */