leds-lm3533.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779
  1. /*
  2. * leds-lm3533.c -- LM3533 LED driver
  3. *
  4. * Copyright (C) 2011-2012 Texas Instruments
  5. *
  6. * Author: Johan Hovold <jhovold@gmail.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. #include <linux/module.h>
  14. #include <linux/leds.h>
  15. #include <linux/mfd/core.h>
  16. #include <linux/mutex.h>
  17. #include <linux/platform_device.h>
  18. #include <linux/slab.h>
  19. #include <linux/workqueue.h>
  20. #include <linux/mfd/lm3533.h>
  21. #define LM3533_LVCTRLBANK_MIN 2
  22. #define LM3533_LVCTRLBANK_MAX 5
  23. #define LM3533_LVCTRLBANK_COUNT 4
  24. #define LM3533_RISEFALLTIME_MAX 7
  25. #define LM3533_ALS_CHANNEL_LV_MIN 1
  26. #define LM3533_ALS_CHANNEL_LV_MAX 2
  27. #define LM3533_REG_CTRLBANK_BCONF_BASE 0x1b
  28. #define LM3533_REG_PATTERN_ENABLE 0x28
  29. #define LM3533_REG_PATTERN_LOW_TIME_BASE 0x71
  30. #define LM3533_REG_PATTERN_HIGH_TIME_BASE 0x72
  31. #define LM3533_REG_PATTERN_RISETIME_BASE 0x74
  32. #define LM3533_REG_PATTERN_FALLTIME_BASE 0x75
  33. #define LM3533_REG_PATTERN_STEP 0x10
  34. #define LM3533_REG_CTRLBANK_BCONF_MAPPING_MASK 0x04
  35. #define LM3533_REG_CTRLBANK_BCONF_ALS_EN_MASK 0x02
  36. #define LM3533_REG_CTRLBANK_BCONF_ALS_CHANNEL_MASK 0x01
  37. #define LM3533_LED_FLAG_PATTERN_ENABLE 1
  38. struct lm3533_led {
  39. struct lm3533 *lm3533;
  40. struct lm3533_ctrlbank cb;
  41. struct led_classdev cdev;
  42. int id;
  43. struct mutex mutex;
  44. unsigned long flags;
  45. struct work_struct work;
  46. u8 new_brightness;
  47. };
  48. static inline struct lm3533_led *to_lm3533_led(struct led_classdev *cdev)
  49. {
  50. return container_of(cdev, struct lm3533_led, cdev);
  51. }
  52. static inline int lm3533_led_get_ctrlbank_id(struct lm3533_led *led)
  53. {
  54. return led->id + 2;
  55. }
  56. static inline u8 lm3533_led_get_lv_reg(struct lm3533_led *led, u8 base)
  57. {
  58. return base + led->id;
  59. }
  60. static inline u8 lm3533_led_get_pattern(struct lm3533_led *led)
  61. {
  62. return led->id;
  63. }
  64. static inline u8 lm3533_led_get_pattern_reg(struct lm3533_led *led,
  65. u8 base)
  66. {
  67. return base + lm3533_led_get_pattern(led) * LM3533_REG_PATTERN_STEP;
  68. }
  69. static int lm3533_led_pattern_enable(struct lm3533_led *led, int enable)
  70. {
  71. u8 mask;
  72. u8 val;
  73. int pattern;
  74. int state;
  75. int ret = 0;
  76. dev_dbg(led->cdev.dev, "%s - %d\n", __func__, enable);
  77. mutex_lock(&led->mutex);
  78. state = test_bit(LM3533_LED_FLAG_PATTERN_ENABLE, &led->flags);
  79. if ((enable && state) || (!enable && !state))
  80. goto out;
  81. pattern = lm3533_led_get_pattern(led);
  82. mask = 1 << (2 * pattern);
  83. if (enable)
  84. val = mask;
  85. else
  86. val = 0;
  87. ret = lm3533_update(led->lm3533, LM3533_REG_PATTERN_ENABLE, val, mask);
  88. if (ret) {
  89. dev_err(led->cdev.dev, "failed to enable pattern %d (%d)\n",
  90. pattern, enable);
  91. goto out;
  92. }
  93. __change_bit(LM3533_LED_FLAG_PATTERN_ENABLE, &led->flags);
  94. out:
  95. mutex_unlock(&led->mutex);
  96. return ret;
  97. }
  98. static void lm3533_led_work(struct work_struct *work)
  99. {
  100. struct lm3533_led *led = container_of(work, struct lm3533_led, work);
  101. dev_dbg(led->cdev.dev, "%s - %u\n", __func__, led->new_brightness);
  102. if (led->new_brightness == 0)
  103. lm3533_led_pattern_enable(led, 0); /* disable blink */
  104. lm3533_ctrlbank_set_brightness(&led->cb, led->new_brightness);
  105. }
  106. static void lm3533_led_set(struct led_classdev *cdev,
  107. enum led_brightness value)
  108. {
  109. struct lm3533_led *led = to_lm3533_led(cdev);
  110. dev_dbg(led->cdev.dev, "%s - %d\n", __func__, value);
  111. led->new_brightness = value;
  112. schedule_work(&led->work);
  113. }
  114. static enum led_brightness lm3533_led_get(struct led_classdev *cdev)
  115. {
  116. struct lm3533_led *led = to_lm3533_led(cdev);
  117. u8 val;
  118. int ret;
  119. ret = lm3533_ctrlbank_get_brightness(&led->cb, &val);
  120. if (ret)
  121. return ret;
  122. dev_dbg(led->cdev.dev, "%s - %u\n", __func__, val);
  123. return val;
  124. }
  125. /* Pattern generator defines (delays in us). */
  126. #define LM3533_LED_DELAY1_VMIN 0x00
  127. #define LM3533_LED_DELAY2_VMIN 0x3d
  128. #define LM3533_LED_DELAY3_VMIN 0x80
  129. #define LM3533_LED_DELAY1_VMAX (LM3533_LED_DELAY2_VMIN - 1)
  130. #define LM3533_LED_DELAY2_VMAX (LM3533_LED_DELAY3_VMIN - 1)
  131. #define LM3533_LED_DELAY3_VMAX 0xff
  132. #define LM3533_LED_DELAY1_TMIN 16384U
  133. #define LM3533_LED_DELAY2_TMIN 1130496U
  134. #define LM3533_LED_DELAY3_TMIN 10305536U
  135. #define LM3533_LED_DELAY1_TMAX 999424U
  136. #define LM3533_LED_DELAY2_TMAX 9781248U
  137. #define LM3533_LED_DELAY3_TMAX 76890112U
  138. /* t_step = (t_max - t_min) / (v_max - v_min) */
  139. #define LM3533_LED_DELAY1_TSTEP 16384
  140. #define LM3533_LED_DELAY2_TSTEP 131072
  141. #define LM3533_LED_DELAY3_TSTEP 524288
  142. /* Delay limits for hardware accelerated blinking (in ms). */
  143. #define LM3533_LED_DELAY_ON_MAX \
  144. ((LM3533_LED_DELAY2_TMAX + LM3533_LED_DELAY2_TSTEP / 2) / 1000)
  145. #define LM3533_LED_DELAY_OFF_MAX \
  146. ((LM3533_LED_DELAY3_TMAX + LM3533_LED_DELAY3_TSTEP / 2) / 1000)
  147. /*
  148. * Returns linear map of *t from [t_min,t_max] to [v_min,v_max] with a step
  149. * size of t_step, where
  150. *
  151. * t_step = (t_max - t_min) / (v_max - v_min)
  152. *
  153. * and updates *t to reflect the mapped value.
  154. */
  155. static u8 time_to_val(unsigned *t, unsigned t_min, unsigned t_step,
  156. u8 v_min, u8 v_max)
  157. {
  158. unsigned val;
  159. val = (*t + t_step / 2 - t_min) / t_step + v_min;
  160. *t = t_step * (val - v_min) + t_min;
  161. return (u8)val;
  162. }
  163. /*
  164. * Returns time code corresponding to *delay (in ms) and updates *delay to
  165. * reflect actual hardware delay.
  166. *
  167. * Hardware supports 256 discrete delay times, divided into three groups with
  168. * the following ranges and step-sizes:
  169. *
  170. * [ 16, 999] [0x00, 0x3e] step 16 ms
  171. * [ 1130, 9781] [0x3d, 0x7f] step 131 ms
  172. * [10306, 76890] [0x80, 0xff] step 524 ms
  173. *
  174. * Note that delay group 3 is only available for delay_off.
  175. */
  176. static u8 lm3533_led_get_hw_delay(unsigned *delay)
  177. {
  178. unsigned t;
  179. u8 val;
  180. t = *delay * 1000;
  181. if (t >= (LM3533_LED_DELAY2_TMAX + LM3533_LED_DELAY3_TMIN) / 2) {
  182. t = clamp(t, LM3533_LED_DELAY3_TMIN, LM3533_LED_DELAY3_TMAX);
  183. val = time_to_val(&t, LM3533_LED_DELAY3_TMIN,
  184. LM3533_LED_DELAY3_TSTEP,
  185. LM3533_LED_DELAY3_VMIN,
  186. LM3533_LED_DELAY3_VMAX);
  187. } else if (t >= (LM3533_LED_DELAY1_TMAX + LM3533_LED_DELAY2_TMIN) / 2) {
  188. t = clamp(t, LM3533_LED_DELAY2_TMIN, LM3533_LED_DELAY2_TMAX);
  189. val = time_to_val(&t, LM3533_LED_DELAY2_TMIN,
  190. LM3533_LED_DELAY2_TSTEP,
  191. LM3533_LED_DELAY2_VMIN,
  192. LM3533_LED_DELAY2_VMAX);
  193. } else {
  194. t = clamp(t, LM3533_LED_DELAY1_TMIN, LM3533_LED_DELAY1_TMAX);
  195. val = time_to_val(&t, LM3533_LED_DELAY1_TMIN,
  196. LM3533_LED_DELAY1_TSTEP,
  197. LM3533_LED_DELAY1_VMIN,
  198. LM3533_LED_DELAY1_VMAX);
  199. }
  200. *delay = (t + 500) / 1000;
  201. return val;
  202. }
  203. /*
  204. * Set delay register base to *delay (in ms) and update *delay to reflect
  205. * actual hardware delay used.
  206. */
  207. static u8 lm3533_led_delay_set(struct lm3533_led *led, u8 base,
  208. unsigned long *delay)
  209. {
  210. unsigned t;
  211. u8 val;
  212. u8 reg;
  213. int ret;
  214. t = (unsigned)*delay;
  215. /* Delay group 3 is only available for low time (delay off). */
  216. if (base != LM3533_REG_PATTERN_LOW_TIME_BASE)
  217. t = min(t, LM3533_LED_DELAY2_TMAX / 1000);
  218. val = lm3533_led_get_hw_delay(&t);
  219. dev_dbg(led->cdev.dev, "%s - %lu: %u (0x%02x)\n", __func__,
  220. *delay, t, val);
  221. reg = lm3533_led_get_pattern_reg(led, base);
  222. ret = lm3533_write(led->lm3533, reg, val);
  223. if (ret)
  224. dev_err(led->cdev.dev, "failed to set delay (%02x)\n", reg);
  225. *delay = t;
  226. return ret;
  227. }
  228. static int lm3533_led_delay_on_set(struct lm3533_led *led, unsigned long *t)
  229. {
  230. return lm3533_led_delay_set(led, LM3533_REG_PATTERN_HIGH_TIME_BASE, t);
  231. }
  232. static int lm3533_led_delay_off_set(struct lm3533_led *led, unsigned long *t)
  233. {
  234. return lm3533_led_delay_set(led, LM3533_REG_PATTERN_LOW_TIME_BASE, t);
  235. }
  236. static int lm3533_led_blink_set(struct led_classdev *cdev,
  237. unsigned long *delay_on,
  238. unsigned long *delay_off)
  239. {
  240. struct lm3533_led *led = to_lm3533_led(cdev);
  241. int ret;
  242. dev_dbg(led->cdev.dev, "%s - on = %lu, off = %lu\n", __func__,
  243. *delay_on, *delay_off);
  244. if (*delay_on > LM3533_LED_DELAY_ON_MAX ||
  245. *delay_off > LM3533_LED_DELAY_OFF_MAX)
  246. return -EINVAL;
  247. if (*delay_on == 0 && *delay_off == 0) {
  248. *delay_on = 500;
  249. *delay_off = 500;
  250. }
  251. ret = lm3533_led_delay_on_set(led, delay_on);
  252. if (ret)
  253. return ret;
  254. ret = lm3533_led_delay_off_set(led, delay_off);
  255. if (ret)
  256. return ret;
  257. return lm3533_led_pattern_enable(led, 1);
  258. }
  259. static ssize_t show_id(struct device *dev,
  260. struct device_attribute *attr, char *buf)
  261. {
  262. struct led_classdev *led_cdev = dev_get_drvdata(dev);
  263. struct lm3533_led *led = to_lm3533_led(led_cdev);
  264. return scnprintf(buf, PAGE_SIZE, "%d\n", led->id);
  265. }
  266. /*
  267. * Pattern generator rise/fall times:
  268. *
  269. * 0 - 2048 us (default)
  270. * 1 - 262 ms
  271. * 2 - 524 ms
  272. * 3 - 1.049 s
  273. * 4 - 2.097 s
  274. * 5 - 4.194 s
  275. * 6 - 8.389 s
  276. * 7 - 16.78 s
  277. */
  278. static ssize_t show_risefalltime(struct device *dev,
  279. struct device_attribute *attr,
  280. char *buf, u8 base)
  281. {
  282. struct led_classdev *led_cdev = dev_get_drvdata(dev);
  283. struct lm3533_led *led = to_lm3533_led(led_cdev);
  284. ssize_t ret;
  285. u8 reg;
  286. u8 val;
  287. reg = lm3533_led_get_pattern_reg(led, base);
  288. ret = lm3533_read(led->lm3533, reg, &val);
  289. if (ret)
  290. return ret;
  291. return scnprintf(buf, PAGE_SIZE, "%x\n", val);
  292. }
  293. static ssize_t show_risetime(struct device *dev,
  294. struct device_attribute *attr, char *buf)
  295. {
  296. return show_risefalltime(dev, attr, buf,
  297. LM3533_REG_PATTERN_RISETIME_BASE);
  298. }
  299. static ssize_t show_falltime(struct device *dev,
  300. struct device_attribute *attr, char *buf)
  301. {
  302. return show_risefalltime(dev, attr, buf,
  303. LM3533_REG_PATTERN_FALLTIME_BASE);
  304. }
  305. static ssize_t store_risefalltime(struct device *dev,
  306. struct device_attribute *attr,
  307. const char *buf, size_t len, u8 base)
  308. {
  309. struct led_classdev *led_cdev = dev_get_drvdata(dev);
  310. struct lm3533_led *led = to_lm3533_led(led_cdev);
  311. u8 val;
  312. u8 reg;
  313. int ret;
  314. if (kstrtou8(buf, 0, &val) || val > LM3533_RISEFALLTIME_MAX)
  315. return -EINVAL;
  316. reg = lm3533_led_get_pattern_reg(led, base);
  317. ret = lm3533_write(led->lm3533, reg, val);
  318. if (ret)
  319. return ret;
  320. return len;
  321. }
  322. static ssize_t store_risetime(struct device *dev,
  323. struct device_attribute *attr,
  324. const char *buf, size_t len)
  325. {
  326. return store_risefalltime(dev, attr, buf, len,
  327. LM3533_REG_PATTERN_RISETIME_BASE);
  328. }
  329. static ssize_t store_falltime(struct device *dev,
  330. struct device_attribute *attr,
  331. const char *buf, size_t len)
  332. {
  333. return store_risefalltime(dev, attr, buf, len,
  334. LM3533_REG_PATTERN_FALLTIME_BASE);
  335. }
  336. static ssize_t show_als_channel(struct device *dev,
  337. struct device_attribute *attr, char *buf)
  338. {
  339. struct led_classdev *led_cdev = dev_get_drvdata(dev);
  340. struct lm3533_led *led = to_lm3533_led(led_cdev);
  341. unsigned channel;
  342. u8 reg;
  343. u8 val;
  344. int ret;
  345. reg = lm3533_led_get_lv_reg(led, LM3533_REG_CTRLBANK_BCONF_BASE);
  346. ret = lm3533_read(led->lm3533, reg, &val);
  347. if (ret)
  348. return ret;
  349. channel = (val & LM3533_REG_CTRLBANK_BCONF_ALS_CHANNEL_MASK) + 1;
  350. return scnprintf(buf, PAGE_SIZE, "%u\n", channel);
  351. }
  352. static ssize_t store_als_channel(struct device *dev,
  353. struct device_attribute *attr,
  354. const char *buf, size_t len)
  355. {
  356. struct led_classdev *led_cdev = dev_get_drvdata(dev);
  357. struct lm3533_led *led = to_lm3533_led(led_cdev);
  358. unsigned channel;
  359. u8 reg;
  360. u8 val;
  361. u8 mask;
  362. int ret;
  363. if (kstrtouint(buf, 0, &channel))
  364. return -EINVAL;
  365. if (channel < LM3533_ALS_CHANNEL_LV_MIN ||
  366. channel > LM3533_ALS_CHANNEL_LV_MAX)
  367. return -EINVAL;
  368. reg = lm3533_led_get_lv_reg(led, LM3533_REG_CTRLBANK_BCONF_BASE);
  369. mask = LM3533_REG_CTRLBANK_BCONF_ALS_CHANNEL_MASK;
  370. val = channel - 1;
  371. ret = lm3533_update(led->lm3533, reg, val, mask);
  372. if (ret)
  373. return ret;
  374. return len;
  375. }
  376. static ssize_t show_als_en(struct device *dev,
  377. struct device_attribute *attr, char *buf)
  378. {
  379. struct led_classdev *led_cdev = dev_get_drvdata(dev);
  380. struct lm3533_led *led = to_lm3533_led(led_cdev);
  381. bool enable;
  382. u8 reg;
  383. u8 val;
  384. int ret;
  385. reg = lm3533_led_get_lv_reg(led, LM3533_REG_CTRLBANK_BCONF_BASE);
  386. ret = lm3533_read(led->lm3533, reg, &val);
  387. if (ret)
  388. return ret;
  389. enable = val & LM3533_REG_CTRLBANK_BCONF_ALS_EN_MASK;
  390. return scnprintf(buf, PAGE_SIZE, "%d\n", enable);
  391. }
  392. static ssize_t store_als_en(struct device *dev,
  393. struct device_attribute *attr,
  394. const char *buf, size_t len)
  395. {
  396. struct led_classdev *led_cdev = dev_get_drvdata(dev);
  397. struct lm3533_led *led = to_lm3533_led(led_cdev);
  398. unsigned enable;
  399. u8 reg;
  400. u8 mask;
  401. u8 val;
  402. int ret;
  403. if (kstrtouint(buf, 0, &enable))
  404. return -EINVAL;
  405. reg = lm3533_led_get_lv_reg(led, LM3533_REG_CTRLBANK_BCONF_BASE);
  406. mask = LM3533_REG_CTRLBANK_BCONF_ALS_EN_MASK;
  407. if (enable)
  408. val = mask;
  409. else
  410. val = 0;
  411. ret = lm3533_update(led->lm3533, reg, val, mask);
  412. if (ret)
  413. return ret;
  414. return len;
  415. }
  416. static ssize_t show_linear(struct device *dev,
  417. struct device_attribute *attr, char *buf)
  418. {
  419. struct led_classdev *led_cdev = dev_get_drvdata(dev);
  420. struct lm3533_led *led = to_lm3533_led(led_cdev);
  421. u8 reg;
  422. u8 val;
  423. int linear;
  424. int ret;
  425. reg = lm3533_led_get_lv_reg(led, LM3533_REG_CTRLBANK_BCONF_BASE);
  426. ret = lm3533_read(led->lm3533, reg, &val);
  427. if (ret)
  428. return ret;
  429. if (val & LM3533_REG_CTRLBANK_BCONF_MAPPING_MASK)
  430. linear = 1;
  431. else
  432. linear = 0;
  433. return scnprintf(buf, PAGE_SIZE, "%x\n", linear);
  434. }
  435. static ssize_t store_linear(struct device *dev,
  436. struct device_attribute *attr,
  437. const char *buf, size_t len)
  438. {
  439. struct led_classdev *led_cdev = dev_get_drvdata(dev);
  440. struct lm3533_led *led = to_lm3533_led(led_cdev);
  441. unsigned long linear;
  442. u8 reg;
  443. u8 mask;
  444. u8 val;
  445. int ret;
  446. if (kstrtoul(buf, 0, &linear))
  447. return -EINVAL;
  448. reg = lm3533_led_get_lv_reg(led, LM3533_REG_CTRLBANK_BCONF_BASE);
  449. mask = LM3533_REG_CTRLBANK_BCONF_MAPPING_MASK;
  450. if (linear)
  451. val = mask;
  452. else
  453. val = 0;
  454. ret = lm3533_update(led->lm3533, reg, val, mask);
  455. if (ret)
  456. return ret;
  457. return len;
  458. }
  459. static ssize_t show_pwm(struct device *dev,
  460. struct device_attribute *attr,
  461. char *buf)
  462. {
  463. struct led_classdev *led_cdev = dev_get_drvdata(dev);
  464. struct lm3533_led *led = to_lm3533_led(led_cdev);
  465. u8 val;
  466. int ret;
  467. ret = lm3533_ctrlbank_get_pwm(&led->cb, &val);
  468. if (ret)
  469. return ret;
  470. return scnprintf(buf, PAGE_SIZE, "%u\n", val);
  471. }
  472. static ssize_t store_pwm(struct device *dev,
  473. struct device_attribute *attr,
  474. const char *buf, size_t len)
  475. {
  476. struct led_classdev *led_cdev = dev_get_drvdata(dev);
  477. struct lm3533_led *led = to_lm3533_led(led_cdev);
  478. u8 val;
  479. int ret;
  480. if (kstrtou8(buf, 0, &val))
  481. return -EINVAL;
  482. ret = lm3533_ctrlbank_set_pwm(&led->cb, val);
  483. if (ret)
  484. return ret;
  485. return len;
  486. }
  487. static LM3533_ATTR_RW(als_channel);
  488. static LM3533_ATTR_RW(als_en);
  489. static LM3533_ATTR_RW(falltime);
  490. static LM3533_ATTR_RO(id);
  491. static LM3533_ATTR_RW(linear);
  492. static LM3533_ATTR_RW(pwm);
  493. static LM3533_ATTR_RW(risetime);
  494. static struct attribute *lm3533_led_attributes[] = {
  495. &dev_attr_als_channel.attr,
  496. &dev_attr_als_en.attr,
  497. &dev_attr_falltime.attr,
  498. &dev_attr_id.attr,
  499. &dev_attr_linear.attr,
  500. &dev_attr_pwm.attr,
  501. &dev_attr_risetime.attr,
  502. NULL,
  503. };
  504. static umode_t lm3533_led_attr_is_visible(struct kobject *kobj,
  505. struct attribute *attr, int n)
  506. {
  507. struct device *dev = container_of(kobj, struct device, kobj);
  508. struct led_classdev *led_cdev = dev_get_drvdata(dev);
  509. struct lm3533_led *led = to_lm3533_led(led_cdev);
  510. umode_t mode = attr->mode;
  511. if (attr == &dev_attr_als_channel.attr ||
  512. attr == &dev_attr_als_en.attr) {
  513. if (!led->lm3533->have_als)
  514. mode = 0;
  515. }
  516. return mode;
  517. };
  518. static struct attribute_group lm3533_led_attribute_group = {
  519. .is_visible = lm3533_led_attr_is_visible,
  520. .attrs = lm3533_led_attributes
  521. };
  522. static const struct attribute_group *lm3533_led_attribute_groups[] = {
  523. &lm3533_led_attribute_group,
  524. NULL
  525. };
  526. static int lm3533_led_setup(struct lm3533_led *led,
  527. struct lm3533_led_platform_data *pdata)
  528. {
  529. int ret;
  530. ret = lm3533_ctrlbank_set_max_current(&led->cb, pdata->max_current);
  531. if (ret)
  532. return ret;
  533. return lm3533_ctrlbank_set_pwm(&led->cb, pdata->pwm);
  534. }
  535. static int lm3533_led_probe(struct platform_device *pdev)
  536. {
  537. struct lm3533 *lm3533;
  538. struct lm3533_led_platform_data *pdata;
  539. struct lm3533_led *led;
  540. int ret;
  541. dev_dbg(&pdev->dev, "%s\n", __func__);
  542. lm3533 = dev_get_drvdata(pdev->dev.parent);
  543. if (!lm3533)
  544. return -EINVAL;
  545. pdata = dev_get_platdata(&pdev->dev);
  546. if (!pdata) {
  547. dev_err(&pdev->dev, "no platform data\n");
  548. return -EINVAL;
  549. }
  550. if (pdev->id < 0 || pdev->id >= LM3533_LVCTRLBANK_COUNT) {
  551. dev_err(&pdev->dev, "illegal LED id %d\n", pdev->id);
  552. return -EINVAL;
  553. }
  554. led = devm_kzalloc(&pdev->dev, sizeof(*led), GFP_KERNEL);
  555. if (!led)
  556. return -ENOMEM;
  557. led->lm3533 = lm3533;
  558. led->cdev.name = pdata->name;
  559. led->cdev.default_trigger = pdata->default_trigger;
  560. led->cdev.brightness_set = lm3533_led_set;
  561. led->cdev.brightness_get = lm3533_led_get;
  562. led->cdev.blink_set = lm3533_led_blink_set;
  563. led->cdev.brightness = LED_OFF;
  564. led->cdev.groups = lm3533_led_attribute_groups,
  565. led->id = pdev->id;
  566. mutex_init(&led->mutex);
  567. INIT_WORK(&led->work, lm3533_led_work);
  568. /* The class framework makes a callback to get brightness during
  569. * registration so use parent device (for error reporting) until
  570. * registered.
  571. */
  572. led->cb.lm3533 = lm3533;
  573. led->cb.id = lm3533_led_get_ctrlbank_id(led);
  574. led->cb.dev = lm3533->dev;
  575. platform_set_drvdata(pdev, led);
  576. ret = led_classdev_register(pdev->dev.parent, &led->cdev);
  577. if (ret) {
  578. dev_err(&pdev->dev, "failed to register LED %d\n", pdev->id);
  579. return ret;
  580. }
  581. led->cb.dev = led->cdev.dev;
  582. ret = lm3533_led_setup(led, pdata);
  583. if (ret)
  584. goto err_unregister;
  585. ret = lm3533_ctrlbank_enable(&led->cb);
  586. if (ret)
  587. goto err_unregister;
  588. return 0;
  589. err_unregister:
  590. led_classdev_unregister(&led->cdev);
  591. flush_work(&led->work);
  592. return ret;
  593. }
  594. static int lm3533_led_remove(struct platform_device *pdev)
  595. {
  596. struct lm3533_led *led = platform_get_drvdata(pdev);
  597. dev_dbg(&pdev->dev, "%s\n", __func__);
  598. lm3533_ctrlbank_disable(&led->cb);
  599. led_classdev_unregister(&led->cdev);
  600. flush_work(&led->work);
  601. return 0;
  602. }
  603. static void lm3533_led_shutdown(struct platform_device *pdev)
  604. {
  605. struct lm3533_led *led = platform_get_drvdata(pdev);
  606. dev_dbg(&pdev->dev, "%s\n", __func__);
  607. lm3533_ctrlbank_disable(&led->cb);
  608. lm3533_led_set(&led->cdev, LED_OFF); /* disable blink */
  609. flush_work(&led->work);
  610. }
  611. static struct platform_driver lm3533_led_driver = {
  612. .driver = {
  613. .name = "lm3533-leds",
  614. },
  615. .probe = lm3533_led_probe,
  616. .remove = lm3533_led_remove,
  617. .shutdown = lm3533_led_shutdown,
  618. };
  619. module_platform_driver(lm3533_led_driver);
  620. MODULE_AUTHOR("Johan Hovold <jhovold@gmail.com>");
  621. MODULE_DESCRIPTION("LM3533 LED driver");
  622. MODULE_LICENSE("GPL");
  623. MODULE_ALIAS("platform:lm3533-leds");