mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH] pinctrl support
@ 2013-04-23  7:55 Sascha Hauer
  2013-04-23  7:55 ` [PATCH 1/4] Add initial " Sascha Hauer
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Sascha Hauer @ 2013-04-23  7:55 UTC (permalink / raw)
  To: barebox

This adds some initial pinctrl support. I don't want to go the
way of adding full fledged pinctrl support, but still we will
need some instance which parses the devicetree for pinctrl
setup. The following does not parse the pinctrl devicetree
setup into internal data structures, but instead only calls
the pinmux driver with the devicetree node containing the
setup for a device. Turning this into register values is
completely up the pinmux driver then. The device core
will automatically call the pinctrl default setup before
probing a device so that we normally do not have to add
pinctrl code to device drivers.

Sascha

----------------------------------------------------------------
Sascha Hauer (4):
      Add initial pinctrl support
      pinctrl: switch i.MX iomux-v3 support to pinctrl
      pinctrl: move imx-iomux-v2 to drivers/pinctrl/
      pinctrl: move imx-iomux-v1 to drivers/pinctrl/

 arch/arm/mach-imx/Kconfig                          |   9 +
 arch/arm/mach-imx/Makefile                         |  18 +-
 arch/arm/mach-imx/iomux-v3.c                       | 107 -----------
 drivers/Kconfig                                    |   1 +
 drivers/Makefile                                   |   1 +
 drivers/base/driver.c                              |   3 +
 drivers/pinctrl/Kconfig                            |  28 +++
 drivers/pinctrl/Makefile                           |   4 +
 .../iomux-v1.c => drivers/pinctrl/imx-iomux-v1.c   |   0
 .../iomux-v2.c => drivers/pinctrl/imx-iomux-v2.c   |   0
 drivers/pinctrl/imx-iomux-v3.c                     | 212 +++++++++++++++++++++
 drivers/pinctrl/pinctrl.c                          | 149 +++++++++++++++
 include/pinctrl.h                                  |  35 ++++
 13 files changed, 451 insertions(+), 116 deletions(-)
 delete mode 100644 arch/arm/mach-imx/iomux-v3.c
 create mode 100644 drivers/pinctrl/Kconfig
 create mode 100644 drivers/pinctrl/Makefile
 rename arch/arm/mach-imx/iomux-v1.c => drivers/pinctrl/imx-iomux-v1.c (100%)
 rename arch/arm/mach-imx/iomux-v2.c => drivers/pinctrl/imx-iomux-v2.c (100%)
 create mode 100644 drivers/pinctrl/imx-iomux-v3.c
 create mode 100644 drivers/pinctrl/pinctrl.c
 create mode 100644 include/pinctrl.h

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* [PATCH 1/4] Add initial pinctrl support
  2013-04-23  7:55 [PATCH] pinctrl support Sascha Hauer
@ 2013-04-23  7:55 ` Sascha Hauer
  2013-04-23  7:55 ` [PATCH 2/4] pinctrl: switch i.MX iomux-v3 support to pinctrl Sascha Hauer
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Sascha Hauer @ 2013-04-23  7:55 UTC (permalink / raw)
  To: barebox

This is a massively stripped down pinctrl support. The upper API
consists of only of:

int pinctrl_select_state(struct device_d *dev, const char *state);

This is used to setup the pinmux for a device to a certain state.
This function normally does not need to be called manually. The
device core will setup the default state before probing a device.

The pinctrl core has the job of handling the devicetree. It parses
the pinctrl phandles for a device from devicetree, finds the correct
pinctrl device and calls its set_state callback with the pinctrl
setup device node.

The simplicity of this pinctrl framework comes from the fact that
we:

- Limit usage to devicetree only for now. For non devicetree use the
  old legacy SoC specific APIs still can be used.
- Do not parse the devicetree into internal data structures which
  are used by the drivers later. This adds the overhead that we
  may parse the devicetree multiple times for more dynamic setups,
  but on the other hand we do not need to parse devices from the
  devicetree we don't use in barebox
- Do not detect resource conflicts. Since the framework mainly is
  a devicetree parser this would be hard to implement. It should
  be easy for board maintainers to avoid resource conflicts though.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 drivers/Kconfig           |   1 +
 drivers/Makefile          |   1 +
 drivers/base/driver.c     |   3 +
 drivers/pinctrl/Kconfig   |  12 ++++
 drivers/pinctrl/Makefile  |   1 +
 drivers/pinctrl/pinctrl.c | 149 ++++++++++++++++++++++++++++++++++++++++++++++
 include/pinctrl.h         |  35 +++++++++++
 7 files changed, 202 insertions(+)
 create mode 100644 drivers/pinctrl/Kconfig
 create mode 100644 drivers/pinctrl/Makefile
 create mode 100644 drivers/pinctrl/pinctrl.c
 create mode 100644 include/pinctrl.h

diff --git a/drivers/Kconfig b/drivers/Kconfig
index b213849..3a95e51 100644
--- a/drivers/Kconfig
+++ b/drivers/Kconfig
@@ -23,5 +23,6 @@ source "drivers/pwm/Kconfig"
 source "drivers/dma/Kconfig"
 source "drivers/gpio/Kconfig"
 source "drivers/w1/Kconfig"
+source "drivers/pinctrl/Kconfig"
 
 endmenu
diff --git a/drivers/Makefile b/drivers/Makefile
index 03a10fb..daf821c 100644
--- a/drivers/Makefile
+++ b/drivers/Makefile
@@ -22,3 +22,4 @@ obj-y  += watchdog/
 obj-y	+= gpio/
 obj-$(CONFIG_OFTREE) += of/
 obj-$(CONFIG_W1) += w1/
+obj-y += pinctrl/
diff --git a/drivers/base/driver.c b/drivers/base/driver.c
index 487f478..edd49b3 100644
--- a/drivers/base/driver.c
+++ b/drivers/base/driver.c
@@ -31,6 +31,7 @@
 #include <fs.h>
 #include <linux/list.h>
 #include <complete.h>
+#include <pinctrl.h>
 
 LIST_HEAD(device_list);
 EXPORT_SYMBOL(device_list);
@@ -79,6 +80,8 @@ int device_probe(struct device_d *dev)
 {
 	int ret;
 
+	pinctrl_select_state_default(dev);
+
 	ret = dev->bus->probe(dev);
 	if (ret) {
 		dev_err(dev, "probe failed: %s\n", strerror(-ret));
diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig
new file mode 100644
index 0000000..05adf59
--- /dev/null
+++ b/drivers/pinctrl/Kconfig
@@ -0,0 +1,12 @@
+menu "Pin controllers"
+
+config PINCTRL
+	bool "Pin controller core support"
+	depends on OFDEVICE
+	help
+	  Pincontrollers allow to setup the iomux unit of SoCs. The pin
+	  controller core is needed when pin muxing shall be configured
+	  from the devicetree. Legacy drivers here may not need this core
+	  support but instead provide their own SoC specific APIs
+
+endmenu
diff --git a/drivers/pinctrl/Makefile b/drivers/pinctrl/Makefile
new file mode 100644
index 0000000..59f096a
--- /dev/null
+++ b/drivers/pinctrl/Makefile
@@ -0,0 +1 @@
+obj-$(CONFIG_PINCTRL)	+= pinctrl.o
diff --git a/drivers/pinctrl/pinctrl.c b/drivers/pinctrl/pinctrl.c
new file mode 100644
index 0000000..fa979a1
--- /dev/null
+++ b/drivers/pinctrl/pinctrl.c
@@ -0,0 +1,149 @@
+/*
+ * pinctrl.c - barebox pinctrl support
+ *
+ * Copyright (c) 2013 Sascha Hauer <s.hauer@pengutronix.de>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+#include <common.h>
+#include <malloc.h>
+#include <pinctrl.h>
+
+static LIST_HEAD(pinctrl_list);
+
+static struct pinctrl_device *find_pinctrl(struct device_node *node)
+{
+	struct pinctrl_device *pdev;
+
+	list_for_each_entry(pdev, &pinctrl_list, list)
+		if (pdev->node == node)
+			return pdev;
+	return NULL;
+}
+
+static int pinctrl_config_one(struct device_node *np)
+{
+	struct pinctrl_device *pdev;
+	struct device_node *pinctrl_node = np;
+
+	while (1) {
+		pinctrl_node = pinctrl_node->parent;
+		if (!pinctrl_node)
+			return -ENODEV;
+		pdev = find_pinctrl(pinctrl_node);
+		if (pdev)
+			break;
+	}
+
+	return pdev->ops->set_state(pdev, np);
+}
+
+int pinctrl_select_state(struct device_d *dev, const char *name)
+{
+	int state, ret;
+	char *propname;
+	struct property *prop;
+	const __be32 *list;
+	int size, config;
+	phandle phandle;
+	struct device_node *np_config, *np;
+	const char *statename;
+
+	np = dev->device_node;
+	if (!np)
+		return 0;
+
+	if (!of_find_property(np, "pinctrl-0"))
+		return 0;
+
+	/* For each defined state ID */
+	for (state = 0; ; state++) {
+		/* Retrieve the pinctrl-* property */
+		propname = asprintf("pinctrl-%d", state);
+		prop = of_find_property(np, propname);
+		free(propname);
+
+		if (!prop) {
+			ret = -ENODEV;
+			break;
+		}
+
+		size = prop->length;
+
+		list = prop->value;
+		size /= sizeof(*list);
+
+		/* Determine whether pinctrl-names property names the state */
+		ret = of_property_read_string_index(np, "pinctrl-names",
+						    state, &statename);
+		/*
+		 * If not, statename is just the integer state ID. But rather
+		 * than dynamically allocate it and have to free it later,
+		 * just point part way into the property name for the string.
+		 */
+		if (ret < 0) {
+			/* strlen("pinctrl-") == 8 */
+			statename = prop->name + 8;
+		}
+
+		if (strcmp(name, statename))
+			continue;
+
+		/* For every referenced pin configuration node in it */
+		for (config = 0; config < size; config++) {
+			phandle = be32_to_cpup(list++);
+
+			/* Look up the pin configuration node */
+			np_config = of_find_node_by_phandle(phandle);
+			if (!np_config) {
+				pr_err("prop %s %s index %i invalid phandle\n",
+					np->full_name, prop->name, config);
+				ret = -EINVAL;
+				goto err;
+			}
+
+			/* Parse the node */
+			ret = pinctrl_config_one(np_config);
+			if (ret < 0)
+				goto err;
+		}
+
+		return 0;
+	}
+err:
+	return ret;
+}
+
+int pinctrl_select_state_default(struct device_d *dev)
+{
+	return pinctrl_select_state(dev, "default");
+}
+
+int pinctrl_register(struct pinctrl_device *pdev)
+{
+	BUG_ON(!pdev->dev->device_node);
+
+	list_add_tail(&pdev->list, &pinctrl_list);
+
+	pdev->node = pdev->dev->device_node;
+
+	pinctrl_select_state_default(pdev->dev);
+
+	return 0;
+}
+
+void pinctrl_unregister(struct pinctrl_device *pdev)
+{
+	list_del(&pdev->list);
+}
diff --git a/include/pinctrl.h b/include/pinctrl.h
new file mode 100644
index 0000000..7323f8b
--- /dev/null
+++ b/include/pinctrl.h
@@ -0,0 +1,35 @@
+#ifndef PINCTRL_H
+#define PINCTRL_H
+
+struct pinctrl_device;
+
+struct pinctrl_ops {
+	int (*set_state)(struct pinctrl_device *, struct device_node *);
+};
+
+struct pinctrl_device {
+	struct device_d *dev;
+	struct pinctrl_ops *ops;
+	struct list_head list;
+	struct device_node *node;
+};
+
+int pinctrl_register(struct pinctrl_device *pdev);
+void pinctrl_unregister(struct pinctrl_device *pdev);
+
+#ifdef CONFIG_PINCTRL
+int pinctrl_select_state(struct device_d *dev, const char *state);
+int pinctrl_select_state_default(struct device_d *dev);
+#else
+static inline int pinctrl_select_state(struct device_d *dev, const char *state)
+{
+	return -ENODEV;
+}
+
+static inline int pinctrl_select_state_default(struct device_d *dev)
+{
+	return -ENODEV;
+}
+#endif
+
+#endif /* PINCTRL_H */
-- 
1.8.2.rc2


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* [PATCH 2/4] pinctrl: switch i.MX iomux-v3 support to pinctrl
  2013-04-23  7:55 [PATCH] pinctrl support Sascha Hauer
  2013-04-23  7:55 ` [PATCH 1/4] Add initial " Sascha Hauer
@ 2013-04-23  7:55 ` Sascha Hauer
  2013-04-23  7:55 ` [PATCH 3/4] pinctrl: move imx-iomux-v2 to drivers/pinctrl/ Sascha Hauer
  2013-04-23  7:55 ` [PATCH 4/4] pinctrl: move imx-iomux-v1 " Sascha Hauer
  3 siblings, 0 replies; 5+ messages in thread
From: Sascha Hauer @ 2013-04-23  7:55 UTC (permalink / raw)
  To: barebox

This switches the iomux-v3 (found on i.MX25,35,51,53,6) to pinctrl
support. The old SoC specific API is kept for compatibility. The
pinctrl devicetree support is enabled automatically when OFDEVICE
support is available.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 arch/arm/mach-imx/Kconfig      |   5 +
 arch/arm/mach-imx/Makefile     |  10 +-
 arch/arm/mach-imx/iomux-v3.c   | 107 ---------------------
 drivers/pinctrl/Kconfig        |   6 ++
 drivers/pinctrl/Makefile       |   1 +
 drivers/pinctrl/imx-iomux-v3.c | 212 +++++++++++++++++++++++++++++++++++++++++
 6 files changed, 229 insertions(+), 112 deletions(-)
 delete mode 100644 arch/arm/mach-imx/iomux-v3.c
 create mode 100644 drivers/pinctrl/imx-iomux-v3.c

diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
index 8ddec9d..1c3199f 100644
--- a/arch/arm/mach-imx/Kconfig
+++ b/arch/arm/mach-imx/Kconfig
@@ -174,6 +174,7 @@ config ARCH_IMX25
 	bool "i.MX25"
 	select CPU_ARM926T
 	select ARCH_HAS_FEC_IMX
+	select PINCTRL_IMX_IOMUX_V3
 
 config ARCH_IMX27
 	bool "i.MX27"
@@ -188,21 +189,25 @@ config ARCH_IMX35
 	bool "i.MX35"
 	select CPU_V6
 	select ARCH_HAS_FEC_IMX
+	select PINCTRL_IMX_IOMUX_V3
 
 config ARCH_IMX51
 	bool "i.MX51"
 	select CPU_V7
 	select ARCH_HAS_FEC_IMX
+	select PINCTRL_IMX_IOMUX_V3
 
 config ARCH_IMX53
 	bool "i.MX53"
 	select CPU_V7
 	select ARCH_HAS_FEC_IMX
+	select PINCTRL_IMX_IOMUX_V3
 
 config ARCH_IMX6
 	bool "i.MX6"
 	select ARCH_HAS_FEC_IMX
 	select CPU_V7
+	select PINCTRL_IMX_IOMUX_V3
 
 endchoice
 
diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile
index ff8f15b..c98a302 100644
--- a/arch/arm/mach-imx/Makefile
+++ b/arch/arm/mach-imx/Makefile
@@ -1,14 +1,14 @@
 obj-y += clocksource.o gpio.o
 obj-$(CONFIG_ARCH_IMX1)  += imx1.o  iomux-v1.o clk-imx1.o
-obj-$(CONFIG_ARCH_IMX25) += imx25.o iomux-v3.o clk-imx25.o
+obj-$(CONFIG_ARCH_IMX25) += imx25.o clk-imx25.o
 obj-$(CONFIG_ARCH_IMX21) += imx21.o iomux-v1.o clk-imx21.o
 obj-$(CONFIG_ARCH_IMX27) += imx27.o iomux-v1.o clk-imx27.o
 obj-$(CONFIG_ARCH_IMX31) += imx31.o iomux-v2.o clk-imx31.o
-obj-$(CONFIG_ARCH_IMX35) += imx35.o iomux-v3.o clk-imx35.o
-obj-$(CONFIG_ARCH_IMX51) += imx51.o iomux-v3.o imx5.o clk-imx5.o
-obj-$(CONFIG_ARCH_IMX53) += imx53.o iomux-v3.o imx5.o clk-imx5.o esdctl-v4.o
+obj-$(CONFIG_ARCH_IMX35) += imx35.o clk-imx35.o
+obj-$(CONFIG_ARCH_IMX51) += imx51.o imx5.o clk-imx5.o
+obj-$(CONFIG_ARCH_IMX53) += imx53.o imx5.o clk-imx5.o esdctl-v4.o
 pbl-$(CONFIG_ARCH_IMX53) += imx53.o imx5.o esdctl-v4.o
-obj-$(CONFIG_ARCH_IMX6) += imx6.o iomux-v3.o usb-imx6.o clk-imx6.o
+obj-$(CONFIG_ARCH_IMX6) += imx6.o usb-imx6.o clk-imx6.o
 lwl-$(CONFIG_ARCH_IMX6) += imx6-mmdc.o
 obj-$(CONFIG_IMX_IIM)	+= iim.o
 obj-$(CONFIG_NAND_IMX) += nand.o
diff --git a/arch/arm/mach-imx/iomux-v3.c b/arch/arm/mach-imx/iomux-v3.c
deleted file mode 100644
index 8a6064d..0000000
--- a/arch/arm/mach-imx/iomux-v3.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright 2004-2006 Freescale Semiconductor, Inc. All Rights Reserved.
- * Copyright (C) 2008 by Sascha Hauer <kernel@pengutronix.de>
- * Copyright (C) 2009 by Jan Weitzel Phytec Messtechnik GmbH,
- *                       <armlinux@phytec.de>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- */
-#include <common.h>
-#include <init.h>
-#include <io.h>
-#include <mach/iomux-v3.h>
-
-static void __iomem *base;
-
-/*
- * configures a single pad in the iomuxer
- */
-int mxc_iomux_v3_setup_pad(iomux_v3_cfg_t pad)
-{
-	u32 mux_ctrl_ofs = (pad & MUX_CTRL_OFS_MASK) >> MUX_CTRL_OFS_SHIFT;
-	u32 mux_mode = (pad & MUX_MODE_MASK) >> MUX_MODE_SHIFT;
-	u32 sel_input_ofs = (pad & MUX_SEL_INPUT_OFS_MASK) >> MUX_SEL_INPUT_OFS_SHIFT;
-	u32 sel_input = (pad & MUX_SEL_INPUT_MASK) >> MUX_SEL_INPUT_SHIFT;
-	u32 pad_ctrl_ofs = (pad & MUX_PAD_CTRL_OFS_MASK) >> MUX_PAD_CTRL_OFS_SHIFT;
-	u32 pad_ctrl = (pad & MUX_PAD_CTRL_MASK) >> MUX_PAD_CTRL_SHIFT;
-
-	if (!base)
-		return -EINVAL;
-
-	debug("%s: mux 0x%08x -> 0x%04x pad: 0x%08x -> 0x%04x sel_inp: 0x%08x -> 0x%04x\n",
-			__func__, mux_mode, mux_ctrl_ofs, pad_ctrl, pad_ctrl_ofs, sel_input,
-			sel_input_ofs);
-
-	if (mux_ctrl_ofs)
-		__raw_writel(mux_mode, base + mux_ctrl_ofs);
-
-	if (sel_input_ofs)
-		__raw_writel(sel_input, base + sel_input_ofs);
-
-	if (!(pad_ctrl & NO_PAD_CTRL) && pad_ctrl_ofs)
-		__raw_writel(pad_ctrl, base + pad_ctrl_ofs);
-
-	return 0;
-}
-EXPORT_SYMBOL(mxc_iomux_v3_setup_pad);
-
-
-int mxc_iomux_v3_setup_multiple_pads(iomux_v3_cfg_t *pad_list, unsigned count)
-{
-	iomux_v3_cfg_t *p = pad_list;
-	int i;
-	int ret;
-
-	for (i = 0; i < count; i++) {
-		ret = mxc_iomux_v3_setup_pad(*p);
-		if (ret)
-			return ret;
-		p++;
-	}
-	return 0;
-}
-EXPORT_SYMBOL(mxc_iomux_v3_setup_multiple_pads);
-
-static int imx_iomux_probe(struct device_d *dev)
-{
-	base = dev_request_mem_region(dev, 0);
-
-	return 0;
-}
-
-static __maybe_unused struct of_device_id imx_iomux_dt_ids[] = {
-	{
-		.compatible = "fsl,imx35-iomux",
-	}, {
-		/* sentinel */
-	}
-};
-
-static struct platform_device_id imx_iomux_ids[] = {
-	{
-		.name = "imx35-iomux",
-	}, {
-		/* sentinel */
-	},
-};
-
-static struct driver_d imx_iomux_driver = {
-	.name = "imx-iomuxv3",
-	.probe = imx_iomux_probe,
-	.of_compatible = DRV_OF_COMPAT(imx_iomux_dt_ids),
-	.id_table = imx_iomux_ids,
-};
-
-static int imx_iomux_init(void)
-{
-	return platform_driver_register(&imx_iomux_driver);
-}
-postcore_initcall(imx_iomux_init);
diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig
index 05adf59..6ce01bf 100644
--- a/drivers/pinctrl/Kconfig
+++ b/drivers/pinctrl/Kconfig
@@ -9,4 +9,10 @@ config PINCTRL
 	  from the devicetree. Legacy drivers here may not need this core
 	  support but instead provide their own SoC specific APIs
 
+config PINCTRL_IMX_IOMUX_V3
+	select PINCTRL if OFDEVICE
+	bool "i.MX iomux v3"
+	help
+	  This iomux controller is found on i.MX25,35,51,53,6.
+
 endmenu
diff --git a/drivers/pinctrl/Makefile b/drivers/pinctrl/Makefile
index 59f096a..134c889 100644
--- a/drivers/pinctrl/Makefile
+++ b/drivers/pinctrl/Makefile
@@ -1 +1,2 @@
 obj-$(CONFIG_PINCTRL)	+= pinctrl.o
+obj-$(CONFIG_PINCTRL_IMX_IOMUX_V3) += imx-iomux-v3.o
diff --git a/drivers/pinctrl/imx-iomux-v3.c b/drivers/pinctrl/imx-iomux-v3.c
new file mode 100644
index 0000000..3ff3c15
--- /dev/null
+++ b/drivers/pinctrl/imx-iomux-v3.c
@@ -0,0 +1,212 @@
+/*
+ * imx-iomux-v3.c - i.MX iomux-v3 pinctrl support
+ *
+ * Copyright (c) 2013 Sascha Hauer <s.hauer@pengutronix.de>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <common.h>
+#include <init.h>
+#include <io.h>
+#include <pinctrl.h>
+#include <malloc.h>
+#include <mach/iomux-v3.h>
+
+struct imx_iomux_v3 {
+	void __iomem *base;
+	struct pinctrl_device pinctrl;
+};
+
+static void __iomem *iomuxv3_base;
+static struct device_d *iomuxv3_dev;
+
+static void imx_iomuxv3_setup_single(void __iomem *base, struct device_d *dev,
+		u32 mux_reg, u32 conf_reg, u32 input_reg,
+		u32 mux_val, u32 conf_val, u32 input_val)
+{
+	dev_dbg(dev,
+		"mux: 0x%08x -> 0x%04x, conf: 0x%08x -> 0x%04x input: 0x%08x -> 0x%04x\n",
+		mux_val, mux_reg, conf_val, conf_reg, input_val, input_reg);
+
+	if (mux_reg)
+		writel(mux_val, base + mux_reg);
+	if (conf_reg)
+		writel(conf_val, base + conf_reg);
+	if (input_reg)
+		writel(input_val, base + input_reg);
+}
+
+/*
+ * configures a single pad in the iomuxer
+ */
+int mxc_iomux_v3_setup_pad(iomux_v3_cfg_t pad)
+{
+	u32 mux_reg = (pad & MUX_CTRL_OFS_MASK) >> MUX_CTRL_OFS_SHIFT;
+	u32 mux_val = (pad & MUX_MODE_MASK) >> MUX_MODE_SHIFT;
+	u32 input_reg = (pad & MUX_SEL_INPUT_OFS_MASK) >> MUX_SEL_INPUT_OFS_SHIFT;
+	u32 input_val = (pad & MUX_SEL_INPUT_MASK) >> MUX_SEL_INPUT_SHIFT;
+	u32 conf_reg = (pad & MUX_PAD_CTRL_OFS_MASK) >> MUX_PAD_CTRL_OFS_SHIFT;
+	u32 conf_val = (pad & MUX_PAD_CTRL_MASK) >> MUX_PAD_CTRL_SHIFT;
+
+	if (!iomuxv3_base)
+		return -EINVAL;
+
+	if (conf_val & NO_PAD_CTRL)
+		conf_reg = 0;
+
+	imx_iomuxv3_setup_single(iomuxv3_base, iomuxv3_dev,
+			mux_reg, conf_reg, input_reg,
+			mux_val, conf_val, input_val);
+
+	return 0;
+}
+EXPORT_SYMBOL(mxc_iomux_v3_setup_pad);
+
+
+int mxc_iomux_v3_setup_multiple_pads(iomux_v3_cfg_t *pad_list, unsigned count)
+{
+	iomux_v3_cfg_t *p = pad_list;
+	int i;
+	int ret;
+
+	for (i = 0; i < count; i++) {
+		ret = mxc_iomux_v3_setup_pad(*p);
+		if (ret)
+			return ret;
+		p++;
+	}
+	return 0;
+}
+EXPORT_SYMBOL(mxc_iomux_v3_setup_multiple_pads);
+
+/*
+ * Each pin represented in fsl,pins consists of 5 u32 PIN_FUNC_ID and
+ * 1 u32 CONFIG, so 24 types in total for each pin.
+ */
+#define FSL_PIN_SIZE 24
+
+#define IMX_DT_NO_PAD_CTL	(1 << 31)
+#define IMX_PAD_SION		(1 << 30)
+
+#define IOMUXC_CONFIG_SION	(0x1 << 4)
+
+static int imx_iomux_v3_set_state(struct pinctrl_device *pdev, struct device_node *np)
+{
+	struct imx_iomux_v3 *iomux = container_of(pdev, struct imx_iomux_v3, pinctrl);
+	const __be32 *list;
+	int npins, size, i;
+
+	dev_dbg(iomux->pinctrl.dev, "set state: %s\n", np->full_name);
+
+	list = of_get_property(np, "fsl,pins", &size);
+	if (!list)
+		return -EINVAL;
+
+
+	if (!size || size % FSL_PIN_SIZE) {
+		dev_err(iomux->pinctrl.dev, "Invalid fsl,pins property\n");
+		return -EINVAL;
+	}
+
+	npins = size / FSL_PIN_SIZE;
+
+	for (i = 0; i < npins; i++) {
+		u32 mux_reg = be32_to_cpu(*list++);
+		u32 conf_reg = be32_to_cpu(*list++);
+		u32 input_reg = be32_to_cpu(*list++);
+		u32 mux_val = be32_to_cpu(*list++);
+		u32 input_val = be32_to_cpu(*list++);
+		u32 conf_val = be32_to_cpu(*list++);
+
+		if (conf_val & IMX_PAD_SION)
+			mux_val |= IOMUXC_CONFIG_SION;
+
+		if (conf_val & IMX_DT_NO_PAD_CTL)
+			conf_reg = 0;
+
+		imx_iomuxv3_setup_single(iomux->base, iomux->pinctrl.dev,
+				mux_reg, conf_reg, input_reg,
+				mux_val, conf_val, input_val);
+	}
+
+	return 0;
+}
+
+static struct pinctrl_ops imx_iomux_v3_ops = {
+	.set_state = imx_iomux_v3_set_state,
+};
+
+static int imx_pinctrl_dt(struct device_d *dev, void __iomem *base)
+{
+	struct imx_iomux_v3 *iomux;
+	int ret;
+
+	iomux = xzalloc(sizeof(*iomux));
+
+	iomux->base = base;
+
+	iomux->pinctrl.dev = dev;
+	iomux->pinctrl.ops = &imx_iomux_v3_ops;
+
+	ret = pinctrl_register(&iomux->pinctrl);
+	if (ret)
+		free(iomux);
+
+	return ret;
+}
+
+static int imx_iomux_v3_probe(struct device_d *dev)
+{
+	int ret = 0;
+
+	if (iomuxv3_base)
+		return -EBUSY;
+
+	iomuxv3_base = dev_request_mem_region(dev, 0);
+	iomuxv3_dev = dev;
+
+	if (IS_ENABLED(CONFIG_PINCTRL))
+		ret = imx_pinctrl_dt(dev, iomuxv3_base);
+
+	return ret;
+}
+
+static __maybe_unused struct of_device_id imx_iomux_v3_dt_ids[] = {
+	{
+		.compatible = "fsl,imx25-iomuxc",
+	}, {
+		.compatible = "fsl,imx35-iomuxc",
+	}, {
+		.compatible = "fsl,imx51-iomuxc",
+	}, {
+		.compatible = "fsl,imx53-iomuxc",
+	}, {
+		.compatible = "fsl,imx6q-iomuxc",
+	}, {
+		/* sentinel */
+	}
+};
+
+static struct driver_d imx_iomux_v3_driver = {
+	.name		= "imx-iomuxv3",
+	.probe		= imx_iomux_v3_probe,
+	.of_compatible	= DRV_OF_COMPAT(imx_iomux_v3_dt_ids),
+};
+
+static int imx_iomux_v3_init(void)
+{
+	return platform_driver_register(&imx_iomux_v3_driver);
+}
+postcore_initcall(imx_iomux_v3_init);
-- 
1.8.2.rc2


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* [PATCH 3/4] pinctrl: move imx-iomux-v2 to drivers/pinctrl/
  2013-04-23  7:55 [PATCH] pinctrl support Sascha Hauer
  2013-04-23  7:55 ` [PATCH 1/4] Add initial " Sascha Hauer
  2013-04-23  7:55 ` [PATCH 2/4] pinctrl: switch i.MX iomux-v3 support to pinctrl Sascha Hauer
@ 2013-04-23  7:55 ` Sascha Hauer
  2013-04-23  7:55 ` [PATCH 4/4] pinctrl: move imx-iomux-v1 " Sascha Hauer
  3 siblings, 0 replies; 5+ messages in thread
From: Sascha Hauer @ 2013-04-23  7:55 UTC (permalink / raw)
  To: barebox

For consistency reasons.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 arch/arm/mach-imx/Kconfig                                      | 1 +
 arch/arm/mach-imx/Makefile                                     | 2 +-
 drivers/pinctrl/Kconfig                                        | 5 +++++
 drivers/pinctrl/Makefile                                       | 1 +
 arch/arm/mach-imx/iomux-v2.c => drivers/pinctrl/imx-iomux-v2.c | 0
 5 files changed, 8 insertions(+), 1 deletion(-)
 rename arch/arm/mach-imx/iomux-v2.c => drivers/pinctrl/imx-iomux-v2.c (100%)

diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
index 1c3199f..d76732b 100644
--- a/arch/arm/mach-imx/Kconfig
+++ b/arch/arm/mach-imx/Kconfig
@@ -184,6 +184,7 @@ config ARCH_IMX27
 config ARCH_IMX31
 	select CPU_V6
 	bool "i.MX31"
+	select PINCTRL_IMX_IOMUX_V2
 
 config ARCH_IMX35
 	bool "i.MX35"
diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile
index c98a302..0b156aa 100644
--- a/arch/arm/mach-imx/Makefile
+++ b/arch/arm/mach-imx/Makefile
@@ -3,7 +3,7 @@ obj-$(CONFIG_ARCH_IMX1)  += imx1.o  iomux-v1.o clk-imx1.o
 obj-$(CONFIG_ARCH_IMX25) += imx25.o clk-imx25.o
 obj-$(CONFIG_ARCH_IMX21) += imx21.o iomux-v1.o clk-imx21.o
 obj-$(CONFIG_ARCH_IMX27) += imx27.o iomux-v1.o clk-imx27.o
-obj-$(CONFIG_ARCH_IMX31) += imx31.o iomux-v2.o clk-imx31.o
+obj-$(CONFIG_ARCH_IMX31) += imx31.o clk-imx31.o
 obj-$(CONFIG_ARCH_IMX35) += imx35.o clk-imx35.o
 obj-$(CONFIG_ARCH_IMX51) += imx51.o imx5.o clk-imx5.o
 obj-$(CONFIG_ARCH_IMX53) += imx53.o imx5.o clk-imx5.o esdctl-v4.o
diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig
index 6ce01bf..6b73d7b 100644
--- a/drivers/pinctrl/Kconfig
+++ b/drivers/pinctrl/Kconfig
@@ -9,6 +9,11 @@ config PINCTRL
 	  from the devicetree. Legacy drivers here may not need this core
 	  support but instead provide their own SoC specific APIs
 
+config PINCTRL_IMX_IOMUX_V2
+	bool "i.MX iomux v2"
+	help
+	  This iomux controller is found on i.MX31.
+
 config PINCTRL_IMX_IOMUX_V3
 	select PINCTRL if OFDEVICE
 	bool "i.MX iomux v3"
diff --git a/drivers/pinctrl/Makefile b/drivers/pinctrl/Makefile
index 134c889..b03a20f 100644
--- a/drivers/pinctrl/Makefile
+++ b/drivers/pinctrl/Makefile
@@ -1,2 +1,3 @@
 obj-$(CONFIG_PINCTRL)	+= pinctrl.o
+obj-$(CONFIG_PINCTRL_IMX_IOMUX_V2) += imx-iomux-v2.o
 obj-$(CONFIG_PINCTRL_IMX_IOMUX_V3) += imx-iomux-v3.o
diff --git a/arch/arm/mach-imx/iomux-v2.c b/drivers/pinctrl/imx-iomux-v2.c
similarity index 100%
rename from arch/arm/mach-imx/iomux-v2.c
rename to drivers/pinctrl/imx-iomux-v2.c
-- 
1.8.2.rc2


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* [PATCH 4/4] pinctrl: move imx-iomux-v1 to drivers/pinctrl/
  2013-04-23  7:55 [PATCH] pinctrl support Sascha Hauer
                   ` (2 preceding siblings ...)
  2013-04-23  7:55 ` [PATCH 3/4] pinctrl: move imx-iomux-v2 to drivers/pinctrl/ Sascha Hauer
@ 2013-04-23  7:55 ` Sascha Hauer
  3 siblings, 0 replies; 5+ messages in thread
From: Sascha Hauer @ 2013-04-23  7:55 UTC (permalink / raw)
  To: barebox

For consistency reasons.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 arch/arm/mach-imx/Kconfig                                      | 3 +++
 arch/arm/mach-imx/Makefile                                     | 6 +++---
 drivers/pinctrl/Kconfig                                        | 5 +++++
 drivers/pinctrl/Makefile                                       | 1 +
 arch/arm/mach-imx/iomux-v1.c => drivers/pinctrl/imx-iomux-v1.c | 0
 5 files changed, 12 insertions(+), 3 deletions(-)
 rename arch/arm/mach-imx/iomux-v1.c => drivers/pinctrl/imx-iomux-v1.c (100%)

diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
index d76732b..977fea5 100644
--- a/arch/arm/mach-imx/Kconfig
+++ b/arch/arm/mach-imx/Kconfig
@@ -165,10 +165,12 @@ choice
 config ARCH_IMX1
 	bool "i.MX1"
 	select CPU_ARM920T
+	select PINCTRL_IMX_IOMUX_V1
 
 config ARCH_IMX21
 	bool "i.MX21"
 	select CPU_ARM926T
+	select PINCTRL_IMX_IOMUX_V1
 
 config ARCH_IMX25
 	bool "i.MX25"
@@ -180,6 +182,7 @@ config ARCH_IMX27
 	bool "i.MX27"
 	select CPU_ARM926T
 	select ARCH_HAS_FEC_IMX
+	select PINCTRL_IMX_IOMUX_V1
 
 config ARCH_IMX31
 	select CPU_V6
diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile
index 0b156aa..339b6a1 100644
--- a/arch/arm/mach-imx/Makefile
+++ b/arch/arm/mach-imx/Makefile
@@ -1,8 +1,8 @@
 obj-y += clocksource.o gpio.o
-obj-$(CONFIG_ARCH_IMX1)  += imx1.o  iomux-v1.o clk-imx1.o
+obj-$(CONFIG_ARCH_IMX1)  += imx1.o  clk-imx1.o
 obj-$(CONFIG_ARCH_IMX25) += imx25.o clk-imx25.o
-obj-$(CONFIG_ARCH_IMX21) += imx21.o iomux-v1.o clk-imx21.o
-obj-$(CONFIG_ARCH_IMX27) += imx27.o iomux-v1.o clk-imx27.o
+obj-$(CONFIG_ARCH_IMX21) += imx21.o clk-imx21.o
+obj-$(CONFIG_ARCH_IMX27) += imx27.o clk-imx27.o
 obj-$(CONFIG_ARCH_IMX31) += imx31.o clk-imx31.o
 obj-$(CONFIG_ARCH_IMX35) += imx35.o clk-imx35.o
 obj-$(CONFIG_ARCH_IMX51) += imx51.o imx5.o clk-imx5.o
diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig
index 6b73d7b..e6aee50 100644
--- a/drivers/pinctrl/Kconfig
+++ b/drivers/pinctrl/Kconfig
@@ -9,6 +9,11 @@ config PINCTRL
 	  from the devicetree. Legacy drivers here may not need this core
 	  support but instead provide their own SoC specific APIs
 
+config PINCTRL_IMX_IOMUX_V1
+	bool "i.MX iomux v1"
+	help
+	  This iomux controller is found on i.MX1,21,27.
+
 config PINCTRL_IMX_IOMUX_V2
 	bool "i.MX iomux v2"
 	help
diff --git a/drivers/pinctrl/Makefile b/drivers/pinctrl/Makefile
index b03a20f..e9272d0 100644
--- a/drivers/pinctrl/Makefile
+++ b/drivers/pinctrl/Makefile
@@ -1,3 +1,4 @@
 obj-$(CONFIG_PINCTRL)	+= pinctrl.o
+obj-$(CONFIG_PINCTRL_IMX_IOMUX_V1) += imx-iomux-v1.o
 obj-$(CONFIG_PINCTRL_IMX_IOMUX_V2) += imx-iomux-v2.o
 obj-$(CONFIG_PINCTRL_IMX_IOMUX_V3) += imx-iomux-v3.o
diff --git a/arch/arm/mach-imx/iomux-v1.c b/drivers/pinctrl/imx-iomux-v1.c
similarity index 100%
rename from arch/arm/mach-imx/iomux-v1.c
rename to drivers/pinctrl/imx-iomux-v1.c
-- 
1.8.2.rc2


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

end of thread, other threads:[~2013-04-23  7:55 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-04-23  7:55 [PATCH] pinctrl support Sascha Hauer
2013-04-23  7:55 ` [PATCH 1/4] Add initial " Sascha Hauer
2013-04-23  7:55 ` [PATCH 2/4] pinctrl: switch i.MX iomux-v3 support to pinctrl Sascha Hauer
2013-04-23  7:55 ` [PATCH 3/4] pinctrl: move imx-iomux-v2 to drivers/pinctrl/ Sascha Hauer
2013-04-23  7:55 ` [PATCH 4/4] pinctrl: move imx-iomux-v1 " Sascha Hauer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox