diff options
author | Magnus Damm <damm@opensource.se> | 2011-01-20 03:41:03 -0500 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2011-01-20 07:34:32 -0500 |
commit | 170c7ab58f41c526c54e9dd04044857d5d73f9e6 (patch) | |
tree | 49844238ab4c9dec7cebe5af9247f9f54d17e31b /arch/arm/mach-shmobile/board-ag5evm.c | |
parent | 71fc5099ed50d3699ba003042a721a0bf105369d (diff) |
ARM: mach-shmobile: AG5EVM LCDC / MIPI-DSI platform data
Add platform data for MIPI-DSI and LCDC on the AG5EVM
board. The sh73a0 clkdev bindings are also updated.
Signed-off-by: Magnus Damm <damm@opensource.se>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/arm/mach-shmobile/board-ag5evm.c')
-rw-r--r-- | arch/arm/mach-shmobile/board-ag5evm.c | 154 |
1 files changed, 152 insertions, 2 deletions
diff --git a/arch/arm/mach-shmobile/board-ag5evm.c b/arch/arm/mach-shmobile/board-ag5evm.c index fb94162382e2..2123b96b5638 100644 --- a/arch/arm/mach-shmobile/board-ag5evm.c +++ b/arch/arm/mach-shmobile/board-ag5evm.c | |||
@@ -34,9 +34,10 @@ | |||
34 | #include <linux/input/sh_keysc.h> | 34 | #include <linux/input/sh_keysc.h> |
35 | #include <linux/mmc/host.h> | 35 | #include <linux/mmc/host.h> |
36 | #include <linux/mmc/sh_mmcif.h> | 36 | #include <linux/mmc/sh_mmcif.h> |
37 | 37 | #include <linux/sh_clk.h> | |
38 | #include <video/sh_mobile_lcdc.h> | ||
39 | #include <video/sh_mipi_dsi.h> | ||
38 | #include <sound/sh_fsi.h> | 40 | #include <sound/sh_fsi.h> |
39 | |||
40 | #include <mach/hardware.h> | 41 | #include <mach/hardware.h> |
41 | #include <mach/sh73a0.h> | 42 | #include <mach/sh73a0.h> |
42 | #include <mach/common.h> | 43 | #include <mach/common.h> |
@@ -203,12 +204,145 @@ static struct platform_device irda_device = { | |||
203 | .num_resources = ARRAY_SIZE(irda_resources), | 204 | .num_resources = ARRAY_SIZE(irda_resources), |
204 | }; | 205 | }; |
205 | 206 | ||
207 | static unsigned char lcd_backlight_seq[3][2] = { | ||
208 | { 0x04, 0x07 }, | ||
209 | { 0x23, 0x80 }, | ||
210 | { 0x03, 0x01 }, | ||
211 | }; | ||
212 | |||
213 | static void lcd_backlight_on(void) | ||
214 | { | ||
215 | struct i2c_adapter *a; | ||
216 | struct i2c_msg msg; | ||
217 | int k; | ||
218 | |||
219 | a = i2c_get_adapter(1); | ||
220 | for (k = 0; a && k < 3; k++) { | ||
221 | msg.addr = 0x6d; | ||
222 | msg.buf = &lcd_backlight_seq[k][0]; | ||
223 | msg.len = 2; | ||
224 | msg.flags = 0; | ||
225 | if (i2c_transfer(a, &msg, 1) != 1) | ||
226 | break; | ||
227 | } | ||
228 | } | ||
229 | |||
230 | static void lcd_backlight_reset(void) | ||
231 | { | ||
232 | gpio_set_value(GPIO_PORT235, 0); | ||
233 | mdelay(24); | ||
234 | gpio_set_value(GPIO_PORT235, 1); | ||
235 | } | ||
236 | |||
237 | static void lcd_on(void *board_data, struct fb_info *info) | ||
238 | { | ||
239 | lcd_backlight_on(); | ||
240 | } | ||
241 | |||
242 | static void lcd_off(void *board_data) | ||
243 | { | ||
244 | lcd_backlight_reset(); | ||
245 | } | ||
246 | |||
247 | /* LCDC0 */ | ||
248 | static const struct fb_videomode lcdc0_modes[] = { | ||
249 | { | ||
250 | .name = "R63302(QHD)", | ||
251 | .xres = 544, | ||
252 | .yres = 961, | ||
253 | .left_margin = 72, | ||
254 | .right_margin = 600, | ||
255 | .hsync_len = 16, | ||
256 | .upper_margin = 8, | ||
257 | .lower_margin = 8, | ||
258 | .vsync_len = 2, | ||
259 | .sync = FB_SYNC_VERT_HIGH_ACT | FB_SYNC_HOR_HIGH_ACT, | ||
260 | }, | ||
261 | }; | ||
262 | |||
263 | static struct sh_mobile_lcdc_info lcdc0_info = { | ||
264 | .clock_source = LCDC_CLK_PERIPHERAL, | ||
265 | .ch[0] = { | ||
266 | .chan = LCDC_CHAN_MAINLCD, | ||
267 | .interface_type = RGB24, | ||
268 | .clock_divider = 1, | ||
269 | .flags = LCDC_FLAGS_DWPOL, | ||
270 | .lcd_size_cfg.width = 44, | ||
271 | .lcd_size_cfg.height = 79, | ||
272 | .bpp = 16, | ||
273 | .lcd_cfg = lcdc0_modes, | ||
274 | .num_cfg = ARRAY_SIZE(lcdc0_modes), | ||
275 | .board_cfg = { | ||
276 | .display_on = lcd_on, | ||
277 | .display_off = lcd_off, | ||
278 | }, | ||
279 | } | ||
280 | }; | ||
281 | |||
282 | static struct resource lcdc0_resources[] = { | ||
283 | [0] = { | ||
284 | .name = "LCDC0", | ||
285 | .start = 0xfe940000, /* P4-only space */ | ||
286 | .end = 0xfe943fff, | ||
287 | .flags = IORESOURCE_MEM, | ||
288 | }, | ||
289 | [1] = { | ||
290 | .start = intcs_evt2irq(0x580), | ||
291 | .flags = IORESOURCE_IRQ, | ||
292 | }, | ||
293 | }; | ||
294 | |||
295 | static struct platform_device lcdc0_device = { | ||
296 | .name = "sh_mobile_lcdc_fb", | ||
297 | .num_resources = ARRAY_SIZE(lcdc0_resources), | ||
298 | .resource = lcdc0_resources, | ||
299 | .id = 0, | ||
300 | .dev = { | ||
301 | .platform_data = &lcdc0_info, | ||
302 | .coherent_dma_mask = ~0, | ||
303 | }, | ||
304 | }; | ||
305 | |||
306 | /* MIPI-DSI */ | ||
307 | static struct resource mipidsi0_resources[] = { | ||
308 | [0] = { | ||
309 | .start = 0xfeab0000, | ||
310 | .end = 0xfeab3fff, | ||
311 | .flags = IORESOURCE_MEM, | ||
312 | }, | ||
313 | [1] = { | ||
314 | .start = 0xfeab4000, | ||
315 | .end = 0xfeab7fff, | ||
316 | .flags = IORESOURCE_MEM, | ||
317 | }, | ||
318 | }; | ||
319 | |||
320 | static struct sh_mipi_dsi_info mipidsi0_info = { | ||
321 | .data_format = MIPI_RGB888, | ||
322 | .lcd_chan = &lcdc0_info.ch[0], | ||
323 | .vsynw_offset = 20, | ||
324 | .clksrc = 1, | ||
325 | .flags = SH_MIPI_DSI_HSABM, | ||
326 | }; | ||
327 | |||
328 | static struct platform_device mipidsi0_device = { | ||
329 | .name = "sh-mipi-dsi", | ||
330 | .num_resources = ARRAY_SIZE(mipidsi0_resources), | ||
331 | .resource = mipidsi0_resources, | ||
332 | .id = 0, | ||
333 | .dev = { | ||
334 | .platform_data = &mipidsi0_info, | ||
335 | }, | ||
336 | }; | ||
337 | |||
206 | static struct platform_device *ag5evm_devices[] __initdata = { | 338 | static struct platform_device *ag5evm_devices[] __initdata = { |
207 | ð_device, | 339 | ð_device, |
208 | &keysc_device, | 340 | &keysc_device, |
209 | &fsi_device, | 341 | &fsi_device, |
210 | &mmc_device, | 342 | &mmc_device, |
211 | &irda_device, | 343 | &irda_device, |
344 | &lcdc0_device, | ||
345 | &mipidsi0_device, | ||
212 | }; | 346 | }; |
213 | 347 | ||
214 | static struct map_desc ag5evm_io_desc[] __initdata = { | 348 | static struct map_desc ag5evm_io_desc[] __initdata = { |
@@ -245,6 +379,8 @@ void __init ag5evm_init_irq(void) | |||
245 | __raw_writew(__raw_readw(PINTCR0A) | (2<<10), PINTCR0A); | 379 | __raw_writew(__raw_readw(PINTCR0A) | (2<<10), PINTCR0A); |
246 | } | 380 | } |
247 | 381 | ||
382 | #define DSI0PHYCR 0xe615006c | ||
383 | |||
248 | static void __init ag5evm_init(void) | 384 | static void __init ag5evm_init(void) |
249 | { | 385 | { |
250 | sh73a0_pinmux_init(); | 386 | sh73a0_pinmux_init(); |
@@ -313,6 +449,20 @@ static void __init ag5evm_init(void) | |||
313 | gpio_request(GPIO_FN_PORT242_IRDA_IN, NULL); | 449 | gpio_request(GPIO_FN_PORT242_IRDA_IN, NULL); |
314 | gpio_request(GPIO_FN_PORT243_IRDA_FIRSEL, NULL); | 450 | gpio_request(GPIO_FN_PORT243_IRDA_FIRSEL, NULL); |
315 | 451 | ||
452 | /* LCD panel */ | ||
453 | gpio_request(GPIO_PORT217, NULL); /* RESET */ | ||
454 | gpio_direction_output(GPIO_PORT217, 0); | ||
455 | mdelay(1); | ||
456 | gpio_set_value(GPIO_PORT217, 1); | ||
457 | |||
458 | /* LCD backlight controller */ | ||
459 | gpio_request(GPIO_PORT235, NULL); /* RESET */ | ||
460 | gpio_direction_output(GPIO_PORT235, 0); | ||
461 | lcd_backlight_reset(); | ||
462 | |||
463 | /* MIPI-DSI clock setup */ | ||
464 | __raw_writel(0x2a809010, DSI0PHYCR); | ||
465 | |||
316 | #ifdef CONFIG_CACHE_L2X0 | 466 | #ifdef CONFIG_CACHE_L2X0 |
317 | /* Shared attribute override enable, 64K*8way */ | 467 | /* Shared attribute override enable, 64K*8way */ |
318 | l2x0_init(__io(0xf0100000), 0x00460000, 0xc2000fff); | 468 | l2x0_init(__io(0xf0100000), 0x00460000, 0xc2000fff); |