pinctrl: Add SPEAr pinctrl support
Subsystems (5)
v2 cover pinctrl: Add SPEAr pinctrl support
This patchset replaces existing pinmux framework for SPEAr family of SoC with generic pinctrl framework.
V1->V2
- Earlier padmux support removed
- single patch for spear pinctrl drivers broken into two: one for spear and other for 3xx family
- add pinctrl support in arch/arm/mach-spear3xx/ and dts files
- pinctrl-spear.* made as library instead of platform driver
- pinctrl-spear300, spear310, spear320 are now platform drivers
- other minor fixes.
Viresh Kumar (4):
SPEAr: Remove existing padmux support for SPEAr
pinctrl: Add SPEAr pinctrl drivers
pinctrl: Add SPEAr3xx pinctrl drivers
SPEAr3xx: Add pinctrl support for boards
.../devicetree/bindings/pinmux/pinmux_spear.txt | 28 + MAINTAINERS | 23 +- arch/arm/boot/dts/spear300-evb.dts | 4 + arch/arm/boot/dts/spear300.dtsi | 5 + arch/arm/boot/dts/spear310.dtsi | 5 + arch/arm/boot/dts/spear320-evb.dts | 4 + arch/arm/boot/dts/spear320.dtsi | 7 +- arch/arm/mach-spear3xx/Kconfig | 3 + arch/arm/mach-spear3xx/include/mach/generic.h | 128 - arch/arm/mach-spear3xx/spear300.c | 408 +--- arch/arm/mach-spear3xx/spear310.c | 185 +- arch/arm/mach-spear3xx/spear320.c | 426 +--- arch/arm/mach-spear3xx/spear3xx.c | 425 --- arch/arm/plat-spear/Kconfig | 1 + arch/arm/plat-spear/Makefile | 2 +- arch/arm/plat-spear/include/plat/padmux.h | 92 - arch/arm/plat-spear/padmux.c | 164 - drivers/pinctrl/Kconfig | 2 + drivers/pinctrl/Makefile | 2 + drivers/pinctrl/spear/Kconfig | 34 + drivers/pinctrl/spear/Makefile | 7 + drivers/pinctrl/spear/pinctrl-spear.c | 301 ++ drivers/pinctrl/spear/pinctrl-spear.h | 142 + drivers/pinctrl/spear/pinctrl-spear300.c | 708 ++++ drivers/pinctrl/spear/pinctrl-spear310.c | 431 +++ drivers/pinctrl/spear/pinctrl-spear320.c | 3468 ++++++++++++++++++++ drivers/pinctrl/spear/pinctrl-spear3xx.c | 621 ++++ drivers/pinctrl/spear/pinctrl-spear3xx.h | 102 + 28 files changed, 5961 insertions(+), 1767 deletions(-) create mode 100644 Documentation/devicetree/bindings/pinmux/pinmux_spear.txt delete mode 100644 arch/arm/plat-spear/include/plat/padmux.h delete mode 100644 arch/arm/plat-spear/padmux.c create mode 100644 drivers/pinctrl/spear/Kconfig create mode 100644 drivers/pinctrl/spear/Makefile create mode 100644 drivers/pinctrl/spear/pinctrl-spear.c create mode 100644 drivers/pinctrl/spear/pinctrl-spear.h create mode 100644 drivers/pinctrl/spear/pinctrl-spear300.c create mode 100644 drivers/pinctrl/spear/pinctrl-spear310.c create mode 100644 drivers/pinctrl/spear/pinctrl-spear320.c create mode 100644 drivers/pinctrl/spear/pinctrl-spear3xx.c create mode 100644 drivers/pinctrl/spear/pinctrl-spear3xx.h
Signature · 1 line
1.7.9
PATCH v2 1/4 SPEAr: Remove existing padmux support for SPEAr
We must use pinctrl framework instead of defining per SoC pinmux drivers. This patch removes existing padmux support present for SPEAr platform.
--- arch/arm/mach-spear3xx/include/mach/generic.h | 128 -------- arch/arm/mach-spear3xx/spear300.c | 389 +---------------------- arch/arm/mach-spear3xx/spear310.c | 161 +---------- arch/arm/mach-spear3xx/spear320.c | 403 +----------------------- arch/arm/mach-spear3xx/spear3xx.c | 425 ------------------------- arch/arm/plat-spear/Makefile | 2 +- arch/arm/plat-spear/include/plat/padmux.h | 92 ------ arch/arm/plat-spear/padmux.c | 164 ---------- 8 files changed, 4 insertions(+), 1760 deletions(-) delete mode 100644 arch/arm/plat-spear/include/plat/padmux.h delete mode 100644 arch/arm/plat-spear/padmux.c
arch/arm/mach-spear3xx/include/mach/generic.h +0 -128
@@ -20,7 +20,6 @@#include <linux/amba/bus.h> #include <asm/mach/time.h> #include <asm/mach/map.h> -#include <plat/padmux.h> /* spear3xx declarations */ /*
@@ -43,147 +42,20 @@ void __init spear3xx_dt_init_irq(void);void spear_restart (char ,const char *); -/* pad mux declarations */ -#define PMX_FIRDA_MASK (1 << 14) -#define PMX_I2C_MASK (1 << 13) -#define PMX_SSP_CS_MASK (1 << 12) -#define PMX_SSP_MASK (1 << 11) -#define PMX_MII_MASK (1 << 10) -#define PMX_GPIO_PIN0_MASK (1 << 9) -#define PMX_GPIO_PIN1_MASK (1 << 8) -#define PMX_GPIO_PIN2_MASK (1 << 7) -#define PMX_GPIO_PIN3_MASK (1 << 6) -#define PMX_GPIO_PIN4_MASK (1 << 5) -#define PMX_GPIO_PIN5_MASK (1 << 4) -#define PMX_UART0_MODEM_MASK (1 << 3) -#define PMX_UART0_MASK (1 << 2) -#define PMX_TIMER_3_4_MASK (1 << 1) -#define PMX_TIMER_1_2_MASK (1 << 0) - -/* pad mux devices */ -extern struct pmx_dev spear3xx_pmx_firda; -extern struct pmx_dev spear3xx_pmx_i2c; -extern struct pmx_dev spear3xx_pmx_ssp_cs; -extern struct pmx_dev spear3xx_pmx_ssp; -extern struct pmx_dev spear3xx_pmx_mii; -extern struct pmx_dev spear3xx_pmx_gpio_pin0; -extern struct pmx_dev spear3xx_pmx_gpio_pin1; -extern struct pmx_dev spear3xx_pmx_gpio_pin2; -extern struct pmx_dev spear3xx_pmx_gpio_pin3; -extern struct pmx_dev spear3xx_pmx_gpio_pin4; -extern struct pmx_dev spear3xx_pmx_gpio_pin5; -extern struct pmx_dev spear3xx_pmx_uart0_modem; -extern struct pmx_dev spear3xx_pmx_uart0; -extern struct pmx_dev spear3xx_pmx_timer_3_4; -extern struct pmx_dev spear3xx_pmx_timer_1_2; - -#if defined(CONFIG_MACH_SPEAR310 ) || defined(CONFIG_MACH_SPEAR320 ) -/* padmux plgpio devices */ -extern struct pmx_dev spear3xx_pmx_plgpio_0_1; -extern struct pmx_dev spear3xx_pmx_plgpio_2_3; -extern struct pmx_dev spear3xx_pmx_plgpio_4_5; -extern struct pmx_dev spear3xx_pmx_plgpio_6_9; -extern struct pmx_dev spear3xx_pmx_plgpio_10_27; -extern struct pmx_dev spear3xx_pmx_plgpio_28; -extern struct pmx_dev spear3xx_pmx_plgpio_29; -extern struct pmx_dev spear3xx_pmx_plgpio_30; -extern struct pmx_dev spear3xx_pmx_plgpio_31; -extern struct pmx_dev spear3xx_pmx_plgpio_32; -extern struct pmx_dev spear3xx_pmx_plgpio_33; -extern struct pmx_dev spear3xx_pmx_plgpio_34_36; -extern struct pmx_dev spear3xx_pmx_plgpio_37_42; -extern struct pmx_dev spear3xx_pmx_plgpio_43_44_47_48; -extern struct pmx_dev spear3xx_pmx_plgpio_45_46_49_50; -#endif -/* spear300 declarations */ #ifdef CONFIG_MACH_SPEAR300 -/* pad mux modes */ -extern struct pmx_mode spear300_nand_mode; -extern struct pmx_mode spear300_nor_mode; -extern struct pmx_mode spear300_photo_frame_mode; -extern struct pmx_mode spear300_lend_ip_phone_mode; -extern struct pmx_mode spear300_hend_ip_phone_mode; -extern struct pmx_mode spear300_lend_wifi_phone_mode; -extern struct pmx_mode spear300_hend_wifi_phone_mode; -extern struct pmx_mode spear300_ata_pabx_wi2s_mode; -extern struct pmx_mode spear300_ata_pabx_i2s_mode; -extern struct pmx_mode spear300_caml_lcdw_mode; -extern struct pmx_mode spear300_camu_lcd_mode; -extern struct pmx_mode spear300_camu_wlcd_mode; -extern struct pmx_mode spear300_caml_lcd_mode; - -/* pad mux devices */ -extern struct pmx_dev spear300_pmx_fsmc_2_chips; -extern struct pmx_dev spear300_pmx_fsmc_4_chips; -extern struct pmx_dev spear300_pmx_keyboard; -extern struct pmx_dev spear300_pmx_clcd; -extern struct pmx_dev spear300_pmx_telecom_gpio; -extern struct pmx_dev spear300_pmx_telecom_tdm; -extern struct pmx_dev spear300_pmx_telecom_spi_cs_i2c_clk; -extern struct pmx_dev spear300_pmx_telecom_camera; -extern struct pmx_dev spear300_pmx_telecom_dac; -extern struct pmx_dev spear300_pmx_telecom_i2s; -extern struct pmx_dev spear300_pmx_telecom_boot_pins; -extern struct pmx_dev spear300_pmx_telecom_sdhci_4bit; -extern struct pmx_dev spear300_pmx_telecom_sdhci_8bit; -extern struct pmx_dev spear300_pmx_gpio1; - -/* Add spear300 machine declarations here */ void __init spear300_clk_init (void );#endif /* CONFIG_MACH_SPEAR300 */ /* spear310 declarations */ #ifdef CONFIG_MACH_SPEAR310 -/* pad mux devices */ -extern struct pmx_dev spear310_pmx_emi_cs_0_1_4_5; -extern struct pmx_dev spear310_pmx_emi_cs_2_3; -extern struct pmx_dev spear310_pmx_uart1; -extern struct pmx_dev spear310_pmx_uart2; -extern struct pmx_dev spear310_pmx_uart3_4_5; -extern struct pmx_dev spear310_pmx_fsmc; -extern struct pmx_dev spear310_pmx_rs485_0_1; -extern struct pmx_dev spear310_pmx_tdm0; - -/* Add spear310 machine declarations here */ void __init spear310_clk_init (void );#endif /* CONFIG_MACH_SPEAR310 */ /* spear320 declarations */ #ifdef CONFIG_MACH_SPEAR320 -/* pad mux modes */ -extern struct pmx_mode spear320_auto_net_smii_mode; -extern struct pmx_mode spear320_auto_net_mii_mode; -extern struct pmx_mode spear320_auto_exp_mode; -extern struct pmx_mode spear320_small_printers_mode; - -/* pad mux devices */ -extern struct pmx_dev spear320_pmx_clcd; -extern struct pmx_dev spear320_pmx_emi; -extern struct pmx_dev spear320_pmx_fsmc; -extern struct pmx_dev spear320_pmx_spp; -extern struct pmx_dev spear320_pmx_sdhci; -extern struct pmx_dev spear320_pmx_i2s; -extern struct pmx_dev spear320_pmx_uart1; -extern struct pmx_dev spear320_pmx_uart1_modem; -extern struct pmx_dev spear320_pmx_uart2; -extern struct pmx_dev spear320_pmx_touchscreen; -extern struct pmx_dev spear320_pmx_can; -extern struct pmx_dev spear320_pmx_sdhci_led; -extern struct pmx_dev spear320_pmx_pwm0; -extern struct pmx_dev spear320_pmx_pwm1; -extern struct pmx_dev spear320_pmx_pwm2; -extern struct pmx_dev spear320_pmx_pwm3; -extern struct pmx_dev spear320_pmx_ssp1; -extern struct pmx_dev spear320_pmx_ssp2; -extern struct pmx_dev spear320_pmx_mii1; -extern struct pmx_dev spear320_pmx_smii0; -extern struct pmx_dev spear320_pmx_smii1; -extern struct pmx_dev spear320_pmx_i2c1; - -/* Add spear320 machine declarations here */ void __init spear320_clk_init (void );#endif /* CONFIG_MACH_SPEAR320 */
arch/arm/mach-spear3xx/spear300.c +1 -388
413 lines not on this page · raw message
arch/arm/mach-spear3xx/spear310.c +1 -160
185 lines not on this page · raw message
arch/arm/mach-spear3xx/spear320.c +1 -402
427 lines not on this page · raw message
arch/arm/mach-spear3xx/spear3xx.c +0 -425
431 lines not on this page · raw message
arch/arm/plat-spear/Makefile +1 -1
@@ -5,4 +5,4 @@ # Common support obj-y := clock.o restart.o time.o pl080.o -obj-$(CONFIG_ARCH_SPEAR3XX) += shirq.o padmux.o +obj-$(CONFIG_ARCH_SPEAR3XX) += shirq.o
arch/arm/plat-spear/include/plat/padmux.h deleted +0 -92
92 lines not on this page · raw message
arch/arm/plat-spear/padmux.c deleted +0 -164
164 lines not on this page · raw message
Signature · 1 line
1.7.9
PATCH v2 2/4 pinctrl: Add SPEAr pinctrl drivers
In reply to Viresh KumarThis adds pinctrl driver for SPEAr platform. It also updates MAINTAINERS file for SPEAr pinctrl drivers.
--- MAINTAINERS | 23 +-- drivers/pinctrl/Kconfig | 2 + drivers/pinctrl/Makefile | 2 + drivers/pinctrl/spear/Kconfig | 14 ++ drivers/pinctrl/spear/Makefile | 3 + drivers/pinctrl/spear/pinctrl-spear.c | 301 +++++++++++++++++++++++++++++++++ drivers/pinctrl/spear/pinctrl-spear.h | 142 ++++++++++++++++ 7 files changed, 472 insertions(+), 15 deletions(-) create mode 100644 drivers/pinctrl/spear/Kconfig create mode 100644 drivers/pinctrl/spear/Makefile create mode 100644 drivers/pinctrl/spear/pinctrl-spear.c create mode 100644 drivers/pinctrl/spear/pinctrl-spear.h
MAINTAINERS +8 -15
@@ -5238,6 +5238,14 @@ M: Linus Walleij <[email protected]> S: Maintained F: drivers/pinctrl/ +PIN CONTROLLER - ST SPEAR +M: Viresh Kumar <[email protected]> +L: spear-devel at list.st.com +L: linux-arm-kernel at lists.infradead.org (moderated for non-subscribers) +W: http://www.st.com/spear +S: Maintained +F: driver/pinctrl/spear/ + PKTCDVD DRIVER M: Peter Osterlund <[email protected]> S: Maintained
@@ -6331,21 +6339,6 @@ F: arch/arm/mach-spear*/clock.c F: arch/arm/plat-spear/clock.c F: arch/arm/plat-spear/include/plat/clock.h -SPEAR PAD MULTIPLEXING SUPPORT -M: Viresh Kumar <[email protected]> -L: spear-devel at list.st.com -L: linux-arm-kernel at lists.infradead.org (moderated for non-subscribers) -W: http://www.st.com/spear -S: Maintained -F: arch/arm/plat-spear/include/plat/padmux.h -F: arch/arm/plat-spear/padmux.c -F: arch/arm/mach-spear*/spear*xx.c -F: arch/arm/mach-spear*/include/mach/generic.h -F: arch/arm/mach-spear3xx/spear3*0.c -F: arch/arm/mach-spear3xx/spear3*0_evb.c -F: arch/arm/mach-spear6xx/spear600.c -F: arch/arm/mach-spear6xx/spear600_evb.c - SPI SUBSYSTEM M: Grant Likely <[email protected]> L: spi-devel-general at lists.sourceforge.net
drivers/pinctrl/Kconfig +2 -0
@@ -84,6 +84,8 @@ config PINCTRL_COH901 COH 901 335 and COH 901 571/3. They contain 3, 5 or 7 ports of 8 GPIO pins each. +source "drivers/pinctrl/spear/Kconfig" + endmenu endif
drivers/pinctrl/Makefile +2 -0
@@ -16,3 +16,5 @@ obj-$(CONFIG_PINCTRL_TEGRA20) += pinctrl-tegra20.o obj-$(CONFIG_PINCTRL_TEGRA30) += pinctrl-tegra30.o obj-$(CONFIG_PINCTRL_U300) += pinctrl-u300.o obj-$(CONFIG_PINCTRL_COH901) += pinctrl-coh901.o + +obj-$(CONFIG_PLAT_SPEAR) += spear/
drivers/pinctrl/spear/Kconfig new file +14 -0
@@ -0,0 +1,14 @@ +# +# ST Microelectronics SPEAr PINCTRL drivers +# + +if PLAT_SPEAR + +config PINCTRL_SPEAR + bool + depends on OF + select PINMUX + help + This enables pin control drivers for SPEAr Platform + +endif
drivers/pinctrl/spear/Makefile new file +3 -0
@@ -0,0 +1,3 @@ +# SPEAr pinmux support + +obj-$(CONFIG_PINCTRL_SPEAR) += pinctrl-spear.o
drivers/pinctrl/spear/pinctrl-spear.c new file +301 -0
301 lines not on this page · raw message
drivers/pinctrl/spear/pinctrl-spear.h new file +142 -0
142 lines not on this page · raw message
Signature · 1 line
1.7.9
PATCH v2 2/4 pinctrl: Add SPEAr pinctrl drivers
Quoted 6 lines · Viresh Kumar
This adds pinctrl driver for SPEAr platform. It also updates
MAINTAINERSfile for SPEAr pinctrl drivers.drivers/pinctrl/spear/pinctrl-spear.c new file +3
-0+int __devinit spear_pinctrl_probe (struct platform_device *pdev, +struct spear_pinctrl_machdata *machdata) +{
...
Quoted 1 line
drivers/pinctrl/spear/pinctrl-spear.c new file +1
-0+ res =platform_get_resource (pdev,IORESOURCE_MEM ,0 );
...
drivers/pinctrl/spear/pinctrl-spear.c line 255
Quoted 1 line
drivers/pinctrl/spear/pinctrl-spear.c new file +1
-0+ pmx->vbase =devm_ioremap (&pdev->dev, res->start,resource_size (res));
If this driver is DT-only, you can replace those two calls with of_iomap().
drivers/pinctrl/spear/pinctrl-spear.c line 285
Quoted 1 line
drivers/pinctrl/spear/pinctrl-spear.c new file +1
-0+platform_set_drvdata (pdev, pmx);
This should probably before the pinctrl_register() call, just in case pinctrl_register() starts calling the pinctrl driver ops immediately, and the drvdata is needed by the callbacks.
(Yes, I should fix up the Tegra driver for both of those)
drivers/pinctrl/spear/pinctrl-spear.c line 288
Quoted 2 lines
drivers/pinctrl/spear/pinctrl-spear.c new file +2
-0+dev_info (&pdev->dev,"Registered with virtual address 0x%08x, physical address 0x%08x\n" , + (u32 )pmx->vbase, res->start);
Is that useful?
drivers/pinctrl/spear/pinctrl-spear.c line 297
Quoted 5 lines
drivers/pinctrl/spear/pinctrl-spear.c new file +5
-0+int __devexit spear_pinctrl_remove(struct platform_device *pdev) +{ +struct spear_pmx *pmx =platform_get_drvdata (pdev); + +platform_set_drvdata (pdev,NULL );
You don't need to do that; nothing should be touching the drvdata once the driver has been removed, so the value doesn't matter.
PATCH v2 2/4 pinctrl: Add SPEAr pinctrl drivers
Quoted 10 lines · Stephen Warren
Quoted 3 lines · Viresh Kumar
drivers/pinctrl/spear/pinctrl-spear.c new file +3
-0+int __devinit spear_pinctrl_probe (struct platform_device *pdev, +struct spear_pinctrl_machdata *machdata) +{...
Quoted 1 line
drivers/pinctrl/spear/pinctrl-spear.c new file +1
-0+ res =platform_get_resource (pdev,IORESOURCE_MEM ,0 );...
drivers/pinctrl/spear/pinctrl-spear.c line 255
Quoted 1 line
drivers/pinctrl/spear/pinctrl-spear.c new file +1
-0+ pmx->vbase =devm_ioremap (&pdev->dev, res->start,resource_size (res));If this driver is DT-only, you can replace those two calls with
of_iomap().
Ya. This is DT-only. Will do that.
Quoted 5 lines
drivers/pinctrl/spear/pinctrl-spear.c line 285
Quoted 1 line
drivers/pinctrl/spear/pinctrl-spear.c new file +1
-0+platform_set_drvdata (pdev, pmx);This should probably before the
pinctrl_register()call, just in casepinctrl_register()starts calling the pinctrl driver ops immediately, and the drvdata is needed by the callbacks.
I don't use platform_get_drvdata in ops. Only used in remove routine. Still would move it up.
Quoted 1 line
(Yes, I should fix up the Tegra driver for both of those)
:)
Quoted 4 lines
drivers/pinctrl/spear/pinctrl-spear.c line 288
Quoted 2 lines
drivers/pinctrl/spear/pinctrl-spear.c new file +2
-0+dev_info (&pdev->dev,"Registered with virtual address 0x%08x, physical address 0x%08x\n" , + (u32 )pmx->vbase, res->start);Is that useful?
It does. Can easily check from boot prints that everything worked as planned.
Quoted 8 lines
drivers/pinctrl/spear/pinctrl-spear.c line 297
Quoted 5 lines
drivers/pinctrl/spear/pinctrl-spear.c new file +5
-0+int __devexit spear_pinctrl_remove(struct platform_device *pdev) +{ +struct spear_pmx *pmx =platform_get_drvdata (pdev); + +platform_set_drvdata (pdev,NULL );You don't need to do that; nothing should be touching the drvdata once the driver has been removed, so the value doesn't matter.
Why do most of the drivers do this? What can get called for them?
Signature · 1 line
viresh
PATCH v2 4/4 SPEAr3xx: Add pinctrl support for boards
In reply to Viresh Kumar--- arch/arm/boot/dts/spear300-evb.dts | 4 ++++ arch/arm/boot/dts/spear300.dtsi | 5 +++++ arch/arm/boot/dts/spear310.dtsi | 5 +++++ arch/arm/boot/dts/spear320-evb.dts | 4 ++++ arch/arm/boot/dts/spear320.dtsi | 7 ++++++- arch/arm/mach-spear3xx/Kconfig | 3 +++ arch/arm/mach-spear3xx/spear300.c | 25 +++++++++++++++++++++++++ arch/arm/mach-spear3xx/spear310.c | 30 ++++++++++++++++++++++++++++++ arch/arm/mach-spear3xx/spear320.c | 29 +++++++++++++++++++++++++++++ arch/arm/plat-spear/Kconfig | 1 + 10 files changed, 112 insertions(+), 1 deletions(-)
arch/arm/boot/dts/spear300-evb.dts +4 -0
@@ -25,6 +25,10 @@ }; ahb { + pinmux at 99000000 { + st,pinmux-mode=<2>; + }; + clcd at 60000000 { status = "okay"; };
arch/arm/boot/dts/spear300.dtsi +5 -0
@@ -21,6 +21,11 @@ ranges = <0x60000000 0x60000000 0x50000000 0xd0000000 0xd0000000 0x30000000>; + pinmux at 99000000 { + compatible = "st,spear300-pinmux"; + reg = <0x99000000 0x1000>; + }; + clcd at 60000000 { compatible = "arm,clcd-pl110", "arm,primecell"; reg = <0x60000000 0x1000>;
arch/arm/boot/dts/spear310.dtsi +5 -0
@@ -22,6 +22,11 @@ 0xb0000000 0xb0000000 0x10000000 0xd0000000 0xd0000000 0x30000000>; + pinmux at b4000000 { + compatible = "st,spear310-pinmux"; + reg = <0xb4000000 0x1000>; + }; + fsmc: flash at 44000000 { compatible = "st,spear600-fsmc-nand"; #address-cells = <1>;
arch/arm/boot/dts/spear320-evb.dts +4 -0
@@ -25,6 +25,10 @@ }; ahb { + pinmux at b3000000 { + st,pinmux-mode=<3>; + }; + clcd at 90000000 { status = "okay"; };
arch/arm/boot/dts/spear320.dtsi +6 -1
@@ -18,9 +18,14 @@ #address-cells = <1>; #size-cells = <1>; compatible = "simple-bus"; - ranges = <0x40000000 0x40000000 0x70000000 + ranges = <0x40000000 0x40000000 0x80000000 0xd0000000 0xd0000000 0x30000000>; + pinmux at b3000000 { + compatible = "st,spear320-pinmux"; + reg = <0xb3000000 0x1000>; + }; + clcd at 90000000 { compatible = "arm,clcd-pl110", "arm,primecell"; reg = <0x90000000 0x1000>;
arch/arm/mach-spear3xx/Kconfig +3 -0
@@ -7,16 +7,19 @@ if ARCH_SPEAR3XX menu "SPEAr3xx Implementations" config MACH_SPEAR300 bool "SPEAr300 Machine support with Device Tree" + select PINCTRL_SPEAR300 help Supports ST SPEAr300 machine configured via the device-tree config MACH_SPEAR310 bool "SPEAr310 Machine support with Device Tree" + select PINCTRL_SPEAR310 help Supports ST SPEAr310 machine configured via the device-tree config MACH_SPEAR320 bool "SPEAr320 Machine support with Device Tree" + select PINCTRL_SPEAR320 help Supports ST SPEAr320 machine configured via the device-tree endmenu
arch/arm/mach-spear3xx/spear300.c +25 -0
@@ -15,6 +15,7 @@#include <linux/amba/pl08x.h> #include <linux/of_platform.h> +#include <linux/pinctrl/machine.h> #include <asm/hardware/vic.h> #include <asm/mach/arch.h> #include <plat/shirq.h>
@@ -270,6 +271,24 @@ static struct of_dev_auxdata spear300_auxdata_lookup[] __initdata = { {} }; +static struct pinctrl_map __initdata spear300_evb_pmx_map[] = { +/* spear3xx per-device maps */ +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("99000000.pinmux" ,NULL ,"i2c0" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("99000000.pinmux" ,NULL ,"ssp0" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("99000000.pinmux" ,NULL ,"mii0" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("99000000.pinmux" ,NULL ,"uart0" ), + +/* spear310 per-device maps */ +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("99000000.pinmux" ,"clcd_pfmode_grp" , +"clcd" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("99000000.pinmux" ,"sdhci_4bit_grp" , +"sdhci" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("99000000.pinmux" ,"gpio1_0_to_3_grp" , +"gpio" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("99000000.pinmux" ,"gpio1_4_to_7_grp" , +"gpio" ), +}; +static void __init spear300_dt_init (void ) {int ret;
@@ -287,6 +306,12 @@ static void __init spear300_dt_init(void)if (ret)pr_err ("Error registering Shared IRQ\n" ); } + +if (of_machine_is_compatible ("st,spear300-evb" )) { +if (pinctrl_register_mappings (spear300_evb_pmx_map, +ARRAY_SIZE (spear300_evb_pmx_map))) +pr_err ("Error registering pinmux map\n" ); + } }static const char *const spear300_dt_board_compat[] = {
arch/arm/mach-spear3xx/spear310.c +30 -0
@@ -16,6 +16,7 @@#include <linux/amba/pl08x.h> #include <linux/amba/serial.h> #include <linux/of_platform.h> +#include <linux/pinctrl/machine.h> #include <asm/hardware/vic.h> #include <asm/mach/arch.h> #include <plat/shirq.h>
@@ -369,6 +370,29 @@ static struct of_dev_auxdata spear310_auxdata_lookup[] __initdata = { {} }; +static struct pinctrl_map __initdata spear310_evb_pmx_map[] = { +/* spear3xx per-device maps */ +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b4000000.pinmux" ,NULL ,"gpio0_pin0" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b4000000.pinmux" ,NULL ,"gpio0_pin1" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b4000000.pinmux" ,NULL ,"gpio0_pin2" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b4000000.pinmux" ,NULL ,"gpio0_pin3" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b4000000.pinmux" ,NULL ,"gpio0_pin4" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b4000000.pinmux" ,NULL ,"gpio0_pin5" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b4000000.pinmux" ,NULL ,"i2c0" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b4000000.pinmux" ,NULL ,"mii0" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b4000000.pinmux" ,NULL ,"ssp0" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b4000000.pinmux" ,NULL ,"uart0" ), + +/* spear310 per-device maps */ +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b4000000.pinmux" ,NULL ,"emi" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b4000000.pinmux" ,NULL ,"fsmc" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b4000000.pinmux" ,NULL ,"uart1" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b4000000.pinmux" ,NULL ,"uart2" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b4000000.pinmux" ,NULL ,"uart3" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b4000000.pinmux" ,NULL ,"uart4" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b4000000.pinmux" ,NULL ,"uart5" ), +}; +static void __init spear310_dt_init (void ) {void __iomem *base;
@@ -407,6 +431,12 @@ static void __init spear310_dt_init(void)if (ret)pr_err ("Error registering Shared IRQ 4\n" ); } + +if (of_machine_is_compatible ("st,spear310-evb" )) { +if (pinctrl_register_mappings (spear310_evb_pmx_map, +ARRAY_SIZE (spear310_evb_pmx_map))) +pr_err ("Error registering pinmux map\n" ); + } }static const char *const spear310_dt_board_compat[] = {
arch/arm/mach-spear3xx/spear320.c +29 -0
@@ -17,6 +17,7 @@#include <linux/amba/pl08x.h> #include <linux/amba/serial.h> #include <linux/of_platform.h> +#include <linux/pinctrl/machine.h> #include <asm/hardware/vic.h> #include <asm/mach/arch.h> #include <plat/shirq.h>
@@ -381,6 +382,28 @@ static struct of_dev_auxdata spear320_auxdata_lookup[] __initdata = { {} }; +static struct pinctrl_map __initdata spear320_evb_pmx_map[] = { +/* spear3xx per-device maps */ +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b3000000.pinmux" ,NULL ,"i2c0" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b3000000.pinmux" ,NULL ,"mii0" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b3000000.pinmux" ,NULL ,"ssp0" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b3000000.pinmux" ,NULL ,"uart0" ), + +/* spear320 per-device maps */ +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b3000000.pinmux" ,"sdhci_cd_51_grp" , +"sdhci" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b3000000.pinmux" ,NULL ,"i2s" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b3000000.pinmux" ,NULL ,"uart1" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b3000000.pinmux" ,NULL ,"uart2" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b3000000.pinmux" ,NULL ,"can0" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b3000000.pinmux" ,NULL ,"can1" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b3000000.pinmux" ,NULL ,"mii2" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b3000000.pinmux" ,"pwm0_1_pin_14_15_grp" , +"pwm0_1" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("b3000000.pinmux" ,"pwm2_pin_13_grp" , +"pwm2" ), +}; +static void __init spear320_dt_init (void ) {void __iomem *base;
@@ -413,6 +436,12 @@ static void __init spear320_dt_init(void)if (ret)pr_err ("Error registering Shared IRQ 4\n" ); } + +if (of_machine_is_compatible ("st,spear320-evb" )) { +if (pinctrl_register_mappings (spear320_evb_pmx_map, +ARRAY_SIZE (spear320_evb_pmx_map))) +pr_err ("Error registering pinmux map\n" ); + } }static const char *const spear320_dt_board_compat[] = {
arch/arm/plat-spear/Kconfig +1 -0
@@ -13,6 +13,7 @@ config ARCH_SPEAR3XX select ARM_VIC select CPU_ARM926T select USE_OF + select PINCTRL help Supports for ARM's SPEAR3XX family
Signature · 1 line
1.7.9
PATCH v2 4/4 SPEAr3xx: Add pinctrl support for boards
Quoted 23 lines · Viresh Kumar
Signed-off-by Viresh Kumar <[email protected]>+++
b/arch/arm/mach-spear3xx/spear300.carch/arm/mach-spear3xx/spear300.c +17
-0+static struct pinctrl_map __initdata spear300_evb_pmx_map[] = { +/* spear3xx per-device maps */ +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("99000000.pinmux" ,NULL ,"i2c0" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("99000000.pinmux" ,NULL ,"ssp0" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("99000000.pinmux" ,NULL ,"mii0" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("99000000.pinmux" ,NULL ,"uart0" ), + +/* spear310 per-device maps */ +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("99000000.pinmux" ,"clcd_pfmode_grp" , +"clcd" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("99000000.pinmux" ,"sdhci_4bit_grp" , +"sdhci" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("99000000.pinmux" ,"gpio1_0_to_3_grp" , +"gpio" ), +PIN_MAP_MUX_GROUP_HOG_DEFAULT ("99000000.pinmux" ,"gpio1_4_to_7_grp" , +"gpio" ), +};static void __init spear300_dt_init (void )
...
arch/arm/mach-spear3xx/spear300.c static void __init spear300_dt_init(void) · line 314
Quoted 6 lines
arch/arm/mach-spear3xx/spear300.c +6
-0+ +if (of_machine_is_compatible ("st,spear300-evb" )) { +if (pinctrl_register_mappings (spear300_evb_pmx_map, +ARRAY_SIZE (spear300_evb_pmx_map))) +pr_err ("Error registering pinmux map\n" ); + }
It'd be nice to put those mapping tables into device tree from the start. Hopefully the core pinctrl support for DT will be in linux-next today/tomorrow.
PATCH v2 4/4 SPEAr3xx: Add pinctrl support for boards
Quoted 3 lines · Stephen Warren
It'd be nice to put those mapping tables into device tree from the start. Hopefully the core pinctrl support for DT will be in linux-next today/tomorrow.
Will do that. I wasn't sure about the state of your patchset for DT with pinmux.
Signature · 1 line
viresh
A message that is not in the archive (sent off-list or not yet received): 2a78bbfab59b531adef0820f34f683dd736d3a3a.1333538870.git.viresh.kumar@st.com
PATCH v2 3/4 pinctrl: Add SPEAr3xx pinctrl drivers
Quoted 16 lines · Viresh Kumar
This adds pinctrl driver for SPEAr3xx family. SPEAr3xx family supports three
families: SPEAr300, SPEAr310 and SPEAr320.+++
b/Documentation/devicetree/bindings/pinmux/pinmux_spear.txt+- st,pinmux-mode: Mandatory for SPEAr300 and SPEAr320
(quoted diff) +10
-0+ - Its values for SPEAr300: + - NAND_MODE : <0> + - NOR_MODE : <1> + - PHOTO_FRAME_MODE : <2> + - LEND_IP_PHONE_MODE : <3> + - HEND_IP_PHONE_MODE : <4> + - LEND_WIFI_PHONE_MODE : <5> + - HEND_WIFI_PHONE_MODE : <6> + - ATA_PABX_WI2S_MODE : <7> + - ATA_PABX_I2S_MODE : <8>
Review
Quoted 10 lines
(quoted diff) +10
-0+ - CAML_LCDW_MODE : <9> + - CAMU_LCD_MODE : <10> + - CAMU_WLCD_MODE : <11> + - CAML_LCD_MODE : <12> + - Its values for SPEAr320: + - AUTO_NET_SMII_MODE : <0> + - AUTO_NET_MII_MODE : <1> + - AUTO_EXP_MODE : <2> + - SMALL_PRINTERS_MODE : <3> + - EXTENDED_MODE : <4>
I'm not sure what this is. Is it representing packaging options on the SoC or something like that? I'd personally expect the pinctrl driver to expose the raw pinmux HW module's capabilities and each board's .dts file to pick how to configure each option, rather than providing canned options, but I guess not everyone agrees. Looking at the data in the rest of the patch though, it looks like you have plenty of pin/group/function definitions in the driver files though, so this probably isn't a problem.
PATCH v2 3/4 pinctrl: Add SPEAr3xx pinctrl drivers
Quoted 15 lines · Stephen Warren
Quoted 15 lines
Quoted 15 lines
+- st,pinmux-mode: Mandatory for SPEAr300 and SPEAr320
(quoted diff) +14
-0+ - Its values for SPEAr300: + - NAND_MODE : <0> + - NOR_MODE : <1> + - PHOTO_FRAME_MODE : <2> + - LEND_IP_PHONE_MODE : <3> + - HEND_IP_PHONE_MODE : <4> + - LEND_WIFI_PHONE_MODE : <5> + - HEND_WIFI_PHONE_MODE : <6> + - ATA_PABX_WI2S_MODE : <7> + - ATA_PABX_I2S_MODE : <8> + - CAML_LCDW_MODE : <9> + - CAMU_LCD_MODE : <10> + - CAMU_WLCD_MODE : <11> + - CAML_LCD_MODE : <12>
Quoted 8 lines
Quoted 6 lines
Review
Quoted 6 lines
(quoted diff) +6
-0+ - Its values for SPEAr320: + - AUTO_NET_SMII_MODE : <0> + - AUTO_NET_MII_MODE : <1> + - AUTO_EXP_MODE : <2> + - SMALL_PRINTERS_MODE : <3> + - EXTENDED_MODE : <4>I'm not sure what this is. Is it representing packaging options on the SoC or something like that?
These aren't packaging options but Usage specific muxing options. Customers can have different application scenarios where they need different group of peripherals or their modes. And that kind of muxing is provided by these modes. Within these modes, we can again have muxing of peripherals present for that mode.
Quoted 4 lines
I'd personally expect the pinctrl driver to
expose the raw pinmux HW module's capabilities and each board's .dts file to pick how to configure each option, rather than providing canned options, but I guess not everyone agrees.
I believe this is what my driver is doing. It provides the raw functionality provided by SoC, and now board dts can select mode and muxing options.
Signature · 1 line
viresh