rfbi.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595
  1. /*
  2. * OMAP2 Remote Frame Buffer Interface support
  3. *
  4. * Copyright (C) 2005 Nokia Corporation
  5. * Author: Juha Yrjölä <juha.yrjola@nokia.com>
  6. * Imre Deak <imre.deak@nokia.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify it
  9. * under the terms of the GNU General Public License as published by the
  10. * Free Software Foundation; either version 2 of the License, or (at your
  11. * option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful, but
  14. * WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. * General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License along
  19. * with this program; if not, write to the Free Software Foundation, Inc.,
  20. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  21. */
  22. #include <linux/module.h>
  23. #include <linux/delay.h>
  24. #include <linux/i2c.h>
  25. #include <linux/err.h>
  26. #include <linux/interrupt.h>
  27. #include <linux/clk.h>
  28. #include <linux/io.h>
  29. #include <mach/omapfb.h>
  30. #include "dispc.h"
  31. /* To work around an RFBI transfer rate limitation */
  32. #define OMAP_RFBI_RATE_LIMIT 1
  33. #define RFBI_BASE 0x48050800
  34. #define RFBI_REVISION 0x0000
  35. #define RFBI_SYSCONFIG 0x0010
  36. #define RFBI_SYSSTATUS 0x0014
  37. #define RFBI_CONTROL 0x0040
  38. #define RFBI_PIXEL_CNT 0x0044
  39. #define RFBI_LINE_NUMBER 0x0048
  40. #define RFBI_CMD 0x004c
  41. #define RFBI_PARAM 0x0050
  42. #define RFBI_DATA 0x0054
  43. #define RFBI_READ 0x0058
  44. #define RFBI_STATUS 0x005c
  45. #define RFBI_CONFIG0 0x0060
  46. #define RFBI_ONOFF_TIME0 0x0064
  47. #define RFBI_CYCLE_TIME0 0x0068
  48. #define RFBI_DATA_CYCLE1_0 0x006c
  49. #define RFBI_DATA_CYCLE2_0 0x0070
  50. #define RFBI_DATA_CYCLE3_0 0x0074
  51. #define RFBI_VSYNC_WIDTH 0x0090
  52. #define RFBI_HSYNC_WIDTH 0x0094
  53. #define DISPC_BASE 0x48050400
  54. #define DISPC_CONTROL 0x0040
  55. static struct {
  56. void __iomem *base;
  57. void (*lcdc_callback)(void *data);
  58. void *lcdc_callback_data;
  59. unsigned long l4_khz;
  60. int bits_per_cycle;
  61. struct omapfb_device *fbdev;
  62. struct clk *dss_ick;
  63. struct clk *dss1_fck;
  64. unsigned tearsync_pin_cnt;
  65. unsigned tearsync_mode;
  66. } rfbi;
  67. static inline void rfbi_write_reg(int idx, u32 val)
  68. {
  69. __raw_writel(val, rfbi.base + idx);
  70. }
  71. static inline u32 rfbi_read_reg(int idx)
  72. {
  73. return __raw_readl(rfbi.base + idx);
  74. }
  75. static int rfbi_get_clocks(void)
  76. {
  77. rfbi.dss_ick = clk_get(rfbi.fbdev->dev, "ick");
  78. if (IS_ERR(rfbi.dss_ick)) {
  79. dev_err(rfbi.fbdev->dev, "can't get ick\n");
  80. return PTR_ERR(rfbi.dss_ick);
  81. }
  82. rfbi.dss1_fck = clk_get(rfbi.fbdev->dev, "dss1_fck");
  83. if (IS_ERR(rfbi.dss1_fck)) {
  84. dev_err(rfbi.fbdev->dev, "can't get dss1_fck\n");
  85. clk_put(rfbi.dss_ick);
  86. return PTR_ERR(rfbi.dss1_fck);
  87. }
  88. return 0;
  89. }
  90. static void rfbi_put_clocks(void)
  91. {
  92. clk_put(rfbi.dss1_fck);
  93. clk_put(rfbi.dss_ick);
  94. }
  95. static void rfbi_enable_clocks(int enable)
  96. {
  97. if (enable) {
  98. clk_enable(rfbi.dss_ick);
  99. clk_enable(rfbi.dss1_fck);
  100. } else {
  101. clk_disable(rfbi.dss1_fck);
  102. clk_disable(rfbi.dss_ick);
  103. }
  104. }
  105. #ifdef VERBOSE
  106. static void rfbi_print_timings(void)
  107. {
  108. u32 l;
  109. u32 time;
  110. l = rfbi_read_reg(RFBI_CONFIG0);
  111. time = 1000000000 / rfbi.l4_khz;
  112. if (l & (1 << 4))
  113. time *= 2;
  114. dev_dbg(rfbi.fbdev->dev, "Tick time %u ps\n", time);
  115. l = rfbi_read_reg(RFBI_ONOFF_TIME0);
  116. dev_dbg(rfbi.fbdev->dev,
  117. "CSONTIME %d, CSOFFTIME %d, WEONTIME %d, WEOFFTIME %d, "
  118. "REONTIME %d, REOFFTIME %d\n",
  119. l & 0x0f, (l >> 4) & 0x3f, (l >> 10) & 0x0f, (l >> 14) & 0x3f,
  120. (l >> 20) & 0x0f, (l >> 24) & 0x3f);
  121. l = rfbi_read_reg(RFBI_CYCLE_TIME0);
  122. dev_dbg(rfbi.fbdev->dev,
  123. "WECYCLETIME %d, RECYCLETIME %d, CSPULSEWIDTH %d, "
  124. "ACCESSTIME %d\n",
  125. (l & 0x3f), (l >> 6) & 0x3f, (l >> 12) & 0x3f,
  126. (l >> 22) & 0x3f);
  127. }
  128. #else
  129. static void rfbi_print_timings(void) {}
  130. #endif
  131. static void rfbi_set_timings(const struct extif_timings *t)
  132. {
  133. u32 l;
  134. BUG_ON(!t->converted);
  135. rfbi_enable_clocks(1);
  136. rfbi_write_reg(RFBI_ONOFF_TIME0, t->tim[0]);
  137. rfbi_write_reg(RFBI_CYCLE_TIME0, t->tim[1]);
  138. l = rfbi_read_reg(RFBI_CONFIG0);
  139. l &= ~(1 << 4);
  140. l |= (t->tim[2] ? 1 : 0) << 4;
  141. rfbi_write_reg(RFBI_CONFIG0, l);
  142. rfbi_print_timings();
  143. rfbi_enable_clocks(0);
  144. }
  145. static void rfbi_get_clk_info(u32 *clk_period, u32 *max_clk_div)
  146. {
  147. *clk_period = 1000000000 / rfbi.l4_khz;
  148. *max_clk_div = 2;
  149. }
  150. static int ps_to_rfbi_ticks(int time, int div)
  151. {
  152. unsigned long tick_ps;
  153. int ret;
  154. /* Calculate in picosecs to yield more exact results */
  155. tick_ps = 1000000000 / (rfbi.l4_khz) * div;
  156. ret = (time + tick_ps - 1) / tick_ps;
  157. return ret;
  158. }
  159. #ifdef OMAP_RFBI_RATE_LIMIT
  160. static unsigned long rfbi_get_max_tx_rate(void)
  161. {
  162. unsigned long l4_rate, dss1_rate;
  163. int min_l4_ticks = 0;
  164. int i;
  165. /* According to TI this can't be calculated so make the
  166. * adjustments for a couple of known frequencies and warn for
  167. * others.
  168. */
  169. static const struct {
  170. unsigned long l4_clk; /* HZ */
  171. unsigned long dss1_clk; /* HZ */
  172. unsigned long min_l4_ticks;
  173. } ftab[] = {
  174. { 55, 132, 7, }, /* 7.86 MPix/s */
  175. { 110, 110, 12, }, /* 9.16 MPix/s */
  176. { 110, 132, 10, }, /* 11 Mpix/s */
  177. { 120, 120, 10, }, /* 12 Mpix/s */
  178. { 133, 133, 10, }, /* 13.3 Mpix/s */
  179. };
  180. l4_rate = rfbi.l4_khz / 1000;
  181. dss1_rate = clk_get_rate(rfbi.dss1_fck) / 1000000;
  182. for (i = 0; i < ARRAY_SIZE(ftab); i++) {
  183. /* Use a window instead of an exact match, to account
  184. * for different DPLL multiplier / divider pairs.
  185. */
  186. if (abs(ftab[i].l4_clk - l4_rate) < 3 &&
  187. abs(ftab[i].dss1_clk - dss1_rate) < 3) {
  188. min_l4_ticks = ftab[i].min_l4_ticks;
  189. break;
  190. }
  191. }
  192. if (i == ARRAY_SIZE(ftab)) {
  193. /* Can't be sure, return anyway the maximum not
  194. * rate-limited. This might cause a problem only for the
  195. * tearing synchronisation.
  196. */
  197. dev_err(rfbi.fbdev->dev,
  198. "can't determine maximum RFBI transfer rate\n");
  199. return rfbi.l4_khz * 1000;
  200. }
  201. return rfbi.l4_khz * 1000 / min_l4_ticks;
  202. }
  203. #else
  204. static int rfbi_get_max_tx_rate(void)
  205. {
  206. return rfbi.l4_khz * 1000;
  207. }
  208. #endif
  209. static int rfbi_convert_timings(struct extif_timings *t)
  210. {
  211. u32 l;
  212. int reon, reoff, weon, weoff, cson, csoff, cs_pulse;
  213. int actim, recyc, wecyc;
  214. int div = t->clk_div;
  215. if (div <= 0 || div > 2)
  216. return -1;
  217. /* Make sure that after conversion it still holds that:
  218. * weoff > weon, reoff > reon, recyc >= reoff, wecyc >= weoff,
  219. * csoff > cson, csoff >= max(weoff, reoff), actim > reon
  220. */
  221. weon = ps_to_rfbi_ticks(t->we_on_time, div);
  222. weoff = ps_to_rfbi_ticks(t->we_off_time, div);
  223. if (weoff <= weon)
  224. weoff = weon + 1;
  225. if (weon > 0x0f)
  226. return -1;
  227. if (weoff > 0x3f)
  228. return -1;
  229. reon = ps_to_rfbi_ticks(t->re_on_time, div);
  230. reoff = ps_to_rfbi_ticks(t->re_off_time, div);
  231. if (reoff <= reon)
  232. reoff = reon + 1;
  233. if (reon > 0x0f)
  234. return -1;
  235. if (reoff > 0x3f)
  236. return -1;
  237. cson = ps_to_rfbi_ticks(t->cs_on_time, div);
  238. csoff = ps_to_rfbi_ticks(t->cs_off_time, div);
  239. if (csoff <= cson)
  240. csoff = cson + 1;
  241. if (csoff < max(weoff, reoff))
  242. csoff = max(weoff, reoff);
  243. if (cson > 0x0f)
  244. return -1;
  245. if (csoff > 0x3f)
  246. return -1;
  247. l = cson;
  248. l |= csoff << 4;
  249. l |= weon << 10;
  250. l |= weoff << 14;
  251. l |= reon << 20;
  252. l |= reoff << 24;
  253. t->tim[0] = l;
  254. actim = ps_to_rfbi_ticks(t->access_time, div);
  255. if (actim <= reon)
  256. actim = reon + 1;
  257. if (actim > 0x3f)
  258. return -1;
  259. wecyc = ps_to_rfbi_ticks(t->we_cycle_time, div);
  260. if (wecyc < weoff)
  261. wecyc = weoff;
  262. if (wecyc > 0x3f)
  263. return -1;
  264. recyc = ps_to_rfbi_ticks(t->re_cycle_time, div);
  265. if (recyc < reoff)
  266. recyc = reoff;
  267. if (recyc > 0x3f)
  268. return -1;
  269. cs_pulse = ps_to_rfbi_ticks(t->cs_pulse_width, div);
  270. if (cs_pulse > 0x3f)
  271. return -1;
  272. l = wecyc;
  273. l |= recyc << 6;
  274. l |= cs_pulse << 12;
  275. l |= actim << 22;
  276. t->tim[1] = l;
  277. t->tim[2] = div - 1;
  278. t->converted = 1;
  279. return 0;
  280. }
  281. static int rfbi_setup_tearsync(unsigned pin_cnt,
  282. unsigned hs_pulse_time, unsigned vs_pulse_time,
  283. int hs_pol_inv, int vs_pol_inv, int extif_div)
  284. {
  285. int hs, vs;
  286. int min;
  287. u32 l;
  288. if (pin_cnt != 1 && pin_cnt != 2)
  289. return -EINVAL;
  290. hs = ps_to_rfbi_ticks(hs_pulse_time, 1);
  291. vs = ps_to_rfbi_ticks(vs_pulse_time, 1);
  292. if (hs < 2)
  293. return -EDOM;
  294. if (pin_cnt == 2)
  295. min = 2;
  296. else
  297. min = 4;
  298. if (vs < min)
  299. return -EDOM;
  300. if (vs == hs)
  301. return -EINVAL;
  302. rfbi.tearsync_pin_cnt = pin_cnt;
  303. dev_dbg(rfbi.fbdev->dev,
  304. "setup_tearsync: pins %d hs %d vs %d hs_inv %d vs_inv %d\n",
  305. pin_cnt, hs, vs, hs_pol_inv, vs_pol_inv);
  306. rfbi_enable_clocks(1);
  307. rfbi_write_reg(RFBI_HSYNC_WIDTH, hs);
  308. rfbi_write_reg(RFBI_VSYNC_WIDTH, vs);
  309. l = rfbi_read_reg(RFBI_CONFIG0);
  310. if (hs_pol_inv)
  311. l &= ~(1 << 21);
  312. else
  313. l |= 1 << 21;
  314. if (vs_pol_inv)
  315. l &= ~(1 << 20);
  316. else
  317. l |= 1 << 20;
  318. rfbi_enable_clocks(0);
  319. return 0;
  320. }
  321. static int rfbi_enable_tearsync(int enable, unsigned line)
  322. {
  323. u32 l;
  324. dev_dbg(rfbi.fbdev->dev, "tearsync %d line %d mode %d\n",
  325. enable, line, rfbi.tearsync_mode);
  326. if (line > (1 << 11) - 1)
  327. return -EINVAL;
  328. rfbi_enable_clocks(1);
  329. l = rfbi_read_reg(RFBI_CONFIG0);
  330. l &= ~(0x3 << 2);
  331. if (enable) {
  332. rfbi.tearsync_mode = rfbi.tearsync_pin_cnt;
  333. l |= rfbi.tearsync_mode << 2;
  334. } else
  335. rfbi.tearsync_mode = 0;
  336. rfbi_write_reg(RFBI_CONFIG0, l);
  337. rfbi_write_reg(RFBI_LINE_NUMBER, line);
  338. rfbi_enable_clocks(0);
  339. return 0;
  340. }
  341. static void rfbi_write_command(const void *buf, unsigned int len)
  342. {
  343. rfbi_enable_clocks(1);
  344. if (rfbi.bits_per_cycle == 16) {
  345. const u16 *w = buf;
  346. BUG_ON(len & 1);
  347. for (; len; len -= 2)
  348. rfbi_write_reg(RFBI_CMD, *w++);
  349. } else {
  350. const u8 *b = buf;
  351. BUG_ON(rfbi.bits_per_cycle != 8);
  352. for (; len; len--)
  353. rfbi_write_reg(RFBI_CMD, *b++);
  354. }
  355. rfbi_enable_clocks(0);
  356. }
  357. static void rfbi_read_data(void *buf, unsigned int len)
  358. {
  359. rfbi_enable_clocks(1);
  360. if (rfbi.bits_per_cycle == 16) {
  361. u16 *w = buf;
  362. BUG_ON(len & ~1);
  363. for (; len; len -= 2) {
  364. rfbi_write_reg(RFBI_READ, 0);
  365. *w++ = rfbi_read_reg(RFBI_READ);
  366. }
  367. } else {
  368. u8 *b = buf;
  369. BUG_ON(rfbi.bits_per_cycle != 8);
  370. for (; len; len--) {
  371. rfbi_write_reg(RFBI_READ, 0);
  372. *b++ = rfbi_read_reg(RFBI_READ);
  373. }
  374. }
  375. rfbi_enable_clocks(0);
  376. }
  377. static void rfbi_write_data(const void *buf, unsigned int len)
  378. {
  379. rfbi_enable_clocks(1);
  380. if (rfbi.bits_per_cycle == 16) {
  381. const u16 *w = buf;
  382. BUG_ON(len & 1);
  383. for (; len; len -= 2)
  384. rfbi_write_reg(RFBI_PARAM, *w++);
  385. } else {
  386. const u8 *b = buf;
  387. BUG_ON(rfbi.bits_per_cycle != 8);
  388. for (; len; len--)
  389. rfbi_write_reg(RFBI_PARAM, *b++);
  390. }
  391. rfbi_enable_clocks(0);
  392. }
  393. static void rfbi_transfer_area(int width, int height,
  394. void (callback)(void * data), void *data)
  395. {
  396. u32 w;
  397. BUG_ON(callback == NULL);
  398. rfbi_enable_clocks(1);
  399. omap_dispc_set_lcd_size(width, height);
  400. rfbi.lcdc_callback = callback;
  401. rfbi.lcdc_callback_data = data;
  402. rfbi_write_reg(RFBI_PIXEL_CNT, width * height);
  403. w = rfbi_read_reg(RFBI_CONTROL);
  404. w |= 1; /* enable */
  405. if (!rfbi.tearsync_mode)
  406. w |= 1 << 4; /* internal trigger, reset by HW */
  407. rfbi_write_reg(RFBI_CONTROL, w);
  408. omap_dispc_enable_lcd_out(1);
  409. }
  410. static inline void _stop_transfer(void)
  411. {
  412. u32 w;
  413. w = rfbi_read_reg(RFBI_CONTROL);
  414. rfbi_write_reg(RFBI_CONTROL, w & ~(1 << 0));
  415. rfbi_enable_clocks(0);
  416. }
  417. static void rfbi_dma_callback(void *data)
  418. {
  419. _stop_transfer();
  420. rfbi.lcdc_callback(rfbi.lcdc_callback_data);
  421. }
  422. static void rfbi_set_bits_per_cycle(int bpc)
  423. {
  424. u32 l;
  425. rfbi_enable_clocks(1);
  426. l = rfbi_read_reg(RFBI_CONFIG0);
  427. l &= ~(0x03 << 0);
  428. switch (bpc) {
  429. case 8:
  430. break;
  431. case 16:
  432. l |= 3;
  433. break;
  434. default:
  435. BUG();
  436. }
  437. rfbi_write_reg(RFBI_CONFIG0, l);
  438. rfbi.bits_per_cycle = bpc;
  439. rfbi_enable_clocks(0);
  440. }
  441. static int rfbi_init(struct omapfb_device *fbdev)
  442. {
  443. u32 l;
  444. int r;
  445. rfbi.fbdev = fbdev;
  446. rfbi.base = ioremap(RFBI_BASE, SZ_1K);
  447. if (!rfbi.base) {
  448. dev_err(fbdev->dev, "can't ioremap RFBI\n");
  449. return -ENOMEM;
  450. }
  451. if ((r = rfbi_get_clocks()) < 0)
  452. return r;
  453. rfbi_enable_clocks(1);
  454. rfbi.l4_khz = clk_get_rate(rfbi.dss_ick) / 1000;
  455. /* Reset */
  456. rfbi_write_reg(RFBI_SYSCONFIG, 1 << 1);
  457. while (!(rfbi_read_reg(RFBI_SYSSTATUS) & (1 << 0)));
  458. l = rfbi_read_reg(RFBI_SYSCONFIG);
  459. /* Enable autoidle and smart-idle */
  460. l |= (1 << 0) | (2 << 3);
  461. rfbi_write_reg(RFBI_SYSCONFIG, l);
  462. /* 16-bit interface, ITE trigger mode, 16-bit data */
  463. l = (0x03 << 0) | (0x00 << 2) | (0x01 << 5) | (0x02 << 7);
  464. l |= (0 << 9) | (1 << 20) | (1 << 21);
  465. rfbi_write_reg(RFBI_CONFIG0, l);
  466. rfbi_write_reg(RFBI_DATA_CYCLE1_0, 0x00000010);
  467. l = rfbi_read_reg(RFBI_CONTROL);
  468. /* Select CS0, clear bypass mode */
  469. l = (0x01 << 2);
  470. rfbi_write_reg(RFBI_CONTROL, l);
  471. if ((r = omap_dispc_request_irq(rfbi_dma_callback, NULL)) < 0) {
  472. dev_err(fbdev->dev, "can't get DISPC irq\n");
  473. rfbi_enable_clocks(0);
  474. return r;
  475. }
  476. l = rfbi_read_reg(RFBI_REVISION);
  477. pr_info("omapfb: RFBI version %d.%d initialized\n",
  478. (l >> 4) & 0x0f, l & 0x0f);
  479. rfbi_enable_clocks(0);
  480. return 0;
  481. }
  482. static void rfbi_cleanup(void)
  483. {
  484. omap_dispc_free_irq();
  485. rfbi_put_clocks();
  486. iounmap(rfbi.base);
  487. }
  488. const struct lcd_ctrl_extif omap2_ext_if = {
  489. .init = rfbi_init,
  490. .cleanup = rfbi_cleanup,
  491. .get_clk_info = rfbi_get_clk_info,
  492. .get_max_tx_rate = rfbi_get_max_tx_rate,
  493. .set_bits_per_cycle = rfbi_set_bits_per_cycle,
  494. .convert_timings = rfbi_convert_timings,
  495. .set_timings = rfbi_set_timings,
  496. .write_command = rfbi_write_command,
  497. .read_data = rfbi_read_data,
  498. .write_data = rfbi_write_data,
  499. .transfer_area = rfbi_transfer_area,
  500. .setup_tearsync = rfbi_setup_tearsync,
  501. .enable_tearsync = rfbi_enable_tearsync,
  502. .max_transmit_size = (u32) ~0,
  503. };