All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH] Add 8 and 16-bit single register pin controller support
@ 2017-03-27  5:55 James Balean
  2017-04-01  4:22 ` Simon Glass
  0 siblings, 1 reply; 9+ messages in thread
From: James Balean @ 2017-03-27  5:55 UTC (permalink / raw)
  To: u-boot

Enables the pinctrl-single driver to support 8 and 16-bit registers.
Only 32-bit registers were supported previously.

Signed-off-by: James Balean <james@balean.com.au>
Cc: Felix Brack <fb@ltec.ch>
Cc: Simon Glass <sjg@chromium.org>
---
 drivers/pinctrl/pinctrl-single.c | 58 ++++++++++++++++++++++++++++++++++------
 1 file changed, 50 insertions(+), 8 deletions(-)

diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c
index d2dcec0..63fec8d 100644
--- a/drivers/pinctrl/pinctrl-single.c
+++ b/drivers/pinctrl/pinctrl-single.c
@@ -24,6 +24,36 @@ struct single_fdt_pin_cfg {
 	fdt32_t val;		/* configuration register value */
 };
 
+static fdt32_t pcs_readb(fdt32_t reg)
+{
+	return readb(reg);
+}
+
+static fdt32_t pcs_readw(fdt32_t reg)
+{
+	return readw(reg);
+}
+
+static fdt32_t pcs_readl(fdt32_t reg)
+{
+	return readl(reg);
+}
+
+static void pcs_writeb(fdt32_t val, fdt32_t reg)
+{
+	writeb(val, reg);
+}
+
+static void pcs_writew(fdt32_t val, fdt32_t reg)
+{
+	writew(val, reg);
+}
+
+static void pcs_writel(fdt32_t val, fdt32_t reg)
+{
+	writel(val, reg);
+}
+
 /**
  * single_configure_pins() - Configure pins based on FDT data
  *
@@ -46,28 +76,40 @@ static int single_configure_pins(struct udevice *dev,
 	int count = size / sizeof(struct single_fdt_pin_cfg);
 	int n, reg;
 	u32 val;
+	fdt32_t (*pcs_read)(fdt32_t reg);
+	void (*pcs_write)(fdt32_t val, fdt32_t reg);
 
-	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 8:
+			pcs_read = pcs_readb;
+			pcs_write = pcs_writeb;
+			break;
+		case 16:
+			pcs_read = pcs_readw;
+			pcs_write = pcs_writew;
+			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);
+			pcs_read = pcs_readl;
+			pcs_write = pcs_writel;
 			break;
 		default:
 			dev_warn(dev, "unsupported register width %i\n",
 				 pdata->width);
+			continue;
 		}
-		pins++;
+
+		val = pcs_read(reg) & ~pdata->mask;
+		val |= fdt32_to_cpu(pins->val) & pdata->mask;
+		pcs_write(val, reg);
+		dev_dbg(dev, "  reg/val 0x%08x/0x%08x\n",
+			reg, val);
 	}
 	return 0;
 }
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2017-04-19  2:05 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-03-27  5:55 [U-Boot] [PATCH] Add 8 and 16-bit single register pin controller support James Balean
2017-04-01  4:22 ` Simon Glass
2017-04-02 10:53   ` Felix Brack
2017-04-06  5:34     ` James Balean
2017-04-06  5:38       ` [U-Boot] [PATCH v2] Add " James Balean
2017-04-07  1:44         ` James Balean
2017-04-07 13:22           ` Felix Brack
2017-04-19  2:05             ` James Balean
2017-04-07 13:16         ` Felix Brack

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.