leds-lm3533.c 18 KB

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