From: Mark A. Greer <mgr...@mvista.com>

Group the pinmux indices for various devices to ease setting up
the pinmux for a device.  A new routine, da830_pinmux_setup(),
is added to do the pinmux setup for a group.

Signed-off-by: Mark A. Greer <mgr...@mvista.com>
---
I'd still like to have the pinmux setup at driver init time
instead of at boot time but its not necessary right now so
I'll skip it.

I would still like to make it easier to setup the pinmux for
the da830 by gathering the pinmux indices for various devices
into arrays and then make a single call to set all of them up
for a device.

I'm not that attached to any of this code other than I would
eventually like some sort of functionality like this.  It
doesn't seem worth it for the existing davincis since they
don't have much pinmux contention.

Comments welcome.

 arch/arm/mach-davinci/board-da830-evm.c    |   10 ++
 arch/arm/mach-davinci/da830.c              |  189 ++++++++++++++++++++++++++++
 arch/arm/mach-davinci/include/mach/da830.h |   28 ++++-
 3 files changed, 226 insertions(+), 1 deletions(-)

diff --git a/arch/arm/mach-davinci/board-da830-evm.c 
b/arch/arm/mach-davinci/board-da830-evm.c
index a94289f..5350793 100644
--- a/arch/arm/mach-davinci/board-da830-evm.c
+++ b/arch/arm/mach-davinci/board-da830-evm.c
@@ -60,6 +60,11 @@ static __init void da830_evm_init(void)
                pr_warning("da830_evm_init: edma registration failed: %d\n",
                                ret);
 
+       ret = da830_pinmux_setup(da830_i2c0_pins);
+       if (ret)
+               pr_warning("da830_evm_init: i2c0 mux setup failed: %d\n",
+                               ret);
+
        ret = da830_register_i2c(0, &da830_evm_i2c_0_pdata);
        if (ret)
                pr_warning("da830_evm_init: i2c0 registration failed: %d\n",
@@ -69,6 +74,11 @@ static __init void da830_evm_init(void)
        soc_info->emac_pdata->mdio_max_freq = DA830_EVM_MDIO_FREQUENCY;
        soc_info->emac_pdata->rmii_en = 1;
 
+       ret = da830_pinmux_setup(da830_cpgmac_pins);
+       if (ret)
+               pr_warning("da830_evm_init: cpgmac mux setup failed: %d\n",
+                               ret);
+
        ret = da830_register_emac();
        if (ret)
                pr_warning("da830_evm_init: emac registration failed: %d\n",
diff --git a/arch/arm/mach-davinci/da830.c b/arch/arm/mach-davinci/da830.c
index 4f0e906..2236ec7 100644
--- a/arch/arm/mach-davinci/da830.c
+++ b/arch/arm/mach-davinci/da830.c
@@ -858,6 +858,195 @@ static const struct mux_config da830_pins[] = {
 #endif
 };
 
+const short da830_emif25_pins[] __initdata = {
+       DA830_EMA_D_0, DA830_EMA_D_1, DA830_EMA_D_2, DA830_EMA_D_3,
+       DA830_EMA_D_4, DA830_EMA_D_5, DA830_EMA_D_6, DA830_EMA_D_7,
+       DA830_EMA_D_8, DA830_EMA_D_9, DA830_EMA_D_10, DA830_EMA_D_11,
+       DA830_EMA_D_12, DA830_EMA_D_13, DA830_EMA_D_14, DA830_EMA_D_15,
+       DA830_EMA_A_0, DA830_EMA_A_1, DA830_EMA_A_2, DA830_EMA_A_3,
+       DA830_EMA_A_4, DA830_EMA_A_5, DA830_EMA_A_6, DA830_EMA_A_7,
+       DA830_EMA_A_8, DA830_EMA_A_9, DA830_EMA_A_10, DA830_EMA_A_11,
+       DA830_EMA_A_12, DA830_EMA_BA_0, DA830_EMA_BA_1, DA830_EMA_CLK,
+       DA830_EMA_SDCKE, DA830_NEMA_CS_4, DA830_NEMA_CS_5, DA830_NEMA_WE,
+       DA830_NEMA_CS_0, DA830_NEMA_CS_2, DA830_NEMA_CS_3, DA830_NEMA_OE,
+       DA830_NEMA_WE_DQM_1, DA830_NEMA_WE_DQM_0, DA830_EMA_WAIT_0,
+       -1
+};
+
+const short da830_spi0_pins[] __initdata = {
+       DA830_SPI0_SOMI_0, DA830_SPI0_SIMO_0, DA830_SPI0_CLK, DA830_NSPI0_ENA,
+       DA830_NSPI0_SCS_0,
+       -1
+};
+
+const short da830_spi1_pins[] __initdata = {
+       DA830_SPI1_SOMI_0, DA830_SPI1_SIMO_0, DA830_SPI1_CLK, DA830_NSPI1_ENA,
+       DA830_NSPI1_SCS_0,
+       -1
+};
+
+const short da830_mmc_sd_pins[] __initdata = {
+       DA830_MMCSD_DAT_0, DA830_MMCSD_DAT_1, DA830_MMCSD_DAT_2,
+       DA830_MMCSD_DAT_3, DA830_MMCSD_DAT_4, DA830_MMCSD_DAT_5,
+       DA830_MMCSD_DAT_6, DA830_MMCSD_DAT_7, DA830_MMCSD_CLK,
+       DA830_MMCSD_CMD,
+       -1
+};
+
+const short da830_uart0_pins[] __initdata = {
+       DA830_NUART0_CTS, DA830_NUART0_RTS, DA830_UART0_RXD, DA830_UART0_TXD,
+       -1
+};
+
+const short da830_uart1_pins[] __initdata = {
+       DA830_UART1_RXD, DA830_UART1_TXD,
+       -1
+};
+
+const short da830_uart2_pins[] __initdata = {
+       DA830_UART2_RXD, DA830_UART2_TXD,
+       -1
+};
+
+const short da830_usb20_pins[] __initdata = {
+       DA830_USB0_DRVVBUS, DA830_USB_REFCLKIN,
+       -1
+};
+
+const short da830_usb11_pins[] __initdata = {
+       DA830_USB_REFCLKIN,
+       -1
+};
+
+const short da830_uhpi_pins[] __initdata = {
+       DA830_UHPI_HD_0, DA830_UHPI_HD_1, DA830_UHPI_HD_2, DA830_UHPI_HD_3,
+       DA830_UHPI_HD_4, DA830_UHPI_HD_5, DA830_UHPI_HD_6, DA830_UHPI_HD_7,
+       DA830_UHPI_HD_8, DA830_UHPI_HD_9, DA830_UHPI_HD_10, DA830_UHPI_HD_11,
+       DA830_UHPI_HD_12, DA830_UHPI_HD_13, DA830_UHPI_HD_14, DA830_UHPI_HD_15,
+       DA830_UHPI_HCNTL0, DA830_UHPI_HCNTL1, DA830_UHPI_HHWIL, DA830_UHPI_HRNW,
+       DA830_NUHPI_HAS, DA830_NUHPI_HCS, DA830_NUHPI_HDS1, DA830_NUHPI_HDS2,
+       DA830_NUHPI_HINT, DA830_NUHPI_HRDY,
+       -1
+};
+
+const short da830_cpgmac_pins[] __initdata = {
+       DA830_RMII_TXD_0, DA830_RMII_TXD_1, DA830_RMII_TXEN, DA830_RMII_CRS_DV,
+       DA830_RMII_RXD_0, DA830_RMII_RXD_1, DA830_RMII_RXER, DA830_MDIO_CLK,
+       DA830_MDIO_D,
+       -1
+};
+
+const short da830_emif3c_pins[] __initdata = {
+       DA830_EMB_SDCKE, DA830_EMB_CLK_GLUE, DA830_EMB_CLK, DA830_NEMB_CS_0,
+       DA830_NEMB_CAS, DA830_NEMB_RAS, DA830_NEMB_WE, DA830_EMB_BA_1,
+       DA830_EMB_BA_0, DA830_EMB_A_0, DA830_EMB_A_1, DA830_EMB_A_2,
+       DA830_EMB_A_3, DA830_EMB_A_4, DA830_EMB_A_5, DA830_EMB_A_6,
+       DA830_EMB_A_7, DA830_EMB_A_8, DA830_EMB_A_9, DA830_EMB_A_10,
+       DA830_EMB_A_11, DA830_EMB_A_12, DA830_NEMB_WE_DQM_3,
+       DA830_NEMB_WE_DQM_2, DA830_EMB_D_0, DA830_EMB_D_1, DA830_EMB_D_2,
+       DA830_EMB_D_3, DA830_EMB_D_4, DA830_EMB_D_5, DA830_EMB_D_6,
+       DA830_EMB_D_7, DA830_EMB_D_8, DA830_EMB_D_9, DA830_EMB_D_10,
+       DA830_EMB_D_11, DA830_EMB_D_12, DA830_EMB_D_13, DA830_EMB_D_14,
+       DA830_EMB_D_15, DA830_EMB_D_16, DA830_EMB_D_17, DA830_EMB_D_18,
+       DA830_EMB_D_19, DA830_EMB_D_20, DA830_EMB_D_21, DA830_EMB_D_22,
+       DA830_EMB_D_23, DA830_EMB_D_24, DA830_EMB_D_25, DA830_EMB_D_26,
+       DA830_EMB_D_27, DA830_EMB_D_28, DA830_EMB_D_29, DA830_EMB_D_30,
+       DA830_EMB_D_31, DA830_NEMB_WE_DQM_1, DA830_NEMB_WE_DQM_0,
+       -1
+};
+
+const short da830_mcasp0_pins[] __initdata = {
+       DA830_AHCLKX0, DA830_ACLKX0, DA830_AFSX0,
+       DA830_AHCLKR0, DA830_ACLKR0, DA830_AFSR0, DA830_AMUTE0,
+       DA830_AXR0_0, DA830_AXR0_1, DA830_AXR0_2, DA830_AXR0_3,
+       DA830_AXR0_4, DA830_AXR0_5, DA830_AXR0_6, DA830_AXR0_7,
+       DA830_AXR0_8, DA830_AXR0_9, DA830_AXR0_10, DA830_AXR0_11,
+       DA830_AXR0_12, DA830_AXR0_13, DA830_AXR0_14, DA830_AXR0_15,
+       -1
+};
+
+const short da830_mcasp1_pins[] __initdata = {
+       DA830_AHCLKX1, DA830_ACLKX1, DA830_AFSX1,
+       DA830_AHCLKR1, DA830_ACLKR1, DA830_AFSR1, DA830_AMUTE1,
+       DA830_AXR1_0, DA830_AXR1_1, DA830_AXR1_2, DA830_AXR1_3,
+       DA830_AXR1_4, DA830_AXR1_5, DA830_AXR1_6, DA830_AXR1_7,
+       DA830_AXR1_8, DA830_AXR1_9, DA830_AXR1_10, DA830_AXR1_11,
+       -1
+};
+
+const short da830_mcasp2_pins[] __initdata = {
+       DA830_AHCLKX2, DA830_ACLKX2, DA830_AFSX2,
+       DA830_AHCLKR2, DA830_ACLKR2, DA830_AFSR2, DA830_AMUTE2,
+       DA830_AXR2_0, DA830_AXR2_1, DA830_AXR2_2, DA830_AXR2_3,
+       -1
+};
+
+const short da830_i2c0_pins[] __initdata = {
+       DA830_I2C0_SDA, DA830_I2C0_SCL,
+       -1
+};
+
+const short da830_i2c1_pins[] __initdata = {
+       DA830_I2C1_SCL, DA830_I2C1_SDA,
+       -1
+};
+
+const short da830_lcdcntl_pins[] __initdata = {
+       DA830_LCD_D_0, DA830_LCD_D_1, DA830_LCD_D_2, DA830_LCD_D_3,
+       DA830_LCD_D_4, DA830_LCD_D_5, DA830_LCD_D_6, DA830_LCD_D_7,
+       DA830_LCD_D_8, DA830_LCD_D_9, DA830_LCD_D_10, DA830_LCD_D_11,
+       DA830_LCD_D_12, DA830_LCD_D_13, DA830_LCD_D_14, DA830_LCD_D_15,
+       DA830_LCD_PCLK, DA830_LCD_HSYNC, DA830_LCD_VSYNC, DA830_NLCD_AC_ENB_CS,
+       DA830_LCD_MCLK,
+       -1
+};
+
+const short da830_pwm_pins[] __initdata = {
+       DA830_ECAP0_APWM0, DA830_ECAP1_APWM1, DA830_EPWM0B, DA830_EPWM0A,
+       DA830_EPWMSYNCI, DA830_EPWMSYNC0, DA830_ECAP2_APWM2, DA830_EHRPWMGLUETZ,
+       DA830_EPWM2B, DA830_EPWM2A, DA830_EPWM1B, DA830_EPWM1A,
+       -1
+};
+
+const short da830_ecap0_pins[] __initdata = {
+       DA830_ECAP0_APWM0,
+       -1
+};
+
+const short da830_ecap1_pins[] __initdata = {
+       DA830_ECAP1_APWM1,
+       -1
+};
+
+const short da830_ecap2_pins[] __initdata = {
+       DA830_ECAP2_APWM2,
+       -1
+};
+
+const short da830_eqep0_pins[] __initdata = {
+       DA830_EQEP0I, DA830_EQEP0S, DA830_EQEP0A, DA830_EQEP0B,
+       -1
+};
+
+const short da830_eqep1_pins[] __initdata = {
+       DA830_EQEP1I, DA830_EQEP1S, DA830_EQEP1A, DA830_EQEP1B,
+       -1
+};
+
+int da830_pinmux_setup(const short pins[])
+{
+       int i, error = -EINVAL;
+
+       if (pins)
+               for (i = 0; pins[i] >= 0; i++) {
+                       error = davinci_cfg_reg(pins[i]);
+                       if (error)
+                               break;
+               }
+
+       return error;
+}
+
 /* FIQ are pri 0-1; otherwise 2-7, with 7 lowest priority */
 static u8 da830_default_priorities[DA830_N_CP_INTC_IRQ] = {
        [IRQ_DA830_COMMTX]              = 7,
diff --git a/arch/arm/mach-davinci/include/mach/da830.h 
b/arch/arm/mach-davinci/include/mach/da830.h
index ab582d1..ec85d34 100644
--- a/arch/arm/mach-davinci/include/mach/da830.h
+++ b/arch/arm/mach-davinci/include/mach/da830.h
@@ -44,8 +44,34 @@ int da830_register_emac(void);
 int da830_register_mmc(struct davinci_mmc_config *pdata);
 int da830_register_rtc(void);
 
-
 extern struct platform_device da830_serial_device;
 extern struct emac_platform_data da830_emac_pdata;
 
+extern const short da830_emif25_pins[];
+extern const short da830_spi0_pins[];
+extern const short da830_spi1_pins[];
+extern const short da830_mmc_sd_pins[];
+extern const short da830_uart0_pins[];
+extern const short da830_uart1_pins[];
+extern const short da830_uart2_pins[];
+extern const short da830_usb20_pins[];
+extern const short da830_usb11_pins[];
+extern const short da830_uhpi_pins[];
+extern const short da830_cpgmac_pins[];
+extern const short da830_emif3c_pins[];
+extern const short da830_mcasp0_pins[];
+extern const short da830_mcasp1_pins[];
+extern const short da830_mcasp2_pins[];
+extern const short da830_i2c0_pins[];
+extern const short da830_i2c1_pins[];
+extern const short da830_lcdcntl_pins[];
+extern const short da830_pwm_pins[];
+extern const short da830_ecap0_pins[];
+extern const short da830_ecap1_pins[];
+extern const short da830_ecap2_pins[];
+extern const short da830_eqep0_pins[];
+extern const short da830_eqep1_pins[];
+
+int da830_pinmux_setup(const short pins[]);
+
 #endif /* __ASM_ARCH_DAVINCI_DA830_H */
-- 
1.6.0.3


_______________________________________________
Davinci-linux-open-source mailing list
Davinci-linux-open-source@linux.davincidsp.com
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to