]> Git Repo - linux.git/commitdiff
Merge branch 'perm-fix' into omap-for-v4.19/fixes-v2
authorTony Lindgren <[email protected]>
Tue, 28 Aug 2018 16:58:03 +0000 (09:58 -0700)
committerTony Lindgren <[email protected]>
Tue, 28 Aug 2018 16:58:03 +0000 (09:58 -0700)
1  2 
arch/arm/boot/dts/omap4-droid4-xt894.dts
drivers/bus/ti-sysc.c

index edc97f89fae4262ae104d5a3b2af0d5d8c29f8a0,12d6822f00576f720c9c2086e061de4cb09fc299..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 4576a1268e0e4be8fc44ecdac1d40e6fd5353408,c9bac9dc4637e7b8ce9ad3eb15e484added77f79..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 {
@@@ -88,6 -91,11 +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) {
@@@ -490,29 -498,32 +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;
  
@@@ -940,6 -951,36 +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);
  
@@@ -1175,10 -1224,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);
@@@ -1549,6 -1598,23 +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);
@@@ -1740,6 -1806,7 +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);
This page took 0.075403 seconds and 4 git commands to generate.