diff options
author | Arnd Bergmann <arnd@arndb.de> | 2012-03-02 09:44:12 -0500 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2012-03-02 09:44:12 -0500 |
commit | 622e695886cfede6aea0ee8ba74e1b8a4c8c01e0 (patch) | |
tree | 1b1e6574a69c18cd67cd90db1b924b487e28c56b /arch/arm/mach-imx | |
parent | 235ecf4c59ebe13e065a40755d999fa9850b8179 (diff) | |
parent | acb6464c7bcbfe23a9979f1eeed5acd9aff49774 (diff) |
Merge branch 'features/imx27-visstrim' of git://git.pengutronix.de/git/imx/linux-2.6 into next/boards
* 'features/imx27-visstrim' of git://git.pengutronix.de/git/imx/linux-2.6:
i.MX27: visstrim_m10: Add led support.
i.MX27: visstrim_m10: Add video support.
i.MX27: visstrim_m10: Register I2C devices after I2C busses have been added.
i.MX27: visstrim_m10: Sort IMX_HAVE_PLATFORM_MXC_MMC properly.
i.MX27: visstrim_m10: Add m41t00 RTC support.
Diffstat (limited to 'arch/arm/mach-imx')
-rw-r--r-- | arch/arm/mach-imx/Kconfig | 4 | ||||
-rw-r--r-- | arch/arm/mach-imx/mach-imx27_visstrim_m10.c | 139 |
2 files changed, 140 insertions, 3 deletions
diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig index 4defb97bbfc8..a3125ac21425 100644 --- a/arch/arm/mach-imx/Kconfig +++ b/arch/arm/mach-imx/Kconfig | |||
@@ -320,8 +320,10 @@ config MACH_IMX27_VISSTRIM_M10 | |||
320 | select IMX_HAVE_PLATFORM_IMX_I2C | 320 | select IMX_HAVE_PLATFORM_IMX_I2C |
321 | select IMX_HAVE_PLATFORM_IMX_SSI | 321 | select IMX_HAVE_PLATFORM_IMX_SSI |
322 | select IMX_HAVE_PLATFORM_IMX_UART | 322 | select IMX_HAVE_PLATFORM_IMX_UART |
323 | select IMX_HAVE_PLATFORM_MXC_MMC | 323 | select IMX_HAVE_PLATFORM_MX2_CAMERA |
324 | select IMX_HAVE_PLATFORM_MXC_EHCI | 324 | select IMX_HAVE_PLATFORM_MXC_EHCI |
325 | select IMX_HAVE_PLATFORM_MXC_MMC | ||
326 | select LEDS_GPIO_REGISTER | ||
325 | help | 327 | help |
326 | Include support for Visstrim_m10 platform and its different variants. | 328 | Include support for Visstrim_m10 platform and its different variants. |
327 | This includes specific configurations for the board and its | 329 | This includes specific configurations for the board and its |
diff --git a/arch/arm/mach-imx/mach-imx27_visstrim_m10.c b/arch/arm/mach-imx/mach-imx27_visstrim_m10.c index c2766ae02b4f..0a1643c3f17d 100644 --- a/arch/arm/mach-imx/mach-imx27_visstrim_m10.c +++ b/arch/arm/mach-imx/mach-imx27_visstrim_m10.c | |||
@@ -30,6 +30,10 @@ | |||
30 | #include <linux/input.h> | 30 | #include <linux/input.h> |
31 | #include <linux/gpio.h> | 31 | #include <linux/gpio.h> |
32 | #include <linux/delay.h> | 32 | #include <linux/delay.h> |
33 | #include <linux/dma-mapping.h> | ||
34 | #include <linux/leds.h> | ||
35 | #include <linux/memblock.h> | ||
36 | #include <media/soc_camera.h> | ||
33 | #include <sound/tlv320aic32x4.h> | 37 | #include <sound/tlv320aic32x4.h> |
34 | #include <asm/mach-types.h> | 38 | #include <asm/mach-types.h> |
35 | #include <asm/mach/arch.h> | 39 | #include <asm/mach/arch.h> |
@@ -39,6 +43,8 @@ | |||
39 | 43 | ||
40 | #include "devices-imx27.h" | 44 | #include "devices-imx27.h" |
41 | 45 | ||
46 | #define TVP5150_RSTN (GPIO_PORTC + 18) | ||
47 | #define TVP5150_PWDN (GPIO_PORTC + 19) | ||
42 | #define OTG_PHY_CS_GPIO (GPIO_PORTF + 17) | 48 | #define OTG_PHY_CS_GPIO (GPIO_PORTF + 17) |
43 | #define SDHC1_IRQ IRQ_GPIOB(25) | 49 | #define SDHC1_IRQ IRQ_GPIOB(25) |
44 | 50 | ||
@@ -100,8 +106,99 @@ static const int visstrim_m10_pins[] __initconst = { | |||
100 | PE1_PF_USBOTG_STP, | 106 | PE1_PF_USBOTG_STP, |
101 | PB23_PF_USB_PWR, | 107 | PB23_PF_USB_PWR, |
102 | PB24_PF_USB_OC, | 108 | PB24_PF_USB_OC, |
109 | /* CSI */ | ||
110 | PB10_PF_CSI_D0, | ||
111 | PB11_PF_CSI_D1, | ||
112 | PB12_PF_CSI_D2, | ||
113 | PB13_PF_CSI_D3, | ||
114 | PB14_PF_CSI_D4, | ||
115 | PB15_PF_CSI_MCLK, | ||
116 | PB16_PF_CSI_PIXCLK, | ||
117 | PB17_PF_CSI_D5, | ||
118 | PB18_PF_CSI_D6, | ||
119 | PB19_PF_CSI_D7, | ||
120 | PB20_PF_CSI_VSYNC, | ||
121 | PB21_PF_CSI_HSYNC, | ||
103 | }; | 122 | }; |
104 | 123 | ||
124 | /* Camera */ | ||
125 | static int visstrim_camera_power(struct device *dev, int on) | ||
126 | { | ||
127 | gpio_set_value(TVP5150_PWDN, on); | ||
128 | |||
129 | return 0; | ||
130 | }; | ||
131 | |||
132 | static int visstrim_camera_reset(struct device *dev) | ||
133 | { | ||
134 | gpio_set_value(TVP5150_RSTN, 0); | ||
135 | ndelay(500); | ||
136 | gpio_set_value(TVP5150_RSTN, 1); | ||
137 | |||
138 | return 0; | ||
139 | }; | ||
140 | |||
141 | static struct i2c_board_info visstrim_i2c_camera = { | ||
142 | I2C_BOARD_INFO("tvp5150", 0x5d), | ||
143 | }; | ||
144 | |||
145 | static struct soc_camera_link iclink_tvp5150 = { | ||
146 | .bus_id = 0, | ||
147 | .board_info = &visstrim_i2c_camera, | ||
148 | .i2c_adapter_id = 0, | ||
149 | .power = visstrim_camera_power, | ||
150 | .reset = visstrim_camera_reset, | ||
151 | }; | ||
152 | |||
153 | static struct mx2_camera_platform_data visstrim_camera = { | ||
154 | .flags = MX2_CAMERA_CCIR | MX2_CAMERA_CCIR_INTERLACE | | ||
155 | MX2_CAMERA_SWAP16 | MX2_CAMERA_PCLK_SAMPLE_RISING, | ||
156 | .clk = 100000, | ||
157 | }; | ||
158 | |||
159 | static phys_addr_t mx2_camera_base __initdata; | ||
160 | #define MX2_CAMERA_BUF_SIZE SZ_8M | ||
161 | |||
162 | static void __init visstrim_camera_init(void) | ||
163 | { | ||
164 | struct platform_device *pdev; | ||
165 | int dma; | ||
166 | |||
167 | /* Initialize tvp5150 gpios */ | ||
168 | mxc_gpio_mode(TVP5150_RSTN | GPIO_GPIO | GPIO_OUT); | ||
169 | mxc_gpio_mode(TVP5150_PWDN | GPIO_GPIO | GPIO_OUT); | ||
170 | gpio_set_value(TVP5150_RSTN, 1); | ||
171 | gpio_set_value(TVP5150_PWDN, 0); | ||
172 | ndelay(1); | ||
173 | |||
174 | gpio_set_value(TVP5150_PWDN, 1); | ||
175 | ndelay(1); | ||
176 | gpio_set_value(TVP5150_RSTN, 0); | ||
177 | ndelay(500); | ||
178 | gpio_set_value(TVP5150_RSTN, 1); | ||
179 | ndelay(200000); | ||
180 | |||
181 | pdev = imx27_add_mx2_camera(&visstrim_camera); | ||
182 | if (IS_ERR(pdev)) | ||
183 | return; | ||
184 | |||
185 | dma = dma_declare_coherent_memory(&pdev->dev, | ||
186 | mx2_camera_base, mx2_camera_base, | ||
187 | MX2_CAMERA_BUF_SIZE, | ||
188 | DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE); | ||
189 | if (!(dma & DMA_MEMORY_MAP)) | ||
190 | return; | ||
191 | } | ||
192 | |||
193 | static void __init visstrim_reserve(void) | ||
194 | { | ||
195 | /* reserve 4 MiB for mx2-camera */ | ||
196 | mx2_camera_base = memblock_alloc(MX2_CAMERA_BUF_SIZE, | ||
197 | MX2_CAMERA_BUF_SIZE); | ||
198 | memblock_free(mx2_camera_base, MX2_CAMERA_BUF_SIZE); | ||
199 | memblock_remove(mx2_camera_base, MX2_CAMERA_BUF_SIZE); | ||
200 | } | ||
201 | |||
105 | /* GPIOs used as events for applications */ | 202 | /* GPIOs used as events for applications */ |
106 | static struct gpio_keys_button visstrim_gpio_keys[] = { | 203 | static struct gpio_keys_button visstrim_gpio_keys[] = { |
107 | { | 204 | { |
@@ -136,6 +233,35 @@ static const struct gpio_keys_platform_data | |||
136 | .nbuttons = ARRAY_SIZE(visstrim_gpio_keys), | 233 | .nbuttons = ARRAY_SIZE(visstrim_gpio_keys), |
137 | }; | 234 | }; |
138 | 235 | ||
236 | /* led */ | ||
237 | static const struct gpio_led visstrim_m10_leds[] __initconst = { | ||
238 | { | ||
239 | .name = "visstrim:ld0", | ||
240 | .default_trigger = "nand-disk", | ||
241 | .gpio = (GPIO_PORTC + 29), | ||
242 | }, | ||
243 | { | ||
244 | .name = "visstrim:ld1", | ||
245 | .default_trigger = "nand-disk", | ||
246 | .gpio = (GPIO_PORTC + 24), | ||
247 | }, | ||
248 | { | ||
249 | .name = "visstrim:ld2", | ||
250 | .default_trigger = "nand-disk", | ||
251 | .gpio = (GPIO_PORTC + 28), | ||
252 | }, | ||
253 | { | ||
254 | .name = "visstrim:ld3", | ||
255 | .default_trigger = "nand-disk", | ||
256 | .gpio = (GPIO_PORTC + 25), | ||
257 | }, | ||
258 | }; | ||
259 | |||
260 | static const struct gpio_led_platform_data visstrim_m10_led_data __initconst = { | ||
261 | .leds = visstrim_m10_leds, | ||
262 | .num_leds = ARRAY_SIZE(visstrim_m10_leds), | ||
263 | }; | ||
264 | |||
139 | /* Visstrim_SM10 has a microSD slot connected to sdhc1 */ | 265 | /* Visstrim_SM10 has a microSD slot connected to sdhc1 */ |
140 | static int visstrim_m10_sdhc1_init(struct device *dev, | 266 | static int visstrim_m10_sdhc1_init(struct device *dev, |
141 | irq_handler_t detect_irq, void *data) | 267 | irq_handler_t detect_irq, void *data) |
@@ -216,6 +342,9 @@ static struct i2c_board_info visstrim_m10_i2c_devices[] = { | |||
216 | { | 342 | { |
217 | I2C_BOARD_INFO("tlv320aic32x4", 0x18), | 343 | I2C_BOARD_INFO("tlv320aic32x4", 0x18), |
218 | .platform_data = &visstrim_m10_aic32x4_pdata, | 344 | .platform_data = &visstrim_m10_aic32x4_pdata, |
345 | }, | ||
346 | { | ||
347 | I2C_BOARD_INFO("m41t00", 0x68), | ||
219 | } | 348 | } |
220 | }; | 349 | }; |
221 | 350 | ||
@@ -254,15 +383,20 @@ static void __init visstrim_m10_board_init(void) | |||
254 | imx27_add_imx_ssi(0, &visstrim_m10_ssi_pdata); | 383 | imx27_add_imx_ssi(0, &visstrim_m10_ssi_pdata); |
255 | imx27_add_imx_uart0(&uart_pdata); | 384 | imx27_add_imx_uart0(&uart_pdata); |
256 | 385 | ||
257 | i2c_register_board_info(0, visstrim_m10_i2c_devices, | ||
258 | ARRAY_SIZE(visstrim_m10_i2c_devices)); | ||
259 | imx27_add_imx_i2c(0, &visstrim_m10_i2c_data); | 386 | imx27_add_imx_i2c(0, &visstrim_m10_i2c_data); |
260 | imx27_add_imx_i2c(1, &visstrim_m10_i2c_data); | 387 | imx27_add_imx_i2c(1, &visstrim_m10_i2c_data); |
388 | i2c_register_board_info(0, visstrim_m10_i2c_devices, | ||
389 | ARRAY_SIZE(visstrim_m10_i2c_devices)); | ||
390 | |||
261 | imx27_add_mxc_mmc(0, &visstrim_m10_sdhc_pdata); | 391 | imx27_add_mxc_mmc(0, &visstrim_m10_sdhc_pdata); |
262 | imx27_add_mxc_ehci_otg(&visstrim_m10_usbotg_pdata); | 392 | imx27_add_mxc_ehci_otg(&visstrim_m10_usbotg_pdata); |
263 | imx27_add_fec(NULL); | 393 | imx27_add_fec(NULL); |
264 | imx_add_gpio_keys(&visstrim_gpio_keys_platform_data); | 394 | imx_add_gpio_keys(&visstrim_gpio_keys_platform_data); |
265 | platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices)); | 395 | platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices)); |
396 | platform_device_register_resndata(NULL, "soc-camera-pdrv", 0, NULL, 0, | ||
397 | &iclink_tvp5150, sizeof(iclink_tvp5150)); | ||
398 | gpio_led_register_device(0, &visstrim_m10_led_data); | ||
399 | visstrim_camera_init(); | ||
266 | } | 400 | } |
267 | 401 | ||
268 | static void __init visstrim_m10_timer_init(void) | 402 | static void __init visstrim_m10_timer_init(void) |
@@ -276,6 +410,7 @@ static struct sys_timer visstrim_m10_timer = { | |||
276 | 410 | ||
277 | MACHINE_START(IMX27_VISSTRIM_M10, "Vista Silicon Visstrim_M10") | 411 | MACHINE_START(IMX27_VISSTRIM_M10, "Vista Silicon Visstrim_M10") |
278 | .atag_offset = 0x100, | 412 | .atag_offset = 0x100, |
413 | .reserve = visstrim_reserve, | ||
279 | .map_io = mx27_map_io, | 414 | .map_io = mx27_map_io, |
280 | .init_early = imx27_init_early, | 415 | .init_early = imx27_init_early, |
281 | .init_irq = mx27_init_irq, | 416 | .init_irq = mx27_init_irq, |