Blame view
arch/arm/mach-imx/mach-mx27ads.c
7.96 KB
80eedae6f
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/* * Copyright (C) 2000 Deep Blue Solutions Ltd * Copyright (C) 2002 Shane Nay (shane@minirl.com) * Copyright 2006-2007 Freescale Semiconductor, Inc. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. |
80eedae6f
|
15 |
*/ |
2f8163baa
|
16 |
#include <linux/gpio.h> |
80eedae6f
|
17 18 19 20 21 |
#include <linux/platform_device.h> #include <linux/mtd/mtd.h> #include <linux/mtd/map.h> #include <linux/mtd/partitions.h> #include <linux/mtd/physmap.h> |
c981214ac
|
22 |
#include <linux/i2c.h> |
60c24dc79
|
23 |
#include <linux/irq.h> |
a09e64fbc
|
24 25 |
#include <mach/common.h> #include <mach/hardware.h> |
80eedae6f
|
26 27 28 29 |
#include <asm/mach-types.h> #include <asm/mach/arch.h> #include <asm/mach/time.h> #include <asm/mach/map.h> |
e835d88e7
|
30 |
#include <mach/iomux-mx27.h> |
80eedae6f
|
31 |
|
0e7a29a8d
|
32 |
#include "devices-imx27.h" |
7e90534a8
|
33 |
|
1faeaab27
|
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
/* * Base address of PBC controller, CS4 */ #define PBC_BASE_ADDRESS 0xf4300000 #define PBC_REG_ADDR(offset) (void __force __iomem *) \ (PBC_BASE_ADDRESS + (offset)) /* When the PBC address connection is fixed in h/w, defined as 1 */ #define PBC_ADDR_SH 0 /* Offsets for the PBC Controller register */ /* * PBC Board version register offset */ #define PBC_VERSION_REG PBC_REG_ADDR(0x00000 >> PBC_ADDR_SH) /* * PBC Board control register 1 set address. */ #define PBC_BCTRL1_SET_REG PBC_REG_ADDR(0x00008 >> PBC_ADDR_SH) /* * PBC Board control register 1 clear address. */ #define PBC_BCTRL1_CLEAR_REG PBC_REG_ADDR(0x0000C >> PBC_ADDR_SH) /* PBC Board Control Register 1 bit definitions */ #define PBC_BCTRL1_LCDON 0x0800 /* Enable the LCD */ /* to determine the correct external crystal reference */ #define CKIH_27MHZ_BIT_SET (1 << 3) |
6c80ee517
|
63 |
static const int mx27ads_pins[] __initconst = { |
c1a6f1238
|
64 |
/* UART0 */ |
80eedae6f
|
65 66 67 |
PE12_PF_UART1_TXD, PE13_PF_UART1_RXD, PE14_PF_UART1_CTS, |
c1a6f1238
|
68 69 |
PE15_PF_UART1_RTS, /* UART1 */ |
80eedae6f
|
70 71 72 |
PE3_PF_UART2_CTS, PE4_PF_UART2_RTS, PE6_PF_UART2_TXD, |
c1a6f1238
|
73 74 |
PE7_PF_UART2_RXD, /* UART2 */ |
80eedae6f
|
75 76 77 |
PE8_PF_UART3_TXD, PE9_PF_UART3_RXD, PE10_PF_UART3_CTS, |
c1a6f1238
|
78 79 |
PE11_PF_UART3_RTS, /* UART3 */ |
80eedae6f
|
80 81 82 |
PB26_AF_UART4_RTS, PB28_AF_UART4_TXD, PB29_AF_UART4_CTS, |
c1a6f1238
|
83 84 |
PB31_AF_UART4_RXD, /* UART4 */ |
80eedae6f
|
85 86 87 |
PB18_AF_UART5_TXD, PB19_AF_UART5_RXD, PB20_AF_UART5_CTS, |
c1a6f1238
|
88 89 |
PB21_AF_UART5_RTS, /* UART5 */ |
80eedae6f
|
90 91 92 |
PB10_AF_UART6_TXD, PB12_AF_UART6_CTS, PB11_AF_UART6_RXD, |
c1a6f1238
|
93 94 |
PB13_AF_UART6_RTS, /* FEC */ |
80eedae6f
|
95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
PD0_AIN_FEC_TXD0, PD1_AIN_FEC_TXD1, PD2_AIN_FEC_TXD2, PD3_AIN_FEC_TXD3, PD4_AOUT_FEC_RX_ER, PD5_AOUT_FEC_RXD1, PD6_AOUT_FEC_RXD2, PD7_AOUT_FEC_RXD3, PD8_AF_FEC_MDIO, PD9_AIN_FEC_MDC, PD10_AOUT_FEC_CRS, PD11_AOUT_FEC_TX_CLK, PD12_AOUT_FEC_RXD0, PD13_AOUT_FEC_RX_DV, |
ccfe30a7c
|
109 |
PD14_AOUT_FEC_RX_CLK, |
80eedae6f
|
110 111 |
PD15_AOUT_FEC_COL, PD16_AIN_FEC_TX_ER, |
c1a6f1238
|
112 |
PF23_AIN_FEC_TX_EN, |
c981214ac
|
113 114 115 |
/* I2C2 */ PC5_PF_I2C2_SDA, PC6_PF_I2C2_SCL, |
11cda13d4
|
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
/* FB */ PA5_PF_LSCLK, PA6_PF_LD0, PA7_PF_LD1, PA8_PF_LD2, PA9_PF_LD3, PA10_PF_LD4, PA11_PF_LD5, PA12_PF_LD6, PA13_PF_LD7, PA14_PF_LD8, PA15_PF_LD9, PA16_PF_LD10, PA17_PF_LD11, PA18_PF_LD12, PA19_PF_LD13, PA20_PF_LD14, PA21_PF_LD15, PA22_PF_LD16, PA23_PF_LD17, PA24_PF_REV, PA25_PF_CLS, PA26_PF_PS, PA27_PF_SPL_SPR, PA28_PF_HSYNC, PA29_PF_VSYNC, PA30_PF_CONTRAST, PA31_PF_OE_ACD, |
9366d8f67
|
144 145 |
/* OWIRE */ PE16_AF_OWIRE, |
60c24dc79
|
146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
/* SDHC1*/ PE18_PF_SD1_D0, PE19_PF_SD1_D1, PE20_PF_SD1_D2, PE21_PF_SD1_D3, PE22_PF_SD1_CMD, PE23_PF_SD1_CLK, /* SDHC2*/ PB4_PF_SD2_D0, PB5_PF_SD2_D1, PB6_PF_SD2_D2, PB7_PF_SD2_D3, PB8_PF_SD2_CMD, PB9_PF_SD2_CLK, |
80eedae6f
|
160 |
}; |
0e7a29a8d
|
161 162 |
static const struct mxc_nand_platform_data mx27ads_nand_board_info __initconst = { |
8d4fd258f
|
163 164 165 |
.width = 1, .hw_ecc = 1, }; |
c1a6f1238
|
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 |
/* ADS's NOR flash */ static struct physmap_flash_data mx27ads_flash_data = { .width = 2, }; static struct resource mx27ads_flash_resource = { .start = 0xc0000000, .end = 0xc0000000 + 0x02000000 - 1, .flags = IORESOURCE_MEM, }; static struct platform_device mx27ads_nor_mtd_device = { .name = "physmap-flash", .id = 0, .dev = { .platform_data = &mx27ads_flash_data, }, .num_resources = 1, .resource = &mx27ads_flash_resource, }; |
c69871597
|
187 |
static const struct imxi2c_platform_data mx27ads_i2c1_data __initconst = { |
c981214ac
|
188 189 190 191 192 |
.bitrate = 100000, }; static struct i2c_board_info mx27ads_i2c_devices[] = { }; |
11cda13d4
|
193 194 195 196 197 198 199 |
void lcd_power(int on) { if (on) __raw_writew(PBC_BCTRL1_LCDON, PBC_BCTRL1_SET_REG); else __raw_writew(PBC_BCTRL1_LCDON, PBC_BCTRL1_CLEAR_REG); } |
343684ffb
|
200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 |
static struct imx_fb_videomode mx27ads_modes[] = { { .mode = { .name = "Sharp-LQ035Q7", .refresh = 60, .xres = 240, .yres = 320, .pixclock = 188679, /* in ps (5.3MHz) */ .hsync_len = 1, .left_margin = 9, .right_margin = 16, .vsync_len = 1, .upper_margin = 7, .lower_margin = 9, }, .bpp = 16, .pcr = 0xFB008BC0, }, }; |
11cda13d4
|
219 |
|
ad851bffb
|
220 |
static const struct imx_fb_platform_data mx27ads_fb_data __initconst = { |
343684ffb
|
221 222 |
.mode = mx27ads_modes, .num_modes = ARRAY_SIZE(mx27ads_modes), |
11cda13d4
|
223 224 225 226 227 228 229 230 231 232 |
/* * - HSYNC active high * - VSYNC active high * - clk notenabled while idle * - clock inverted * - data not inverted * - data enable low active * - enable sharp mode */ |
11cda13d4
|
233 234 235 236 237 238 |
.pwmr = 0x00A903FF, .lscr1 = 0x00120300, .dmacr = 0x00020010, .lcd_power = lcd_power, }; |
60c24dc79
|
239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 |
static int mx27ads_sdhc1_init(struct device *dev, irq_handler_t detect_irq, void *data) { return request_irq(IRQ_GPIOE(21), detect_irq, IRQF_TRIGGER_RISING, "sdhc1-card-detect", data); } static int mx27ads_sdhc2_init(struct device *dev, irq_handler_t detect_irq, void *data) { return request_irq(IRQ_GPIOB(7), detect_irq, IRQF_TRIGGER_RISING, "sdhc2-card-detect", data); } static void mx27ads_sdhc1_exit(struct device *dev, void *data) { free_irq(IRQ_GPIOE(21), data); } static void mx27ads_sdhc2_exit(struct device *dev, void *data) { free_irq(IRQ_GPIOB(7), data); } |
9d3d945a8
|
262 |
static const struct imxmmc_platform_data sdhc1_pdata __initconst = { |
60c24dc79
|
263 264 265 |
.init = mx27ads_sdhc1_init, .exit = mx27ads_sdhc1_exit, }; |
9d3d945a8
|
266 |
static const struct imxmmc_platform_data sdhc2_pdata __initconst = { |
60c24dc79
|
267 268 269 |
.init = mx27ads_sdhc2_init, .exit = mx27ads_sdhc2_exit, }; |
c1a6f1238
|
270 271 |
static struct platform_device *platform_devices[] __initdata = { &mx27ads_nor_mtd_device, |
c1a6f1238
|
272 |
}; |
80eedae6f
|
273 |
|
d5dac4a69
|
274 275 |
static const struct imxuart_platform_data uart_pdata __initconst = { .flags = IMXUART_HAVE_RTSCTS, |
80eedae6f
|
276 277 278 279 |
}; static void __init mx27ads_board_init(void) { |
b78d8e59a
|
280 |
imx27_soc_init(); |
c1a6f1238
|
281 282 |
mxc_gpio_setup_multiple_pins(mx27ads_pins, ARRAY_SIZE(mx27ads_pins), "mx27ads"); |
80eedae6f
|
283 |
|
d5dac4a69
|
284 285 286 287 288 289 |
imx27_add_imx_uart0(&uart_pdata); imx27_add_imx_uart1(&uart_pdata); imx27_add_imx_uart2(&uart_pdata); imx27_add_imx_uart3(&uart_pdata); imx27_add_imx_uart4(&uart_pdata); imx27_add_imx_uart5(&uart_pdata); |
0e7a29a8d
|
290 |
imx27_add_mxc_nand(&mx27ads_nand_board_info); |
c981214ac
|
291 292 293 294 |
/* only the i2c master 1 is used on this CPU card */ i2c_register_board_info(1, mx27ads_i2c_devices, ARRAY_SIZE(mx27ads_i2c_devices)); |
77a406da5
|
295 |
imx27_add_imx_i2c(1, &mx27ads_i2c1_data); |
ad851bffb
|
296 |
imx27_add_imx_fb(&mx27ads_fb_data); |
9d3d945a8
|
297 298 |
imx27_add_mxc_mmc(0, &sdhc1_pdata); imx27_add_mxc_mmc(1, &sdhc2_pdata); |
80eedae6f
|
299 |
|
6bd96f3c3
|
300 |
imx27_add_fec(NULL); |
80eedae6f
|
301 |
platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices)); |
ae71a5622
|
302 |
imx27_add_mxc_w1(NULL); |
80eedae6f
|
303 304 305 306 307 308 309 310 |
} static void __init mx27ads_timer_init(void) { unsigned long fref = 26000000; if ((__raw_readw(PBC_VERSION_REG) & CKIH_27MHZ_BIT_SET) == 0) fref = 27000000; |
30c730f8f
|
311 |
mx27_clocks_init(fref); |
80eedae6f
|
312 |
} |
058b7a6f4
|
313 |
static struct sys_timer mx27ads_timer = { |
80eedae6f
|
314 315 316 317 318 319 |
.init = mx27ads_timer_init, }; static struct map_desc mx27ads_io_desc[] __initdata = { { .virtual = PBC_BASE_ADDRESS, |
3f35d1f5e
|
320 |
.pfn = __phys_to_pfn(MX27_CS4_BASE_ADDR), |
80eedae6f
|
321 322 323 324 |
.length = SZ_1M, .type = MT_DEVICE, }, }; |
058b7a6f4
|
325 |
static void __init mx27ads_map_io(void) |
80eedae6f
|
326 |
{ |
cd4a05f9d
|
327 |
mx27_map_io(); |
80eedae6f
|
328 329 330 331 332 |
iotable_init(mx27ads_io_desc, ARRAY_SIZE(mx27ads_io_desc)); } MACHINE_START(MX27ADS, "Freescale i.MX27ADS") /* maintainer: Freescale Semiconductor, Inc. */ |
dc8f19076
|
333 |
.atag_offset = 0x100, |
3dac21961
|
334 335 336 |
.map_io = mx27ads_map_io, .init_early = imx27_init_early, .init_irq = mx27_init_irq, |
ffa2ea3f5
|
337 |
.handle_irq = imx27_handle_irq, |
3dac21961
|
338 339 |
.timer = &mx27ads_timer, .init_machine = mx27ads_board_init, |
80eedae6f
|
340 |
MACHINE_END |