Merge commit 'ce32d59ee2cd036f6e8a6ed17a06a0b0bec5c67c' into omap-for-v4.21/dt-ti...
authorTony Lindgren <tony@atomide.com>
Thu, 18 Oct 2018 16:55:46 +0000 (09:55 -0700)
committerTony Lindgren <tony@atomide.com>
Thu, 18 Oct 2018 16:55:46 +0000 (09:55 -0700)
1  2 
arch/arm/boot/dts/am4372.dtsi
arch/arm/boot/dts/omap4-droid4-xt894.dts
drivers/bus/ti-sysc.c

index 7450b6acf1cabb5ba1fedcca32bc77d2912bdd70,d4b7c59eec6853f2f836b5b3ffd686988ad0f6b1..a68e89dae7a17d0257a90ae7fddebdf0173e189f
                        ti,hwmods = "rtc";
                        clocks = <&clk_32768_ck>;
                        clock-names = "int-clk";
+                       system-power-controller;
                        status = "disabled";
                };
  
                        };
                };
  
 -              qspi: qspi@47900000 {
 +              qspi: spi@47900000 {
                        compatible = "ti,am4372-qspi";
                        reg = <0x47900000 0x100>,
                              <0x30000000 0x4000000>;
index 12d6822f00576f720c9c2086e061de4cb09fc299,edc97f89fae4262ae104d5a3b2af0d5d8c29f8a0..3c26a4bbc34075e4e545b88ca4a1ce6dd2df6b94
                        gpios = <&gpio5 26 GPIO_ACTIVE_LOW>; /* gpio154 */
                        linux,code = <KEY_VOLUMEDOWN>;
                        linux,can-disable;
 +                      /* Value above 7.95ms for no GPIO hardware debounce */
 +                      debounce-interval = <10>;
                };
  
                slider {
                        linux,input-type = <EV_SW>;
                        linux,code = <SW_KEYPAD_SLIDE>;
                        linux,can-disable;
 -
 +                      /* Value above 7.95ms for no GPIO hardware debounce */
 +                      debounce-interval = <10>;
                };
        };
  
                compatible = "ti,wl1285", "ti,wl1283";
                reg = <2>;
                interrupt-parent = <&gpio4>;
 -              interrupts = <4 IRQ_TYPE_LEVEL_HIGH>; /* gpio100 */
 +              interrupts = <4 IRQ_TYPE_EDGE_RISING>; /* gpio100 */
                ref-clock-frequency = <26000000>;
                tcxo-clock-frequency = <26000000>;
        };
                OMAP4_IOPAD(0x10c, PIN_INPUT | MUX_MODE1)       /* abe_mcbsp3_fsx */
                >;
        };
- };
- &omap4_pmx_wkup {
-       usb_gpio_mux_sel2: pinmux_usb_gpio_mux_sel2_pins {
-               /* gpio_wk0 */
-               pinctrl-single,pins = <
-               OMAP4_IOPAD(0x040, PIN_OUTPUT_PULLDOWN | MUX_MODE3)
-               >;
-       };
  
        vibrator_direction_pin: pinmux_vibrator_direction_pin {
                pinctrl-single,pins = <
        };
  };
  
+ &omap4_pmx_wkup {
+       usb_gpio_mux_sel2: pinmux_usb_gpio_mux_sel2_pins {
+               /* gpio_wk0 */
+               pinctrl-single,pins = <
+               OMAP4_IOPAD(0x040, PIN_OUTPUT_PULLDOWN | MUX_MODE3)
+               >;
+       };
+ };
  /*
   * As uart1 is wired to mdm6600 with rts and cts, we can use the cts pin for
   * uart1 wakeirq.
diff --combined drivers/bus/ti-sysc.c
index c9bac9dc4637e7b8ce9ad3eb15e484added77f79,4576a1268e0e4be8fc44ecdac1d40e6fd5353408..e4fe954e63a9be53b74397c825bf4f57b06dcca5
  #include <linux/of_address.h>
  #include <linux/of_platform.h>
  #include <linux/slab.h>
 +#include <linux/iopoll.h>
  
  #include <linux/platform_data/ti-sysc.h>
  
  #include <dt-bindings/bus/ti-sysc.h>
  
 +#define MAX_MODULE_SOFTRESET_WAIT             10000
 +
  static const char * const reg_names[] = { "rev", "sysc", "syss", };
  
  enum sysc_clocks {
@@@ -91,11 -88,6 +91,11 @@@ struct sysc 
        struct delayed_work idle_work;
  };
  
 +void sysc_write(struct sysc *ddata, int offset, u32 value)
 +{
 +      writel_relaxed(value, ddata->module_va + offset);
 +}
 +
  static u32 sysc_read(struct sysc *ddata, int offset)
  {
        if (ddata->cfg.quirks & SYSC_QUIRK_16BIT) {
@@@ -498,32 -490,29 +498,29 @@@ static int sysc_check_registers(struct 
  
  /**
   * syc_ioremap - ioremap register space for the interconnect target module
-  * @ddata: deviec driver data
+  * @ddata: device driver data
   *
   * Note that the interconnect target module registers can be anywhere
-  * within the first child device address space. For example, SGX has
-  * them at offset 0x1fc00 in the 32MB module address space. We just
-  * what we need around the interconnect target module registers.
+  * within the interconnect target module range. For example, SGX has
+  * them at offset 0x1fc00 in the 32MB module address space. And cpsw
+  * has them at offset 0x1200 in the CPSW_WR child. Usually the
+  * the interconnect target module registers are at the beginning of
+  * the module range though.
   */
  static int sysc_ioremap(struct sysc *ddata)
  {
-       u32 size = 0;
-       if (ddata->offsets[SYSC_SYSSTATUS] >= 0)
-               size = ddata->offsets[SYSC_SYSSTATUS];
-       else if (ddata->offsets[SYSC_SYSCONFIG] >= 0)
-               size = ddata->offsets[SYSC_SYSCONFIG];
-       else if (ddata->offsets[SYSC_REVISION] >= 0)
-               size = ddata->offsets[SYSC_REVISION];
-       else
-               return -EINVAL;
+       int size;
  
-       size &= 0xfff00;
-       size += SZ_256;
+       size = max3(ddata->offsets[SYSC_REVISION],
+                   ddata->offsets[SYSC_SYSCONFIG],
+                   ddata->offsets[SYSC_SYSSTATUS]);
+       if (size < 0 || (size + sizeof(u32)) > ddata->module_size)
+               return -EINVAL;
  
        ddata->module_va = devm_ioremap(ddata->dev,
                                        ddata->module_pa,
-                                       size);
+                                       size + sizeof(u32));
        if (!ddata->module_va)
                return -EIO;
  
@@@ -951,36 -940,6 +948,36 @@@ static void sysc_init_revision_quirks(s
        }
  }
  
 +static int sysc_reset(struct sysc *ddata)
 +{
 +      int offset = ddata->offsets[SYSC_SYSCONFIG];
 +      int val;
 +
 +      if (ddata->legacy_mode || offset < 0 ||
 +          ddata->cfg.quirks & SYSC_QUIRK_NO_RESET_ON_INIT)
 +              return 0;
 +
 +      /*
 +       * Currently only support reset status in sysstatus.
 +       * Warn and return error in all other cases
 +       */
 +      if (!ddata->cfg.syss_mask) {
 +              dev_err(ddata->dev, "No ti,syss-mask. Reset failed\n");
 +              return -EINVAL;
 +      }
 +
 +      val = sysc_read(ddata, offset);
 +      val |= (0x1 << ddata->cap->regbits->srst_shift);
 +      sysc_write(ddata, offset, val);
 +
 +      /* Poll on reset status */
 +      offset = ddata->offsets[SYSC_SYSSTATUS];
 +
 +      return readl_poll_timeout(ddata->module_va + offset, val,
 +                                (val & ddata->cfg.syss_mask) == 0x0,
 +                                100, MAX_MODULE_SOFTRESET_WAIT);
 +}
 +
  /* At this point the module is configured enough to read the revision */
  static int sysc_init_module(struct sysc *ddata)
  {
                return 0;
        }
  
 +      error = sysc_reset(ddata);
 +      if (error) {
 +              dev_err(ddata->dev, "Reset failed with %d\n", error);
 +              pm_runtime_put_sync(ddata->dev);
 +
 +              return error;
 +      }
 +
        ddata->revision = sysc_read_revision(ddata);
        pm_runtime_put_sync(ddata->dev);
  
@@@ -1224,10 -1175,10 +1221,10 @@@ static int sysc_child_suspend_noirq(str
        if (!pm_runtime_status_suspended(dev)) {
                error = pm_generic_runtime_suspend(dev);
                if (error) {
-                       dev_err(dev, "%s error at %i: %i\n",
-                               __func__, __LINE__, error);
+                       dev_warn(dev, "%s busy at %i: %i\n",
+                                __func__, __LINE__, error);
  
-                       return error;
+                       return 0;
                }
  
                error = sysc_runtime_suspend(ddata->dev);
@@@ -1598,23 -1549,6 +1595,23 @@@ static const struct sysc_capabilities s
        .regbits = &sysc_regbits_omap4_usb_host_fs,
  };
  
 +static const struct sysc_regbits sysc_regbits_dra7_mcan = {
 +      .dmadisable_shift = -ENODEV,
 +      .midle_shift = -ENODEV,
 +      .sidle_shift = -ENODEV,
 +      .clkact_shift = -ENODEV,
 +      .enwkup_shift = 4,
 +      .srst_shift = 0,
 +      .emufree_shift = -ENODEV,
 +      .autoidle_shift = -ENODEV,
 +};
 +
 +static const struct sysc_capabilities sysc_dra7_mcan = {
 +      .type = TI_SYSC_DRA7_MCAN,
 +      .sysc_mask = SYSC_DRA7_MCAN_ENAWAKEUP | SYSC_OMAP4_SOFTRESET,
 +      .regbits = &sysc_regbits_dra7_mcan,
 +};
 +
  static int sysc_init_pdata(struct sysc *ddata)
  {
        struct ti_sysc_platform_data *pdata = dev_get_platdata(ddata->dev);
@@@ -1806,7 -1740,6 +1803,7 @@@ static const struct of_device_id sysc_m
        { .compatible = "ti,sysc-mcasp", .data = &sysc_omap4_mcasp, },
        { .compatible = "ti,sysc-usb-host-fs",
          .data = &sysc_omap4_usb_host_fs, },
 +      { .compatible = "ti,sysc-dra7-mcan", .data = &sysc_dra7_mcan, },
        {  },
  };
  MODULE_DEVICE_TABLE(of, sysc_match);