Since commit 106956783018635cef9a35bcb109073513d1ead4 barebox has a generic
framework to provide the reset reason to upper layers. Use it in the
DA9053 driver as well.

Signed-off-by: Juergen Borleis <[email protected]>
---
 drivers/mfd/Kconfig  |  6 ++++
 drivers/mfd/da9053.c | 79 ++++++++++++++++++++++------------------------------
 2 files changed, 40 insertions(+), 45 deletions(-)

diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 3d230f1..8c8f537 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -8,6 +8,12 @@ config MFD_DA9053
        depends on I2C
        bool "DA9053 PMIC driver"
 
+config MFD_DA9053_RESET_SOURCE
+       depends on MFD_DA9053
+       bool "Reset source provider"
+       help
+         This PMIC unit can provide the reset reason.
+
 config MFD_LP3972
        depends on I2C
        bool "LP3972 driver"
diff --git a/drivers/mfd/da9053.c b/drivers/mfd/da9053.c
index 4bce8cc..9294a6a 100644
--- a/drivers/mfd/da9053.c
+++ b/drivers/mfd/da9053.c
@@ -25,6 +25,7 @@
 #include <i2c/i2c.h>
 
 #include <asm/byteorder.h>
+#include <reset_source.h>
 
 #define DRIVERNAME             "da9053"
 
@@ -92,7 +93,6 @@ struct da9053_priv {
        struct watchdog         wd;
        struct i2c_client       *client;
        unsigned int            param_shutdown;
-       unsigned int            param_faultlog;
 };
 
 #define cdev_to_da9053_priv(x) container_of(x, struct da9053_priv, cdev)
@@ -178,45 +178,6 @@ static struct file_operations da9053_fops = {
        .read   = da9053_read,
 };
 
-static int da9053_set_faultlog(struct param_d *param, void *priv)
-{
-       struct da9053_priv *da9053 = priv;
-       int ret;
-       u8 val;
-
-       val = da9053->param_faultlog & 0xff;
-       if (val) {
-               ret = da9053_reg_write(da9053, DA9053_FAULTLOG_REG, val);
-               if (ret < 0)
-                       return ret;
-
-               ret = da9053_park(da9053);
-               if (ret < 0)
-                       return ret;
-       }
-
-       return 0;
-}
-
-static int da9053_get_faultlog(struct param_d *param, void *priv)
-{
-       struct da9053_priv *da9053 = priv;
-       int ret;
-       u8 val;
-
-       ret = da9053_reg_read(da9053, DA9053_FAULTLOG_REG, &val);
-       if (ret < 0)
-               return ret;
-
-       ret = da9053_park(da9053);
-       if (ret < 0)
-               return ret;
-
-       da9053->param_faultlog = val;
-
-       return 0;
-}
-
 static int da9053_set_shutdown(struct param_d *param, void *priv)
 {
        struct da9053_priv *da9053 = priv;
@@ -308,6 +269,37 @@ static int da9053_set_timeout(struct watchdog *wd, 
unsigned timeout)
        return 0;
 }
 
+static void da9053_detect_reset_source(struct da9053_priv *da9053)
+{
+       int ret;
+       u8 val;
+
+       ret = da9053_reg_read(da9053, DA9053_FAULTLOG_REG, &val);
+       if (ret < 0)
+               return;
+
+       ret = da9053_park(da9053);
+       if (ret < 0)
+               return;
+
+       if (val & DA9053_FAULTLOG_TWDERROR) {
+               reset_source_set(RESET_WDG);
+               return;
+       }
+
+       if (val & DA9053_FAULTLOG_VDDFAULT) {
+               reset_source_set(RESET_POR);
+               return;
+       }
+
+       if (val & DA9053_FAULTLOG_NSDSET) {
+               reset_source_set(RESET_RST);
+               return;
+       }
+
+       /* else keep the default 'unknown' state */
+}
+
 static int da9053_probe(struct device_d *dev)
 {
        struct da9053_priv *da9053;
@@ -327,11 +319,6 @@ static int da9053_probe(struct device_d *dev)
        if (ret < 0)
                return ret;
 
-       p = dev_add_param_int(dev, "faultlog", da9053_set_faultlog, 
da9053_get_faultlog,
-                             &da9053->param_faultlog, "0x%02x", da9053);
-       if (IS_ERR(p))
-               return PTR_ERR(p);
-
        p = dev_add_param_bool(dev, "shutdown", da9053_set_shutdown, NULL,
                               &da9053->param_shutdown, da9053);
        if (IS_ERR(p))
@@ -343,6 +330,8 @@ static int da9053_probe(struct device_d *dev)
        if (ret)
                return ret;
 
+       if (IS_ENABLED(CONFIG_MFD_DA9053_RESET_SOURCE))
+               da9053_detect_reset_source(da9053);
        return 0;
 }
 
-- 
2.1.4


_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to