[U-Boot] [PATCH v2] Add 16-bit single register pin controller support

James Balean james at balean.com.au
Thu Apr 6 05:38:28 UTC 2017


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 at balean.com.au>
Cc: Felix Brack <fb at ltec.ch>
Cc: Simon Glass <sjg at chromium.org>
---
Changes for v2:
  - Added explanation of why this patch is needed.
  - Changed fdt32_t to ulong type.
  - Removed 8-bit support.
  - Now with a single read and write function, instead of one for each
    register width.

 drivers/pinctrl/pinctrl-single.c | 45 ++++++++++++++++++++++++++--------------
 1 file changed, 30 insertions(+), 15 deletions(-)

diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c
index d2dcec0..defb66f 100644
--- a/drivers/pinctrl/pinctrl-single.c
+++ b/drivers/pinctrl/pinctrl-single.c
@@ -24,6 +24,30 @@ struct single_fdt_pin_cfg {
 	fdt32_t val;		/* configuration register value */
 };
 
+static ulong single_read(ulong reg, int width) {
+	switch (size) {
+	case 16:
+		return readw(reg);
+	case 32:
+		return readl(reg);
+	default:
+		dev_warn(dev, "unsupported register width %i\n", width);
+	}
+}
+
+static void single_write(ulong val, ulong reg, int width) {
+	switch (width) {
+	case 16:
+		writew(val, reg);
+		break;
+	case 32:
+		writel(val, reg);
+		break;
+	default:
+		dev_warn(dev, "unsupported register width %i\n", width;
+	}
+}
+
 /**
  * single_configure_pins() - Configure pins based on FDT data
  *
@@ -47,28 +71,19 @@ 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;
-		switch (pdata->width) {
-		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);
-			break;
-		default:
-			dev_warn(dev, "unsupported register width %i\n",
-				 pdata->width);
-		}
-		pins++;
+		val = single_read(reg, pdata->width) & ~pdata->mask;
+		val |= fdt32_to_cpu(pins->val) & pdata->mask;
+		single_write(val, reg, pdata->width);
+		dev_dbg(dev, "  reg/val 0x%08x/0x%08x\n", reg, val);
 	}
+
 	return 0;
 }
 
-- 
2.7.4


More information about the U-Boot mailing list