diff options
author | Paul Mackerras <paulus@samba.org> | 2008-01-30 19:25:51 -0500 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2008-01-30 19:25:51 -0500 |
commit | bd45ac0c5daae35e7c71138172e63df5cf644cf6 (patch) | |
tree | 5eb5a599bf6a9d7a8a34e802db932aa9e9555de4 /arch/arm/mach-pxa/corgi_lcd.c | |
parent | 4eece4ccf997c0e6d8fdad3d842e37b16b8d705f (diff) | |
parent | 5bdeae46be6dfe9efa44a548bd622af325f4bdb4 (diff) |
Merge branch 'linux-2.6'
Diffstat (limited to 'arch/arm/mach-pxa/corgi_lcd.c')
-rw-r--r-- | arch/arm/mach-pxa/corgi_lcd.c | 299 |
1 files changed, 2 insertions, 297 deletions
diff --git a/arch/arm/mach-pxa/corgi_lcd.c b/arch/arm/mach-pxa/corgi_lcd.c index 365b9435f748..9328df37afd1 100644 --- a/arch/arm/mach-pxa/corgi_lcd.c +++ b/arch/arm/mach-pxa/corgi_lcd.c | |||
@@ -173,7 +173,7 @@ static void lcdtg_set_phadadj(int mode) | |||
173 | 173 | ||
174 | static int lcd_inited; | 174 | static int lcd_inited; |
175 | 175 | ||
176 | static void lcdtg_hw_init(int mode) | 176 | void corgi_lcdtg_hw_init(int mode) |
177 | { | 177 | { |
178 | if (!lcd_inited) { | 178 | if (!lcd_inited) { |
179 | int comadj; | 179 | int comadj; |
@@ -254,7 +254,7 @@ static void lcdtg_hw_init(int mode) | |||
254 | } | 254 | } |
255 | } | 255 | } |
256 | 256 | ||
257 | static void lcdtg_suspend(void) | 257 | void corgi_lcdtg_suspend(void) |
258 | { | 258 | { |
259 | /* 60Hz x 2 frame = 16.7msec x 2 = 33.4 msec */ | 259 | /* 60Hz x 2 frame = 16.7msec x 2 = 33.4 msec */ |
260 | mdelay(34); | 260 | mdelay(34); |
@@ -288,298 +288,3 @@ static void lcdtg_suspend(void) | |||
288 | lcd_inited = 0; | 288 | lcd_inited = 0; |
289 | } | 289 | } |
290 | 290 | ||
291 | |||
292 | /* | ||
293 | * Corgi w100 Frame Buffer Device | ||
294 | */ | ||
295 | #ifdef CONFIG_PXA_SHARP_C7xx | ||
296 | |||
297 | #include <video/w100fb.h> | ||
298 | |||
299 | static void w100_lcdtg_suspend(struct w100fb_par *par) | ||
300 | { | ||
301 | lcdtg_suspend(); | ||
302 | } | ||
303 | |||
304 | static void w100_lcdtg_init(struct w100fb_par *par) | ||
305 | { | ||
306 | lcdtg_hw_init(par->xres); | ||
307 | } | ||
308 | |||
309 | |||
310 | static struct w100_tg_info corgi_lcdtg_info = { | ||
311 | .change = w100_lcdtg_init, | ||
312 | .suspend = w100_lcdtg_suspend, | ||
313 | .resume = w100_lcdtg_init, | ||
314 | }; | ||
315 | |||
316 | static struct w100_mem_info corgi_fb_mem = { | ||
317 | .ext_cntl = 0x00040003, | ||
318 | .sdram_mode_reg = 0x00650021, | ||
319 | .ext_timing_cntl = 0x10002a4a, | ||
320 | .io_cntl = 0x7ff87012, | ||
321 | .size = 0x1fffff, | ||
322 | }; | ||
323 | |||
324 | static struct w100_gen_regs corgi_fb_regs = { | ||
325 | .lcd_format = 0x00000003, | ||
326 | .lcdd_cntl1 = 0x01CC0000, | ||
327 | .lcdd_cntl2 = 0x0003FFFF, | ||
328 | .genlcd_cntl1 = 0x00FFFF0D, | ||
329 | .genlcd_cntl2 = 0x003F3003, | ||
330 | .genlcd_cntl3 = 0x000102aa, | ||
331 | }; | ||
332 | |||
333 | static struct w100_gpio_regs corgi_fb_gpio = { | ||
334 | .init_data1 = 0x000000bf, | ||
335 | .init_data2 = 0x00000000, | ||
336 | .gpio_dir1 = 0x00000000, | ||
337 | .gpio_oe1 = 0x03c0feff, | ||
338 | .gpio_dir2 = 0x00000000, | ||
339 | .gpio_oe2 = 0x00000000, | ||
340 | }; | ||
341 | |||
342 | static struct w100_mode corgi_fb_modes[] = { | ||
343 | { | ||
344 | .xres = 480, | ||
345 | .yres = 640, | ||
346 | .left_margin = 0x56, | ||
347 | .right_margin = 0x55, | ||
348 | .upper_margin = 0x03, | ||
349 | .lower_margin = 0x00, | ||
350 | .crtc_ss = 0x82360056, | ||
351 | .crtc_ls = 0xA0280000, | ||
352 | .crtc_gs = 0x80280028, | ||
353 | .crtc_vpos_gs = 0x02830002, | ||
354 | .crtc_rev = 0x00400008, | ||
355 | .crtc_dclk = 0xA0000000, | ||
356 | .crtc_gclk = 0x8015010F, | ||
357 | .crtc_goe = 0x80100110, | ||
358 | .crtc_ps1_active = 0x41060010, | ||
359 | .pll_freq = 75, | ||
360 | .fast_pll_freq = 100, | ||
361 | .sysclk_src = CLK_SRC_PLL, | ||
362 | .sysclk_divider = 0, | ||
363 | .pixclk_src = CLK_SRC_PLL, | ||
364 | .pixclk_divider = 2, | ||
365 | .pixclk_divider_rotated = 6, | ||
366 | },{ | ||
367 | .xres = 240, | ||
368 | .yres = 320, | ||
369 | .left_margin = 0x27, | ||
370 | .right_margin = 0x2e, | ||
371 | .upper_margin = 0x01, | ||
372 | .lower_margin = 0x00, | ||
373 | .crtc_ss = 0x81170027, | ||
374 | .crtc_ls = 0xA0140000, | ||
375 | .crtc_gs = 0xC0140014, | ||
376 | .crtc_vpos_gs = 0x00010141, | ||
377 | .crtc_rev = 0x00400008, | ||
378 | .crtc_dclk = 0xA0000000, | ||
379 | .crtc_gclk = 0x8015010F, | ||
380 | .crtc_goe = 0x80100110, | ||
381 | .crtc_ps1_active = 0x41060010, | ||
382 | .pll_freq = 0, | ||
383 | .fast_pll_freq = 0, | ||
384 | .sysclk_src = CLK_SRC_XTAL, | ||
385 | .sysclk_divider = 0, | ||
386 | .pixclk_src = CLK_SRC_XTAL, | ||
387 | .pixclk_divider = 1, | ||
388 | .pixclk_divider_rotated = 1, | ||
389 | }, | ||
390 | |||
391 | }; | ||
392 | |||
393 | static struct w100fb_mach_info corgi_fb_info = { | ||
394 | .tg = &corgi_lcdtg_info, | ||
395 | .init_mode = INIT_MODE_ROTATED, | ||
396 | .mem = &corgi_fb_mem, | ||
397 | .regs = &corgi_fb_regs, | ||
398 | .modelist = &corgi_fb_modes[0], | ||
399 | .num_modes = 2, | ||
400 | .gpio = &corgi_fb_gpio, | ||
401 | .xtal_freq = 12500000, | ||
402 | .xtal_dbl = 0, | ||
403 | }; | ||
404 | |||
405 | static struct resource corgi_fb_resources[] = { | ||
406 | [0] = { | ||
407 | .start = 0x08000000, | ||
408 | .end = 0x08ffffff, | ||
409 | .flags = IORESOURCE_MEM, | ||
410 | }, | ||
411 | }; | ||
412 | |||
413 | struct platform_device corgifb_device = { | ||
414 | .name = "w100fb", | ||
415 | .id = -1, | ||
416 | .num_resources = ARRAY_SIZE(corgi_fb_resources), | ||
417 | .resource = corgi_fb_resources, | ||
418 | .dev = { | ||
419 | .platform_data = &corgi_fb_info, | ||
420 | .parent = &corgissp_device.dev, | ||
421 | }, | ||
422 | |||
423 | }; | ||
424 | #endif | ||
425 | |||
426 | |||
427 | /* | ||
428 | * Spitz PXA Frame Buffer Device | ||
429 | */ | ||
430 | #ifdef CONFIG_PXA_SHARP_Cxx00 | ||
431 | |||
432 | #include <asm/arch/pxafb.h> | ||
433 | |||
434 | void spitz_lcd_power(int on, struct fb_var_screeninfo *var) | ||
435 | { | ||
436 | if (on) | ||
437 | lcdtg_hw_init(var->xres); | ||
438 | else | ||
439 | lcdtg_suspend(); | ||
440 | } | ||
441 | |||
442 | #endif | ||
443 | |||
444 | |||
445 | /* | ||
446 | * Corgi/Spitz Touchscreen to LCD interface | ||
447 | */ | ||
448 | static unsigned long (*get_hsync_time)(struct device *dev); | ||
449 | |||
450 | static void inline sharpsl_wait_sync(int gpio) | ||
451 | { | ||
452 | while((GPLR(gpio) & GPIO_bit(gpio)) == 0); | ||
453 | while((GPLR(gpio) & GPIO_bit(gpio)) != 0); | ||
454 | } | ||
455 | |||
456 | #ifdef CONFIG_PXA_SHARP_C7xx | ||
457 | unsigned long corgi_get_hsync_len(void) | ||
458 | { | ||
459 | if (!get_hsync_time) | ||
460 | get_hsync_time = symbol_get(w100fb_get_hsynclen); | ||
461 | if (!get_hsync_time) | ||
462 | return 0; | ||
463 | |||
464 | return get_hsync_time(&corgifb_device.dev); | ||
465 | } | ||
466 | |||
467 | void corgi_put_hsync(void) | ||
468 | { | ||
469 | if (get_hsync_time) | ||
470 | symbol_put(w100fb_get_hsynclen); | ||
471 | get_hsync_time = NULL; | ||
472 | } | ||
473 | |||
474 | void corgi_wait_hsync(void) | ||
475 | { | ||
476 | sharpsl_wait_sync(CORGI_GPIO_HSYNC); | ||
477 | } | ||
478 | #endif | ||
479 | |||
480 | #ifdef CONFIG_PXA_SHARP_Cxx00 | ||
481 | static struct device *spitz_pxafb_dev; | ||
482 | |||
483 | static int is_pxafb_device(struct device * dev, void * data) | ||
484 | { | ||
485 | struct platform_device *pdev = container_of(dev, struct platform_device, dev); | ||
486 | |||
487 | return (strncmp(pdev->name, "pxa2xx-fb", 9) == 0); | ||
488 | } | ||
489 | |||
490 | unsigned long spitz_get_hsync_len(void) | ||
491 | { | ||
492 | #ifdef CONFIG_FB_PXA | ||
493 | if (!spitz_pxafb_dev) { | ||
494 | spitz_pxafb_dev = bus_find_device(&platform_bus_type, NULL, NULL, is_pxafb_device); | ||
495 | if (!spitz_pxafb_dev) | ||
496 | return 0; | ||
497 | } | ||
498 | if (!get_hsync_time) | ||
499 | get_hsync_time = symbol_get(pxafb_get_hsync_time); | ||
500 | if (!get_hsync_time) | ||
501 | #endif | ||
502 | return 0; | ||
503 | |||
504 | return pxafb_get_hsync_time(spitz_pxafb_dev); | ||
505 | } | ||
506 | |||
507 | void spitz_put_hsync(void) | ||
508 | { | ||
509 | put_device(spitz_pxafb_dev); | ||
510 | if (get_hsync_time) | ||
511 | symbol_put(pxafb_get_hsync_time); | ||
512 | spitz_pxafb_dev = NULL; | ||
513 | get_hsync_time = NULL; | ||
514 | } | ||
515 | |||
516 | void spitz_wait_hsync(void) | ||
517 | { | ||
518 | sharpsl_wait_sync(SPITZ_GPIO_HSYNC); | ||
519 | } | ||
520 | #endif | ||
521 | |||
522 | /* | ||
523 | * Corgi/Spitz Backlight Power | ||
524 | */ | ||
525 | #ifdef CONFIG_PXA_SHARP_C7xx | ||
526 | void corgi_bl_set_intensity(int intensity) | ||
527 | { | ||
528 | if (intensity > 0x10) | ||
529 | intensity += 0x10; | ||
530 | |||
531 | /* Bits 0-4 are accessed via the SSP interface */ | ||
532 | corgi_ssp_blduty_set(intensity & 0x1f); | ||
533 | |||
534 | /* Bit 5 is via SCOOP */ | ||
535 | if (intensity & 0x0020) | ||
536 | set_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_BACKLIGHT_CONT); | ||
537 | else | ||
538 | reset_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_BACKLIGHT_CONT); | ||
539 | } | ||
540 | #endif | ||
541 | |||
542 | |||
543 | #if defined(CONFIG_MACH_SPITZ) || defined(CONFIG_MACH_BORZOI) | ||
544 | void spitz_bl_set_intensity(int intensity) | ||
545 | { | ||
546 | if (intensity > 0x10) | ||
547 | intensity += 0x10; | ||
548 | |||
549 | /* Bits 0-4 are accessed via the SSP interface */ | ||
550 | corgi_ssp_blduty_set(intensity & 0x1f); | ||
551 | |||
552 | /* Bit 5 is via SCOOP */ | ||
553 | if (intensity & 0x0020) | ||
554 | reset_scoop_gpio(&spitzscoop2_device.dev, SPITZ_SCP2_BACKLIGHT_CONT); | ||
555 | else | ||
556 | set_scoop_gpio(&spitzscoop2_device.dev, SPITZ_SCP2_BACKLIGHT_CONT); | ||
557 | |||
558 | if (intensity) | ||
559 | set_scoop_gpio(&spitzscoop2_device.dev, SPITZ_SCP2_BACKLIGHT_ON); | ||
560 | else | ||
561 | reset_scoop_gpio(&spitzscoop2_device.dev, SPITZ_SCP2_BACKLIGHT_ON); | ||
562 | } | ||
563 | #endif | ||
564 | |||
565 | #ifdef CONFIG_MACH_AKITA | ||
566 | void akita_bl_set_intensity(int intensity) | ||
567 | { | ||
568 | if (intensity > 0x10) | ||
569 | intensity += 0x10; | ||
570 | |||
571 | /* Bits 0-4 are accessed via the SSP interface */ | ||
572 | corgi_ssp_blduty_set(intensity & 0x1f); | ||
573 | |||
574 | /* Bit 5 is via IO-Expander */ | ||
575 | if (intensity & 0x0020) | ||
576 | akita_reset_ioexp(&akitaioexp_device.dev, AKITA_IOEXP_BACKLIGHT_CONT); | ||
577 | else | ||
578 | akita_set_ioexp(&akitaioexp_device.dev, AKITA_IOEXP_BACKLIGHT_CONT); | ||
579 | |||
580 | if (intensity) | ||
581 | akita_set_ioexp(&akitaioexp_device.dev, AKITA_IOEXP_BACKLIGHT_ON); | ||
582 | else | ||
583 | akita_reset_ioexp(&akitaioexp_device.dev, AKITA_IOEXP_BACKLIGHT_ON); | ||
584 | } | ||
585 | #endif | ||