Advertisement
alexforsale

mipi_otm8009a.c

Mar 7th, 2014
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.89 KB | None | 0 0
  1. /*
  2. * Copyright (c) 2012, Code Aurora Forum. All rights reserved.
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License version 2 and
  6. * only version 2 as published by the Free Software Foundation.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. */
  13.  
  14. #include <mach/gpio.h>
  15. #include <linux/delay.h>
  16. #include <linux/device.h>
  17.  
  18. #include "msm_fb.h"
  19. #include "mipi_dsi.h"
  20. #include "msm_fb_panel.h"
  21. #include "mipi_otm8009a.h"
  22.  
  23. static struct msm_panel_common_pdata *mipi_otm8009a_pdata;
  24. static struct dsi_buf otm8009a_tx_buf;
  25. static struct dsi_buf otm8009a_rx_buf;
  26.  
  27. static char cmd0[] = {
  28. 0x00, 0x00,
  29. };
  30. static char cmd1[] = {
  31. 0xff, 0x80, 0x09, 0x01,
  32. };
  33. static char cmd2[] = {
  34. 0x00, 0x80,
  35. };
  36. static char cmd3[] = {
  37. 0xff, 0x80, 0x09,
  38. };
  39. static char cmd4[]={
  40. 0x11,
  41. };
  42. static char cmd5[] = {
  43. 0x00, 0x80,
  44. };
  45. static char cmd6[] = {
  46. 0xf5, 0x01, 0x18, 0x02,
  47. 0x18, 0x10, 0x18, 0x02,
  48. 0x18, 0x0e, 0x18, 0x0f,
  49. 0x20,
  50. };
  51. static char cmd7[] = {
  52. 0x00, 0x90,
  53. };
  54. static char cmd8[] = {
  55. 0xf5, 0x02, 0x18, 0x08,
  56. 0x18, 0x06, 0x18, 0x0d,
  57. 0x18, 0x0b, 0x18,
  58. };
  59. static char cmd9[] = {
  60. 0x00, 0xa0,
  61. };
  62. static char cmd10[] = {
  63. 0xf5, 0x10, 0x18, 0x01,
  64. 0x18, 0x14, 0x18, 0x14,
  65. 0x18,
  66. };
  67. static char cmd11[] = {
  68. 0x00, 0xb0,
  69. };
  70. static char cmd12[] = {
  71. 0xf5, 0x14, 0x18, 0x12,
  72. 0x18, 0x13, 0x18, 0x11,
  73. 0x18, 0x13, 0x18, 0x00,
  74. 0x00,
  75. };
  76. static char cmd13[] = {
  77. 0x00, 0xb4,
  78. };
  79. static char cmd14[] = {
  80. 0xc0, 0x11,
  81. };
  82. static char cmd15[] = {
  83. 0x00, 0x82,
  84. };
  85. static char cmd16[] = {
  86. 0xc5, 0xa3,
  87. };
  88. static char cmd17[] = {
  89. 0x00, 0x90,
  90. };
  91. static char cmd18[] = {
  92. 0xc5, 0xd6, 0x76,
  93. };
  94. static char cmd19[] = {
  95. 0x00, 0x00,
  96. };
  97. static char cmd20[] = {
  98. 0xd8, 0xa7, 0xa7,
  99. };
  100. static char cmd21[] = {
  101. 0x00, 0x00,
  102. };
  103. static char cmd22[] = {
  104. 0xd9, 0x74,
  105. };
  106. static char cmd23[] = {
  107. 0x00, 0x81,
  108. };
  109. static char cmd24[] = {
  110. 0xc1, 0x66,
  111. };
  112. static char cmd25[] = {
  113. 0x00, 0xa1,
  114. };
  115. static char cmd26[] = {
  116. 0xc1, 0x08,
  117. };
  118. static char cmd27[] = {
  119. 0x00, 0xa3,
  120. };
  121. static char cmd28[] = {
  122. 0xc0, 0x1b,
  123. };
  124. static char cmd29[] = {
  125. 0x00, 0x81,
  126. };
  127. static char cmd30[] = {
  128. 0xc4, 0x83,
  129. };
  130. static char cmd31[] = {
  131. 0x00, 0x92,
  132. };
  133. static char cmd32[] = {
  134. 0xc5, 0x01,
  135. };
  136. static char cmd33[] = {
  137. 0x00, 0xb1,
  138. };
  139. static char cmd34[] = {
  140. 0xc5, 0xa9,
  141. };
  142. static char cmd35[] = {
  143. 0x00, 0x80,
  144. };
  145. static char cmd36[] = {
  146. 0xce, 0x84, 0x03, 0x00,
  147. 0x83, 0x03, 0x00,
  148. };
  149. static char cmd37[] = {
  150. 0x00, 0x90,
  151. };
  152. static char cmd38[] = {
  153. 0xce, 0x33, 0x27, 0x00,
  154. 0x33, 0x28, 0x00,
  155. };
  156. static char cmd39[] = {
  157. 0x00, 0xa0,
  158. };
  159. static char cmd40[] = {
  160. 0xce, 0x38, 0x02, 0x03,
  161. 0x21, 0x00, 0x00, 0x00,
  162. 0x38, 0x01, 0x03, 0x22,
  163. 0x00, 0x00, 0x00,
  164. };
  165. static char cmd41[] = {
  166. 0x00, 0xb0,
  167. };
  168. static char cmd42[] = {
  169. 0xce, 0x38, 0x00, 0x03,
  170. 0x23, 0x00, 0x00, 0x00,
  171. 0x30, 0x00, 0x03, 0x24,
  172. 0x00, 0x00, 0x00,
  173. };
  174. static char cmd43[] = {
  175. 0x00, 0xc0,
  176. };
  177. static char cmd44[] = {
  178. 0xce, 0x30, 0x01, 0x03,
  179. 0x25, 0x00, 0x00, 0x00,
  180. 0x30, 0x02, 0x03, 0x26,
  181. 0x00, 0x00, 0x00,
  182. };
  183. static char cmd45[] = {
  184. 0x00, 0xd0,
  185. };
  186. static char cmd46[] = {
  187. 0xce, 0x30, 0x03, 0x03,
  188. 0x27, 0x00, 0x00, 0x00,
  189. 0x30, 0x04, 0x03, 0x28,
  190. 0x00, 0x00, 0x00,
  191. };
  192. static char cmd47[] = {
  193. 0x00, 0xc7,
  194. };
  195. static char cmd48[] = {
  196. 0xcf, 0x00,
  197. };
  198. static char cmd49[] = {
  199. 0x00, 0xc0,
  200. };
  201. static char cmd50[] = {
  202. 0xcb, 0x00, 0x00, 0x00,
  203. 0x00, 0x54, 0x54, 0x54,
  204. 0x54, 0x00, 0x54, 0x00,
  205. 0x54, 0x00, 0x00, 0x00,
  206. };
  207. static char cmd51[] = {
  208. 0x00, 0xd0,
  209. };
  210. static char cmd52[] = {
  211. 0xcb, 0x00, 0x00, 0x00,
  212. 0x00, 0x00, 0x00, 0x00,
  213. 0x00, 0x00, 0x54, 0x54,
  214. 0x54, 0x54, 0x00, 0x54,
  215. };
  216. static char cmd53[] = {
  217. 0x00, 0xe0,
  218. };
  219. static char cmd54[] = {
  220. 0xcb, 0x00, 0x54, 0x00,
  221. 0x00, 0x00, 0x00, 0x00,
  222. 0x00, 0x00,
  223. };
  224. static char cmd55[] = {
  225. 0x00, 0x80,
  226. };
  227. static char cmd56[] = {
  228. 0xcc, 0x00, 0x00, 0x00,
  229. 0x00, 0x0c, 0x0a, 0x10,
  230. 0x0e, 0x00, 0x02,
  231. };
  232. static char cmd57[] = {
  233. 0x00, 0x90,
  234. };
  235. static char cmd58[] = {
  236. 0xcc, 0x00, 0x06, 0x00,
  237. 0x00, 0x00, 0x00, 0x00,
  238. 0x00, 0x00, 0x00, 0x00,
  239. 0x00, 0x00, 0x00, 0x0b,
  240. };
  241. static char cmd59[] = {
  242. 0x00, 0xa0,
  243. };
  244. static char cmd60[] = {
  245. 0xcc, 0x09, 0x0f, 0x0d,
  246. 0x00, 0x01, 0x00, 0x05,
  247. 0x00, 0x00, 0x00, 0x00,
  248. 0x00, 0x00, 0x00, 0x00,
  249. };
  250. static char cmd61[] = {
  251. 0x00, 0xb0,
  252. };
  253. static char cmd62[] = {
  254. 0xcc, 0x00, 0x00, 0x00,
  255. 0x00, 0x0d, 0x0f, 0x09,
  256. 0x0b, 0x00, 0x05,
  257. };
  258. static char cmd63[] = {
  259. 0x00, 0xc0,
  260. };
  261. static char cmd64[] = {
  262. 0xcc, 0x00, 0x01, 0x00,
  263. 0x00, 0x00, 0x00, 0x00,
  264. 0x00, 0x00, 0x00, 0x00,
  265. 0x00, 0x00, 0x00, 0x0e,
  266. };
  267. static char cmd65[] = {
  268. 0x00, 0x00,
  269. };
  270. static char cmd66[] = {
  271. 0x36, 0x40,
  272. };
  273. static char cmd67[] = {
  274. 0x00, 0xd0,
  275. };
  276. static char cmd68[] = {
  277. 0xcc, 0x10, 0x0a, 0x0c,
  278. 0x00, 0x06, 0x00, 0x02,
  279. 0x00, 0x00, 0x00, 0x00,
  280. 0x00, 0x00, 0x00, 0x00,
  281. };
  282. static char cmd69[] = {
  283. 0x00, 0x00,
  284. };
  285. static char cmd70[] = {
  286. 0xe1, 0x00, 0x0a, 0x11,
  287. 0x0e, 0x07, 0x0f, 0x0b,
  288. 0x0b, 0x04, 0x07, 0x0d,
  289. 0x09, 0x10, 0x0f, 0x08,
  290. 0x03,
  291. };
  292. static char cmd71[] = {
  293. 0x00, 0x00,
  294. };
  295. static char cmd72[] = {
  296. 0xe2, 0x00, 0x0a, 0x11,
  297. 0x0b, 0x04, 0x07, 0x0d,
  298. 0x09, 0x10, 0x0f, 0x08,
  299. 0x03,
  300. };
  301. static char cmd73[] = {
  302. 0x00, 0x00,
  303. };
  304. static char cmd74[] = {
  305. 0x26, 0x00,
  306. };
  307. static char cmd75[] = {
  308. 0x00, 0x00,
  309. };
  310. static char cmd76[] = {
  311. 0x2b, 0x00, 0x00, 0x03,
  312. 0x56,
  313. };
  314. static char cmd77[] = {
  315. 0x00, 0x00,
  316. };
  317. static char cmd78[] = {
  318. 0x29,
  319. };
  320. static char display_bringtness[2] = {
  321. 0x51, 0x80,
  322. };
  323. static char crtl_display[2] = {
  324. 0x53, 0x2c,
  325. };
  326. static char cabc[2] = {
  327. 0x55, 0x02,
  328. };
  329.  
  330. static struct dsi_cmd_desc otm8009a_cmd_display_on_cmds[] = {
  331. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd0), cmd0},
  332. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd1), cmd1},
  333. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd2), cmd2},
  334. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd3), cmd3},
  335. {DTYPE_DCS_WRITE, 1, 0, 0, 10, sizeof(cmd4), cmd4},
  336. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd5), cmd5},
  337. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd6), cmd6},
  338. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd7), cmd7},
  339. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd8), cmd8},
  340. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd9), cmd9},
  341. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd10), cmd10},
  342. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd11), cmd11},
  343. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd12), cmd12},
  344. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd13), cmd13},
  345. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd14), cmd14},
  346. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd15), cmd15},
  347. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd16), cmd16},
  348. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd17), cmd17},
  349. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd18), cmd18},
  350. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd19), cmd19},
  351. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd20), cmd20},
  352. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd21), cmd21},
  353. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd22), cmd22},
  354. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd23), cmd23},
  355. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd24), cmd24},
  356. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd25), cmd25},
  357. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd26), cmd26},
  358. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd27), cmd27},
  359. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd28), cmd28},
  360. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd29), cmd29},
  361. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd30), cmd30},
  362. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd31), cmd31},
  363. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd32), cmd32},
  364. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd33), cmd33},
  365. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd34), cmd34},
  366. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd35), cmd35},
  367. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd36), cmd36},
  368. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd37), cmd37},
  369. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd38), cmd38},
  370. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd39), cmd39},
  371. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd40), cmd40},
  372. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd41), cmd41},
  373. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd42), cmd42},
  374. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd43), cmd43},
  375. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd44), cmd44},
  376. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd45), cmd45},
  377. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd46), cmd46},
  378. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd47), cmd47},
  379. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd48), cmd48},
  380. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd49), cmd49},
  381. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd50), cmd50},
  382. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd51), cmd51},
  383. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd52), cmd52},
  384. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd53), cmd53},
  385. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd54), cmd54},
  386. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd55), cmd55},
  387. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd56), cmd56},
  388. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd57), cmd57},
  389. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd58), cmd58},
  390. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd59), cmd59},
  391. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd60), cmd60},
  392. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd61), cmd61},
  393. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd62), cmd62},
  394. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd63), cmd63},
  395. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd64), cmd64},
  396. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd65), cmd65},
  397. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd66), cmd66},
  398. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd67), cmd67},
  399. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd68), cmd68},
  400. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd69), cmd69},
  401. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd70), cmd70},
  402. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd71), cmd71},
  403. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd72), cmd72},
  404. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd73), cmd73},
  405. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd74), cmd74},
  406. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd75), cmd75},
  407. {DTYPE_DCS_LWRITE, 1, 0, 0, 0, sizeof(cmd76), cmd76},
  408. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cmd77), cmd77},
  409. {DTYPE_DCS_WRITE, 1, 0, 0, 0, sizeof(cmd78), cmd78},
  410. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(display_bringtness), display_bringtness},
  411. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(crtl_display), crtl_display},
  412. {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(cabc), cabc},
  413. };
  414.  
  415. static char display_off[2] = {0x28, 0x00};
  416. static char enter_sleep[2] = {0x10, 0x00};
  417.  
  418. static struct dsi_cmd_desc otm8009a_display_off_cmds[] = {
  419. {DTYPE_DCS_WRITE, 1, 0, 0, 120, sizeof(display_off), display_off},
  420. {DTYPE_DCS_WRITE, 1, 0, 0, 120, sizeof(enter_sleep), enter_sleep}
  421. };
  422.  
  423. #define MAX_BL_LEVEL 32
  424. #define LCD_BL_EN 0
  425.  
  426. extern int pmic_gpio_direction_output(unsigned gpio);
  427. extern int pmic_gpio_set_value(unsigned gpio, int value);
  428.  
  429. static void mipi_otm8009a_panel_set_backlight(struct msm_fb_data_type *mfd)
  430. {
  431. int level = mfd->bl_level;
  432. int max = mfd->panel_info.bl_max;
  433. int min = mfd->panel_info.bl_min;
  434.  
  435. pr_debug("%s, level = %d\n", __func__, level);
  436. if (level < min)
  437. level = min;
  438. if (level > max)
  439. level = max;
  440.  
  441. pmic_gpio_direction_output(LCD_BL_EN);
  442. if (level == 0) {
  443. pmic_gpio_set_value(LCD_BL_EN, 0);
  444. return;
  445. } else {
  446. pmic_gpio_set_value(LCD_BL_EN, 1);
  447. }
  448.  
  449. return;
  450. }
  451.  
  452. static int mipi_otm8009a_lcd_on(struct platform_device *pdev)
  453. {
  454. struct msm_fb_data_type *mfd;
  455.  
  456. printk("%s: Enter\n", __func__);
  457.  
  458. mfd = platform_get_drvdata(pdev);
  459. if (!mfd)
  460. return -ENODEV;
  461. if (mfd->key != MFD_KEY)
  462. return -EINVAL;
  463.  
  464. mipi_dsi_cmds_tx(mfd, &otm8009a_tx_buf,
  465. otm8009a_cmd_display_on_cmds,
  466. ARRAY_SIZE(otm8009a_cmd_display_on_cmds));
  467.  
  468. printk("%s: Done\n", __func__);
  469. return 0;
  470. }
  471.  
  472. static int mipi_otm8009a_lcd_off(struct platform_device *pdev)
  473. {
  474. struct msm_fb_data_type *mfd;
  475.  
  476. printk("%s: Enter\n", __func__);
  477. mfd = platform_get_drvdata(pdev);
  478.  
  479. if (!mfd)
  480. return -ENODEV;
  481. if (mfd->key != MFD_KEY)
  482. return -EINVAL;
  483.  
  484. mipi_dsi_cmds_tx(mfd, &otm8009a_tx_buf,
  485. otm8009a_display_off_cmds,
  486. ARRAY_SIZE(otm8009a_display_off_cmds));
  487.  
  488. printk("%s: Done\n", __func__);
  489. return 0;
  490. }
  491.  
  492. static int __devinit mipi_otm8009a_lcd_probe(struct platform_device *pdev)
  493. {
  494. printk("%s: Enter\n", __func__);
  495. if (pdev->id == 0) {
  496. mipi_otm8009a_pdata = pdev->dev.platform_data;
  497. return 0;
  498. }
  499. msm_fb_add_device(pdev);
  500.  
  501. printk("%s: Done\n", __func__);
  502. return 0;
  503. }
  504.  
  505. static struct platform_driver this_driver = {
  506. .probe = mipi_otm8009a_lcd_probe,
  507. .driver = {
  508. .name = "mipi_otm8009a",
  509. },
  510. };
  511.  
  512. static struct msm_fb_panel_data otm8009a_panel_data = {
  513. .on = mipi_otm8009a_lcd_on,
  514. .off = mipi_otm8009a_lcd_off,
  515. .set_backlight = mipi_otm8009a_panel_set_backlight,
  516. };
  517.  
  518. static int ch_used[3];
  519.  
  520. int mipi_otm8009a_device_register(struct msm_panel_info *pinfo,
  521. u32 channel, u32 panel)
  522. {
  523. struct platform_device *pdev = NULL;
  524. int ret;
  525.  
  526. printk("%s\n", __func__);
  527.  
  528. if ((channel >= 3) || ch_used[channel])
  529. return -ENODEV;
  530.  
  531. ch_used[channel] = TRUE;
  532.  
  533. pdev = platform_device_alloc("mipi_otm8009a", (panel << 8)|channel);
  534. if (!pdev)
  535. return -ENOMEM;
  536.  
  537. otm8009a_panel_data.panel_info = *pinfo;
  538.  
  539. ret = platform_device_add_data(pdev, &otm8009a_panel_data, sizeof(otm8009a_panel_data));
  540. if (ret) {
  541. printk(KERN_ERR"%s: platform_device_add_data failed!\n", __func__);
  542. goto err_device_put;
  543. }
  544.  
  545. ret = platform_device_add(pdev);
  546. if (ret) {
  547. printk(KERN_ERR"%s: platform_device_register failed!\n", __func__);
  548. goto err_device_put;
  549. }
  550.  
  551. return 0;
  552.  
  553. err_device_put:
  554. platform_device_put(pdev);
  555. return ret;
  556. }
  557.  
  558. static int __init mipi_otm8009a_lcd_init(void)
  559. {
  560. printk("%s\n", __func__);
  561.  
  562. mipi_dsi_buf_alloc(&otm8009a_tx_buf, DSI_BUF_SIZE);
  563. mipi_dsi_buf_alloc(&otm8009a_rx_buf, DSI_BUF_SIZE);
  564.  
  565. return platform_driver_register(&this_driver);
  566. }
  567.  
  568. module_init(mipi_otm8009a_lcd_init);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement