viamode.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. /*
  2. * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
  3. * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public
  6. * License as published by the Free Software Foundation;
  7. * either version 2, or (at your option) any later version.
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even
  10. * the implied warranty of MERCHANTABILITY or FITNESS FOR
  11. * A PARTICULAR PURPOSE.See the GNU General Public License
  12. * for more details.
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program; if not, write to the Free Software
  15. * Foundation, Inc.,
  16. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  17. */
  18. #include <linux/via-core.h>
  19. #include "global.h"
  20. struct io_reg CN400_ModeXregs[] = { {VIASR, SR10, 0xFF, 0x01},
  21. {VIASR, SR15, 0x02, 0x02},
  22. {VIASR, SR16, 0xBF, 0x08},
  23. {VIASR, SR17, 0xFF, 0x1F},
  24. {VIASR, SR18, 0xFF, 0x4E},
  25. {VIASR, SR1A, 0xFB, 0x08},
  26. {VIASR, SR1E, 0x0F, 0x01},
  27. {VIASR, SR2A, 0xFF, 0x00},
  28. {VIACR, CR32, 0xFF, 0x00},
  29. {VIACR, CR33, 0xFF, 0x00},
  30. {VIACR, CR35, 0xFF, 0x00},
  31. {VIACR, CR36, 0x08, 0x00},
  32. {VIACR, CR69, 0xFF, 0x00},
  33. {VIACR, CR6A, 0xFF, 0x40},
  34. {VIACR, CR6B, 0xFF, 0x00},
  35. {VIACR, CR88, 0xFF, 0x40}, /* LCD Panel Type */
  36. {VIACR, CR89, 0xFF, 0x00}, /* LCD Timing Control 0 */
  37. {VIACR, CR8A, 0xFF, 0x88}, /* LCD Timing Control 1 */
  38. {VIACR, CR8B, 0xFF, 0x69}, /* LCD Power Sequence Control 0 */
  39. {VIACR, CR8C, 0xFF, 0x57}, /* LCD Power Sequence Control 1 */
  40. {VIACR, CR8D, 0xFF, 0x00}, /* LCD Power Sequence Control 2 */
  41. {VIACR, CR8E, 0xFF, 0x7B}, /* LCD Power Sequence Control 3 */
  42. {VIACR, CR8F, 0xFF, 0x03}, /* LCD Power Sequence Control 4 */
  43. {VIACR, CR90, 0xFF, 0x30}, /* LCD Power Sequence Control 5 */
  44. {VIACR, CR91, 0xFF, 0xA0}, /* 24/12 bit LVDS Data off */
  45. {VIACR, CR96, 0xFF, 0x00},
  46. {VIACR, CR97, 0xFF, 0x00},
  47. {VIACR, CR99, 0xFF, 0x00},
  48. {VIACR, CR9B, 0xFF, 0x00}
  49. };
  50. /* Video Mode Table for VT3314 chipset*/
  51. /* Common Setting for Video Mode */
  52. struct io_reg CN700_ModeXregs[] = { {VIASR, SR10, 0xFF, 0x01},
  53. {VIASR, SR15, 0x02, 0x02},
  54. {VIASR, SR16, 0xBF, 0x08},
  55. {VIASR, SR17, 0xFF, 0x1F},
  56. {VIASR, SR18, 0xFF, 0x4E},
  57. {VIASR, SR1A, 0xFB, 0x82},
  58. {VIASR, SR1B, 0xFF, 0xF0},
  59. {VIASR, SR1F, 0xFF, 0x00},
  60. {VIASR, SR1E, 0xFF, 0x01},
  61. {VIASR, SR22, 0xFF, 0x1F},
  62. {VIASR, SR2A, 0x0F, 0x00},
  63. {VIASR, SR2E, 0xFF, 0xFF},
  64. {VIASR, SR3F, 0xFF, 0xFF},
  65. {VIASR, SR40, 0xF7, 0x00},
  66. {VIASR, CR30, 0xFF, 0x04},
  67. {VIACR, CR32, 0xFF, 0x00},
  68. {VIACR, CR33, 0x7F, 0x00},
  69. {VIACR, CR35, 0xFF, 0x00},
  70. {VIACR, CR36, 0xFF, 0x31},
  71. {VIACR, CR41, 0xFF, 0x80},
  72. {VIACR, CR42, 0xFF, 0x00},
  73. {VIACR, CR55, 0x80, 0x00},
  74. {VIACR, CR5D, 0x80, 0x00}, /*Horizontal Retrace Start bit[11] should be 0*/
  75. {VIACR, CR68, 0xFF, 0x67}, /* Default FIFO For IGA2 */
  76. {VIACR, CR69, 0xFF, 0x00},
  77. {VIACR, CR6A, 0xFD, 0x40},
  78. {VIACR, CR6B, 0xFF, 0x00},
  79. {VIACR, CR77, 0xFF, 0x00}, /* LCD scaling Factor */
  80. {VIACR, CR78, 0xFF, 0x00}, /* LCD scaling Factor */
  81. {VIACR, CR79, 0xFF, 0x00}, /* LCD scaling Factor */
  82. {VIACR, CR9F, 0x03, 0x00}, /* LCD scaling Factor */
  83. {VIACR, CR88, 0xFF, 0x40}, /* LCD Panel Type */
  84. {VIACR, CR89, 0xFF, 0x00}, /* LCD Timing Control 0 */
  85. {VIACR, CR8A, 0xFF, 0x88}, /* LCD Timing Control 1 */
  86. {VIACR, CR8B, 0xFF, 0x5D}, /* LCD Power Sequence Control 0 */
  87. {VIACR, CR8C, 0xFF, 0x2B}, /* LCD Power Sequence Control 1 */
  88. {VIACR, CR8D, 0xFF, 0x6F}, /* LCD Power Sequence Control 2 */
  89. {VIACR, CR8E, 0xFF, 0x2B}, /* LCD Power Sequence Control 3 */
  90. {VIACR, CR8F, 0xFF, 0x01}, /* LCD Power Sequence Control 4 */
  91. {VIACR, CR90, 0xFF, 0x01}, /* LCD Power Sequence Control 5 */
  92. {VIACR, CR91, 0xFF, 0xA0}, /* 24/12 bit LVDS Data off */
  93. {VIACR, CR96, 0xFF, 0x00},
  94. {VIACR, CR97, 0xFF, 0x00},
  95. {VIACR, CR99, 0xFF, 0x00},
  96. {VIACR, CR9B, 0xFF, 0x00},
  97. {VIACR, CR9D, 0xFF, 0x80},
  98. {VIACR, CR9E, 0xFF, 0x80}
  99. };
  100. struct io_reg KM400_ModeXregs[] = {
  101. {VIASR, SR10, 0xFF, 0x01}, /* Unlock Register */
  102. {VIASR, SR16, 0xFF, 0x08}, /* Display FIFO threshold Control */
  103. {VIASR, SR17, 0xFF, 0x1F}, /* Display FIFO Control */
  104. {VIASR, SR18, 0xFF, 0x4E}, /* GFX PREQ threshold */
  105. {VIASR, SR1A, 0xFF, 0x0a}, /* GFX PREQ threshold */
  106. {VIASR, SR1F, 0xFF, 0x00}, /* Memory Control 0 */
  107. {VIASR, SR1B, 0xFF, 0xF0}, /* Power Management Control 0 */
  108. {VIASR, SR1E, 0xFF, 0x01}, /* Power Management Control */
  109. {VIASR, SR20, 0xFF, 0x00}, /* Sequencer Arbiter Control 0 */
  110. {VIASR, SR21, 0xFF, 0x00}, /* Sequencer Arbiter Control 1 */
  111. {VIASR, SR22, 0xFF, 0x1F}, /* Display Arbiter Control 1 */
  112. {VIASR, SR2A, 0xFF, 0x00}, /* Power Management Control 5 */
  113. {VIASR, SR2D, 0xFF, 0xFF}, /* Power Management Control 1 */
  114. {VIASR, SR2E, 0xFF, 0xFF}, /* Power Management Control 2 */
  115. {VIACR, CR33, 0xFF, 0x00},
  116. {VIACR, CR55, 0x80, 0x00},
  117. {VIACR, CR5D, 0x80, 0x00},
  118. {VIACR, CR36, 0xFF, 0x01}, /* Power Mangement 3 */
  119. {VIACR, CR68, 0xFF, 0x67}, /* Default FIFO For IGA2 */
  120. {VIACR, CR6A, 0x20, 0x20}, /* Extended FIFO On */
  121. {VIACR, CR88, 0xFF, 0x40}, /* LCD Panel Type */
  122. {VIACR, CR89, 0xFF, 0x00}, /* LCD Timing Control 0 */
  123. {VIACR, CR8A, 0xFF, 0x88}, /* LCD Timing Control 1 */
  124. {VIACR, CR8B, 0xFF, 0x2D}, /* LCD Power Sequence Control 0 */
  125. {VIACR, CR8C, 0xFF, 0x2D}, /* LCD Power Sequence Control 1 */
  126. {VIACR, CR8D, 0xFF, 0xC8}, /* LCD Power Sequence Control 2 */
  127. {VIACR, CR8E, 0xFF, 0x36}, /* LCD Power Sequence Control 3 */
  128. {VIACR, CR8F, 0xFF, 0x00}, /* LCD Power Sequence Control 4 */
  129. {VIACR, CR90, 0xFF, 0x10}, /* LCD Power Sequence Control 5 */
  130. {VIACR, CR91, 0xFF, 0xA0}, /* 24/12 bit LVDS Data off */
  131. {VIACR, CR96, 0xFF, 0x03}, /* DVP0 ; DVP0 Clock Skew */
  132. {VIACR, CR97, 0xFF, 0x03}, /* DFP high ; DFPH Clock Skew */
  133. {VIACR, CR99, 0xFF, 0x03}, /* DFP low ; DFPL Clock Skew*/
  134. {VIACR, CR9B, 0xFF, 0x07} /* DVI on DVP1 ; DVP1 Clock Skew*/
  135. };
  136. /* For VT3324: Common Setting for Video Mode */
  137. struct io_reg CX700_ModeXregs[] = { {VIASR, SR10, 0xFF, 0x01},
  138. {VIASR, SR15, 0x02, 0x02},
  139. {VIASR, SR16, 0xBF, 0x08},
  140. {VIASR, SR17, 0xFF, 0x1F},
  141. {VIASR, SR18, 0xFF, 0x4E},
  142. {VIASR, SR1A, 0xFB, 0x08},
  143. {VIASR, SR1B, 0xFF, 0xF0},
  144. {VIASR, SR1E, 0xFF, 0x01},
  145. {VIASR, SR2A, 0xFF, 0x00},
  146. {VIASR, SR2D, 0xC0, 0xC0}, /* delayed E3_ECK */
  147. {VIACR, CR32, 0xFF, 0x00},
  148. {VIACR, CR33, 0xFF, 0x00},
  149. {VIACR, CR35, 0xFF, 0x00},
  150. {VIACR, CR36, 0x08, 0x00},
  151. {VIACR, CR47, 0xC8, 0x00}, /* Clear VCK Plus. */
  152. {VIACR, CR69, 0xFF, 0x00},
  153. {VIACR, CR6A, 0xFF, 0x40},
  154. {VIACR, CR6B, 0xFF, 0x00},
  155. {VIACR, CR88, 0xFF, 0x40}, /* LCD Panel Type */
  156. {VIACR, CR89, 0xFF, 0x00}, /* LCD Timing Control 0 */
  157. {VIACR, CR8A, 0xFF, 0x88}, /* LCD Timing Control 1 */
  158. {VIACR, CRD4, 0xFF, 0x81}, /* Second power sequence control */
  159. {VIACR, CR8B, 0xFF, 0x5D}, /* LCD Power Sequence Control 0 */
  160. {VIACR, CR8C, 0xFF, 0x2B}, /* LCD Power Sequence Control 1 */
  161. {VIACR, CR8D, 0xFF, 0x6F}, /* LCD Power Sequence Control 2 */
  162. {VIACR, CR8E, 0xFF, 0x2B}, /* LCD Power Sequence Control 3 */
  163. {VIACR, CR8F, 0xFF, 0x01}, /* LCD Power Sequence Control 4 */
  164. {VIACR, CR90, 0xFF, 0x01}, /* LCD Power Sequence Control 5 */
  165. {VIACR, CR91, 0xFF, 0x80}, /* 24/12 bit LVDS Data off */
  166. {VIACR, CR96, 0xFF, 0x00},
  167. {VIACR, CR97, 0xFF, 0x00},
  168. {VIACR, CR99, 0xFF, 0x00},
  169. {VIACR, CR9B, 0xFF, 0x00}
  170. };
  171. struct io_reg VX855_ModeXregs[] = {
  172. {VIASR, SR10, 0xFF, 0x01},
  173. {VIASR, SR15, 0x02, 0x02},
  174. {VIASR, SR16, 0xBF, 0x08},
  175. {VIASR, SR17, 0xFF, 0x1F},
  176. {VIASR, SR18, 0xFF, 0x4E},
  177. {VIASR, SR1A, 0xFB, 0x08},
  178. {VIASR, SR1B, 0xFF, 0xF0},
  179. {VIASR, SR1E, 0x07, 0x01},
  180. {VIASR, SR2A, 0xF0, 0x00},
  181. {VIASR, SR58, 0xFF, 0x00},
  182. {VIASR, SR59, 0xFF, 0x00},
  183. {VIASR, SR2D, 0xC0, 0xC0}, /* delayed E3_ECK */
  184. {VIACR, CR32, 0xFF, 0x00},
  185. {VIACR, CR33, 0x7F, 0x00},
  186. {VIACR, CR35, 0xFF, 0x00},
  187. {VIACR, CR36, 0x08, 0x00},
  188. {VIACR, CR69, 0xFF, 0x00},
  189. {VIACR, CR6A, 0xFD, 0x60},
  190. {VIACR, CR6B, 0xFF, 0x00},
  191. {VIACR, CR88, 0xFF, 0x40}, /* LCD Panel Type */
  192. {VIACR, CR89, 0xFF, 0x00}, /* LCD Timing Control 0 */
  193. {VIACR, CR8A, 0xFF, 0x88}, /* LCD Timing Control 1 */
  194. {VIACR, CRD4, 0xFF, 0x81}, /* Second power sequence control */
  195. {VIACR, CR91, 0xFF, 0x80}, /* 24/12 bit LVDS Data off */
  196. {VIACR, CR96, 0xFF, 0x00},
  197. {VIACR, CR97, 0xFF, 0x00},
  198. {VIACR, CR99, 0xFF, 0x00},
  199. {VIACR, CR9B, 0xFF, 0x00},
  200. {VIACR, CRD2, 0xFF, 0xFF} /* TMDS/LVDS control register. */
  201. };
  202. /* Video Mode Table */
  203. /* Common Setting for Video Mode */
  204. struct io_reg CLE266_ModeXregs[] = { {VIASR, SR1E, 0xF0, 0x00},
  205. {VIASR, SR2A, 0x0F, 0x00},
  206. {VIASR, SR15, 0x02, 0x02},
  207. {VIASR, SR16, 0xBF, 0x08},
  208. {VIASR, SR17, 0xFF, 0x1F},
  209. {VIASR, SR18, 0xFF, 0x4E},
  210. {VIASR, SR1A, 0xFB, 0x08},
  211. {VIACR, CR32, 0xFF, 0x00},
  212. {VIACR, CR35, 0xFF, 0x00},
  213. {VIACR, CR36, 0x08, 0x00},
  214. {VIACR, CR6A, 0xFF, 0x80},
  215. {VIACR, CR6A, 0xFF, 0xC0},
  216. {VIACR, CR55, 0x80, 0x00},
  217. {VIACR, CR5D, 0x80, 0x00},
  218. {VIAGR, GR20, 0xFF, 0x00},
  219. {VIAGR, GR21, 0xFF, 0x00},
  220. {VIAGR, GR22, 0xFF, 0x00},
  221. };
  222. /* Mode:1024X768 */
  223. struct io_reg PM1024x768[] = { {VIASR, 0x16, 0xBF, 0x0C},
  224. {VIASR, 0x18, 0xFF, 0x4C}
  225. };
  226. struct patch_table res_patch_table[] = {
  227. {ARRAY_SIZE(PM1024x768), PM1024x768}
  228. };
  229. /* struct VPITTable {
  230. unsigned char Misc;
  231. unsigned char SR[StdSR];
  232. unsigned char CR[StdCR];
  233. unsigned char GR[StdGR];
  234. unsigned char AR[StdAR];
  235. };*/
  236. struct VPITTable VPIT = {
  237. /* Msic */
  238. 0xC7,
  239. /* Sequencer */
  240. {0x01, 0x0F, 0x00, 0x0E},
  241. /* Graphic Controller */
  242. {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
  243. /* Attribute Controller */
  244. {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
  245. 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
  246. 0x01, 0x00, 0x0F, 0x00}
  247. };
  248. /********************/
  249. /* Mode Table */
  250. /********************/
  251. static const struct fb_videomode viafb_modes[] = {
  252. {NULL, 60, 480, 640, 40285, 72, 24, 19, 1, 48, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  253. {NULL, 60, 640, 480, 39682, 48, 16, 33, 10, 96, 2, 0, 0, 0},
  254. {NULL, 75, 640, 480, 31746, 120, 16, 16, 1, 64, 3, 0, 0, 0},
  255. {NULL, 85, 640, 480, 27780, 80, 56, 25, 1, 56, 3, 0, 0, 0},
  256. {NULL, 100, 640, 480, 23167, 104, 40, 25, 1, 64, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  257. {NULL, 120, 640, 480, 19081, 104, 40, 31, 1, 64, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  258. {NULL, 60, 720, 480, 37426, 88, 16, 13, 1, 72, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  259. {NULL, 60, 720, 576, 30611, 96, 24, 17, 1, 72, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  260. {NULL, 60, 800, 600, 25131, 88, 40, 23, 1, 128, 4, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
  261. {NULL, 75, 800, 600, 20202, 160, 16, 21, 1, 80, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
  262. {NULL, 85, 800, 600, 17790, 152, 32, 27, 1, 64, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
  263. {NULL, 100, 800, 600, 14667, 136, 48, 32, 1, 88, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  264. {NULL, 120, 800, 600, 11911, 144, 56, 39, 1, 88, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  265. {NULL, 60, 800, 480, 33602, 96, 24, 10, 3, 72, 7, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  266. {NULL, 60, 848, 480, 31565, 104, 24, 12, 3, 80, 5, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  267. {NULL, 60, 856, 480, 31517, 104, 16, 13, 1, 88, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  268. {NULL, 60, 1024, 512, 24218, 136, 32, 15, 1, 104, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  269. {NULL, 60, 1024, 600, 20423, 144, 40, 18, 1, 104, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  270. {NULL, 60, 1024, 768, 15385, 160, 24, 29, 3, 136, 6, 0, 0, 0},
  271. {NULL, 75, 1024, 768, 12703, 176, 16, 28, 1, 96, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
  272. {NULL, 85, 1024, 768, 10581, 208, 48, 36, 1, 96, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
  273. {NULL, 100, 1024, 768, 8825, 184, 72, 42, 1, 112, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  274. {NULL, 75, 1152, 864, 9259, 256, 64, 32, 1, 128, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
  275. {NULL, 60, 1280, 768, 12478, 200, 64, 23, 1, 136, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  276. {NULL, 50, 1280, 768, 15342, 184, 56, 19, 1, 128, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  277. {NULL, 60, 960, 600, 21964, 128, 32, 15, 3, 96, 6, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  278. {NULL, 60, 1000, 600, 20803, 144, 40, 18, 1, 104, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  279. {NULL, 60, 1024, 576, 21278, 144, 40, 17, 1, 104, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  280. {NULL, 60, 1088, 612, 18825, 152, 48, 16, 3, 104, 5, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  281. {NULL, 60, 1152, 720, 14974, 168, 56, 19, 3, 112, 6, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  282. {NULL, 60, 1200, 720, 14248, 184, 56, 22, 1, 128, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  283. {NULL, 49, 1200, 900, 17703, 21, 11, 1, 1, 32, 10, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
  284. {NULL, 60, 1280, 600, 16259, 184, 56, 18, 1, 128, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  285. {NULL, 60, 1280, 800, 11938, 200, 72, 22, 3, 128, 6, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  286. {NULL, 60, 1280, 960, 9259, 312, 96, 36, 1, 112, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
  287. {NULL, 60, 1280, 1024, 9262, 248, 48, 38, 1, 112, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
  288. {NULL, 75, 1280, 1024, 7409, 248, 16, 38, 1, 144, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
  289. {NULL, 85, 1280, 1024, 6351, 224, 64, 44, 1, 160, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
  290. {NULL, 60, 1360, 768, 11759, 208, 72, 22, 3, 136, 5, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
  291. {NULL, 60, 1368, 768, 11646, 216, 72, 23, 1, 144, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  292. {NULL, 50, 1368, 768, 14301, 200, 56, 19, 1, 144, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  293. {NULL, 60, 1368, 768, 11646, 216, 72, 23, 1, 144, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  294. {NULL, 60, 1440, 900, 9372, 232, 80, 25, 3, 152, 6, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  295. {NULL, 75, 1440, 900, 7311, 248, 96, 33, 3, 152, 6, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  296. {NULL, 60, 1440, 1040, 7993, 248, 96, 33, 1, 152, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  297. {NULL, 60, 1600, 900, 8449, 256, 88, 26, 3, 168, 5, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  298. {NULL, 60, 1600, 1024, 7333, 272, 104, 32, 1, 168, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  299. {NULL, 60, 1600, 1200, 6172, 304, 64, 46, 1, 192, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
  300. {NULL, 75, 1600, 1200, 4938, 304, 64, 46, 1, 192, 3, FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 0, 0},
  301. {NULL, 60, 1680, 1050, 6832, 280, 104, 30, 3, 176, 6, 0, 0, 0},
  302. {NULL, 75, 1680, 1050, 5339, 296, 120, 40, 3, 176, 6, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  303. {NULL, 60, 1792, 1344, 4883, 328, 128, 46, 1, 200, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  304. {NULL, 60, 1856, 1392, 4581, 352, 96, 43, 1, 224, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  305. {NULL, 60, 1920, 1440, 4273, 344, 128, 56, 1, 208, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  306. {NULL, 75, 1920, 1440, 3367, 352, 144, 56, 1, 224, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  307. {NULL, 60, 2048, 1536, 3738, 376, 152, 49, 3, 224, 4, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  308. {NULL, 60, 1280, 720, 13484, 216, 112, 20, 5, 40, 5, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  309. {NULL, 50, 1280, 720, 16538, 176, 48, 17, 1, 128, 3, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  310. {NULL, 60, 1920, 1080, 5776, 328, 128, 32, 3, 200, 5, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  311. {NULL, 60, 1920, 1200, 5164, 336, 136, 36, 3, 200, 6, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  312. {NULL, 60, 1400, 1050, 8210, 232, 88, 32, 3, 144, 4, FB_SYNC_VERT_HIGH_ACT, 0, 0},
  313. {NULL, 75, 1400, 1050, 6398, 248, 104, 42, 3, 144, 4, FB_SYNC_VERT_HIGH_ACT, 0, 0} };
  314. static const struct fb_videomode viafb_rb_modes[] = {
  315. {NULL, 60, 1360, 768, 13879, 80, 48, 14, 3, 32, 5, FB_SYNC_HOR_HIGH_ACT, 0, 0},
  316. {NULL, 60, 1440, 900, 11249, 80, 48, 17, 3, 32, 6, FB_SYNC_HOR_HIGH_ACT, 0, 0},
  317. {NULL, 60, 1400, 1050, 9892, 80, 48, 23, 3, 32, 4, FB_SYNC_HOR_HIGH_ACT, 0, 0},
  318. {NULL, 60, 1600, 900, 10226, 80, 48, 18, 3, 32, 5, FB_SYNC_HOR_HIGH_ACT, 0, 0},
  319. {NULL, 60, 1680, 1050, 8387, 80, 48, 21, 3, 32, 6, FB_SYNC_HOR_HIGH_ACT, 0, 0},
  320. {NULL, 60, 1920, 1080, 7212, 80, 48, 23, 3, 32, 5, FB_SYNC_HOR_HIGH_ACT, 0, 0},
  321. {NULL, 60, 1920, 1200, 6488, 80, 48, 26, 3, 32, 6, FB_SYNC_HOR_HIGH_ACT, 0, 0} };
  322. int NUM_TOTAL_CN400_ModeXregs = ARRAY_SIZE(CN400_ModeXregs);
  323. int NUM_TOTAL_CN700_ModeXregs = ARRAY_SIZE(CN700_ModeXregs);
  324. int NUM_TOTAL_KM400_ModeXregs = ARRAY_SIZE(KM400_ModeXregs);
  325. int NUM_TOTAL_CX700_ModeXregs = ARRAY_SIZE(CX700_ModeXregs);
  326. int NUM_TOTAL_VX855_ModeXregs = ARRAY_SIZE(VX855_ModeXregs);
  327. int NUM_TOTAL_CLE266_ModeXregs = ARRAY_SIZE(CLE266_ModeXregs);
  328. int NUM_TOTAL_PATCH_MODE = ARRAY_SIZE(res_patch_table);
  329. static const struct fb_videomode *get_best_mode(
  330. const struct fb_videomode *modes, int n,
  331. int hres, int vres, int refresh)
  332. {
  333. const struct fb_videomode *best = NULL;
  334. int i;
  335. for (i = 0; i < n; i++) {
  336. if (modes[i].xres != hres || modes[i].yres != vres)
  337. continue;
  338. if (!best || abs(modes[i].refresh - refresh) <
  339. abs(best->refresh - refresh))
  340. best = &modes[i];
  341. }
  342. return best;
  343. }
  344. const struct fb_videomode *viafb_get_best_mode(int hres, int vres, int refresh)
  345. {
  346. return get_best_mode(viafb_modes, ARRAY_SIZE(viafb_modes),
  347. hres, vres, refresh);
  348. }
  349. const struct fb_videomode *viafb_get_best_rb_mode(int hres, int vres,
  350. int refresh)
  351. {
  352. return get_best_mode(viafb_rb_modes, ARRAY_SIZE(viafb_rb_modes),
  353. hres, vres, refresh);
  354. }