leds-max77828.c 28 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001
  1. /*
  2. * LED driver for Maxim MAX77828 - leds-MAX77828.c
  3. *
  4. * Copyright (C) 2013 Samsung co. Ltd.
  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 version 2 as
  8. * published by the Free Software Foundation.
  9. */
  10. #include <linux/kernel.h>
  11. #include <linux/init.h>
  12. #include <linux/platform_device.h>
  13. #include <linux/leds.h>
  14. #include <linux/workqueue.h>
  15. #include <linux/spinlock.h>
  16. #include <linux/slab.h>
  17. #include <linux/mfd/max77828.h>
  18. #include <linux/mfd/max77828-private.h>
  19. #include <linux/leds-max77828.h>
  20. #include <linux/ctype.h>
  21. #include <linux/gpio.h>
  22. #include <linux/debugfs.h>
  23. #ifdef CONFIG_LEDS_SWITCH
  24. #include <linux/gpio.h>
  25. #define FLASH_SWITCH_REMOVED_REVISION 0x05
  26. #endif
  27. #undef DEBUG_FLASH
  28. #define DEBUG_FLASH
  29. #if defined(DEBUG_FLASH)
  30. #define DEBUG_MAX77828(fmt, args...) pr_err(fmt, ##args)
  31. #else
  32. #define DEBUG_MAX77828(fmt, args...) do{}while(0)
  33. #endif
  34. struct max77828_led_data {
  35. struct led_classdev led;
  36. struct max77828_dev *max77828;
  37. struct max77828_led *data;
  38. struct i2c_client *i2c;
  39. struct work_struct work;
  40. struct mutex lock;
  41. spinlock_t value_lock;
  42. int brightness;
  43. int test_brightness;
  44. #ifdef CONFIG_LEDS_SEPERATE_MOVIE_FLASH
  45. int movie_brightness;
  46. #endif
  47. };
  48. struct max77828_flash_platform_data
  49. {
  50. bool flash_en_control;
  51. bool torch_stb_control;
  52. int flash_ramp_up; /* One of 384, 640, 1152, 2176, 4224, 8320, 16512, 32896 usec */
  53. int flash_ramp_down; /* One of 384, 640, 1152, 2176, 4224, 8320, 16512, 32896 usec */
  54. int torch_ramp_up; /* One of 16392, 32776, 65544, 131080, 262152, 524296, 1048000, 2097000 usec */
  55. int torch_ramp_down; /* One of 16392, 32776, 65544, 131080, 262152, 524296, 1048000, 2097000 usec */
  56. bool enable_pulldown_resistor; /* On/Off Control for Pulldown Resistor */
  57. bool enable_maxflash; /* enable MAXFLASH */
  58. int maxflash_threshold; /* 2400000uV to 3400000uV in 33333uV steps */
  59. int maxflash_hysteresis; /* One of 50000uV, 100000uV, 300000uV, 350000uV or -1. -1 means only allowed to decrease */
  60. int maxflash_falling_timer; /* 256us to 4096us in 256us steps */
  61. int maxflash_rising_timer; /* 256us to 4096us in 256us steps */
  62. };
  63. #define SEC_LED_SPECIFIC
  64. #ifdef SEC_LED_SPECIFIC
  65. struct device *led_dev;
  66. #endif
  67. struct max77828_flash_platform_data *fdata;
  68. extern struct class *camera_class; /*sys/class/camera*/
  69. struct device *flash_dev;
  70. static int flash_torch_en;
  71. extern int led_torch_en;
  72. extern int led_flash_en;
  73. const int flash_ramp[] = {384, 640, 1152, 2176, 4224, 8320, 16512, 32896};
  74. const int torch_ramp[] = {16392, 32776, 65544, 131080, 262152, 524296, 1048000, 2097000};
  75. #ifdef CONFIG_LEDS_SEPERATE_MOVIE_FLASH
  76. static ssize_t max77828_show_movie_brightness(struct device *dev,
  77. struct device_attribute *devattr, char *buf)
  78. {
  79. struct led_classdev *led_cdev = dev_get_drvdata(dev);
  80. struct max77828_led_data *led_data = container_of(led_cdev, struct max77828_led_data, led);
  81. return sprintf(buf, "%d\n", led_data->movie_brightness);
  82. }
  83. static ssize_t max77828_store_movie_brightness(struct device *dev,
  84. struct device_attribute *attr, const char *buf, size_t size)
  85. {
  86. return size;
  87. }
  88. static DEVICE_ATTR(movie_brightness, S_IWUSR|S_IWGRP|S_IRUGO,
  89. max77828_show_movie_brightness, max77828_store_movie_brightness);
  90. #endif
  91. #if defined(DEBUG_FLASH)
  92. static void print_all_reg_value(struct i2c_client *client)
  93. {
  94. u8 value;
  95. u8 i;
  96. for (i = 2; i != 0x36; ++i) {
  97. max77828_read_reg(client, i, &value);
  98. printk(KERN_ERR "LEDS_MAX77828 REG(%x) = %x\n", i, value);
  99. if(i==0x12)
  100. i=0x2F;
  101. value = 0;
  102. }
  103. }
  104. static int max77828_debugfs_show(struct seq_file *s, void *data)
  105. {
  106. struct max77828_dev *ldata = s->private;
  107. u8 reg;
  108. u8 reg_data;
  109. seq_printf(s, "MAX77828 IF PMIC :\n");
  110. seq_printf(s, "=============\n");
  111. for (reg = 0x02; reg <= 0x36; reg++) {
  112. max77828_read_reg(ldata->led, reg, &reg_data);
  113. seq_printf(s, "0x%02x:\t0x%02x\n", reg, reg_data);
  114. if(reg==0x12)
  115. reg=0x2F;
  116. }
  117. print_all_reg_value(ldata->led);
  118. seq_printf(s, "\n");
  119. return 0;
  120. }
  121. static int max77828_debugfs_open(struct inode *inode, struct file *file)
  122. {
  123. return single_open(file, max77828_debugfs_show, inode->i_private);
  124. }
  125. static const struct file_operations max77828_debugfs_fops = {
  126. .open = max77828_debugfs_open,
  127. .read = seq_read,
  128. .llseek = seq_lseek,
  129. .release = single_release,
  130. };
  131. #endif
  132. int max77828_led_en(int onoff, int mode)
  133. {
  134. int ret = 0;
  135. if (flash_torch_en) {
  136. if (onoff) { /* enable */
  137. if (mode) { /* flash */
  138. DEBUG_MAX77828("[LED] %s: max77828_flash_en set 1\n", __func__);
  139. gpio_direction_output(led_flash_en, 1);
  140. }
  141. else { /* torch */
  142. DEBUG_MAX77828("[LED] %s: max77828_torch_en set 1\n", __func__);
  143. gpio_direction_output(led_torch_en, 1);
  144. }
  145. }
  146. else { /* disable */
  147. if (mode) { /* flash */
  148. DEBUG_MAX77828("[LED] %s: max77828_flash_en set 0\n", __func__);
  149. gpio_direction_output(led_flash_en, 0);
  150. }
  151. else { /* torch */
  152. DEBUG_MAX77828("[LED] %s: max77828_torch_en set 0\n", __func__);
  153. gpio_direction_output(led_torch_en, 0);
  154. }
  155. }
  156. }
  157. else {
  158. pr_err("%s : Error!!, find gpio", __func__);
  159. ret = -EINVAL;
  160. }
  161. return ret;
  162. }
  163. EXPORT_SYMBOL(max77828_led_en);
  164. static void max77828_led_set(struct led_classdev *led_cdev,
  165. enum led_brightness value)
  166. {
  167. unsigned long flags;
  168. struct max77828_led_data *led_data = container_of(led_cdev, struct max77828_led_data, led);
  169. DEBUG_MAX77828("[LED] %s - brightness value written is %d\n", __func__,value);
  170. spin_lock_irqsave(&led_data->value_lock, flags);
  171. led_data->test_brightness = value;
  172. spin_unlock_irqrestore(&led_data->value_lock, flags);
  173. schedule_work(&led_data->work);
  174. }
  175. static void max77828_flash_set(struct max77828_led_data *led_data)
  176. {
  177. int ret;
  178. int brightness = led_data->test_brightness;
  179. if(brightness == LED_OFF)
  180. {
  181. DEBUG_MAX77828("(%s) LED_OFF\n",__func__);
  182. /* mode select */
  183. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_MODE_SEL, 0xCA);
  184. if(IS_ERR_VALUE(ret))
  185. pr_err("(%s) : MAX77828_LED_REG_MODE_SEL update failed\n",__func__);
  186. /* Flash OFF */
  187. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_I_FLASH1,
  188. MAX77828_FLASH_FLED1_EN);
  189. if(IS_ERR_VALUE(ret))
  190. pr_err("(%s) : MAX77828_LED_REG_I_FLASH1 update failed\n",__func__ );
  191. }
  192. else
  193. {
  194. if(brightness > 0x3F)
  195. brightness = 0x3F;
  196. DEBUG_MAX77828("(%s) LED_ON\n",__func__);
  197. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_DCDC_CNTL1,
  198. MAX77828_DCDC_MODE_PAM|0xC0);
  199. if(IS_ERR_VALUE(ret))
  200. pr_err("(%s) : MAX77828_LED_REG_DCDC_CNTL1 write failed\n",__func__);
  201. /* mode select */
  202. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_MODE_SEL,0x47);
  203. if(IS_ERR_VALUE(ret))
  204. pr_err("(%s) : MAX77828_LED_REG_MODE_SEL update failed\n",__func__);
  205. /* Flash ON, Set Current */
  206. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_I_FLASH1,
  207. MAX77828_FLASH_FLED1_EN |
  208. ((unsigned int)brightness << max77828_set_bit(MAX77828_FLASH_IOUT)));
  209. if(IS_ERR_VALUE(ret))
  210. pr_err("(%s) : MAX77828_LED_REG_I_FLASH1 write failed\n",__func__);
  211. }
  212. return;
  213. }
  214. static void max77828_torch_set(struct max77828_led_data *led_data)
  215. {
  216. int ret;
  217. int brightness = led_data->test_brightness;
  218. if(brightness == LED_OFF)
  219. {
  220. /* mode select */
  221. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_MODE_SEL, 0xCA);
  222. if(IS_ERR_VALUE(ret))
  223. pr_err("(%s) : MAX77828_LED_REG_MODE_SEL update failed\n",__func__);
  224. /* Torch OFF */
  225. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_I_TORCH1,
  226. MAX77828_TORCH_FLED1_EN);
  227. if(IS_ERR_VALUE(ret))
  228. pr_err("(%s) : MAX77828_LED_REG_I_TORCH1 update failed\n",__func__ );
  229. }
  230. else
  231. {
  232. if(brightness > 0x7E)
  233. brightness = 0x7E;
  234. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_DCDC_CNTL1,
  235. MAX77828_DCDC_MODE_PAM|0xC0);
  236. if(IS_ERR_VALUE(ret))
  237. pr_err("(%s) : MAX77828_LED_REG_DCDC_CNTL1 write failed\n",__func__);
  238. /* mode select */
  239. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_MODE_SEL,0xB1);
  240. if(IS_ERR_VALUE(ret))
  241. pr_err("(%s) : MAX77828_LED_REG_MODE_SEL update failed\n",__func__);
  242. /* Torch ON, Set Current */
  243. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_I_TORCH1,
  244. MAX77828_TORCH_FLED1_EN |
  245. ((unsigned int)brightness << max77828_set_bit(MAX77828_TORCH_IOUT)));
  246. if(IS_ERR_VALUE(ret))
  247. pr_err("(%s) : MAX77828_LED_REG_I_TORCH1 write failed\n",__func__ );
  248. }
  249. return;
  250. }
  251. static int max77828_rgb_blink(struct led_classdev *led_cdev, unsigned long
  252. *delay_on, unsigned long *delay_off)
  253. {
  254. u8 val;
  255. int ret;
  256. struct max77828_led_data *led_data = container_of(led_cdev, struct max77828_led_data, led);
  257. if(*delay_on==0 && *delay_off==0)
  258. {
  259. ret = max77828_read_reg(led_data->i2c, MAX77828_LED_REG_LEDBLNK, &val);
  260. if(IS_ERR_VALUE(ret))
  261. pr_err("(%s) : LED Enable Bit read failed\n",__func__ );
  262. printk("(%s) LED Blink reg (0x%02x)\n",__func__,val);
  263. *delay_on = (val & MAX77828_LEDBLINKD) * 200;
  264. val = (val & MAX77828_LEDBLINKP);
  265. printk("(%s) LED Blink reg (blink pd. : 0x%02x)(delay: 0x%02lx)\n",__func__,val, *delay_on);
  266. if(val <= 0x0A)
  267. val = val * 500 + 1000;
  268. else if (val <= 0x0C)
  269. val = (val - 0x0A) * 1000 + 6000;
  270. else if (val <= 0x0E)
  271. val = (val - 0x0C) * 2000 + 8000;
  272. else
  273. val = *delay_on;
  274. *delay_off = val - *delay_on;
  275. }
  276. else
  277. {
  278. if (unlikely(*delay_on > 3000))
  279. return -EINVAL;
  280. val = *delay_on + *delay_off;
  281. if (val <= 6000)
  282. val = (val - 1000) / 500;
  283. else if (val < 8000)
  284. val = (val - 6000) / 1000;
  285. else if (val < 12000)
  286. val = (val - 8000) / 2000;
  287. else
  288. return -EINVAL;
  289. val |= (*delay_on / 200);
  290. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_LEDBLNK, val);
  291. if(IS_ERR_VALUE(ret))
  292. {
  293. pr_err("(%s) : LED write failed\n",__func__ );
  294. return ret;
  295. }
  296. }
  297. return 0;
  298. }
  299. static ssize_t store_max77828_rgb_blink(struct device *dev, struct device_attribute *devattr,
  300. const char *buf, size_t count)
  301. {
  302. int retval;
  303. enum led_brightness ledb = LED_OFF;
  304. unsigned int led_brightness = 0;
  305. unsigned long delay_on_time = 0;
  306. unsigned long delay_off_time = 0;
  307. struct led_classdev *led_cdev = dev_get_drvdata(dev);
  308. struct max77828_led_data *led_data = container_of(led_cdev, struct max77828_led_data, led);
  309. retval = sscanf(buf, "0x%x %ld %ld", &led_brightness, &delay_on_time, &delay_off_time);
  310. if (retval == 0) {
  311. printk("fail to get led_blink value.\n");
  312. return count;
  313. }
  314. if(led_brightness > 0 && led_brightness <=127)
  315. ledb = LED_HALF;
  316. else if (led_brightness > 127)
  317. ledb = LED_FULL;
  318. led_data->led.brightness_set(led_cdev, ledb);
  319. led_data->led.blink_set (led_cdev, &delay_on_time, &delay_off_time);
  320. return count;
  321. }
  322. static void max77828_rgb_set(struct max77828_led_data *led_data)
  323. {
  324. int ret;
  325. int id = led_data->data->id;
  326. u8 reg;
  327. u8 bit = 0;
  328. switch(id)
  329. {
  330. case MAX77828_RGB_R:
  331. reg = MAX77828_LED_REG_LED1BRT;
  332. bit = 1<<1;
  333. break;
  334. case MAX77828_RGB_G:
  335. reg = MAX77828_LED_REG_LED2BRT;
  336. bit = 1<<2;
  337. break;
  338. case MAX77828_RGB_B:
  339. reg = MAX77828_LED_REG_LED3BRT;
  340. bit = 1<<3;
  341. break;
  342. default :
  343. printk("(%s) : Not valid LED ID\n",__func__);
  344. break;
  345. }
  346. if((enum led_brightness)led_data->test_brightness == LED_OFF)
  347. {
  348. printk("(%s) LED_OFF\n",__func__);
  349. /* LED OFF */
  350. ret = max77828_update_reg(led_data->i2c, MAX77828_LED_REG_LEDEN, 0, bit);
  351. if(IS_ERR_VALUE(ret))
  352. pr_err("(%s) : LED Bit 0x%02x update failed\n",__func__, bit );
  353. }
  354. else
  355. {
  356. /* Set Current*/
  357. ret = max77828_write_reg(led_data->i2c, reg, (unsigned int)led_data->test_brightness);
  358. if(IS_ERR_VALUE(ret))
  359. pr_err("(%s) : write failed\n",__func__);
  360. /* LEDBLNK ON */
  361. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_LEDBLNK, 0x50);
  362. if(IS_ERR_VALUE(ret))
  363. pr_err("(%s) : LED Bit %x update failed\n",__func__, bit );
  364. /* LEDRMP ON */
  365. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_LEDRMP, 0x00);
  366. if(IS_ERR_VALUE(ret))
  367. pr_err("(%s) : LED Bit %x update failed\n",__func__, bit );
  368. ret = max77828_read_reg(led_data->i2c, MAX77828_LED_REG_LEDEN, &reg);
  369. bit |= reg;
  370. /* LED ON */
  371. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_LEDEN, bit);
  372. if(IS_ERR_VALUE(ret))
  373. pr_err("(%s) : LED Bit %x update failed\n",__func__, bit );
  374. }
  375. return;
  376. }
  377. #ifdef SEC_LED_SPECIFIC
  378. static ssize_t max77828_led_r(struct device *dev,
  379. struct device_attribute *devattr, const char *buf, size_t count)
  380. {
  381. struct led_classdev *led_cdev = dev_get_drvdata(dev);
  382. struct max77828_led_data *led_data = container_of(led_cdev, struct max77828_led_data, led);
  383. int ret;
  384. int brightness;
  385. ret = kstrtoint(buf, 0, &brightness);
  386. if (ret != 0){
  387. printk("fail to get brightness.\n");
  388. goto out;
  389. }
  390. led_data->test_brightness = brightness;
  391. led_data->data->id = MAX77828_RGB_R;
  392. max77828_rgb_set(led_data);
  393. out:
  394. return count;
  395. }
  396. static ssize_t max77828_led_g(struct device *dev,
  397. struct device_attribute *devattr, const char *buf, size_t count)
  398. {
  399. struct led_classdev *led_cdev = dev_get_drvdata(dev);
  400. struct max77828_led_data *led_data = container_of(led_cdev, struct max77828_led_data, led);
  401. int ret;
  402. int brightness;
  403. ret = kstrtoint(buf, 0, &brightness);
  404. if (ret != 0){
  405. printk("fail to get brightness.\n");
  406. goto out;
  407. }
  408. led_data->test_brightness = brightness;
  409. led_data->data->id = MAX77828_RGB_G;
  410. max77828_rgb_set(led_data);
  411. out:
  412. return count;
  413. }
  414. static ssize_t max77828_led_b(struct device *dev,
  415. struct device_attribute *devattr, const char *buf, size_t count)
  416. {
  417. struct led_classdev *led_cdev = dev_get_drvdata(dev);
  418. struct max77828_led_data *led_data = container_of(led_cdev, struct max77828_led_data, led);
  419. int ret;
  420. int brightness;
  421. ret = kstrtoint(buf, 0, &brightness);
  422. if (ret != 0){
  423. printk("fail to get brightness.\n");
  424. goto out;
  425. }
  426. led_data->test_brightness = brightness;
  427. led_data->data->id = MAX77828_RGB_B;
  428. max77828_rgb_set(led_data);
  429. out:
  430. return count;
  431. }
  432. #endif
  433. static void led_set(struct max77828_led_data *led_data)
  434. {
  435. struct max77828_led *data = led_data->data;
  436. int id = data->id;
  437. print_all_reg_value(led_data->i2c);
  438. switch(id)
  439. {
  440. case MAX77828_FLASH:
  441. max77828_flash_set(led_data);
  442. break;
  443. case MAX77828_TORCH:
  444. max77828_torch_set(led_data);
  445. break;
  446. case MAX77828_RGB_R :
  447. case MAX77828_RGB_G :
  448. case MAX77828_RGB_B :
  449. max77828_rgb_set(led_data);
  450. break;
  451. default:
  452. pr_err("(%s) : LED id is not valid\n",__func__);
  453. break;
  454. }
  455. return;
  456. }
  457. static void max77828_led_work(struct work_struct *work)
  458. {
  459. struct max77828_led_data *led_data
  460. = container_of(work, struct max77828_led_data, work);
  461. DEBUG_MAX77828("[LED] %s\n", __func__);
  462. mutex_lock(&led_data->lock);
  463. led_set(led_data);
  464. mutex_unlock(&led_data->lock);
  465. }
  466. static int max77828_led_hw_setup(struct max77828_led_data *led_data)
  467. {
  468. int value = 0;
  469. int ret;
  470. int mode;
  471. if (led_data->data->id == MAX77828_FLASH)
  472. mode = 0x01; /*Flash triggered via FLASHEN*/
  473. else
  474. mode = 0x02; /*Torch triggered via TORCHEN*/
  475. if (flash_torch_en) {
  476. if (mode == 0x01) {
  477. ret = gpio_request(led_flash_en, "max77828_flash_en");
  478. if (ret)
  479. pr_err("can't get max77828_flash_en");
  480. else {
  481. DEBUG_MAX77828("[LED] %s: max77828_flash_en set 0\n", __func__);
  482. gpio_direction_output(led_flash_en, 0);
  483. gpio_free(led_flash_en);
  484. }
  485. }
  486. if (mode == 0x02) {
  487. ret = gpio_request(led_torch_en, "max77828_torch_en");
  488. if (ret)
  489. pr_err("can't get max77828_torch_en");
  490. else {
  491. DEBUG_MAX77828("[LED] %s: max77828_torch_en set 0\n", __func__);
  492. gpio_direction_output(led_torch_en, 0);
  493. gpio_free(led_torch_en);
  494. }
  495. }
  496. } else
  497. pr_err("%s : can't find gpio", __func__);
  498. /* pin control setting */
  499. value = MAX77828_TORCH_MD_TORCHEN|MAX77828_TORCHEN_PD|
  500. MAX77828_FLASH_MD_FLASHSTB|MAX77828_FLASHSTB_PD;
  501. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_MODE_SEL, value);
  502. if (IS_ERR_VALUE(ret))
  503. return ret;
  504. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_DCDC_CNTL1,
  505. MAX77828_DCDC_MODE_FAM|0xC0);
  506. if(IS_ERR_VALUE(ret))
  507. pr_err("(%s) : MAX77828_LED_REG_DCDC_CNTL1 write failed\n",__func__);
  508. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_DCDC_CNTL2, 0x14);
  509. if(IS_ERR_VALUE(ret))
  510. pr_err("(%s) : MAX77828_LED_REG_DCDC_CNTL2 write failed\n",__func__);
  511. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_DCDC_ILIM, 0xC0);
  512. if(IS_ERR_VALUE(ret))
  513. pr_err("(%s) : MAX77828_LED_REG_DCDC_ILIM write failed\n",__func__);
  514. if (fdata->enable_maxflash)
  515. {
  516. if (fdata->maxflash_rising_timer > 4096 || fdata->maxflash_rising_timer > 4096)
  517. return -EINVAL;
  518. value = ((fdata->maxflash_rising_timer / 256 - 1) << max77828_set_bit(MAX77828_LB_TMR_R)) |
  519. ((fdata->maxflash_falling_timer / 256 - 1) << max77828_set_bit(MAX77828_LB_TMR_F));
  520. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_MAXFLASH1, value);
  521. if (IS_ERR_VALUE(ret))
  522. return ret;
  523. switch(fdata->maxflash_hysteresis)
  524. {
  525. case 0:
  526. value = 0;
  527. break;
  528. case 50000:
  529. value = 1;
  530. break;
  531. case 100000:
  532. value = 2;
  533. break;
  534. case 300000:
  535. value = 6;
  536. break;
  537. case 350000:
  538. value = 7;
  539. break;
  540. default:
  541. return -EINVAL;
  542. }
  543. if (likely(fdata->maxflash_threshold >= 2400000 && fdata->maxflash_threshold <= 3400000))
  544. value |= (((fdata->maxflash_threshold - 2400000) / 33000 + 1) << max77828_set_bit(MAX77828_MAXFLASH_HYS));
  545. else
  546. return -EINVAL;
  547. }
  548. else
  549. value = 0;
  550. return ret;
  551. }
  552. static int max77828_led_setup(struct max77828_led_data *led_data)
  553. {
  554. int ret = 0;
  555. struct max77828_led *data = led_data->data;
  556. int id = data->id;
  557. int value;
  558. int i;
  559. DEBUG_MAX77828("[LED] %s : id - %d\n", __func__,id);
  560. switch(id)
  561. {
  562. case MAX77828_FLASH:
  563. max77828_led_hw_setup(led_data);
  564. /* ramp up/down setting */
  565. for (i = 0; i < ARRAY_SIZE(flash_ramp); i++)
  566. if (fdata->flash_ramp_up <= flash_ramp[i])
  567. break;
  568. if (unlikely(i == ARRAY_SIZE(flash_ramp)))
  569. return -EINVAL;
  570. value = (unsigned int)i << max77828_set_bit(MAX77828_FLASH_RU);
  571. for (i = 0; i < ARRAY_SIZE(flash_ramp); i++)
  572. if (fdata->flash_ramp_down <= flash_ramp[i])
  573. break;
  574. if (unlikely(i == ARRAY_SIZE(flash_ramp)))
  575. return -EINVAL;
  576. value |= (unsigned int)i << max77828_set_bit(MAX77828_FLASH_RD);
  577. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_FLASH_RAMP_SEL, value);
  578. if (IS_ERR_VALUE(ret))
  579. return ret;
  580. /* flash timer control */
  581. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_FLASH_TMR_CNTL, 0x7F);
  582. if (IS_ERR_VALUE(ret))
  583. return ret;
  584. /* MAXFLASH setting */
  585. value = 0x09;
  586. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_MAXFLASH1, value);
  587. if (IS_ERR_VALUE(ret))
  588. return ret;
  589. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_I_FLASH1, 0x80);
  590. if (IS_ERR_VALUE(ret))
  591. pr_err("(%s) : MAX77828_LED_REG_I_FLASH1 write failed\n",__func__);
  592. break;
  593. case MAX77828_TORCH:
  594. max77828_led_hw_setup(led_data);
  595. for (i = 0; i < ARRAY_SIZE(torch_ramp); i++)
  596. if (fdata->flash_ramp_up <= torch_ramp[i])
  597. break;
  598. if (unlikely(i == ARRAY_SIZE(torch_ramp)))
  599. return -EINVAL;
  600. value = (unsigned int)i << max77828_set_bit(MAX77828_TORCH_RU);
  601. for (i = 0; i < ARRAY_SIZE(torch_ramp); i++)
  602. if (fdata->flash_ramp_down <= torch_ramp[i])
  603. break;
  604. if (unlikely(i == ARRAY_SIZE(torch_ramp)))
  605. return -EINVAL;
  606. value |= (unsigned int)i << max77828_set_bit(MAX77828_TORCH_RD);
  607. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_FLASH_RAMP_SEL, value);
  608. if (IS_ERR_VALUE(ret))
  609. return ret;
  610. /* torch timer control */
  611. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_TORCH_TMR_CNTL, 0x80);
  612. if (IS_ERR_VALUE(ret))
  613. return ret;
  614. /* MAXFLASH setting */
  615. value = 0x09;
  616. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_MAXFLASH1, value);
  617. if (IS_ERR_VALUE(ret))
  618. return ret;
  619. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_I_TORCH1, 0x80);
  620. if(IS_ERR_VALUE(ret))
  621. pr_err("(%s) : MAX77828_LED_REG_I_TORCH1 write failed\n",__func__);
  622. break;
  623. case MAX77828_RGB_R:
  624. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_LEDEN, 0x02);
  625. if (IS_ERR_VALUE(ret))
  626. return ret;
  627. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_LED0BRT, 0xFF);
  628. if (IS_ERR_VALUE(ret))
  629. return ret;
  630. break;
  631. case MAX77828_RGB_G:
  632. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_LED1BRT, 0x00);
  633. if (IS_ERR_VALUE(ret))
  634. return ret;
  635. break;
  636. case MAX77828_RGB_B:
  637. ret = max77828_write_reg(led_data->i2c, MAX77828_LED_REG_LED2BRT, 0x00);
  638. if (IS_ERR_VALUE(ret))
  639. return ret;
  640. break;
  641. default :
  642. printk("Error : No such LED present\n");
  643. break;
  644. }
  645. return ret;
  646. }
  647. static ssize_t max77828_flash(struct device *dev,
  648. struct device_attribute *attr, const char *buf, size_t size)
  649. {
  650. struct led_classdev *led_cdev = dev_get_drvdata(dev);
  651. struct max77828_led_data *led_data = container_of(led_cdev, struct max77828_led_data, led);
  652. ssize_t ret = -EINVAL;
  653. char *after;
  654. unsigned long state = simple_strtoul(buf, &after, 10);
  655. size_t count = after - buf;
  656. DEBUG_MAX77828("[LED] %s\n", __func__);
  657. if (isspace(*after))
  658. count++;
  659. if (count == size) {
  660. ret = count;
  661. led_data->data->id = MAX77828_FLASH;
  662. if (state > led_cdev->max_brightness)
  663. state = led_cdev->max_brightness;
  664. led_cdev->brightness = state;
  665. DEBUG_MAX77828("[LED] %s : led_cdev->brightness %d\n",
  666. __func__, led_cdev->brightness);
  667. led_data->test_brightness = state;
  668. if (!(led_cdev->flags & LED_SUSPENDED))
  669. max77828_torch_set(led_data);
  670. }
  671. return ret;
  672. }
  673. static DEVICE_ATTR(rear_flash, S_IWUSR|S_IWGRP|S_IROTH,
  674. NULL, max77828_flash);
  675. #ifdef SEC_LED_SPECIFIC
  676. static DEVICE_ATTR(led_blink, 0664, NULL, store_max77828_rgb_blink);
  677. static DEVICE_ATTR(led_r, 0664, NULL, max77828_led_r);
  678. static DEVICE_ATTR(led_g, 0664, NULL, max77828_led_g);
  679. static DEVICE_ATTR(led_b, 0664, NULL, max77828_led_b);
  680. static struct attribute *sec_led_attributes[] = {
  681. &dev_attr_led_blink.attr,
  682. &dev_attr_led_r.attr,
  683. &dev_attr_led_g.attr,
  684. &dev_attr_led_b.attr,
  685. NULL,
  686. };
  687. static struct attribute_group sec_led_attr_group = {
  688. .attrs = sec_led_attributes,
  689. };
  690. #endif
  691. static int max77828_led_probe(struct platform_device *pdev)
  692. {
  693. int ret = 0;
  694. int i,j;
  695. struct max77828_dev *max77828 = dev_get_drvdata(pdev->dev.parent);
  696. struct max77828_platform_data *max77828_pdata
  697. = dev_get_platdata(max77828->dev);
  698. struct max77828_led_platform_data *pdata = max77828_pdata->led_data;
  699. struct max77828_led_data *led_data;
  700. struct max77828_led *data;
  701. struct max77828_led_data **led_datas;
  702. pr_err("max77828_led_probe\n");
  703. if (pdata == NULL) {
  704. pr_err("[LED] no platform data for this led is found\n");
  705. return -EFAULT;
  706. }
  707. led_datas = kzalloc(sizeof(struct max77828_led_data *)
  708. * MAX77828_LED_MAX, GFP_KERNEL);
  709. if (unlikely(!led_datas)) {
  710. pr_err("[LED] memory allocation error %s", __func__);
  711. return -ENOMEM;
  712. }
  713. platform_set_drvdata(pdev, led_datas);
  714. fdata = kzalloc(sizeof(struct max77828_flash_platform_data), GFP_KERNEL);
  715. if (unlikely(fdata == NULL))
  716. return (-ENOMEM);
  717. fdata->flash_ramp_up = 16512;
  718. fdata->flash_ramp_down = 16512;
  719. fdata->torch_ramp_up = 32776;
  720. fdata->torch_ramp_up = 32776;
  721. fdata->enable_maxflash = 1;
  722. fdata->maxflash_rising_timer = 4096;
  723. fdata->maxflash_falling_timer = 256;
  724. fdata->maxflash_hysteresis = 50000;
  725. fdata->maxflash_threshold = 2400000;
  726. if (led_torch_en && led_flash_en) {
  727. DEBUG_MAX77828("[LED] %s, led_torch %d, led_flash %d\n", __func__,
  728. led_torch_en, led_flash_en);
  729. flash_torch_en = 1;
  730. } else {
  731. pr_err("%s : can't find gpio", __func__);
  732. flash_torch_en = 0;
  733. }
  734. for (i = 0; i != pdata->num_leds; ++i)
  735. {
  736. data = &(pdata->leds[i]);
  737. led_data = kzalloc(sizeof(struct max77828_led_data),
  738. GFP_KERNEL);
  739. led_datas[i] = led_data;
  740. if (unlikely(!led_data)) {
  741. pr_err("[LED] memory allocation error %s\n", __func__);
  742. ret = -ENOMEM;
  743. continue;
  744. }
  745. led_data->max77828 = max77828;
  746. led_data->i2c = max77828->led;
  747. led_data->data = data;
  748. led_data->led.name = data->name;
  749. led_data->led.brightness_set = max77828_led_set;
  750. led_data->led.brightness = LED_OFF;
  751. led_data->brightness = data->brightness;
  752. led_data->led.flags = 0;
  753. led_data->led.max_brightness = 0xFF;
  754. for(j = 2; j != pdata->num_leds; ++j)
  755. led_data->led.blink_set = max77828_rgb_blink;
  756. mutex_init(&led_data->lock);
  757. spin_lock_init(&led_data->value_lock);
  758. INIT_WORK(&led_data->work, max77828_led_work);
  759. ret = led_classdev_register(&pdev->dev, &led_data->led);
  760. if (unlikely(ret)) {
  761. pr_err("unable to register LED\n");
  762. kfree(led_data);
  763. ret = -EFAULT;
  764. continue;
  765. }
  766. ret = max77828_led_setup(led_data);
  767. if (unlikely(ret)) {
  768. pr_err("unable to register LED\n");
  769. mutex_destroy(&led_data->lock);
  770. led_classdev_unregister(&led_data->led);
  771. kfree(led_data);
  772. ret = -EFAULT;
  773. }
  774. }
  775. // ret = max77828_led_hw_setup(led_data);
  776. #if defined(DEBUG_FLASH)
  777. print_all_reg_value(max77828->led);
  778. (void) debugfs_create_file("max77828-led-regs", S_IRUGO, NULL,
  779. (void *)max77828, &max77828_debugfs_fops);
  780. #endif
  781. if (!IS_ERR(camera_class)) {
  782. flash_dev = device_create(camera_class, NULL, 0, led_datas[0], "flash");
  783. if (flash_dev < 0)
  784. pr_err("Failed to create device(flash)!\n");
  785. if (device_create_file(flash_dev, &dev_attr_rear_flash) < 0) {
  786. pr_err("failed to create device file, %s\n",
  787. dev_attr_rear_flash.attr.name);
  788. }
  789. #ifdef CONFIG_LEDS_SEPERATE_MOVIE_FLASH
  790. if (device_create_file(flash_dev, &dev_attr_movie_brightness) < 0) {
  791. pr_err("failed to create device file, %s\n",
  792. dev_attr_movie_brightness.attr.name);
  793. }
  794. #endif
  795. } else
  796. pr_err("Failed to create device(flash) because of nothing camera class!\n");
  797. #ifdef CONFIG_LEDS_SWITCH
  798. if (system_rev < FLASH_SWITCH_REMOVED_REVISION) {
  799. if (gpio_request(GPIO_CAM_SW_EN, "CAM_SW_EN"))
  800. pr_err("failed to request CAM_SW_EN\n");
  801. else
  802. gpio_direction_output(GPIO_CAM_SW_EN, 1);
  803. }
  804. #endif
  805. #ifdef SEC_LED_SPECIFIC
  806. led_dev = device_create(sec_class, NULL, 0, led_data, "led");
  807. if (IS_ERR(led_dev)) {
  808. printk("Failed to create device for samsung specific led\n");
  809. ret = -ENODEV;
  810. goto exit;
  811. }
  812. ret = sysfs_create_group(&led_dev->kobj, &sec_led_attr_group);
  813. if (ret) {
  814. printk("Failed to create sysfs group for samsung specific led\n");
  815. goto exit;
  816. }
  817. return ret;
  818. exit:
  819. device_destroy(sec_class, 0);
  820. #endif
  821. return ret;
  822. }
  823. static int __devexit max77828_led_remove(struct platform_device *pdev)
  824. {
  825. struct max77828_led_data **led_datas = platform_get_drvdata(pdev);
  826. int i;
  827. for (i = 0; i != MAX77828_LED_MAX; ++i) {
  828. if (led_datas[i] == NULL)
  829. continue;
  830. cancel_work_sync(&led_datas[i]->work);
  831. mutex_destroy(&led_datas[i]->lock);
  832. led_classdev_unregister(&led_datas[i]->led);
  833. kfree(led_datas[i]);
  834. }
  835. kfree(led_datas);
  836. kfree(fdata);
  837. device_remove_file(flash_dev, &dev_attr_rear_flash);
  838. #ifdef CONFIG_LEDS_SEPERATE_MOVIE_FLASH
  839. device_remove_file(flash_dev, &dev_attr_movie_brightness);
  840. #endif
  841. device_destroy(camera_class, 0);
  842. class_destroy(camera_class);
  843. #ifdef SEC_LED_SPECIFIC
  844. sysfs_remove_group(&led_dev->kobj, &sec_led_attr_group);
  845. #endif
  846. return 0;
  847. }
  848. void max77828_led_shutdown(struct device *dev)
  849. {
  850. }
  851. static struct platform_driver max77828_led_driver = {
  852. .probe = max77828_led_probe,
  853. .remove = __devexit_p(max77828_led_remove),
  854. .driver = {
  855. .name = "max77828-led",
  856. .owner = THIS_MODULE,
  857. .shutdown = max77828_led_shutdown,
  858. },
  859. };
  860. static int __init max77828_led_init(void)
  861. {
  862. return platform_driver_register(&max77828_led_driver);
  863. }
  864. module_init(max77828_led_init);
  865. static void __exit max77828_led_exit(void)
  866. {
  867. platform_driver_unregister(&max77828_led_driver);
  868. }
  869. module_exit(max77828_led_exit);
  870. MODULE_AUTHOR("Ravi Shekhar Singh <shekhar.sr@samsung.com>");
  871. MODULE_DESCRIPTION("MAX77828 LED driver");
  872. MODULE_LICENSE("GPL");