Re: [PATCH 3/4][v3] ARM: imx: pinctrl-imx: imx7d: add support for iomuxc lpsr

2015-07-07 Thread Zhi Li
On Tue, Jul 7, 2015 at 2:17 PM, Adrian Alonso aalo...@freescale.com wrote:
 * Extend pinctrl-imx driver to support iomux lpsr conntroller,
 * iMX7D has two iomuxc controllers, iomuxc controller similar as
   previous iMX SoC generation and iomuxc-lpsr which provides
   low power state rentetion capabilities on gpios that are part of
   iomuxc-lpsr (GPIO1_IO7..GPIO1_IO0).
 * Use IOMUXC_LPSR_SUPPORT and iput_val most significant bits to
   properly configure iomuxc/iomuxc-lpsr settings.

 Signed-off-by: Adrian Alonso aalo...@freescale.com

Acked-by: frank...@freescale.com


 - Change from v1 to v2:
   - Add suggested comment for input select register shared between
 iomuxc-lpsr and normal iomuxc controller.
   - Use IOMUXC_LPSR_MASK to extract pad group id and aling pin_id to
 16 bit representation.
 - Change from v2 to v3
   - Use devm_ioremap_resource instead of of_iomap to get iomuxc-lpsr
 base register address.
 ---
  drivers/pinctrl/freescale/pinctrl-imx.c | 72 
 ++---
  drivers/pinctrl/freescale/pinctrl-imx.h |  7 +++-
  2 files changed, 55 insertions(+), 24 deletions(-)

 diff --git a/drivers/pinctrl/freescale/pinctrl-imx.c 
 b/drivers/pinctrl/freescale/pinctrl-imx.c
 index d7b98ba..aef4ca3 100644
 --- a/drivers/pinctrl/freescale/pinctrl-imx.c
 +++ b/drivers/pinctrl/freescale/pinctrl-imx.c
 @@ -1,7 +1,7 @@
  /*
   * Core driver for the imx pin controller
   *
 - * Copyright (C) 2012 Freescale Semiconductor, Inc.
 + * Copyright (C) 2012-2015 Freescale Semiconductor, Inc.
   * Copyright (C) 2012 Linaro Ltd.
   *
   * Author: Dong Aisheng dong.aish...@linaro.org
 @@ -38,7 +38,6 @@
  struct imx_pinctrl {
 struct device *dev;
 struct pinctrl_dev *pctl;
 -   void __iomem *base;
 const struct imx_pinctrl_soc_info *info;
  };

 @@ -212,12 +211,12 @@ static int imx_pmx_set(struct pinctrl_dev *pctldev, 
 unsigned selector,

 if (info-flags  SHARE_MUX_CONF_REG) {
 u32 reg;
 -   reg = readl(ipctl-base + pin_reg-mux_reg);
 +   reg = readl(pin_reg-base + pin_reg-mux_reg);
 reg = ~(0x7  20);
 reg |= (pin-mux_mode  20);
 -   writel(reg, ipctl-base + pin_reg-mux_reg);
 +   writel(reg, pin_reg-base + pin_reg-mux_reg);
 } else {
 -   writel(pin-mux_mode, ipctl-base + pin_reg-mux_reg);
 +   writel(pin-mux_mode, pin_reg-base + 
 pin_reg-mux_reg);
 }
 dev_dbg(ipctl-dev, write: offset 0x%x val 0x%x\n,
 pin_reg-mux_reg, pin-mux_mode);
 @@ -245,16 +244,22 @@ static int imx_pmx_set(struct pinctrl_dev *pctldev, 
 unsigned selector,
  * The input_reg[i] here is actually some IOMUXC 
 general
  * purpose register, not regular select input 
 register.
  */
 -   val = readl(ipctl-base + pin-input_reg);
 +   val = readl(pin_reg-base + pin-input_reg);
 val = ~mask;
 val |= select  shift;
 -   writel(val, ipctl-base + pin-input_reg);
 +   writel(val, pin_reg-base + pin-input_reg);
 } else if (pin-input_reg) {
 /*
  * Regular select input register can never be at 
 offset
  * 0, and we only print register value for regular 
 case.
  */
 -   writel(pin-input_val, ipctl-base + pin-input_reg);
 +   if (info-flags  IOMUXC_LPSR_SUPPORT 
 +   IOMUXC_LPSR_MASK(pin-input_val))
 +   /* iomuxc-lpsr select input register shared with 
 normal iomuxc */
 +   writel(pin-input_val, info-base + 
 pin-input_reg);
 +   else
 +   writel(pin-input_val, pin_reg-base + 
 pin-input_reg);
 +
 dev_dbg(ipctl-dev,
 ==select_input: offset 0x%x val 0x%x\n,
 pin-input_reg, pin-input_val);
 @@ -326,10 +331,10 @@ static int imx_pmx_gpio_request_enable(struct 
 pinctrl_dev *pctldev,
 return -EINVAL;

  mux_pin:
 -   reg = readl(ipctl-base + pin_reg-mux_reg);
 +   reg = readl(pin_reg-base + pin_reg-mux_reg);
 reg = ~(0x7  20);
 reg |= imx_pin-config;
 -   writel(reg, ipctl-base + pin_reg-mux_reg);
 +   writel(reg, pin_reg-base + pin_reg-mux_reg);

 return 0;
  }
 @@ -354,12 +359,12 @@ static int imx_pmx_gpio_set_direction(struct 
 pinctrl_dev *pctldev,
 return -EINVAL;

 /* IBE always enabled allows us to read the value on the wire */
 -   reg = readl(ipctl-base + pin_reg-mux_reg);
 +   

[PATCH 3/4][v3] ARM: imx: pinctrl-imx: imx7d: add support for iomuxc lpsr

2015-07-07 Thread Adrian Alonso
* Extend pinctrl-imx driver to support iomux lpsr conntroller,
* iMX7D has two iomuxc controllers, iomuxc controller similar as
  previous iMX SoC generation and iomuxc-lpsr which provides
  low power state rentetion capabilities on gpios that are part of
  iomuxc-lpsr (GPIO1_IO7..GPIO1_IO0).
* Use IOMUXC_LPSR_SUPPORT and iput_val most significant bits to
  properly configure iomuxc/iomuxc-lpsr settings.

Signed-off-by: Adrian Alonso aalo...@freescale.com

- Change from v1 to v2:
  - Add suggested comment for input select register shared between
iomuxc-lpsr and normal iomuxc controller.
  - Use IOMUXC_LPSR_MASK to extract pad group id and aling pin_id to
16 bit representation.
- Change from v2 to v3
  - Use devm_ioremap_resource instead of of_iomap to get iomuxc-lpsr
base register address.
---
 drivers/pinctrl/freescale/pinctrl-imx.c | 72 ++---
 drivers/pinctrl/freescale/pinctrl-imx.h |  7 +++-
 2 files changed, 55 insertions(+), 24 deletions(-)

diff --git a/drivers/pinctrl/freescale/pinctrl-imx.c 
b/drivers/pinctrl/freescale/pinctrl-imx.c
index d7b98ba..aef4ca3 100644
--- a/drivers/pinctrl/freescale/pinctrl-imx.c
+++ b/drivers/pinctrl/freescale/pinctrl-imx.c
@@ -1,7 +1,7 @@
 /*
  * Core driver for the imx pin controller
  *
- * Copyright (C) 2012 Freescale Semiconductor, Inc.
+ * Copyright (C) 2012-2015 Freescale Semiconductor, Inc.
  * Copyright (C) 2012 Linaro Ltd.
  *
  * Author: Dong Aisheng dong.aish...@linaro.org
@@ -38,7 +38,6 @@
 struct imx_pinctrl {
struct device *dev;
struct pinctrl_dev *pctl;
-   void __iomem *base;
const struct imx_pinctrl_soc_info *info;
 };
 
@@ -212,12 +211,12 @@ static int imx_pmx_set(struct pinctrl_dev *pctldev, 
unsigned selector,
 
if (info-flags  SHARE_MUX_CONF_REG) {
u32 reg;
-   reg = readl(ipctl-base + pin_reg-mux_reg);
+   reg = readl(pin_reg-base + pin_reg-mux_reg);
reg = ~(0x7  20);
reg |= (pin-mux_mode  20);
-   writel(reg, ipctl-base + pin_reg-mux_reg);
+   writel(reg, pin_reg-base + pin_reg-mux_reg);
} else {
-   writel(pin-mux_mode, ipctl-base + pin_reg-mux_reg);
+   writel(pin-mux_mode, pin_reg-base + pin_reg-mux_reg);
}
dev_dbg(ipctl-dev, write: offset 0x%x val 0x%x\n,
pin_reg-mux_reg, pin-mux_mode);
@@ -245,16 +244,22 @@ static int imx_pmx_set(struct pinctrl_dev *pctldev, 
unsigned selector,
 * The input_reg[i] here is actually some IOMUXC general
 * purpose register, not regular select input register.
 */
-   val = readl(ipctl-base + pin-input_reg);
+   val = readl(pin_reg-base + pin-input_reg);
val = ~mask;
val |= select  shift;
-   writel(val, ipctl-base + pin-input_reg);
+   writel(val, pin_reg-base + pin-input_reg);
} else if (pin-input_reg) {
/*
 * Regular select input register can never be at offset
 * 0, and we only print register value for regular case.
 */
-   writel(pin-input_val, ipctl-base + pin-input_reg);
+   if (info-flags  IOMUXC_LPSR_SUPPORT 
+   IOMUXC_LPSR_MASK(pin-input_val))
+   /* iomuxc-lpsr select input register shared with normal 
iomuxc */
+   writel(pin-input_val, info-base + 
pin-input_reg);
+   else
+   writel(pin-input_val, pin_reg-base + 
pin-input_reg);
+
dev_dbg(ipctl-dev,
==select_input: offset 0x%x val 0x%x\n,
pin-input_reg, pin-input_val);
@@ -326,10 +331,10 @@ static int imx_pmx_gpio_request_enable(struct pinctrl_dev 
*pctldev,
return -EINVAL;
 
 mux_pin:
-   reg = readl(ipctl-base + pin_reg-mux_reg);
+   reg = readl(pin_reg-base + pin_reg-mux_reg);
reg = ~(0x7  20);
reg |= imx_pin-config;
-   writel(reg, ipctl-base + pin_reg-mux_reg);
+   writel(reg, pin_reg-base + pin_reg-mux_reg);
 
return 0;
 }
@@ -354,12 +359,12 @@ static int imx_pmx_gpio_set_direction(struct pinctrl_dev 
*pctldev,
return -EINVAL;
 
/* IBE always enabled allows us to read the value on the wire */
-   reg = readl(ipctl-base + pin_reg-mux_reg);
+   reg = readl(pin_reg-base + pin_reg-mux_reg);
if (input)
reg = ~0x2;
else
reg |= 0x2;
-   writel(reg, ipctl-base + pin_reg-mux_reg);
+   writel(reg, pin_reg-base +