Hemant Pedanekar <hema...@ti.com> writes:

> Performs pinmux and gpio handling for switching to PCI mode on EVMs with
> workaround as described on
> http://wiki.davincidsp.com/index.php/Pinmux_Switching_from_NAND_to_PCI. Skips
> setting pinmux if already set (e.g., by hardware).
>
> Signed-off-by: Hemant Pedanekar <hema...@ti.com>
> ---
>  arch/arm/mach-davinci/board-dm646x-evm.c |   79 
> +++++++++++++++++++++++++++++-
>  1 files changed, 78 insertions(+), 1 deletions(-)
>
> diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c 
> b/arch/arm/mach-davinci/board-dm646x-evm.c
> index b1bf18c..e5ba479 100644
> --- a/arch/arm/mach-davinci/board-dm646x-evm.c
> +++ b/arch/arm/mach-davinci/board-dm646x-evm.c
> @@ -42,6 +42,7 @@
>  
>  #include <mach/dm646x.h>
>  #include <mach/common.h>
> +#include <mach/mux.h>
>  #include <mach/psc.h>
>  #include <mach/serial.h>
>  #include <mach/i2c.h>
> @@ -49,6 +50,19 @@
>  #include <mach/emac.h>
>  #include <mach/common.h>
>  
> +#if defined(CONFIG_PCI)
> +#define HAS_PCI 1
> +#else
> +#define HAS_PCI 0
> +#endif
> +
> +#if defined(CONFIG_MTD_NAND_DAVINCI) || \
> +     defined(CONFIG_MTD_NAND_DAVINCI_MODULE)
> +#define HAS_NAND 1
> +#else
> +#define HAS_NAND 0
> +#endif
> +
>  #if defined(CONFIG_BLK_DEV_PALMCHIP_BK3710) || \
>      defined(CONFIG_BLK_DEV_PALMCHIP_BK3710_MODULE)
>  #define HAS_ATA 1
> @@ -67,6 +81,58 @@ static struct davinci_uart_config uart_config __initdata = 
> {
>       .enabled_uarts = (1 << 0),
>  };
>  
> +/* Setup DM6467 for PCI mode. In case of default EVM, the CPLD along with FET
> + * switches takes care of switching to PCI Boot mode when the EVM is put in
> + * the PCI slot and this funtion needs to do nothing. While in case when the
> + * CPLD code/ Hardware is reworked (not to do autoswitch), the code below
> + * handles mux configurations to switch to PCI (Host) mode  and takes care of
> + * driving RST# over PCI Bus.
> + *
> + * Note: This function relies on h/w setting of PCIEN to distinguish between
> + * modified and unmodified EVM and might not work in case s/w (e.g., 
> bootloader)
> + * is manipulating PCIEN after booting.
> + */
> +static void dm646xevm_pci_setup(void)
> +{
> +     void __iomem *base = IO_ADDRESS(DAVINCI_SYSTEM_MODULE_BASE);

Please use ioremap()

> +     /* Skip this if PCIEN is already set in  PINMUX0 */
> +     if (!((__raw_readl(base + PINMUX0)) & (1<<2))) {
> +             /* Power up the I/O cells for PCI interface */
> +             __raw_writel(__raw_readl(base + DM64XX_VDD3P3V_PWDN)
> +                             & ~(3<<16), base + DM64XX_VDD3P3V_PWDN);
> +
> +             davinci_cfg_reg(DM646X_HPI32EN);
> +
> +             /* Drive GPIO[13] High to avoid reset when PCI is
> +              * enabled
> +              */
> +             if (gpio_request(13, "RST#") != 0) {
> +                     pr_err("Request for GPIO13 failed.\n");
> +                     return;
> +             }
> +
> +             gpio_direction_output(13, 1);
> +
> +             /* Ensure AUDCK1 is disabled to control GPIO[2] */
> +             davinci_cfg_reg(DM646X_AUDCK1);
> +
> +             davinci_cfg_reg(DM646X_PCIEN);
> +
> +             /* Drive GPIO[2] high to take the PCI bus out of reset
> +              * (drive RST#) and select B2 of the FET mux on EVM to
> +              * deselect NAND and switch to PCI Bus
> +              */
> +             if (gpio_request(2, "PCIRST#") != 0) {
> +                     pr_err("Request for GPIO2 failed.\n");
> +                     return;
> +             }
> +             gpio_direction_output(2, 1);
> +     } else {
> +             pr_info("PCI_EN is already asserted.\n");
> +     }
> +}
> +
>  /* CPLD Register 0 Client: used for I/O Control */
>  static int cpld_reg0_probe(struct i2c_client *client,
>                          const struct i2c_device_id *id)
> @@ -328,8 +394,19 @@ static __init void evm_init(void)
>       dm646x_init_mcasp0(&dm646x_evm_snd_data[0]);
>       dm646x_init_mcasp1(&dm646x_evm_snd_data[1]);
>  
> -     if (HAS_ATA)
> +     if (HAS_PCI) {
> +             if (HAS_ATA)
> +                     pr_warning("WARNING: both PCI and IDE are "
> +                                     "enabled, but they share some pins.\n"
> +                                     "\tDisable PCI for IDE support.\n");
> +             else if (HAS_NAND)
> +                     pr_warning("WARNING: both PCI and NAND are "
> +                                     "enabled, but they share AEMIF pins.\n"
> +                                     "\tDisable PCI for NAND support.\n");
> +             dm646xevm_pci_setup();
> +     } else if (HAS_ATA) {
>               dm646x_init_ide();
> +     }

braces not needed.

>       soc_info->emac_pdata->phy_mask = DM646X_EVM_PHY_MASK;
>       soc_info->emac_pdata->mdio_max_freq = DM646X_EVM_MDIO_FREQUENCY;

Kevin

_______________________________________________
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