* [PATCH 0/9] SH pinctrl DT support
@ 2013-01-04 0:40 Laurent Pinchart
2013-01-04 0:40 ` [PATCH 1/9] sh-pfc: Add OF support Laurent Pinchart
0 siblings, 1 reply; 6+ messages in thread
From: Laurent Pinchart @ 2013-01-04 0:40 UTC (permalink / raw)
To: linux-sh
Hello,
Here's a patch set that implements DT bindings for the SuperH and SH Mobile pin
controllers (PFC). The patches are based on my previous PFC pinctrl and pinmux
patch series ("[PATCH 00/22] SH pinctrl and pinmux implementation") and are
available from my git tree at
git://linuxtv.org/pinchartl/fbdev.git pinmux-dt
The series is pretty self-explanatory. DT bindings are added in patch 1/9, and
the following patches move board code over to the device tree. All patches
except 5/9 and 8/9 have already been posted in an older version as part of the
"[PATCH v2 00/77] SH pin control and GPIO rework with OF support" patch set.
To be perfectly honest I'm a bit unsure about the DT bindings. The platforms
that implement pinctrl DT bindings use a wide variety of architectures. I
haven't found clear guidelines regarding how those bindings should be
implemented (Documentation/devicetree/pinctrl just states that bindings are
driver-specific). Comments will be appreciated.
Laurent Pinchart (8):
sh-pfc: Add OF support
ARM: shmobile: r8a7740: Add pin control device in device tree
ARM: shmobile: armadillo: Populate platform devices from device tree
ARM: shmobile: armadillo: Move pinctrl mappings to device tree
ARM: shmobile: kzm9g: Add pin control device in device tree
ARM: shmobile: kzm9g: Populate platform devices from device tree
ARM: shmobile: kzm9g: Move pinctrl mappings to device tree
ARM: shmobile: kzm9g: Add LED1-LED4 to the device tree
Nobuhiro Iwamatsu (1):
ARM: shmobile: Include DTSI of r8a7740 to armadillo800eva
.../bindings/pinctrl/renesas,pfc-pinctrl.txt | 76 ++++++++++++++++++++
arch/arm/boot/dts/r8a7740-armadillo800eva.dts | 12 +++-
arch/arm/boot/dts/r8a7740.dtsi | 6 ++
arch/arm/boot/dts/sh73a0-kzm9g.dts | 28 +++++++-
arch/arm/boot/dts/sh73a0.dtsi | 32 ++++++++
arch/arm/mach-shmobile/board-armadillo800eva.c | 11 +---
arch/arm/mach-shmobile/board-kzm9g.c | 11 +---
drivers/pinctrl/sh-pfc/core.c | 62 +++++++++++++++-
drivers/pinctrl/sh-pfc/pinctrl.c | 54 ++++++++++++++
9 files changed, 270 insertions(+), 22 deletions(-)
create mode 100644 Documentation/devicetree/bindings/pinctrl/renesas,pfc-pinctrl.txt
create mode 100644 arch/arm/boot/dts/sh73a0.dtsi
--
Regards,
Laurent Pinchart
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH 1/9] sh-pfc: Add OF support 2013-01-04 0:40 [PATCH 0/9] SH pinctrl DT support Laurent Pinchart @ 2013-01-04 0:40 ` Laurent Pinchart 2013-01-04 1:12 ` Tony Prisk 0 siblings, 1 reply; 6+ messages in thread From: Laurent Pinchart @ 2013-01-04 0:40 UTC (permalink / raw) To: linux-sh Cc: Paul Mundt, Magnus Damm, Simon Horman, Linus Walleij, Kuninori Morimoto, Phil Edworthy, Nobuhiro Iwamatsu, Guennadi Liakhovetski, devicetree-discuss Support device instantiation through the device tree. The compatible property is used to select the SoC pinmux information. Set the gpio_chip device field to the PFC device to enable automatic GPIO OF support. Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> Cc: devicetree-discuss@lists.ozlabs.org --- .../bindings/pinctrl/renesas,pfc-pinctrl.txt | 76 ++++++++++++++++++++ drivers/pinctrl/sh-pfc/core.c | 62 +++++++++++++++- drivers/pinctrl/sh-pfc/pinctrl.c | 54 ++++++++++++++ 3 files changed, 190 insertions(+), 2 deletions(-) create mode 100644 Documentation/devicetree/bindings/pinctrl/renesas,pfc-pinctrl.txt (Comment from the cover letter repeated here) To be perfectly honest I'm a bit unsure about the DT bindings. The platforms that implement pinctrl DT bindings use a wide variety of architectures. I haven't found clear guidelines regarding how those bindings should be implemented (Documentation/devicetree/pinctrl just states that bindings are driver-specific). Comments will be appreciated. diff --git a/Documentation/devicetree/bindings/pinctrl/renesas,pfc-pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/renesas,pfc-pinctrl.txt new file mode 100644 index 0000000..aa41bbe --- /dev/null +++ b/Documentation/devicetree/bindings/pinctrl/renesas,pfc-pinctrl.txt @@ -0,0 +1,76 @@ +* Renesas GPIO and Pin Mux/Config controller + +Required Properties: +- compatible: should be one of the following. + - "renesas,pfc-r8a7740": for R8A7740 (R-Mobile A1) compatible pin-controller. + - "renesas,pfc-r8a7779": for R8A7779 (R-Car H1) compatible pin-controller. + - "renesas,pfc-sh7372": for SH7372 (SH-Mobile AP4) compatible pin-controller. + - "renesas,pfc-sh73a0": for SH73A0 (SH-Mobile AG5) compatible pin-controller. + +- reg: Base address and length of each memory resource used by the pin + controller hardware module. + +- gpio-controller: Marks the device node as a gpio controller. + +- #gpio-cells: Should be 2. The first cell is the pin number and the second cell + is used to specify optional parameters (currently unused). + + +The PFC node also acts as a container for pin control maps represented as +subnodes. Each subnode contains a function name and one or more pin or pin group +name. The subnode names are ignored, all subnodes are parsed through phandles +and processed purely based on their content. + +Required Subnode Properties: +- renesas,pins : An array of strings. Each string contains the name of a pin or + pin group. +- renesas,function: A string containing the name of the function to mux to the + pin or pin group. + + Valid values for group and function names can be found in the group and + function arrays of the PFC data file corresponding to the SoC + (drivers/pinctrl/spear/pfc-*.c) + +Please refer to pinctrl-bindings.txt in this directory for details of the common +pinctrl bindings used by client devices. + + +The syntax of the gpio specifier used by client nodes should be the following +with values derived from the SoC user manual. + + <[phandle of the gpio controller node] + [pin number within the gpio controller] + [flags and pull up/down]> + + +Example 1: SH73A0 (SH-Mobile AG5) pin controller node + + gpio: pfc@e6050000 { + compatible = "renesas,pfc-sh73a0"; + reg = <0xe6050000 0x8000>, + <0xe605801c 0x1c>; + gpio-controller; + #gpio-cells = <2>; + }; + +Example 2: A GPIO LED node that references a GPIO + + leds { + compatible = "gpio-leds"; + led1 { + gpios = <&gpio 20 1>; /* Active low */ + }; + }; + +Example 3: KZM-A9-GT (SH-Mobile AG5) default pin state and pin control maps + for the LCD device + + &gpio { + pinctrl-0 = <&lcd_pins>; + pinctrl-names = "default"; + + lcd_pins: pfc_lcd_pins { + renesas,pins = "lcd_data24", "lcd_sync"; + renesas,function = "lcd"; + }; + }; diff --git a/drivers/pinctrl/sh-pfc/core.c b/drivers/pinctrl/sh-pfc/core.c index 912b579..d0e8e77 100644 --- a/drivers/pinctrl/sh-pfc/core.c +++ b/drivers/pinctrl/sh-pfc/core.c @@ -19,6 +19,7 @@ #include <linux/ioport.h> #include <linux/kernel.h> #include <linux/module.h> +#include <linux/of_device.h> #include <linux/pinctrl/machine.h> #include <linux/platform_device.h> #include <linux/slab.h> @@ -510,8 +511,55 @@ int sh_pfc_config_gpio(struct sh_pfc *pfc, unsigned gpio, int pinmux_type, return sh_pfc_config_mux(pfc, mark, pinmux_type, cfg_mode); } +#ifdef CONFIG_OF +static const struct of_device_id sh_pfc_of_table[] = { +#ifdef CONFIG_PINCTRL_PFC_R8A7740 + { + .compatible = "renesas,pfc-r8a7740", + .data = &r8a7740_pinmux_info, + }, +#endif +#ifdef CONFIG_PINCTRL_PFC_R8A7779 + { + .compatible = "renesas,pfc-r8a7779", + .data = &r8a7779_pinmux_info, + }, +#endif +#ifdef CONFIG_PINCTRL_PFC_SH7367 + { + .compatible = "renesas,pfc-sh7367", + .data = &sh7367_pinmux_info, + }, +#endif +#ifdef CONFIG_PINCTRL_PFC_SH7372 + { + .compatible = "renesas,pfc-sh7372", + .data = &sh7372_pinmux_info, + }, +#endif +#ifdef CONFIG_PINCTRL_PFC_SH7377 + { + .compatible = "renesas,pfc-sh7377", + .data = &sh7377_pinmux_info, + }, +#endif +#ifdef CONFIG_PINCTRL_PFC_SH73A0 + { + .compatible = "renesas,pfc-sh73a0", + .data = &sh73a0_pinmux_info, + }, +#endif + { }, +}; +MODULE_DEVICE_TABLE(of, sh_pfc_of_table); +#endif + static int sh_pfc_probe(struct platform_device *pdev) { + const struct platform_device_id *platid = platform_get_device_id(pdev); +#ifdef CONFIG_OF + struct device_node *np = pdev->dev.of_node; +#endif struct sh_pfc_soc_info *info; struct sh_pfc *pfc; int ret; @@ -521,8 +569,15 @@ static int sh_pfc_probe(struct platform_device *pdev) */ BUILD_BUG_ON(PINMUX_FLAG_TYPE > ((1 << PINMUX_FLAG_DBIT_SHIFT) - 1)); - info = pdev->id_entry->driver_data - ? (void *)pdev->id_entry->driver_data : pdev->dev.platform_data; + if (platid) + info = (void *)platid->driver_data; +#ifdef CONFIG_OF + else if (np) + info = (void *)of_match_device(sh_pfc_of_table, &pdev->dev)->data; +#endif + else + info = pdev->dev.platform_data; + if (info = NULL) return -ENODEV; @@ -646,6 +701,9 @@ static struct platform_driver sh_pfc_driver = { .driver = { .name = DRV_NAME, .owner = THIS_MODULE, +#ifdef CONFIG_OF + .of_match_table = sh_pfc_of_table, +#endif }, }; diff --git a/drivers/pinctrl/sh-pfc/pinctrl.c b/drivers/pinctrl/sh-pfc/pinctrl.c index 6ee4105..78b78d2 100644 --- a/drivers/pinctrl/sh-pfc/pinctrl.c +++ b/drivers/pinctrl/sh-pfc/pinctrl.c @@ -15,7 +15,9 @@ #include <linux/err.h> #include <linux/init.h> #include <linux/module.h> +#include <linux/of.h> #include <linux/pinctrl/consumer.h> +#include <linux/pinctrl/machine.h> #include <linux/pinctrl/pinconf.h> #include <linux/pinctrl/pinconf-generic.h> #include <linux/pinctrl/pinctrl.h> @@ -65,11 +67,63 @@ static void sh_pfc_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s, seq_printf(s, "%s", DRV_NAME); } +static int sh_pfc_dt_node_to_map(struct pinctrl_dev *pctldev, + struct device_node *np, + struct pinctrl_map **map, unsigned *num_maps) +{ + struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev); + struct pinctrl_map *maps; + struct property *prop; + unsigned int index = 0; + const char *function; + const char *group; + int ret; + + ret = of_property_read_string(np, "renesas,function", &function); + if (ret < 0) { + dev_err(pmx->pfc->dev, "No function provided in DT\n"); + return ret; + } + + ret = of_property_count_strings(np, "renesas,pins"); + if (ret < 0) + return ret; + + if (!ret) { + dev_err(pmx->pfc->dev, "No pin(group) provided in DT node\n"); + return -ENODEV; + } + + maps = kzalloc(sizeof(*maps) * ret, GFP_KERNEL); + if (maps = NULL) + return -ENOMEM; + + of_property_for_each_string(np, "renesas,pins", prop, group) { + maps[index].type = PIN_MAP_TYPE_MUX_GROUP; + maps[index].data.mux.group = group; + maps[index].data.mux.function = function; + index++; + } + + *map = maps; + *num_maps = index; + + return 0; +} + +static void sh_pfc_dt_free_map(struct pinctrl_dev *pctldev, + struct pinctrl_map *map, unsigned num_maps) +{ + kfree(map); +} + static struct pinctrl_ops sh_pfc_pinctrl_ops = { .get_groups_count = sh_pfc_get_groups_count, .get_group_name = sh_pfc_get_group_name, .get_group_pins = sh_pfc_get_group_pins, .pin_dbg_show = sh_pfc_pin_dbg_show, + .dt_node_to_map = sh_pfc_dt_node_to_map, + .dt_free_map = sh_pfc_dt_free_map, }; static int sh_pfc_get_functions_count(struct pinctrl_dev *pctldev) -- 1.7.8.6 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 1/9] sh-pfc: Add OF support 2013-01-04 0:40 ` [PATCH 1/9] sh-pfc: Add OF support Laurent Pinchart @ 2013-01-04 1:12 ` Tony Prisk 2013-01-07 18:56 ` Laurent Pinchart 0 siblings, 1 reply; 6+ messages in thread From: Tony Prisk @ 2013-01-04 1:12 UTC (permalink / raw) To: Laurent Pinchart Cc: linux-sh, Simon Horman, Phil Edworthy, Kuninori Morimoto, devicetree-discuss, Magnus Damm, Paul Mundt, Nobuhiro Iwamatsu, Guennadi Liakhovetski On Fri, 2013-01-04 at 01:40 +0100, Laurent Pinchart wrote: > +- #gpio-cells: Should be 2. The first cell is the pin number and the second cell > + is used to specify optional parameters (currently unused). ... > + gpio: pfc@e6050000 { > + compatible = "renesas,pfc-sh73a0"; > + reg = <0xe6050000 0x8000>, > + <0xe605801c 0x1c>; > + gpio-controller; > + #gpio-cells = <2>; > + }; > + > +Example 2: A GPIO LED node that references a GPIO > + > + leds { > + compatible = "gpio-leds"; > + led1 { > + gpios = <&gpio 20 1>; /* Active low */ > + }; > + }; > + The second cell of gpio is '(currently unused)' but the example shows it being used? Regards Tony Prisk ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/9] sh-pfc: Add OF support 2013-01-04 1:12 ` Tony Prisk @ 2013-01-07 18:56 ` Laurent Pinchart 0 siblings, 0 replies; 6+ messages in thread From: Laurent Pinchart @ 2013-01-07 18:56 UTC (permalink / raw) To: Tony Prisk Cc: Laurent Pinchart, linux-sh, Simon Horman, Phil Edworthy, Kuninori Morimoto, devicetree-discuss, Magnus Damm, Paul Mundt, Nobuhiro Iwamatsu, Guennadi Liakhovetski Hi Tony, On Friday 04 January 2013 14:12:06 Tony Prisk wrote: > On Fri, 2013-01-04 at 01:40 +0100, Laurent Pinchart wrote: > > +- #gpio-cells: Should be 2. The first cell is the pin number and the > > second cell > > + is used to specify optional parameters (currently unused). > > ... > > > + gpio: pfc@e6050000 { > > + compatible = "renesas,pfc-sh73a0"; > > + reg = <0xe6050000 0x8000>, > > + <0xe605801c 0x1c>; > > + gpio-controller; > > + #gpio-cells = <2>; > > + }; > > + > > +Example 2: A GPIO LED node that references a GPIO > > + > > + leds { > > + compatible = "gpio-leds"; > > + led1 { > > + gpios = <&gpio 20 1>; /* Active low */ > > + }; > > + }; > > + > > The second cell of gpio is '(currently unused)' but the example shows it > being used? My bad. The second cell can be used to specify that the GPIO is active low. I'll fix the documentation accordingly. -- Regards, Laurent Pinchart ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2.1 0/9] SH pinctrl DT support
@ 2013-02-13 3:29 Simon Horman
2013-02-13 3:29 ` [PATCH 1/9] sh-pfc: Add OF support Simon Horman
0 siblings, 1 reply; 6+ messages in thread
From: Simon Horman @ 2013-02-13 3:29 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
this series is a follow-up to "[PATCH v2 0/8] SH pinctrl DT support"
by Laurent Pinchart. I am primarily posting it for his review.
This series differs from the series posted by Laurent in that:
* I have added the following two patch to update the KZM9G reference code.
ARM: shmobile: kzm9g: reference: Populate platform devices from device tree
The basis for this series is
git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas.git topic/pinmux-pfc-funcs
Which was posted as "[PATCH 00/21 v1.2] SCIF, I2C and FSI pinctrl
functions for sh73a0" a little earlier today.
Laurent, if you want to change this series in any way just let me know.
I can drop patches indidually or drop the entire series and add a fresh
one from you to the topic branch.
Git and diffstat information is provided below to aid review.
----------------------------------------------------------------
The following changes since commit e92460f4d0ce471110d44a3dc053f0a4508f24dc:
ARM: shmobile: r8a7779: Remove DU function GPIOs (2013-02-13 12:16:13 +0900)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas.git topic/pinmux-dt
for you to fetch changes up to 3ec7a99ff9723cafabf0eae2df9cac7df735f388:
ARM: shmobile: kzm9g: Move pinctrl mappings to device tree (2013-02-13 12:19:04 +0900)
----------------------------------------------------------------
Laurent Pinchart (8):
sh-pfc: Add OF support
ARM: shmobile: r8a7740: Add pin control device in device tree
ARM: shmobile: armadillo: Populate platform devices from device tree
ARM: shmobile: sh73a0: Add pin control device in device tree
ARM: shmobile: kzm9g: Populate platform devices from device tree
ARM: shmobile: kzm9g: Add LED1-LED4 to the device tree
ARM: shmobile: armadillo: Move pinctrl mappings to device tree
ARM: shmobile: kzm9g: Move pinctrl mappings to device tree
Simon Horman (1):
ARM: shmobile: kzm9g: reference: Populate platform devices from device tree
.../bindings/pinctrl/renesas,pfc-pinctrl.txt | 77 ++++++++++++++++++++
arch/arm/boot/dts/r8a7740-armadillo800eva.dts | 10 +++
arch/arm/boot/dts/r8a7740.dtsi | 8 ++
arch/arm/boot/dts/sh73a0-kzm9g-reference.dts | 12 +++
arch/arm/boot/dts/sh73a0-kzm9g.dts | 26 +++++++
arch/arm/boot/dts/sh73a0.dtsi | 8 ++
arch/arm/mach-shmobile/board-armadillo800eva.c | 14 +---
arch/arm/mach-shmobile/board-kzm9g-reference.c | 7 +-
arch/arm/mach-shmobile/board-kzm9g.c | 27 +------
drivers/pinctrl/sh-pfc/core.c | 62 +++++++++++++++-
drivers/pinctrl/sh-pfc/pinctrl.c | 54 ++++++++++++++
11 files changed, 261 insertions(+), 44 deletions(-)
create mode 100644 Documentation/devicetree/bindings/pinctrl/renesas,pfc-pinctrl.txt
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH 1/9] sh-pfc: Add OF support 2013-02-13 3:29 [PATCH v2.1 0/9] SH pinctrl DT support Simon Horman @ 2013-02-13 3:29 ` Simon Horman 2013-02-15 19:37 ` Linus Walleij 0 siblings, 1 reply; 6+ messages in thread From: Simon Horman @ 2013-02-13 3:29 UTC (permalink / raw) To: linux-arm-kernel From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> Support device instantiation through the device tree. The compatible property is used to select the SoC pinmux information. Set the gpio_chip device field to the PFC device to enable automatic GPIO OF support. Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> Cc: devicetree-discuss@lists.ozlabs.org Signed-off-by: Simon Horman <horms+renesas@verge.net.au> --- .../bindings/pinctrl/renesas,pfc-pinctrl.txt | 77 ++++++++++++++++++++ drivers/pinctrl/sh-pfc/core.c | 62 +++++++++++++++- drivers/pinctrl/sh-pfc/pinctrl.c | 54 ++++++++++++++ 3 files changed, 191 insertions(+), 2 deletions(-) create mode 100644 Documentation/devicetree/bindings/pinctrl/renesas,pfc-pinctrl.txt diff --git a/Documentation/devicetree/bindings/pinctrl/renesas,pfc-pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/renesas,pfc-pinctrl.txt new file mode 100644 index 0000000..77752c2 --- /dev/null +++ b/Documentation/devicetree/bindings/pinctrl/renesas,pfc-pinctrl.txt @@ -0,0 +1,77 @@ +* Renesas GPIO and Pin Mux/Config controller + +Required Properties: +- compatible: should be one of the following. + - "renesas,pfc-r8a7740": for R8A7740 (R-Mobile A1) compatible pin-controller. + - "renesas,pfc-r8a7779": for R8A7779 (R-Car H1) compatible pin-controller. + - "renesas,pfc-sh7372": for SH7372 (SH-Mobile AP4) compatible pin-controller. + - "renesas,pfc-sh73a0": for SH73A0 (SH-Mobile AG5) compatible pin-controller. + +- reg: Base address and length of each memory resource used by the pin + controller hardware module. + +- gpio-controller: Marks the device node as a gpio controller. + +- #gpio-cells: Should be 2. The first cell is the pin number and the second cell + is used to specify optional parameters as bit flags. Only the GPIO active low + flag (bit 0) is currently supported. + + +The PFC node also acts as a container for pin control maps represented as +subnodes. Each subnode contains a function name and one or more pin or pin group +name. The subnode names are ignored, all subnodes are parsed through phandles +and processed purely based on their content. + +Required Subnode Properties: +- renesas,pins : An array of strings. Each string contains the name of a pin or + pin group. +- renesas,function: A string containing the name of the function to mux to the + pin or pin group. + + Valid values for group and function names can be found in the group and + function arrays of the PFC data file corresponding to the SoC + (drivers/pinctrl/spear/pfc-*.c) + +Please refer to pinctrl-bindings.txt in this directory for details of the common +pinctrl bindings used by client devices. + + +The syntax of the gpio specifier used by client nodes should be the following +with values derived from the SoC user manual. + + <[phandle of the gpio controller node] + [pin number within the gpio controller] + [flags and pull up/down]> + + +Example 1: SH73A0 (SH-Mobile AG5) pin controller node + + gpio: pfc@e6050000 { + compatible = "renesas,pfc-sh73a0"; + reg = <0xe6050000 0x8000>, + <0xe605801c 0x1c>; + gpio-controller; + #gpio-cells = <2>; + }; + +Example 2: A GPIO LED node that references a GPIO + + leds { + compatible = "gpio-leds"; + led1 { + gpios = <&gpio 20 1>; /* Active low */ + }; + }; + +Example 3: KZM-A9-GT (SH-Mobile AG5) default pin state and pin control maps + for the LCD device + + &gpio { + pinctrl-0 = <&lcd_pins>; + pinctrl-names = "default"; + + lcd_pins: pfc_lcd_pins { + renesas,pins = "lcd_data24", "lcd_sync"; + renesas,function = "lcd"; + }; + }; diff --git a/drivers/pinctrl/sh-pfc/core.c b/drivers/pinctrl/sh-pfc/core.c index 912b579..d0e8e77 100644 --- a/drivers/pinctrl/sh-pfc/core.c +++ b/drivers/pinctrl/sh-pfc/core.c @@ -19,6 +19,7 @@ #include <linux/ioport.h> #include <linux/kernel.h> #include <linux/module.h> +#include <linux/of_device.h> #include <linux/pinctrl/machine.h> #include <linux/platform_device.h> #include <linux/slab.h> @@ -510,8 +511,55 @@ int sh_pfc_config_gpio(struct sh_pfc *pfc, unsigned gpio, int pinmux_type, return sh_pfc_config_mux(pfc, mark, pinmux_type, cfg_mode); } +#ifdef CONFIG_OF +static const struct of_device_id sh_pfc_of_table[] = { +#ifdef CONFIG_PINCTRL_PFC_R8A7740 + { + .compatible = "renesas,pfc-r8a7740", + .data = &r8a7740_pinmux_info, + }, +#endif +#ifdef CONFIG_PINCTRL_PFC_R8A7779 + { + .compatible = "renesas,pfc-r8a7779", + .data = &r8a7779_pinmux_info, + }, +#endif +#ifdef CONFIG_PINCTRL_PFC_SH7367 + { + .compatible = "renesas,pfc-sh7367", + .data = &sh7367_pinmux_info, + }, +#endif +#ifdef CONFIG_PINCTRL_PFC_SH7372 + { + .compatible = "renesas,pfc-sh7372", + .data = &sh7372_pinmux_info, + }, +#endif +#ifdef CONFIG_PINCTRL_PFC_SH7377 + { + .compatible = "renesas,pfc-sh7377", + .data = &sh7377_pinmux_info, + }, +#endif +#ifdef CONFIG_PINCTRL_PFC_SH73A0 + { + .compatible = "renesas,pfc-sh73a0", + .data = &sh73a0_pinmux_info, + }, +#endif + { }, +}; +MODULE_DEVICE_TABLE(of, sh_pfc_of_table); +#endif + static int sh_pfc_probe(struct platform_device *pdev) { + const struct platform_device_id *platid = platform_get_device_id(pdev); +#ifdef CONFIG_OF + struct device_node *np = pdev->dev.of_node; +#endif struct sh_pfc_soc_info *info; struct sh_pfc *pfc; int ret; @@ -521,8 +569,15 @@ static int sh_pfc_probe(struct platform_device *pdev) */ BUILD_BUG_ON(PINMUX_FLAG_TYPE > ((1 << PINMUX_FLAG_DBIT_SHIFT) - 1)); - info = pdev->id_entry->driver_data - ? (void *)pdev->id_entry->driver_data : pdev->dev.platform_data; + if (platid) + info = (void *)platid->driver_data; +#ifdef CONFIG_OF + else if (np) + info = (void *)of_match_device(sh_pfc_of_table, &pdev->dev)->data; +#endif + else + info = pdev->dev.platform_data; + if (info = NULL) return -ENODEV; @@ -646,6 +701,9 @@ static struct platform_driver sh_pfc_driver = { .driver = { .name = DRV_NAME, .owner = THIS_MODULE, +#ifdef CONFIG_OF + .of_match_table = sh_pfc_of_table, +#endif }, }; diff --git a/drivers/pinctrl/sh-pfc/pinctrl.c b/drivers/pinctrl/sh-pfc/pinctrl.c index 6ee4105..78b78d2 100644 --- a/drivers/pinctrl/sh-pfc/pinctrl.c +++ b/drivers/pinctrl/sh-pfc/pinctrl.c @@ -15,7 +15,9 @@ #include <linux/err.h> #include <linux/init.h> #include <linux/module.h> +#include <linux/of.h> #include <linux/pinctrl/consumer.h> +#include <linux/pinctrl/machine.h> #include <linux/pinctrl/pinconf.h> #include <linux/pinctrl/pinconf-generic.h> #include <linux/pinctrl/pinctrl.h> @@ -65,11 +67,63 @@ static void sh_pfc_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s, seq_printf(s, "%s", DRV_NAME); } +static int sh_pfc_dt_node_to_map(struct pinctrl_dev *pctldev, + struct device_node *np, + struct pinctrl_map **map, unsigned *num_maps) +{ + struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev); + struct pinctrl_map *maps; + struct property *prop; + unsigned int index = 0; + const char *function; + const char *group; + int ret; + + ret = of_property_read_string(np, "renesas,function", &function); + if (ret < 0) { + dev_err(pmx->pfc->dev, "No function provided in DT\n"); + return ret; + } + + ret = of_property_count_strings(np, "renesas,pins"); + if (ret < 0) + return ret; + + if (!ret) { + dev_err(pmx->pfc->dev, "No pin(group) provided in DT node\n"); + return -ENODEV; + } + + maps = kzalloc(sizeof(*maps) * ret, GFP_KERNEL); + if (maps = NULL) + return -ENOMEM; + + of_property_for_each_string(np, "renesas,pins", prop, group) { + maps[index].type = PIN_MAP_TYPE_MUX_GROUP; + maps[index].data.mux.group = group; + maps[index].data.mux.function = function; + index++; + } + + *map = maps; + *num_maps = index; + + return 0; +} + +static void sh_pfc_dt_free_map(struct pinctrl_dev *pctldev, + struct pinctrl_map *map, unsigned num_maps) +{ + kfree(map); +} + static struct pinctrl_ops sh_pfc_pinctrl_ops = { .get_groups_count = sh_pfc_get_groups_count, .get_group_name = sh_pfc_get_group_name, .get_group_pins = sh_pfc_get_group_pins, .pin_dbg_show = sh_pfc_pin_dbg_show, + .dt_node_to_map = sh_pfc_dt_node_to_map, + .dt_free_map = sh_pfc_dt_free_map, }; static int sh_pfc_get_functions_count(struct pinctrl_dev *pctldev) -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 1/9] sh-pfc: Add OF support 2013-02-13 3:29 ` [PATCH 1/9] sh-pfc: Add OF support Simon Horman @ 2013-02-15 19:37 ` Linus Walleij 0 siblings, 0 replies; 6+ messages in thread From: Linus Walleij @ 2013-02-15 19:37 UTC (permalink / raw) To: linux-arm-kernel On Wed, Feb 13, 2013 at 4:29 AM, Simon Horman <horms+renesas@verge.net.au> wrote: > From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> > > Support device instantiation through the device tree. The compatible > property is used to select the SoC pinmux information. > > Set the gpio_chip device field to the PFC device to enable automatic > GPIO OF support. > > Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> > Cc: devicetree-discuss@lists.ozlabs.org > Signed-off-by: Simon Horman <horms+renesas@verge.net.au> Looks good to me. Acked-by: Linus Walleij <linus.walleij@linaro.org> Yours, Linus Walleij ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2013-02-15 19:37 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-01-04 0:40 [PATCH 0/9] SH pinctrl DT support Laurent Pinchart 2013-01-04 0:40 ` [PATCH 1/9] sh-pfc: Add OF support Laurent Pinchart 2013-01-04 1:12 ` Tony Prisk 2013-01-07 18:56 ` Laurent Pinchart -- strict thread matches above, loose matches on Subject: below -- 2013-02-13 3:29 [PATCH v2.1 0/9] SH pinctrl DT support Simon Horman 2013-02-13 3:29 ` [PATCH 1/9] sh-pfc: Add OF support Simon Horman 2013-02-15 19:37 ` Linus Walleij
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).