[PATCH v2] PCM970: Added support for CompactFlash
Sascha Hauer
s.hauer at pengutronix.de
Mon May 21 16:08:14 EDT 2012
On Sun, May 20, 2012 at 01:09:10PM +0400, Alexander Shiyan wrote:
> Added support for CompactFlash cards for PCM970 development board via
> PCMCIA window.
>
Do you consider this ready to be applied now?
Sascha
> Signed-off-by: Alexander Shiyan <shc_work at mail.ru>
> ---
> arch/arm/boards/pcm038/pcm970.c | 107 +++++++++++++++++++++++++++
> arch/arm/mach-imx/include/mach/imx27-regs.h | 13 +++
> 2 files changed, 120 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/boards/pcm038/pcm970.c b/arch/arm/boards/pcm038/pcm970.c
> index cd80677..ca10afb 100644
> --- a/arch/arm/boards/pcm038/pcm970.c
> +++ b/arch/arm/boards/pcm038/pcm970.c
> @@ -18,11 +18,17 @@
> #include <common.h>
> #include <io.h>
> #include <init.h>
> +#include <sizes.h>
> +#include <platform_ide.h>
> #include <mach/imx-regs.h>
> #include <mach/iomux-mx27.h>
> #include <mach/gpio.h>
> #include <usb/ulpi.h>
>
> +#define GPIO_IDE_POWER (GPIO_PORTE + 18)
> +#define GPIO_IDE_PCOE (GPIO_PORTF + 7)
> +#define GPIO_IDE_RESET (GPIO_PORTF + 10)
> +
> #ifdef CONFIG_USB
> static void pcm970_usbh2_init(void)
> {
> @@ -45,6 +51,103 @@ static void pcm970_usbh2_init(void)
> }
> #endif
>
> +#ifdef CONFIG_DISK_INTF_PLATFORM_IDE
> +static struct resource pcm970_ide_resources[] = {
> + {
> + .start = IMX_PCMCIA_MEM_BASE,
> + .size = SZ_1K,
> + .flags = IORESOURCE_MEM,
> + },
> +};
> +
> +static void pcm970_ide_reset(int state)
> +{
> + /* Switch reset line to low/high state */
> + gpio_set_value(GPIO_IDE_RESET, !!state);
> +}
> +
> +static struct ide_port_info pcm970_ide_pdata = {
> + .ioport_shift = 0,
> + .reset = &pcm970_ide_reset,
> +};
> +
> +static struct device_d pcm970_ide_device = {
> + .id = -1,
> + .name = "ide_intf",
> + .num_resources = ARRAY_SIZE(pcm970_ide_resources),
> + .resource = pcm970_ide_resources,
> + .platform_data = &pcm970_ide_pdata,
> +};
> +
> +static void pcm970_ide_init(void)
> +{
> + uint32_t i;
> + unsigned int mode[] = {
> + /* PCMCIA */
> + PF20_PF_PC_CD1,
> + PF19_PF_PC_CD2,
> + PF18_PF_PC_WAIT,
> + PF17_PF_PC_READY,
> + PF16_PF_PC_PWRON,
> + PF14_PF_PC_VS1,
> + PF13_PF_PC_VS2,
> + PF12_PF_PC_BVD1,
> + PF11_PF_PC_BVD2,
> + PF9_PF_PC_IOIS16,
> + PF8_PF_PC_RW,
> + GPIO_IDE_PCOE | GPIO_GPIO | GPIO_OUT, /* PCOE */
> + GPIO_IDE_RESET | GPIO_GPIO | GPIO_OUT, /* Reset */
> + GPIO_IDE_POWER | GPIO_GPIO | GPIO_OUT, /* Power */
> + };
> +
> + for (i = 0; i < ARRAY_SIZE(mode); i++)
> + imx_gpio_mode(mode[i] | GPIO_PUEN);
> +
> + /* Always set PCOE signal to low */
> + gpio_set_value(GPIO_IDE_PCOE, 0);
> +
> + /* Assert RESET line */
> + gpio_set_value(GPIO_IDE_RESET, 0);
> +
> + /* Power up CF-card (Also switched on User-LED) */
> + gpio_set_value(GPIO_IDE_POWER, 1);
> + mdelay(10);
> +
> + /* Reset PCMCIA Status Change Register */
> + writel(0x00000fff, PCMCIA_PSCR);
> + mdelay(10);
> +
> + /* Check PCMCIA Input Pins Register for Card Detect & Power */
> + if ((readl(PCMCIA_PIPR) & ((1 << 8) | (3 << 3))) != (1 << 8)) {
> + printf("CompactFlash card not found. Driver not enabled.\n");
> + return;
> + }
> +
> + /* Disable all interrupts */
> + writel(0, PCMCIA_PER);
> +
> + /* Disable all PCMCIA banks */
> + for (i = 0; i < 5; i++)
> + writel(0, PCMCIA_POR(i));
> +
> + /* Not use internal PCOE */
> + writel(0, PCMCIA_PGCR);
> +
> + /* Setup PCMCIA bank0 for Common memory mode */
> + writel(0, PCMCIA_PBR(0));
> + writel(0, PCMCIA_POFR(0));
> + writel((0 << 25) | (17 << 17) | (4 << 11) | (3 << 5) | 0xf, PCMCIA_POR(0));
> +
> + /* Clear PCMCIA General Status Register */
> + writel(0x0000001f, PCMCIA_PGSR);
> +
> + /* Make PCMCIA bank0 valid */
> + writel(readl(PCMCIA_POR(0)) | (1 << 29), PCMCIA_POR(0));
> +
> + register_device(&pcm970_ide_device);
> +}
> +#endif
> +
> static int pcm970_init(void)
> {
> int i;
> @@ -74,6 +177,10 @@ static int pcm970_init(void)
> pcm970_usbh2_init();
> #endif
>
> +#ifdef CONFIG_DISK_INTF_PLATFORM_IDE
> + pcm970_ide_init();
> +#endif
> +
> return 0;
> }
>
> diff --git a/arch/arm/mach-imx/include/mach/imx27-regs.h b/arch/arm/mach-imx/include/mach/imx27-regs.h
> index 437cc7d..19dcad9 100644
> --- a/arch/arm/mach-imx/include/mach/imx27-regs.h
> +++ b/arch/arm/mach-imx/include/mach/imx27-regs.h
> @@ -41,6 +41,17 @@
> #define IMX_NFC_BASE (0xd8000000)
> #define IMX_ESD_BASE (0xd8001000)
> #define IMX_WEIM_BASE (0xd8002000)
> +#define IMX_M3IF_BASE (0xd8003000)
> +#define IMX_PCMCIA_CTL_BASE (0xd8004000)
> +
> +#define PCMCIA_PIPR (IMX_PCMCIA_CTL_BASE + 0x00)
> +#define PCMCIA_PSCR (IMX_PCMCIA_CTL_BASE + 0x04)
> +#define PCMCIA_PER (IMX_PCMCIA_CTL_BASE + 0x08)
> +#define PCMCIA_PBR(x) (IMX_PCMCIA_CTL_BASE + 0x0c + ((x) << 2))
> +#define PCMCIA_POR(x) (IMX_PCMCIA_CTL_BASE + 0x28 + ((x) << 2))
> +#define PCMCIA_POFR(x) (IMX_PCMCIA_CTL_BASE + 0x44 + ((x) << 2))
> +#define PCMCIA_PGCR (IMX_PCMCIA_CTL_BASE + 0x60)
> +#define PCMCIA_PGSR (IMX_PCMCIA_CTL_BASE + 0x64)
>
> /* AIPI */
> #define AIPI1_PSR0 __REG(IMX_AIPI1_BASE + 0x00)
> @@ -240,6 +251,8 @@
> #define IMX_CS4_BASE 0xD4000000
> #define IMX_CS5_BASE 0xD6000000
>
> +#define IMX_PCMCIA_MEM_BASE (0xdc000000)
> +
> #ifndef __ASSEMBLY__
> static inline void imx27_setup_weimcs(size_t cs, unsigned upper, unsigned lower, unsigned addional)
> {
> --
> 1.7.3.4
>
>
> _______________________________________________
> barebox mailing list
> barebox at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
>
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
More information about the barebox
mailing list