rfbi.c 13 KB

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