perf vendor events arm64: Fix indentation of brackets in imx8mm metrics
[linux-2.6-microblaze.git] / drivers / bus / ti-sysc.c
index 92ecf1a..a27d751 100644 (file)
@@ -853,8 +853,12 @@ static int sysc_ioremap(struct sysc *ddata)
  */
 static int sysc_map_and_check_registers(struct sysc *ddata)
 {
+       struct device_node *np = ddata->dev->of_node;
        int error;
 
+       if (!of_get_property(np, "reg", NULL))
+               return 0;
+
        error = sysc_parse_and_check_child_range(ddata);
        if (error)
                return error;
@@ -1222,10 +1226,10 @@ static int __maybe_unused sysc_runtime_suspend(struct device *dev)
        ddata->enabled = false;
 
 err_allow_idle:
-       reset_control_assert(ddata->rsts);
-
        sysc_clkdm_allow_idle(ddata);
 
+       reset_control_assert(ddata->rsts);
+
        return error;
 }
 
@@ -1379,6 +1383,8 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = {
                   SYSC_QUIRK_CLKDM_NOAUTO),
        SYSC_QUIRK("dwc3", 0x488c0000, 0, 0x10, -ENODEV, 0x500a0200, 0xffffffff,
                   SYSC_QUIRK_CLKDM_NOAUTO),
+       SYSC_QUIRK("gpmc", 0, 0, 0x10, 0x14, 0x00000060, 0xffffffff,
+                  SYSC_QUIRK_GPMC_DEBUG),
        SYSC_QUIRK("hdmi", 0, 0, 0x10, -ENODEV, 0x50030200, 0xffffffff,
                   SYSC_QUIRK_OPT_CLKS_NEEDED),
        SYSC_QUIRK("hdq1w", 0, 0, 0x14, 0x18, 0x00000006, 0xffffffff,
@@ -1814,6 +1820,14 @@ static void sysc_init_module_quirks(struct sysc *ddata)
                return;
        }
 
+#ifdef CONFIG_OMAP_GPMC_DEBUG
+       if (ddata->cfg.quirks & SYSC_QUIRK_GPMC_DEBUG) {
+               ddata->cfg.quirks |= SYSC_QUIRK_NO_RESET_ON_INIT;
+
+               return;
+       }
+#endif
+
        if (ddata->cfg.quirks & SYSC_MODULE_QUIRK_I2C) {
                ddata->pre_reset_quirk = sysc_pre_reset_quirk_i2c;
                ddata->post_reset_quirk = sysc_post_reset_quirk_i2c;
@@ -1945,6 +1959,7 @@ static int sysc_reset(struct sysc *ddata)
  */
 static int sysc_init_module(struct sysc *ddata)
 {
+       bool rstctrl_deasserted = false;
        int error = 0;
 
        error = sysc_clockdomain_init(ddata);
@@ -1969,6 +1984,7 @@ static int sysc_init_module(struct sysc *ddata)
                error = reset_control_deassert(ddata->rsts);
                if (error)
                        goto err_main_clocks;
+               rstctrl_deasserted = true;
        }
 
        ddata->revision = sysc_read_revision(ddata);
@@ -1978,13 +1994,13 @@ static int sysc_init_module(struct sysc *ddata)
        if (ddata->legacy_mode) {
                error = sysc_legacy_init(ddata);
                if (error)
-                       goto err_reset;
+                       goto err_main_clocks;
        }
 
        if (!ddata->legacy_mode) {
                error = sysc_enable_module(ddata->dev);
                if (error)
-                       goto err_reset;
+                       goto err_main_clocks;
        }
 
        error = sysc_reset(ddata);
@@ -1994,10 +2010,6 @@ static int sysc_init_module(struct sysc *ddata)
        if (error && !ddata->legacy_mode)
                sysc_disable_module(ddata->dev);
 
-err_reset:
-       if (error && !(ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT))
-               reset_control_assert(ddata->rsts);
-
 err_main_clocks:
        if (error)
                sysc_disable_main_clocks(ddata);
@@ -2008,6 +2020,10 @@ err_opt_clocks:
                sysc_clkdm_allow_idle(ddata);
        }
 
+       if (error && rstctrl_deasserted &&
+           !(ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT))
+               reset_control_assert(ddata->rsts);
+
        return error;
 }
 
@@ -2909,6 +2925,9 @@ static int sysc_probe(struct platform_device *pdev)
        if (!ddata)
                return -ENOMEM;
 
+       ddata->offsets[SYSC_REVISION] = -ENODEV;
+       ddata->offsets[SYSC_SYSCONFIG] = -ENODEV;
+       ddata->offsets[SYSC_SYSSTATUS] = -ENODEV;
        ddata->dev = &pdev->dev;
        platform_set_drvdata(pdev, ddata);
 
@@ -2975,9 +2994,6 @@ static int sysc_probe(struct platform_device *pdev)
        }
 
        /* Balance use counts as PM runtime should have enabled these all */
-       if (!(ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT))
-               reset_control_assert(ddata->rsts);
-
        if (!(ddata->cfg.quirks &
              (SYSC_QUIRK_NO_IDLE | SYSC_QUIRK_NO_IDLE_ON_INIT))) {
                sysc_disable_main_clocks(ddata);
@@ -2985,6 +3001,9 @@ static int sysc_probe(struct platform_device *pdev)
                sysc_clkdm_allow_idle(ddata);
        }
 
+       if (!(ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT))
+               reset_control_assert(ddata->rsts);
+
        sysc_show_registers(ddata);
 
        ddata->dev->type = &sysc_device_type;