Blame view

arch/arm/mach-imx/mach-mx31_3ds.c 19.8 KB
1553a1ec8   Fabio Estevam   Add basic support...
1
2
3
4
5
6
7
8
9
10
11
12
  /*
   *  Copyright 2008 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.
1553a1ec8   Fabio Estevam   Add basic support...
13
   */
a2ef4562c   Magnus Lilja   MXC: Add USB OTG ...
14
  #include <linux/delay.h>
b7f080cfe   Alexey Dobriyan   net: remove mm.h ...
15
  #include <linux/dma-mapping.h>
1553a1ec8   Fabio Estevam   Add basic support...
16
17
18
19
  #include <linux/types.h>
  #include <linux/init.h>
  #include <linux/clk.h>
  #include <linux/irq.h>
135cad366   Magnus Lilja   i.MX31: Add suppo...
20
  #include <linux/gpio.h>
2b0c3677b   Magnus Lilja   i.MX31: Add suppo...
21
  #include <linux/platform_device.h>
ae7a3f13a   Alberto Panizzo   MXC: mach-mx31_3d...
22
23
  #include <linux/mfd/mc13783.h>
  #include <linux/spi/spi.h>
e42010e0e   Alberto Panizzo   mach-mx31_3ds: Ad...
24
  #include <linux/spi/l4f00242t03.h>
ae7a3f13a   Alberto Panizzo   MXC: mach-mx31_3d...
25
  #include <linux/regulator/machine.h>
1c50e6726   Fabio Estevam   ARM: mx3/mx31_3ds...
26
27
  #include <linux/usb/otg.h>
  #include <linux/usb/ulpi.h>
164f7b523   Alberto Panizzo   mach-mx31_3ds: Ad...
28
29
30
  #include <linux/memblock.h>
  
  #include <media/soc_camera.h>
1553a1ec8   Fabio Estevam   Add basic support...
31
32
33
34
35
36
37
  
  #include <mach/hardware.h>
  #include <asm/mach-types.h>
  #include <asm/mach/arch.h>
  #include <asm/mach/time.h>
  #include <asm/memory.h>
  #include <asm/mach/map.h>
716a3dc20   Russell King   ARM: Add arm_memb...
38
  #include <asm/memblock.h>
1553a1ec8   Fabio Estevam   Add basic support...
39
  #include <mach/common.h>
1553a1ec8   Fabio Estevam   Add basic support...
40
  #include <mach/iomux-mx3.h>
c5d38f08c   Jason Wang   mx31_3ds: revert ...
41
  #include <mach/3ds_debugboard.h>
1c50e6726   Fabio Estevam   ARM: mx3/mx31_3ds...
42
  #include <mach/ulpi.h>
a2ceeef59   Uwe Kleine-König   ARM: imx: Change ...
43
44
  
  #include "devices-imx31.h"
1553a1ec8   Fabio Estevam   Add basic support...
45

b396dc459   Uwe Kleine-König   ARM: mx3/mx31_3ds...
46
47
  /* CPLD IRQ line for external uart, external ethernet etc */
  #define EXPIO_PARENT_INT	IOMUX_TO_IRQ(MX31_PIN_GPIO1_1)
11a332adf   Alberto Panizzo   MXC: mach-mx31_3d...
48
  static int mx31_3ds_pins[] = {
153fa1d8c   Magnus Lilja   i.MX31: Restructu...
49
  	/* UART1 */
63d976672   Valentin Longchamp   mx31pdk: use of n...
50
51
52
  	MX31_PIN_CTS1__CTS1,
  	MX31_PIN_RTS1__RTS1,
  	MX31_PIN_TXD1__TXD1,
135cad366   Magnus Lilja   i.MX31: Add suppo...
53
54
  	MX31_PIN_RXD1__RXD1,
  	IOMUX_MODE(MX31_PIN_GPIO1_1, IOMUX_CONFIG_GPIO),
e42010e0e   Alberto Panizzo   mach-mx31_3ds: Ad...
55
  	/*SPI0*/
b2a08e3e4   Fabio Estevam   ARM: mach-imx/mx3...
56
57
  	IOMUX_MODE(MX31_PIN_DSR_DCE1, IOMUX_CONFIG_ALT1),
  	IOMUX_MODE(MX31_PIN_RI_DCE1, IOMUX_CONFIG_ALT1),
a1ac44244   Alberto Panizzo   MXC: mach-mx31_3d...
58
59
60
61
62
63
64
  	/* SPI 1 */
  	MX31_PIN_CSPI2_SCLK__SCLK,
  	MX31_PIN_CSPI2_MOSI__MOSI,
  	MX31_PIN_CSPI2_MISO__MISO,
  	MX31_PIN_CSPI2_SPI_RDY__SPI_RDY,
  	MX31_PIN_CSPI2_SS0__SS0,
  	MX31_PIN_CSPI2_SS2__SS2, /*CS for MC13783 */
ae7a3f13a   Alberto Panizzo   MXC: mach-mx31_3d...
65
66
  	/* MC13783 IRQ */
  	IOMUX_MODE(MX31_PIN_GPIO1_3, IOMUX_CONFIG_GPIO),
a2ef4562c   Magnus Lilja   MXC: Add USB OTG ...
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
  	/* USB OTG reset */
  	IOMUX_MODE(MX31_PIN_USB_PWR, IOMUX_CONFIG_GPIO),
  	/* USB OTG */
  	MX31_PIN_USBOTG_DATA0__USBOTG_DATA0,
  	MX31_PIN_USBOTG_DATA1__USBOTG_DATA1,
  	MX31_PIN_USBOTG_DATA2__USBOTG_DATA2,
  	MX31_PIN_USBOTG_DATA3__USBOTG_DATA3,
  	MX31_PIN_USBOTG_DATA4__USBOTG_DATA4,
  	MX31_PIN_USBOTG_DATA5__USBOTG_DATA5,
  	MX31_PIN_USBOTG_DATA6__USBOTG_DATA6,
  	MX31_PIN_USBOTG_DATA7__USBOTG_DATA7,
  	MX31_PIN_USBOTG_CLK__USBOTG_CLK,
  	MX31_PIN_USBOTG_DIR__USBOTG_DIR,
  	MX31_PIN_USBOTG_NXT__USBOTG_NXT,
  	MX31_PIN_USBOTG_STP__USBOTG_STP,
54c1f6367   Alberto Panizzo   mx31_3ds: Support...
82
83
84
85
86
87
88
89
  	/*Keyboard*/
  	MX31_PIN_KEY_ROW0_KEY_ROW0,
  	MX31_PIN_KEY_ROW1_KEY_ROW1,
  	MX31_PIN_KEY_ROW2_KEY_ROW2,
  	MX31_PIN_KEY_COL0_KEY_COL0,
  	MX31_PIN_KEY_COL1_KEY_COL1,
  	MX31_PIN_KEY_COL2_KEY_COL2,
  	MX31_PIN_KEY_COL3_KEY_COL3,
0d95b75e2   Fabio Estevam   ARM: mx3/mx31_3ds...
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
  	/* USB Host 2 */
  	IOMUX_MODE(MX31_PIN_USBH2_CLK, IOMUX_CONFIG_FUNC),
  	IOMUX_MODE(MX31_PIN_USBH2_DIR, IOMUX_CONFIG_FUNC),
  	IOMUX_MODE(MX31_PIN_USBH2_NXT, IOMUX_CONFIG_FUNC),
  	IOMUX_MODE(MX31_PIN_USBH2_STP, IOMUX_CONFIG_FUNC),
  	IOMUX_MODE(MX31_PIN_USBH2_DATA0, IOMUX_CONFIG_FUNC),
  	IOMUX_MODE(MX31_PIN_USBH2_DATA1, IOMUX_CONFIG_FUNC),
  	IOMUX_MODE(MX31_PIN_PC_VS2, IOMUX_CONFIG_ALT1),
  	IOMUX_MODE(MX31_PIN_PC_BVD1, IOMUX_CONFIG_ALT1),
  	IOMUX_MODE(MX31_PIN_PC_BVD2, IOMUX_CONFIG_ALT1),
  	IOMUX_MODE(MX31_PIN_PC_RST, IOMUX_CONFIG_ALT1),
  	IOMUX_MODE(MX31_PIN_IOIS16, IOMUX_CONFIG_ALT1),
  	IOMUX_MODE(MX31_PIN_PC_RW_B, IOMUX_CONFIG_ALT1),
  	/* USB Host2 reset */
  	IOMUX_MODE(MX31_PIN_USB_BYP, IOMUX_CONFIG_GPIO),
3d9430244   Fabio Estevam   ARM: mx31_3ds: Ad...
105
106
107
  	/* I2C1 */
  	MX31_PIN_I2C_CLK__I2C1_SCL,
  	MX31_PIN_I2C_DAT__I2C1_SDA,
0ce88b34e   Alberto Panizzo   mach-mx31_3ds: Ad...
108
109
110
111
112
113
114
115
116
  	/* SDHC1 */
  	MX31_PIN_SD1_DATA3__SD1_DATA3,
  	MX31_PIN_SD1_DATA2__SD1_DATA2,
  	MX31_PIN_SD1_DATA1__SD1_DATA1,
  	MX31_PIN_SD1_DATA0__SD1_DATA0,
  	MX31_PIN_SD1_CLK__SD1_CLK,
  	MX31_PIN_SD1_CMD__SD1_CMD,
  	MX31_PIN_GPIO3_1__GPIO3_1, /* Card detect */
  	MX31_PIN_GPIO3_0__GPIO3_0, /* OE */
e42010e0e   Alberto Panizzo   mach-mx31_3ds: Ad...
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
  	/* Framebuffer */
  	MX31_PIN_LD0__LD0,
  	MX31_PIN_LD1__LD1,
  	MX31_PIN_LD2__LD2,
  	MX31_PIN_LD3__LD3,
  	MX31_PIN_LD4__LD4,
  	MX31_PIN_LD5__LD5,
  	MX31_PIN_LD6__LD6,
  	MX31_PIN_LD7__LD7,
  	MX31_PIN_LD8__LD8,
  	MX31_PIN_LD9__LD9,
  	MX31_PIN_LD10__LD10,
  	MX31_PIN_LD11__LD11,
  	MX31_PIN_LD12__LD12,
  	MX31_PIN_LD13__LD13,
  	MX31_PIN_LD14__LD14,
  	MX31_PIN_LD15__LD15,
  	MX31_PIN_LD16__LD16,
  	MX31_PIN_LD17__LD17,
  	MX31_PIN_VSYNC3__VSYNC3,
  	MX31_PIN_HSYNC__HSYNC,
  	MX31_PIN_FPSHIFT__FPSHIFT,
  	MX31_PIN_CONTRAST__CONTRAST,
164f7b523   Alberto Panizzo   mach-mx31_3ds: Ad...
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
  	/* CSI */
  	MX31_PIN_CSI_D6__CSI_D6,
  	MX31_PIN_CSI_D7__CSI_D7,
  	MX31_PIN_CSI_D8__CSI_D8,
  	MX31_PIN_CSI_D9__CSI_D9,
  	MX31_PIN_CSI_D10__CSI_D10,
  	MX31_PIN_CSI_D11__CSI_D11,
  	MX31_PIN_CSI_D12__CSI_D12,
  	MX31_PIN_CSI_D13__CSI_D13,
  	MX31_PIN_CSI_D14__CSI_D14,
  	MX31_PIN_CSI_D15__CSI_D15,
  	MX31_PIN_CSI_HSYNC__CSI_HSYNC,
  	MX31_PIN_CSI_MCLK__CSI_MCLK,
  	MX31_PIN_CSI_PIXCLK__CSI_PIXCLK,
  	MX31_PIN_CSI_VSYNC__CSI_VSYNC,
  	MX31_PIN_CSI_D5__GPIO3_5, /* CMOS PWDN */
  	IOMUX_MODE(MX31_PIN_RI_DTE1, IOMUX_CONFIG_GPIO), /* CMOS reset */
  };
  
  /*
   * Camera support
   */
  static phys_addr_t mx3_camera_base __initdata;
  #define MX31_3DS_CAMERA_BUF_SIZE SZ_8M
  
  #define MX31_3DS_GPIO_CAMERA_PW IOMUX_TO_GPIO(MX31_PIN_CSI_D5)
  #define MX31_3DS_GPIO_CAMERA_RST IOMUX_TO_GPIO(MX31_PIN_RI_DTE1)
  
  static struct gpio mx31_3ds_camera_gpios[] = {
  	{ MX31_3DS_GPIO_CAMERA_PW, GPIOF_OUT_INIT_HIGH, "camera-power" },
  	{ MX31_3DS_GPIO_CAMERA_RST, GPIOF_OUT_INIT_HIGH, "camera-reset" },
  };
afa77ef30   Uwe Kleine-König   ARM: mx3: dynamic...
172
173
174
175
176
177
  static const struct mx3_camera_pdata mx31_3ds_camera_pdata __initconst = {
  	.flags = MX3_CAMERA_DATAWIDTH_10,
  	.mclk_10khz = 2600,
  };
  
  static int __init mx31_3ds_init_camera(void)
164f7b523   Alberto Panizzo   mach-mx31_3ds: Ad...
178
  {
afa77ef30   Uwe Kleine-König   ARM: mx3: dynamic...
179
180
181
182
183
184
  	int dma, ret = -ENOMEM;
  	struct platform_device *pdev =
  		imx31_alloc_mx3_camera(&mx31_3ds_camera_pdata);
  
  	if (IS_ERR(pdev))
  		return PTR_ERR(pdev);
164f7b523   Alberto Panizzo   mach-mx31_3ds: Ad...
185
186
  
  	if (!mx3_camera_base)
afa77ef30   Uwe Kleine-König   ARM: mx3: dynamic...
187
  		goto err;
164f7b523   Alberto Panizzo   mach-mx31_3ds: Ad...
188

afa77ef30   Uwe Kleine-König   ARM: mx3: dynamic...
189
  	dma = dma_declare_coherent_memory(&pdev->dev,
164f7b523   Alberto Panizzo   mach-mx31_3ds: Ad...
190
191
192
193
194
  					mx3_camera_base, mx3_camera_base,
  					MX31_3DS_CAMERA_BUF_SIZE,
  					DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE);
  
  	if (!(dma & DMA_MEMORY_MAP))
afa77ef30   Uwe Kleine-König   ARM: mx3: dynamic...
195
  		goto err;
164f7b523   Alberto Panizzo   mach-mx31_3ds: Ad...
196

afa77ef30   Uwe Kleine-König   ARM: mx3: dynamic...
197
198
199
200
201
202
  	ret = platform_device_add(pdev);
  	if (ret)
  err:
  		platform_device_put(pdev);
  
  	return ret;
164f7b523   Alberto Panizzo   mach-mx31_3ds: Ad...
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
  }
  
  static int mx31_3ds_camera_power(struct device *dev, int on)
  {
  	/* enable or disable the camera */
  	pr_debug("%s: %s the camera
  ", __func__, on ? "ENABLE" : "DISABLE");
  	gpio_set_value(MX31_3DS_GPIO_CAMERA_PW, on ? 0 : 1);
  
  	if (!on)
  		goto out;
  
  	/* If enabled, give a reset impulse */
  	gpio_set_value(MX31_3DS_GPIO_CAMERA_RST, 0);
  	msleep(20);
  	gpio_set_value(MX31_3DS_GPIO_CAMERA_RST, 1);
  	msleep(100);
  
  out:
  	return 0;
  }
  
  static struct i2c_board_info mx31_3ds_i2c_camera = {
  	I2C_BOARD_INFO("ov2640", 0x30),
  };
  
  static struct regulator_bulk_data mx31_3ds_camera_regs[] = {
  	{ .supply = "cmos_vcore" },
  	{ .supply = "cmos_2v8" },
  };
  
  static struct soc_camera_link iclink_ov2640 = {
  	.bus_id		= 0,
  	.board_info	= &mx31_3ds_i2c_camera,
  	.i2c_adapter_id	= 0,
  	.power		= mx31_3ds_camera_power,
  	.regulators	= mx31_3ds_camera_regs,
  	.num_regulators	= ARRAY_SIZE(mx31_3ds_camera_regs),
  };
  
  static struct platform_device mx31_3ds_ov2640 = {
  	.name	= "soc-camera-pdrv",
  	.id	= 0,
  	.dev	= {
  		.platform_data = &iclink_ov2640,
  	},
  };
e42010e0e   Alberto Panizzo   mach-mx31_3ds: Ad...
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
  /*
   * FB support
   */
  static const struct fb_videomode fb_modedb[] = {
  	{	/* 480x640 @ 60 Hz */
  		.name		= "Epson-VGA",
  		.refresh	= 60,
  		.xres		= 480,
  		.yres		= 640,
  		.pixclock	= 41701,
  		.left_margin	= 20,
  		.right_margin	= 41,
  		.upper_margin	= 10,
  		.lower_margin	= 5,
  		.hsync_len	= 20,
  		.vsync_len	= 10,
  		.sync		= FB_SYNC_OE_ACT_HIGH | FB_SYNC_CLK_INVERT,
  		.vmode		= FB_VMODE_NONINTERLACED,
  		.flag		= 0,
  	},
  };
  
  static struct ipu_platform_data mx3_ipu_data = {
  	.irq_base = MXC_IPU_IRQ_START,
  };
afa77ef30   Uwe Kleine-König   ARM: mx3: dynamic...
275
  static struct mx3fb_platform_data mx3fb_pdata __initdata = {
e42010e0e   Alberto Panizzo   mach-mx31_3ds: Ad...
276
277
278
279
280
281
282
283
284
  	.name		= "Epson-VGA",
  	.mode		= fb_modedb,
  	.num_modes	= ARRAY_SIZE(fb_modedb),
  };
  
  /* LCD */
  static struct l4f00242t03_pdata mx31_3ds_l4f00242t03_pdata = {
  	.reset_gpio		= IOMUX_TO_GPIO(MX31_PIN_LCS1),
  	.data_enable_gpio	= IOMUX_TO_GPIO(MX31_PIN_SER_RS),
0ce88b34e   Alberto Panizzo   mach-mx31_3ds: Ad...
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
  };
  
  /*
   * Support for SD card slot in personality board
   */
  #define MX31_3DS_GPIO_SDHC1_CD IOMUX_TO_GPIO(MX31_PIN_GPIO3_1)
  #define MX31_3DS_GPIO_SDHC1_BE IOMUX_TO_GPIO(MX31_PIN_GPIO3_0)
  
  static struct gpio mx31_3ds_sdhc1_gpios[] = {
  	{ MX31_3DS_GPIO_SDHC1_CD, GPIOF_IN, "sdhc1-card-detect" },
  	{ MX31_3DS_GPIO_SDHC1_BE, GPIOF_OUT_INIT_LOW, "sdhc1-bus-en" },
  };
  
  static int mx31_3ds_sdhc1_init(struct device *dev,
  			       irq_handler_t detect_irq,
  			       void *data)
  {
  	int ret;
  
  	ret = gpio_request_array(mx31_3ds_sdhc1_gpios,
  				 ARRAY_SIZE(mx31_3ds_sdhc1_gpios));
  	if (ret) {
  		pr_warning("Unable to request the SD/MMC GPIOs.
  ");
  		return ret;
  	}
  
  	ret = request_irq(IOMUX_TO_IRQ(MX31_PIN_GPIO3_1),
  			  detect_irq, IRQF_DISABLED |
  			  IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
  			  "sdhc1-detect", data);
  	if (ret) {
  		pr_warning("Unable to request the SD/MMC card-detect IRQ.
  ");
  		goto gpio_free;
  	}
  
  	return 0;
  
  gpio_free:
  	gpio_free_array(mx31_3ds_sdhc1_gpios,
  			ARRAY_SIZE(mx31_3ds_sdhc1_gpios));
  	return ret;
  }
  
  static void mx31_3ds_sdhc1_exit(struct device *dev, void *data)
  {
  	free_irq(IOMUX_TO_IRQ(MX31_PIN_GPIO3_1), data);
  	gpio_free_array(mx31_3ds_sdhc1_gpios,
  			 ARRAY_SIZE(mx31_3ds_sdhc1_gpios));
  }
  
  static void mx31_3ds_sdhc1_setpower(struct device *dev, unsigned int vdd)
  {
  	/*
  	 * While the voltage stuff is done by the driver, activate the
  	 * Buffer Enable Pin only if there is a card in slot to fix the card
  	 * voltage issue caused by bi-directional chip TXB0108 on 3Stack.
  	 * Done here because at this stage we have for sure a debounced value
  	 * of the presence of the card, showed by the value of vdd.
  	 * 7 == ilog2(MMC_VDD_165_195)
  	 */
  	if (vdd > 7)
  		gpio_set_value(MX31_3DS_GPIO_SDHC1_BE, 1);
  	else
  		gpio_set_value(MX31_3DS_GPIO_SDHC1_BE, 0);
  }
  
  static struct imxmmc_platform_data sdhc1_pdata = {
  	.init		= mx31_3ds_sdhc1_init,
  	.exit		= mx31_3ds_sdhc1_exit,
  	.setpower	= mx31_3ds_sdhc1_setpower,
54c1f6367   Alberto Panizzo   mx31_3ds: Support...
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
  };
  
  /*
   * Matrix keyboard
   */
  
  static const uint32_t mx31_3ds_keymap[] = {
  	KEY(0, 0, KEY_UP),
  	KEY(0, 1, KEY_DOWN),
  	KEY(1, 0, KEY_RIGHT),
  	KEY(1, 1, KEY_LEFT),
  	KEY(1, 2, KEY_ENTER),
  	KEY(2, 0, KEY_F6),
  	KEY(2, 1, KEY_F8),
  	KEY(2, 2, KEY_F9),
  	KEY(2, 3, KEY_F10),
  };
d690b4c47   Uwe Kleine-König   ARM: mx3: dynamic...
374
  static const struct matrix_keymap_data mx31_3ds_keymap_data __initconst = {
54c1f6367   Alberto Panizzo   mx31_3ds: Support...
375
376
  	.keymap		= mx31_3ds_keymap,
  	.keymap_size	= ARRAY_SIZE(mx31_3ds_keymap),
ae7a3f13a   Alberto Panizzo   MXC: mach-mx31_3d...
377
378
379
380
381
382
383
384
385
  };
  
  /* Regulators */
  static struct regulator_init_data pwgtx_init = {
  	.constraints = {
  		.boot_on	= 1,
  		.always_on	= 1,
  	},
  };
0d95b75e2   Fabio Estevam   ARM: mx3/mx31_3ds...
386
387
388
389
390
391
  static struct regulator_init_data gpo_init = {
  	.constraints = {
  		.boot_on = 1,
  		.always_on = 1,
  	}
  };
0ce88b34e   Alberto Panizzo   mach-mx31_3ds: Ad...
392
393
394
395
396
397
398
399
400
401
402
403
404
405
  static struct regulator_consumer_supply vmmc2_consumers[] = {
  	REGULATOR_SUPPLY("vmmc", "mxc-mmc.0"),
  };
  
  static struct regulator_init_data vmmc2_init = {
  	.constraints = {
  		.min_uV = 3000000,
  		.max_uV = 3000000,
  		.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
  				  REGULATOR_CHANGE_STATUS,
  	},
  	.num_consumer_supplies = ARRAY_SIZE(vmmc2_consumers),
  	.consumer_supplies = vmmc2_consumers,
  };
e42010e0e   Alberto Panizzo   mach-mx31_3ds: Ad...
406
  static struct regulator_consumer_supply vmmc1_consumers[] = {
0556dc340   Mark Brown   backlight: fix br...
407
  	REGULATOR_SUPPLY("vcore", "spi0.0"),
164f7b523   Alberto Panizzo   mach-mx31_3ds: Ad...
408
  	REGULATOR_SUPPLY("cmos_2v8", "soc-camera-pdrv.0"),
e42010e0e   Alberto Panizzo   mach-mx31_3ds: Ad...
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
  };
  
  static struct regulator_init_data vmmc1_init = {
  	.constraints = {
  		.min_uV = 2800000,
  		.max_uV = 2800000,
  		.apply_uV = 1,
  		.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
  				  REGULATOR_CHANGE_STATUS,
  	},
  	.num_consumer_supplies = ARRAY_SIZE(vmmc1_consumers),
  	.consumer_supplies = vmmc1_consumers,
  };
  
  static struct regulator_consumer_supply vgen_consumers[] = {
0556dc340   Mark Brown   backlight: fix br...
424
  	REGULATOR_SUPPLY("vdd", "spi0.0"),
e42010e0e   Alberto Panizzo   mach-mx31_3ds: Ad...
425
426
427
428
429
430
431
432
433
434
435
436
437
  };
  
  static struct regulator_init_data vgen_init = {
  	.constraints = {
  		.min_uV = 1800000,
  		.max_uV = 1800000,
  		.apply_uV = 1,
  		.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
  				  REGULATOR_CHANGE_STATUS,
  	},
  	.num_consumer_supplies = ARRAY_SIZE(vgen_consumers),
  	.consumer_supplies = vgen_consumers,
  };
164f7b523   Alberto Panizzo   mach-mx31_3ds: Ad...
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
  static struct regulator_consumer_supply vvib_consumers[] = {
  	REGULATOR_SUPPLY("cmos_vcore", "soc-camera-pdrv.0"),
  };
  
  static struct regulator_init_data vvib_init = {
  	.constraints = {
  		.min_uV = 1300000,
  		.max_uV = 1300000,
  		.apply_uV = 1,
  		.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
  				  REGULATOR_CHANGE_STATUS,
  	},
  	.num_consumer_supplies = ARRAY_SIZE(vvib_consumers),
  	.consumer_supplies = vvib_consumers,
  };
5836372e8   David Jander   ARM: imx+mx3: con...
453
  static struct mc13xxx_regulator_init_data mx31_3ds_regulators[] = {
ae7a3f13a   Alberto Panizzo   MXC: mach-mx31_3d...
454
  	{
57c78e359   Yong Shen   Change the regist...
455
  		.id = MC13783_REG_PWGT1SPI, /* Power Gate for ARM core. */
ae7a3f13a   Alberto Panizzo   MXC: mach-mx31_3d...
456
457
  		.init_data = &pwgtx_init,
  	}, {
57c78e359   Yong Shen   Change the regist...
458
  		.id = MC13783_REG_PWGT2SPI, /* Power Gate for L2 Cache. */
ae7a3f13a   Alberto Panizzo   MXC: mach-mx31_3d...
459
  		.init_data = &pwgtx_init,
0d95b75e2   Fabio Estevam   ARM: mx3/mx31_3ds...
460
  	}, {
c97b73939   Sascha Hauer   ARM i.MX mx31_3ds...
461
  		.id = MC13783_REG_GPO1, /* Turn on 1.8V */
0d95b75e2   Fabio Estevam   ARM: mx3/mx31_3ds...
462
463
  		.init_data = &gpo_init,
  	}, {
c97b73939   Sascha Hauer   ARM i.MX mx31_3ds...
464
  		.id = MC13783_REG_GPO3, /* Turn on 3.3V */
0d95b75e2   Fabio Estevam   ARM: mx3/mx31_3ds...
465
  		.init_data = &gpo_init,
0ce88b34e   Alberto Panizzo   mach-mx31_3ds: Ad...
466
467
468
  	}, {
  		.id = MC13783_REG_VMMC2, /* Power MMC/SD, WiFi/Bluetooth. */
  		.init_data = &vmmc2_init,
e42010e0e   Alberto Panizzo   mach-mx31_3ds: Ad...
469
470
471
472
473
474
  	}, {
  		.id = MC13783_REG_VMMC1, /* Power LCD, CMOS, FM, GPS, Accel. */
  		.init_data = &vmmc1_init,
  	}, {
  		.id = MC13783_REG_VGEN,  /* Power LCD */
  		.init_data = &vgen_init,
164f7b523   Alberto Panizzo   mach-mx31_3ds: Ad...
475
476
477
  	}, {
  		.id = MC13783_REG_VVIB,  /* Power CMOS */
  		.init_data = &vvib_init,
ae7a3f13a   Alberto Panizzo   MXC: mach-mx31_3d...
478
479
480
481
  	},
  };
  
  /* MC13783 */
4ec1b54c4   Andres Salomon   mfd: mfd_cell is ...
482
483
484
485
486
  static struct mc13xxx_platform_data mc13783_pdata = {
  	.regulators = {
  		.regulators = mx31_3ds_regulators,
  		.num_regulators = ARRAY_SIZE(mx31_3ds_regulators),
  	},
039d7ba4b   Fabio Estevam   ARM: mx31pdk: Add...
487
  	.flags  = MC13XXX_USE_TOUCHSCREEN | MC13XXX_USE_RTC,
a1ac44244   Alberto Panizzo   MXC: mach-mx31_3d...
488
489
490
  };
  
  /* SPI */
e42010e0e   Alberto Panizzo   mach-mx31_3ds: Ad...
491
492
493
494
495
496
497
498
  static int spi0_internal_chipselect[] = {
  	MXC_SPI_CS(2),
  };
  
  static const struct spi_imx_master spi0_pdata __initconst = {
  	.chipselect	= spi0_internal_chipselect,
  	.num_chipselect	= ARRAY_SIZE(spi0_internal_chipselect),
  };
a1ac44244   Alberto Panizzo   MXC: mach-mx31_3d...
499
500
501
502
  static int spi1_internal_chipselect[] = {
  	MXC_SPI_CS(0),
  	MXC_SPI_CS(2),
  };
06606ff13   Uwe Kleine-König   ARM: imx: dynamic...
503
  static const struct spi_imx_master spi1_pdata __initconst = {
a1ac44244   Alberto Panizzo   MXC: mach-mx31_3d...
504
505
  	.chipselect	= spi1_internal_chipselect,
  	.num_chipselect	= ARRAY_SIZE(spi1_internal_chipselect),
63d976672   Valentin Longchamp   mx31pdk: use of n...
506
  };
ae7a3f13a   Alberto Panizzo   MXC: mach-mx31_3d...
507
508
509
510
511
512
513
514
515
  static struct spi_board_info mx31_3ds_spi_devs[] __initdata = {
  	{
  		.modalias	= "mc13783",
  		.max_speed_hz	= 1000000,
  		.bus_num	= 1,
  		.chip_select	= 1, /* SS2 */
  		.platform_data	= &mc13783_pdata,
  		.irq		= IOMUX_TO_IRQ(MX31_PIN_GPIO1_3),
  		.mode = SPI_CS_HIGH,
e42010e0e   Alberto Panizzo   mach-mx31_3ds: Ad...
516
517
518
519
520
521
  	}, {
  		.modalias	= "l4f00242t03",
  		.max_speed_hz	= 5000000,
  		.bus_num	= 0,
  		.chip_select	= 0, /* SS2 */
  		.platform_data	= &mx31_3ds_l4f00242t03_pdata,
ae7a3f13a   Alberto Panizzo   MXC: mach-mx31_3d...
522
523
  	},
  };
a1b67b957   Alberto Panizzo   MXC: mach-mx31_3d...
524
525
526
  /*
   * NAND Flash
   */
a2ceeef59   Uwe Kleine-König   ARM: imx: Change ...
527
528
  static const struct mxc_nand_platform_data
  mx31_3ds_nand_board_info __initconst = {
a1b67b957   Alberto Panizzo   MXC: mach-mx31_3d...
529
530
  	.width		= 1,
  	.hw_ecc		= 1,
5328ecbb5   Paul Bolle   ARM: imx: Fix typ...
531
  #ifdef CONFIG_MACH_MX31_3DS_MXC_NAND_USE_BBT
a1b67b957   Alberto Panizzo   MXC: mach-mx31_3d...
532
533
534
  	.flash_bbt	= 1,
  #endif
  };
a2ef4562c   Magnus Lilja   MXC: Add USB OTG ...
535
536
537
538
539
540
541
542
  /*
   * USB OTG
   */
  
  #define USB_PAD_CFG (PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST | PAD_CTL_HYS_CMOS | \
  		     PAD_CTL_ODE_CMOS | PAD_CTL_100K_PU)
  
  #define USBOTG_RST_B IOMUX_TO_GPIO(MX31_PIN_USB_PWR)
0d95b75e2   Fabio Estevam   ARM: mx3/mx31_3ds...
543
  #define USBH2_RST_B IOMUX_TO_GPIO(MX31_PIN_USB_BYP)
a2ef4562c   Magnus Lilja   MXC: Add USB OTG ...
544

41f634758   Fabio Estevam   mx31_3ds: Handle ...
545
  static int mx31_3ds_usbotg_init(void)
a2ef4562c   Magnus Lilja   MXC: Add USB OTG ...
546
  {
41f634758   Fabio Estevam   mx31_3ds: Handle ...
547
  	int err;
a2ef4562c   Magnus Lilja   MXC: Add USB OTG ...
548
549
550
551
552
553
554
555
556
557
558
559
  	mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA0, USB_PAD_CFG);
  	mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA1, USB_PAD_CFG);
  	mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA2, USB_PAD_CFG);
  	mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA3, USB_PAD_CFG);
  	mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA4, USB_PAD_CFG);
  	mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA5, USB_PAD_CFG);
  	mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA6, USB_PAD_CFG);
  	mxc_iomux_set_pad(MX31_PIN_USBOTG_DATA7, USB_PAD_CFG);
  	mxc_iomux_set_pad(MX31_PIN_USBOTG_CLK, USB_PAD_CFG);
  	mxc_iomux_set_pad(MX31_PIN_USBOTG_DIR, USB_PAD_CFG);
  	mxc_iomux_set_pad(MX31_PIN_USBOTG_NXT, USB_PAD_CFG);
  	mxc_iomux_set_pad(MX31_PIN_USBOTG_STP, USB_PAD_CFG);
41f634758   Fabio Estevam   mx31_3ds: Handle ...
560
561
562
563
564
565
566
567
568
569
570
571
572
  	err = gpio_request(USBOTG_RST_B, "otgusb-reset");
  	if (err) {
  		pr_err("Failed to request the USB OTG reset gpio
  ");
  		return err;
  	}
  
  	err = gpio_direction_output(USBOTG_RST_B, 0);
  	if (err) {
  		pr_err("Failed to drive the USB OTG reset gpio
  ");
  		goto usbotg_free_reset;
  	}
a2ef4562c   Magnus Lilja   MXC: Add USB OTG ...
573
574
  	mdelay(1);
  	gpio_set_value(USBOTG_RST_B, 1);
41f634758   Fabio Estevam   mx31_3ds: Handle ...
575
576
577
578
579
  	return 0;
  
  usbotg_free_reset:
  	gpio_free(USBOTG_RST_B);
  	return err;
a2ef4562c   Magnus Lilja   MXC: Add USB OTG ...
580
  }
4bd597b63   Sascha Hauer   ARM i.MX ehci: do...
581
582
583
584
585
586
  static int mx31_3ds_otg_init(struct platform_device *pdev)
  {
  	return mx31_initialize_usb_hw(pdev->id, MXC_EHCI_POWER_PINS_ENABLED);
  }
  
  static int mx31_3ds_host2_init(struct platform_device *pdev)
0d95b75e2   Fabio Estevam   ARM: mx3/mx31_3ds...
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
  {
  	int err;
  
  	mxc_iomux_set_pad(MX31_PIN_USBH2_CLK, USB_PAD_CFG);
  	mxc_iomux_set_pad(MX31_PIN_USBH2_DIR, USB_PAD_CFG);
  	mxc_iomux_set_pad(MX31_PIN_USBH2_NXT, USB_PAD_CFG);
  	mxc_iomux_set_pad(MX31_PIN_USBH2_STP, USB_PAD_CFG);
  	mxc_iomux_set_pad(MX31_PIN_USBH2_DATA0, USB_PAD_CFG);
  	mxc_iomux_set_pad(MX31_PIN_USBH2_DATA1, USB_PAD_CFG);
  	mxc_iomux_set_pad(MX31_PIN_PC_VS2, USB_PAD_CFG);
  	mxc_iomux_set_pad(MX31_PIN_PC_BVD1, USB_PAD_CFG);
  	mxc_iomux_set_pad(MX31_PIN_PC_BVD2, USB_PAD_CFG);
  	mxc_iomux_set_pad(MX31_PIN_PC_RST, USB_PAD_CFG);
  	mxc_iomux_set_pad(MX31_PIN_IOIS16, USB_PAD_CFG);
  	mxc_iomux_set_pad(MX31_PIN_PC_RW_B, USB_PAD_CFG);
  
  	err = gpio_request(USBH2_RST_B, "usbh2-reset");
  	if (err) {
  		pr_err("Failed to request the USB Host 2 reset gpio
  ");
  		return err;
  	}
  
  	err = gpio_direction_output(USBH2_RST_B, 0);
  	if (err) {
  		pr_err("Failed to drive the USB Host 2 reset gpio
  ");
  		goto usbotg_free_reset;
  	}
  
  	mdelay(1);
  	gpio_set_value(USBH2_RST_B, 1);
4bd597b63   Sascha Hauer   ARM i.MX ehci: do...
619
620
621
622
  
  	mdelay(10);
  
  	return mx31_initialize_usb_hw(pdev->id, MXC_EHCI_POWER_PINS_ENABLED);
0d95b75e2   Fabio Estevam   ARM: mx3/mx31_3ds...
623
624
625
626
627
  
  usbotg_free_reset:
  	gpio_free(USBH2_RST_B);
  	return err;
  }
1c50e6726   Fabio Estevam   ARM: mx3/mx31_3ds...
628
  static struct mxc_usbh_platform_data otg_pdata __initdata = {
4bd597b63   Sascha Hauer   ARM i.MX ehci: do...
629
  	.init	= mx31_3ds_otg_init,
1c50e6726   Fabio Estevam   ARM: mx3/mx31_3ds...
630
  	.portsc	= MXC_EHCI_MODE_ULPI,
1c50e6726   Fabio Estevam   ARM: mx3/mx31_3ds...
631
  };
0d95b75e2   Fabio Estevam   ARM: mx3/mx31_3ds...
632
633
634
635
  
  static struct mxc_usbh_platform_data usbh2_pdata __initdata = {
  	.init = mx31_3ds_host2_init,
  	.portsc	= MXC_EHCI_MODE_ULPI,
0d95b75e2   Fabio Estevam   ARM: mx3/mx31_3ds...
636
  };
1c50e6726   Fabio Estevam   ARM: mx3/mx31_3ds...
637

9e1dde338   Uwe Kleine-König   ARM: mx3: dynamic...
638
  static const struct fsl_usb2_platform_data usbotg_pdata __initconst = {
a2ef4562c   Magnus Lilja   MXC: Add USB OTG ...
639
640
641
  	.operating_mode = FSL_USB2_DR_DEVICE,
  	.phy_mode	= FSL_USB2_PHY_ULPI,
  };
1c50e6726   Fabio Estevam   ARM: mx3/mx31_3ds...
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
  static int otg_mode_host;
  
  static int __init mx31_3ds_otg_mode(char *options)
  {
  	if (!strcmp(options, "host"))
  		otg_mode_host = 1;
  	else if (!strcmp(options, "device"))
  		otg_mode_host = 0;
  	else
  		pr_info("otg_mode neither \"host\" nor \"device\". "
  			"Defaulting to device
  ");
  	return 0;
  }
  __setup("otg_mode=", mx31_3ds_otg_mode);
16cf5c415   Uwe Kleine-König   ARM: imx: dynamic...
657
  static const struct imxuart_platform_data uart_pdata __initconst = {
153fa1d8c   Magnus Lilja   i.MX31: Restructu...
658
659
  	.flags = IMXUART_HAVE_RTSCTS,
  };
1553a1ec8   Fabio Estevam   Add basic support...
660

3d9430244   Fabio Estevam   ARM: mx31_3ds: Ad...
661
662
663
  static const struct imxi2c_platform_data mx31_3ds_i2c0_data __initconst = {
  	.bitrate = 100000,
  };
164f7b523   Alberto Panizzo   mach-mx31_3ds: Ad...
664
665
666
  static struct platform_device *devices[] __initdata = {
  	&mx31_3ds_ov2640,
  };
e134fb2b4   Uwe Kleine-König   ARM: mx3+mx5: ren...
667
  static void __init mx31_3ds_init(void)
1553a1ec8   Fabio Estevam   Add basic support...
668
  {
164f7b523   Alberto Panizzo   mach-mx31_3ds: Ad...
669
  	int ret;
b78d8e59a   Shawn Guo   gpio/mxc: Change ...
670
  	imx31_soc_init();
b2a08e3e4   Fabio Estevam   ARM: mach-imx/mx3...
671
672
  	/* Configure SPI1 IOMUX */
  	mxc_iomux_set_gpr(MUX_PGP_CSPI_BB, true);
11a332adf   Alberto Panizzo   MXC: mach-mx31_3d...
673
674
  	mxc_iomux_setup_multiple_pins(mx31_3ds_pins, ARRAY_SIZE(mx31_3ds_pins),
  				      "mx31_3ds");
153fa1d8c   Magnus Lilja   i.MX31: Restructu...
675

16cf5c415   Uwe Kleine-König   ARM: imx: dynamic...
676
  	imx31_add_imx_uart0(&uart_pdata);
a2ceeef59   Uwe Kleine-König   ARM: imx: Change ...
677
  	imx31_add_mxc_nand(&mx31_3ds_nand_board_info);
ae7a3f13a   Alberto Panizzo   MXC: mach-mx31_3d...
678

4a74bddcc   Rogerio Pimentel   mx31_3ds: Fix spi...
679
  	imx31_add_spi_imx1(&spi1_pdata);
ae7a3f13a   Alberto Panizzo   MXC: mach-mx31_3d...
680
681
  	spi_register_board_info(mx31_3ds_spi_devs,
  						ARRAY_SIZE(mx31_3ds_spi_devs));
135cad366   Magnus Lilja   i.MX31: Add suppo...
682

164f7b523   Alberto Panizzo   mach-mx31_3ds: Ad...
683
  	platform_add_devices(devices, ARRAY_SIZE(devices));
d690b4c47   Uwe Kleine-König   ARM: mx3: dynamic...
684
  	imx31_add_imx_keypad(&mx31_3ds_keymap_data);
54c1f6367   Alberto Panizzo   mx31_3ds: Support...
685

a2ef4562c   Magnus Lilja   MXC: Add USB OTG ...
686
  	mx31_3ds_usbotg_init();
1c50e6726   Fabio Estevam   ARM: mx3/mx31_3ds...
687
  	if (otg_mode_host) {
48f6b0999   Sascha Hauer   ARM i.MX: introdu...
688
689
690
691
  		otg_pdata.otg = imx_otg_ulpi_create(ULPI_OTG_DRVVBUS |
  				ULPI_OTG_DRVVBUS_EXT);
  		if (otg_pdata.otg)
  			imx31_add_mxc_ehci_otg(&otg_pdata);
1c50e6726   Fabio Estevam   ARM: mx3/mx31_3ds...
692
  	}
48f6b0999   Sascha Hauer   ARM i.MX: introdu...
693
694
695
696
  	usbh2_pdata.otg = imx_otg_ulpi_create(ULPI_OTG_DRVVBUS |
  			ULPI_OTG_DRVVBUS_EXT);
  	if (usbh2_pdata.otg)
  		imx31_add_mxc_ehci_hs(2, &usbh2_pdata);
1c50e6726   Fabio Estevam   ARM: mx3/mx31_3ds...
697
698
  	if (!otg_mode_host)
  		imx31_add_fsl_usb2_udc(&usbotg_pdata);
a2ef4562c   Magnus Lilja   MXC: Add USB OTG ...
699

b8be7b9a6   Rogerio Pimentel   mx31_3ds: Fix the...
700
701
702
703
  	if (mxc_expio_init(MX31_CS5_BASE_ADDR, EXPIO_PARENT_INT))
  		printk(KERN_WARNING "Init of the debug board failed, all "
  				    "devices on the debug board are unusable.
  ");
bfdde3a90   Fabio Estevam   ARM: mx3/mx31_3ds...
704
  	imx31_add_imx2_wdt(NULL);
3d9430244   Fabio Estevam   ARM: mx31_3ds: Ad...
705
  	imx31_add_imx_i2c0(&mx31_3ds_i2c0_data);
0ce88b34e   Alberto Panizzo   mach-mx31_3ds: Ad...
706
  	imx31_add_mxc_mmc(0, &sdhc1_pdata);
e42010e0e   Alberto Panizzo   mach-mx31_3ds: Ad...
707
708
  
  	imx31_add_spi_imx0(&spi0_pdata);
afa77ef30   Uwe Kleine-König   ARM: mx3: dynamic...
709
710
  	imx31_add_ipu_core(&mx3_ipu_data);
  	imx31_add_mx3_sdc_fb(&mx3fb_pdata);
164f7b523   Alberto Panizzo   mach-mx31_3ds: Ad...
711
712
713
714
715
716
717
718
719
  
  	/* CSI */
  	/* Camera power: default - off */
  	ret = gpio_request_array(mx31_3ds_camera_gpios,
  				 ARRAY_SIZE(mx31_3ds_camera_gpios));
  	if (ret) {
  		pr_err("Failed to request camera gpios");
  		iclink_ov2640.power = NULL;
  	}
afa77ef30   Uwe Kleine-König   ARM: mx3: dynamic...
720
  	mx31_3ds_init_camera();
1553a1ec8   Fabio Estevam   Add basic support...
721
  }
11a332adf   Alberto Panizzo   MXC: mach-mx31_3d...
722
  static void __init mx31_3ds_timer_init(void)
1553a1ec8   Fabio Estevam   Add basic support...
723
  {
30c730f8f   Sascha Hauer   [ARM] MXC: rework...
724
  	mx31_clocks_init(26000000);
1553a1ec8   Fabio Estevam   Add basic support...
725
  }
11a332adf   Alberto Panizzo   MXC: mach-mx31_3d...
726
727
  static struct sys_timer mx31_3ds_timer = {
  	.init	= mx31_3ds_timer_init,
1553a1ec8   Fabio Estevam   Add basic support...
728
  };
164f7b523   Alberto Panizzo   mach-mx31_3ds: Ad...
729
730
731
  static void __init mx31_3ds_reserve(void)
  {
  	/* reserve MX31_3DS_CAMERA_BUF_SIZE bytes for mx3-camera */
716a3dc20   Russell King   ARM: Add arm_memb...
732
  	mx3_camera_base = arm_memblock_steal(MX31_3DS_CAMERA_BUF_SIZE,
164f7b523   Alberto Panizzo   mach-mx31_3ds: Ad...
733
  					 MX31_3DS_CAMERA_BUF_SIZE);
164f7b523   Alberto Panizzo   mach-mx31_3ds: Ad...
734
  }
1553a1ec8   Fabio Estevam   Add basic support...
735
736
  MACHINE_START(MX31_3DS, "Freescale MX31PDK (3DS)")
  	/* Maintainer: Freescale Semiconductor, Inc. */
dc8f19076   Nicolas Pitre   ARM: mach-imx: co...
737
  	.atag_offset = 0x100,
97976e223   Uwe Kleine-König   ARM: mx3: use .in...
738
739
740
  	.map_io = mx31_map_io,
  	.init_early = imx31_init_early,
  	.init_irq = mx31_init_irq,
ffa2ea3f5   Sascha Hauer   ARM i.MX boards: ...
741
  	.handle_irq = imx31_handle_irq,
97976e223   Uwe Kleine-König   ARM: mx3: use .in...
742
  	.timer = &mx31_3ds_timer,
e134fb2b4   Uwe Kleine-König   ARM: mx3+mx5: ren...
743
  	.init_machine = mx31_3ds_init,
164f7b523   Alberto Panizzo   mach-mx31_3ds: Ad...
744
  	.reserve = mx31_3ds_reserve,
65ea7884b   Russell King   ARM: restart: mxc...
745
  	.restart	= mxc_restart,
1553a1ec8   Fabio Estevam   Add basic support...
746
  MACHINE_END