leds-is31fl319x.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright 2015-16 Golden Delicious Computers
  4. *
  5. * Author: Nikolaus Schaller <[email protected]>
  6. *
  7. * LED driver for the IS31FL319{0,1,3,6,9} to drive 1, 3, 6 or 9 light
  8. * effect LEDs.
  9. */
  10. #include <linux/err.h>
  11. #include <linux/i2c.h>
  12. #include <linux/leds.h>
  13. #include <linux/mod_devicetable.h>
  14. #include <linux/module.h>
  15. #include <linux/property.h>
  16. #include <linux/regmap.h>
  17. #include <linux/slab.h>
  18. #include <linux/delay.h>
  19. #include <linux/gpio/consumer.h>
  20. /* register numbers */
  21. #define IS31FL319X_SHUTDOWN 0x00
  22. /* registers for 3190, 3191 and 3193 */
  23. #define IS31FL3190_BREATHING 0x01
  24. #define IS31FL3190_LEDMODE 0x02
  25. #define IS31FL3190_CURRENT 0x03
  26. #define IS31FL3190_PWM(channel) (0x04 + channel)
  27. #define IS31FL3190_DATA_UPDATE 0x07
  28. #define IS31FL3190_T0(channel) (0x0a + channel)
  29. #define IS31FL3190_T1T2(channel) (0x10 + channel)
  30. #define IS31FL3190_T3T4(channel) (0x16 + channel)
  31. #define IS31FL3190_TIME_UPDATE 0x1c
  32. #define IS31FL3190_LEDCONTROL 0x1d
  33. #define IS31FL3190_RESET 0x2f
  34. #define IS31FL3190_CURRENT_uA_MIN 5000
  35. #define IS31FL3190_CURRENT_uA_DEFAULT 42000
  36. #define IS31FL3190_CURRENT_uA_MAX 42000
  37. #define IS31FL3190_CURRENT_SHIFT 2
  38. #define IS31FL3190_CURRENT_MASK GENMASK(4, 2)
  39. #define IS31FL3190_CURRENT_5_mA 0x02
  40. #define IS31FL3190_CURRENT_10_mA 0x01
  41. #define IS31FL3190_CURRENT_17dot5_mA 0x04
  42. #define IS31FL3190_CURRENT_30_mA 0x03
  43. #define IS31FL3190_CURRENT_42_mA 0x00
  44. /* registers for 3196 and 3199 */
  45. #define IS31FL3196_CTRL1 0x01
  46. #define IS31FL3196_CTRL2 0x02
  47. #define IS31FL3196_CONFIG1 0x03
  48. #define IS31FL3196_CONFIG2 0x04
  49. #define IS31FL3196_RAMP_MODE 0x05
  50. #define IS31FL3196_BREATH_MARK 0x06
  51. #define IS31FL3196_PWM(channel) (0x07 + channel)
  52. #define IS31FL3196_DATA_UPDATE 0x10
  53. #define IS31FL3196_T0(channel) (0x11 + channel)
  54. #define IS31FL3196_T123_1 0x1a
  55. #define IS31FL3196_T123_2 0x1b
  56. #define IS31FL3196_T123_3 0x1c
  57. #define IS31FL3196_T4(channel) (0x1d + channel)
  58. #define IS31FL3196_TIME_UPDATE 0x26
  59. #define IS31FL3196_RESET 0xff
  60. #define IS31FL3196_REG_CNT (IS31FL3196_RESET + 1)
  61. #define IS31FL319X_MAX_LEDS 9
  62. /* CS (Current Setting) in CONFIG2 register */
  63. #define IS31FL3196_CONFIG2_CS_SHIFT 4
  64. #define IS31FL3196_CONFIG2_CS_MASK GENMASK(2, 0)
  65. #define IS31FL3196_CONFIG2_CS_STEP_REF 12
  66. #define IS31FL3196_CURRENT_uA_MIN 5000
  67. #define IS31FL3196_CURRENT_uA_MAX 40000
  68. #define IS31FL3196_CURRENT_uA_STEP 5000
  69. #define IS31FL3196_CURRENT_uA_DEFAULT 20000
  70. /* Audio gain in CONFIG2 register */
  71. #define IS31FL3196_AUDIO_GAIN_DB_MAX ((u32)21)
  72. #define IS31FL3196_AUDIO_GAIN_DB_STEP 3
  73. /*
  74. * regmap is used as a cache of chip's register space,
  75. * to avoid reading back brightness values from chip,
  76. * which is known to hang.
  77. */
  78. struct is31fl319x_chip {
  79. const struct is31fl319x_chipdef *cdef;
  80. struct i2c_client *client;
  81. struct gpio_desc *shutdown_gpio;
  82. struct regmap *regmap;
  83. struct mutex lock;
  84. u32 audio_gain_db;
  85. struct is31fl319x_led {
  86. struct is31fl319x_chip *chip;
  87. struct led_classdev cdev;
  88. u32 max_microamp;
  89. bool configured;
  90. } leds[IS31FL319X_MAX_LEDS];
  91. };
  92. struct is31fl319x_chipdef {
  93. int num_leds;
  94. u8 reset_reg;
  95. const struct regmap_config *is31fl319x_regmap_config;
  96. int (*brightness_set)(struct led_classdev *cdev, enum led_brightness brightness);
  97. u32 current_default;
  98. u32 current_min;
  99. u32 current_max;
  100. bool is_3196or3199;
  101. };
  102. static bool is31fl319x_readable_reg(struct device *dev, unsigned int reg)
  103. {
  104. /* we have no readable registers */
  105. return false;
  106. }
  107. static bool is31fl3190_volatile_reg(struct device *dev, unsigned int reg)
  108. {
  109. /* volatile registers are not cached */
  110. switch (reg) {
  111. case IS31FL3190_DATA_UPDATE:
  112. case IS31FL3190_TIME_UPDATE:
  113. case IS31FL3190_RESET:
  114. return true; /* always write-through */
  115. default:
  116. return false;
  117. }
  118. }
  119. static const struct reg_default is31fl3190_reg_defaults[] = {
  120. { IS31FL3190_LEDMODE, 0x00 },
  121. { IS31FL3190_CURRENT, 0x00 },
  122. { IS31FL3190_PWM(0), 0x00 },
  123. { IS31FL3190_PWM(1), 0x00 },
  124. { IS31FL3190_PWM(2), 0x00 },
  125. };
  126. static struct regmap_config is31fl3190_regmap_config = {
  127. .reg_bits = 8,
  128. .val_bits = 8,
  129. .max_register = IS31FL3190_RESET,
  130. .cache_type = REGCACHE_FLAT,
  131. .readable_reg = is31fl319x_readable_reg,
  132. .volatile_reg = is31fl3190_volatile_reg,
  133. .reg_defaults = is31fl3190_reg_defaults,
  134. .num_reg_defaults = ARRAY_SIZE(is31fl3190_reg_defaults),
  135. };
  136. static bool is31fl3196_volatile_reg(struct device *dev, unsigned int reg)
  137. {
  138. /* volatile registers are not cached */
  139. switch (reg) {
  140. case IS31FL3196_DATA_UPDATE:
  141. case IS31FL3196_TIME_UPDATE:
  142. case IS31FL3196_RESET:
  143. return true; /* always write-through */
  144. default:
  145. return false;
  146. }
  147. }
  148. static const struct reg_default is31fl3196_reg_defaults[] = {
  149. { IS31FL3196_CONFIG1, 0x00 },
  150. { IS31FL3196_CONFIG2, 0x00 },
  151. { IS31FL3196_PWM(0), 0x00 },
  152. { IS31FL3196_PWM(1), 0x00 },
  153. { IS31FL3196_PWM(2), 0x00 },
  154. { IS31FL3196_PWM(3), 0x00 },
  155. { IS31FL3196_PWM(4), 0x00 },
  156. { IS31FL3196_PWM(5), 0x00 },
  157. { IS31FL3196_PWM(6), 0x00 },
  158. { IS31FL3196_PWM(7), 0x00 },
  159. { IS31FL3196_PWM(8), 0x00 },
  160. };
  161. static struct regmap_config is31fl3196_regmap_config = {
  162. .reg_bits = 8,
  163. .val_bits = 8,
  164. .max_register = IS31FL3196_REG_CNT,
  165. .cache_type = REGCACHE_FLAT,
  166. .readable_reg = is31fl319x_readable_reg,
  167. .volatile_reg = is31fl3196_volatile_reg,
  168. .reg_defaults = is31fl3196_reg_defaults,
  169. .num_reg_defaults = ARRAY_SIZE(is31fl3196_reg_defaults),
  170. };
  171. static int is31fl3190_brightness_set(struct led_classdev *cdev,
  172. enum led_brightness brightness)
  173. {
  174. struct is31fl319x_led *led = container_of(cdev, struct is31fl319x_led, cdev);
  175. struct is31fl319x_chip *is31 = led->chip;
  176. int chan = led - is31->leds;
  177. int ret;
  178. int i;
  179. u8 ctrl = 0;
  180. dev_dbg(&is31->client->dev, "channel %d: %d\n", chan, brightness);
  181. mutex_lock(&is31->lock);
  182. /* update PWM register */
  183. ret = regmap_write(is31->regmap, IS31FL3190_PWM(chan), brightness);
  184. if (ret < 0)
  185. goto out;
  186. /* read current brightness of all PWM channels */
  187. for (i = 0; i < is31->cdef->num_leds; i++) {
  188. unsigned int pwm_value;
  189. bool on;
  190. /*
  191. * since neither cdev nor the chip can provide
  192. * the current setting, we read from the regmap cache
  193. */
  194. ret = regmap_read(is31->regmap, IS31FL3190_PWM(i), &pwm_value);
  195. on = ret >= 0 && pwm_value > LED_OFF;
  196. ctrl |= on << i;
  197. }
  198. if (ctrl > 0) {
  199. dev_dbg(&is31->client->dev, "power up %02x\n", ctrl);
  200. regmap_write(is31->regmap, IS31FL3190_LEDCONTROL, ctrl);
  201. /* update PWMs */
  202. regmap_write(is31->regmap, IS31FL3190_DATA_UPDATE, 0x00);
  203. /* enable chip from shut down and enable all channels */
  204. ret = regmap_write(is31->regmap, IS31FL319X_SHUTDOWN, 0x20);
  205. } else {
  206. dev_dbg(&is31->client->dev, "power down\n");
  207. /* shut down (no need to clear LEDCONTROL) */
  208. ret = regmap_write(is31->regmap, IS31FL319X_SHUTDOWN, 0x01);
  209. }
  210. out:
  211. mutex_unlock(&is31->lock);
  212. return ret;
  213. }
  214. static int is31fl3196_brightness_set(struct led_classdev *cdev,
  215. enum led_brightness brightness)
  216. {
  217. struct is31fl319x_led *led = container_of(cdev, struct is31fl319x_led, cdev);
  218. struct is31fl319x_chip *is31 = led->chip;
  219. int chan = led - is31->leds;
  220. int ret;
  221. int i;
  222. u8 ctrl1 = 0, ctrl2 = 0;
  223. dev_dbg(&is31->client->dev, "channel %d: %d\n", chan, brightness);
  224. mutex_lock(&is31->lock);
  225. /* update PWM register */
  226. ret = regmap_write(is31->regmap, IS31FL3196_PWM(chan), brightness);
  227. if (ret < 0)
  228. goto out;
  229. /* read current brightness of all PWM channels */
  230. for (i = 0; i < is31->cdef->num_leds; i++) {
  231. unsigned int pwm_value;
  232. bool on;
  233. /*
  234. * since neither cdev nor the chip can provide
  235. * the current setting, we read from the regmap cache
  236. */
  237. ret = regmap_read(is31->regmap, IS31FL3196_PWM(i), &pwm_value);
  238. on = ret >= 0 && pwm_value > LED_OFF;
  239. if (i < 3)
  240. ctrl1 |= on << i; /* 0..2 => bit 0..2 */
  241. else if (i < 6)
  242. ctrl1 |= on << (i + 1); /* 3..5 => bit 4..6 */
  243. else
  244. ctrl2 |= on << (i - 6); /* 6..8 => bit 0..2 */
  245. }
  246. if (ctrl1 > 0 || ctrl2 > 0) {
  247. dev_dbg(&is31->client->dev, "power up %02x %02x\n",
  248. ctrl1, ctrl2);
  249. regmap_write(is31->regmap, IS31FL3196_CTRL1, ctrl1);
  250. regmap_write(is31->regmap, IS31FL3196_CTRL2, ctrl2);
  251. /* update PWMs */
  252. regmap_write(is31->regmap, IS31FL3196_DATA_UPDATE, 0x00);
  253. /* enable chip from shut down */
  254. ret = regmap_write(is31->regmap, IS31FL319X_SHUTDOWN, 0x01);
  255. } else {
  256. dev_dbg(&is31->client->dev, "power down\n");
  257. /* shut down (no need to clear CTRL1/2) */
  258. ret = regmap_write(is31->regmap, IS31FL319X_SHUTDOWN, 0x00);
  259. }
  260. out:
  261. mutex_unlock(&is31->lock);
  262. return ret;
  263. }
  264. static const struct is31fl319x_chipdef is31fl3190_cdef = {
  265. .num_leds = 1,
  266. .reset_reg = IS31FL3190_RESET,
  267. .is31fl319x_regmap_config = &is31fl3190_regmap_config,
  268. .brightness_set = is31fl3190_brightness_set,
  269. .current_default = IS31FL3190_CURRENT_uA_DEFAULT,
  270. .current_min = IS31FL3190_CURRENT_uA_MIN,
  271. .current_max = IS31FL3190_CURRENT_uA_MAX,
  272. .is_3196or3199 = false,
  273. };
  274. static const struct is31fl319x_chipdef is31fl3193_cdef = {
  275. .num_leds = 3,
  276. .reset_reg = IS31FL3190_RESET,
  277. .is31fl319x_regmap_config = &is31fl3190_regmap_config,
  278. .brightness_set = is31fl3190_brightness_set,
  279. .current_default = IS31FL3190_CURRENT_uA_DEFAULT,
  280. .current_min = IS31FL3190_CURRENT_uA_MIN,
  281. .current_max = IS31FL3190_CURRENT_uA_MAX,
  282. .is_3196or3199 = false,
  283. };
  284. static const struct is31fl319x_chipdef is31fl3196_cdef = {
  285. .num_leds = 6,
  286. .reset_reg = IS31FL3196_RESET,
  287. .is31fl319x_regmap_config = &is31fl3196_regmap_config,
  288. .brightness_set = is31fl3196_brightness_set,
  289. .current_default = IS31FL3196_CURRENT_uA_DEFAULT,
  290. .current_min = IS31FL3196_CURRENT_uA_MIN,
  291. .current_max = IS31FL3196_CURRENT_uA_MAX,
  292. .is_3196or3199 = true,
  293. };
  294. static const struct is31fl319x_chipdef is31fl3199_cdef = {
  295. .num_leds = 9,
  296. .reset_reg = IS31FL3196_RESET,
  297. .is31fl319x_regmap_config = &is31fl3196_regmap_config,
  298. .brightness_set = is31fl3196_brightness_set,
  299. .current_default = IS31FL3196_CURRENT_uA_DEFAULT,
  300. .current_min = IS31FL3196_CURRENT_uA_MIN,
  301. .current_max = IS31FL3196_CURRENT_uA_MAX,
  302. .is_3196or3199 = true,
  303. };
  304. static const struct of_device_id of_is31fl319x_match[] = {
  305. { .compatible = "issi,is31fl3190", .data = &is31fl3190_cdef, },
  306. { .compatible = "issi,is31fl3191", .data = &is31fl3190_cdef, },
  307. { .compatible = "issi,is31fl3193", .data = &is31fl3193_cdef, },
  308. { .compatible = "issi,is31fl3196", .data = &is31fl3196_cdef, },
  309. { .compatible = "issi,is31fl3199", .data = &is31fl3199_cdef, },
  310. { .compatible = "si-en,sn3190", .data = &is31fl3190_cdef, },
  311. { .compatible = "si-en,sn3191", .data = &is31fl3190_cdef, },
  312. { .compatible = "si-en,sn3193", .data = &is31fl3193_cdef, },
  313. { .compatible = "si-en,sn3196", .data = &is31fl3196_cdef, },
  314. { .compatible = "si-en,sn3199", .data = &is31fl3199_cdef, },
  315. { }
  316. };
  317. MODULE_DEVICE_TABLE(of, of_is31fl319x_match);
  318. static int is31fl319x_parse_child_fw(const struct device *dev,
  319. const struct fwnode_handle *child,
  320. struct is31fl319x_led *led,
  321. struct is31fl319x_chip *is31)
  322. {
  323. struct led_classdev *cdev = &led->cdev;
  324. int ret;
  325. if (fwnode_property_read_string(child, "label", &cdev->name))
  326. cdev->name = fwnode_get_name(child);
  327. ret = fwnode_property_read_string(child, "linux,default-trigger", &cdev->default_trigger);
  328. if (ret < 0 && ret != -EINVAL) /* is optional */
  329. return ret;
  330. led->max_microamp = is31->cdef->current_default;
  331. ret = fwnode_property_read_u32(child, "led-max-microamp", &led->max_microamp);
  332. if (!ret) {
  333. if (led->max_microamp < is31->cdef->current_min)
  334. return -EINVAL; /* not supported */
  335. led->max_microamp = min(led->max_microamp,
  336. is31->cdef->current_max);
  337. }
  338. return 0;
  339. }
  340. static int is31fl319x_parse_fw(struct device *dev, struct is31fl319x_chip *is31)
  341. {
  342. struct fwnode_handle *fwnode = dev_fwnode(dev), *child;
  343. int count;
  344. int ret;
  345. is31->shutdown_gpio = devm_gpiod_get_optional(dev, "shutdown", GPIOD_OUT_HIGH);
  346. if (IS_ERR(is31->shutdown_gpio))
  347. return dev_err_probe(dev, PTR_ERR(is31->shutdown_gpio),
  348. "Failed to get shutdown gpio\n");
  349. is31->cdef = device_get_match_data(dev);
  350. count = 0;
  351. fwnode_for_each_available_child_node(fwnode, child)
  352. count++;
  353. dev_dbg(dev, "probing with %d leds defined in DT\n", count);
  354. if (!count || count > is31->cdef->num_leds)
  355. return dev_err_probe(dev, -ENODEV,
  356. "Number of leds defined must be between 1 and %u\n",
  357. is31->cdef->num_leds);
  358. fwnode_for_each_available_child_node(fwnode, child) {
  359. struct is31fl319x_led *led;
  360. u32 reg;
  361. ret = fwnode_property_read_u32(child, "reg", &reg);
  362. if (ret) {
  363. ret = dev_err_probe(dev, ret, "Failed to read led 'reg' property\n");
  364. goto put_child_node;
  365. }
  366. if (reg < 1 || reg > is31->cdef->num_leds) {
  367. ret = dev_err_probe(dev, -EINVAL, "invalid led reg %u\n", reg);
  368. goto put_child_node;
  369. }
  370. led = &is31->leds[reg - 1];
  371. if (led->configured) {
  372. ret = dev_err_probe(dev, -EINVAL, "led %u is already configured\n", reg);
  373. goto put_child_node;
  374. }
  375. ret = is31fl319x_parse_child_fw(dev, child, led, is31);
  376. if (ret) {
  377. ret = dev_err_probe(dev, ret, "led %u DT parsing failed\n", reg);
  378. goto put_child_node;
  379. }
  380. led->configured = true;
  381. }
  382. is31->audio_gain_db = 0;
  383. if (is31->cdef->is_3196or3199) {
  384. ret = fwnode_property_read_u32(fwnode, "audio-gain-db", &is31->audio_gain_db);
  385. if (!ret)
  386. is31->audio_gain_db = min(is31->audio_gain_db,
  387. IS31FL3196_AUDIO_GAIN_DB_MAX);
  388. }
  389. return 0;
  390. put_child_node:
  391. fwnode_handle_put(child);
  392. return ret;
  393. }
  394. static inline int is31fl3190_microamp_to_cs(struct device *dev, u32 microamp)
  395. {
  396. switch (microamp) {
  397. case 5000:
  398. return IS31FL3190_CURRENT_5_mA;
  399. case 10000:
  400. return IS31FL3190_CURRENT_10_mA;
  401. case 17500:
  402. return IS31FL3190_CURRENT_17dot5_mA;
  403. case 30000:
  404. return IS31FL3190_CURRENT_30_mA;
  405. case 42000:
  406. return IS31FL3190_CURRENT_42_mA;
  407. default:
  408. dev_warn(dev, "Unsupported current value: %d, using 5000 µA!\n", microamp);
  409. return IS31FL3190_CURRENT_5_mA;
  410. }
  411. }
  412. static inline int is31fl3196_microamp_to_cs(struct device *dev, u32 microamp)
  413. {
  414. /* round down to nearest supported value (range check done by caller) */
  415. u32 step = microamp / IS31FL3196_CURRENT_uA_STEP;
  416. return ((IS31FL3196_CONFIG2_CS_STEP_REF - step) &
  417. IS31FL3196_CONFIG2_CS_MASK) <<
  418. IS31FL3196_CONFIG2_CS_SHIFT; /* CS encoding */
  419. }
  420. static inline int is31fl3196_db_to_gain(u32 dezibel)
  421. {
  422. /* round down to nearest supported value (range check done by caller) */
  423. return dezibel / IS31FL3196_AUDIO_GAIN_DB_STEP;
  424. }
  425. static void is31f1319x_mutex_destroy(void *lock)
  426. {
  427. mutex_destroy(lock);
  428. }
  429. static int is31fl319x_probe(struct i2c_client *client)
  430. {
  431. struct is31fl319x_chip *is31;
  432. struct device *dev = &client->dev;
  433. int err;
  434. int i = 0;
  435. u32 aggregated_led_microamp;
  436. if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
  437. return -EIO;
  438. is31 = devm_kzalloc(&client->dev, sizeof(*is31), GFP_KERNEL);
  439. if (!is31)
  440. return -ENOMEM;
  441. mutex_init(&is31->lock);
  442. err = devm_add_action_or_reset(dev, is31f1319x_mutex_destroy, &is31->lock);
  443. if (err)
  444. return err;
  445. err = is31fl319x_parse_fw(&client->dev, is31);
  446. if (err)
  447. return err;
  448. if (is31->shutdown_gpio) {
  449. gpiod_direction_output(is31->shutdown_gpio, 0);
  450. mdelay(5);
  451. gpiod_direction_output(is31->shutdown_gpio, 1);
  452. }
  453. is31->client = client;
  454. is31->regmap = devm_regmap_init_i2c(client, is31->cdef->is31fl319x_regmap_config);
  455. if (IS_ERR(is31->regmap))
  456. return dev_err_probe(dev, PTR_ERR(is31->regmap), "failed to allocate register map\n");
  457. i2c_set_clientdata(client, is31);
  458. /* check for write-reply from chip (we can't read any registers) */
  459. err = regmap_write(is31->regmap, is31->cdef->reset_reg, 0x00);
  460. if (err < 0)
  461. return dev_err_probe(dev, err, "no response from chip write\n");
  462. /*
  463. * Kernel conventions require per-LED led-max-microamp property.
  464. * But the chip does not allow to limit individual LEDs.
  465. * So we take minimum from all subnodes for safety of hardware.
  466. */
  467. aggregated_led_microamp = is31->cdef->current_max;
  468. for (i = 0; i < is31->cdef->num_leds; i++)
  469. if (is31->leds[i].configured &&
  470. is31->leds[i].max_microamp < aggregated_led_microamp)
  471. aggregated_led_microamp = is31->leds[i].max_microamp;
  472. if (is31->cdef->is_3196or3199)
  473. regmap_write(is31->regmap, IS31FL3196_CONFIG2,
  474. is31fl3196_microamp_to_cs(dev, aggregated_led_microamp) |
  475. is31fl3196_db_to_gain(is31->audio_gain_db));
  476. else
  477. regmap_update_bits(is31->regmap, IS31FL3190_CURRENT, IS31FL3190_CURRENT_MASK,
  478. is31fl3190_microamp_to_cs(dev, aggregated_led_microamp) << IS31FL3190_CURRENT_SHIFT);
  479. for (i = 0; i < is31->cdef->num_leds; i++) {
  480. struct is31fl319x_led *led = &is31->leds[i];
  481. if (!led->configured)
  482. continue;
  483. led->chip = is31;
  484. led->cdev.brightness_set_blocking = is31->cdef->brightness_set;
  485. err = devm_led_classdev_register(&client->dev, &led->cdev);
  486. if (err < 0)
  487. return err;
  488. }
  489. return 0;
  490. }
  491. /*
  492. * i2c-core (and modalias) requires that id_table be properly filled,
  493. * even though it is not used for DeviceTree based instantiation.
  494. */
  495. static const struct i2c_device_id is31fl319x_id[] = {
  496. { "is31fl3190" },
  497. { "is31fl3191" },
  498. { "is31fl3193" },
  499. { "is31fl3196" },
  500. { "is31fl3199" },
  501. { "sn3190" },
  502. { "sn3191" },
  503. { "sn3193" },
  504. { "sn3196" },
  505. { "sn3199" },
  506. {},
  507. };
  508. MODULE_DEVICE_TABLE(i2c, is31fl319x_id);
  509. static struct i2c_driver is31fl319x_driver = {
  510. .driver = {
  511. .name = "leds-is31fl319x",
  512. .of_match_table = of_is31fl319x_match,
  513. },
  514. .probe_new = is31fl319x_probe,
  515. .id_table = is31fl319x_id,
  516. };
  517. module_i2c_driver(is31fl319x_driver);
  518. MODULE_AUTHOR("H. Nikolaus Schaller <[email protected]>");
  519. MODULE_AUTHOR("Andrey Utkin <[email protected]>");
  520. MODULE_DESCRIPTION("IS31FL319X LED driver");
  521. MODULE_LICENSE("GPL v2");