ARM: tegra: GPIO and pinmux-related changes
Subsystems (10)
cover ARM: tegra: GPIO and pinmux-related changes
From: Stephen Warren <[email protected]>
This series:
* Updates the Tegra GPIO driver to interact with pinctrl per the recent gpio.txt documentation changes. Consequently, there's no need for tegra_gpio_enable() any more, and no need for board-pinmux.c to do anything GPIO-related.
* Switches to the new Tegra pinctrl driver, and deletes the old one.
* Moves pinctrl configuration to the device tree when booted using DT, so that board-dt-tegra*.c no longer depend on anything in board*.[ch].
Note to self: This series relies upon DT support in pinctrl, which should be merged in 3.5.
Stephen Warren (11):
usb: ehci-tegra: Add vbus_gpio to platform data
ARM: tegra: Remove VBUS_GPIO handling from board files
gpio: tegra: fix register address calculations for Tegra30
gpio: tegra: Iterate over the correct number of banks
gpio: tegra: configure pins during irq_set_type
ARM: tegra: seaboard: Don't gpio_request() ISL29018_IRQ
gpio: tegra: Hide tegra_gpio_enable/disable()
ARM: tegra: Switch to new pinctrl driver
ARM: tegra: Remove pre-pinctrl pinmux driver
ARM: dt: tegra cardhu: add pinmux to device tree
ARM: dt: tegra20: add pinmux to device tree
arch/arm/boot/dts/tegra-cardhu.dts | 44 + arch/arm/boot/dts/tegra-harmony.dts | 224 +++++ arch/arm/boot/dts/tegra-paz00.dts | 220 +++++ arch/arm/boot/dts/tegra-seaboard.dts | 243 +++++ arch/arm/boot/dts/tegra-trimslice.dts | 230 +++++ arch/arm/boot/dts/tegra-ventana.dts | 230 +++++ arch/arm/mach-tegra/Makefile | 3 - arch/arm/mach-tegra/board-dt-tegra20.c | 31 - arch/arm/mach-tegra/board-harmony-pinmux.c | 266 +++--- arch/arm/mach-tegra/board-paz00-pinmux.c | 263 +++--- arch/arm/mach-tegra/board-pinmux.c | 105 +-- arch/arm/mach-tegra/board-pinmux.h | 38 +- arch/arm/mach-tegra/board-seaboard-pinmux.c | 346 ++++---- arch/arm/mach-tegra/board-seaboard.c | 21 +- arch/arm/mach-tegra/board-trimslice-pinmux.c | 264 +++--- arch/arm/mach-tegra/board-trimslice.c | 15 +- arch/arm/mach-tegra/devices.c | 3 + arch/arm/mach-tegra/include/mach/gpio-tegra.h | 9 - arch/arm/mach-tegra/include/mach/pinmux-tegra20.h | 184 ---- arch/arm/mach-tegra/include/mach/pinmux-tegra30.h | 320 ------- arch/arm/mach-tegra/include/mach/pinmux.h | 302 ------- arch/arm/mach-tegra/pinmux-tegra20-tables.c | 244 ----- arch/arm/mach-tegra/pinmux-tegra30-tables.c | 376 -------- arch/arm/mach-tegra/pinmux.c | 987 --------------------- arch/arm/mach-tegra/usb_phy.c | 1 - drivers/gpio/gpio-tegra.c | 98 ++- drivers/mmc/host/sdhci-tegra.c | 24 +- drivers/pinctrl/pinctrl-tegra.c | 6 +- drivers/usb/host/ehci-tegra.c | 13 +- include/linux/platform_data/tegra_usb.h | 1 + 30 files changed, 1887 insertions(+), 3224 deletions(-) delete mode 100644 arch/arm/mach-tegra/include/mach/pinmux-tegra20.h delete mode 100644 arch/arm/mach-tegra/include/mach/pinmux-tegra30.h delete mode 100644 arch/arm/mach-tegra/include/mach/pinmux.h delete mode 100644 arch/arm/mach-tegra/pinmux-tegra20-tables.c delete mode 100644 arch/arm/mach-tegra/pinmux-tegra30-tables.c delete mode 100644 arch/arm/mach-tegra/pinmux.c
PATCH 1/11 usb: ehci-tegra: Add vbus_gpio to platform data
From: Stephen Warren <[email protected]>
Add a vbus_gpio field to platform data. This mirrors the device tree property nvidia,vbus-gpio. This makes the VBUS GPIO handling identical between booting with board files and device tree; the driver always does it.
This removes the need for board files to request and initialize the GPIO early during their boot process, perhaps even before the GPIO driver is ready to process the request.
--- arch/arm/mach-tegra/devices.c | 3 +++ drivers/usb/host/ehci-tegra.c | 13 +++++++------ include/linux/platform_data/tegra_usb.h | 1 + 3 files changed, 11 insertions(+), 6 deletions(-)
arch/arm/mach-tegra/devices.c +3 -0
@@ -448,17 +448,20 @@ static struct tegra_ulpi_config tegra_ehci2_ulpi_phy_config = {struct tegra_ehci_platform_data tegra_ehci1_pdata = { .operating_mode =TEGRA_USB_OTG , .power_down_on_bus_suspend =1 , + .vbus_gpio =-1 , };struct tegra_ehci_platform_data tegra_ehci2_pdata = { .phy_config = &tegra_ehci2_ulpi_phy_config, .operating_mode =TEGRA_USB_HOST , .power_down_on_bus_suspend =1 , + .vbus_gpio =-1 , };struct tegra_ehci_platform_data tegra_ehci3_pdata = { .operating_mode =TEGRA_USB_HOST , .power_down_on_bus_suspend =1 , + .vbus_gpio =-1 , };static u64 tegra_ehci_dmamask =DMA_BIT_MASK (32 );
drivers/usb/host/ehci-tegra.c +7 -6
@@ -579,15 +579,16 @@ static const struct hc_driver tegra_ehci_hc_driver = { .port_handed_over = ehci_port_handed_over, }; -static int setup_vbus_gpio (struct platform_device *pdev) +static int setup_vbus_gpio (struct platform_device *pdev, +struct tegra_ehci_platform_data *pdata) {int err =0 ;int gpio; -if (!pdev->dev.of_node) -return 0 ; - - gpio =of_get_named_gpio (pdev->dev.of_node,"nvidia,vbus-gpio" ,0 ); + gpio = pdata->vbus_gpio; +if (!gpio_is_valid (gpio)) + gpio =of_get_named_gpio (pdev->dev.of_node, +"nvidia,vbus-gpio" ,0 );if (!gpio_is_valid (gpio))return 0 ;
@@ -631,7 +632,7 @@ static int tegra_ehci_probe(struct platform_device *pdev)if (!pdev->dev.dma_mask) pdev->dev.dma_mask = &tegra_ehci_dma_mask; -setup_vbus_gpio (pdev); +setup_vbus_gpio (pdev, pdata); tegra =kzalloc (sizeof (struct tegra_ehci_hcd ),GFP_KERNEL );if (!tegra)
include/linux/platform_data/tegra_usb.h +1 -0
@@ -26,6 +26,7 @@ struct tegra_ehci_platform_data {/* power down the phy on bus suspend */ int power_down_on_bus_suspend;void *phy_config; + int vbus_gpio; };#endif /* _TEGRA_USB_H_ */
Signature · 1 line
1.7.0.4
PATCH 1/11 usb: ehci-tegra: Add vbus_gpio to platform data
Quoted 7 lines · Stephen Warren
From: Stephen Warren <[email protected]>
Add a
vbus_gpiofield to platform data. This mirrors the device tree property nvidia,vbus-gpio. This makes the VBUS GPIO handling identical between booting with board files and device tree; the driver always does it.
Quoted 8 lines
This removes the need for board files to request and initialize the GPIO early during their boot process, perhaps even before the GPIO driver is ready to process the request.
Cc Greg Kroah-Hartman <[email protected]>Cc Alan Stern <[email protected]>Cc linux-usb at vger.kernel.orgSigned-off-by Stephen Warren <[email protected]>
-Olof
PATCH 2/11 ARM: tegra: Remove VBUS_GPIO handling from board files
In reply to Stephen WarrenFrom: Stephen Warren <[email protected]>
Instead of having board files manually request and initialize USB VBUS GPIOs, fill in the USB driver's platform data and have it do it.
--- arch/arm/mach-tegra/board-seaboard.c | 17 ++++------------- arch/arm/mach-tegra/board-trimslice.c | 15 +++++---------- 2 files changed, 9 insertions(+), 23 deletions(-)
arch/arm/mach-tegra/board-seaboard.c +4 -13
@@ -24,6 +24,7 @@#include <linux/io.h> #include <linux/gpio.h> #include <linux/gpio_keys.h> +#include <linux/platform_data/tegra_usb.h> #include <sound/wm8903.h>
@@ -185,20 +186,10 @@ static struct i2c_board_info __initdata wm8903_device = {static int seaboard_ehci_init (void ) { -int gpio_status; +struct tegra_ehci_platform_data *pdata; - gpio_status =gpio_request (TEGRA_GPIO_USB1 ,"VBUS_USB1" ); -if (gpio_status <0 ) { -pr_err ("VBUS_USB1 request GPIO FAILED\n" ); -WARN_ON (1 ); - } - - gpio_status =gpio_direction_output (TEGRA_GPIO_USB1 ,1 ); -if (gpio_status <0 ) { -pr_err ("VBUS_USB1 request GPIO DIRECTION FAILED\n" ); -WARN_ON (1 ); - } -gpio_set_value (TEGRA_GPIO_USB1 ,1 ); + pdata = tegra_ehci1_device.dev.platform_data; + pdata->vbus_gpio =TEGRA_GPIO_USB1 ;platform_device_register (&tegra_ehci1_device);platform_device_register (&tegra_ehci3_device);
arch/arm/mach-tegra/board-trimslice.c +5 -10
@@ -25,6 +25,7 @@#include <linux/io.h> #include <linux/i2c.h> #include <linux/gpio.h> +#include <linux/platform_data/tegra_usb.h> #include <asm/hardware/gic.h> #include <asm/mach-types.h>
@@ -110,19 +111,13 @@ static void trimslice_i2c_init(void)static void trimslice_usb_init (void ) { -int err; +struct tegra_ehci_platform_data *pdata; -platform_device_register (&tegra_ehci3_device); + pdata = tegra_ehci1_device.dev.platform_data; + pdata->vbus_gpio =TRIMSLICE_GPIO_USB1_MODE ; +platform_device_register (&tegra_ehci3_device);platform_device_register (&tegra_ehci2_device); - - err =gpio_request_one (TRIMSLICE_GPIO_USB1_MODE ,GPIOF_OUT_INIT_HIGH , -"usb1mode" ); -if (err) { -pr_err ("TrimSlice: failed to obtain USB1 mode gpio: %d\n" , err); -return ; - } -platform_device_register (&tegra_ehci1_device); }
Signature · 1 line
1.7.0.4
PATCH 2/11 ARM: tegra: Remove VBUS_GPIO handling from board files
Quoted 6 lines · Stephen Warren
From: Stephen Warren <[email protected]>
Instead of having board files manually request and initialize USB VBUS GPIOs, fill in the USB driver's platform data and have it do it.
Signed-off-by Stephen Warren <[email protected]>
-Olof
PATCH 3/11 gpio: tegra: fix register address calculations for Tegra30
In reply to Stephen WarrenFrom: Stephen Warren <[email protected]>
Tegra20 and Tegra30 share the same register layout within registers, but the addresses of the registers is a little different. Fix the driver to cope with this.
--- drivers/gpio/gpio-tegra.c | 55 ++++++++++++++++++++++++++++++++++---------- 1 files changed, 42 insertions(+), 13 deletions(-)
drivers/gpio/gpio-tegra.c +42 -13
@@ -22,7 +22,7 @@#include <linux/interrupt.h> #include <linux/io.h> #include <linux/gpio.h> -#include <linux/of.h> +#include <linux/of_device.h> #include <linux/platform_device.h> #include <linux/module.h> #include <linux/irqdomain.h>
@@ -37,7 +37,8 @@#define GPIO_PORT (x) (((x) >> 3) & 0x3)#define GPIO_BIT (x) ((x) & 0x7) -#define GPIO_REG (x) (GPIO_BANK(x) * 0x80 + GPIO_PORT(x) * 4) +#define GPIO_REG (x) (GPIO_BANK(x) * tegra_gpio_bank_stride + \ + GPIO_PORT(x) * 4)#define GPIO_CNF (x) (GPIO_REG(x) + 0x00)#define GPIO_OE (x) (GPIO_REG(x) + 0x10)
@@ -48,12 +49,12 @@#define GPIO_INT_LVL (x) (GPIO_REG(x) + 0x60)#define GPIO_INT_CLR (x) (GPIO_REG(x) + 0x70) -#define GPIO_MSK_CNF (x) (GPIO_REG(x) + 0x800) -#define GPIO_MSK_OE (x) (GPIO_REG(x) + 0x810) -#define GPIO_MSK_OUT (x) (GPIO_REG(x) + 0X820) -#define GPIO_MSK_INT_STA (x) (GPIO_REG(x) + 0x840) -#define GPIO_MSK_INT_ENB (x) (GPIO_REG(x) + 0x850) -#define GPIO_MSK_INT_LVL (x) (GPIO_REG(x) + 0x860) +#define GPIO_MSK_CNF (x) (GPIO_REG(x) + tegra_gpio_upper_offset + 0x00) +#define GPIO_MSK_OE (x) (GPIO_REG(x) + tegra_gpio_upper_offset + 0x10) +#define GPIO_MSK_OUT (x) (GPIO_REG(x) + tegra_gpio_upper_offset + 0X20) +#define GPIO_MSK_INT_STA (x) (GPIO_REG(x) + tegra_gpio_upper_offset + 0x40) +#define GPIO_MSK_INT_ENB (x) (GPIO_REG(x) + tegra_gpio_upper_offset + 0x50) +#define GPIO_MSK_INT_LVL (x) (GPIO_REG(x) + tegra_gpio_upper_offset + 0x60)#define GPIO_INT_LVL_MASK 0x010101#define GPIO_INT_LVL_EDGE_RISING 0x000101
@@ -78,6 +79,8 @@ struct tegra_gpio_bank {static struct irq_domain *irq_domain;static void __iomem *regs;static u32 tegra_gpio_bank_count; +static u32 tegra_gpio_bank_stride; +static u32 tegra_gpio_upper_offset;static struct tegra_gpio_bank *tegra_gpio_banks;static inline void tegra_gpio_writel (u32 val,u32 reg)
@@ -333,6 +336,26 @@ static struct irq_chip tegra_gpio_irq_chip = {#endif }; +struct tegra_gpio_soc_config { +u32 bank_stride; +u32 upper_offset; +}; + +static struct tegra_gpio_soc_config tegra20_gpio_config = { + .bank_stride =0x80 , + .upper_offset =0x800 , +}; + +static struct tegra_gpio_soc_config tegra30_gpio_config = { + .bank_stride =0x100 , + .upper_offset =0x80 , +}; + +static struct of_device_id tegra_gpio_of_match[]__devinitdata = { + { .compatible ="nvidia,tegra30-gpio" , .data = &tegra30_gpio_config }, + { .compatible ="nvidia,tegra20-gpio" , .data = &tegra20_gpio_config }, + { }, +};/* This lock class tells lockdep that GPIO irqs are in a different * category than their parents, so it won't report false recursion.
@@ -341,6 +364,8 @@ static struct lock_class_key gpio_lock_class;static int __devinit tegra_gpio_probe (struct platform_device *pdev) { +const struct of_device_id *match; +struct tegra_gpio_soc_config *config;int irq_base;struct resource *res;struct tegra_gpio_bank *bank;
@@ -348,6 +373,15 @@ static int __devinit tegra_gpio_probe(struct platform_device *pdev)int i;int j; + match =of_match_device (tegra_gpio_of_match, &pdev->dev); +if (match) + config = (struct tegra_gpio_soc_config *)match->data; +else + config = &tegra20_gpio_config; + + tegra_gpio_bank_stride = config->bank_stride; + tegra_gpio_upper_offset = config->upper_offset; +for (;;) { res =platform_get_resource (pdev,IORESOURCE_IRQ , tegra_gpio_bank_count);if (!res)
@@ -441,11 +475,6 @@ static int __devinit tegra_gpio_probe(struct platform_device *pdev)return 0 ; } -static struct of_device_id tegra_gpio_of_match[]__devinitdata = { - { .compatible ="nvidia,tegra20-gpio" , }, - { }, -}; -static struct platform_driver tegra_gpio_driver = { .driver = { .name ="tegra-gpio" ,
Signature · 1 line
1.7.0.4
PATCH 3/11 gpio: tegra: fix register address calculations for Tegra30
Quoted 14 lines · Stephen Warren
From: Stephen Warren <[email protected]>
Tegra20 and Tegra30 share the same register layout within registers, but the addresses of the registers is a little different. Fix the driver to cope with this.
drivers/gpio/gpio-tegra.c +4
-0@@ -333,6 +336,26 @@ static struct irq_chip tegra_gpio_irq_chip = {#endif }; +struct tegra_gpio_soc_config { +u32 bank_stride; +u32 upper_offset; +};
drivers/gpio/gpio-tegra.c static struct irq_chip tegra_gpio_irq_chip = { · line 352
Quoted 10 lines
drivers/gpio/gpio-tegra.c +10
-0+ +static struct tegra_gpio_soc_config tegra20_gpio_config = { + .bank_stride =0x80 , + .upper_offset =0x800 , +}; + +static struct tegra_gpio_soc_config tegra30_gpio_config = { + .bank_stride =0x100 , + .upper_offset =0x80 , +};
Hmm. I wonder if this would be better to just describe in the device tree bindings for the gpio controller? Perhaps split the reg property in a higher and lower to take care of the offset, and add a nvidia,bank-stride=<x> property?
-Olof
PATCH 3/11 gpio: tegra: fix register address calculations for Tegra30
Quoted 22 lines · Olof Johansson
Quoted 21 lines · Stephen Warren
From: Stephen Warren <[email protected]>
Tegra20 and Tegra30 share the same register layout within registers, but the addresses of the registers is a little different. Fix the driver to cope with this.
drivers/gpio/gpio-tegra.c +11
-0@@ -333,6 +336,26 @@ static struct irq_chip tegra_gpio_irq_chip = {#endif }; +struct tegra_gpio_soc_config { +u32 bank_stride; +u32 upper_offset; +}; + +static struct tegra_gpio_soc_config tegra20_gpio_config = { + .bank_stride =0x80 , + .upper_offset =0x800 , +}; + +static struct tegra_gpio_soc_config tegra30_gpio_config = {
Quoted 8 lines
drivers/gpio/gpio-tegra.c static struct irq_chip tegra_gpio_irq_chip = { · line 352
Quoted 3 lines
drivers/gpio/gpio-tegra.c +3
-0+ .bank_stride = 0x100, + .upper_offset = 0x80, +};Hmm. I wonder if this would be better to just describe in the device tree bindings for the gpio controller? Perhaps split the reg property in a higher and lower to take care of the offset, and add a nvidia,bank-stride=<x> property?
Splitting the reg property in two wouldn't really work. Notice that on Tegra20, bank_stride is less than upper_offset whereas on Tegra30, bank_stride is larger than upper_offset, so the issue is that in one case the registers are interleaved and in the other in separate chunks.
I guess we could put those values into DT, but they only vary per SoC not per board, so there didn't seem much need.
I believe the Tegra30 register layout is applicable to future chips if it matters.
PATCH 3/11 gpio: tegra: fix register address calculations for Tegra30
Quoted 37 lines · Stephen Warren
Quoted 22 lines · Olof Johansson
Quoted 21 lines · Stephen Warren
From: Stephen Warren <[email protected]>
Tegra20 and Tegra30 share the same register layout within registers, but the addresses of the registers is a little different. Fix the driver to cope with this.
drivers/gpio/gpio-tegra.c +11
-0@@ -333,6 +336,26 @@ static struct irq_chip tegra_gpio_irq_chip = {#endif }; +struct tegra_gpio_soc_config { +u32 bank_stride; +u32 upper_offset; +}; + +static struct tegra_gpio_soc_config tegra20_gpio_config = { + .bank_stride =0x80 , + .upper_offset =0x800 , +}; + +static struct tegra_gpio_soc_config tegra30_gpio_config = {Quoted 8 lines
drivers/gpio/gpio-tegra.c static struct irq_chip tegra_gpio_irq_chip = { · line 352
Quoted 3 lines
drivers/gpio/gpio-tegra.c +3
-0+ .bank_stride = 0x100, + .upper_offset = 0x80, +};Hmm. I wonder if this would be better to just describe in the device tree bindings for the gpio controller? Perhaps split the reg property in a higher and lower to take care of the offset, and add a nvidia,bank-stride=<x> property?
Splitting the reg property in two wouldn't really work. Notice that on Tegra20,
bank_strideis less thanupper_offsetwhereas on Tegra30,bank_strideis larger thanupper_offset, so the issue is that in one case the registers are interleaved and in the other in separate chunks.
Quoted 5 lines
I guess we could put those values into DT, but they only vary per SoC not per board, so there didn't seem much need.
I believe the Tegra30 register layout is applicable to future chips if it matters.
Ok, that's sufficient for me right now then.
-Olof
PATCH 4/11 gpio: tegra: Iterate over the correct number of banks
In reply to Stephen WarrenFrom: Stephen Warren <[email protected]>
When Tegra30 support was added to the Tegra GPIO driver, a few places which iterated over all banks were not converted to use the variable tegra_gpio_bank_count rather than hard-coding the bank count. Fix this.
--- drivers/gpio/gpio-tegra.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
drivers/gpio/gpio-tegra.c +2 -2
@@ -436,7 +436,7 @@ static int __devinit tegra_gpio_probe(struct platform_device *pdev)return -ENODEV ; } -for (i =0 ; i <7 ; i++) { +for (i =0 ; i < tegra_gpio_bank_count; i++) {for (j =0 ; j <4 ; j++) {int gpio =tegra_gpio_compose (i, j,0 );tegra_gpio_writel (0x00 ,GPIO_INT_ENB (gpio));
@@ -514,7 +514,7 @@ static int dbg_gpio_show(struct seq_file *s, void *unused)int i;int j; -for (i =0 ; i <7 ; i++) { +for (i =0 ; i < tegra_gpio_bank_count; i++) {for (j =0 ; j <4 ; j++) {int gpio =tegra_gpio_compose (i, j,0 ); seq_printf(s,
Signature · 1 line
1.7.0.4
PATCH 4/11 gpio: tegra: Iterate over the correct number of banks
Quoted 7 lines · Stephen Warren
From: Stephen Warren <[email protected]>
When Tegra30 support was added to the Tegra GPIO driver, a few places which iterated over all banks were not converted to use the variable
tegra_gpio_bank_countrather than hard-coding the bank count. Fix this.Signed-off-by Stephen Warren <[email protected]>
Should this be fixed in 3.4 as well? Given the need for some of the other patches in this series I suppose gpio isn't really working on tegra30 there though, so it's not technically a regression...
-Olof
PATCH 4/11 gpio: tegra: Iterate over the correct number of banks
Quoted 7 lines · Olof Johansson
Quoted 6 lines · Stephen Warren
From: Stephen Warren <[email protected]>
When Tegra30 support was added to the Tegra GPIO driver, a few places which iterated over all banks were not converted to use the variable
tegra_gpio_bank_countrather than hard-coding the bank count. Fix this.
Quoted 7 lines
Quoted 1 line
Signed-off-by Stephen Warren <[email protected]>Acked-by Olof Johansson <[email protected]>Should this be fixed in 3.4 as well? Given the need for some of the other patches in this series I suppose gpio isn't really working on tegra30 there though, so it's not technically a regression...
It's probably not a bad idea, even if we don't expect many users; the code may as well be correct. I assume since 3.4 is still in the rc stage, I would send an explicit pull request to arm-soc for that rather than just Cc: stable.
I wonder if "gpio: tegra: fix register address calculations for Tegra30" shouldn't be applied (after addressing your comments) for 3.4 too? It might be a little large of a change?
PATCH 4/11 gpio: tegra: Iterate over the correct number of banks
Quoted 12 lines · Stephen Warren
Quoted 11 lines · Olof Johansson
Quoted 7 lines · Stephen Warren
From: Stephen Warren <[email protected]>
When Tegra30 support was added to the Tegra GPIO driver, a few places which iterated over all banks were not converted to use the variable
tegra_gpio_bank_countrather than hard-coding the bank count. Fix this.Signed-off-by Stephen Warren <[email protected]>Acked-by Olof Johansson <[email protected]>
Quoted 8 lines
Quoted 3 lines
Should this be fixed in 3.4 as well? Given the need for some of the other patches in this series I suppose gpio isn't really working on tegra30 there though, so it's not technically a regression...
It's probably not a bad idea, even if we don't expect many users; the code may as well be correct. I assume since 3.4 is still in the rc stage, I would send an explicit pull request to arm-soc for that rather than just Cc: stable.
Correct.
Quoted 3 lines
I wonder if "gpio: tegra: fix register address calculations for Tegra30" shouldn't be applied (after addressing your comments) for 3.4 too? It might be a little large of a change?
Yep, that one too.
-Olof
PATCH 5/11 gpio: tegra: configure pins during irq_set_type
In reply to Stephen WarrenFrom: Stephen Warren <[email protected]>
When a Tegra GPIO is used as an IRQ, it should be enabled as a GPIO (so the pinmux module isn't driving it as an output) and configured as a GPIO input (so the GPIO module isn't driving it as an output). Set this up automatically whenever an IRQ is requested, so that users of IRQs don't need to do this.
--- drivers/gpio/gpio-tegra.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-)
drivers/gpio/gpio-tegra.c +3 -0
@@ -224,6 +224,9 @@ static int tegra_gpio_irq_set_type(struct irq_data *d, unsigned int type)spin_unlock_irqrestore (&bank->lvl_lock[port], flags); +tegra_gpio_mask_write (GPIO_MSK_OE (gpio), gpio,0 ); +tegra_gpio_enable (gpio); +if (type & (IRQ_TYPE_LEVEL_LOW |IRQ_TYPE_LEVEL_HIGH ))__irq_set_handler_locked (d->irq, handle_level_irq);else if (type & (IRQ_TYPE_EDGE_FALLING |IRQ_TYPE_EDGE_RISING ))
Signature · 1 line
1.7.0.4
PATCH 5/11 gpio: tegra: configure pins during irq_set_type
Quoted 9 lines · Stephen Warren
From: Stephen Warren <[email protected]>
When a Tegra GPIO is used as an IRQ, it should be enabled as a GPIO (so the pinmux module isn't driving it as an output) and configured as a GPIO input (so the GPIO module isn't driving it as an output). Set this up automatically whenever an IRQ is requested, so that users of IRQs don't need to do this.
Signed-off-by Stephen Warren <[email protected]>
PATCH 6/11 ARM: tegra: seaboard: Don't gpio_request() ISL29018_IRQ
In reply to Stephen WarrenFrom: Stephen Warren <[email protected]>
Don't call gpio_request() or gpio_direction_input() for ISL29018_IRQ. This pin is only used as an IRQ, and hence no GPIO configuration should be necessary; the GPIO/IRQ driver should (and does) perform any required setup when the IRQ is requested.
--- arch/arm/mach-tegra/board-seaboard.c | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-)
arch/arm/mach-tegra/board-seaboard.c +0 -3
@@ -199,9 +199,6 @@ static int seaboard_ehci_init(void)static void __init seaboard_i2c_init (void ) { -gpio_request (TEGRA_GPIO_ISL29018_IRQ ,"isl29018" ); -gpio_direction_input (TEGRA_GPIO_ISL29018_IRQ ); - isl29018_device.irq =gpio_to_irq (TEGRA_GPIO_ISL29018_IRQ );i2c_register_board_info (0 , &isl29018_device,1 );
Signature · 1 line
1.7.0.4
PATCH 6/11 ARM: tegra: seaboard: Don't gpio_request() ISL29018_IRQ
Quoted 8 lines · Stephen Warren
From: Stephen Warren <[email protected]>
Don't call
gpio_request()orgpio_direction_input()forISL29018_IRQ. This pin is only used as an IRQ, and hence no GPIO configuration should be necessary; the GPIO/IRQ driver should (and does) perform any required setup when the IRQ is requested.Signed-off-by Stephen Warren <[email protected]>
PATCH 7/11 gpio: tegra: Hide tegra_gpio_enable/disable()
In reply to Stephen WarrenFrom: Stephen Warren <[email protected]>
Recent pinctrl discussions concluded that gpiolib APIs should in fact do whatever is required to mux a GPIO onto pins, by calling pinctrl APIs if required. This change implements this for the Tegra GPIO driver, and removes calls to the Tegra-specific APIs from drivers and board files.
---
v2: Adjusted per changes to latest version of Documentation/gpio.txt. Fixed tegra_board_pinmux_bus_notify() to still check the device name, so it waits for the pinmux device to be registered, not just /any/ device.
--- arch/arm/mach-tegra/board-dt-tegra20.c | 1 - arch/arm/mach-tegra/board-harmony-pinmux.c | 17 ----------- arch/arm/mach-tegra/board-paz00-pinmux.c | 14 --------- arch/arm/mach-tegra/board-pinmux.c | 33 +++-------------------- arch/arm/mach-tegra/board-pinmux.h | 5 --- arch/arm/mach-tegra/board-seaboard-pinmux.c | 32 ---------------------- arch/arm/mach-tegra/board-seaboard.c | 1 - arch/arm/mach-tegra/board-trimslice-pinmux.c | 12 -------- arch/arm/mach-tegra/include/mach/gpio-tegra.h | 9 ------ arch/arm/mach-tegra/usb_phy.c | 1 - drivers/gpio/gpio-tegra.c | 36 ++++++++++++------------ drivers/mmc/host/sdhci-tegra.c | 24 +++------------- 12 files changed, 27 insertions(+), 158 deletions(-)
arch/arm/mach-tegra/board-dt-tegra20.c +0 -1
@@ -55,7 +55,6 @@ void ventana_pinmux_init(void);struct of_dev_auxdata tegra20_auxdata_lookup[]__initdata = {OF_DEV_AUXDATA ("nvidia,tegra20-pinmux" ,TEGRA_APB_MISC_BASE +0x14 ,"tegra-pinmux" ,NULL ), -OF_DEV_AUXDATA ("nvidia,tegra20-gpio" ,TEGRA_GPIO_BASE ,"tegra-gpio" ,NULL ),OF_DEV_AUXDATA ("nvidia,tegra20-sdhci" ,TEGRA_SDMMC1_BASE ,"sdhci-tegra.0" ,NULL ),OF_DEV_AUXDATA ("nvidia,tegra20-sdhci" ,TEGRA_SDMMC2_BASE ,"sdhci-tegra.1" ,NULL ),OF_DEV_AUXDATA ("nvidia,tegra20-sdhci" ,TEGRA_SDMMC3_BASE ,"sdhci-tegra.2" ,NULL ),
arch/arm/mach-tegra/board-harmony-pinmux.c +0 -17
@@ -15,13 +15,11 @@*/ #include <linux/kernel.h> -#include <linux/gpio.h> #include <linux/of.h> #include <mach/pinmux.h> #include <mach/pinmux-tegra20.h> -#include "gpio-names.h" #include "board-harmony.h" #include "board-pinmux.h"
@@ -144,24 +142,9 @@ static struct tegra_pingroup_config harmony_pinmux[] = { {TEGRA_PINGROUP_XM2D, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, }; -static struct tegra_gpio_table gpio_table[] = { - { .gpio =TEGRA_GPIO_SD2_CD , .enable = true }, - { .gpio =TEGRA_GPIO_SD2_WP , .enable = true }, - { .gpio =TEGRA_GPIO_SD2_POWER , .enable = true }, - { .gpio =TEGRA_GPIO_SD4_CD , .enable = true }, - { .gpio =TEGRA_GPIO_SD4_WP , .enable = true }, - { .gpio =TEGRA_GPIO_SD4_POWER , .enable = true }, - { .gpio =TEGRA_GPIO_CDC_IRQ , .enable = true }, - { .gpio =TEGRA_GPIO_HP_DET , .enable = true }, - { .gpio =TEGRA_GPIO_INT_MIC_EN , .enable = true }, - { .gpio =TEGRA_GPIO_EXT_MIC_EN , .enable = true }, -}; -static struct tegra_board_pinmux_conf conf = { .pgs = harmony_pinmux, .pg_count =ARRAY_SIZE (harmony_pinmux), - .gpios = gpio_table, - .gpio_count =ARRAY_SIZE (gpio_table), };void harmony_pinmux_init (void )
arch/arm/mach-tegra/board-paz00-pinmux.c +0 -14
@@ -15,13 +15,11 @@*/ #include <linux/kernel.h> -#include <linux/gpio.h> #include <linux/of.h> #include <mach/pinmux.h> #include <mach/pinmux-tegra20.h> -#include "gpio-names.h" #include "board-paz00.h" #include "board-pinmux.h"
@@ -144,21 +142,9 @@ static struct tegra_pingroup_config paz00_pinmux[] = { {TEGRA_PINGROUP_XM2D, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, }; -static struct tegra_gpio_table gpio_table[] = { - { .gpio =TEGRA_GPIO_SD1_CD , .enable = true }, - { .gpio =TEGRA_GPIO_SD1_WP , .enable = true }, - { .gpio =TEGRA_GPIO_SD1_POWER , .enable = true }, - { .gpio =TEGRA_ULPI_RST , .enable = true }, - { .gpio =TEGRA_WIFI_PWRN , .enable = true }, - { .gpio =TEGRA_WIFI_RST , .enable = true }, - { .gpio =TEGRA_WIFI_LED , .enable = true }, -}; -static struct tegra_board_pinmux_conf conf = { .pgs = paz00_pinmux, .pg_count =ARRAY_SIZE (paz00_pinmux), - .gpios = gpio_table, - .gpio_count =ARRAY_SIZE (gpio_table), };void paz00_pinmux_init (void )
arch/arm/mach-tegra/board-pinmux.c +4 -29
@@ -18,7 +18,6 @@#include <linux/of.h> #include <linux/string.h> -#include <mach/gpio-tegra.h> #include <mach/pinmux.h> #include "board-pinmux.h"
@@ -26,18 +25,6 @@struct tegra_board_pinmux_conf *confs[2 ]; -static void tegra_board_pinmux_setup_gpios (void ) -{ -int i; - -for (i =0 ; i <ARRAY_SIZE (confs); i++) { -if (!confs[i]) -continue ; - -tegra_gpio_config (confs[i]->gpios, confs[i]->gpio_count); - } -} -static void tegra_board_pinmux_setup_pinmux (void ) {int i;
@@ -57,29 +44,17 @@ static void tegra_board_pinmux_setup_pinmux(void)static int tegra_board_pinmux_bus_notify (struct notifier_block *nb,unsigned long event,void *vdev) { -static bool had_gpio; -static bool had_pinmux; -struct device *dev = vdev; -const char *devname;if (event !=BUS_NOTIFY_BOUND_DRIVER )return NOTIFY_DONE ; - devname =dev_name (dev); +if (strcmp (dev_name (dev),PINMUX_DEV )) +return NOTIFY_DONE ; -if (!had_gpio && !strcmp (devname,GPIO_DEV )) { -tegra_board_pinmux_setup_gpios (); - had_gpio = true; - }else if (!had_pinmux && !strcmp (devname,PINMUX_DEV )) { -tegra_board_pinmux_setup_pinmux (); - had_pinmux = true; - } +tegra_board_pinmux_setup_pinmux (); -if (had_gpio && had_pinmux) -return NOTIFY_STOP_MASK ; -else -return NOTIFY_DONE ; +return NOTIFY_STOP_MASK ; }static struct notifier_block nb = {
arch/arm/mach-tegra/board-pinmux.h +0 -5
@@ -15,11 +15,9 @@ #ifndef __MACH_TEGRA_BOARD_PINMUX_H #define __MACH_TEGRA_BOARD_PINMUX_H -#define GPIO_DEV "tegra-gpio" #define PINMUX_DEV "tegra-pinmux" struct tegra_pingroup_config; -struct tegra_gpio_table; struct tegra_board_pinmux_conf { struct tegra_pingroup_config *pgs;
@@ -27,9 +25,6 @@ struct tegra_board_pinmux_conf {struct tegra_drive_pingroup_config *drives;int drive_count; - -struct tegra_gpio_table *gpios; -int gpio_count; }; void tegra_board_pinmux_init(struct tegra_board_pinmux_conf *conf_a,
arch/arm/mach-tegra/board-seaboard-pinmux.c +0 -32
@@ -15,13 +15,11 @@#include <linux/kernel.h> #include <linux/init.h> -#include <linux/gpio.h> #include <linux/of.h> #include <mach/pinmux.h> #include <mach/pinmux-tegra20.h> -#include "gpio-names.h" #include "board-pinmux.h" #include "board-seaboard.h"
@@ -179,35 +177,9 @@ static struct tegra_pingroup_config ventana_pinmux[] = { {TEGRA_PINGROUP_SPIG, TEGRA_MUX_SPI2_ALT, TEGRA_PUPD_NORMAL, TEGRA_TRI_TRISTATE}, }; -static struct tegra_gpio_table common_gpio_table[] = { - { .gpio =TEGRA_GPIO_SD2_CD , .enable = true }, - { .gpio =TEGRA_GPIO_SD2_WP , .enable = true }, - { .gpio =TEGRA_GPIO_SD2_POWER , .enable = true }, - { .gpio =TEGRA_GPIO_CDC_IRQ , .enable = true }, -}; - -static struct tegra_gpio_table seaboard_gpio_table[] = { - { .gpio =TEGRA_GPIO_LIDSWITCH , .enable = true }, - { .gpio =TEGRA_GPIO_POWERKEY , .enable = true }, - { .gpio =TEGRA_GPIO_HP_DET , .enable = true }, - { .gpio =TEGRA_GPIO_ISL29018_IRQ , .enable = true }, - { .gpio =TEGRA_GPIO_USB1 , .enable = true }, -}; - -static struct tegra_gpio_table ventana_gpio_table[] = { -/* hp_det */ - { .gpio =TEGRA_GPIO_PW2 , .enable = true }, -/* int_mic_en */ - { .gpio =TEGRA_GPIO_PX0 , .enable = true }, -/* ext_mic_en */ - { .gpio =TEGRA_GPIO_PX1 , .enable = true }, -}; -static struct tegra_board_pinmux_conf common_conf = { .pgs = common_pinmux, .pg_count =ARRAY_SIZE (common_pinmux), - .gpios = common_gpio_table, - .gpio_count =ARRAY_SIZE (common_gpio_table), }; static struct tegra_board_pinmux_conf seaboard_conf = {
@@ -215,15 +187,11 @@ static struct tegra_board_pinmux_conf seaboard_conf = { .pg_count = ARRAY_SIZE(seaboard_pinmux), .drives = seaboard_drive_pinmux, .drive_count = ARRAY_SIZE(seaboard_drive_pinmux), - .gpios = seaboard_gpio_table, - .gpio_count = ARRAY_SIZE(seaboard_gpio_table), };static struct tegra_board_pinmux_conf ventana_conf = { .pgs = ventana_pinmux, .pg_count =ARRAY_SIZE (ventana_pinmux), - .gpios = ventana_gpio_table, - .gpio_count =ARRAY_SIZE (ventana_gpio_table), };void seaboard_pinmux_init (void )
arch/arm/mach-tegra/board-seaboard.c +0 -1
@@ -248,7 +248,6 @@ static void __init tegra_kaen_init(void) debug_uart_platform_data[0 ].irq =INT_UARTB ; seaboard_audio_pdata.gpio_hp_mute =TEGRA_GPIO_KAEN_HP_MUTE ; -tegra_gpio_enable (TEGRA_GPIO_KAEN_HP_MUTE );seaboard_common_init ();
arch/arm/mach-tegra/board-trimslice-pinmux.c +0 -12
@@ -13,7 +13,6 @@* GNU General Public License for more details. * */ -#include <linux/gpio.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/of.h>
@@ -21,7 +20,6 @@#include <mach/pinmux.h> #include <mach/pinmux-tegra20.h> -#include "gpio-names.h" #include "board-pinmux.h" #include "board-trimslice.h"
@@ -144,19 +142,9 @@ static struct tegra_pingroup_config trimslice_pinmux[] = { {TEGRA_PINGROUP_XM2D, TEGRA_MUX_NONE, TEGRA_PUPD_NORMAL, TEGRA_TRI_NORMAL}, }; -static struct tegra_gpio_table gpio_table[] = { - { .gpio =TRIMSLICE_GPIO_SD4_CD , .enable = true },/* mmc4 cd */ - { .gpio =TRIMSLICE_GPIO_SD4_WP , .enable = true },/* mmc4 wp */ - - { .gpio =TRIMSLICE_GPIO_USB1_MODE , .enable = true },/* USB1 mode */ - { .gpio =TRIMSLICE_GPIO_USB2_RST , .enable = true },/* USB2 PHY rst */ -}; -static struct tegra_board_pinmux_conf conf = { .pgs = trimslice_pinmux, .pg_count =ARRAY_SIZE (trimslice_pinmux), - .gpios = gpio_table, - .gpio_count =ARRAY_SIZE (gpio_table), };void trimslice_pinmux_init (void )
arch/arm/mach-tegra/include/mach/gpio-tegra.h +0 -9
@@ -25,13 +25,4 @@#define TEGRA_NR_GPIOS INT_GPIO_NR -struct tegra_gpio_table { -int gpio;/* GPIO number */ -bool enable;/* Enable for GPIO at init? */ -}; - -void tegra_gpio_config (struct tegra_gpio_table *table,int num); -void tegra_gpio_enable (int gpio); -void tegra_gpio_disable (int gpio); -#endif
arch/arm/mach-tegra/usb_phy.c +0 -1
@@ -711,7 +711,6 @@ struct tegra_usb_phy *tegra_usb_phy_open(int instance, void __iomem *regs, err = -ENXIO ; goto err1; } -tegra_gpio_enable (ulpi_config->reset_gpio);gpio_request (ulpi_config->reset_gpio,"ulpi_phy_reset_b" );gpio_direction_output (ulpi_config->reset_gpio,0 ); phy->ulpi =otg_ulpi_create (&ulpi_viewport_access_ops,0 );
drivers/gpio/gpio-tegra.c +18 -18
@@ -26,10 +26,10 @@#include <linux/platform_device.h> #include <linux/module.h> #include <linux/irqdomain.h> +#include <linux/pinctrl/consumer.h> #include <asm/mach/irq.h> -#include <mach/gpio-tegra.h> #include <mach/iomap.h> #include <mach/suspend.h>
@@ -108,18 +108,29 @@ static void tegra_gpio_mask_write(u32 reg, int gpio, int value)tegra_gpio_writel (val, reg); } -void tegra_gpio_enable (int gpio) +static void tegra_gpio_enable (int gpio) {tegra_gpio_mask_write (GPIO_MSK_CNF (gpio), gpio,1 ); }EXPORT_SYMBOL_GPL (tegra_gpio_enable); -void tegra_gpio_disable (int gpio) +static void tegra_gpio_disable (int gpio) {tegra_gpio_mask_write (GPIO_MSK_CNF (gpio), gpio,0 ); }EXPORT_SYMBOL_GPL (tegra_gpio_disable); +int tegra_gpio_request (struct gpio_chip *chip,unsigned offset) +{ +return pinctrl_request_gpio (offset); +} + +void tegra_gpio_free (struct gpio_chip *chip,unsigned offset) +{ +pinctrl_free_gpio (offset); +tegra_gpio_disable (offset); +} +static void tegra_gpio_set (struct gpio_chip *chip,unsigned offset,int value) {tegra_gpio_mask_write (GPIO_MSK_OUT (offset), offset, value);
@@ -133,6 +144,7 @@ static int tegra_gpio_get(struct gpio_chip *chip, unsigned offset)static int tegra_gpio_direction_input (struct gpio_chip *chip,unsigned offset) {tegra_gpio_mask_write (GPIO_MSK_OE (offset), offset,0 ); +tegra_gpio_enable (offset);return 0 ; }
@@ -141,6 +153,7 @@ static int tegra_gpio_direction_output(struct gpio_chip *chip, unsigned offset, {tegra_gpio_set (chip, offset, value);tegra_gpio_mask_write (GPIO_MSK_OE (offset), offset,1 ); +tegra_gpio_enable (offset);return 0 ; }
@@ -151,13 +164,14 @@ static int tegra_gpio_to_irq(struct gpio_chip *chip, unsigned offset)static struct gpio_chip tegra_gpio_chip = { .label ="tegra-gpio" , + .request = tegra_gpio_request, + .free = tegra_gpio_free, .direction_input = tegra_gpio_direction_input, .get = tegra_gpio_get, .direction_output = tegra_gpio_direction_output, .set = tegra_gpio_set, .to_irq = tegra_gpio_to_irq, .base =0 , - .ngpio =TEGRA_NR_GPIOS , };static void tegra_gpio_irq_ack (struct irq_data *d)
@@ -493,20 +507,6 @@ static int __init tegra_gpio_init(void) }postcore_initcall (tegra_gpio_init); -void tegra_gpio_config (struct tegra_gpio_table *table,int num) -{ -int i; - -for (i =0 ; i < num; i++) { -int gpio = table[i].gpio; - -if (table[i].enable) -tegra_gpio_enable (gpio); -else -tegra_gpio_disable (gpio); - } -} -#ifdef CONFIG_DEBUG_FS #include <linux/debugfs.h>
drivers/mmc/host/sdhci-tegra.c +5 -19
@@ -269,7 +269,6 @@ static int __devinit sdhci_tegra_probe(struct platform_device *pdev) "failed to allocate power gpio\n"); goto err_power_req; } -tegra_gpio_enable (plat->power_gpio);gpio_direction_output (plat->power_gpio,1 ); }
@@ -280,7 +279,6 @@ static int __devinit sdhci_tegra_probe(struct platform_device *pdev) "failed to allocate cd gpio\n"); goto err_cd_req; } -tegra_gpio_enable (plat->cd_gpio);gpio_direction_input (plat->cd_gpio); rc = request_irq(gpio_to_irq(plat->cd_gpio), carddetect_irq,
@@ -301,7 +299,6 @@ static int __devinit sdhci_tegra_probe(struct platform_device *pdev) "failed to allocate wp gpio\n"); goto err_wp_req; } -tegra_gpio_enable (plat->wp_gpio);gpio_direction_input (plat->wp_gpio); }
@@ -329,23 +326,17 @@ err_add_host:clk_disable (pltfm_host->clk);clk_put (pltfm_host->clk); err_clk_get: -if (gpio_is_valid (plat->wp_gpio)) { -tegra_gpio_disable (plat->wp_gpio); +if (gpio_is_valid (plat->wp_gpio))gpio_free (plat->wp_gpio); - } err_wp_req:if (gpio_is_valid (plat->cd_gpio))free_irq (gpio_to_irq (plat->cd_gpio), host); err_cd_irq_req: -if (gpio_is_valid (plat->cd_gpio)) { -tegra_gpio_disable (plat->cd_gpio); +if (gpio_is_valid (plat->cd_gpio))gpio_free (plat->cd_gpio); - } err_cd_req: -if (gpio_is_valid (plat->power_gpio)) { -tegra_gpio_disable (plat->power_gpio); +if (gpio_is_valid (plat->power_gpio))gpio_free (plat->power_gpio); - } err_power_req: err_no_plat:sdhci_pltfm_free (pdev);
@@ -362,21 +353,16 @@ static int __devexit sdhci_tegra_remove(struct platform_device *pdev)sdhci_remove_host (host, dead); -if (gpio_is_valid (plat->wp_gpio)) { -tegra_gpio_disable (plat->wp_gpio); +if (gpio_is_valid (plat->wp_gpio))gpio_free (plat->wp_gpio); - }if (gpio_is_valid (plat->cd_gpio)) {free_irq (gpio_to_irq (plat->cd_gpio), host); -tegra_gpio_disable (plat->cd_gpio);gpio_free (plat->cd_gpio); } -if (gpio_is_valid (plat->power_gpio)) { -tegra_gpio_disable (plat->power_gpio); +if (gpio_is_valid (plat->power_gpio))gpio_free (plat->power_gpio); - }clk_disable (pltfm_host->clk);clk_put (pltfm_host->clk);
Signature · 1 line
1.7.0.4
PATCH 7/11 gpio: tegra: Hide tegra_gpio_enable/disable()
Hi Stephen,
Quoted 14 lines · Stephen Warren
From: Stephen Warren <[email protected]>
Recent pinctrl discussions concluded that gpiolib APIs should in fact do whatever is required to mux a GPIO onto pins, by calling pinctrl APIs if required. This change implements this for the Tegra GPIO driver, and removes calls to the Tegra-specific APIs from drivers and board files.
Cc Chris Ball <[email protected]>Cc linux-mmc at vger.kernel.orgSigned-off-by Stephen Warren <[email protected]>---
v2: Adjusted per changes to latest version ofDocumentation/gpio.txt. Fixedtegra_board_pinmux_bus_notify()to still check the device name, so it waits for the pinmux device to be registered, not just /any/ device.
Quoted 12 lines
--- arch/arm/mach-tegra/board-dt-tegra20.c | 1 - arch/arm/mach-tegra/board-harmony-pinmux.c | 17 ----------- arch/arm/mach-tegra/board-paz00-pinmux.c | 14 --------- arch/arm/mach-tegra/board-pinmux.c | 33 +++-------------------- arch/arm/mach-tegra/board-pinmux.h | 5 --- arch/arm/mach-tegra/board-seaboard-pinmux.c | 32 ---------------------- arch/arm/mach-tegra/board-seaboard.c | 1 - arch/arm/mach-tegra/board-trimslice-pinmux.c | 12 -------- arch/arm/mach-tegra/include/mach/gpio-tegra.h | 9 ------ arch/arm/mach-tegra/usb_phy.c | 1 - drivers/gpio/gpio-tegra.c | 36 ++++++++++++------------
For this hunk:
Quoted 1 line
drivers/mmc/host/sdhci-tegra.c | 24 +++-------------
Thanks,
- Chris.
Signature · 2 lines
Chris Ball <[email protected]> <http://printf.net/> One Laptop Per Child
PATCH 7/11 gpio: tegra: Hide tegra_gpio_enable/disable()
In reply to Stephen WarrenQuoted 10 lines · Stephen Warren
From: Stephen Warren <[email protected]>
Recent pinctrl discussions concluded that gpiolib APIs should in fact do whatever is required to mux a GPIO onto pins, by calling pinctrl APIs if required. This change implements this for the Tegra GPIO driver, and removes calls to the Tegra-specific APIs from drivers and board files.
Cc Chris Ball <[email protected]>Cc linux-mmc at vger.kernel.orgSigned-off-by Stephen Warren <[email protected]>
Good stuff. Tegra is starting to look like a role model thanks to your efforts Stephen.
Yours,
Linus Walleij
PATCH 7/11 gpio: tegra: Hide tegra_gpio_enable/disable()
In reply to Stephen WarrenQuoted 7 lines · Stephen Warren
From: Stephen Warren <[email protected]>
Recent pinctrl discussions concluded that gpiolib APIs should in fact do whatever is required to mux a GPIO onto pins, by calling pinctrl APIs if required. This change implements this for the Tegra GPIO driver, and removes calls to the Tegra-specific APIs from drivers and board files.
Quoted 7 lines
Cc Chris Ball <[email protected]>Cc linux-mmc at vger.kernel.orgSigned-off-by Stephen Warren <[email protected]>---
v2: Adjusted per changes to latest version ofDocumentation/gpio.txt. Fixedtegra_board_pinmux_bus_notify()to still check the device name, so it waits for the pinmux device to be registered, not just /any/ device.
I'm quite glad to see this happen. Erik had the intention to keep pin setup separate from gpio drivers, but in the end it just results in duplicate setup of the same stuff in different places. In hindsight this does seem quite a bit cleaner.
-Olof
PATCH 7/11 gpio: tegra: Hide tegra_gpio_enable/disable()
In reply to Stephen WarrenHi,
Quoted 14 lines · Stephen Warren
From: Stephen Warren <[email protected]>
Recent pinctrl discussions concluded that gpiolib APIs should in fact do whatever is required to mux a GPIO onto pins, by calling pinctrl APIs if required. This change implements this for the Tegra GPIO driver, and removes calls to the Tegra-specific APIs from drivers and board files.
Cc Chris Ball <[email protected]>Cc linux-mmc at vger.kernel.orgSigned-off-by Stephen Warren <[email protected]>---
v2: Adjusted per changes to latest version ofDocumentation/gpio.txt. Fixedtegra_board_pinmux_bus_notify()to still check the device name, so it waits for the pinmux device to be registered, not just /any/ device.
Quoted 14 lines
--- arch/arm/mach-tegra/board-dt-tegra20.c | 1 - arch/arm/mach-tegra/board-harmony-pinmux.c | 17 ----------- arch/arm/mach-tegra/board-paz00-pinmux.c | 14 --------- arch/arm/mach-tegra/board-pinmux.c | 33 +++-------------------- arch/arm/mach-tegra/board-pinmux.h | 5 --- arch/arm/mach-tegra/board-seaboard-pinmux.c | 32 ---------------------- arch/arm/mach-tegra/board-seaboard.c | 1 - arch/arm/mach-tegra/board-trimslice-pinmux.c | 12 -------- arch/arm/mach-tegra/include/mach/gpio-tegra.h | 9 ------ arch/arm/mach-tegra/usb_phy.c | 1 - drivers/gpio/gpio-tegra.c | 36 ++++++++++++------------ drivers/mmc/host/sdhci-tegra.c | 24 +++------------- 12 files changed, 27 insertions(+), 158 deletions(-)
For the MMC change:
- Chris.
Signature · 2 lines
Chris Ball <[email protected]> <http://printf.net/> One Laptop Per Child
PATCH 8/11 ARM: tegra: Switch to new pinctrl driver
In reply to Stephen WarrenFrom: Stephen Warren <[email protected]>
* Rename old pinmux and new pinctrl platform driver and DT match table entries, so the new driver gets instantiated.
* Re-write board-pinmux.c, so that it uses pinctrl APIs to configura the pinmux.
* Re-write board-*-pinmux.c so that the pinmux configuration tables are in pinctrl format.
Ventana's pin mux table needed some edits on top of the basic format conversion, since some mux options that were previously marked as reserved are now valid in the new pinctrl driver. Attempting to use the old reserved names will result in a failure. Specifically, groups lpw0, lpw2, lsc1, lsck, and lsda were changed from function rsvd4 to displaya, and group pta was changed from function rsvd2 to hdmi.
All boards' pin mux tables needed some edits on top of the based format conversion, since function i2c was split into i2c1 (first general I2C controller) and i2cp (power I2C controller) to better align function definitions with HW blocks.
Due to the split of mux tables into pure mux and pull/tristate tables, many entries in the separate Seaboard/Ventana tables could be merged into the common table, since the entries differed only in the portion in one of the tables, not both.
Most pin groups allow configuration of mux, tri-state, and pull. However, some don't allow pull configuration, which is instead configured by new groups that only allow pull configuration. This is a reflection of the true HW capabilities, which weren't fully represented by the old pinmux driver. This required adding new pull table entries for those new groups, and setting many other entries' pull configuration to TEGRA_PINCONFIG_DONT_SET.
---
v3: Remove GPIO-related code, use mapping table instead of pinctrl APIs
for all pinconfig setup. Don't tristate PCIe pingroups on Harmony.
Note: Before this version, this patch had the following acks, but I've removed them due to the rework:
Linus Walleij <[email protected]>
Olof Johansson <[email protected]>
v2: No change?
--- arch/arm/mach-tegra/board-harmony-pinmux.c | 249 ++++++++++---------- arch/arm/mach-tegra/board-paz00-pinmux.c | 249 ++++++++++---------- arch/arm/mach-tegra/board-pinmux.c | 76 ++++--- arch/arm/mach-tegra/board-pinmux.h | 35 +++- arch/arm/mach-tegra/board-seaboard-pinmux.c | 314 +++++++++++++------------- arch/arm/mach-tegra/board-trimslice-pinmux.c | 252 +++++++++++---------- arch/arm/mach-tegra/pinmux.c | 6 +- drivers/pinctrl/pinctrl-tegra.c | 6 +- 8 files changed, 609 insertions(+), 578 deletions(-)
arch/arm/mach-tegra/board-harmony-pinmux.c +126 -123
@@ -2,6 +2,7 @@* arch/arm/mach-tegra/board-harmony-pinmux.c * * Copyright (C) 2010 Google, Inc. +* Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and
@@ -15,136 +16,138 @@*/ #include <linux/kernel.h> -#include <linux/of.h> - -#include <mach/pinmux.h> -#include <mach/pinmux-tegra20.h> #include "board-harmony.h" #include "board-pinmux.h" -static struct tegra_pingroup_config harmony_pinmux[] = { - {TEGRA_PINGROUP_ATA ,TEGRA_MUX_IDE ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_ATB ,TEGRA_MUX_SDIO4 ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_ATC ,TEGRA_MUX_NAND ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_ATD ,TEGRA_MUX_GMI ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_ATE ,TEGRA_MUX_GMI ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_CDEV1 ,TEGRA_MUX_PLLA_OUT ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_CDEV2 ,TEGRA_MUX_PLLP_OUT4 ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_CRTP ,TEGRA_MUX_CRT ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_CSUS ,TEGRA_MUX_VI_SENSOR_CLK ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_DAP1 ,TEGRA_MUX_DAP1 ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_DAP2 ,TEGRA_MUX_DAP2 ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_DAP3 ,TEGRA_MUX_DAP3 ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_DAP4 ,TEGRA_MUX_DAP4 ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_DDC ,TEGRA_MUX_I2C2 ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_DTA ,TEGRA_MUX_SDIO2 ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_DTB ,TEGRA_MUX_RSVD1 ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_DTC ,TEGRA_MUX_RSVD1 ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_DTD ,TEGRA_MUX_SDIO2 ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_DTE ,TEGRA_MUX_RSVD1 ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_DTF ,TEGRA_MUX_I2C3 ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_GMA ,TEGRA_MUX_SDIO4 ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_GMB ,TEGRA_MUX_GMI ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_GMC ,TEGRA_MUX_UARTD ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_GMD ,TEGRA_MUX_GMI ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_GME ,TEGRA_MUX_SDIO4 ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_GPU ,TEGRA_MUX_GMI ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_GPU7 ,TEGRA_MUX_RTCK ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_GPV ,TEGRA_MUX_PCIE ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_HDINT ,TEGRA_MUX_HDMI ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_I2CP ,TEGRA_MUX_I2C ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_IRRX ,TEGRA_MUX_UARTA ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_IRTX ,TEGRA_MUX_UARTA ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_KBCA ,TEGRA_MUX_KBC ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_KBCB ,TEGRA_MUX_KBC ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_KBCC ,TEGRA_MUX_KBC ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_KBCD ,TEGRA_MUX_KBC ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_KBCE ,TEGRA_MUX_KBC ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_KBCF ,TEGRA_MUX_KBC ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LCSN ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_LD0 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LD1 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LD10 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LD11 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LD12 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LD13 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LD14 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LD15 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LD16 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LD17 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LD2 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LD3 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LD4 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LD5 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LD6 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LD7 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LD8 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LD9 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LDC ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_LDI ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LHP0 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LHP1 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LHP2 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LHS ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LM0 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LM1 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_LPP ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LPW0 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LPW1 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_LPW2 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LSC0 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LSC1 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_LSCK ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_LSDA ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_LSDI ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_LSPI ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LVP0 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_LVP1 ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_LVS ,TEGRA_MUX_DISPLAYA ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_OWC ,TEGRA_MUX_RSVD2 ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_PMC ,TEGRA_MUX_PWR_ON ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_PTA ,TEGRA_MUX_HDMI ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_RM ,TEGRA_MUX_I2C ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_SDB ,TEGRA_MUX_PWM ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_SDC ,TEGRA_MUX_PWM ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_SDD ,TEGRA_MUX_PWM ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_SDIO1 ,TEGRA_MUX_SDIO1 ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_SLXA ,TEGRA_MUX_PCIE ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_SLXC ,TEGRA_MUX_SPDIF ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_SLXD ,TEGRA_MUX_SPDIF ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_SLXK ,TEGRA_MUX_PCIE ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_SPDI ,TEGRA_MUX_RSVD2 ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_SPDO ,TEGRA_MUX_RSVD2 ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_SPIA ,TEGRA_MUX_GMI ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_SPIB ,TEGRA_MUX_GMI ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_SPIC ,TEGRA_MUX_GMI ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_SPID ,TEGRA_MUX_SPI1 ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_SPIE ,TEGRA_MUX_SPI1 ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_SPIF ,TEGRA_MUX_SPI1 ,TEGRA_PUPD_PULL_DOWN ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_SPIG ,TEGRA_MUX_SPI2_ALT ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_SPIH ,TEGRA_MUX_SPI2_ALT ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_UAA ,TEGRA_MUX_ULPI ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_UAB ,TEGRA_MUX_ULPI ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_UAC ,TEGRA_MUX_RSVD2 ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_UAD ,TEGRA_MUX_IRDA ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_UCA ,TEGRA_MUX_UARTC ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_UCB ,TEGRA_MUX_UARTC ,TEGRA_PUPD_PULL_UP ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_UDA ,TEGRA_MUX_ULPI ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_TRISTATE }, - {TEGRA_PINGROUP_CK32 ,TEGRA_MUX_NONE ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_DDRC ,TEGRA_MUX_NONE ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_PMCA ,TEGRA_MUX_NONE ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_PMCB ,TEGRA_MUX_NONE ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_PMCC ,TEGRA_MUX_NONE ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_PMCD ,TEGRA_MUX_NONE ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_PMCE ,TEGRA_MUX_NONE ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_XM2C ,TEGRA_MUX_NONE ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, - {TEGRA_PINGROUP_XM2D ,TEGRA_MUX_NONE ,TEGRA_PUPD_NORMAL ,TEGRA_TRI_NORMAL }, +static struct pinctrl_map harmony_map[] = { +TEGRA_MAP_MUXCONF ("ata" ,"ide" , none, driven), +TEGRA_MAP_MUXCONF ("atb" ,"sdio4" , none, driven), +TEGRA_MAP_MUXCONF ("atc" ,"nand" , none, driven), +TEGRA_MAP_MUXCONF ("atd" ,"gmi" , none, driven), +TEGRA_MAP_MUXCONF ("ate" ,"gmi" , none, driven), +TEGRA_MAP_MUXCONF ("cdev1" ,"plla_out" , none, driven), +TEGRA_MAP_MUXCONF ("cdev2" ,"pllp_out4" , down, tristate), +TEGRA_MAP_MUXCONF ("crtp" ,"crt" , none, tristate), +TEGRA_MAP_MUXCONF ("csus" ,"vi_sensor_clk" , down, tristate), +TEGRA_MAP_MUXCONF ("dap1" ,"dap1" , none, driven), +TEGRA_MAP_MUXCONF ("dap2" ,"dap2" , none, tristate), +TEGRA_MAP_MUXCONF ("dap3" ,"dap3" , none, tristate), +TEGRA_MAP_MUXCONF ("dap4" ,"dap4" , none, tristate), +TEGRA_MAP_MUXCONF ("ddc" ,"i2c2" , up, driven), +TEGRA_MAP_MUXCONF ("dta" ,"sdio2" , up, driven), +TEGRA_MAP_MUXCONF ("dtb" ,"rsvd1" , none, driven), +TEGRA_MAP_MUXCONF ("dtc" ,"rsvd1" , none, tristate), +TEGRA_MAP_MUXCONF ("dtd" ,"sdio2" , up, driven), +TEGRA_MAP_MUXCONF ("dte" ,"rsvd1" , none, tristate), +TEGRA_MAP_MUXCONF ("dtf" ,"i2c3" , none, tristate), +TEGRA_MAP_MUXCONF ("gma" ,"sdio4" , none, driven), +TEGRA_MAP_MUXCONF ("gmb" ,"gmi" , none, driven), +TEGRA_MAP_MUXCONF ("gmc" ,"uartd" , none, driven), +TEGRA_MAP_MUXCONF ("gmd" ,"gmi" , none, driven), +TEGRA_MAP_MUXCONF ("gme" ,"sdio4" , none, driven), +TEGRA_MAP_MUXCONF ("gpu" ,"gmi" , none, tristate), +TEGRA_MAP_MUXCONF ("gpu7" ,"rtck" , none, driven), +TEGRA_MAP_MUXCONF ("gpv" ,"pcie" , none, driven), +TEGRA_MAP_MUXCONF ("hdint" ,"hdmi" , na, tristate), +TEGRA_MAP_MUXCONF ("i2cp" ,"i2cp" , none, driven), +TEGRA_MAP_MUXCONF ("irrx" ,"uarta" , up, tristate), +TEGRA_MAP_MUXCONF ("irtx" ,"uarta" , up, tristate), +TEGRA_MAP_MUXCONF ("kbca" ,"kbc" , up, driven), +TEGRA_MAP_MUXCONF ("kbcb" ,"kbc" , up, driven), +TEGRA_MAP_MUXCONF ("kbcc" ,"kbc" , up, driven), +TEGRA_MAP_MUXCONF ("kbcd" ,"kbc" , up, driven), +TEGRA_MAP_MUXCONF ("kbce" ,"kbc" , up, driven), +TEGRA_MAP_MUXCONF ("kbcf" ,"kbc" , up, driven), +TEGRA_MAP_MUXCONF ("lcsn" ,"displaya" , na, tristate), +TEGRA_MAP_MUXCONF ("ld0" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("ld1" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("ld10" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("ld11" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("ld12" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("ld13" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("ld14" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("ld15" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("ld16" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("ld17" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("ld2" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("ld3" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("ld4" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("ld5" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("ld6" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("ld7" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("ld8" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("ld9" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("ldc" ,"displaya" , na, tristate), +TEGRA_MAP_MUXCONF ("ldi" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("lhp0" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("lhp1" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("lhp2" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("lhs" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("lm0" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("lm1" ,"displaya" , na, tristate), +TEGRA_MAP_MUXCONF ("lpp" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("lpw0" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("lpw1" ,"displaya" , na, tristate), +TEGRA_MAP_MUXCONF ("lpw2" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("lsc0" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("lsc1" ,"displaya" , na, tristate), +TEGRA_MAP_MUXCONF ("lsck" ,"displaya" , na, tristate), +TEGRA_MAP_MUXCONF ("lsda" ,"displaya" , na, tristate), +TEGRA_MAP_MUXCONF ("lsdi" ,"displaya" , na, tristate), +TEGRA_MAP_MUXCONF ("lspi" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("lvp0" ,"displaya" , na, tristate), +TEGRA_MAP_MUXCONF ("lvp1" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("lvs" ,"displaya" , na, driven), +TEGRA_MAP_MUXCONF ("owc" ,"rsvd2" , na, tristate), +TEGRA_MAP_MUXCONF ("pmc" ,"pwr_on" , na, driven), +TEGRA_MAP_MUXCONF ("pta" ,"hdmi" , none, driven), +TEGRA_MAP_MUXCONF ("rm" ,"i2c1" , none, driven), +TEGRA_MAP_MUXCONF ("sdb" ,"pwm" , na, tristate), +TEGRA_MAP_MUXCONF ("sdc" ,"pwm" , up, driven), +TEGRA_MAP_MUXCONF ("sdd" ,"pwm" , up, tristate), +TEGRA_MAP_MUXCONF ("sdio1" ,"sdio1" , none, tristate), +TEGRA_MAP_MUXCONF ("slxa" ,"pcie" , none, driven), +TEGRA_MAP_MUXCONF ("slxc" ,"spdif" , none, tristate), +TEGRA_MAP_MUXCONF ("slxd" ,"spdif" , none, tristate), +TEGRA_MAP_MUXCONF ("slxk" ,"pcie" , none, driven), +TEGRA_MAP_MUXCONF ("spdi" ,"rsvd2" , none, tristate), +TEGRA_MAP_MUXCONF ("spdo" ,"rsvd2" , none, tristate), +TEGRA_MAP_MUXCONF ("spia" ,"gmi" , none, driven), +TEGRA_MAP_MUXCONF ("spib" ,"gmi" , none, driven), +TEGRA_MAP_MUXCONF ("spic" ,"gmi" , up, tristate), +TEGRA_MAP_MUXCONF ("spid" ,"spi1" , down, tristate), +TEGRA_MAP_MUXCONF ("spie" ,"spi1" , up, tristate), +TEGRA_MAP_MUXCONF ("spif" ,"spi1" , down, tristate), +TEGRA_MAP_MUXCONF ("spig" ,"spi2_alt" , none, tristate), +TEGRA_MAP_MUXCONF ("spih" ,"spi2_alt" , up, tristate), +TEGRA_MAP_MUXCONF ("uaa" ,"ulpi" , up, tristate), +TEGRA_MAP_MUXCONF ("uab" ,"ulpi" , up, tristate), +TEGRA_MAP_MUXCONF ("uac" ,"rsvd2" , none, tristate), +TEGRA_MAP_MUXCONF ("uad" ,"irda" , up, tristate), +TEGRA_MAP_MUXCONF ("uca" ,"uartc" , up, tristate), +TEGRA_MAP_MUXCONF ("ucb" ,"uartc" , up, tristate), +TEGRA_MAP_MUXCONF ("uda" ,"ulpi" , none, tristate), +TEGRA_MAP_CONF ("ck32" , none, na), +TEGRA_MAP_CONF ("ddrc" , none, na), +TEGRA_MAP_CONF ("pmca" , none, na), +TEGRA_MAP_CONF ("pmcb" , none, na), +TEGRA_MAP_CONF ("pmcc" , none, na), +TEGRA_MAP_CONF ("pmcd" , none, na), +TEGRA_MAP_CONF ("pmce" , none, na), +TEGRA_MAP_CONF ("xm2c" , none, na), +TEGRA_MAP_CONF ("xm2d" , none, na), +TEGRA_MAP_CONF ("ls" , up, na), +TEGRA_MAP_CONF ("lc" , up, na), +TEGRA_MAP_CONF ("ld17_0" , down, na), +TEGRA_MAP_CONF ("ld19_18" , down, na), +TEGRA_MAP_CONF ("ld21_20" , down, na), +TEGRA_MAP_CONF ("ld23_22" , down, na), };static struct tegra_board_pinmux_conf conf = { - .pgs = harmony_pinmux, - .pg_count =ARRAY_SIZE (harmony_pinmux), + .maps = harmony_map, + .map_count =ARRAY_SIZE (harmony_map), };void harmony_pinmux_init (void )
arch/arm/mach-tegra/board-paz00-pinmux.c +126 -123
268 lines not on this page · raw message
arch/arm/mach-tegra/board-pinmux.c +43 -33
105 lines not on this page · raw message
arch/arm/mach-tegra/board-pinmux.h +28 -7
@@ -1,5 +1,5 @@/* -* Copyright (c) 2011, NVIDIA CORPORATION. All rights reserved. +* Copyright (c) 2011,2012, NVIDIA CORPORATION. All rights reserved. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and
@@ -15,16 +15,37 @@#ifndef __MACH_TEGRA_BOARD_PINMUX_H#define __MACH_TEGRA_BOARD_PINMUX_H +#include <linux/pinctrl/machine.h> + +#include <mach/pinconf-tegra.h> +#define PINMUX_DEV "tegra-pinmux" -struct tegra_pingroup_config ; +#define TEGRA_MAP_MUX (_group_, _function_) \ + PIN_MAP_MUX_GROUP_HOG_DEFAULT(PINMUX_DEV, _group_, _function_) -struct tegra_board_pinmux_conf { -struct tegra_pingroup_config *pgs; -int pg_count; +#define TEGRA_MAP_CONF (_group_, _pull_, _drive_) \ + PIN_MAP_CONFIGS_GROUP_HOG_DEFAULT(PINMUX_DEV, _group_, tegra_pincfg_pull##_pull_##_##_drive_) -struct tegra_drive_pingroup_config *drives; -int drive_count; +#define TEGRA_MAP_MUXCONF (_group_, _function_, _pull_, _drive_) \ + TEGRA_MAP_MUX(_group_, _function_), \ + TEGRA_MAP_CONF(_group_, _pull_, _drive_) + +extern unsigned long tegra_pincfg_pullnone_driven[2 ]; +extern unsigned long tegra_pincfg_pullnone_tristate[2 ]; +extern unsigned long tegra_pincfg_pullnone_na[1 ]; +extern unsigned long tegra_pincfg_pullup_driven[2 ]; +extern unsigned long tegra_pincfg_pullup_tristate[2 ]; +extern unsigned long tegra_pincfg_pullup_na[1 ]; +extern unsigned long tegra_pincfg_pulldown_driven[2 ]; +extern unsigned long tegra_pincfg_pulldown_tristate[2 ]; +extern unsigned long tegra_pincfg_pulldown_na[1 ]; +extern unsigned long tegra_pincfg_pullna_driven[1 ]; +extern unsigned long tegra_pincfg_pullna_tristate[1 ]; + +struct tegra_board_pinmux_conf { +struct pinctrl_map *maps; +int map_count; }; void tegra_board_pinmux_init(struct tegra_board_pinmux_conf *conf_a,
arch/arm/mach-tegra/board-seaboard-pinmux.c +153 -161
342 lines not on this page · raw message
arch/arm/mach-tegra/board-trimslice-pinmux.c +127 -125
270 lines not on this page · raw message
arch/arm/mach-tegra/pinmux.c +3 -3
@@ -711,10 +711,10 @@ void tegra_pinmux_config_pullupdown_table(const struct tegra_pingroup_config *costatic struct of_device_id tegra_pinmux_of_match[]__devinitdata = { #ifdef CONFIG_ARCH_TEGRA_2x_SOC - { .compatible ="nvidia,tegra20-pinmux" , tegra20_pinmux_init }, + { .compatible ="nvidia,tegra20-pinmux-disabled" , tegra20_pinmux_init }, #endif #ifdef CONFIG_ARCH_TEGRA_3x_SOC - { .compatible ="nvidia,tegra30-pinmux" , tegra30_pinmux_init }, + { .compatible ="nvidia,tegra30-pinmux-disabled" , tegra30_pinmux_init }, #endif { }, };
@@ -809,7 +809,7 @@ static int __devinit tegra_pinmux_probe(struct platform_device *pdev)static struct platform_driver tegra_pinmux_driver = { .driver = { - .name ="tegra-pinmux" , + .name ="tegra-pinmux-disabled" , .owner =THIS_MODULE , .of_match_table = tegra_pinmux_of_match, },
drivers/pinctrl/pinctrl-tegra.c +3 -3
@@ -33,7 +33,7 @@#include "pinctrl-tegra.h" -#define DRIVER_NAME "tegra-pinmux-disabled" +#define DRIVER_NAME "tegra-pinmux"struct tegra_pmx {struct device *dev;
@@ -627,13 +627,13 @@ static struct pinctrl_desc tegra_pinctrl_desc = {static struct of_device_id tegra_pinctrl_of_match[]__devinitdata = { #ifdef CONFIG_PINCTRL_TEGRA20 { - .compatible ="nvidia,tegra20-pinmux-disabled" , + .compatible ="nvidia,tegra20-pinmux" , .data = tegra20_pinctrl_init, }, #endif #ifdef CONFIG_PINCTRL_TEGRA30 { - .compatible ="nvidia,tegra30-pinmux-disabled" , + .compatible ="nvidia,tegra30-pinmux" , .data = tegra30_pinctrl_init, }, #endif
Signature · 1 line
1.7.0.4
PATCH 8/11 ARM: tegra: Switch to new pinctrl driver
Quoted 7 lines · Stephen Warren
---
v3: Remove GPIO-related code, use mapping table instead of pinctrl APIs ? ?for all pinconfig setup. Don't tristate PCIe pingroups on Harmony. ? ?Note: Before this version, this patch had the following acks, but I've ? ?removed them due to the rework:
? ?Linus Walleij <[email protected]>
? ?Olof Johansson <[email protected]>
I guess this goes through the Tegra tree,
Linus Walleij
PATCH 8/11 ARM: tegra: Switch to new pinctrl driver
In reply to Stephen WarrenQuoted 34 lines · Stephen Warren
From: Stephen Warren <[email protected]>
* Rename old pinmux and new pinctrl platform driver and DT match table entries, so the new driver gets instantiated.
* Re-writeboard-pinmux.c, so that it uses pinctrl APIs to configura the pinmux.
* Re-write board-*-pinmux.c so that the pinmux configuration tables are in pinctrl format.Ventana's pin mux table needed some edits on top of the basic format conversion, since some mux options that were previously marked as reserved are now valid in the new pinctrl driver. Attempting to use the old reserved names will result in a failure. Specifically, groups lpw0, lpw2, lsc1, lsck, and lsda were changed from function rsvd4 to displaya, and group pta was changed from function rsvd2 to hdmi.
All boards' pin mux tables needed some edits on top of the based format conversion, since function i2c was split into i2c1 (first general I2C controller) and i2cp (power I2C controller) to better align function definitions with HW blocks.
Due to the split of mux tables into pure mux and pull/tristate tables, many entries in the separate Seaboard/Ventana tables could be merged into the common table, since the entries differed only in the portion in one of the tables, not both.
Most pin groups allow configuration of mux, tri-state, and pull. However, some don't allow pull configuration, which is instead configured by new groups that only allow pull configuration. This is a reflection of the true HW capabilities, which weren't fully represented by the old pinmux driver. This required adding new pull table entries for those new groups, and setting many other entries' pull configuration to
TEGRA_PINCONFIG_DONT_SET.
Quoted 1 line
Signed-off-by Stephen Warren <[email protected]>
This is falling into place quite nicely!
-Olof
PATCH 9/11 ARM: tegra: Remove pre-pinctrl pinmux driver
In reply to Stephen WarrenFrom: Stephen Warren <[email protected]>
The pinctrl driver is now active and used by all boards. Remove the old pinmux driver.
---
v3: No change
v2: No change?
--- arch/arm/mach-tegra/Makefile | 3 - arch/arm/mach-tegra/include/mach/pinmux-tegra20.h | 184 ---- arch/arm/mach-tegra/include/mach/pinmux-tegra30.h | 320 ------- arch/arm/mach-tegra/include/mach/pinmux.h | 302 ------- arch/arm/mach-tegra/pinmux-tegra20-tables.c | 244 ----- arch/arm/mach-tegra/pinmux-tegra30-tables.c | 376 -------- arch/arm/mach-tegra/pinmux.c | 987 --------------------- 7 files changed, 0 insertions(+), 2416 deletions(-) delete mode 100644 arch/arm/mach-tegra/include/mach/pinmux-tegra20.h delete mode 100644 arch/arm/mach-tegra/include/mach/pinmux-tegra30.h delete mode 100644 arch/arm/mach-tegra/include/mach/pinmux.h delete mode 100644 arch/arm/mach-tegra/pinmux-tegra20-tables.c delete mode 100644 arch/arm/mach-tegra/pinmux-tegra30-tables.c delete mode 100644 arch/arm/mach-tegra/pinmux.c
arch/arm/mach-tegra/Makefile +0 -3
@@ -5,7 +5,6 @@ obj-y += io.o obj-y += irq.o obj-y += clock.o obj-y += timer.o -obj-y += pinmux.o obj-y += fuse.o obj-y += pmc.o obj-y += flowctrl.o
@@ -14,8 +13,6 @@ obj-$(CONFIG_CPU_IDLE) += sleep.o obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += powergate.o obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += tegra2_clocks.o obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += tegra2_emc.o -obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += pinmux-tegra20-tables.o -obj-$(CONFIG_ARCH_TEGRA_3x_SOC) += pinmux-tegra30-tables.o obj-$(CONFIG_ARCH_TEGRA_3x_SOC) += board-dt-tegra30.o obj-$(CONFIG_ARCH_TEGRA_3x_SOC) += tegra30_clocks.o obj-$(CONFIG_SMP) += platsmp.o headsmp.o
arch/arm/mach-tegra/include/mach/pinmux-tegra20.h deleted +0 -184
184 lines not on this page · raw message
arch/arm/mach-tegra/include/mach/pinmux-tegra30.h deleted +0 -320
320 lines not on this page · raw message
arch/arm/mach-tegra/include/mach/pinmux.h deleted +0 -302
302 lines not on this page · raw message
arch/arm/mach-tegra/pinmux-tegra20-tables.c deleted +0 -244
244 lines not on this page · raw message
arch/arm/mach-tegra/pinmux-tegra30-tables.c deleted +0 -376
376 lines not on this page · raw message
arch/arm/mach-tegra/pinmux.c deleted +0 -987
987 lines not on this page · raw message
Signature · 1 line
1.7.0.4
PATCH 10/11 ARM: dt: tegra cardhu: add pinmux to device tree
In reply to Stephen WarrenFrom: Stephen Warren <[email protected]>
This adds a minimal pinmux configuration to the Tegra Cardhu device tree. Initially, just the built-in eMMC and SD card slot are configured.
--- arch/arm/boot/dts/tegra-cardhu.dts | 44 ++++++++++++++++++++++++++++++++++++ 1 files changed, 44 insertions(+), 0 deletions(-)
arch/arm/boot/dts/tegra-cardhu.dts +44 -0
@@ -10,6 +10,50 @@ reg = < 0x80000000 0x40000000 >; }; + pinmux at 70000000 { + pinctrl-names = "default"; + pinctrl-0 = <&state_default>; + + state_default: pinmux { + sdmmc1_clk_pz0 { + nvidia,pins = "sdmmc1_clk_pz0"; + nvidia,function = "sdmmc1"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + }; + sdmmc1_cmd_pz1 { + nvidia,pins = "sdmmc1_cmd_pz1", + "sdmmc1_dat0_py7", + "sdmmc1_dat1_py6", + "sdmmc1_dat2_py5", + "sdmmc1_dat3_py4"; + nvidia,function = "sdmmc1"; + nvidia,pull = <2>; + nvidia,tristate = <0>; + }; + sdmmc4_clk_pcc4 { + nvidia,pins = "sdmmc4_clk_pcc4", + "sdmmc4_rst_n_pcc3"; + nvidia,function = "sdmmc4"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + }; + sdmmc4_dat0_paa0 { + nvidia,pins = "sdmmc4_dat0_paa0", + "sdmmc4_dat1_paa1", + "sdmmc4_dat2_paa2", + "sdmmc4_dat3_paa3", + "sdmmc4_dat4_paa4", + "sdmmc4_dat5_paa5", + "sdmmc4_dat6_paa6", + "sdmmc4_dat7_paa7"; + nvidia,function = "sdmmc4"; + nvidia,pull = <2>; + nvidia,tristate = <0>; + }; + }; + }; + serial at 70006000 { clock-frequency = < 408000000 >; };
Signature · 1 line
1.7.0.4
PATCH 10/11 ARM: dt: tegra cardhu: add pinmux to device tree
Quoted 6 lines · Stephen Warren
From: Stephen Warren <[email protected]>
This adds a minimal pinmux configuration to the Tegra Cardhu device tree. Initially, just the built-in eMMC and SD card slot are configured.
Signed-off-by Stephen Warren <[email protected]>
Looks reasonable enough. I guess you should get ack from Peter and not me on this but anyway:
-Olof
PATCH 11/11 ARM: dt: tegra20: add pinmux to device tree
In reply to Stephen WarrenFrom: Stephen Warren <[email protected]>
This adds a complete pinmux configuration to all Tegra20 device tree files. This allows removal of board-dt-tegra20.c's use of the pinmux board files, and the special device tree handling in board-pinmux.c.
--- arch/arm/boot/dts/tegra-harmony.dts | 224 +++++++++++++++++++++++++++++ arch/arm/boot/dts/tegra-paz00.dts | 220 +++++++++++++++++++++++++++++ arch/arm/boot/dts/tegra-seaboard.dts | 243 ++++++++++++++++++++++++++++++++ arch/arm/boot/dts/tegra-trimslice.dts | 230 ++++++++++++++++++++++++++++++ arch/arm/boot/dts/tegra-ventana.dts | 230 ++++++++++++++++++++++++++++++ arch/arm/mach-tegra/board-dt-tegra20.c | 30 ---- arch/arm/mach-tegra/board-pinmux.c | 4 +- 7 files changed, 1148 insertions(+), 33 deletions(-)
arch/arm/boot/dts/tegra-harmony.dts +224 -0
@@ -10,6 +10,230 @@ reg = < 0x00000000 0x40000000 >; }; + pinmux at 70000000 { + pinctrl-names = "default"; + pinctrl-0 = <&state_default>; + + state_default: pinmux { + ata { + nvidia,pins = "ata"; + nvidia,function = "ide"; + }; + atb { + nvidia,pins = "atb", "gma", "gme"; + nvidia,function = "sdio4"; + }; + atc { + nvidia,pins = "atc"; + nvidia,function = "nand"; + }; + atd { + nvidia,pins = "atd", "ate", "gmb", "gmd", "gpu", + "spia", "spib", "spic"; + nvidia,function = "gmi"; + }; + cdev1 { + nvidia,pins = "cdev1"; + nvidia,function = "plla_out"; + }; + cdev2 { + nvidia,pins = "cdev2"; + nvidia,function = "pllp_out4"; + }; + crtp { + nvidia,pins = "crtp"; + nvidia,function = "crt"; + }; + csus { + nvidia,pins = "csus"; + nvidia,function = "vi_sensor_clk"; + }; + dap1 { + nvidia,pins = "dap1"; + nvidia,function = "dap1"; + }; + dap2 { + nvidia,pins = "dap2"; + nvidia,function = "dap2"; + }; + dap3 { + nvidia,pins = "dap3"; + nvidia,function = "dap3"; + }; + dap4 { + nvidia,pins = "dap4"; + nvidia,function = "dap4"; + }; + ddc { + nvidia,pins = "ddc"; + nvidia,function = "i2c2"; + }; + dta { + nvidia,pins = "dta", "dtd"; + nvidia,function = "sdio2"; + }; + dtb { + nvidia,pins = "dtb", "dtc", "dte"; + nvidia,function = "rsvd1"; + }; + dtf { + nvidia,pins = "dtf"; + nvidia,function = "i2c3"; + }; + gmc { + nvidia,pins = "gmc"; + nvidia,function = "uartd"; + }; + gpu7 { + nvidia,pins = "gpu7"; + nvidia,function = "rtck"; + }; + gpv { + nvidia,pins = "gpv", "slxa", "slxk"; + nvidia,function = "pcie"; + }; + hdint { + nvidia,pins = "hdint", "pta"; + nvidia,function = "hdmi"; + }; + i2cp { + nvidia,pins = "i2cp"; + nvidia,function = "i2cp"; + }; + irrx { + nvidia,pins = "irrx", "irtx"; + nvidia,function = "uarta"; + }; + kbca { + nvidia,pins = "kbca", "kbcb", "kbcc", "kbcd", + "kbce", "kbcf"; + nvidia,function = "kbc"; + }; + lcsn { + nvidia,pins = "lcsn", "ld0", "ld1", "ld2", + "ld3", "ld4", "ld5", "ld6", "ld7", + "ld8", "ld9", "ld10", "ld11", "ld12", + "ld13", "ld14", "ld15", "ld16", "ld17", + "ldc", "ldi", "lhp0", "lhp1", "lhp2", + "lhs", "lm0", "lm1", "lpp", "lpw0", + "lpw1", "lpw2", "lsc0", "lsc1", "lsck", + "lsda", "lsdi", "lspi", "lvp0", "lvp1", + "lvs"; + nvidia,function = "displaya"; + }; + owc { + nvidia,pins = "owc", "spdi", "spdo", "uac"; + nvidia,function = "rsvd2"; + }; + pmc { + nvidia,pins = "pmc"; + nvidia,function = "pwr_on"; + }; + rm { + nvidia,pins = "rm"; + nvidia,function = "i2c1"; + }; + sdb { + nvidia,pins = "sdb", "sdc", "sdd"; + nvidia,function = "pwm"; + }; + sdio1 { + nvidia,pins = "sdio1"; + nvidia,function = "sdio1"; + }; + slxc { + nvidia,pins = "slxc", "slxd"; + nvidia,function = "spdif"; + }; + spid { + nvidia,pins = "spid", "spie", "spif"; + nvidia,function = "spi1"; + }; + spig { + nvidia,pins = "spig", "spih"; + nvidia,function = "spi2_alt"; + }; + uaa { + nvidia,pins = "uaa", "uab", "uda"; + nvidia,function = "ulpi"; + }; + uad { + nvidia,pins = "uad"; + nvidia,function = "irda"; + }; + uca { + nvidia,pins = "uca", "ucb"; + nvidia,function = "uartc"; + }; + conf_ata { + nvidia,pins = "ata", "atb", "atc", "atd", "ate", + "cdev1", "dap1", "dtb", "gma", "gmb", + "gmc", "gmd", "gme", "gpu7", "gpv", + "i2cp", "pta", "rm", "slxa", "slxk", + "spia", "spib"; + nvidia,pull = <0>; + nvidia,tristate = <0>; + }; + conf_cdev2 { + nvidia,pins = "cdev2", "csus", "spid", "spif"; + nvidia,pull = <1>; + nvidia,tristate = <1>; + }; + conf_ck32 { + nvidia,pins = "ck32", "ddrc", "pmca", "pmcb", + "pmcc", "pmcd", "pmce", "xm2c", "xm2d"; + nvidia,pull = <0>; + }; + conf_crtp { + nvidia,pins = "crtp", "dap2", "dap3", "dap4", + "dtc", "dte", "dtf", "gpu", "sdio1", + "slxc", "slxd", "spdi", "spdo", "spig", + "uac", "uda"; + nvidia,pull = <0>; + nvidia,tristate = <1>; + }; + conf_ddc { + nvidia,pins = "ddc", "dta", "dtd", "kbca", + "kbcb", "kbcc", "kbcd", "kbce", "kbcf", + "sdc"; + nvidia,pull = <2>; + nvidia,tristate = <0>; + }; + conf_hdint { + nvidia,pins = "hdint", "lcsn", "ldc", "lm1", + "lpw1", "lsc1", "lsck", "lsda", "lsdi", + "lvp0", "owc", "sdb"; + nvidia,tristate = <1>; + }; + conf_irrx { + nvidia,pins = "irrx", "irtx", "sdd", "spic", + "spie", "spih", "uaa", "uab", "uad", + "uca", "ucb"; + nvidia,pull = <2>; + nvidia,tristate = <1>; + }; + conf_lc { + nvidia,pins = "lc", "ls"; + nvidia,pull = <2>; + }; + conf_ld0 { + nvidia,pins = "ld0", "ld1", "ld2", "ld3", "ld4", + "ld5", "ld6", "ld7", "ld8", "ld9", + "ld10", "ld11", "ld12", "ld13", "ld14", + "ld15", "ld16", "ld17", "ldi", "lhp0", + "lhp1", "lhp2", "lhs", "lm0", "lpp", + "lpw0", "lpw2", "lsc0", "lspi", "lvp1", + "lvs", "pmc"; + nvidia,tristate = <0>; + }; + conf_ld17_0 { + nvidia,pins = "ld17_0", "ld19_18", "ld21_20", + "ld23_22"; + nvidia,pull = <1>; + }; + }; + }; + pmc at 7000f400 { nvidia,invert-interrupt; };
arch/arm/boot/dts/tegra-paz00.dts +220 -0
226 lines not on this page · raw message
arch/arm/boot/dts/tegra-seaboard.dts +243 -0
249 lines not on this page · raw message
arch/arm/boot/dts/tegra-trimslice.dts +230 -0
236 lines not on this page · raw message
arch/arm/boot/dts/tegra-ventana.dts +230 -0
236 lines not on this page · raw message
arch/arm/mach-tegra/board-dt-tegra20.c +0 -30
@@ -47,14 +47,7 @@#include "clock.h" #include "devices.h" -void harmony_pinmux_init (void ); -void paz00_pinmux_init (void ); -void seaboard_pinmux_init (void ); -void trimslice_pinmux_init (void ); -void ventana_pinmux_init (void ); -struct of_dev_auxdata tegra20_auxdata_lookup[]__initdata = { -OF_DEV_AUXDATA ("nvidia,tegra20-pinmux" ,TEGRA_APB_MISC_BASE +0x14 ,"tegra-pinmux" ,NULL ),OF_DEV_AUXDATA ("nvidia,tegra20-sdhci" ,TEGRA_SDMMC1_BASE ,"sdhci-tegra.0" ,NULL ),OF_DEV_AUXDATA ("nvidia,tegra20-sdhci" ,TEGRA_SDMMC2_BASE ,"sdhci-tegra.1" ,NULL ),OF_DEV_AUXDATA ("nvidia,tegra20-sdhci" ,TEGRA_SDMMC3_BASE ,"sdhci-tegra.2" ,NULL ),
@@ -94,33 +87,10 @@ static struct of_device_id tegra_dt_match_table[] __initdata = { {} }; -static struct { -char *machine; -void (*init)(void ); -} pinmux_configs[] = { - {"compulab,trimslice" , trimslice_pinmux_init }, - {"nvidia,harmony" , harmony_pinmux_init }, - {"compal,paz00" , paz00_pinmux_init }, - {"nvidia,seaboard" , seaboard_pinmux_init }, - {"nvidia,ventana" , ventana_pinmux_init }, -}; -static void __init tegra_dt_init (void ) { -int i; -tegra_clk_init_from_table (tegra_dt_clk_init_table); -for (i =0 ; i <ARRAY_SIZE (pinmux_configs); i++) { -if (of_machine_is_compatible (pinmux_configs[i].machine)) { - pinmux_configs[i].init (); -break ; - } - } - -WARN (i ==ARRAY_SIZE (pinmux_configs), -"Unknown platform! Pinmuxing not initialized\n" ); -/* * Finished with the static registrations now; fill in the missing * devices
arch/arm/mach-tegra/board-pinmux.c +1 -3
@@ -15,7 +15,6 @@#include <linux/device.h> #include <linux/kernel.h> #include <linux/notifier.h> -#include <linux/of.h> #include <linux/string.h> #include "board-pinmux.h"
@@ -84,6 +83,5 @@ void tegra_board_pinmux_init(struct tegra_board_pinmux_conf *conf_a,if (conf_b)pinctrl_register_mappings (conf_b->maps, conf_b->map_count); -if (!of_machine_is_compatible ("nvidia,tegra20" )) -platform_add_devices (devices,ARRAY_SIZE (devices)); +platform_add_devices (devices,ARRAY_SIZE (devices)); }
Signature · 1 line
1.7.0.4
PATCH 11/11 ARM: dt: tegra20: add pinmux to device tree
Quoted 7 lines · Stephen Warren
From: Stephen Warren <[email protected]>
This adds a complete pinmux configuration to all Tegra20 device tree files. This allows removal of board-dt-tegra20.c's use of the pinmux board files, and the special device tree handling in
board-pinmux.c.Signed-off-by Stephen Warren <[email protected]>
Pretty cool huh? :-)
We've come a long way the recent months.
Yours,
Linus Walleij
PATCH 11/11 ARM: dt: tegra20: add pinmux to device tree
In reply to Stephen WarrenQuoted 7 lines · Stephen Warren
From: Stephen Warren <[email protected]>
This adds a complete pinmux configuration to all Tegra20 device tree files. This allows removal of board-dt-tegra20.c's use of the pinmux board files, and the special device tree handling in
board-pinmux.c.Signed-off-by Stephen Warren <[email protected]>
It would be nice to do a more compact representation in the device tree, but this buys us enough that I'm quite happy with the way it turned out anyway.
Once we have some sort of preprocessor support maybe. :-)
-Olof
cover ARM: tegra: GPIO and pinmux-related changes
In reply to Stephen WarrenQuoted 11 lines · Stephen Warren
From: Stephen Warren <[email protected]>
This series:
* Updates the Tegra GPIO driver to interact with pinctrl per the recent gpio.txt documentation changes. Consequently, there's no need fortegra_gpio_enable()any more, and no need forboard-pinmux.cto do anything GPIO-related.
* Switches to the new Tegra pinctrl driver, and deletes the old one.
* Moves pinctrl configuration to the device tree when booted using DT, so that board-dt-tegra*.c no longer depend on anything in board*.[ch].
Quoted 2 lines
Note to self: This series relies upon DT support in pinctrl, which should be merged in 3.5.
Tested in both legacy and DT boots of seaboard. This is looking great.
As I mentioned in the last patch, I wish the device tree format wasn't quite this verbose, but it's still a step forward so I'm not too concerned.
Quoted 1 line
30 files changed, 1887 insertions(+), 3224 deletions(-)
Woohoo!
We're immimently close to getting rid of board files now.
-Olof