Efika MX platform support
[efikamx:linux-kernel.git] / arch / arm / mach-mx5 / mx51_efikamx_ata.c
1 /*
2  * Copyright 2009 Pegatron Corporation. All Rights Reserved.
3  * Copyright 2009-2010 Genesi USA, Inc. All Rights Reserved.
4  */
5
6 /*
7  * The code contained herein is licensed under the GNU General Public
8  * License. You may obtain a copy of the GNU General Public License
9  * Version 2 or later at the following locations:
10  *
11  * http://www.opensource.org/licenses/gpl-license.html
12  * http://www.gnu.org/copyleft/gpl.html
13  */
14
15 #include <linux/errno.h>
16 #include <linux/module.h>
17 #include <linux/platform_device.h>
18 #include <linux/delay.h>
19 #include <linux/fsl_devices.h>
20 #include <linux/ata.h>
21 #include <mach/common.h>
22 #include <mach/hardware.h>
23 #include <mach/gpio.h>
24
25 #include "devices.h"
26 #include "mx51_pins.h"
27 #include "iomux.h"
28
29 #include "mx51_efikamx.h"
30
31 #define ATA_PAD_CONFIG (PAD_CTL_DRV_HIGH | PAD_CTL_DRV_VOT_HIGH)
32
33 struct mxc_iomux_pin_cfg __initdata mx51_efikamx_ata_iomux_pins[] = {
34         { MX51_PIN_NANDF_ALE, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
35         { MX51_PIN_NANDF_CS2, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
36         { MX51_PIN_NANDF_CS3, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
37         { MX51_PIN_NANDF_CS4, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
38         { MX51_PIN_NANDF_CS5, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
39         { MX51_PIN_NANDF_CS6, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
40         { MX51_PIN_NANDF_RE_B, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
41         { MX51_PIN_NANDF_WE_B, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
42         { MX51_PIN_NANDF_CLE, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
43         { MX51_PIN_NANDF_RB0, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
44         { MX51_PIN_NANDF_WP_B, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
45         /* TO 2.0 */
46         { MX51_PIN_GPIO_NAND, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
47         { MX51_PIN_NANDF_RB1, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
48         { MX51_PIN_NANDF_D0, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
49         { MX51_PIN_NANDF_D1, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
50         { MX51_PIN_NANDF_D2, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
51         { MX51_PIN_NANDF_D3, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
52         { MX51_PIN_NANDF_D4, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
53         { MX51_PIN_NANDF_D5, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
54         { MX51_PIN_NANDF_D6, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
55         { MX51_PIN_NANDF_D7, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
56         { MX51_PIN_NANDF_D8, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
57         { MX51_PIN_NANDF_D9, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
58         { MX51_PIN_NANDF_D10, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
59         { MX51_PIN_NANDF_D11, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
60         { MX51_PIN_NANDF_D12, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
61         { MX51_PIN_NANDF_D13, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
62         { MX51_PIN_NANDF_D14, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
63         { MX51_PIN_NANDF_D15, IOMUX_CONFIG_ALT1, ATA_PAD_CONFIG, },
64 };
65
66 /* where the hell do these come from? */
67 extern void gpio_ata_active(void);
68 extern void gpio_ata_inactive(void);
69
70 static int mx51_efikamx_ata_active(struct platform_device *pdev)
71 {
72         /* Configure the pins */
73         gpio_ata_active();
74         return 0;
75 }
76
77 static void mx51_efikamx_ata_inactive(void)
78 {
79         /* Free the pins */
80         gpio_ata_inactive();
81 }
82
83 static struct fsl_ata_platform_data mx51_efikamx_ata_data = {
84         .udma_mask = ATA_UDMA3,
85         .mwdma_mask = ATA_MWDMA2,
86         .pio_mask = ATA_PIO4,
87         .fifo_alarm = MXC_IDE_DMA_WATERMARK / 2,
88         .max_sg = MXC_IDE_DMA_BD_NR,
89         .init = mx51_efikamx_ata_active,
90         .exit = mx51_efikamx_ata_inactive,
91         .core_reg = NULL,
92         .io_reg = NULL,
93 };
94
95
96
97 void __init mx51_efikamx_init_pata(void)
98 {
99         DBG(("IOMUX for ATA (%d pins)\n", ARRAY_SIZE(mx51_efikamx_ata_iomux_pins)));
100         CONFIG_IOMUX(mx51_efikamx_ata_iomux_pins);
101
102         mxc_register_device(&pata_fsl_device, &mx51_efikamx_ata_data);
103 }