diff mbox

[U-Boot,v3] Add 16-bit single register pin controller support

Message ID 1492567595-3556-1-git-send-email-james@balean.com.au
State Accepted
Commit 46f51dc9c73cbfe5ca69a1b662e594b486bd8616
Delegated to: Tom Rini
Headers show

Commit Message

James Balean April 19, 2017, 2:06 a.m. UTC
Enables the pinctrl-single driver to support 16-bit registers. Only
32-bit registers were supported previously. Reduced width registers are
required for some platforms, such as OMAP.

Signed-off-by: James Balean <james@balean.com.au>
Cc: Felix Brack <fb@ltec.ch>
Cc: Simon Glass <sjg@chromium.org>
---
Changes for v3:
  - Fixes incorrect v2 submission.
  - Inline rather than separate read/write function calls.

 drivers/pinctrl/pinctrl-single.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

Comments

Felix Brack April 20, 2017, 12:36 p.m. UTC | #1
Hello James,

Disregarding one missing space this looks good to me.

On 19.04.2017 04:06, James Balean wrote:
> Enables the pinctrl-single driver to support 16-bit registers. Only
> 32-bit registers were supported previously. Reduced width registers are
> required for some platforms, such as OMAP.
> 
> Signed-off-by: James Balean <james@balean.com.au>
> Cc: Felix Brack <fb@ltec.ch>
> Cc: Simon Glass <sjg@chromium.org>
> ---
> Changes for v3:
>   - Fixes incorrect v2 submission.
>   - Inline rather than separate read/write function calls.
> 
>  drivers/pinctrl/pinctrl-single.c | 16 ++++++++--------
>  1 file changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c
> index d2dcec0..f19f779 100644
> --- a/drivers/pinctrl/pinctrl-single.c
> +++ b/drivers/pinctrl/pinctrl-single.c
> @@ -47,27 +47,27 @@ static int single_configure_pins(struct udevice *dev,
>  	int n, reg;
>  	u32 val;
>  
> -	for (n = 0; n < count; n++) {
> +	for (n = 0; n < count; n++, pins++) {
>  		reg = fdt32_to_cpu(pins->reg);
>  		if ((reg < 0) || (reg > pdata->offset)) {
>  			dev_dbg(dev, "  invalid register offset 0x%08x\n", reg);
> -			pins++;
>  			continue;
>  		}
>  		reg += pdata->base;
> +		val = fdt32_to_cpu(pins->val) & pdata->mask;
>  		switch (pdata->width) {
> +		case 16:
> +			writew((readw(reg) & ~pdata->mask) | val, reg);
> +			break;
>  		case 32:
> -			val = readl(reg) & ~pdata->mask;
> -			val |= fdt32_to_cpu(pins->val) & pdata->mask;
> -			writel(val, reg);
> -			dev_dbg(dev, "  reg/val 0x%08x/0x%08x\n",
> -				reg, val);
> +			writel((readl(reg) & ~pdata->mask) | val, reg);
>  			break;
>  		default:
>  			dev_warn(dev, "unsupported register width %i\n",
>  				 pdata->width);
> +			continue;
>  		}
> -		pins++;
> +		dev_dbg(dev, "  reg/val 0x%08x/0x%08x\n",reg, val);

Missing space just before 'reg'.

>  	}
>  	return 0;
>  }
> 

Reviewed-by: Felix Brack <fb@ltec.ch>

For the 32 bit path and an AM355x based hardware:
Tested-by: Felix Brack <fb@ltec.ch>

regards Felix
Simon Glass April 24, 2017, 3:38 a.m. UTC | #2
On 18 April 2017 at 20:06, James Balean <james@balean.com.au> wrote:
> Enables the pinctrl-single driver to support 16-bit registers. Only
> 32-bit registers were supported previously. Reduced width registers are
> required for some platforms, such as OMAP.
>
> Signed-off-by: James Balean <james@balean.com.au>
> Cc: Felix Brack <fb@ltec.ch>
> Cc: Simon Glass <sjg@chromium.org>
> ---
> Changes for v3:
>   - Fixes incorrect v2 submission.
>   - Inline rather than separate read/write function calls.
>
>  drivers/pinctrl/pinctrl-single.c | 16 ++++++++--------
>  1 file changed, 8 insertions(+), 8 deletions(-)

Reviewed-by: Simon Glass <sjg@chromium.org>
Tom Rini May 12, 2017, 5:19 p.m. UTC | #3
On Tue, Apr 18, 2017 at 09:06:35PM -0500, James Balean wrote:

> Enables the pinctrl-single driver to support 16-bit registers. Only
> 32-bit registers were supported previously. Reduced width registers are
> required for some platforms, such as OMAP.
> 
> Signed-off-by: James Balean <james@balean.com.au>
> Cc: Felix Brack <fb@ltec.ch>
> Cc: Simon Glass <sjg@chromium.org>
> Reviewed-by: Felix Brack <fb@ltec.ch>
> Tested-by: Felix Brack <fb@ltec.ch>
> Reviewed-by: Simon Glass <sjg@chromium.org>

Applied to u-boot/master, thanks!
diff mbox

Patch

diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c
index d2dcec0..f19f779 100644
--- a/drivers/pinctrl/pinctrl-single.c
+++ b/drivers/pinctrl/pinctrl-single.c
@@ -47,27 +47,27 @@  static int single_configure_pins(struct udevice *dev,
 	int n, reg;
 	u32 val;
 
-	for (n = 0; n < count; n++) {
+	for (n = 0; n < count; n++, pins++) {
 		reg = fdt32_to_cpu(pins->reg);
 		if ((reg < 0) || (reg > pdata->offset)) {
 			dev_dbg(dev, "  invalid register offset 0x%08x\n", reg);
-			pins++;
 			continue;
 		}
 		reg += pdata->base;
+		val = fdt32_to_cpu(pins->val) & pdata->mask;
 		switch (pdata->width) {
+		case 16:
+			writew((readw(reg) & ~pdata->mask) | val, reg);
+			break;
 		case 32:
-			val = readl(reg) & ~pdata->mask;
-			val |= fdt32_to_cpu(pins->val) & pdata->mask;
-			writel(val, reg);
-			dev_dbg(dev, "  reg/val 0x%08x/0x%08x\n",
-				reg, val);
+			writel((readl(reg) & ~pdata->mask) | val, reg);
 			break;
 		default:
 			dev_warn(dev, "unsupported register width %i\n",
 				 pdata->width);
+			continue;
 		}
-		pins++;
+		dev_dbg(dev, "  reg/val 0x%08x/0x%08x\n",reg, val);
 	}
 	return 0;
 }