Blame view

arch/arm/mach-imx/mach-mx27ads.c 7.96 KB
80eedae6f   Juergen Beisert   i.MX27: Add ADS p...
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   Juergen Beisert   i.MX27: Add ADS p...
15
   */
2f8163baa   Russell King   ARM: gpio: conver...
16
  #include <linux/gpio.h>
80eedae6f   Juergen Beisert   i.MX27: Add ADS p...
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   Vladimir Barinov   MX27ADS: Add I2C ...
22
  #include <linux/i2c.h>
60c24dc79   Vladimir Barinov   MX27ADS: Add SDHC...
23
  #include <linux/irq.h>
a09e64fbc   Russell King   [ARM] Move includ...
24
25
  #include <mach/common.h>
  #include <mach/hardware.h>
80eedae6f   Juergen Beisert   i.MX27: Add ADS p...
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   Uwe Kleine-König   arm/imx: let plat...
30
  #include <mach/iomux-mx27.h>
80eedae6f   Juergen Beisert   i.MX27: Add ADS p...
31

0e7a29a8d   Uwe Kleine-König   ARM: imx: Change ...
32
  #include "devices-imx27.h"
7e90534a8   Sascha Hauer   i.MX2: make SoC d...
33

1faeaab27   Uwe Kleine-König   ARM: mx2/mx27ads:...
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   Uwe Kleine-König   ARM: imx: make al...
63
  static const int mx27ads_pins[] __initconst = {
c1a6f1238   Vladimir Barinov   MX27ADS: setup al...
64
  	/* UART0 */
80eedae6f   Juergen Beisert   i.MX27: Add ADS p...
65
66
67
  	PE12_PF_UART1_TXD,
  	PE13_PF_UART1_RXD,
  	PE14_PF_UART1_CTS,
c1a6f1238   Vladimir Barinov   MX27ADS: setup al...
68
69
  	PE15_PF_UART1_RTS,
  	/* UART1 */
80eedae6f   Juergen Beisert   i.MX27: Add ADS p...
70
71
72
  	PE3_PF_UART2_CTS,
  	PE4_PF_UART2_RTS,
  	PE6_PF_UART2_TXD,
c1a6f1238   Vladimir Barinov   MX27ADS: setup al...
73
74
  	PE7_PF_UART2_RXD,
  	/* UART2 */
80eedae6f   Juergen Beisert   i.MX27: Add ADS p...
75
76
77
  	PE8_PF_UART3_TXD,
  	PE9_PF_UART3_RXD,
  	PE10_PF_UART3_CTS,
c1a6f1238   Vladimir Barinov   MX27ADS: setup al...
78
79
  	PE11_PF_UART3_RTS,
  	/* UART3 */
80eedae6f   Juergen Beisert   i.MX27: Add ADS p...
80
81
82
  	PB26_AF_UART4_RTS,
  	PB28_AF_UART4_TXD,
  	PB29_AF_UART4_CTS,
c1a6f1238   Vladimir Barinov   MX27ADS: setup al...
83
84
  	PB31_AF_UART4_RXD,
  	/* UART4 */
80eedae6f   Juergen Beisert   i.MX27: Add ADS p...
85
86
87
  	PB18_AF_UART5_TXD,
  	PB19_AF_UART5_RXD,
  	PB20_AF_UART5_CTS,
c1a6f1238   Vladimir Barinov   MX27ADS: setup al...
88
89
  	PB21_AF_UART5_RTS,
  	/* UART5 */
80eedae6f   Juergen Beisert   i.MX27: Add ADS p...
90
91
92
  	PB10_AF_UART6_TXD,
  	PB12_AF_UART6_CTS,
  	PB11_AF_UART6_RXD,
c1a6f1238   Vladimir Barinov   MX27ADS: setup al...
93
94
  	PB13_AF_UART6_RTS,
  	/* FEC */
80eedae6f   Juergen Beisert   i.MX27: Add ADS p...
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   Holger Schurig   arm/imx2x: new IO...
109
  	PD14_AOUT_FEC_RX_CLK,
80eedae6f   Juergen Beisert   i.MX27: Add ADS p...
110
111
  	PD15_AOUT_FEC_COL,
  	PD16_AIN_FEC_TX_ER,
c1a6f1238   Vladimir Barinov   MX27ADS: setup al...
112
  	PF23_AIN_FEC_TX_EN,
c981214ac   Vladimir Barinov   MX27ADS: Add I2C ...
113
114
115
  	/* I2C2 */
  	PC5_PF_I2C2_SDA,
  	PC6_PF_I2C2_SCL,
11cda13d4   Vladimir Barinov   MX27ADS: Add fram...
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   Vladimir Barinov   MX27ADS: Add 1-wi...
144
145
  	/* OWIRE */
  	PE16_AF_OWIRE,
60c24dc79   Vladimir Barinov   MX27ADS: Add SDHC...
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   Juergen Beisert   i.MX27: Add ADS p...
160
  };
0e7a29a8d   Uwe Kleine-König   ARM: imx: Change ...
161
162
  static const struct mxc_nand_platform_data
  mx27ads_nand_board_info __initconst = {
8d4fd258f   Vladimir Barinov   MX27ADS: Add NAND...
163
164
165
  	.width = 1,
  	.hw_ecc = 1,
  };
c1a6f1238   Vladimir Barinov   MX27ADS: setup al...
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   Uwe Kleine-König   ARM: imx: dynamic...
187
  static const struct imxi2c_platform_data mx27ads_i2c1_data __initconst = {
c981214ac   Vladimir Barinov   MX27ADS: Add I2C ...
188
189
190
191
192
  	.bitrate = 100000,
  };
  
  static struct i2c_board_info mx27ads_i2c_devices[] = {
  };
11cda13d4   Vladimir Barinov   MX27ADS: Add fram...
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   Sascha Hauer   imxfb: Add suppor...
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   Vladimir Barinov   MX27ADS: Add fram...
219

ad851bffb   Uwe Kleine-König   ARM: imx: dynamic...
220
  static const struct imx_fb_platform_data mx27ads_fb_data __initconst = {
343684ffb   Sascha Hauer   imxfb: Add suppor...
221
222
  	.mode = mx27ads_modes,
  	.num_modes = ARRAY_SIZE(mx27ads_modes),
11cda13d4   Vladimir Barinov   MX27ADS: Add fram...
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   Vladimir Barinov   MX27ADS: Add fram...
233
234
235
236
237
238
  	.pwmr		= 0x00A903FF,
  	.lscr1		= 0x00120300,
  	.dmacr		= 0x00020010,
  
  	.lcd_power	= lcd_power,
  };
60c24dc79   Vladimir Barinov   MX27ADS: Add SDHC...
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   Uwe Kleine-König   ARM: imx: dynamic...
262
  static const struct imxmmc_platform_data sdhc1_pdata __initconst = {
60c24dc79   Vladimir Barinov   MX27ADS: Add SDHC...
263
264
265
  	.init = mx27ads_sdhc1_init,
  	.exit = mx27ads_sdhc1_exit,
  };
9d3d945a8   Uwe Kleine-König   ARM: imx: dynamic...
266
  static const struct imxmmc_platform_data sdhc2_pdata __initconst = {
60c24dc79   Vladimir Barinov   MX27ADS: Add SDHC...
267
268
269
  	.init = mx27ads_sdhc2_init,
  	.exit = mx27ads_sdhc2_exit,
  };
c1a6f1238   Vladimir Barinov   MX27ADS: setup al...
270
271
  static struct platform_device *platform_devices[] __initdata = {
  	&mx27ads_nor_mtd_device,
c1a6f1238   Vladimir Barinov   MX27ADS: setup al...
272
  };
80eedae6f   Juergen Beisert   i.MX27: Add ADS p...
273

d5dac4a69   Uwe Kleine-König   ARM: imx: dynamic...
274
275
  static const struct imxuart_platform_data uart_pdata __initconst = {
  	.flags = IMXUART_HAVE_RTSCTS,
80eedae6f   Juergen Beisert   i.MX27: Add ADS p...
276
277
278
279
  };
  
  static void __init mx27ads_board_init(void)
  {
b78d8e59a   Shawn Guo   gpio/mxc: Change ...
280
  	imx27_soc_init();
c1a6f1238   Vladimir Barinov   MX27ADS: setup al...
281
282
  	mxc_gpio_setup_multiple_pins(mx27ads_pins, ARRAY_SIZE(mx27ads_pins),
  			"mx27ads");
80eedae6f   Juergen Beisert   i.MX27: Add ADS p...
283

d5dac4a69   Uwe Kleine-König   ARM: imx: dynamic...
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   Uwe Kleine-König   ARM: imx: Change ...
290
  	imx27_add_mxc_nand(&mx27ads_nand_board_info);
c981214ac   Vladimir Barinov   MX27ADS: Add I2C ...
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   Uwe Kleine-König   ARM: imx: fix nam...
295
  	imx27_add_imx_i2c(1, &mx27ads_i2c1_data);
ad851bffb   Uwe Kleine-König   ARM: imx: dynamic...
296
  	imx27_add_imx_fb(&mx27ads_fb_data);
9d3d945a8   Uwe Kleine-König   ARM: imx: dynamic...
297
298
  	imx27_add_mxc_mmc(0, &sdhc1_pdata);
  	imx27_add_mxc_mmc(1, &sdhc2_pdata);
80eedae6f   Juergen Beisert   i.MX27: Add ADS p...
299

6bd96f3c3   Uwe Kleine-König   ARM: imx: dynamic...
300
  	imx27_add_fec(NULL);
80eedae6f   Juergen Beisert   i.MX27: Add ADS p...
301
  	platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
ae71a5622   Uwe Kleine-König   ARM: imx: dynamic...
302
  	imx27_add_mxc_w1(NULL);
80eedae6f   Juergen Beisert   i.MX27: Add ADS p...
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   Sascha Hauer   [ARM] MXC: rework...
311
  	mx27_clocks_init(fref);
80eedae6f   Juergen Beisert   i.MX27: Add ADS p...
312
  }
058b7a6f4   Holger Schurig   arm/imx2x: remove...
313
  static struct sys_timer mx27ads_timer = {
80eedae6f   Juergen Beisert   i.MX27: Add ADS p...
314
315
316
317
318
319
  	.init	= mx27ads_timer_init,
  };
  
  static struct map_desc mx27ads_io_desc[] __initdata = {
  	{
  		.virtual = PBC_BASE_ADDRESS,
3f35d1f5e   Uwe Kleine-König   imx/mach-mx2: use...
320
  		.pfn = __phys_to_pfn(MX27_CS4_BASE_ADDR),
80eedae6f   Juergen Beisert   i.MX27: Add ADS p...
321
322
323
324
  		.length = SZ_1M,
  		.type = MT_DEVICE,
  	},
  };
058b7a6f4   Holger Schurig   arm/imx2x: remove...
325
  static void __init mx27ads_map_io(void)
80eedae6f   Juergen Beisert   i.MX27: Add ADS p...
326
  {
cd4a05f9d   Sascha Hauer   MXC: rename mxc_m...
327
  	mx27_map_io();
80eedae6f   Juergen Beisert   i.MX27: Add ADS p...
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   Nicolas Pitre   ARM: mach-imx: co...
333
  	.atag_offset = 0x100,
3dac21961   Uwe Kleine-König   ARM: imx: use .in...
334
335
336
  	.map_io = mx27ads_map_io,
  	.init_early = imx27_init_early,
  	.init_irq = mx27_init_irq,
ffa2ea3f5   Sascha Hauer   ARM i.MX boards: ...
337
  	.handle_irq = imx27_handle_irq,
3dac21961   Uwe Kleine-König   ARM: imx: use .in...
338
339
  	.timer = &mx27ads_timer,
  	.init_machine = mx27ads_board_init,
80eedae6f   Juergen Beisert   i.MX27: Add ADS p...
340
  MACHINE_END