return 0;
 }
 
+static int gdsc_set_hwmode(struct generic_pm_domain *domain, struct device *dev, bool mode)
+{
+       struct gdsc *sc = domain_to_gdsc(domain);
+       int ret;
+
+       ret = gdsc_hwctrl(sc, mode);
+       if (ret)
+               return ret;
+
+       /*
+        * Wait for the GDSC to go through a power down and
+        * up cycle. If we poll the status register before the
+        * power cycle is finished we might read incorrect values.
+        */
+       udelay(1);
+
+       /*
+        * When the GDSC is switched to HW mode, HW can disable the GDSC.
+        * When the GDSC is switched back to SW mode, the GDSC will be enabled
+        * again, hence we need to poll for GDSC to complete the power up.
+        */
+       if (!mode)
+               return gdsc_poll_status(sc, GDSC_ON);
+
+       return 0;
+}
+
+static bool gdsc_get_hwmode(struct generic_pm_domain *domain, struct device *dev)
+{
+       struct gdsc *sc = domain_to_gdsc(domain);
+       u32 val;
+
+       regmap_read(sc->regmap, sc->gdscr, &val);
+
+       return !!(val & HW_CONTROL_MASK);
+}
+
 static int gdsc_init(struct gdsc *sc)
 {
        u32 mask, val;
                sc->pd.power_off = gdsc_disable;
        if (!sc->pd.power_on)
                sc->pd.power_on = gdsc_enable;
+       if (sc->flags & HW_CTRL_TRIGGER) {
+               sc->pd.set_hwmode_dev = gdsc_set_hwmode;
+               sc->pd.get_hwmode_dev = gdsc_get_hwmode;
+       }
 
        ret = pm_genpd_init(&sc->pd, NULL, !on);
        if (ret)
 
 #define ALWAYS_ON      BIT(6)
 #define RETAIN_FF_ENABLE       BIT(7)
 #define NO_RET_PERIPH  BIT(8)
+#define HW_CTRL_TRIGGER        BIT(9)
        struct reset_controller_dev     *rcdev;
        unsigned int                    *resets;
        unsigned int                    reset_count;