ir_remote_mc96fr116.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863
  1. /*
  2. * driver/irda IRDA driver
  3. *
  4. * Copyright (C) 2012 Samsung Electronics
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, write to the Free Software
  18. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  19. *
  20. */
  21. #include <linux/kernel.h>
  22. #include <linux/module.h>
  23. #include <linux/err.h>
  24. #include <linux/i2c.h>
  25. #include <linux/irq.h>
  26. #include <linux/interrupt.h>
  27. #include <linux/platform_device.h>
  28. #include <linux/slab.h>
  29. #include <linux/delay.h>
  30. #include <linux/workqueue.h>
  31. #include <linux/device.h>
  32. #include <linux/ir_remote_con_mc96.h>
  33. #include <linux/regulator/consumer.h>
  34. #if defined (CONFIG_OF)
  35. #include <linux/of_device.h>
  36. #include <linux/of_gpio.h>
  37. #endif
  38. #include <linux/earlysuspend.h>
  39. #include "irda_fw_version103.h"
  40. #include "irda_fw_version104.h"
  41. #include <mach/gpio.h>
  42. #include <linux/ir_remote_con_mc96.h>
  43. #define MAX_SIZE 2048
  44. #define MC96_READ_LENGTH 8
  45. #define DUMMY 0xffff
  46. #define MC96FR116C_0x101 0x101
  47. #define MC96FR116C_0x103 0x103
  48. //#define DEBUG 1
  49. struct ir_remocon_data {
  50. struct mutex mutex;
  51. struct i2c_client *client;
  52. struct mc96_platform_data *pdata;
  53. struct early_suspend early_suspend;
  54. char signal[MAX_SIZE];
  55. int length;
  56. int count;
  57. int dev_id;
  58. int ir_freq;
  59. int ir_sum;
  60. int on_off;
  61. };
  62. #ifdef CONFIG_HAS_EARLYSUSPEND
  63. static void ir_remocon_early_suspend(struct early_suspend *h);
  64. static void ir_remocon_late_resume(struct early_suspend *h);
  65. #endif
  66. static int count_number;
  67. static int ack_number;
  68. static int download_pass;
  69. #define MAX_UPDATE_RETRY 5
  70. static int update_retry_count;
  71. static void irda_wake_en(struct mc96_platform_data *pdata, bool onoff)
  72. {
  73. /*Need to add parser before this*/
  74. gpio_direction_output(pdata->irda_wake_en, onoff);
  75. pr_info("%s: irda_wake_en : %d\n", __func__, onoff);
  76. }
  77. static int vled_ic_onoff;
  78. static struct regulator *vled_ic;
  79. static int irda_vdd_onoff(bool onoff)
  80. {
  81. int ret = 0;
  82. if (onoff) {
  83. ret = regulator_set_voltage(vled_ic,1800000,1800000);
  84. if (ret) {
  85. pr_err("%s regulaor set volatge failed\n",__func__);
  86. goto regulator_fail;
  87. }
  88. ret = regulator_enable(vled_ic);
  89. if (ret) {
  90. pr_err("%s regulaor enable failed\n",__func__);
  91. goto regulator_fail;
  92. }
  93. vled_ic_onoff = 1;
  94. pr_info("%s Regulator On!\n",__func__);
  95. } else if (vled_ic_onoff == 1) {
  96. ret = regulator_disable(vled_ic);
  97. if (ret) {
  98. pr_err("%s regulaor disable failed\n",__func__);
  99. goto regulator_fail;
  100. }
  101. vled_ic_onoff = 0;
  102. pr_err("%s Regulator OFF!\n",__func__);
  103. }
  104. return ret;
  105. regulator_fail:
  106. regulator_put(vled_ic);
  107. return ret;
  108. }
  109. #define FW_RW_RETRY 2
  110. static int irda_fw_update(struct ir_remocon_data *ir_data)
  111. {
  112. struct ir_remocon_data *data = ir_data;
  113. struct i2c_client *client = data->client;
  114. int i, ret = 0, frame_count;
  115. u8 buf_ir_test[8];
  116. const u8 calc_chksum[] = {0x3A, 0x02, 0x10, 0x00, 0xF0, 0x20, 0xFF, 0xDF};
  117. const u8 *IRDA_fw = IRDA_binary_104;
  118. frame_count = FRAME_COUNT_104;
  119. gpio_tlmm_config(GPIO_CFG(data->pdata->irda_irq_gpio, 0, GPIO_CFG_INPUT,
  120. GPIO_CFG_PULL_UP, GPIO_CFG_2MA), GPIO_CFG_ENABLE);
  121. #ifdef CONFIG_MACH_MATISSELTE_USC
  122. gpio_tlmm_config(GPIO_CFG(data->pdata->irda_wake_en, 0, GPIO_CFG_OUTPUT,
  123. GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_DISABLE);
  124. gpio_tlmm_config(GPIO_CFG(data->pdata->irda_led_en, 0, GPIO_CFG_OUTPUT,
  125. GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);
  126. #endif
  127. /* Power on chip in boot mode */
  128. ret = irda_vdd_onoff(1);
  129. if (ret) {
  130. pr_err("%s Regulator setting failed\n", __func__);
  131. goto err_regulator;
  132. }
  133. gpio_set_value(data->pdata->irda_led_en, 1);
  134. data->pdata->ir_wake_en(data->pdata, 0);
  135. msleep(75);
  136. for(i = 0; i < FW_RW_RETRY; i++) {
  137. ret = i2c_master_recv(client, buf_ir_test, MC96_READ_LENGTH);
  138. if (ret < 0) {
  139. pr_err(KERN_ERR " %s: err %d\n", __func__, ret);
  140. msleep(60);
  141. continue;
  142. }
  143. if((buf_ir_test[0] << 8 | buf_ir_test[1]) == 0x0001) {
  144. printk(KERN_CRIT "%s: Perform checksum calculation next\n", __func__);
  145. break;
  146. }
  147. }
  148. if (i == FW_RW_RETRY) {
  149. printk(KERN_CRIT "%s: Chip not responding, powerdown device\n", __func__);
  150. download_pass = 0;
  151. goto fw_update_end;
  152. }
  153. #ifdef DEBUG
  154. /* Expected sequence: 0x00 ,0x01 ,0x3F ,0xFF ,0x10 ,0x00 ,0x01 ,0x4F */
  155. print_hex_dump(KERN_CRIT, "(1)IRDA Master Rx: ", 16, 1,
  156. DUMP_PREFIX_ADDRESS, buf_ir_test, 8, 1);
  157. #endif
  158. for(i = 0; i < FW_RW_RETRY; i++) {
  159. msleep(60);
  160. ret = i2c_master_send(client, calc_chksum, MC96_READ_LENGTH);
  161. if(ret < 0)
  162. continue;
  163. else
  164. break;
  165. }
  166. if(i == FW_RW_RETRY) {
  167. printk(KERN_CRIT "%s: checksum calculation fail, ret: %d\n", __func__, ret);
  168. download_pass = 0;
  169. goto fw_update_end;
  170. }
  171. msleep(75);
  172. /* perform master read after sending checksum calculation data,
  173. * if all correct:0x6E ,0xBA ,0x10 ,0x00 ,0x20 ,0xFF ,0x02 ,0x57
  174. * Else download FW; Try reading twice
  175. */
  176. ret = i2c_master_recv(client, buf_ir_test, MC96_READ_LENGTH);
  177. if (ret < 0) {
  178. msleep(50);
  179. ret = i2c_master_recv(client, buf_ir_test, MC96_READ_LENGTH);
  180. if (ret < 0) {
  181. pr_err(KERN_ERR " %s: read fail after csum calc: err %d\n", __func__, ret);
  182. download_pass = 0;
  183. goto fw_update_end;
  184. }
  185. }
  186. #ifdef DEBUG
  187. print_hex_dump(KERN_CRIT, "(2)IRDA Master Rx: ", 16, 1,
  188. DUMP_PREFIX_ADDRESS, buf_ir_test, 8, 1);
  189. #endif
  190. /* FW 1.4 0x6E93, FW 1.3 0x6EBA */
  191. if((buf_ir_test[0] << 8 | buf_ir_test[1]) == 0x6E93) {
  192. printk(KERN_CRIT "%s: irda fw fine, exit now\n", __func__);
  193. download_pass = 1;
  194. goto powerdown_dev;
  195. }
  196. msleep(100);
  197. /* Start FW download */
  198. for (i = 0; i < frame_count; i++) {
  199. if (i == frame_count-1) {
  200. ret = i2c_master_send(client,
  201. &IRDA_fw[i * 70], 6);
  202. if (ret < 0)
  203. goto fw_update_end;
  204. } else {
  205. ret = i2c_master_send(client,
  206. &IRDA_fw[i * 70], 70);
  207. if (ret < 0)
  208. goto fw_update_end;
  209. }
  210. msleep(60);
  211. }
  212. msleep(100);
  213. ret = i2c_master_recv(client, buf_ir_test, MC96_READ_LENGTH);
  214. if (ret < 0)
  215. pr_err("5. %s: err %d\n", __func__, ret);
  216. #ifdef DEBUG
  217. print_hex_dump(KERN_CRIT, "(3) IRDA Master Rx: ", 16, 1,
  218. DUMP_PREFIX_ADDRESS, buf_ir_test, 8, 1);
  219. #endif
  220. ret = buf_ir_test[0] << 8 | buf_ir_test[1];
  221. if (ret == 0x6E93) {
  222. printk(KERN_CRIT "%s:IRDA new FW 1.4 loaded \n", __func__);
  223. download_pass = 1;
  224. goto powerdown_dev;
  225. } else
  226. printk(KERN_CRIT "%s: checksum fail\n", __func__);
  227. fw_update_end:
  228. printk(KERN_CRIT "%s: FAIL, power down device, ret = %d\n", __func__, ret);
  229. download_pass = 0;
  230. update_retry_count++;
  231. /* Check for old FW being present at last attempt to update to 1.3 */
  232. if(update_retry_count == (MAX_UPDATE_RETRY - 1)) {
  233. download_pass = 1;
  234. update_retry_count = 0;
  235. printk(KERN_CRIT "%s: using old firmware\n", __func__);
  236. }
  237. powerdown_dev:
  238. ret = irda_vdd_onoff(0);
  239. if (ret)
  240. pr_err("%s Regulator setting failed\n", __func__);
  241. err_regulator:
  242. data->pdata->ir_wake_en(data->pdata,0);
  243. gpio_set_value(data->pdata->irda_led_en, 0);
  244. data->on_off = 0;
  245. #ifdef CONFIG_MACH_MATISSELTE_USC
  246. gpio_tlmm_config(GPIO_CFG(data->pdata->irda_wake_en, 0, GPIO_CFG_INPUT,
  247. GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), GPIO_CFG_DISABLE);
  248. gpio_tlmm_config(GPIO_CFG(data->pdata->irda_led_en, 0, GPIO_CFG_INPUT,
  249. GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), GPIO_CFG_ENABLE);
  250. #endif
  251. return ret;
  252. }
  253. static void irda_add_checksum_length(struct ir_remocon_data *ir_data, int count)
  254. {
  255. struct ir_remocon_data *data = ir_data;
  256. int i = 0, csum = 0;
  257. #if 0
  258. printk(KERN_INFO "%s: length: %04x\n", __func__, count);
  259. #endif
  260. data->signal[0] = count >> 8;
  261. data->signal[1] = count & 0xff;
  262. while (i < count) {
  263. csum += data->signal[i];
  264. i++;
  265. }
  266. pr_info("%s: checksum: %04x\n", __func__, csum);
  267. data->signal[count] = csum >> 8;
  268. data->signal[count+1] = csum & 0xff;
  269. }
  270. static int irda_read_device_info(struct ir_remocon_data *ir_data)
  271. {
  272. struct ir_remocon_data *data = ir_data;
  273. struct i2c_client *client = data->client;
  274. u8 buf_ir_test[8];
  275. int ret;
  276. pr_info("%s called\n", __func__);
  277. ret = irda_vdd_onoff(1);
  278. if (ret) {
  279. pr_err("%s Regulator setting failed\n", __func__);
  280. goto err_regulator;
  281. }
  282. data->pdata->ir_wake_en(data->pdata,1);
  283. msleep(60);
  284. ret = i2c_master_recv(client, buf_ir_test, MC96_READ_LENGTH);
  285. if (ret < 0)
  286. dev_err(&client->dev, "%s: err %d\n", __func__, ret);
  287. pr_info("%s: buf_ir dev_id: 0x%02x, 0x%02x\n", __func__,
  288. buf_ir_test[2], buf_ir_test[3]);
  289. ret = data->dev_id = (buf_ir_test[2] << 8 | buf_ir_test[3]);
  290. data->pdata->ir_wake_en(data->pdata,0);
  291. ret = irda_vdd_onoff(0);
  292. if (ret) {
  293. pr_err("%s Regulator setting failed\n", __func__);
  294. goto err_regulator;
  295. }
  296. data->on_off = 0;
  297. err_regulator:
  298. return ret;
  299. }
  300. static void irda_remocon_work(struct ir_remocon_data *ir_data, int count)
  301. {
  302. struct ir_remocon_data *data = ir_data;
  303. struct i2c_client *client = data->client;
  304. int buf_size = count+2;
  305. int ret, retry, ng_retry, sng_retry;
  306. #if defined(CONFIG_ANDROID_FFF)
  307. int sleep_timing;
  308. int end_data;
  309. #endif
  310. int emission_time;
  311. int ack_pin_onoff;
  312. if (count_number >= 100)
  313. count_number = 0;
  314. count_number++;
  315. ng_retry = sng_retry = 0;
  316. gpio_tlmm_config(GPIO_CFG(ir_data->pdata->irda_irq_gpio, 0, GPIO_CFG_INPUT,
  317. GPIO_CFG_PULL_UP, GPIO_CFG_2MA), GPIO_CFG_ENABLE);
  318. pr_info("%s: total buf_size: %d\n", __func__, buf_size);
  319. irda_add_checksum_length(data, count);
  320. mutex_lock(&data->mutex);
  321. resend_data:
  322. ret = i2c_master_send(client, data->signal, buf_size);
  323. if (ret < 0) {
  324. dev_err(&client->dev, "%s: err1 %d\n", __func__, ret);
  325. ret = i2c_master_send(client, data->signal, buf_size);
  326. if (ret < 0)
  327. dev_err(&client->dev, "%s: err2 %d\n", __func__, ret);
  328. }
  329. mdelay(10);
  330. ack_pin_onoff = 0;
  331. for(retry = 0; retry < 10; retry++) {
  332. if (gpio_get_value(data->pdata->irda_irq_gpio)) {
  333. if(retry == 9) {
  334. ng_retry++;
  335. if(ng_retry < 2) {
  336. data->pdata->ir_wake_en(data->pdata,0);
  337. gpio_set_value(data->pdata->irda_led_en, 0);
  338. irda_vdd_onoff(0);
  339. msleep(30);
  340. data->pdata->ir_wake_en(data->pdata,1);
  341. gpio_set_value(data->pdata->irda_led_en, 1);
  342. irda_vdd_onoff(1);
  343. msleep(80);
  344. goto resend_data;
  345. }
  346. pr_err("%s : %d Checksum NG!\n",
  347. __func__, count_number);
  348. }
  349. ack_pin_onoff = 1;
  350. msleep(5);
  351. } else {
  352. pr_info("%s : %d Checksum OK!\n",
  353. __func__, count_number);
  354. ack_pin_onoff = 2;
  355. break;
  356. }
  357. }
  358. ack_number = ack_pin_onoff;
  359. #if defined(CONFIG_ANDROID_FFF)
  360. end_data = data->signal[count-2] << 8 | data->signal[count-1];
  361. emission_time = (1000 * (data->ir_sum - end_data) / (data->ir_freq)) + 10;
  362. sleep_timing = emission_time - 110;
  363. if (sleep_timing > 0)
  364. usleep(sleep_timing);
  365. #ifdef DEBUG
  366. printk(KERN_CRIT "%s end data %d sleep timing %d\n", __func__, end_data, sleep_timing);
  367. #endif
  368. msleep(125);
  369. #endif
  370. emission_time = (1000 * (data->ir_sum) / (data->ir_freq));
  371. if (emission_time > 0) {
  372. #if defined(CONFIG_ANDROID_FFF)
  373. usleep(emission_time);
  374. #else
  375. msleep(emission_time);
  376. #endif
  377. }
  378. pr_info("%s: emission_time = %d\n", __func__, emission_time);
  379. for(retry = 0; retry < 10; retry++) {
  380. if (gpio_get_value(data->pdata->irda_irq_gpio)) {
  381. pr_info("%s : %d Sending IR OK!\n",
  382. __func__, count_number);
  383. ack_pin_onoff = 4;
  384. break;
  385. } else {
  386. if(retry == 9) {
  387. sng_retry++;
  388. if(sng_retry < 2) {
  389. data->pdata->ir_wake_en(data->pdata,0);
  390. gpio_set_value(data->pdata->irda_led_en, 0);
  391. irda_vdd_onoff(0);
  392. msleep(30);
  393. data->pdata->ir_wake_en(data->pdata,1);
  394. gpio_set_value(data->pdata->irda_led_en, 1);
  395. irda_vdd_onoff(1);
  396. msleep(80);
  397. goto resend_data;
  398. }
  399. pr_info("%s : %d Sending IR NG!\n",
  400. __func__, count_number);
  401. }
  402. ack_pin_onoff = 2;
  403. msleep(50);
  404. }
  405. }
  406. mutex_unlock(&data->mutex);
  407. data->count = 2;
  408. ack_number += ack_pin_onoff;
  409. #ifndef USE_STOP_MODE
  410. data->on_off = 0;
  411. data->pdata->ir_wake_en(data->pdata,0);
  412. gpio_set_value(data->pdata->irda_led_en, 0);
  413. irda_vdd_onoff(0);
  414. #endif
  415. data->ir_freq = 0;
  416. data->ir_sum = 0;
  417. gpio_tlmm_config(GPIO_CFG(ir_data->pdata->irda_irq_gpio, 0, GPIO_CFG_INPUT,
  418. GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), GPIO_CFG_ENABLE);
  419. #ifdef CONFIG_MACH_MATISSELTE_USC
  420. gpio_tlmm_config(GPIO_CFG(ir_data->pdata->irda_wake_en, 0, GPIO_CFG_INPUT,
  421. GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), GPIO_CFG_DISABLE);
  422. gpio_tlmm_config(GPIO_CFG(ir_data->pdata->irda_led_en, 0, GPIO_CFG_INPUT,
  423. GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), GPIO_CFG_ENABLE);
  424. #endif
  425. }
  426. static ssize_t remocon_store(struct device *dev, struct device_attribute *attr,
  427. const char *buf, size_t size)
  428. {
  429. struct ir_remocon_data *data = dev_get_drvdata(dev);
  430. unsigned int _data;
  431. int i, ret;
  432. ret = 0;
  433. #ifdef DEBUG
  434. printk(KERN_CRIT "irda store string: %s\n", buf);
  435. #endif
  436. #ifdef CONFIG_MACH_MATISSELTE_USC
  437. gpio_tlmm_config(GPIO_CFG(data->pdata->irda_wake_en, 0, GPIO_CFG_OUTPUT,
  438. GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_DISABLE);
  439. gpio_tlmm_config(GPIO_CFG(data->pdata->irda_led_en, 0, GPIO_CFG_OUTPUT,
  440. GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);
  441. #endif
  442. for (i = 0; i < MAX_SIZE; i++) {
  443. if (sscanf(buf++, "%u", &_data) == 1) {
  444. if (_data == 0 || buf == '\0')
  445. break;
  446. if (data->count == 2) {
  447. data->ir_freq = _data;
  448. if (data->on_off) {
  449. data->pdata->ir_wake_en(data->pdata,0);
  450. udelay(200);
  451. data->pdata->ir_wake_en(data->pdata,1);
  452. msleep(30);
  453. } else {
  454. ret = irda_vdd_onoff(1);
  455. if (ret) {
  456. pr_err("%s regulaor disable failed\n",
  457. __func__);
  458. return ret;
  459. }
  460. gpio_set_value(data->pdata->irda_led_en, 1);
  461. data->pdata->ir_wake_en(data->pdata,1);
  462. msleep(80);
  463. data->on_off = 1;
  464. }
  465. #if defined(CONFIG_ANDROID_FFF)
  466. data->signal[(data->count)++] = 0x40; // Mode
  467. #endif
  468. data->signal[(data->count)++] = _data >> 16;
  469. data->signal[(data->count)++] = (_data >> 8) & 0xFF;
  470. data->signal[(data->count)++] = _data & 0xFF;
  471. } else {
  472. data->ir_sum += _data;
  473. #if defined(CONFIG_ANDROID_FFF)
  474. if(_data > 0x7FFF) {
  475. data->signal[(data->count)++] = _data >> 24;
  476. data->signal[(data->count)++] = _data >> 16;
  477. data->signal[(data->count)++] = _data >> 8;
  478. data->signal[(data->count)++] = _data & 0xFF;
  479. } else {
  480. data->signal[(data->count)++] = _data >> 8;
  481. data->signal[(data->count)++] = _data & 0xFF;
  482. }
  483. #else
  484. data->signal[(data->count)++] = _data >> 8;
  485. data->signal[(data->count)++] = _data & 0xFF;
  486. #endif
  487. }
  488. while (_data > 0) {
  489. buf++;
  490. _data /= 10;
  491. }
  492. } else {
  493. break;
  494. }
  495. }
  496. irda_remocon_work(data, data->count);
  497. return size;
  498. }
  499. static ssize_t remocon_show(struct device *dev, struct device_attribute *attr,
  500. char *buf)
  501. {
  502. struct ir_remocon_data *data = dev_get_drvdata(dev);
  503. int i;
  504. char *bufp = buf;
  505. for (i = 5; i < MAX_SIZE - 1; i++) {
  506. if (data->signal[i] == 0 && data->signal[i+1] == 0)
  507. break;
  508. else
  509. bufp += sprintf(bufp, "%u,", data->signal[i]);
  510. }
  511. return strlen(buf);
  512. }
  513. static ssize_t remocon_ack(struct device *dev, struct device_attribute *attr,
  514. char *buf)
  515. {
  516. //struct ir_remocon_data *data = dev_get_drvdata(dev);
  517. pr_info("%s : ack_number = %d\n", __func__, ack_number);
  518. if (ack_number == 6)
  519. return sprintf(buf, "1\n");
  520. else
  521. return sprintf(buf, "0\n");
  522. }
  523. static DEVICE_ATTR(ir_send, 0664, remocon_show, remocon_store);
  524. static DEVICE_ATTR(ir_send_result, 0664, remocon_ack, NULL);
  525. static ssize_t check_ir_show(struct device *dev, struct device_attribute *attr,
  526. char *buf)
  527. {
  528. struct ir_remocon_data *data = dev_get_drvdata(dev);
  529. int ret;
  530. ret = irda_read_device_info(data);
  531. return snprintf(buf, 4, "%d\n", ret);
  532. }
  533. static DEVICE_ATTR(check_ir, 0664, check_ir_show, NULL);
  534. #ifdef CONFIG_OF
  535. static int irda_mc96_parse_dt(struct device *dev, struct mc96_platform_data *pdata)
  536. {
  537. struct device_node *np = dev->of_node;
  538. pdata->irda_irq_gpio = of_get_named_gpio_flags(np, "mc96fr332,irda_irq_gpio",
  539. 0, &pdata->irq_gpio_flags);
  540. if (pdata->irda_irq_gpio < 0) {
  541. pr_err("%s failed to get irda_irq_gpio\n", __func__);
  542. return pdata->irda_irq_gpio;
  543. }
  544. pdata->irda_led_en = of_get_named_gpio_flags(np, "mc96fr332,irda_led_en",
  545. 0, &pdata->led_en_flags);
  546. if (pdata->irda_led_en < 0) {
  547. pr_err("%s failed to get irda_led_en\n", __func__);
  548. return pdata->irda_led_en;
  549. }
  550. pdata->irda_wake_en = of_get_named_gpio_flags(np, "mc96fr332,irda_wake",
  551. 0, &pdata->wake_en_flags);
  552. if (pdata->irda_wake_en < 0) {
  553. pr_err("%s failed to get irda_wake_en\n", __func__);
  554. return pdata->irda_wake_en;
  555. }
  556. pdata->irda_scl_gpio = of_get_named_gpio_flags(np, "mc96fr332,scl-gpio",
  557. 0, &pdata->irda_scl_flags);
  558. if (pdata->irda_scl_gpio < 0) {
  559. pr_err("%s failed to get irda_scl_gpio\n", __func__);
  560. return pdata->irda_wake_en;
  561. }
  562. pdata->irda_sda_gpio = of_get_named_gpio_flags(np, "mc96fr332,sda-gpio",
  563. 0, &pdata->irda_sda_flags);
  564. if (pdata->irda_sda_gpio < 0) {
  565. pr_err("%s failed to get irda_sda_gpio\n", __func__);
  566. return pdata->irda_sda_gpio;
  567. }
  568. pr_info("%s: irq-gpio:%u led_en:%u wake_up:%u irda-scl:%u irda-sda:%u \n", __func__,
  569. pdata->irda_irq_gpio,pdata->irda_led_en,pdata->irda_wake_en,pdata->irda_scl_gpio,pdata->irda_sda_gpio);
  570. return 0;
  571. }
  572. #endif
  573. static int __devinit irda_remocon_probe(struct i2c_client *client,
  574. const struct i2c_device_id *id)
  575. {
  576. struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
  577. struct ir_remocon_data *data;
  578. struct device *ir_remocon_dev;
  579. struct mc96_platform_data *pdata;
  580. int i, error;
  581. int ret;
  582. pr_info("%s start!\n", __func__);
  583. dev_info(&client->dev,"%s:ir_remocon probe called \n",__func__);
  584. if(client->dev.of_node) {
  585. pdata = devm_kzalloc(&client->dev,
  586. sizeof(struct mc96_platform_data), GFP_KERNEL);
  587. if (!pdata) {
  588. dev_err(&client->dev, "Failed to allocate memory \n");
  589. return -ENOMEM;
  590. }
  591. ret = irda_mc96_parse_dt(&client->dev, pdata);
  592. if (ret < 0)
  593. {
  594. dev_err(&client->dev,"Parse failed \n");
  595. return ret;
  596. }
  597. pdata->ir_wake_en = irda_wake_en;
  598. if(gpio_request(pdata->irda_wake_en, "IRDA Wakeup EN Pin"))
  599. pr_err("%s IRDA Wakeup EN GPIO Request failed\n",__func__);
  600. #ifndef CONFIG_MACH_MATISSELTE_USC
  601. gpio_tlmm_config(GPIO_CFG(pdata->irda_wake_en, 0, GPIO_CFG_OUTPUT,
  602. GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_DISABLE);
  603. gpio_tlmm_config(GPIO_CFG(pdata->irda_led_en, 0, GPIO_CFG_OUTPUT,
  604. GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);
  605. #else
  606. gpio_tlmm_config(GPIO_CFG(pdata->irda_wake_en, 0, GPIO_CFG_INPUT,
  607. GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), GPIO_CFG_DISABLE);
  608. gpio_tlmm_config(GPIO_CFG(pdata->irda_led_en, 0, GPIO_CFG_INPUT,
  609. GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), GPIO_CFG_ENABLE);
  610. #endif
  611. gpio_request(pdata->irda_led_en, "irda_led_en");
  612. gpio_direction_output(pdata->irda_led_en, 0);
  613. if (gpio_request(pdata->irda_irq_gpio, "ira_irq"))
  614. pr_err("%s IRDA LED IRQ GPIO Request failed\n",__func__);
  615. gpio_direction_input(pdata->irda_irq_gpio);
  616. } else
  617. pdata = client->dev.platform_data;
  618. if (!pdata)
  619. return -EINVAL;
  620. if (!i2c_check_functionality(adapter, I2C_FUNC_I2C))
  621. return -EIO;
  622. data = kzalloc(sizeof(struct ir_remocon_data), GFP_KERNEL);
  623. if (NULL == data) {
  624. pr_err("Failed to data allocate %s\n", __func__);
  625. error = -ENOMEM;
  626. goto err_free_mem;
  627. }
  628. data->client = client;
  629. if (client->dev.of_node)
  630. {
  631. data->pdata = pdata;
  632. }else
  633. data->pdata = client->dev.platform_data;
  634. mutex_init(&data->mutex);
  635. data->count = 2;
  636. data->on_off = 0;
  637. vled_ic = regulator_get(&client->dev, "vled_ic_1.8v");
  638. if (IS_ERR(vled_ic)) {
  639. pr_err("%s could not get regulator vled_ic_1.8v\n",__func__);
  640. error = -EBUSY;
  641. goto err_free_mem;
  642. }
  643. i2c_set_clientdata(client, data);
  644. for (i = 0; i < MAX_UPDATE_RETRY; i++) {
  645. if (download_pass == 1)
  646. break;
  647. irda_fw_update(data);
  648. }
  649. if (download_pass != 1)
  650. goto err_fw_update_fail;
  651. gpio_set_value(pdata->irda_led_en, 0);
  652. // irda_read_device_info(data);
  653. ir_remocon_dev = device_create(sec_class, NULL, 0, data, "sec_ir");
  654. if (IS_ERR(ir_remocon_dev))
  655. pr_err("Failed to create ir_remocon_dev device\n");
  656. if (device_create_file(ir_remocon_dev, &dev_attr_ir_send) < 0)
  657. pr_err("Failed to create device file(%s)!\n",
  658. dev_attr_ir_send.attr.name);
  659. if (device_create_file(ir_remocon_dev, &dev_attr_ir_send_result) < 0)
  660. pr_err("Failed to create device file(%s)!\n",
  661. dev_attr_ir_send.attr.name);
  662. if (device_create_file(ir_remocon_dev, &dev_attr_check_ir) < 0)
  663. pr_err("Failed to create device file(%s)!\n",
  664. dev_attr_check_ir.attr.name);
  665. #ifdef CONFIG_HAS_EARLYSUSPEND
  666. data->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;
  667. data->early_suspend.suspend = ir_remocon_early_suspend;
  668. data->early_suspend.resume = ir_remocon_late_resume;
  669. register_early_suspend(&data->early_suspend);
  670. #endif
  671. gpio_tlmm_config(GPIO_CFG(data->pdata->irda_irq_gpio, 0, GPIO_CFG_INPUT,
  672. GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), GPIO_CFG_ENABLE);
  673. return 0;
  674. err_fw_update_fail:
  675. regulator_put(vled_ic);
  676. err_free_mem:
  677. kfree(data);
  678. return error;
  679. }
  680. #if defined(CONFIG_PM) || defined(CONFIG_HAS_EARLYSUSPEND)
  681. static int ir_remocon_suspend(struct device *dev)
  682. {
  683. struct i2c_client *client = to_i2c_client(dev);
  684. struct ir_remocon_data *data = i2c_get_clientdata(client);
  685. int ret = 0;
  686. ret = irda_vdd_onoff(0);
  687. if (ret)
  688. pr_err("%s Regulator setting failed\n", __func__);
  689. data->on_off = 0;
  690. data->pdata->ir_wake_en(data->pdata,0);
  691. return ret;
  692. }
  693. static int ir_remocon_resume(struct device *dev)
  694. {
  695. return 0;
  696. }
  697. #endif
  698. #ifdef CONFIG_HAS_EARLYSUSPEND
  699. static void ir_remocon_early_suspend(struct early_suspend *h)
  700. {
  701. struct ir_remocon_data *data;
  702. data = container_of(h, struct ir_remocon_data, early_suspend);
  703. ir_remocon_suspend(&data->client->dev);
  704. }
  705. static void ir_remocon_late_resume(struct early_suspend *h)
  706. {
  707. struct ir_remocon_data *data;
  708. data = container_of(h, struct ir_remocon_data, early_suspend);
  709. ir_remocon_resume(&data->client->dev);
  710. }
  711. #endif
  712. #if defined(CONFIG_PM) && !defined(CONFIG_HAS_EARLYSUSPEND)
  713. static const struct dev_pm_ops ir_remocon_pm_ops = {
  714. .suspend = ir_remocon_suspend,
  715. .resume = ir_remocon_resume,
  716. };
  717. #endif
  718. static int __devexit ir_remocon_remove(struct i2c_client *client)
  719. {
  720. struct ir_remocon_data *data = i2c_get_clientdata(client);
  721. mutex_destroy(&data->mutex);
  722. i2c_set_clientdata(client, NULL);
  723. regulator_disable(vled_ic);
  724. regulator_put(vled_ic);
  725. kfree(data);
  726. return 0;
  727. }
  728. static const struct i2c_device_id mc96_id[] = {
  729. {"mc96", 0},
  730. {}
  731. };
  732. MODULE_DEVICE_TABLE(i2c, mc96_id);
  733. static struct of_device_id mc96_i2c_match_table[] = {
  734. { .compatible = "mc96fr332,i2c",},
  735. {},
  736. };
  737. MODULE_DEVICE_TABLE(of, mc96_i2c_match_table);
  738. static struct i2c_driver mc96_i2c_driver = {
  739. .driver = {
  740. .name = "mc96",
  741. .owner = THIS_MODULE,
  742. .of_match_table = mc96_i2c_match_table,
  743. },
  744. .probe = irda_remocon_probe,
  745. .remove = __devexit_p(ir_remocon_remove),
  746. #if defined(CONFIG_PM) && !defined(CONFIG_HAS_EARLYSUSPEND)
  747. //.pm = &ir_remocon_pm_ops,
  748. #endif
  749. .id_table = mc96_id,
  750. };
  751. static int __init ir_remocon_init(void)
  752. {
  753. return i2c_add_driver(&mc96_i2c_driver);
  754. }
  755. module_init(ir_remocon_init);
  756. static void __exit ir_remocon_exit(void)
  757. {
  758. i2c_del_driver(&mc96_i2c_driver);
  759. }
  760. module_exit(ir_remocon_exit);
  761. MODULE_LICENSE("GPL");
  762. MODULE_DESCRIPTION("SEC IR remote controller");