* [PATCH v4 1/4] dt: add of_get_child_count helper function
@ 2012-04-26 14:40 Dong Aisheng
2012-04-26 14:40 ` [PATCH v3 2/4] pinctrl: pinctrl-imx: add imx pinctrl core driver Dong Aisheng
` (3 more replies)
0 siblings, 4 replies; 34+ messages in thread
From: Dong Aisheng @ 2012-04-26 14:40 UTC (permalink / raw)
To: linux-arm-kernel
From: Dong Aisheng <dong.aisheng@linaro.org>
Currently most code to get child count in kernel are almost same,
add a helper to implement this function for dt to use.
Cc: Grant Likely <grant.likely@secretlab.ca>
Acked-by: Rob Herring <rob.herring@calxeda.com>
Signed-off-by: Dong Aisheng <dong.aisheng@linaro.org>
---
Rob missed this patch for 3.4 kernel.
Based on Rob's suggestion, we can get it go in with pinctrl driver.
Since Rob once had applied it, i added Rob's ack.
See:
https://lkml.org/lkml/2012/4/14/239
changes v3->v4:
* addressed Grant's suggestion to use for_each_child_of_node.
changes v2->v3:
Addressed some people's comments:
* do not use assignment as expression
* return 0 for non-dt case
Changes v1->v2:
* change the name from of_get_child_number to of_get_child_count
---
include/linux/of.h | 16 ++++++++++++++++
1 files changed, 16 insertions(+), 0 deletions(-)
diff --git a/include/linux/of.h b/include/linux/of.h
index e3f942d..1c14976 100644
--- a/include/linux/of.h
+++ b/include/linux/of.h
@@ -193,6 +193,17 @@ extern struct device_node *of_get_next_child(const struct device_node *node,
for (child = of_get_next_child(parent, NULL); child != NULL; \
child = of_get_next_child(parent, child))
+static inline int of_get_child_count(const struct device_node *np)
+{
+ struct device_node *child = NULL;
+ int num = 0;
+
+ for_each_child_of_node(np, child)
+ num++;
+
+ return num;
+}
+
extern struct device_node *of_find_node_with_property(
struct device_node *from, const char *prop_name);
#define for_each_node_with_property(dn, prop_name) \
@@ -300,6 +311,11 @@ static inline bool of_have_populated_dt(void)
#define for_each_child_of_node(parent, child) \
while (0)
+static inline int of_get_child_count(const struct device_node *np)
+{
+ return 0;
+}
+
static inline int of_device_is_compatible(const struct device_node *device,
const char *name)
{
--
1.7.0.4
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [PATCH v3 2/4] pinctrl: pinctrl-imx: add imx pinctrl core driver
2012-04-26 14:40 [PATCH v4 1/4] dt: add of_get_child_count helper function Dong Aisheng
@ 2012-04-26 14:40 ` Dong Aisheng
2012-04-26 14:44 ` Jean-Christophe PLAGNIOL-VILLARD
` (3 more replies)
2012-04-26 14:40 ` [PATCH v3 4/4] mmc: sdhci-imx-esdhc: convert to use pinctrl subsystem Dong Aisheng
` (2 subsequent siblings)
3 siblings, 4 replies; 34+ messages in thread
From: Dong Aisheng @ 2012-04-26 14:40 UTC (permalink / raw)
To: linux-arm-kernel
From: Dong Aisheng <dong.aisheng@linaro.org>
The driver has mux and config support while the gpio is still
not supported.
For select input setting, the driver will handle it internally
and do not need user to take care of it.
The pinctrl-imx core driver will parse the dts file and dynamically
create the pinmux functions and groups.
Each IMX SoC pinctrl driver should register pins with a pin register map
including mux register and config register and select input map to core
for proper operations.
Signed-off-by: Dong Aisheng <dong.aisheng@linaro.org>
---
ChangeLog: v2->v3:
* add missed SION bit set from device tree
Thanks for Richard Zhao's reminder.
ChangeLog: v1->v2:
* Change the binding a bit.
For fsl,pins property, change it from pin name strings to pin function id
which represents a pin working on a specific function. Then we can remove
fsl,mux property since the pin function id already contains the mux setting.
Also remove other pin config property in the first patch.
Because in the future, we will switch to use dtc macro, then using a lot of
propertys to represent the each pin config like pull, speed and etc seems
needless.
Then each pin entry in dts file becomes a pair of PIN_FUNC_ID and CONFIG:
fsl,pins = <PIN_FUNC_ID CONFIG ..>
See binding doc for details.
* Sascha raised a question that pins in the same group may have different
pad setting for example I2C_CLK needs pull up while I2C_DAT not.
The v1 driver can aslo handle this issue but needs split the different
pad setting pins into different groups which loses a bit flexibility.
Also suggested by Richard Zhao and Jason Liu, we may still want the iomux
v3 simililar using way that allows each pin has the abiblity to configure
its pad which seems reasonable because from HW point of view, FSL IMX are
indeed pin based SoC which should be able to set per pin.
So the main changes in this v2 patch are change to support per pin config.
Then the using of iomux is almost the same as the existing iomux v3 for
non dt imx platforms. See binding doc for example.
After introduce the new way, there're mainly two known issues:
1) Since many pins in the same group may have the same pad config setting,
thus there may be some data redundance, however, since it's one word
and it's purely describe hw i would think it's not a big issue.
2) Need a magic number to indicate no pad config need. In current iomux v3,
It's 1<<16 which is not used by IMX5, i used 1<<31 for both MX5 and MX6.
However, it's definitely possibile that in the future, the bit 31 may also
be used, that means we may need change the binding doc or just handle it in
driver for different SoCs.
3) Due to core limitation, the current pinconf_group_set/get only support
get/set the same config(a u32 value)for all the pins in the same group,
so i removed the imx_group_set/get functions support, instead, using
imx_pin_get/set.
About this limitation, we may need some futher discussion on if we may
need to enhance it to be more flexible to support configure different
pins in the same group.
* Refactor probe handling based on Stephen's suggestion.
* Enhanced the binding doc and split it into two part, pinctrl-imx common part
and pinctrl-soc driver part.
* Change functions name from imx_pmx_* to imx_pinctrl_*.
* Other fixes based on Sascha, Stephen, Linus, Shawn's comments.
---
.../bindings/pinctrl/fsl,imx-pinctrl.txt | 93 +++
drivers/pinctrl/Kconfig | 5 +
drivers/pinctrl/Makefile | 1 +
drivers/pinctrl/pinctrl-imx.c | 627 ++++++++++++++++++++
drivers/pinctrl/pinctrl-imx.h | 106 ++++
5 files changed, 832 insertions(+), 0 deletions(-)
create mode 100644 Documentation/devicetree/bindings/pinctrl/fsl,imx-pinctrl.txt
create mode 100644 drivers/pinctrl/pinctrl-imx.c
create mode 100644 drivers/pinctrl/pinctrl-imx.h
diff --git a/Documentation/devicetree/bindings/pinctrl/fsl,imx-pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/fsl,imx-pinctrl.txt
new file mode 100644
index 0000000..e00c7fc
--- /dev/null
+++ b/Documentation/devicetree/bindings/pinctrl/fsl,imx-pinctrl.txt
@@ -0,0 +1,93 @@
+* Freescale IOMUX Controller (IOMUXC) for i.MX
+
+The IOMUX Controller (IOMUXC), together with the IOMUX, enables the IC
+to share one PAD to several functional blocks. The sharing is done by
+multiplexing the PAD input/output signals. For each PAD there are up to
+8 muxing options (called ALT modes). Since different modules require
+different PAD settings (like pull up, keeper, etc) the IOMUXC controls
+also the PAD settings parameters.
+
+Please refer to pinctrl-bindings.txt in this directory for details of the
+common pinctrl bindings used by client devices, including the meaning of the
+phrase "pin configuration node".
+
+Freescale IMX pin configuration node is a node of a group of pins which can be
+used for a specific device or function. This node represents both mux and config
+of the pins in that group. The 'mux' selects the function mode(also named mux
+mode) this pin can work on and the 'config' configures various pad settings
+such as pull-up, open drain, drive strength, etc.
+
+Required properties for iomux controller:
+- compatible: "fsl,<soc>-iomuxc"
+ Please refer to each fsl,<soc>-pinctrl.txt binding doc for supported SoCs.
+
+Required properties for pin configuration node:
+- fsl,pins: two integers array, represents a group of pins mux and config
+ setting. The format is fsl,pins = <PIN_FUNC_ID CONFIG>, PIN_FUNC_ID is a
+ pin working on a specific function, CONFIG is the pad setting value like
+ pull-up on this pin. Please refer to fsl,<soc>-pinctrl.txt for the valid
+ pins and functions of each SoC.
+
+Bits used for CONFIG:
+NO_PAD_CTL(1 << 31): indicate this pin does not need config.
+
+SION(1 << 30): Software Input On Field.
+Force the selected mux mode input path no matter of MUX_MODE functionality.
+By default the input path is determined by functionality of the selected
+mux mode (regular).
+
+Other bits are used for PAD setting.
+
+NOTE:
+Some requirements for using fsl,imx-pinctrl binding:
+1. We have pin function node defined under iomux controller node to represent
+ what pinmux functions this SoC supports.
+2. The pin configuration node intends to work on a specific function should
+ to be defined under that specific function node.
+ The function node's name should represent well about what function
+ this group of pins in this pin configuration node are working on.
+3. The driver can use the function node's name and pin configuration node's
+ name describe the pin function and group hierarchy.
+ For example, Linux IMX pinctrl driver takes the function node's name
+ as the function name and pin configuration node's name as group name to
+ create the map table.
+4. Each pin configuration node should have a phandle, devices can set pins
+ configurations by referring to the phandle of that pin configuration node.
+
+Examples:
+usdhc@0219c000 { /* uSDHC4 */
+ fsl,card-wired;
+ vmmc-supply = <®_3p3v>;
+ status = "okay";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_usdhc4_1>;
+};
+
+iomuxc at 020e0000 {
+ compatible = "fsl,imx6q-iomuxc";
+ reg = <0x020e0000 0x4000>;
+
+ /* shared pinctrl settings */
+ usdhc4 {
+ pinctrl_usdhc4_1: usdhc4grp-1 {
+ fsl,pins = <1386 0x17059 /* MX6Q_PAD_SD4_CMD__USDHC4_CMD */
+ 1392 0x17059 /* MX6Q_PAD_SD4_CLK__USDHC4_CLK */
+ 1462 0x17059 /* MX6Q_PAD_SD4_DAT0__USDHC4_DAT0 */
+ 1470 0x17059 /* MX6Q_PAD_SD4_DAT1__USDHC4_DAT1 */
+ 1478 0x17059 /* MX6Q_PAD_SD4_DAT2__USDHC4_DAT2 */
+ 1486 0x17059 /* MX6Q_PAD_SD4_DAT3__USDHC4_DAT3 */
+ 1493 0x17059 /* MX6Q_PAD_SD4_DAT4__USDHC4_DAT4 */
+ 1501 0x17059 /* MX6Q_PAD_SD4_DAT5__USDHC4_DAT5 */
+ 1509 0x17059 /* MX6Q_PAD_SD4_DAT6__USDHC4_DAT6 */
+ 1517 0x17059>; /* MX6Q_PAD_SD4_DAT7__USDHC4_DAT7 */
+ };
+ };
+ ....
+};
+Refer to the IOMUXC controller chapter in imx6q datasheet,
+0x17059 means enable hysteresis, 47KOhm Pull Up, 50Mhz speed,
+80Ohm driver strength and Fast Slew Rate.
+User should refer to each SoC spec to set the correct value.
+
+TODO: when dtc macro support is available, we can change above raw data
+to dt macro which can get better readability in dts file.
diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig
index f73a5ea..aad2882 100644
--- a/drivers/pinctrl/Kconfig
+++ b/drivers/pinctrl/Kconfig
@@ -26,6 +26,11 @@ config DEBUG_PINCTRL
help
Say Y here to add some extra checks and diagnostics to PINCTRL calls.
+config PINCTRL_IMX
+ bool
+ select PINMUX
+ select PINCONF
+
config PINCTRL_PXA3xx
bool
select PINMUX
diff --git a/drivers/pinctrl/Makefile b/drivers/pinctrl/Makefile
index 8e3c95a..a01a97c 100644
--- a/drivers/pinctrl/Makefile
+++ b/drivers/pinctrl/Makefile
@@ -9,6 +9,7 @@ ifeq ($(CONFIG_OF),y)
obj-$(CONFIG_PINCTRL) += devicetree.o
endif
obj-$(CONFIG_GENERIC_PINCONF) += pinconf-generic.o
+obj-$(CONFIG_PINCTRL_IMX) += pinctrl-imx.o
obj-$(CONFIG_PINCTRL_PXA3xx) += pinctrl-pxa3xx.o
obj-$(CONFIG_PINCTRL_MMP2) += pinctrl-mmp2.o
obj-$(CONFIG_PINCTRL_PXA168) += pinctrl-pxa168.o
diff --git a/drivers/pinctrl/pinctrl-imx.c b/drivers/pinctrl/pinctrl-imx.c
new file mode 100644
index 0000000..8faf613
--- /dev/null
+++ b/drivers/pinctrl/pinctrl-imx.c
@@ -0,0 +1,627 @@
+/*
+ * Core driver for the imx pin controller
+ *
+ * Copyright (C) 2012 Freescale Semiconductor, Inc.
+ * Copyright (C) 2012 Linaro Ltd.
+ *
+ * Author: Dong Aisheng <dong.aisheng@linaro.org>
+ *
+ * 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.
+ */
+
+#include <linux/err.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/pinctrl/machine.h>
+#include <linux/pinctrl/pinconf.h>
+#include <linux/pinctrl/pinctrl.h>
+#include <linux/pinctrl/pinmux.h>
+#include <linux/slab.h>
+
+#include "core.h"
+#include "pinctrl-imx.h"
+
+#define IMX_PMX_DUMP(info, p, m, c, n) \
+{ \
+ int i, j; \
+ printk("Format: Pin Mux Config\n"); \
+ for (i = 0; i < n; i++) { \
+ j = p[i]; \
+ printk("%s %d 0x%lx\n", \
+ info->pins[j].name, \
+ m[i], c[i]); \
+ } \
+}
+
+/* The bits in CONFIG cell defined in binding doc*/
+#define IMX_NO_PAD_CTL 0x80000000 /* no pin config need */
+#define IMX_PAD_SION 0x40000000 /* set SION */
+
+/**
+ * @dev: a pointer back to containing device
+ * @base: the offset to the controller in virtual memory
+ */
+struct imx_pinctrl {
+ struct device *dev;
+ struct pinctrl_dev *pctl;
+ void __iomem *base;
+ const struct imx_pinctrl_soc_info *info;
+};
+
+static const struct imx_pin_reg *imx_find_pin_reg(
+ const struct imx_pinctrl_soc_info *info,
+ unsigned pin, bool is_mux, unsigned mux)
+{
+ const struct imx_pin_reg *pin_reg = NULL;
+ int i;
+
+ for (i = 0; i < info->npin_regs; i++) {
+ pin_reg = &info->pin_regs[i];
+ if (pin_reg->pid != pin)
+ continue;
+ if (!is_mux)
+ break;
+ else if (pin_reg->mux_mode == (mux & IMX_MUX_MASK))
+ break;
+ }
+
+ if (!pin_reg) {
+ dev_err(info->dev, "Pin(%s): unable to find pin reg map\n",
+ info->pins[pin].name);
+ return NULL;
+ }
+
+ return pin_reg;
+}
+
+static const inline struct imx_pin_group *imx_pinctrl_find_group_by_name(
+ const struct imx_pinctrl_soc_info *info,
+ const char *name)
+{
+ const struct imx_pin_group *grp = NULL;
+ int i;
+
+ for (i = 0; i < info->ngroups; i++) {
+ if (!strcmp(info->groups[i].name, name)) {
+ grp = &info->groups[i];
+ break;
+ }
+ }
+
+ return grp;
+}
+
+static int imx_get_groups_count(struct pinctrl_dev *pctldev)
+{
+ struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
+ const struct imx_pinctrl_soc_info *info = ipctl->info;
+
+ return info->ngroups;
+}
+
+static const char *imx_get_group_name(struct pinctrl_dev *pctldev,
+ unsigned selector)
+{
+ struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
+ const struct imx_pinctrl_soc_info *info = ipctl->info;
+
+ return info->groups[selector].name;
+}
+
+static int imx_get_group_pins(struct pinctrl_dev *pctldev, unsigned selector,
+ const unsigned **pins,
+ unsigned *npins)
+{
+ struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
+ const struct imx_pinctrl_soc_info *info = ipctl->info;
+
+ if (selector >= info->ngroups)
+ return -EINVAL;
+
+ *pins = info->groups[selector].pins;
+ *npins = info->groups[selector].npins;
+
+ return 0;
+}
+
+static void imx_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s,
+ unsigned offset)
+{
+ seq_printf(s, "%s", dev_name(pctldev->dev));
+}
+
+static int imx_dt_node_to_map(struct pinctrl_dev *pctldev,
+ struct device_node *np,
+ struct pinctrl_map **map, unsigned *num_maps)
+{
+ struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
+ const struct imx_pinctrl_soc_info *info = ipctl->info;
+ const struct imx_pin_group *grp;
+ struct pinctrl_map *new_map;
+ struct device_node *parent;
+ int map_num = 1;
+ int i;
+
+ /*
+ * first find the group of this node and check if we need create
+ * config maps for pins
+ */
+ grp = imx_pinctrl_find_group_by_name(info, np->name);
+ if (!grp) {
+ dev_err(info->dev, "unable to find group for node %s\n",
+ np->name);
+ return -EINVAL;
+ }
+
+ for (i = 0; i < grp->npins; i++) {
+ if (!(grp->configs[i] & IMX_NO_PAD_CTL))
+ map_num++;
+ }
+
+ new_map = kmalloc(sizeof(struct pinctrl_map) * map_num, GFP_KERNEL);
+ if (!new_map)
+ return -ENOMEM;
+
+ *map = new_map;
+ *num_maps = map_num;
+
+ /* create mux map */
+ parent = of_get_parent(np);
+ if (!parent)
+ return -EINVAL;
+ new_map[0].type = PIN_MAP_TYPE_MUX_GROUP;
+ new_map[0].data.mux.function = parent->name;
+ new_map[0].data.mux.group = np->name;
+ of_node_put(parent);
+
+ /* create config map */
+ new_map++;
+ for (i = 0; i < grp->npins; i++) {
+ if (!(grp->configs[i] & IMX_NO_PAD_CTL)) {
+ new_map[i].type = PIN_MAP_TYPE_CONFIGS_PIN;
+ new_map[i].data.configs.group_or_pin =
+ pin_get_name(pctldev, grp->pins[i]);
+ new_map[i].data.configs.configs = &grp->configs[i];
+ new_map[i].data.configs.num_configs = 1;
+ }
+ }
+
+ dev_dbg(pctldev->dev, "maps: function %s group %s num %d\n",
+ new_map->data.mux.function, new_map->data.mux.group, map_num);
+
+ return 0;
+}
+
+static void imx_dt_free_map(struct pinctrl_dev *pctldev,
+ struct pinctrl_map *map, unsigned num_maps)
+{
+ int i;
+
+ for (i = 0; i < num_maps; i++)
+ kfree(map);
+}
+
+static struct pinctrl_ops imx_pctrl_ops = {
+ .get_groups_count = imx_get_groups_count,
+ .get_group_name = imx_get_group_name,
+ .get_group_pins = imx_get_group_pins,
+ .pin_dbg_show = imx_pin_dbg_show,
+ .dt_node_to_map = imx_dt_node_to_map,
+ .dt_free_map = imx_dt_free_map,
+
+};
+
+static int imx_pmx_enable(struct pinctrl_dev *pctldev, unsigned selector,
+ unsigned group)
+{
+ struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
+ const struct imx_pinctrl_soc_info *info = ipctl->info;
+ const struct imx_pin_reg *pin_reg;
+ const unsigned *pins, *mux;
+ unsigned int npins, pin_id;
+ int i;
+
+ /*
+ * Configure the mux mode for each pin in the group for a specific
+ * function.
+ */
+ pins = info->groups[group].pins;
+ npins = info->groups[group].npins;
+ mux = info->groups[group].mux_mode;
+
+ WARN_ON(!pins || !npins || !mux);
+
+ dev_dbg(ipctl->dev, "enable function %s group %s\n",
+ info->functions[selector].name, info->groups[group].name);
+
+ for (i = 0; i < npins; i++) {
+ pin_id = pins[i];
+
+ pin_reg = imx_find_pin_reg(info, pin_id, 1, mux[i]);
+ if (!pin_reg)
+ return -EINVAL;
+
+ if (!pin_reg->mux_reg) {
+ dev_err(ipctl->dev, "Pin(%s) does not support mux function\n",
+ info->pins[pin_id].name);
+ return -EINVAL;
+ }
+
+ writel(mux[i], ipctl->base + pin_reg->mux_reg);
+ dev_dbg(ipctl->dev, "write: offset 0x%x val 0x%x\n",
+ pin_reg->mux_reg, mux[i]);
+
+ /* some pins also need select input setting, set it if found */
+ if (pin_reg->input_reg) {
+ writel(pin_reg->input_val, ipctl->base + pin_reg->input_reg);
+ dev_dbg(ipctl->dev,
+ "==>select_input: offset 0x%x val 0x%x\n",
+ pin_reg->input_reg, pin_reg->input_val);
+ }
+ }
+
+ return 0;
+}
+
+static void imx_pmx_disable(struct pinctrl_dev *pctldev, unsigned func_selector,
+ unsigned group_selector)
+{
+ /* nothing to do here */
+}
+
+static int imx_pmx_get_funcs_count(struct pinctrl_dev *pctldev)
+{
+ struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
+ const struct imx_pinctrl_soc_info *info = ipctl->info;
+
+ return info->nfunctions;
+}
+
+static const char *imx_pmx_get_func_name(struct pinctrl_dev *pctldev,
+ unsigned selector)
+{
+ struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
+ const struct imx_pinctrl_soc_info *info = ipctl->info;
+
+ return info->functions[selector].name;
+}
+
+static int imx_pmx_get_groups(struct pinctrl_dev *pctldev, unsigned selector,
+ const char * const **groups,
+ unsigned * const num_groups)
+{
+ struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
+ const struct imx_pinctrl_soc_info *info = ipctl->info;
+
+ *groups = info->functions[selector].groups;
+ *num_groups = info->functions[selector].num_groups;
+
+ return 0;
+}
+
+static struct pinmux_ops imx_pmx_ops = {
+ .get_functions_count = imx_pmx_get_funcs_count,
+ .get_function_name = imx_pmx_get_func_name,
+ .get_function_groups = imx_pmx_get_groups,
+ .enable = imx_pmx_enable,
+ .disable = imx_pmx_disable,
+};
+
+static int imx_pinconf_get(struct pinctrl_dev *pctldev,
+ unsigned pin_id, unsigned long *config)
+{
+ struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
+ const struct imx_pinctrl_soc_info *info = ipctl->info;
+ const struct imx_pin_reg *pin_reg;
+
+ pin_reg = imx_find_pin_reg(info, pin_id, 0, 0);
+ if (!pin_reg)
+ return -EINVAL;
+
+ if (!pin_reg->conf_reg) {
+ dev_err(info->dev, "Pin(%s) does not support config function\n",
+ info->pins[pin_id].name);
+ return -EINVAL;
+ }
+
+ *config = readl(ipctl->base + pin_reg->conf_reg);
+
+ return 0;
+}
+
+static int imx_pinconf_set(struct pinctrl_dev *pctldev,
+ unsigned pin_id, unsigned long config)
+{
+ struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
+ const struct imx_pinctrl_soc_info *info = ipctl->info;
+ const struct imx_pin_reg *pin_reg;
+
+ pin_reg = imx_find_pin_reg(info, pin_id, 0, 0);
+ if (!pin_reg)
+ return -EINVAL;
+
+ if (!pin_reg->conf_reg) {
+ dev_err(info->dev, "Pin(%s) does not support config function\n",
+ info->pins[pin_id].name);
+ return -EINVAL;
+ }
+
+ dev_dbg(ipctl->dev, "pinconf set pin %s\n",
+ info->pins[pin_id].name);
+
+ writel(config, ipctl->base + pin_reg->conf_reg);
+ dev_dbg(ipctl->dev, "write: offset 0x%x val 0x%lx\n",
+ pin_reg->conf_reg, config);
+
+ return 0;
+}
+
+static void imx_pinconf_dbg_show(struct pinctrl_dev *pctldev,
+ struct seq_file *s, unsigned pin_id)
+{
+ struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
+ const struct imx_pinctrl_soc_info *info = ipctl->info;
+ const struct imx_pin_reg *pin_reg;
+ unsigned long config;
+
+ pin_reg = imx_find_pin_reg(info, pin_id, 0, 0);
+ if (!pin_reg || !pin_reg->conf_reg) {
+ seq_printf(s, "N/A");
+ return;
+ }
+
+ config = readl(ipctl->base + pin_reg->conf_reg);
+ seq_printf(s, "0x%lx", config);
+}
+
+static void imx_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
+ struct seq_file *s, unsigned group)
+{
+ struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
+ const struct imx_pinctrl_soc_info *info = ipctl->info;
+ struct imx_pin_group *grp;
+ unsigned long config;
+ const char *name;
+ int i, ret;
+
+ if (group > info->ngroups)
+ return;
+
+ seq_printf(s, "\n");
+ grp = &info->groups[group];
+ for (i = 0; i < grp->npins; i++) {
+ name = pin_get_name(pctldev, grp->pins[i]);
+ ret = imx_pinconf_get(pctldev, grp->pins[i], &config);
+ if (ret)
+ return;
+ seq_printf(s, "%s: 0x%lx", name, config);
+ }
+}
+
+struct pinconf_ops imx_pinconf_ops = {
+ .pin_config_get = imx_pinconf_get,
+ .pin_config_set = imx_pinconf_set,
+ .pin_config_dbg_show = imx_pinconf_dbg_show,
+ .pin_config_group_dbg_show = imx_pinconf_group_dbg_show,
+};
+
+static struct pinctrl_desc imx_pinctrl_desc = {
+ .pctlops = &imx_pctrl_ops,
+ .pmxops = &imx_pmx_ops,
+ .confops = &imx_pinconf_ops,
+ .owner = THIS_MODULE,
+};
+
+/* decode pin id and mux from pin function id got from device tree*/
+static int imx_pinctrl_get_pin_id_and_mux(const struct imx_pinctrl_soc_info *info,
+ unsigned int pin_func_id, unsigned int *pin_id,
+ unsigned int *mux)
+{
+ if (pin_func_id > info->npin_regs)
+ return -EINVAL;
+
+ *pin_id = info->pin_regs[pin_func_id].pid;
+ *mux = info->pin_regs[pin_func_id].mux_mode;
+
+ return 0;
+}
+
+static int __devinit imx_pinctrl_parse_groups(struct device_node *np,
+ struct imx_pin_group *grp,
+ struct imx_pinctrl_soc_info *info,
+ u32 index)
+{
+ unsigned int pin_func_id;
+ int ret, size;
+ const const __be32 *list;
+ int i, j;
+ u32 config;
+
+ dev_dbg(info->dev, "group(%d): %s\n", index, np->name);
+
+ /* Initialise group */
+ grp->name = np->name;
+
+ /*
+ * the binding format is fsl,pins = <PIN_FUNC_ID CONFIG ...>,
+ * do sanity check and calculate pins number
+ */
+ list = of_get_property(np, "fsl,pins", &size);
+ /* we do not check return since it's safe node passed down */
+ size /= sizeof(*list);
+ if (!size || size % 2) {
+ dev_err(info->dev, "wrong pins number or pins and configs should be pairs\n");
+ return -EINVAL;
+ }
+
+ grp->npins = size / 2;
+ grp->pins = devm_kzalloc(info->dev, grp->npins * sizeof(unsigned int),
+ GFP_KERNEL);
+ grp->mux_mode = devm_kzalloc(info->dev, grp->npins * sizeof(unsigned int),
+ GFP_KERNEL);
+ grp->configs = devm_kzalloc(info->dev, grp->npins * sizeof(unsigned long),
+ GFP_KERNEL);
+ for (i = 0, j = 0; i < size; i += 2, j++) {
+ pin_func_id = be32_to_cpu(*list++);
+ ret = imx_pinctrl_get_pin_id_and_mux(info, pin_func_id,
+ &grp->pins[j], &grp->mux_mode[j]);
+ if (ret) {
+ dev_err(info->dev, "get invalid pin function id\n");
+ return -EINVAL;
+ }
+ /* SION bit is in mux register */
+ config = be32_to_cpu(*list++);
+ if (config & IMX_PAD_SION)
+ grp->mux_mode[j] |= IOMUXC_CONFIG_SION;
+ grp->configs[j] = config & ~IMX_PAD_SION;
+ }
+
+#ifdef DEBUG
+ IMX_PMX_DUMP(info, grp->pins, grp->mux_mode, grp->configs, grp->npins);
+#endif
+ return 0;
+}
+
+static int __devinit imx_pinctrl_parse_functions(struct device_node *np,
+ struct imx_pinctrl_soc_info *info, u32 index)
+{
+ struct device_node *child;
+ struct imx_pmx_func *func;
+ struct imx_pin_group *grp;
+ int ret;
+ static u32 grp_index;
+ u32 i = 0;
+
+ dev_dbg(info->dev, "parse function(%d): %s\n", index, np->name);
+
+ func = &info->functions[index];
+
+ /* Initialise function */
+ func->name = np->name;
+ func->num_groups = of_get_child_count(np);
+ if (func->num_groups <= 0) {
+ dev_err(info->dev, "no groups defined\n");
+ return -EINVAL;
+ }
+ func->groups = devm_kzalloc(info->dev,
+ func->num_groups * sizeof(char *), GFP_KERNEL);
+
+ for_each_child_of_node(np, child) {
+ func->groups[i] = child->name;
+ grp = &info->groups[grp_index++];
+ ret = imx_pinctrl_parse_groups(child, grp, info, i++);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+
+static int __devinit imx_pinctrl_probe_dt(struct platform_device *pdev,
+ struct imx_pinctrl_soc_info *info)
+{
+ struct device_node *np = pdev->dev.of_node;
+ struct device_node *child;
+ int ret;
+ u32 nfuncs = 0;
+ u32 i = 0;
+
+ if (!np)
+ return -ENODEV;
+
+ nfuncs = of_get_child_count(np);
+ if (nfuncs <= 0) {
+ dev_err(&pdev->dev, "no functions defined\n");
+ return -EINVAL;
+ }
+
+ info->nfunctions = nfuncs;
+ info->functions = devm_kzalloc(&pdev->dev, nfuncs * sizeof(struct imx_pmx_func),
+ GFP_KERNEL);
+ if (!info->functions)
+ return -ENOMEM;
+
+ info->ngroups = 0;
+ for_each_child_of_node(np, child)
+ info->ngroups += of_get_child_count(child);
+ info->groups = devm_kzalloc(&pdev->dev, info->ngroups * sizeof(struct imx_pin_group),
+ GFP_KERNEL);
+ if (!info->groups)
+ return -ENOMEM;
+
+ for_each_child_of_node(np, child) {
+ ret = imx_pinctrl_parse_functions(child, info, i++);
+ if (ret) {
+ dev_err(&pdev->dev, "failed to parse function\n");
+ return ret;
+ }
+ }
+
+ return 0;
+}
+
+int __devinit imx_pinctrl_probe(struct platform_device *pdev,
+ struct imx_pinctrl_soc_info *info)
+{
+ struct imx_pinctrl *ipctl;
+ struct resource *res;
+ int ret;
+
+ if (!info || !info->pins || !info->npins
+ || !info->pin_regs || !info->npin_regs) {
+ dev_err(&pdev->dev, "wrong pinctrl info\n");
+ return -EINVAL;
+ }
+ info->dev = &pdev->dev;
+
+ /* Create state holders etc for this driver */
+ ipctl = devm_kzalloc(&pdev->dev, sizeof(*ipctl), GFP_KERNEL);
+ if (!ipctl)
+ return -ENOMEM;
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res)
+ return -ENOENT;
+
+ ipctl->base = devm_request_and_ioremap(&pdev->dev, res);
+ if (!ipctl->base)
+ return -EBUSY;
+
+ imx_pinctrl_desc.name = dev_name(&pdev->dev);
+ imx_pinctrl_desc.pins = info->pins;
+ imx_pinctrl_desc.npins = info->npins;
+
+ ret = imx_pinctrl_probe_dt(pdev, info);
+ if (ret) {
+ dev_err(&pdev->dev, "fail to probe dt properties\n");
+ return ret;
+ }
+
+ ipctl->info = info;
+ ipctl->dev = info->dev;
+ platform_set_drvdata(pdev, ipctl);
+ ipctl->pctl = pinctrl_register(&imx_pinctrl_desc, &pdev->dev, ipctl);
+ if (!ipctl->pctl) {
+ dev_err(&pdev->dev, "could not register IMX pinctrl driver\n");
+ return -EINVAL;
+ }
+
+ dev_info(&pdev->dev, "initialized IMX pinctrl driver\n");
+
+ return 0;
+}
+
+int __devexit imx_pinctrl_remove(struct platform_device *pdev)
+{
+ struct imx_pinctrl *ipctl = platform_get_drvdata(pdev);
+
+ pinctrl_unregister(ipctl->pctl);
+
+ return 0;
+}
diff --git a/drivers/pinctrl/pinctrl-imx.h b/drivers/pinctrl/pinctrl-imx.h
new file mode 100644
index 0000000..c8ce541
--- /dev/null
+++ b/drivers/pinctrl/pinctrl-imx.h
@@ -0,0 +1,106 @@
+/*
+ * IMX pinmux core definitions
+ *
+ * Copyright (C) 2012 Freescale Semiconductor, Inc.
+ * Copyright (C) 2012 Linaro Ltd.
+ *
+ * Author: Dong Aisheng <dong.aisheng@linaro.org>
+ *
+ * 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.
+ */
+
+#ifndef __DRIVERS_PINCTRL_IMX_H
+#define __DRIVERS_PINCTRL_IMX_H
+
+struct platform_device;
+
+/**
+ * struct imx_pin_group - describes an IMX pin group
+ * @name: the name of this specific pin group
+ * @pins: an array of discrete physical pins used in this group, taken
+ * from the driver-local pin enumeration space
+ * @npins: the number of pins in this group array, i.e. the number of
+ * elements in .pins so we can iterate over that array
+ * @mux_mode: the mux mode for each pin in this group. The size of this
+ * array is the same as pins.
+ * @configs: the config for each pin in this group. The size of this
+ * array is the same as pins.
+ */
+struct imx_pin_group {
+ const char *name;
+ unsigned int *pins;
+ unsigned npins;
+ unsigned int *mux_mode;
+ unsigned long *configs;
+};
+
+/**
+ * struct imx_pmx_func - describes IMX pinmux functions
+ * @name: the name of this specific function
+ * @groups: corresponding pin groups
+ * @num_groups: the number of groups
+ */
+struct imx_pmx_func {
+ const char *name;
+ const char **groups;
+ unsigned num_groups;
+};
+
+/**
+ * struct imx_pin_reg - describe a pin reg map
+ * The last 3 members are used for select input setting
+ * @pid: pin id
+ * @mux_reg: mux register offset
+ * @conf_reg: config register offset
+ * @mux_mode: mux mode
+ * @input_reg: select input register offset for this mux if any
+ * 0 if no select input setting needed.
+ * @input_val: the value set to select input register
+ */
+struct imx_pin_reg {
+ unsigned int pid;
+ unsigned int mux_reg;
+ unsigned int conf_reg;
+ unsigned int mux_mode;
+ unsigned int input_reg;
+ unsigned int input_val;
+};
+
+struct imx_pinctrl_soc_info {
+ struct device *dev;
+ const struct pinctrl_pin_desc *pins;
+ unsigned int npins;
+ const struct imx_pin_reg *pin_regs;
+ unsigned int npin_regs;
+ struct imx_pin_group *groups;
+ unsigned int ngroups;
+ struct imx_pmx_func *functions;
+ unsigned int nfunctions;
+};
+
+#define NO_MUX 0x0
+#define NO_PAD 0x0
+
+#define IMX_PIN_REG(id, conf, mux, mode, input, val) \
+ { \
+ .pid = id, \
+ .conf_reg = conf, \
+ .mux_reg = mux, \
+ .mux_mode = mode, \
+ .input_reg = input, \
+ .input_val = val, \
+ }
+
+#define IMX_PINCTRL_PIN(pin) PINCTRL_PIN(pin, #pin)
+
+#define PAD_CTL_MASK(len) ((1 << len) - 1)
+#define IMX_MUX_MASK 0x7
+#define IOMUXC_CONFIG_SION (0x1 << 4)
+
+int imx_pinctrl_probe(struct platform_device *pdev,
+ struct imx_pinctrl_soc_info *info);
+int imx_pinctrl_remove(struct platform_device *pdev);
+#endif /* __DRIVERS_PINCTRL_IMX_H */
--
1.7.0.4
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [PATCH v3 4/4] mmc: sdhci-imx-esdhc: convert to use pinctrl subsystem
2012-04-26 14:40 [PATCH v4 1/4] dt: add of_get_child_count helper function Dong Aisheng
2012-04-26 14:40 ` [PATCH v3 2/4] pinctrl: pinctrl-imx: add imx pinctrl core driver Dong Aisheng
@ 2012-04-26 14:40 ` Dong Aisheng
2012-04-26 16:32 ` Stephen Warren
2012-04-27 7:35 ` Sascha Hauer
2012-04-26 16:24 ` [PATCH v4 1/4] dt: add of_get_child_count helper function Stephen Warren
[not found] ` <1335451227-27709-3-git-send-email-b29396@freescale.com>
3 siblings, 2 replies; 34+ messages in thread
From: Dong Aisheng @ 2012-04-26 14:40 UTC (permalink / raw)
To: linux-arm-kernel
From: Dong Aisheng <dong.aisheng@linaro.org>
This driver is shared between many platforms. Currently only imx6q has
pinctrl support, to avoid breaking other platforms that do not have pinctrl
support to run this driver, enable pinctrl dummy state for them before
they also convert to pinctrl subsystem.
Signed-off-by: Dong Aisheng <dong.aisheng@linaro.org>
---
This patch depends on:
pinctrl: add pinctrl_provide_dummies interface for platforms to use
http://www.spinics.net/lists/arm-kernel/msg171538.html
ChangeLog v2->v3:
* patch name updated.
v1 name is ARM: imx6q: switch to use pinctrl driver
* using pinctrl dummy state to avoid breaking other platforms to use this
driver.
ChangeLog v1->v2:
* using updated binding
---
arch/arm/boot/dts/imx6q-arm2.dts | 4 +++
arch/arm/boot/dts/imx6q.dtsi | 32 ++++++++++++++++++++++++
arch/arm/mach-imx/Kconfig | 2 +
arch/arm/mach-imx/eukrea_mbimxsd35-baseboard.c | 2 +
arch/arm/mach-imx/mach-cpuimx51.c | 2 +
arch/arm/mach-imx/mach-cpuimx51sd.c | 2 +
arch/arm/mach-imx/mach-eukrea_cpuimx25.c | 2 +
arch/arm/mach-imx/mach-mx25_3ds.c | 2 +
arch/arm/mach-imx/mach-mx35_3ds.c | 2 +
arch/arm/mach-imx/mach-mx51_3ds.c | 2 +
arch/arm/mach-imx/mach-mx51_babbage.c | 2 +
arch/arm/mach-imx/mach-mx51_efikamx.c | 2 +
arch/arm/mach-imx/mach-mx51_efikasb.c | 2 +
arch/arm/mach-imx/mach-mx53_ard.c | 2 +
arch/arm/mach-imx/mach-mx53_evk.c | 2 +
arch/arm/mach-imx/mach-mx53_loco.c | 2 +
arch/arm/mach-imx/mach-mx53_smd.c | 2 +
arch/arm/mach-imx/mach-pcm043.c | 2 +
arch/arm/mach-imx/mach-vpr200.c | 2 +
drivers/mmc/host/sdhci-esdhc-imx.c | 9 ++++++
20 files changed, 79 insertions(+), 0 deletions(-)
diff --git a/arch/arm/boot/dts/imx6q-arm2.dts b/arch/arm/boot/dts/imx6q-arm2.dts
index ce1c823..34dd9cd 100644
--- a/arch/arm/boot/dts/imx6q-arm2.dts
+++ b/arch/arm/boot/dts/imx6q-arm2.dts
@@ -37,12 +37,16 @@
cd-gpios = <&gpio6 11 0>;
wp-gpios = <&gpio6 14 0>;
vmmc-supply = <®_3p3v>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_usdhc3_1>;
status = "okay";
};
usdhc at 0219c000 { /* uSDHC4 */
fsl,card-wired;
vmmc-supply = <®_3p3v>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_usdhc4_1>;
status = "okay";
};
diff --git a/arch/arm/boot/dts/imx6q.dtsi b/arch/arm/boot/dts/imx6q.dtsi
index 4905f51..a89f294 100644
--- a/arch/arm/boot/dts/imx6q.dtsi
+++ b/arch/arm/boot/dts/imx6q.dtsi
@@ -386,7 +386,39 @@
};
iomuxc at 020e0000 {
+ compatible = "fsl,imx6q-iomuxc";
reg = <0x020e0000 0x4000>;
+
+ /* shared pinctrl settings */
+ usdhc3 {
+ pinctrl_usdhc3_1: usdhc3grp-1 {
+ fsl,pins = <1273 0x17059 /* MX6Q_PAD_SD3_CMD__USDHC3_CMD */
+ 1281 0x10059 /* MX6Q_PAD_SD3_CLK__USDHC3_CLK */
+ 1289 0x17059 /* MX6Q_PAD_SD3_DAT0__USDHC3_DAT0 */
+ 1297 0x17059 /* MX6Q_PAD_SD3_DAT1__USDHC3_DAT1 */
+ 1305 0x17059 /* MX6Q_PAD_SD3_DAT2__USDHC3_DAT2 */
+ 1312 0x17059 /* MX6Q_PAD_SD3_DAT3__USDHC3_DAT3 */
+ 1265 0x17059 /* MX6Q_PAD_SD3_DAT4__USDHC3_DAT4 */
+ 1257 0x17059 /* MX6Q_PAD_SD3_DAT5__USDHC3_DAT5 */
+ 1249 0x17059 /* MX6Q_PAD_SD3_DAT6__USDHC3_DAT6 */
+ 1241 0x17059>; /* MX6Q_PAD_SD3_DAT7__USDHC3_DAT7 */
+ };
+ };
+
+ usdhc4 {
+ pinctrl_usdhc4_1: usdhc4grp-1 {
+ fsl,pins = <1386 0x17059 /* MX6Q_PAD_SD4_CMD__USDHC4_CMD */
+ 1392 0x10059 /* MX6Q_PAD_SD4_CLK__USDHC4_CLK */
+ 1462 0x17059 /* MX6Q_PAD_SD4_DAT0__USDHC4_DAT0 */
+ 1470 0x17059 /* MX6Q_PAD_SD4_DAT1__USDHC4_DAT1 */
+ 1478 0x17059 /* MX6Q_PAD_SD4_DAT2__USDHC4_DAT2 */
+ 1486 0x17059 /* MX6Q_PAD_SD4_DAT3__USDHC4_DAT3 */
+ 1493 0x17059 /* MX6Q_PAD_SD4_DAT4__USDHC4_DAT4 */
+ 1501 0x17059 /* MX6Q_PAD_SD4_DAT5__USDHC4_DAT5 */
+ 1509 0x17059 /* MX6Q_PAD_SD4_DAT6__USDHC4_DAT6 */
+ 1517 0x17059>; /* MX6Q_PAD_SD4_DAT7__USDHC4_DAT7 */
+ };
+ };
};
dcic at 020e4000 { /* DCIC1 */
diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
index 7561eca..e0fc67c 100644
--- a/arch/arm/mach-imx/Kconfig
+++ b/arch/arm/mach-imx/Kconfig
@@ -842,6 +842,8 @@ config SOC_IMX6Q
select HAVE_IMX_MMDC
select HAVE_IMX_SRC
select HAVE_SMP
+ select PINCTRL
+ select PINCTRL_IMX6Q
select USE_OF
help
diff --git a/arch/arm/mach-imx/eukrea_mbimxsd35-baseboard.c b/arch/arm/mach-imx/eukrea_mbimxsd35-baseboard.c
index fd8bf8a..12bbb62 100644
--- a/arch/arm/mach-imx/eukrea_mbimxsd35-baseboard.c
+++ b/arch/arm/mach-imx/eukrea_mbimxsd35-baseboard.c
@@ -25,6 +25,7 @@
#include <linux/gpio.h>
#include <linux/interrupt.h>
#include <linux/leds.h>
+#include <linux/pinctrl/machine.h>
#include <linux/platform_device.h>
#include <linux/input.h>
#include <video/platform_lcd.h>
@@ -251,6 +252,7 @@ void __init eukrea_mbimxsd35_baseboard_init(void)
ARRAY_SIZE(eukrea_mbimxsd_pads)))
printk(KERN_ERR "error setting mbimxsd pads !\n");
+ pinctrl_provide_dummies();
imx35_add_imx_uart1(&uart_pdata);
imx35_add_ipu_core(&mx3_ipu_data);
imx35_add_mx3_sdc_fb(&mx3fb_pdata);
diff --git a/arch/arm/mach-imx/mach-cpuimx51.c b/arch/arm/mach-imx/mach-cpuimx51.c
index 944025d..2c67d7f 100644
--- a/arch/arm/mach-imx/mach-cpuimx51.c
+++ b/arch/arm/mach-imx/mach-cpuimx51.c
@@ -22,6 +22,7 @@
#include <linux/delay.h>
#include <linux/io.h>
#include <linux/interrupt.h>
+#include <linux/pinctrl/machine.h>
#include <mach/eukrea-baseboards.h>
#include <mach/common.h>
@@ -243,6 +244,7 @@ static void __init eukrea_cpuimx51_init(void)
mxc_iomux_v3_setup_multiple_pads(eukrea_cpuimx51_pads,
ARRAY_SIZE(eukrea_cpuimx51_pads));
+ pinctrl_provide_dummies();
imx51_add_imx_uart(0, &uart_pdata);
imx51_add_mxc_nand(&eukrea_cpuimx51_nand_board_info);
diff --git a/arch/arm/mach-imx/mach-cpuimx51sd.c b/arch/arm/mach-imx/mach-cpuimx51sd.c
index 9fbe923..5d5a872 100644
--- a/arch/arm/mach-imx/mach-cpuimx51sd.c
+++ b/arch/arm/mach-imx/mach-cpuimx51sd.c
@@ -25,6 +25,7 @@
#include <linux/i2c-gpio.h>
#include <linux/spi/spi.h>
#include <linux/can/platform/mcp251x.h>
+#include <linux/pinctrl/machine.h>
#include <mach/eukrea-baseboards.h>
#include <mach/common.h>
@@ -265,6 +266,7 @@ static void __init eukrea_cpuimx51sd_init(void)
mxc_iomux_v3_setup_multiple_pads(eukrea_cpuimx51sd_pads,
ARRAY_SIZE(eukrea_cpuimx51sd_pads));
+ pinctrl_provide_dummies();
#if defined(CONFIG_CPU_FREQ_IMX)
get_cpu_op = mx51_get_cpu_op;
diff --git a/arch/arm/mach-imx/mach-eukrea_cpuimx25.c b/arch/arm/mach-imx/mach-eukrea_cpuimx25.c
index 76a97a5..b90b795 100644
--- a/arch/arm/mach-imx/mach-eukrea_cpuimx25.c
+++ b/arch/arm/mach-imx/mach-eukrea_cpuimx25.c
@@ -23,6 +23,7 @@
#include <linux/clk.h>
#include <linux/irq.h>
#include <linux/gpio.h>
+#include <linux/pinctrl/machine.h>
#include <linux/platform_device.h>
#include <linux/usb/otg.h>
#include <linux/usb/ulpi.h>
@@ -131,6 +132,7 @@ static void __init eukrea_cpuimx25_init(void)
ARRAY_SIZE(eukrea_cpuimx25_pads)))
printk(KERN_ERR "error setting cpuimx25 pads !\n");
+ pinctrl_provide_dummies();
imx25_add_imx_uart0(&uart_pdata);
imx25_add_mxc_nand(&eukrea_cpuimx25_nand_board_info);
imx25_add_imxdi_rtc(NULL);
diff --git a/arch/arm/mach-imx/mach-mx25_3ds.c b/arch/arm/mach-imx/mach-mx25_3ds.c
index f267342..347467c 100644
--- a/arch/arm/mach-imx/mach-mx25_3ds.c
+++ b/arch/arm/mach-imx/mach-mx25_3ds.c
@@ -29,6 +29,7 @@
#include <linux/irq.h>
#include <linux/gpio.h>
#include <linux/platform_device.h>
+#include <linux/pinctrl/machine.h>
#include <linux/usb/otg.h>
#include <mach/hardware.h>
@@ -233,6 +234,7 @@ static void __init mx25pdk_init(void)
mxc_iomux_v3_setup_multiple_pads(mx25pdk_pads,
ARRAY_SIZE(mx25pdk_pads));
+ pinctrl_provide_dummies();
imx25_add_imx_uart0(&uart_pdata);
imx25_add_fsl_usb2_udc(&otg_device_pdata);
imx25_add_mxc_ehci_hs(&usbh2_pdata);
diff --git a/arch/arm/mach-imx/mach-mx35_3ds.c b/arch/arm/mach-imx/mach-mx35_3ds.c
index 6ae51c6..b8cfc6a 100644
--- a/arch/arm/mach-imx/mach-mx35_3ds.c
+++ b/arch/arm/mach-imx/mach-mx35_3ds.c
@@ -31,6 +31,7 @@
#include <linux/platform_device.h>
#include <linux/memory.h>
#include <linux/gpio.h>
+#include <linux/pinctrl/machine.h>
#include <linux/usb/otg.h>
#include <linux/mtd/physmap.h>
@@ -380,6 +381,7 @@ static void __init mx35_3ds_init(void)
mxc_iomux_v3_setup_multiple_pads(mx35pdk_pads, ARRAY_SIZE(mx35pdk_pads));
+ pinctrl_provide_dummies();
imx35_add_fec(NULL);
imx35_add_imx2_wdt(NULL);
platform_add_devices(devices, ARRAY_SIZE(devices));
diff --git a/arch/arm/mach-imx/mach-mx51_3ds.c b/arch/arm/mach-imx/mach-mx51_3ds.c
index 83eab41..9a8a6f2 100644
--- a/arch/arm/mach-imx/mach-mx51_3ds.c
+++ b/arch/arm/mach-imx/mach-mx51_3ds.c
@@ -14,6 +14,7 @@
#include <linux/platform_device.h>
#include <linux/spi/spi.h>
#include <linux/gpio.h>
+#include <linux/pinctrl/machine.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
@@ -139,6 +140,7 @@ static void __init mx51_3ds_init(void)
mxc_iomux_v3_setup_multiple_pads(mx51_3ds_pads,
ARRAY_SIZE(mx51_3ds_pads));
+ pinctrl_provide_dummies();
imx51_add_imx_uart(0, &uart_pdata);
imx51_add_imx_uart(1, &uart_pdata);
diff --git a/arch/arm/mach-imx/mach-mx51_babbage.c b/arch/arm/mach-imx/mach-mx51_babbage.c
index e4b822e..9adc94b 100644
--- a/arch/arm/mach-imx/mach-mx51_babbage.c
+++ b/arch/arm/mach-imx/mach-mx51_babbage.c
@@ -17,6 +17,7 @@
#include <linux/delay.h>
#include <linux/io.h>
#include <linux/input.h>
+#include <linux/pinctrl/machine.h>
#include <linux/spi/flash.h>
#include <linux/spi/spi.h>
@@ -353,6 +354,7 @@ void __init imx51_babbage_common_init(void)
{
mxc_iomux_v3_setup_multiple_pads(mx51babbage_pads,
ARRAY_SIZE(mx51babbage_pads));
+ pinctrl_provide_dummies();
}
/*
diff --git a/arch/arm/mach-imx/mach-mx51_efikamx.c b/arch/arm/mach-imx/mach-mx51_efikamx.c
index 586e9f8..8486569 100644
--- a/arch/arm/mach-imx/mach-mx51_efikamx.c
+++ b/arch/arm/mach-imx/mach-mx51_efikamx.c
@@ -22,6 +22,7 @@
#include <linux/input.h>
#include <linux/delay.h>
#include <linux/io.h>
+#include <linux/pinctrl/machine.h>
#include <linux/spi/flash.h>
#include <linux/spi/spi.h>
#include <linux/mfd/mc13892.h>
@@ -237,6 +238,7 @@ static void __init mx51_efikamx_init(void)
mxc_iomux_v3_setup_multiple_pads(mx51efikamx_pads,
ARRAY_SIZE(mx51efikamx_pads));
+ pinctrl_provide_dummies();
efika_board_common_init();
mx51_efikamx_board_id();
diff --git a/arch/arm/mach-imx/mach-mx51_efikasb.c b/arch/arm/mach-imx/mach-mx51_efikasb.c
index 24aded9..dfd9952 100644
--- a/arch/arm/mach-imx/mach-mx51_efikasb.c
+++ b/arch/arm/mach-imx/mach-mx51_efikasb.c
@@ -22,6 +22,7 @@
#include <linux/input.h>
#include <linux/delay.h>
#include <linux/io.h>
+#include <linux/pinctrl/machine.h>
#include <linux/spi/flash.h>
#include <linux/spi/spi.h>
#include <linux/mfd/mc13892.h>
@@ -260,6 +261,7 @@ static void __init efikasb_board_init(void)
mxc_iomux_v3_setup_multiple_pads(mx51efikasb_pads,
ARRAY_SIZE(mx51efikasb_pads));
+ pinctrl_provide_dummies();
efika_board_common_init();
mx51_efikasb_board_id();
diff --git a/arch/arm/mach-imx/mach-mx53_ard.c b/arch/arm/mach-imx/mach-mx53_ard.c
index 0564198..d251da4 100644
--- a/arch/arm/mach-imx/mach-mx53_ard.c
+++ b/arch/arm/mach-imx/mach-mx53_ard.c
@@ -22,6 +22,7 @@
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/gpio.h>
+#include <linux/pinctrl/machine.h>
#include <linux/smsc911x.h>
#include <linux/regulator/machine.h>
#include <linux/regulator/fixed.h>
@@ -226,6 +227,7 @@ void __init imx53_ard_common_init(void)
mxc_iomux_v3_setup_multiple_pads(mx53_ard_pads,
ARRAY_SIZE(mx53_ard_pads));
weim_cs_config();
+ pinctrl_provide_dummies();
}
static struct platform_device *devices[] __initdata = {
diff --git a/arch/arm/mach-imx/mach-mx53_evk.c b/arch/arm/mach-imx/mach-mx53_evk.c
index 5a72188..9ca7010 100644
--- a/arch/arm/mach-imx/mach-mx53_evk.c
+++ b/arch/arm/mach-imx/mach-mx53_evk.c
@@ -23,6 +23,7 @@
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/gpio.h>
+#include <linux/pinctrl/machine.h>
#include <linux/spi/flash.h>
#include <linux/spi/spi.h>
#include <mach/common.h>
@@ -134,6 +135,7 @@ void __init imx53_evk_common_init(void)
{
mxc_iomux_v3_setup_multiple_pads(mx53_evk_pads,
ARRAY_SIZE(mx53_evk_pads));
+ pinctrl_provide_dummies();
}
static void __init mx53_evk_board_init(void)
diff --git a/arch/arm/mach-imx/mach-mx53_loco.c b/arch/arm/mach-imx/mach-mx53_loco.c
index 37f67ca..4c11cc1 100644
--- a/arch/arm/mach-imx/mach-mx53_loco.c
+++ b/arch/arm/mach-imx/mach-mx53_loco.c
@@ -23,6 +23,7 @@
#include <linux/delay.h>
#include <linux/gpio.h>
#include <linux/i2c.h>
+#include <linux/pinctrl/machine.h>
#include <mach/common.h>
#include <mach/hardware.h>
@@ -266,6 +267,7 @@ void __init imx53_qsb_common_init(void)
{
mxc_iomux_v3_setup_multiple_pads(mx53_loco_pads,
ARRAY_SIZE(mx53_loco_pads));
+ pinctrl_provide_dummies();
}
static struct i2c_board_info mx53loco_i2c_devices[] = {
diff --git a/arch/arm/mach-imx/mach-mx53_smd.c b/arch/arm/mach-imx/mach-mx53_smd.c
index 8e972c5..d621022 100644
--- a/arch/arm/mach-imx/mach-mx53_smd.c
+++ b/arch/arm/mach-imx/mach-mx53_smd.c
@@ -22,6 +22,7 @@
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/gpio.h>
+#include <linux/pinctrl/machine.h>
#include <mach/common.h>
#include <mach/hardware.h>
@@ -128,6 +129,7 @@ void __init imx53_smd_common_init(void)
{
mxc_iomux_v3_setup_multiple_pads(mx53_smd_pads,
ARRAY_SIZE(mx53_smd_pads));
+ pinctrl_provide_dummies();
}
static void __init mx53_smd_board_init(void)
diff --git a/arch/arm/mach-imx/mach-pcm043.c b/arch/arm/mach-imx/mach-pcm043.c
index 237474f..c0ec1b8 100644
--- a/arch/arm/mach-imx/mach-pcm043.c
+++ b/arch/arm/mach-imx/mach-pcm043.c
@@ -25,6 +25,7 @@
#include <linux/delay.h>
#include <linux/i2c.h>
#include <linux/i2c/at24.h>
+#include <linux/pinctrl/machine.h>
#include <linux/usb/otg.h>
#include <linux/usb/ulpi.h>
@@ -361,6 +362,7 @@ static void __init pcm043_init(void)
mxc_iomux_v3_setup_multiple_pads(pcm043_pads, ARRAY_SIZE(pcm043_pads));
+ pinctrl_provide_dummies();
imx35_add_fec(NULL);
platform_add_devices(devices, ARRAY_SIZE(devices));
imx35_add_imx2_wdt(NULL);
diff --git a/arch/arm/mach-imx/mach-vpr200.c b/arch/arm/mach-imx/mach-vpr200.c
index 033257e..cf9afcb 100644
--- a/arch/arm/mach-imx/mach-vpr200.c
+++ b/arch/arm/mach-imx/mach-vpr200.c
@@ -23,6 +23,7 @@
#include <linux/mtd/physmap.h>
#include <linux/memory.h>
#include <linux/gpio.h>
+#include <linux/pinctrl/machine.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
@@ -271,6 +272,7 @@ static void __init vpr200_board_init(void)
mxc_iomux_v3_setup_multiple_pads(vpr200_pads, ARRAY_SIZE(vpr200_pads));
+ pinctrl_provide_dummies();
imx35_add_fec(NULL);
imx35_add_imx2_wdt(NULL);
imx_add_gpio_keys(&vpr200_gpio_keys_data);
diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c
index 6193a0d..039bc19 100644
--- a/drivers/mmc/host/sdhci-esdhc-imx.c
+++ b/drivers/mmc/host/sdhci-esdhc-imx.c
@@ -24,6 +24,7 @@
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/of_gpio.h>
+#include <linux/pinctrl/consumer.h>
#include <mach/esdhc.h>
#include "sdhci-pltfm.h"
#include "sdhci-esdhc.h"
@@ -68,6 +69,7 @@ struct pltfm_imx_data {
int flags;
u32 scratchpad;
enum imx_esdhc_type devtype;
+ struct pinctrl *pinctrl;
struct esdhc_platform_data boarddata;
};
@@ -467,6 +469,12 @@ static int __devinit sdhci_esdhc_imx_probe(struct platform_device *pdev)
clk_prepare_enable(clk);
pltfm_host->clk = clk;
+ imx_data->pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
+ if (IS_ERR(imx_data->pinctrl)) {
+ err = PTR_ERR(imx_data->pinctrl);
+ goto pin_err;
+ }
+
if (!is_imx25_esdhc(imx_data))
host->quirks |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL;
@@ -559,6 +567,7 @@ no_card_detect_irq:
gpio_free(boarddata->wp_gpio);
no_card_detect_pin:
no_board_data:
+pin_err:
clk_disable_unprepare(pltfm_host->clk);
clk_put(pltfm_host->clk);
err_clk_get:
--
1.7.0.4
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [PATCH v3 2/4] pinctrl: pinctrl-imx: add imx pinctrl core driver
2012-04-26 14:40 ` [PATCH v3 2/4] pinctrl: pinctrl-imx: add imx pinctrl core driver Dong Aisheng
@ 2012-04-26 14:44 ` Jean-Christophe PLAGNIOL-VILLARD
2012-04-26 15:15 ` Jean-Christophe PLAGNIOL-VILLARD
` (2 more replies)
2012-04-26 14:44 ` Dong Aisheng
` (2 subsequent siblings)
3 siblings, 3 replies; 34+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-04-26 14:44 UTC (permalink / raw)
To: linux-arm-kernel
On 22:40 Thu 26 Apr , Dong Aisheng wrote:
> From: Dong Aisheng <dong.aisheng@linaro.org>
>
> The driver has mux and config support while the gpio is still
> not supported.
> For select input setting, the driver will handle it internally
> and do not need user to take care of it.
>
> The pinctrl-imx core driver will parse the dts file and dynamically
> create the pinmux functions and groups.
>
> Each IMX SoC pinctrl driver should register pins with a pin register map
> including mux register and config register and select input map to core
> for proper operations.
>
> Signed-off-by: Dong Aisheng <dong.aisheng@linaro.org>
>
> ---
> ChangeLog: v2->v3:
> * add missed SION bit set from device tree
> Thanks for Richard Zhao's reminder.
> ChangeLog: v1->v2:
> * Change the binding a bit.
> For fsl,pins property, change it from pin name strings to pin function id
> which represents a pin working on a specific function. Then we can remove
> fsl,mux property since the pin function id already contains the mux setting.
> Also remove other pin config property in the first patch.
> Because in the future, we will switch to use dtc macro, then using a lot of
> propertys to represent the each pin config like pull, speed and etc seems
> needless.
> Then each pin entry in dts file becomes a pair of PIN_FUNC_ID and CONFIG:
> fsl,pins = <PIN_FUNC_ID CONFIG ..>
> See binding doc for details.
> * Sascha raised a question that pins in the same group may have different
> pad setting for example I2C_CLK needs pull up while I2C_DAT not.
> The v1 driver can aslo handle this issue but needs split the different
> pad setting pins into different groups which loses a bit flexibility.
> Also suggested by Richard Zhao and Jason Liu, we may still want the iomux
> v3 simililar using way that allows each pin has the abiblity to configure
> its pad which seems reasonable because from HW point of view, FSL IMX are
> indeed pin based SoC which should be able to set per pin.
> So the main changes in this v2 patch are change to support per pin config.
> Then the using of iomux is almost the same as the existing iomux v3 for
> non dt imx platforms. See binding doc for example.
>
> After introduce the new way, there're mainly two known issues:
> 1) Since many pins in the same group may have the same pad config setting,
> thus there may be some data redundance, however, since it's one word
> and it's purely describe hw i would think it's not a big issue.
> 2) Need a magic number to indicate no pad config need. In current iomux v3,
> It's 1<<16 which is not used by IMX5, i used 1<<31 for both MX5 and MX6.
> However, it's definitely possibile that in the future, the bit 31 may also
> be used, that means we may need change the binding doc or just handle it in
> driver for different SoCs.
> 3) Due to core limitation, the current pinconf_group_set/get only support
> get/set the same config(a u32 value)for all the pins in the same group,
> so i removed the imx_group_set/get functions support, instead, using
> imx_pin_get/set.
> About this limitation, we may need some futher discussion on if we may
> need to enhance it to be more flexible to support configure different
> pins in the same group.
> * Refactor probe handling based on Stephen's suggestion.
> * Enhanced the binding doc and split it into two part, pinctrl-imx common part
> and pinctrl-soc driver part.
> * Change functions name from imx_pmx_* to imx_pinctrl_*.
> * Other fixes based on Sascha, Stephen, Linus, Shawn's comments.
> ---
> .../bindings/pinctrl/fsl,imx-pinctrl.txt | 93 +++
> drivers/pinctrl/Kconfig | 5 +
> drivers/pinctrl/Makefile | 1 +
> drivers/pinctrl/pinctrl-imx.c | 627 ++++++++++++++++++++
> drivers/pinctrl/pinctrl-imx.h | 106 ++++
> 5 files changed, 832 insertions(+), 0 deletions(-)
> create mode 100644 Documentation/devicetree/bindings/pinctrl/fsl,imx-pinctrl.txt
> create mode 100644 drivers/pinctrl/pinctrl-imx.c
> create mode 100644 drivers/pinctrl/pinctrl-imx.h
>
> diff --git a/Documentation/devicetree/bindings/pinctrl/fsl,imx-pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/fsl,imx-pinctrl.txt
> new file mode 100644
> index 0000000..e00c7fc
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/pinctrl/fsl,imx-pinctrl.txt
> @@ -0,0 +1,93 @@
> +* Freescale IOMUX Controller (IOMUXC) for i.MX
> +
> +The IOMUX Controller (IOMUXC), together with the IOMUX, enables the IC
> +to share one PAD to several functional blocks. The sharing is done by
> +multiplexing the PAD input/output signals. For each PAD there are up to
> +8 muxing options (called ALT modes). Since different modules require
> +different PAD settings (like pull up, keeper, etc) the IOMUXC controls
> +also the PAD settings parameters.
> +
> +Please refer to pinctrl-bindings.txt in this directory for details of the
> +common pinctrl bindings used by client devices, including the meaning of the
> +phrase "pin configuration node".
> +
> +Freescale IMX pin configuration node is a node of a group of pins which can be
> +used for a specific device or function. This node represents both mux and config
> +of the pins in that group. The 'mux' selects the function mode(also named mux
> +mode) this pin can work on and the 'config' configures various pad settings
> +such as pull-up, open drain, drive strength, etc.
> +
> +Required properties for iomux controller:
> +- compatible: "fsl,<soc>-iomuxc"
> + Please refer to each fsl,<soc>-pinctrl.txt binding doc for supported SoCs.
> +
> +Required properties for pin configuration node:
> +- fsl,pins: two integers array, represents a group of pins mux and config
> + setting. The format is fsl,pins = <PIN_FUNC_ID CONFIG>, PIN_FUNC_ID is a
> + pin working on a specific function, CONFIG is the pad setting value like
> + pull-up on this pin. Please refer to fsl,<soc>-pinctrl.txt for the valid
> + pins and functions of each SoC.
> +
> +Bits used for CONFIG:
> +NO_PAD_CTL(1 << 31): indicate this pin does not need config.
> +
> +SION(1 << 30): Software Input On Field.
> +Force the selected mux mode input path no matter of MUX_MODE functionality.
> +By default the input path is determined by functionality of the selected
> +mux mode (regular).
> +
> +Other bits are used for PAD setting.
> +
> +NOTE:
> +Some requirements for using fsl,imx-pinctrl binding:
> +1. We have pin function node defined under iomux controller node to represent
> + what pinmux functions this SoC supports.
> +2. The pin configuration node intends to work on a specific function should
> + to be defined under that specific function node.
> + The function node's name should represent well about what function
> + this group of pins in this pin configuration node are working on.
> +3. The driver can use the function node's name and pin configuration node's
> + name describe the pin function and group hierarchy.
> + For example, Linux IMX pinctrl driver takes the function node's name
> + as the function name and pin configuration node's name as group name to
> + create the map table.
> +4. Each pin configuration node should have a phandle, devices can set pins
> + configurations by referring to the phandle of that pin configuration node.
> +
> +Examples:
> +usdhc at 0219c000 { /* uSDHC4 */
> + fsl,card-wired;
> + vmmc-supply = <®_3p3v>;
> + status = "okay";
> + pinctrl-names = "default";
> + pinctrl-0 = <&pinctrl_usdhc4_1>;
> +};
> +
> +iomuxc at 020e0000 {
> + compatible = "fsl,imx6q-iomuxc";
> + reg = <0x020e0000 0x4000>;
> +
> + /* shared pinctrl settings */
> + usdhc4 {
> + pinctrl_usdhc4_1: usdhc4grp-1 {
> + fsl,pins = <1386 0x17059 /* MX6Q_PAD_SD4_CMD__USDHC4_CMD */
> + 1392 0x17059 /* MX6Q_PAD_SD4_CLK__USDHC4_CLK */
> + 1462 0x17059 /* MX6Q_PAD_SD4_DAT0__USDHC4_DAT0 */
> + 1470 0x17059 /* MX6Q_PAD_SD4_DAT1__USDHC4_DAT1 */
> + 1478 0x17059 /* MX6Q_PAD_SD4_DAT2__USDHC4_DAT2 */
> + 1486 0x17059 /* MX6Q_PAD_SD4_DAT3__USDHC4_DAT3 */
> + 1493 0x17059 /* MX6Q_PAD_SD4_DAT4__USDHC4_DAT4 */
> + 1501 0x17059 /* MX6Q_PAD_SD4_DAT5__USDHC4_DAT5 */
> + 1509 0x17059 /* MX6Q_PAD_SD4_DAT6__USDHC4_DAT6 */
> + 1517 0x17059>; /* MX6Q_PAD_SD4_DAT7__USDHC4_DAT7 */
honestly I don't like this it's obscure need to decode manually
I propose to use phandle
as example on uart you will want or not the rst/cts so you will have quite a
lot of bindings
so you can describe the pin configuration (function) and refer it by phandle
in the group
Best Regards,
J.
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v3 2/4] pinctrl: pinctrl-imx: add imx pinctrl core driver
2012-04-26 14:40 ` [PATCH v3 2/4] pinctrl: pinctrl-imx: add imx pinctrl core driver Dong Aisheng
2012-04-26 14:44 ` Jean-Christophe PLAGNIOL-VILLARD
@ 2012-04-26 14:44 ` Dong Aisheng
2012-04-27 5:30 ` Shawn Guo
2012-04-27 8:54 ` Shawn Guo
3 siblings, 0 replies; 34+ messages in thread
From: Dong Aisheng @ 2012-04-26 14:44 UTC (permalink / raw)
To: linux-arm-kernel
On Thu, Apr 26, 2012 at 10:40:25PM +0800, Dong Aisheng wrote:
> From: Dong Aisheng <dong.aisheng@linaro.org>
>
> The driver has mux and config support while the gpio is still
> not supported.
> For select input setting, the driver will handle it internally
> and do not need user to take care of it.
>
> The pinctrl-imx core driver will parse the dts file and dynamically
> create the pinmux functions and groups.
>
> Each IMX SoC pinctrl driver should register pins with a pin register map
> including mux register and config register and select input map to core
> for proper operations.
>
> Signed-off-by: Dong Aisheng <dong.aisheng@linaro.org>
>
> ---
> ChangeLog: v2->v3:
> * add missed SION bit set from device tree
> Thanks for Richard Zhao's reminder.
> ChangeLog: v1->v2:
> * Change the binding a bit.
> For fsl,pins property, change it from pin name strings to pin function id
> which represents a pin working on a specific function. Then we can remove
> fsl,mux property since the pin function id already contains the mux setting.
> Also remove other pin config property in the first patch.
> Because in the future, we will switch to use dtc macro, then using a lot of
> propertys to represent the each pin config like pull, speed and etc seems
> needless.
> Then each pin entry in dts file becomes a pair of PIN_FUNC_ID and CONFIG:
> fsl,pins = <PIN_FUNC_ID CONFIG ..>
> See binding doc for details.
> * Sascha raised a question that pins in the same group may have different
> pad setting for example I2C_CLK needs pull up while I2C_DAT not.
> The v1 driver can aslo handle this issue but needs split the different
> pad setting pins into different groups which loses a bit flexibility.
> Also suggested by Richard Zhao and Jason Liu, we may still want the iomux
> v3 simililar using way that allows each pin has the abiblity to configure
> its pad which seems reasonable because from HW point of view, FSL IMX are
> indeed pin based SoC which should be able to set per pin.
> So the main changes in this v2 patch are change to support per pin config.
> Then the using of iomux is almost the same as the existing iomux v3 for
> non dt imx platforms. See binding doc for example.
>
> After introduce the new way, there're mainly two known issues:
> 1) Since many pins in the same group may have the same pad config setting,
> thus there may be some data redundance, however, since it's one word
> and it's purely describe hw i would think it's not a big issue.
> 2) Need a magic number to indicate no pad config need. In current iomux v3,
> It's 1<<16 which is not used by IMX5, i used 1<<31 for both MX5 and MX6.
> However, it's definitely possibile that in the future, the bit 31 may also
> be used, that means we may need change the binding doc or just handle it in
> driver for different SoCs.
> 3) Due to core limitation, the current pinconf_group_set/get only support
> get/set the same config(a u32 value)for all the pins in the same group,
> so i removed the imx_group_set/get functions support, instead, using
> imx_pin_get/set.
> About this limitation, we may need some futher discussion on if we may
> need to enhance it to be more flexible to support configure different
> pins in the same group.
> * Refactor probe handling based on Stephen's suggestion.
> * Enhanced the binding doc and split it into two part, pinctrl-imx common part
> and pinctrl-soc driver part.
> * Change functions name from imx_pmx_* to imx_pinctrl_*.
> * Other fixes based on Sascha, Stephen, Linus, Shawn's comments.
> ---
Hi Shawn & Sascha,
Please help review if this can meet your requirement.
Regards
Dong Aisheg
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v3 2/4] pinctrl: pinctrl-imx: add imx pinctrl core driver
2012-04-26 14:44 ` Jean-Christophe PLAGNIOL-VILLARD
@ 2012-04-26 15:15 ` Jean-Christophe PLAGNIOL-VILLARD
2012-04-27 5:48 ` Shawn Guo
2012-04-27 3:48 ` Dong Aisheng
2012-04-27 7:30 ` Sascha Hauer
2 siblings, 1 reply; 34+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-04-26 15:15 UTC (permalink / raw)
To: linux-arm-kernel
> > +Examples:
> > +usdhc at 0219c000 { /* uSDHC4 */
> > + fsl,card-wired;
> > + vmmc-supply = <®_3p3v>;
> > + status = "okay";
> > + pinctrl-names = "default";
> > + pinctrl-0 = <&pinctrl_usdhc4_1>;
> > +};
> > +
> > +iomuxc at 020e0000 {
> > + compatible = "fsl,imx6q-iomuxc";
> > + reg = <0x020e0000 0x4000>;
> > +
> > + /* shared pinctrl settings */
> > + usdhc4 {
> > + pinctrl_usdhc4_1: usdhc4grp-1 {
> > + fsl,pins = <1386 0x17059 /* MX6Q_PAD_SD4_CMD__USDHC4_CMD */
> > + 1392 0x17059 /* MX6Q_PAD_SD4_CLK__USDHC4_CLK */
> > + 1462 0x17059 /* MX6Q_PAD_SD4_DAT0__USDHC4_DAT0 */
> > + 1470 0x17059 /* MX6Q_PAD_SD4_DAT1__USDHC4_DAT1 */
> > + 1478 0x17059 /* MX6Q_PAD_SD4_DAT2__USDHC4_DAT2 */
> > + 1486 0x17059 /* MX6Q_PAD_SD4_DAT3__USDHC4_DAT3 */
> > + 1493 0x17059 /* MX6Q_PAD_SD4_DAT4__USDHC4_DAT4 */
> > + 1501 0x17059 /* MX6Q_PAD_SD4_DAT5__USDHC4_DAT5 */
> > + 1509 0x17059 /* MX6Q_PAD_SD4_DAT6__USDHC4_DAT6 */
> > + 1517 0x17059>; /* MX6Q_PAD_SD4_DAT7__USDHC4_DAT7 */
> honestly I don't like this it's obscure need to decode manually
>
> I propose to use phandle
>
> as example on uart you will want or not the rst/cts so you will have quite a
> lot of bindings
>
> so you can describe the pin configuration (function) and refer it by phandle
> in the group
We have on Imx mxc at91 and other SoC controler hich you configure per pin
which means one pin have multiple function and the same function is on
multiple pins
so the groups are just a list of possible pins
Instead of re-inventing bindings we do need to come with a common binding whre
it's possible
So instead I proppose (send in the v2) to use common way to describe the group
1) we describe one function per pin
functions {
rxd_pb12 {
atmel,pin-id = <44>;
atmel,mux = <0>;
};
txd_pb13 {
atmel,pin-id = <45>;
atmel,pull = <2>;
atmel,mux = <0>;
};
txd0_pb19 {
atmel,pin-id = <51>;
atmel,pull = <2>;
atmel,mux = <0>;
};
rxd0_pb18 {
atmel,pin-id = <50>;
atmel,mux = <0>;
};
rts0_pb17 {
atmel,pin-id = <49>;
atmel,mux = <1>;
};
cts0_pb15 {
atmel,pin-id = <47>;
atmel,mux = <1>;
};
};
advantage if you need to set a pull-up or any pin parameter different on your board
you can overwrite it without re-creating a group
This is controller specific
and then we have the common bindings to describe the group
by using phandle of the functions to describe the group
groups {
dbgu {
pinctrl,functions = < &rxd_pb12
&txd_pb13 >;
};
uart0_rxd_txd {
pinctrl,functions = < &rxd0_pb18
&txd0_pb19 >;
};
uart0_rts_cts {
pinctrl,functions = < &rxd0_pb18
&txd0_pb19
&rts0_pb17
&cts0_pb15 >;
};
};
this will be handle by a generic code in c
Best Regards,
J.
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v4 1/4] dt: add of_get_child_count helper function
2012-04-26 14:40 [PATCH v4 1/4] dt: add of_get_child_count helper function Dong Aisheng
2012-04-26 14:40 ` [PATCH v3 2/4] pinctrl: pinctrl-imx: add imx pinctrl core driver Dong Aisheng
2012-04-26 14:40 ` [PATCH v3 4/4] mmc: sdhci-imx-esdhc: convert to use pinctrl subsystem Dong Aisheng
@ 2012-04-26 16:24 ` Stephen Warren
2012-04-27 3:28 ` Dong Aisheng
[not found] ` <1335451227-27709-3-git-send-email-b29396@freescale.com>
3 siblings, 1 reply; 34+ messages in thread
From: Stephen Warren @ 2012-04-26 16:24 UTC (permalink / raw)
To: linux-arm-kernel
On 04/26/2012 08:40 AM, Dong Aisheng wrote:
> From: Dong Aisheng <dong.aisheng@linaro.org>
>
> Currently most code to get child count in kernel are almost same,
> add a helper to implement this function for dt to use.
> diff --git a/include/linux/of.h b/include/linux/of.h
> +static inline int of_get_child_count(const struct device_node *np)
> +{
> + struct device_node *child = NULL;
You don't actually need to initialize child here. It doesn't really
matter here, but in a more complex function, it might hide a
used-before-initialized error.
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v3 4/4] mmc: sdhci-imx-esdhc: convert to use pinctrl subsystem
2012-04-26 14:40 ` [PATCH v3 4/4] mmc: sdhci-imx-esdhc: convert to use pinctrl subsystem Dong Aisheng
@ 2012-04-26 16:32 ` Stephen Warren
2012-04-27 7:35 ` Sascha Hauer
1 sibling, 0 replies; 34+ messages in thread
From: Stephen Warren @ 2012-04-26 16:32 UTC (permalink / raw)
To: linux-arm-kernel
On 04/26/2012 08:40 AM, Dong Aisheng wrote:
> From: Dong Aisheng <dong.aisheng@linaro.org>
>
> This driver is shared between many platforms. Currently only imx6q has
> pinctrl support, to avoid breaking other platforms that do not have pinctrl
> support to run this driver, enable pinctrl dummy state for them before
> they also convert to pinctrl subsystem.
The series,
Acked-by: Stephen Warren <swarren@wwwdotorg.org>
(My ack isn't meant to override or influence any discussions between
Freescale maintainers re: the binding, but more that the binding seems
to be /a/ reasonable solution, and is specified well enough that I
understand what's going on there)
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v4 1/4] dt: add of_get_child_count helper function
2012-04-26 16:24 ` [PATCH v4 1/4] dt: add of_get_child_count helper function Stephen Warren
@ 2012-04-27 3:28 ` Dong Aisheng
2012-04-27 3:36 ` [PATCH v5 1/1] " Dong Aisheng
0 siblings, 1 reply; 34+ messages in thread
From: Dong Aisheng @ 2012-04-27 3:28 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Apr 27, 2012 at 12:24:11AM +0800, Stephen Warren wrote:
> On 04/26/2012 08:40 AM, Dong Aisheng wrote:
> > From: Dong Aisheng <dong.aisheng@linaro.org>
> >
> > Currently most code to get child count in kernel are almost same,
> > add a helper to implement this function for dt to use.
>
> > diff --git a/include/linux/of.h b/include/linux/of.h
>
> > +static inline int of_get_child_count(const struct device_node *np)
> > +{
> > + struct device_node *child = NULL;
>
> You don't actually need to initialize child here. It doesn't really
> matter here, but in a more complex function, it might hide a
> used-before-initialized error.
>
Correct, i could change it.
Regards
Dong Aisheng
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v5 1/1] dt: add of_get_child_count helper function
2012-04-27 3:28 ` Dong Aisheng
@ 2012-04-27 3:36 ` Dong Aisheng
2012-04-27 15:25 ` Stephen Warren
2012-05-01 23:05 ` Linus Walleij
0 siblings, 2 replies; 34+ messages in thread
From: Dong Aisheng @ 2012-04-27 3:36 UTC (permalink / raw)
To: linux-arm-kernel
From: Dong Aisheng <dong.aisheng@linaro.org>
Currently most code to get child count in kernel are almost same,
add a helper to implement this function for dt to use.
Cc: Grant Likely <grant.likely@secretlab.ca>
Acked-by: Rob Herring <rob.herring@calxeda.com>
Signed-off-by: Dong Aisheng <dong.aisheng@linaro.org>
---
Rob missed this patch for 3.4 kernel.
Based on Rob's suggestion, we can get it go in with pinctrl driver.
Since Rob once had applied it, i added Rob's ack.
See:
https://lkml.org/lkml/2012/4/14/239
changes v4->v5:
* do not initialize child node pointer based on Stephen's suggestion.
changes v3->v4:
* addressed Grant's suggestion to use for_each_child_of_node.
changes v2->v3:
Addressed some people's comments:
* do not use assignment as expression
* return 0 for non-dt case
Changes v1->v2:
* change the name from of_get_child_number to of_get_child_count
---
include/linux/of.h | 16 ++++++++++++++++
1 files changed, 16 insertions(+), 0 deletions(-)
diff --git a/include/linux/of.h b/include/linux/of.h
index e3f942d..2ec1083 100644
--- a/include/linux/of.h
+++ b/include/linux/of.h
@@ -193,6 +193,17 @@ extern struct device_node *of_get_next_child(const struct device_node *node,
for (child = of_get_next_child(parent, NULL); child != NULL; \
child = of_get_next_child(parent, child))
+static inline int of_get_child_count(const struct device_node *np)
+{
+ struct device_node *child;
+ int num = 0;
+
+ for_each_child_of_node(np, child)
+ num++;
+
+ return num;
+}
+
extern struct device_node *of_find_node_with_property(
struct device_node *from, const char *prop_name);
#define for_each_node_with_property(dn, prop_name) \
@@ -300,6 +311,11 @@ static inline bool of_have_populated_dt(void)
#define for_each_child_of_node(parent, child) \
while (0)
+static inline int of_get_child_count(const struct device_node *np)
+{
+ return 0;
+}
+
static inline int of_device_is_compatible(const struct device_node *device,
const char *name)
{
--
1.7.0.4
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [PATCH v3 2/4] pinctrl: pinctrl-imx: add imx pinctrl core driver
2012-04-26 14:44 ` Jean-Christophe PLAGNIOL-VILLARD
2012-04-26 15:15 ` Jean-Christophe PLAGNIOL-VILLARD
@ 2012-04-27 3:48 ` Dong Aisheng
2012-04-27 6:31 ` Jean-Christophe PLAGNIOL-VILLARD
2012-04-27 7:30 ` Sascha Hauer
2 siblings, 1 reply; 34+ messages in thread
From: Dong Aisheng @ 2012-04-27 3:48 UTC (permalink / raw)
To: linux-arm-kernel
On Thu, Apr 26, 2012 at 10:44:46PM +0800, Jean-Christophe PLAGNIOL-VILLARD wrote:
> On 22:40 Thu 26 Apr , Dong Aisheng wrote:
> > From: Dong Aisheng <dong.aisheng@linaro.org>
> >
> > The driver has mux and config support while the gpio is still
> > not supported.
> > For select input setting, the driver will handle it internally
> > and do not need user to take care of it.
> >
> > The pinctrl-imx core driver will parse the dts file and dynamically
> > create the pinmux functions and groups.
> >
> > Each IMX SoC pinctrl driver should register pins with a pin register map
> > including mux register and config register and select input map to core
> > for proper operations.
> >
> > Signed-off-by: Dong Aisheng <dong.aisheng@linaro.org>
> >
> > ---
> > ChangeLog: v2->v3:
> > * add missed SION bit set from device tree
> > Thanks for Richard Zhao's reminder.
> > ChangeLog: v1->v2:
> > * Change the binding a bit.
> > For fsl,pins property, change it from pin name strings to pin function id
> > which represents a pin working on a specific function. Then we can remove
> > fsl,mux property since the pin function id already contains the mux setting.
> > Also remove other pin config property in the first patch.
> > Because in the future, we will switch to use dtc macro, then using a lot of
> > propertys to represent the each pin config like pull, speed and etc seems
> > needless.
> > Then each pin entry in dts file becomes a pair of PIN_FUNC_ID and CONFIG:
> > fsl,pins = <PIN_FUNC_ID CONFIG ..>
> > See binding doc for details.
> > * Sascha raised a question that pins in the same group may have different
> > pad setting for example I2C_CLK needs pull up while I2C_DAT not.
> > The v1 driver can aslo handle this issue but needs split the different
> > pad setting pins into different groups which loses a bit flexibility.
> > Also suggested by Richard Zhao and Jason Liu, we may still want the iomux
> > v3 simililar using way that allows each pin has the abiblity to configure
> > its pad which seems reasonable because from HW point of view, FSL IMX are
> > indeed pin based SoC which should be able to set per pin.
> > So the main changes in this v2 patch are change to support per pin config.
> > Then the using of iomux is almost the same as the existing iomux v3 for
> > non dt imx platforms. See binding doc for example.
> >
> > After introduce the new way, there're mainly two known issues:
> > 1) Since many pins in the same group may have the same pad config setting,
> > thus there may be some data redundance, however, since it's one word
> > and it's purely describe hw i would think it's not a big issue.
> > 2) Need a magic number to indicate no pad config need. In current iomux v3,
> > It's 1<<16 which is not used by IMX5, i used 1<<31 for both MX5 and MX6.
> > However, it's definitely possibile that in the future, the bit 31 may also
> > be used, that means we may need change the binding doc or just handle it in
> > driver for different SoCs.
> > 3) Due to core limitation, the current pinconf_group_set/get only support
> > get/set the same config(a u32 value)for all the pins in the same group,
> > so i removed the imx_group_set/get functions support, instead, using
> > imx_pin_get/set.
> > About this limitation, we may need some futher discussion on if we may
> > need to enhance it to be more flexible to support configure different
> > pins in the same group.
> > * Refactor probe handling based on Stephen's suggestion.
> > * Enhanced the binding doc and split it into two part, pinctrl-imx common part
> > and pinctrl-soc driver part.
> > * Change functions name from imx_pmx_* to imx_pinctrl_*.
> > * Other fixes based on Sascha, Stephen, Linus, Shawn's comments.
> > ---
> > .../bindings/pinctrl/fsl,imx-pinctrl.txt | 93 +++
> > drivers/pinctrl/Kconfig | 5 +
> > drivers/pinctrl/Makefile | 1 +
> > drivers/pinctrl/pinctrl-imx.c | 627 ++++++++++++++++++++
> > drivers/pinctrl/pinctrl-imx.h | 106 ++++
> > 5 files changed, 832 insertions(+), 0 deletions(-)
> > create mode 100644 Documentation/devicetree/bindings/pinctrl/fsl,imx-pinctrl.txt
> > create mode 100644 drivers/pinctrl/pinctrl-imx.c
> > create mode 100644 drivers/pinctrl/pinctrl-imx.h
> >
> > diff --git a/Documentation/devicetree/bindings/pinctrl/fsl,imx-pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/fsl,imx-pinctrl.txt
> > new file mode 100644
> > index 0000000..e00c7fc
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/pinctrl/fsl,imx-pinctrl.txt
> > @@ -0,0 +1,93 @@
> > +* Freescale IOMUX Controller (IOMUXC) for i.MX
> > +
> > +The IOMUX Controller (IOMUXC), together with the IOMUX, enables the IC
> > +to share one PAD to several functional blocks. The sharing is done by
> > +multiplexing the PAD input/output signals. For each PAD there are up to
> > +8 muxing options (called ALT modes). Since different modules require
> > +different PAD settings (like pull up, keeper, etc) the IOMUXC controls
> > +also the PAD settings parameters.
> > +
> > +Please refer to pinctrl-bindings.txt in this directory for details of the
> > +common pinctrl bindings used by client devices, including the meaning of the
> > +phrase "pin configuration node".
> > +
> > +Freescale IMX pin configuration node is a node of a group of pins which can be
> > +used for a specific device or function. This node represents both mux and config
> > +of the pins in that group. The 'mux' selects the function mode(also named mux
> > +mode) this pin can work on and the 'config' configures various pad settings
> > +such as pull-up, open drain, drive strength, etc.
> > +
> > +Required properties for iomux controller:
> > +- compatible: "fsl,<soc>-iomuxc"
> > + Please refer to each fsl,<soc>-pinctrl.txt binding doc for supported SoCs.
> > +
> > +Required properties for pin configuration node:
> > +- fsl,pins: two integers array, represents a group of pins mux and config
> > + setting. The format is fsl,pins = <PIN_FUNC_ID CONFIG>, PIN_FUNC_ID is a
> > + pin working on a specific function, CONFIG is the pad setting value like
> > + pull-up on this pin. Please refer to fsl,<soc>-pinctrl.txt for the valid
> > + pins and functions of each SoC.
> > +
> > +Bits used for CONFIG:
> > +NO_PAD_CTL(1 << 31): indicate this pin does not need config.
> > +
> > +SION(1 << 30): Software Input On Field.
> > +Force the selected mux mode input path no matter of MUX_MODE functionality.
> > +By default the input path is determined by functionality of the selected
> > +mux mode (regular).
> > +
> > +Other bits are used for PAD setting.
> > +
> > +NOTE:
> > +Some requirements for using fsl,imx-pinctrl binding:
> > +1. We have pin function node defined under iomux controller node to represent
> > + what pinmux functions this SoC supports.
> > +2. The pin configuration node intends to work on a specific function should
> > + to be defined under that specific function node.
> > + The function node's name should represent well about what function
> > + this group of pins in this pin configuration node are working on.
> > +3. The driver can use the function node's name and pin configuration node's
> > + name describe the pin function and group hierarchy.
> > + For example, Linux IMX pinctrl driver takes the function node's name
> > + as the function name and pin configuration node's name as group name to
> > + create the map table.
> > +4. Each pin configuration node should have a phandle, devices can set pins
> > + configurations by referring to the phandle of that pin configuration node.
> > +
> > +Examples:
> > +usdhc at 0219c000 { /* uSDHC4 */
> > + fsl,card-wired;
> > + vmmc-supply = <®_3p3v>;
> > + status = "okay";
> > + pinctrl-names = "default";
> > + pinctrl-0 = <&pinctrl_usdhc4_1>;
> > +};
> > +
> > +iomuxc at 020e0000 {
> > + compatible = "fsl,imx6q-iomuxc";
> > + reg = <0x020e0000 0x4000>;
> > +
> > + /* shared pinctrl settings */
> > + usdhc4 {
> > + pinctrl_usdhc4_1: usdhc4grp-1 {
> > + fsl,pins = <1386 0x17059 /* MX6Q_PAD_SD4_CMD__USDHC4_CMD */
> > + 1392 0x17059 /* MX6Q_PAD_SD4_CLK__USDHC4_CLK */
> > + 1462 0x17059 /* MX6Q_PAD_SD4_DAT0__USDHC4_DAT0 */
> > + 1470 0x17059 /* MX6Q_PAD_SD4_DAT1__USDHC4_DAT1 */
> > + 1478 0x17059 /* MX6Q_PAD_SD4_DAT2__USDHC4_DAT2 */
> > + 1486 0x17059 /* MX6Q_PAD_SD4_DAT3__USDHC4_DAT3 */
> > + 1493 0x17059 /* MX6Q_PAD_SD4_DAT4__USDHC4_DAT4 */
> > + 1501 0x17059 /* MX6Q_PAD_SD4_DAT5__USDHC4_DAT5 */
> > + 1509 0x17059 /* MX6Q_PAD_SD4_DAT6__USDHC4_DAT6 */
> > + 1517 0x17059>; /* MX6Q_PAD_SD4_DAT7__USDHC4_DAT7 */
> honestly I don't like this it's obscure need to decode manually
>
> I propose to use phandle
>
> as example on uart you will want or not the rst/cts so you will have quite a
> lot of bindings
>
> so you can describe the pin configuration (function) and refer it by phandle
> in the group
>
Hmm, i can't say you're wrong.
What you suggested may be suitable for your SoCs, before i know more about your SoC
details, i may not comment too much.
The binding i used here basically follows the exist iomux v3 convention which we're
using for non dt platforms, i think most people working on fsl platform may would
want a similar using as before since iomux v3 is very easy to use for imx soc.
You can refer to: iomux-mx51.h.
After dt macro support is available(which is still in progress), we may
convert the raw data above to raw data then user do not need to decode
the setting anymore.
Regards
Dong Aisheng
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v3 2/4] pinctrl: pinctrl-imx: add imx pinctrl core driver
2012-04-26 14:40 ` [PATCH v3 2/4] pinctrl: pinctrl-imx: add imx pinctrl core driver Dong Aisheng
2012-04-26 14:44 ` Jean-Christophe PLAGNIOL-VILLARD
2012-04-26 14:44 ` Dong Aisheng
@ 2012-04-27 5:30 ` Shawn Guo
2012-04-27 8:54 ` Shawn Guo
3 siblings, 0 replies; 34+ messages in thread
From: Shawn Guo @ 2012-04-27 5:30 UTC (permalink / raw)
To: linux-arm-kernel
On Thu, Apr 26, 2012 at 10:40:25PM +0800, Dong Aisheng wrote:
> From: Dong Aisheng <dong.aisheng@linaro.org>
>
> The driver has mux and config support while the gpio is still
> not supported.
> For select input setting, the driver will handle it internally
> and do not need user to take care of it.
>
> The pinctrl-imx core driver will parse the dts file and dynamically
> create the pinmux functions and groups.
>
> Each IMX SoC pinctrl driver should register pins with a pin register map
> including mux register and config register and select input map to core
> for proper operations.
>
> Signed-off-by: Dong Aisheng <dong.aisheng@linaro.org>
>
Acked-by: Shawn Guo <shawn.guo@linaro.org>
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v3 3/4] pinctrl: pinctrl-imx: add imx6q pinctrl driver
[not found] ` <1335451227-27709-3-git-send-email-b29396@freescale.com>
@ 2012-04-27 5:35 ` Shawn Guo
2012-04-27 6:45 ` Sascha Hauer
1 sibling, 0 replies; 34+ messages in thread
From: Shawn Guo @ 2012-04-27 5:35 UTC (permalink / raw)
To: linux-arm-kernel
On Thu, Apr 26, 2012 at 10:40:26PM +0800, Dong Aisheng wrote:
> From: Dong Aisheng <dong.aisheng@linaro.org>
>
> Signed-off-by: Dong Aisheng <dong.aisheng@linaro.org>
Acked-by: Shawn Guo <shawn.guo@linaro.org>
> ---
> ChangeLog v1-v2:
> * add binding doc for pinctrl-imx6q
> * refactor the probe
> ---
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v3 2/4] pinctrl: pinctrl-imx: add imx pinctrl core driver
2012-04-26 15:15 ` Jean-Christophe PLAGNIOL-VILLARD
@ 2012-04-27 5:48 ` Shawn Guo
2012-04-27 6:28 ` Jean-Christophe PLAGNIOL-VILLARD
0 siblings, 1 reply; 34+ messages in thread
From: Shawn Guo @ 2012-04-27 5:48 UTC (permalink / raw)
To: linux-arm-kernel
On Thu, Apr 26, 2012 at 05:15:36PM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> We have on Imx mxc at91 and other SoC controler hich you configure per pin
>
> which means one pin have multiple function and the same function is on
> multiple pins
>
> so the groups are just a list of possible pins
>
> Instead of re-inventing bindings we do need to come with a common binding whre
> it's possible
>
> So instead I proppose (send in the v2) to use common way to describe the group
>
Let's see how many nodes we will have in device tree. For imx6q
example, there are 332 pins and each pin has up to 8 function selects.
We will end up with having 332 x 8 = 2656 sub nodes under node
"functions". Device tree simply cannot afford such a bloating.
Regards,
Shawn
> 1) we describe one function per pin
>
> functions {
> rxd_pb12 {
> atmel,pin-id = <44>;
> atmel,mux = <0>;
> };
>
> txd_pb13 {
> atmel,pin-id = <45>;
> atmel,pull = <2>;
> atmel,mux = <0>;
> };
>
> txd0_pb19 {
> atmel,pin-id = <51>;
> atmel,pull = <2>;
> atmel,mux = <0>;
> };
>
> rxd0_pb18 {
> atmel,pin-id = <50>;
> atmel,mux = <0>;
> };
>
> rts0_pb17 {
> atmel,pin-id = <49>;
> atmel,mux = <1>;
> };
>
> cts0_pb15 {
> atmel,pin-id = <47>;
> atmel,mux = <1>;
> };
> };
>
>
> advantage if you need to set a pull-up or any pin parameter different on your board
> you can overwrite it without re-creating a group
>
> This is controller specific
>
> and then we have the common bindings to describe the group
> by using phandle of the functions to describe the group
>
> groups {
> dbgu {
> pinctrl,functions = < &rxd_pb12
> &txd_pb13 >;
> };
>
> uart0_rxd_txd {
> pinctrl,functions = < &rxd0_pb18
> &txd0_pb19 >;
> };
>
> uart0_rts_cts {
> pinctrl,functions = < &rxd0_pb18
> &txd0_pb19
> &rts0_pb17
> &cts0_pb15 >;
> };
> };
>
> this will be handle by a generic code in c
>
> Best Regards,
> J.
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v3 2/4] pinctrl: pinctrl-imx: add imx pinctrl core driver
2012-04-27 5:48 ` Shawn Guo
@ 2012-04-27 6:28 ` Jean-Christophe PLAGNIOL-VILLARD
2012-04-27 7:25 ` Shawn Guo
0 siblings, 1 reply; 34+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-04-27 6:28 UTC (permalink / raw)
To: linux-arm-kernel
On 13:48 Fri 27 Apr , Shawn Guo wrote:
> On Thu, Apr 26, 2012 at 05:15:36PM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > We have on Imx mxc at91 and other SoC controler hich you configure per pin
> >
> > which means one pin have multiple function and the same function is on
> > multiple pins
> >
> > so the groups are just a list of possible pins
> >
> > Instead of re-inventing bindings we do need to come with a common binding whre
> > it's possible
> >
> > So instead I proppose (send in the v2) to use common way to describe the group
> >
> Let's see how many nodes we will have in device tree. For imx6q
> example, there are 332 pins and each pin has up to 8 function selects.
> We will end up with having 332 x 8 = 2656 sub nodes under node
> "functions". Device tree simply cannot afford such a bloating.
device tree can offord it
except you are going to have hundereds of duplicated pinctrl configuration
as different board will have different mux which is impossbile to maintain
either
and I do not expect we add all the configuration possible but just the common
one
Best Regards,
J.
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v3 2/4] pinctrl: pinctrl-imx: add imx pinctrl core driver
2012-04-27 3:48 ` Dong Aisheng
@ 2012-04-27 6:31 ` Jean-Christophe PLAGNIOL-VILLARD
0 siblings, 0 replies; 34+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-04-27 6:31 UTC (permalink / raw)
To: linux-arm-kernel
> > > + this group of pins in this pin configuration node are working on.
> > > +3. The driver can use the function node's name and pin configuration node's
> > > + name describe the pin function and group hierarchy.
> > > + For example, Linux IMX pinctrl driver takes the function node's name
> > > + as the function name and pin configuration node's name as group name to
> > > + create the map table.
> > > +4. Each pin configuration node should have a phandle, devices can set pins
> > > + configurations by referring to the phandle of that pin configuration node.
> > > +
> > > +Examples:
> > > +usdhc at 0219c000 { /* uSDHC4 */
> > > + fsl,card-wired;
> > > + vmmc-supply = <®_3p3v>;
> > > + status = "okay";
> > > + pinctrl-names = "default";
> > > + pinctrl-0 = <&pinctrl_usdhc4_1>;
> > > +};
> > > +
> > > +iomuxc at 020e0000 {
> > > + compatible = "fsl,imx6q-iomuxc";
> > > + reg = <0x020e0000 0x4000>;
> > > +
> > > + /* shared pinctrl settings */
> > > + usdhc4 {
> > > + pinctrl_usdhc4_1: usdhc4grp-1 {
> > > + fsl,pins = <1386 0x17059 /* MX6Q_PAD_SD4_CMD__USDHC4_CMD */
> > > + 1392 0x17059 /* MX6Q_PAD_SD4_CLK__USDHC4_CLK */
> > > + 1462 0x17059 /* MX6Q_PAD_SD4_DAT0__USDHC4_DAT0 */
> > > + 1470 0x17059 /* MX6Q_PAD_SD4_DAT1__USDHC4_DAT1 */
> > > + 1478 0x17059 /* MX6Q_PAD_SD4_DAT2__USDHC4_DAT2 */
> > > + 1486 0x17059 /* MX6Q_PAD_SD4_DAT3__USDHC4_DAT3 */
> > > + 1493 0x17059 /* MX6Q_PAD_SD4_DAT4__USDHC4_DAT4 */
> > > + 1501 0x17059 /* MX6Q_PAD_SD4_DAT5__USDHC4_DAT5 */
> > > + 1509 0x17059 /* MX6Q_PAD_SD4_DAT6__USDHC4_DAT6 */
> > > + 1517 0x17059>; /* MX6Q_PAD_SD4_DAT7__USDHC4_DAT7 */
> > honestly I don't like this it's obscure need to decode manually
> >
> > I propose to use phandle
> >
> > as example on uart you will want or not the rst/cts so you will have quite a
> > lot of bindings
> >
> > so you can describe the pin configuration (function) and refer it by phandle
> > in the group
> >
> Hmm, i can't say you're wrong.
> What you suggested may be suitable for your SoCs, before i know more about your SoC
> details, i may not comment too much.
>
> The binding i used here basically follows the exist iomux v3 convention which we're
> using for non dt platforms, i think most people working on fsl platform may would
> want a similar using as before since iomux v3 is very easy to use for imx soc.
> You can refer to: iomux-mx51.h.
>
> After dt macro support is available(which is still in progress), we may
> convert the raw data above to raw data then user do not need to decode
> the setting anymore.
this is not an excuse to duplicate bindings
Best Regards,
J.
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v3 3/4] pinctrl: pinctrl-imx: add imx6q pinctrl driver
[not found] ` <1335451227-27709-3-git-send-email-b29396@freescale.com>
2012-04-27 5:35 ` [PATCH v3 3/4] pinctrl: pinctrl-imx: add imx6q pinctrl driver Shawn Guo
@ 2012-04-27 6:45 ` Sascha Hauer
2012-04-27 7:16 ` Dong Aisheng
1 sibling, 1 reply; 34+ messages in thread
From: Sascha Hauer @ 2012-04-27 6:45 UTC (permalink / raw)
To: linux-arm-kernel
On Thu, Apr 26, 2012 at 10:40:26PM +0800, Dong Aisheng wrote:
> From: Dong Aisheng <dong.aisheng@linaro.org>
>
> Signed-off-by: Dong Aisheng <dong.aisheng@linaro.org>
> ---
> ChangeLog v1-v2:
> * add binding doc for pinctrl-imx6q
> * refactor the probe
> ---
> .../bindings/pinctrl/fsl,imx6q-pinctrl.txt | 1605 ++++++++++++++
> drivers/pinctrl/Kconfig | 8 +
> drivers/pinctrl/Makefile | 1 +
> drivers/pinctrl/pinctrl-imx6q.c | 2331 ++++++++++++++++++++
> 4 files changed, 3945 insertions(+), 0 deletions(-)
> create mode 100644 Documentation/devicetree/bindings/pinctrl/fsl,imx6q-pinctrl.txt
> create mode 100644 drivers/pinctrl/pinctrl-imx6q.c
>
> diff --git a/Documentation/devicetree/bindings/pinctrl/fsl,imx6q-pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/fsl,imx6q-pinctrl.txt
> new file mode 100644
> index 0000000..13d474f
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/pinctrl/fsl,imx6q-pinctrl.txt
> @@ -0,0 +1,1605 @@
> +* Freescale IMX6Q IOMUX Controller
> +
> +Please refer to fsl,imx-pinctrl.txt in this directory for common binding part
> +and usage.
> +
> +Required properties:
> +- compatible: "fsl,imx6q-iomuxc"
> +- fsl,pins: two integers array, represents a group of pins mux and config
> + setting. The format is fsl,pins = <PIN_FUNC_ID CONFIG>, PIN_FUNC_ID is a
> + pin working on a specific function, CONFIG is the pad setting value like
> + pull-up for this pin. Please refer to imx6q datasheet for the valid pad
> + config settings.
Wouldn't it make sense to document the CONFIG bits here? Something like
Pull keeper enabled (pke) (1 << 7)
...
Not all bits are available on all pins, refer to the datasheet...
Sascha
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v3 2/4] pinctrl: pinctrl-imx: add imx pinctrl core driver
2012-04-27 7:25 ` Shawn Guo
@ 2012-04-27 7:11 ` Jean-Christophe PLAGNIOL-VILLARD
2012-04-27 8:11 ` Shawn Guo
0 siblings, 1 reply; 34+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-04-27 7:11 UTC (permalink / raw)
To: linux-arm-kernel
On 15:25 Fri 27 Apr , Shawn Guo wrote:
> On Fri, Apr 27, 2012 at 08:28:16AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > On 13:48 Fri 27 Apr , Shawn Guo wrote:
> > > On Thu, Apr 26, 2012 at 05:15:36PM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > > > We have on Imx mxc at91 and other SoC controler hich you configure per pin
> > > >
> > > > which means one pin have multiple function and the same function is on
> > > > multiple pins
> > > >
> > > > so the groups are just a list of possible pins
> > > >
> > > > Instead of re-inventing bindings we do need to come with a common binding whre
> > > > it's possible
> > > >
> > > > So instead I proppose (send in the v2) to use common way to describe the group
> > > >
> > > Let's see how many nodes we will have in device tree. For imx6q
> > > example, there are 332 pins and each pin has up to 8 function selects.
> > > We will end up with having 332 x 8 = 2656 sub nodes under node
> > > "functions". Device tree simply cannot afford such a bloating.
> > device tree can offord it
> >
> No. Device tree maintainers has told that. Looking into the clock DT
> binding discussion, you will find that Grant does not like to have
> even 100~200 nodes to represent an entire clock tree in the DT.
>
> With your proposal (actually this has been proposed long time before),
> to represent the pins for a 24bit display, it easily consumes 28 nodes
> on mach-mxs, while my binding only needs one node. So in short, the
> proposal has been discussed and it's not a sensible one.
except duplicate bindings instead having common one make no sense either
so imx, at91 and ST (STB SoC and other does have the same type of pin IP
to not come with a common bindig means we are doint the same crap as before
with switch to DT
Best Regards,
J.
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v3 3/4] pinctrl: pinctrl-imx: add imx6q pinctrl driver
2012-04-27 6:45 ` Sascha Hauer
@ 2012-04-27 7:16 ` Dong Aisheng
0 siblings, 0 replies; 34+ messages in thread
From: Dong Aisheng @ 2012-04-27 7:16 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Apr 27, 2012 at 02:45:19PM +0800, Sascha Hauer wrote:
> On Thu, Apr 26, 2012 at 10:40:26PM +0800, Dong Aisheng wrote:
> > From: Dong Aisheng <dong.aisheng@linaro.org>
> >
> > Signed-off-by: Dong Aisheng <dong.aisheng@linaro.org>
> > ---
> > ChangeLog v1-v2:
> > * add binding doc for pinctrl-imx6q
> > * refactor the probe
> > ---
> > .../bindings/pinctrl/fsl,imx6q-pinctrl.txt | 1605 ++++++++++++++
> > drivers/pinctrl/Kconfig | 8 +
> > drivers/pinctrl/Makefile | 1 +
> > drivers/pinctrl/pinctrl-imx6q.c | 2331 ++++++++++++++++++++
> > 4 files changed, 3945 insertions(+), 0 deletions(-)
> > create mode 100644 Documentation/devicetree/bindings/pinctrl/fsl,imx6q-pinctrl.txt
> > create mode 100644 drivers/pinctrl/pinctrl-imx6q.c
> >
> > diff --git a/Documentation/devicetree/bindings/pinctrl/fsl,imx6q-pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/fsl,imx6q-pinctrl.txt
> > new file mode 100644
> > index 0000000..13d474f
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/pinctrl/fsl,imx6q-pinctrl.txt
> > @@ -0,0 +1,1605 @@
> > +* Freescale IMX6Q IOMUX Controller
> > +
> > +Please refer to fsl,imx-pinctrl.txt in this directory for common binding part
> > +and usage.
> > +
> > +Required properties:
> > +- compatible: "fsl,imx6q-iomuxc"
> > +- fsl,pins: two integers array, represents a group of pins mux and config
> > + setting. The format is fsl,pins = <PIN_FUNC_ID CONFIG>, PIN_FUNC_ID is a
> > + pin working on a specific function, CONFIG is the pad setting value like
> > + pull-up for this pin. Please refer to imx6q datasheet for the valid pad
> > + config settings.
>
> Wouldn't it make sense to document the CONFIG bits here? Something like
>
> Pull keeper enabled (pke) (1 << 7)
> ...
>
Yes, it makes sense for me to add it.
> Not all bits are available on all pins, refer to the datasheet...
>
Regards
Dong Aisheng
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v3 2/4] pinctrl: pinctrl-imx: add imx pinctrl core driver
2012-04-27 6:28 ` Jean-Christophe PLAGNIOL-VILLARD
@ 2012-04-27 7:25 ` Shawn Guo
2012-04-27 7:11 ` Jean-Christophe PLAGNIOL-VILLARD
0 siblings, 1 reply; 34+ messages in thread
From: Shawn Guo @ 2012-04-27 7:25 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Apr 27, 2012 at 08:28:16AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> On 13:48 Fri 27 Apr , Shawn Guo wrote:
> > On Thu, Apr 26, 2012 at 05:15:36PM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > > We have on Imx mxc at91 and other SoC controler hich you configure per pin
> > >
> > > which means one pin have multiple function and the same function is on
> > > multiple pins
> > >
> > > so the groups are just a list of possible pins
> > >
> > > Instead of re-inventing bindings we do need to come with a common binding whre
> > > it's possible
> > >
> > > So instead I proppose (send in the v2) to use common way to describe the group
> > >
> > Let's see how many nodes we will have in device tree. For imx6q
> > example, there are 332 pins and each pin has up to 8 function selects.
> > We will end up with having 332 x 8 = 2656 sub nodes under node
> > "functions". Device tree simply cannot afford such a bloating.
> device tree can offord it
>
No. Device tree maintainers has told that. Looking into the clock DT
binding discussion, you will find that Grant does not like to have
even 100~200 nodes to represent an entire clock tree in the DT.
With your proposal (actually this has been proposed long time before),
to represent the pins for a 24bit display, it easily consumes 28 nodes
on mach-mxs, while my binding only needs one node. So in short, the
proposal has been discussed and it's not a sensible one.
Regards,
Shawn
> except you are going to have hundereds of duplicated pinctrl configuration
> as different board will have different mux which is impossbile to maintain
> either
>
> and I do not expect we add all the configuration possible but just the common
> one
>
> Best Regards,
> J.
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v3 2/4] pinctrl: pinctrl-imx: add imx pinctrl core driver
2012-04-26 14:44 ` Jean-Christophe PLAGNIOL-VILLARD
2012-04-26 15:15 ` Jean-Christophe PLAGNIOL-VILLARD
2012-04-27 3:48 ` Dong Aisheng
@ 2012-04-27 7:30 ` Sascha Hauer
2 siblings, 0 replies; 34+ messages in thread
From: Sascha Hauer @ 2012-04-27 7:30 UTC (permalink / raw)
To: linux-arm-kernel
On Thu, Apr 26, 2012 at 04:44:46PM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > + fsl,pins = <1386 0x17059 /* MX6Q_PAD_SD4_CMD__USDHC4_CMD */
> > + 1392 0x17059 /* MX6Q_PAD_SD4_CLK__USDHC4_CLK */
> > + 1462 0x17059 /* MX6Q_PAD_SD4_DAT0__USDHC4_DAT0 */
> > + 1470 0x17059 /* MX6Q_PAD_SD4_DAT1__USDHC4_DAT1 */
> > + 1478 0x17059 /* MX6Q_PAD_SD4_DAT2__USDHC4_DAT2 */
> > + 1486 0x17059 /* MX6Q_PAD_SD4_DAT3__USDHC4_DAT3 */
> > + 1493 0x17059 /* MX6Q_PAD_SD4_DAT4__USDHC4_DAT4 */
> > + 1501 0x17059 /* MX6Q_PAD_SD4_DAT5__USDHC4_DAT5 */
> > + 1509 0x17059 /* MX6Q_PAD_SD4_DAT6__USDHC4_DAT6 */
> > + 1517 0x17059>; /* MX6Q_PAD_SD4_DAT7__USDHC4_DAT7 */
> honestly I don't like this it's obscure need to decode manually
>
> I propose to use phandle
>
> as example on uart you will want or not the rst/cts so you will have quite a
> lot of bindings
>
> so you can describe the pin configuration (function) and refer it by phandle
> in the group
I don't exactly know where are you aiming at. I think that you want a
collection of pin groups somewhere and want to refer to it in the device
nodes. No, please don't. There's no way to come up with a common group
needed for example for the IPU (image processing unit). What pins you
want to use here depends on the number of data lines you have on your
panel and what type of panel you have. You can always use the remaining
pins for somethin else. SPI is another example. The SPI unit has some
dedicated chip select lines. The exact number of used chip selects is
board specific.
Sascha
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v3 4/4] mmc: sdhci-imx-esdhc: convert to use pinctrl subsystem
2012-04-26 14:40 ` [PATCH v3 4/4] mmc: sdhci-imx-esdhc: convert to use pinctrl subsystem Dong Aisheng
2012-04-26 16:32 ` Stephen Warren
@ 2012-04-27 7:35 ` Sascha Hauer
2012-04-27 8:29 ` Dong Aisheng
1 sibling, 1 reply; 34+ messages in thread
From: Sascha Hauer @ 2012-04-27 7:35 UTC (permalink / raw)
To: linux-arm-kernel
On Thu, Apr 26, 2012 at 10:40:27PM +0800, Dong Aisheng wrote:
> From: Dong Aisheng <dong.aisheng@linaro.org>
>
> This driver is shared between many platforms. Currently only imx6q has
> pinctrl support, to avoid breaking other platforms that do not have pinctrl
> support to run this driver, enable pinctrl dummy state for them before
> they also convert to pinctrl subsystem.
>
> Signed-off-by: Dong Aisheng <dong.aisheng@linaro.org>
> ---
> This patch depends on:
> pinctrl: add pinctrl_provide_dummies interface for platforms to use
> http://www.spinics.net/lists/arm-kernel/msg171538.html
>
> ChangeLog v2->v3:
> * patch name updated.
> v1 name is ARM: imx6q: switch to use pinctrl driver
> * using pinctrl dummy state to avoid breaking other platforms to use this
> driver.
>
> ChangeLog v1->v2:
> * using updated binding
> ---
> arch/arm/boot/dts/imx6q-arm2.dts | 4 +++
> arch/arm/boot/dts/imx6q.dtsi | 32 ++++++++++++++++++++++++
> arch/arm/mach-imx/Kconfig | 2 +
> arch/arm/mach-imx/eukrea_mbimxsd35-baseboard.c | 2 +
> arch/arm/mach-imx/mach-cpuimx51.c | 2 +
> arch/arm/mach-imx/mach-cpuimx51sd.c | 2 +
> arch/arm/mach-imx/mach-eukrea_cpuimx25.c | 2 +
> arch/arm/mach-imx/mach-mx25_3ds.c | 2 +
> arch/arm/mach-imx/mach-mx35_3ds.c | 2 +
> arch/arm/mach-imx/mach-mx51_3ds.c | 2 +
> arch/arm/mach-imx/mach-mx51_babbage.c | 2 +
> arch/arm/mach-imx/mach-mx51_efikamx.c | 2 +
> arch/arm/mach-imx/mach-mx51_efikasb.c | 2 +
> arch/arm/mach-imx/mach-mx53_ard.c | 2 +
> arch/arm/mach-imx/mach-mx53_evk.c | 2 +
> arch/arm/mach-imx/mach-mx53_loco.c | 2 +
> arch/arm/mach-imx/mach-mx53_smd.c | 2 +
> arch/arm/mach-imx/mach-pcm043.c | 2 +
> arch/arm/mach-imx/mach-vpr200.c | 2 +
Here you are patching only the boards which happen to use the esdhc
controller, so we need to patch other boards when another driver gains
pinctrl. Let's add the provide_dummies call to the SoCs instead which
do not have pinctrl yet.
Sascha
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v3 2/4] pinctrl: pinctrl-imx: add imx pinctrl core driver
2012-04-27 7:11 ` Jean-Christophe PLAGNIOL-VILLARD
@ 2012-04-27 8:11 ` Shawn Guo
2012-04-27 9:29 ` Jean-Christophe PLAGNIOL-VILLARD
0 siblings, 1 reply; 34+ messages in thread
From: Shawn Guo @ 2012-04-27 8:11 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Apr 27, 2012 at 09:11:04AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> except duplicate bindings instead having common one make no sense either
>
> so imx, at91 and ST (STB SoC and other does have the same type of pin IP
>
> to not come with a common bindig means we are doint the same crap as before
>
> with switch to DT
>
It can be every different in hardware details from one pin based
controller to another. mxs pinctrl is another pin based IP, and Dong
tried to approach a binding working good for both imx and mxs, but in
the end we agree imx binding does not work so good for mxs, and vice
versa. And that's why pinctrl core binding design leaves out the
platform specific binding.
--
Regards,
Shawn
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v3 4/4] mmc: sdhci-imx-esdhc: convert to use pinctrl subsystem
2012-04-27 8:29 ` Dong Aisheng
@ 2012-04-27 8:26 ` Shawn Guo
2012-04-27 8:31 ` Sascha Hauer
1 sibling, 0 replies; 34+ messages in thread
From: Shawn Guo @ 2012-04-27 8:26 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Apr 27, 2012 at 04:29:31PM +0800, Dong Aisheng wrote:
> You meant add provide_dummies call in imx*_soc_init call?
> We could do it but there might be a case that some boards are converted
> to use pinctrl while others still not but they're based on the same soc.
> For examples, 4 mx53 boards and we may not be able to convert them all at
> the same time.
>
Only non-DT boot will call imx*_soc_init, while DT boot will not. And
imx pinctrl only supports DT.
--
Regards,
Shawn
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v3 4/4] mmc: sdhci-imx-esdhc: convert to use pinctrl subsystem
2012-04-27 7:35 ` Sascha Hauer
@ 2012-04-27 8:29 ` Dong Aisheng
2012-04-27 8:26 ` Shawn Guo
2012-04-27 8:31 ` Sascha Hauer
0 siblings, 2 replies; 34+ messages in thread
From: Dong Aisheng @ 2012-04-27 8:29 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Apr 27, 2012 at 03:35:04PM +0800, Sascha Hauer wrote:
> On Thu, Apr 26, 2012 at 10:40:27PM +0800, Dong Aisheng wrote:
> > From: Dong Aisheng <dong.aisheng@linaro.org>
> >
> > This driver is shared between many platforms. Currently only imx6q has
> > pinctrl support, to avoid breaking other platforms that do not have pinctrl
> > support to run this driver, enable pinctrl dummy state for them before
> > they also convert to pinctrl subsystem.
> >
> > Signed-off-by: Dong Aisheng <dong.aisheng@linaro.org>
> > ---
> > This patch depends on:
> > pinctrl: add pinctrl_provide_dummies interface for platforms to use
> > http://www.spinics.net/lists/arm-kernel/msg171538.html
> >
> > ChangeLog v2->v3:
> > * patch name updated.
> > v1 name is ARM: imx6q: switch to use pinctrl driver
> > * using pinctrl dummy state to avoid breaking other platforms to use this
> > driver.
> >
> > ChangeLog v1->v2:
> > * using updated binding
> > ---
> > arch/arm/boot/dts/imx6q-arm2.dts | 4 +++
> > arch/arm/boot/dts/imx6q.dtsi | 32 ++++++++++++++++++++++++
> > arch/arm/mach-imx/Kconfig | 2 +
> > arch/arm/mach-imx/eukrea_mbimxsd35-baseboard.c | 2 +
> > arch/arm/mach-imx/mach-cpuimx51.c | 2 +
> > arch/arm/mach-imx/mach-cpuimx51sd.c | 2 +
> > arch/arm/mach-imx/mach-eukrea_cpuimx25.c | 2 +
> > arch/arm/mach-imx/mach-mx25_3ds.c | 2 +
> > arch/arm/mach-imx/mach-mx35_3ds.c | 2 +
> > arch/arm/mach-imx/mach-mx51_3ds.c | 2 +
> > arch/arm/mach-imx/mach-mx51_babbage.c | 2 +
> > arch/arm/mach-imx/mach-mx51_efikamx.c | 2 +
> > arch/arm/mach-imx/mach-mx51_efikasb.c | 2 +
> > arch/arm/mach-imx/mach-mx53_ard.c | 2 +
> > arch/arm/mach-imx/mach-mx53_evk.c | 2 +
> > arch/arm/mach-imx/mach-mx53_loco.c | 2 +
> > arch/arm/mach-imx/mach-mx53_smd.c | 2 +
> > arch/arm/mach-imx/mach-pcm043.c | 2 +
> > arch/arm/mach-imx/mach-vpr200.c | 2 +
>
> Here you are patching only the boards which happen to use the esdhc
> controller, so we need to patch other boards when another driver gains
Yes, theoretically, if a board does not have drivers running with pinctrl,
it may not need change.
There're so many boards under arch/arm/mach-imx/*:
b29396 at shlinux2:~/upstream/linux-pinctrl$ ls arch/arm/mach-imx/mach-
mach-apf9328.c mach-imx27_visstrim_m10.c mach-mx31lilly.c mach-mx51_efikamx.o mach-pcm037_eet.c
mach-armadillo5x0.c mach-imx6q.c mach-mx31lilly.o mach-mx51_efikasb.c mach-pcm037_eet.o
mach-armadillo5x0.o mach-imx6q.o mach-mx31lite.c mach-mx51_efikasb.o mach-pcm037.o
mach-bug.c mach-kzm_arm11_01.c mach-mx31lite.o mach-mx53_ard.c mach-pcm038.c
mach-bug.o mach-kzm_arm11_01.o mach-mx31moboard.c mach-mx53_ard.o mach-pcm043.c
mach-cpuimx27.c mach-mx1ads.c mach-mx31moboard.o mach-mx53_evk.c mach-pcm043.o
mach-cpuimx35.c mach-mx21ads.c mach-mx35_3ds.c mach-mx53_evk.o mach-qong.c
mach-cpuimx51.c mach-mx25_3ds.c mach-mx35_3ds.o mach-mx53_loco.c mach-qong.o
mach-cpuimx51.o mach-mx27_3ds.c mach-mx50_rdp.c mach-mx53_loco.o mach-scb9328.c
mach-cpuimx51sd.c mach-mx27ads.c mach-mx51_3ds.c mach-mx53_smd.c mach-vpr200.c
mach-cpuimx51sd.o mach-mx31_3ds.c mach-mx51_3ds.o mach-mx53_smd.o mach-vpr200.o
mach-eukrea_cpuimx25.c mach-mx31_3ds.o mach-mx51_babbage.c mach-mxt_td60.c
mach-imx27ipcam.c mach-mx31ads.c mach-mx51_babbage.o mach-pca100.c
mach-imx27lite.c mach-mx31ads.o mach-mx51_efikamx.c mach-pcm037.c
Some of them i'm not familiar and i don't know whether they may use pinctrl
so i just patched the affected ones.
One lazy method may be just patch all board files without pinctrl support
and it will not cause any error.
What's your suggestion?
> pinctrl. Let's add the provide_dummies call to the SoCs instead which
> do not have pinctrl yet.
>
You meant add provide_dummies call in imx*_soc_init call?
We could do it but there might be a case that some boards are converted
to use pinctrl while others still not but they're based on the same soc.
For examples, 4 mx53 boards and we may not be able to convert them all at
the same time.
Regards
Dong Aisheng
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v3 4/4] mmc: sdhci-imx-esdhc: convert to use pinctrl subsystem
2012-04-27 8:29 ` Dong Aisheng
2012-04-27 8:26 ` Shawn Guo
@ 2012-04-27 8:31 ` Sascha Hauer
2012-04-27 8:54 ` Dong Aisheng
1 sibling, 1 reply; 34+ messages in thread
From: Sascha Hauer @ 2012-04-27 8:31 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Apr 27, 2012 at 04:29:31PM +0800, Dong Aisheng wrote:
> mach-imx27ipcam.c mach-mx31ads.c mach-mx51_babbage.o mach-pca100.c
> mach-imx27lite.c mach-mx31ads.o mach-mx51_efikamx.c mach-pcm037.c
>
> Some of them i'm not familiar and i don't know whether they may use pinctrl
> so i just patched the affected ones.
>
> One lazy method may be just patch all board files without pinctrl support
> and it will not cause any error.
>
> What's your suggestion?
>
> > pinctrl. Let's add the provide_dummies call to the SoCs instead which
> > do not have pinctrl yet.
> >
> You meant add provide_dummies call in imx*_soc_init call?
> We could do it but there might be a case that some boards are converted
> to use pinctrl while others still not but they're based on the same soc.
> For examples, 4 mx53 boards and we may not be able to convert them all at
> the same time.
My point is that none of the mx5 boards have pinctrl since there is no
SoC driver for it.
For DT based boards pinctrl should be mandatory once the SoC has pinctrl
support. All non DT boards probably won't get pinctrl anyway.
Sascha
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v3 4/4] mmc: sdhci-imx-esdhc: convert to use pinctrl subsystem
2012-04-27 8:54 ` Dong Aisheng
@ 2012-04-27 8:47 ` Sascha Hauer
2012-04-27 9:13 ` Dong Aisheng
0 siblings, 1 reply; 34+ messages in thread
From: Sascha Hauer @ 2012-04-27 8:47 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Apr 27, 2012 at 04:54:46PM +0800, Dong Aisheng wrote:
> On Fri, Apr 27, 2012 at 04:31:42PM +0800, Sascha Hauer wrote:
> > On Fri, Apr 27, 2012 at 04:29:31PM +0800, Dong Aisheng wrote:
> > > mach-imx27ipcam.c mach-mx31ads.c mach-mx51_babbage.o mach-pca100.c
> > > mach-imx27lite.c mach-mx31ads.o mach-mx51_efikamx.c mach-pcm037.c
> > >
> > > Some of them i'm not familiar and i don't know whether they may use pinctrl
> > > so i just patched the affected ones.
> > >
> > > One lazy method may be just patch all board files without pinctrl support
> > > and it will not cause any error.
> > >
> > > What's your suggestion?
> > >
> > > > pinctrl. Let's add the provide_dummies call to the SoCs instead which
> > > > do not have pinctrl yet.
> > > >
> > > You meant add provide_dummies call in imx*_soc_init call?
> > > We could do it but there might be a case that some boards are converted
> > > to use pinctrl while others still not but they're based on the same soc.
> > > For examples, 4 mx53 boards and we may not be able to convert them all at
> > > the same time.
> >
> > My point is that none of the mx5 boards have pinctrl since there is no
> > SoC driver for it.
> > For DT based boards pinctrl should be mandatory once the SoC has pinctrl
> > support. All non DT boards probably won't get pinctrl anyway.
> >
> Ok, so i would be fine for me to change it in imx*_soc_init.
> BTW, there're:
> imx1_soc_init()
> imx25_soc_init()
> imx27_soc_init()
> imx31_soc_init()
> imx35_soc_init()
> imx50_soc_init()
> imx51_soc_init()
> imx53_soc_init()
>
> I'm not sure about mx1, mx27, mx31
> Do you think if i could add them all?
Of course. Or do you see a pinctrl driver for any i.MX except i.MX6?
Sascha
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v3 2/4] pinctrl: pinctrl-imx: add imx pinctrl core driver
2012-04-26 14:40 ` [PATCH v3 2/4] pinctrl: pinctrl-imx: add imx pinctrl core driver Dong Aisheng
` (2 preceding siblings ...)
2012-04-27 5:30 ` Shawn Guo
@ 2012-04-27 8:54 ` Shawn Guo
2012-04-27 11:24 ` Dong Aisheng
3 siblings, 1 reply; 34+ messages in thread
From: Shawn Guo @ 2012-04-27 8:54 UTC (permalink / raw)
To: linux-arm-kernel
On Thu, Apr 26, 2012 at 10:40:25PM +0800, Dong Aisheng wrote:
> +/**
> + * struct imx_pin_reg - describe a pin reg map
> + * The last 3 members are used for select input setting
> + * @pid: pin id
> + * @mux_reg: mux register offset
> + * @conf_reg: config register offset
> + * @mux_mode: mux mode
> + * @input_reg: select input register offset for this mux if any
> + * 0 if no select input setting needed.
> + * @input_val: the value set to select input register
> + */
> +struct imx_pin_reg {
> + unsigned int pid;
> + unsigned int mux_reg;
> + unsigned int conf_reg;
> + unsigned int mux_mode;
> + unsigned int input_reg;
> + unsigned int input_val;
> +};
Since the array of this struct is big, I would suggest define the type
of the members as size-efficient as possible, for example, u16 is enough
for pid, and reg offset, while u8 is enough for mux_mode?
--
Regards,
Shawn
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v3 4/4] mmc: sdhci-imx-esdhc: convert to use pinctrl subsystem
2012-04-27 8:31 ` Sascha Hauer
@ 2012-04-27 8:54 ` Dong Aisheng
2012-04-27 8:47 ` Sascha Hauer
0 siblings, 1 reply; 34+ messages in thread
From: Dong Aisheng @ 2012-04-27 8:54 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Apr 27, 2012 at 04:31:42PM +0800, Sascha Hauer wrote:
> On Fri, Apr 27, 2012 at 04:29:31PM +0800, Dong Aisheng wrote:
> > mach-imx27ipcam.c mach-mx31ads.c mach-mx51_babbage.o mach-pca100.c
> > mach-imx27lite.c mach-mx31ads.o mach-mx51_efikamx.c mach-pcm037.c
> >
> > Some of them i'm not familiar and i don't know whether they may use pinctrl
> > so i just patched the affected ones.
> >
> > One lazy method may be just patch all board files without pinctrl support
> > and it will not cause any error.
> >
> > What's your suggestion?
> >
> > > pinctrl. Let's add the provide_dummies call to the SoCs instead which
> > > do not have pinctrl yet.
> > >
> > You meant add provide_dummies call in imx*_soc_init call?
> > We could do it but there might be a case that some boards are converted
> > to use pinctrl while others still not but they're based on the same soc.
> > For examples, 4 mx53 boards and we may not be able to convert them all at
> > the same time.
>
> My point is that none of the mx5 boards have pinctrl since there is no
> SoC driver for it.
> For DT based boards pinctrl should be mandatory once the SoC has pinctrl
> support. All non DT boards probably won't get pinctrl anyway.
>
Ok, so i would be fine for me to change it in imx*_soc_init.
BTW, there're:
imx1_soc_init()
imx25_soc_init()
imx27_soc_init()
imx31_soc_init()
imx35_soc_init()
imx50_soc_init()
imx51_soc_init()
imx53_soc_init()
I'm not sure about mx1, mx27, mx31
Do you think if i could add them all?
Regards
Dong Aisheng
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v3 4/4] mmc: sdhci-imx-esdhc: convert to use pinctrl subsystem
2012-04-27 8:47 ` Sascha Hauer
@ 2012-04-27 9:13 ` Dong Aisheng
0 siblings, 0 replies; 34+ messages in thread
From: Dong Aisheng @ 2012-04-27 9:13 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Apr 27, 2012 at 04:47:44PM +0800, Sascha Hauer wrote:
> On Fri, Apr 27, 2012 at 04:54:46PM +0800, Dong Aisheng wrote:
> > On Fri, Apr 27, 2012 at 04:31:42PM +0800, Sascha Hauer wrote:
> > > On Fri, Apr 27, 2012 at 04:29:31PM +0800, Dong Aisheng wrote:
> > > > mach-imx27ipcam.c mach-mx31ads.c mach-mx51_babbage.o mach-pca100.c
> > > > mach-imx27lite.c mach-mx31ads.o mach-mx51_efikamx.c mach-pcm037.c
> > > >
> > > > Some of them i'm not familiar and i don't know whether they may use pinctrl
> > > > so i just patched the affected ones.
> > > >
> > > > One lazy method may be just patch all board files without pinctrl support
> > > > and it will not cause any error.
> > > >
> > > > What's your suggestion?
> > > >
> > > > > pinctrl. Let's add the provide_dummies call to the SoCs instead which
> > > > > do not have pinctrl yet.
> > > > >
> > > > You meant add provide_dummies call in imx*_soc_init call?
> > > > We could do it but there might be a case that some boards are converted
> > > > to use pinctrl while others still not but they're based on the same soc.
> > > > For examples, 4 mx53 boards and we may not be able to convert them all at
> > > > the same time.
> > >
> > > My point is that none of the mx5 boards have pinctrl since there is no
> > > SoC driver for it.
> > > For DT based boards pinctrl should be mandatory once the SoC has pinctrl
> > > support. All non DT boards probably won't get pinctrl anyway.
> > >
> > Ok, so i would be fine for me to change it in imx*_soc_init.
> > BTW, there're:
> > imx1_soc_init()
> > imx25_soc_init()
> > imx27_soc_init()
> > imx31_soc_init()
> > imx35_soc_init()
> > imx50_soc_init()
> > imx51_soc_init()
> > imx53_soc_init()
> >
> > I'm not sure about mx1, mx27, mx31
> > Do you think if i could add them all?
>
> Of course. Or do you see a pinctrl driver for any i.MX except i.MX6?
>
My understanding is that besides if have pinctrl driver, calling provide_dummies
also depends on whether it really has drivers using pinctrl.
Anyway, will update it soon.
Thanks for the confirm.
Regards
Dong Aisheng
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v3 2/4] pinctrl: pinctrl-imx: add imx pinctrl core driver
2012-04-27 8:11 ` Shawn Guo
@ 2012-04-27 9:29 ` Jean-Christophe PLAGNIOL-VILLARD
0 siblings, 0 replies; 34+ messages in thread
From: Jean-Christophe PLAGNIOL-VILLARD @ 2012-04-27 9:29 UTC (permalink / raw)
To: linux-arm-kernel
On 16:11 Fri 27 Apr , Shawn Guo wrote:
> On Fri, Apr 27, 2012 at 09:11:04AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > except duplicate bindings instead having common one make no sense either
> >
> > so imx, at91 and ST (STB SoC and other does have the same type of pin IP
> >
> > to not come with a common bindig means we are doint the same crap as before
> >
> > with switch to DT
> >
> It can be every different in hardware details from one pin based
> controller to another. mxs pinctrl is another pin based IP, and Dong
> tried to approach a binding working good for both imx and mxs, but in
> the end we agree imx binding does not work so good for mxs, and vice
> versa. And that's why pinctrl core binding design leaves out the
> platform specific binding.
agreed on the pin level configuration but not for the group management
there all the same
of simple group of pins
for this we must have a common way to describe it and handle it in c
Best Regards,
J.
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v3 2/4] pinctrl: pinctrl-imx: add imx pinctrl core driver
2012-04-27 8:54 ` Shawn Guo
@ 2012-04-27 11:24 ` Dong Aisheng
0 siblings, 0 replies; 34+ messages in thread
From: Dong Aisheng @ 2012-04-27 11:24 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Apr 27, 2012 at 04:54:05PM +0800, Shawn Guo wrote:
> On Thu, Apr 26, 2012 at 10:40:25PM +0800, Dong Aisheng wrote:
> > +/**
> > + * struct imx_pin_reg - describe a pin reg map
> > + * The last 3 members are used for select input setting
> > + * @pid: pin id
> > + * @mux_reg: mux register offset
> > + * @conf_reg: config register offset
> > + * @mux_mode: mux mode
> > + * @input_reg: select input register offset for this mux if any
> > + * 0 if no select input setting needed.
> > + * @input_val: the value set to select input register
> > + */
> > +struct imx_pin_reg {
> > + unsigned int pid;
> > + unsigned int mux_reg;
> > + unsigned int conf_reg;
> > + unsigned int mux_mode;
> > + unsigned int input_reg;
> > + unsigned int input_val;
> > +};
>
> Since the array of this struct is big, I would suggest define the type
> of the members as size-efficient as possible, for example, u16 is enough
> for pid, and reg offset, while u8 is enough for mux_mode?
>
Yes, reasonable.
Will change to that in v4.
Regards
Dong Aisheng
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v5 1/1] dt: add of_get_child_count helper function
2012-04-27 3:36 ` [PATCH v5 1/1] " Dong Aisheng
@ 2012-04-27 15:25 ` Stephen Warren
2012-05-01 23:05 ` Linus Walleij
1 sibling, 0 replies; 34+ messages in thread
From: Stephen Warren @ 2012-04-27 15:25 UTC (permalink / raw)
To: linux-arm-kernel
On 04/26/2012 09:36 PM, Dong Aisheng wrote:
> From: Dong Aisheng <dong.aisheng@linaro.org>
>
> Currently most code to get child count in kernel are almost same,
> add a helper to implement this function for dt to use.
>
> Cc: Grant Likely <grant.likely@secretlab.ca>
> Acked-by: Rob Herring <rob.herring@calxeda.com>
> Signed-off-by: Dong Aisheng <dong.aisheng@linaro.org>
Acked-by: Stephen Warren <swarren@wwwdotorg.org>
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH v5 1/1] dt: add of_get_child_count helper function
2012-04-27 3:36 ` [PATCH v5 1/1] " Dong Aisheng
2012-04-27 15:25 ` Stephen Warren
@ 2012-05-01 23:05 ` Linus Walleij
1 sibling, 0 replies; 34+ messages in thread
From: Linus Walleij @ 2012-05-01 23:05 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Apr 27, 2012 at 5:36 AM, Dong Aisheng <b29396@freescale.com> wrote:
> From: Dong Aisheng <dong.aisheng@linaro.org>
>
> Currently most code to get child count in kernel are almost same,
> add a helper to implement this function for dt to use.
>
> Cc: Grant Likely <grant.likely@secretlab.ca>
> Acked-by: Rob Herring <rob.herring@calxeda.com>
> Signed-off-by: Dong Aisheng <dong.aisheng@linaro.org>
>
> ---
> Rob missed this patch for 3.4 kernel.
> Based on Rob's suggestion, we can get it go in with pinctrl driver.
> Since Rob once had applied it, i added Rob's ack.
> See:
> https://lkml.org/lkml/2012/4/14/239
OK I've applied this to the pinctrl tree with Stephens ACK.
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 34+ messages in thread
end of thread, other threads:[~2012-05-01 23:05 UTC | newest]
Thread overview: 34+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-04-26 14:40 [PATCH v4 1/4] dt: add of_get_child_count helper function Dong Aisheng
2012-04-26 14:40 ` [PATCH v3 2/4] pinctrl: pinctrl-imx: add imx pinctrl core driver Dong Aisheng
2012-04-26 14:44 ` Jean-Christophe PLAGNIOL-VILLARD
2012-04-26 15:15 ` Jean-Christophe PLAGNIOL-VILLARD
2012-04-27 5:48 ` Shawn Guo
2012-04-27 6:28 ` Jean-Christophe PLAGNIOL-VILLARD
2012-04-27 7:25 ` Shawn Guo
2012-04-27 7:11 ` Jean-Christophe PLAGNIOL-VILLARD
2012-04-27 8:11 ` Shawn Guo
2012-04-27 9:29 ` Jean-Christophe PLAGNIOL-VILLARD
2012-04-27 3:48 ` Dong Aisheng
2012-04-27 6:31 ` Jean-Christophe PLAGNIOL-VILLARD
2012-04-27 7:30 ` Sascha Hauer
2012-04-26 14:44 ` Dong Aisheng
2012-04-27 5:30 ` Shawn Guo
2012-04-27 8:54 ` Shawn Guo
2012-04-27 11:24 ` Dong Aisheng
2012-04-26 14:40 ` [PATCH v3 4/4] mmc: sdhci-imx-esdhc: convert to use pinctrl subsystem Dong Aisheng
2012-04-26 16:32 ` Stephen Warren
2012-04-27 7:35 ` Sascha Hauer
2012-04-27 8:29 ` Dong Aisheng
2012-04-27 8:26 ` Shawn Guo
2012-04-27 8:31 ` Sascha Hauer
2012-04-27 8:54 ` Dong Aisheng
2012-04-27 8:47 ` Sascha Hauer
2012-04-27 9:13 ` Dong Aisheng
2012-04-26 16:24 ` [PATCH v4 1/4] dt: add of_get_child_count helper function Stephen Warren
2012-04-27 3:28 ` Dong Aisheng
2012-04-27 3:36 ` [PATCH v5 1/1] " Dong Aisheng
2012-04-27 15:25 ` Stephen Warren
2012-05-01 23:05 ` Linus Walleij
[not found] ` <1335451227-27709-3-git-send-email-b29396@freescale.com>
2012-04-27 5:35 ` [PATCH v3 3/4] pinctrl: pinctrl-imx: add imx6q pinctrl driver Shawn Guo
2012-04-27 6:45 ` Sascha Hauer
2012-04-27 7:16 ` Dong Aisheng
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).