evklcd10x.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /*
  2. * Board-specific setup code for the ATEVKLCD10X addon board to the ATNGW100
  3. * Network Gateway
  4. *
  5. * Copyright (C) 2008 Atmel Corporation
  6. *
  7. * This program is free software; you can redistribute it and/or modify it
  8. * under the terms of the GNU General Public License version 2 as published by
  9. * the Free Software Foundation.
  10. */
  11. #include <linux/init.h>
  12. #include <linux/linkage.h>
  13. #include <linux/gpio.h>
  14. #include <linux/fb.h>
  15. #include <linux/platform_device.h>
  16. #include <video/atmel_lcdc.h>
  17. #include <asm/setup.h>
  18. #include <mach/at32ap700x.h>
  19. #include <mach/portmux.h>
  20. #include <mach/board.h>
  21. static struct ac97c_platform_data __initdata ac97c0_data = {
  22. .dma_rx_periph_id = 3,
  23. .dma_tx_periph_id = 4,
  24. .dma_controller_id = 0,
  25. .reset_pin = GPIO_PIN_PB(19),
  26. };
  27. #ifdef CONFIG_BOARD_ATNGW100_EVKLCD10X_VGA
  28. static struct fb_videomode __initdata tcg057vglad_modes[] = {
  29. {
  30. .name = "640x480 @ 50",
  31. .refresh = 50,
  32. .xres = 640, .yres = 480,
  33. .pixclock = KHZ2PICOS(25180),
  34. .left_margin = 64, .right_margin = 96,
  35. .upper_margin = 34, .lower_margin = 11,
  36. .hsync_len = 64, .vsync_len = 15,
  37. .sync = 0,
  38. .vmode = FB_VMODE_NONINTERLACED,
  39. },
  40. };
  41. static struct fb_monspecs __initdata atevklcd10x_default_monspecs = {
  42. .manufacturer = "KYO",
  43. .monitor = "TCG057VGLAD",
  44. .modedb = tcg057vglad_modes,
  45. .modedb_len = ARRAY_SIZE(tcg057vglad_modes),
  46. .hfmin = 19948,
  47. .hfmax = 31478,
  48. .vfmin = 50,
  49. .vfmax = 67,
  50. .dclkmax = 28330000,
  51. };
  52. static struct atmel_lcdfb_info __initdata atevklcd10x_lcdc_data = {
  53. .default_bpp = 16,
  54. .default_dmacon = ATMEL_LCDC_DMAEN | ATMEL_LCDC_DMA2DEN,
  55. .default_lcdcon2 = (ATMEL_LCDC_DISTYPE_TFT
  56. | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE
  57. | ATMEL_LCDC_MEMOR_BIG),
  58. .default_monspecs = &atevklcd10x_default_monspecs,
  59. .guard_time = 2,
  60. };
  61. #elif CONFIG_BOARD_ATNGW100_EVKLCD10X_QVGA
  62. static struct fb_videomode __initdata tcg057qvlad_modes[] = {
  63. {
  64. .name = "320x240 @ 50",
  65. .refresh = 50,
  66. .xres = 320, .yres = 240,
  67. .pixclock = KHZ2PICOS(6300),
  68. .left_margin = 34, .right_margin = 46,
  69. .upper_margin = 7, .lower_margin = 15,
  70. .hsync_len = 64, .vsync_len = 12,
  71. .sync = 0,
  72. .vmode = FB_VMODE_NONINTERLACED,
  73. },
  74. };
  75. static struct fb_monspecs __initdata atevklcd10x_default_monspecs = {
  76. .manufacturer = "KYO",
  77. .monitor = "TCG057QVLAD",
  78. .modedb = tcg057qvlad_modes,
  79. .modedb_len = ARRAY_SIZE(tcg057qvlad_modes),
  80. .hfmin = 19948,
  81. .hfmax = 31478,
  82. .vfmin = 50,
  83. .vfmax = 67,
  84. .dclkmax = 7000000,
  85. };
  86. static struct atmel_lcdfb_info __initdata atevklcd10x_lcdc_data = {
  87. .default_bpp = 16,
  88. .default_dmacon = ATMEL_LCDC_DMAEN | ATMEL_LCDC_DMA2DEN,
  89. .default_lcdcon2 = (ATMEL_LCDC_DISTYPE_TFT
  90. | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE
  91. | ATMEL_LCDC_MEMOR_BIG),
  92. .default_monspecs = &atevklcd10x_default_monspecs,
  93. .guard_time = 2,
  94. };
  95. #elif CONFIG_BOARD_ATNGW100_EVKLCD10X_POW_QVGA
  96. static struct fb_videomode __initdata ph320240t_modes[] = {
  97. {
  98. .name = "320x240 @ 60",
  99. .refresh = 60,
  100. .xres = 320, .yres = 240,
  101. .pixclock = KHZ2PICOS(6300),
  102. .left_margin = 38, .right_margin = 20,
  103. .upper_margin = 15, .lower_margin = 5,
  104. .hsync_len = 30, .vsync_len = 3,
  105. .sync = 0,
  106. .vmode = FB_VMODE_NONINTERLACED,
  107. },
  108. };
  109. static struct fb_monspecs __initdata atevklcd10x_default_monspecs = {
  110. .manufacturer = "POW",
  111. .monitor = "PH320240T",
  112. .modedb = ph320240t_modes,
  113. .modedb_len = ARRAY_SIZE(ph320240t_modes),
  114. .hfmin = 14400,
  115. .hfmax = 21600,
  116. .vfmin = 50,
  117. .vfmax = 90,
  118. .dclkmax = 6400000,
  119. };
  120. static struct atmel_lcdfb_info __initdata atevklcd10x_lcdc_data = {
  121. .default_bpp = 16,
  122. .default_dmacon = ATMEL_LCDC_DMAEN | ATMEL_LCDC_DMA2DEN,
  123. .default_lcdcon2 = (ATMEL_LCDC_DISTYPE_TFT
  124. | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE
  125. | ATMEL_LCDC_MEMOR_BIG),
  126. .default_monspecs = &atevklcd10x_default_monspecs,
  127. .guard_time = 2,
  128. };
  129. #endif
  130. static void atevklcd10x_lcdc_power_control(int on)
  131. {
  132. gpio_set_value(GPIO_PIN_PB(15), on);
  133. }
  134. static int __init atevklcd10x_init(void)
  135. {
  136. /* PB15 is connected to the enable line on the boost regulator
  137. * controlling the backlight for the LCD panel.
  138. */
  139. at32_select_gpio(GPIO_PIN_PB(15), AT32_GPIOF_OUTPUT);
  140. gpio_request(GPIO_PIN_PB(15), "backlight");
  141. gpio_direction_output(GPIO_PIN_PB(15), 0);
  142. atevklcd10x_lcdc_data.atmel_lcdfb_power_control =
  143. atevklcd10x_lcdc_power_control;
  144. at32_add_device_lcdc(0, &atevklcd10x_lcdc_data,
  145. fbmem_start, fbmem_size,
  146. ATMEL_LCDC_ALT_18BIT | ATMEL_LCDC_PE_DVAL);
  147. at32_add_device_ac97c(0, &ac97c0_data);
  148. return 0;
  149. }
  150. postcore_initcall(atevklcd10x_init);