bus: ti-sysc: Add quirk handling for reset on re-init
authorTony Lindgren <tony@atomide.com>
Tue, 21 Sep 2021 09:42:25 +0000 (12:42 +0300)
committerTony Lindgren <tony@atomide.com>
Tue, 21 Sep 2021 09:50:38 +0000 (12:50 +0300)
At least am335x gpmc module needs a reset in addition to re-init on resume.
Let's add a quirk handling for reset on re-init.

Signed-off-by: Tony Lindgren <tony@atomide.com>
drivers/bus/ti-sysc.c
include/linux/platform_data/ti-sysc.h

index a73c707..cacdc4e 100644 (file)
@@ -157,6 +157,7 @@ struct sysc {
 
 static void sysc_parse_dts_quirks(struct sysc *ddata, struct device_node *np,
                                  bool is_child);
+static int sysc_reset(struct sysc *ddata);
 
 static void sysc_write(struct sysc *ddata, int offset, u32 value)
 {
@@ -1440,6 +1441,15 @@ static int sysc_reinit_module(struct sysc *ddata, bool leave_enabled)
        if (error)
                dev_warn(dev, "reinit resume failed: %i\n", error);
 
+       /* Some modules like am335x gpmc need reset and restore of sysconfig */
+       if (ddata->cfg.quirks & SYSC_QUIRK_RESET_ON_CTX_LOST) {
+               error = sysc_reset(ddata);
+               if (error)
+                       dev_warn(dev, "reinit reset failed: %i\n", error);
+
+               sysc_write_sysconfig(ddata, ddata->sysconfig);
+       }
+
        if (leave_enabled)
                return error;
 
index 989aa30..f11244f 100644 (file)
@@ -50,6 +50,7 @@ struct sysc_regbits {
        s8 emufree_shift;
 };
 
+#define SYSC_QUIRK_RESET_ON_CTX_LOST   BIT(29)
 #define SYSC_QUIRK_REINIT_ON_CTX_LOST  BIT(28)
 #define SYSC_QUIRK_REINIT_ON_RESUME    BIT(27)
 #define SYSC_QUIRK_GPMC_DEBUG          BIT(26)