leds-aw2013.c 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. // SPDX-License-Identifier: GPL-2.0+
  2. // Driver for Awinic AW2013 3-channel LED driver
  3. #include <linux/i2c.h>
  4. #include <linux/leds.h>
  5. #include <linux/module.h>
  6. #include <linux/regulator/consumer.h>
  7. #include <linux/mutex.h>
  8. #include <linux/of.h>
  9. #include <linux/regmap.h>
  10. #define AW2013_MAX_LEDS 3
  11. /* Reset and ID register */
  12. #define AW2013_RSTR 0x00
  13. #define AW2013_RSTR_RESET 0x55
  14. #define AW2013_RSTR_CHIP_ID 0x33
  15. /* Global control register */
  16. #define AW2013_GCR 0x01
  17. #define AW2013_GCR_ENABLE BIT(0)
  18. /* LED channel enable register */
  19. #define AW2013_LCTR 0x30
  20. #define AW2013_LCTR_LE(x) BIT((x))
  21. /* LED channel control registers */
  22. #define AW2013_LCFG(x) (0x31 + (x))
  23. #define AW2013_LCFG_IMAX_MASK (BIT(0) | BIT(1)) // Should be 0-3
  24. #define AW2013_LCFG_MD BIT(4)
  25. #define AW2013_LCFG_FI BIT(5)
  26. #define AW2013_LCFG_FO BIT(6)
  27. /* LED channel PWM registers */
  28. #define AW2013_REG_PWM(x) (0x34 + (x))
  29. /* LED channel timing registers */
  30. #define AW2013_LEDT0(x) (0x37 + (x) * 3)
  31. #define AW2013_LEDT0_T1(x) ((x) << 4) // Should be 0-7
  32. #define AW2013_LEDT0_T2(x) (x) // Should be 0-5
  33. #define AW2013_LEDT1(x) (0x38 + (x) * 3)
  34. #define AW2013_LEDT1_T3(x) ((x) << 4) // Should be 0-7
  35. #define AW2013_LEDT1_T4(x) (x) // Should be 0-7
  36. #define AW2013_LEDT2(x) (0x39 + (x) * 3)
  37. #define AW2013_LEDT2_T0(x) ((x) << 4) // Should be 0-8
  38. #define AW2013_LEDT2_REPEAT(x) (x) // Should be 0-15
  39. #define AW2013_REG_MAX 0x77
  40. #define AW2013_TIME_STEP 130 /* ms */
  41. struct aw2013;
  42. struct aw2013_led {
  43. struct aw2013 *chip;
  44. struct led_classdev cdev;
  45. u32 num;
  46. unsigned int imax;
  47. };
  48. struct aw2013 {
  49. struct mutex mutex; /* held when writing to registers */
  50. struct regulator_bulk_data regulators[2];
  51. struct i2c_client *client;
  52. struct aw2013_led leds[AW2013_MAX_LEDS];
  53. struct regmap *regmap;
  54. int num_leds;
  55. bool enabled;
  56. };
  57. static int aw2013_chip_init(struct aw2013 *chip)
  58. {
  59. int i, ret;
  60. ret = regmap_write(chip->regmap, AW2013_GCR, AW2013_GCR_ENABLE);
  61. if (ret) {
  62. dev_err(&chip->client->dev, "Failed to enable the chip: %d\n",
  63. ret);
  64. return ret;
  65. }
  66. for (i = 0; i < chip->num_leds; i++) {
  67. ret = regmap_update_bits(chip->regmap,
  68. AW2013_LCFG(chip->leds[i].num),
  69. AW2013_LCFG_IMAX_MASK,
  70. chip->leds[i].imax);
  71. if (ret) {
  72. dev_err(&chip->client->dev,
  73. "Failed to set maximum current for led %d: %d\n",
  74. chip->leds[i].num, ret);
  75. return ret;
  76. }
  77. }
  78. return ret;
  79. }
  80. static void aw2013_chip_disable(struct aw2013 *chip)
  81. {
  82. int ret;
  83. if (!chip->enabled)
  84. return;
  85. regmap_write(chip->regmap, AW2013_GCR, 0);
  86. ret = regulator_bulk_disable(ARRAY_SIZE(chip->regulators),
  87. chip->regulators);
  88. if (ret) {
  89. dev_err(&chip->client->dev,
  90. "Failed to disable regulators: %d\n", ret);
  91. return;
  92. }
  93. chip->enabled = false;
  94. }
  95. static int aw2013_chip_enable(struct aw2013 *chip)
  96. {
  97. int ret;
  98. if (chip->enabled)
  99. return 0;
  100. ret = regulator_bulk_enable(ARRAY_SIZE(chip->regulators),
  101. chip->regulators);
  102. if (ret) {
  103. dev_err(&chip->client->dev,
  104. "Failed to enable regulators: %d\n", ret);
  105. return ret;
  106. }
  107. chip->enabled = true;
  108. ret = aw2013_chip_init(chip);
  109. if (ret)
  110. aw2013_chip_disable(chip);
  111. return ret;
  112. }
  113. static bool aw2013_chip_in_use(struct aw2013 *chip)
  114. {
  115. int i;
  116. for (i = 0; i < chip->num_leds; i++)
  117. if (chip->leds[i].cdev.brightness)
  118. return true;
  119. return false;
  120. }
  121. static int aw2013_brightness_set(struct led_classdev *cdev,
  122. enum led_brightness brightness)
  123. {
  124. struct aw2013_led *led = container_of(cdev, struct aw2013_led, cdev);
  125. int ret, num;
  126. mutex_lock(&led->chip->mutex);
  127. if (aw2013_chip_in_use(led->chip)) {
  128. ret = aw2013_chip_enable(led->chip);
  129. if (ret)
  130. goto error;
  131. }
  132. num = led->num;
  133. ret = regmap_write(led->chip->regmap, AW2013_REG_PWM(num), brightness);
  134. if (ret)
  135. goto error;
  136. if (brightness) {
  137. ret = regmap_update_bits(led->chip->regmap, AW2013_LCTR,
  138. AW2013_LCTR_LE(num), 0xFF);
  139. } else {
  140. ret = regmap_update_bits(led->chip->regmap, AW2013_LCTR,
  141. AW2013_LCTR_LE(num), 0);
  142. if (ret)
  143. goto error;
  144. ret = regmap_update_bits(led->chip->regmap, AW2013_LCFG(num),
  145. AW2013_LCFG_MD, 0);
  146. }
  147. if (ret)
  148. goto error;
  149. if (!aw2013_chip_in_use(led->chip))
  150. aw2013_chip_disable(led->chip);
  151. error:
  152. mutex_unlock(&led->chip->mutex);
  153. return ret;
  154. }
  155. static int aw2013_blink_set(struct led_classdev *cdev,
  156. unsigned long *delay_on, unsigned long *delay_off)
  157. {
  158. struct aw2013_led *led = container_of(cdev, struct aw2013_led, cdev);
  159. int ret, num = led->num;
  160. unsigned long off = 0, on = 0;
  161. /* If no blink specified, default to 1 Hz. */
  162. if (!*delay_off && !*delay_on) {
  163. *delay_off = 500;
  164. *delay_on = 500;
  165. }
  166. if (!led->cdev.brightness) {
  167. led->cdev.brightness = LED_FULL;
  168. ret = aw2013_brightness_set(&led->cdev, led->cdev.brightness);
  169. if (ret)
  170. return ret;
  171. }
  172. /* Never on - just set to off */
  173. if (!*delay_on) {
  174. led->cdev.brightness = LED_OFF;
  175. return aw2013_brightness_set(&led->cdev, LED_OFF);
  176. }
  177. mutex_lock(&led->chip->mutex);
  178. /* Never off - brightness is already set, disable blinking */
  179. if (!*delay_off) {
  180. ret = regmap_update_bits(led->chip->regmap, AW2013_LCFG(num),
  181. AW2013_LCFG_MD, 0);
  182. goto out;
  183. }
  184. /* Convert into values the HW will understand. */
  185. off = min(5, ilog2((*delay_off - 1) / AW2013_TIME_STEP) + 1);
  186. on = min(7, ilog2((*delay_on - 1) / AW2013_TIME_STEP) + 1);
  187. *delay_off = BIT(off) * AW2013_TIME_STEP;
  188. *delay_on = BIT(on) * AW2013_TIME_STEP;
  189. /* Set timings */
  190. ret = regmap_write(led->chip->regmap,
  191. AW2013_LEDT0(num), AW2013_LEDT0_T2(on));
  192. if (ret)
  193. goto out;
  194. ret = regmap_write(led->chip->regmap,
  195. AW2013_LEDT1(num), AW2013_LEDT1_T4(off));
  196. if (ret)
  197. goto out;
  198. /* Finally, enable the LED */
  199. ret = regmap_update_bits(led->chip->regmap, AW2013_LCFG(num),
  200. AW2013_LCFG_MD, 0xFF);
  201. if (ret)
  202. goto out;
  203. ret = regmap_update_bits(led->chip->regmap, AW2013_LCTR,
  204. AW2013_LCTR_LE(num), 0xFF);
  205. out:
  206. mutex_unlock(&led->chip->mutex);
  207. return ret;
  208. }
  209. static int aw2013_probe_dt(struct aw2013 *chip)
  210. {
  211. struct device_node *np = dev_of_node(&chip->client->dev);
  212. int count, ret = 0, i = 0;
  213. struct aw2013_led *led;
  214. count = of_get_available_child_count(np);
  215. if (!count || count > AW2013_MAX_LEDS)
  216. return -EINVAL;
  217. regmap_write(chip->regmap, AW2013_RSTR, AW2013_RSTR_RESET);
  218. for_each_available_child_of_node_scoped(np, child) {
  219. struct led_init_data init_data = {};
  220. u32 source;
  221. u32 imax;
  222. ret = of_property_read_u32(child, "reg", &source);
  223. if (ret != 0 || source >= AW2013_MAX_LEDS) {
  224. dev_err(&chip->client->dev,
  225. "Couldn't read LED address: %d\n", ret);
  226. count--;
  227. continue;
  228. }
  229. led = &chip->leds[i];
  230. led->num = source;
  231. led->chip = chip;
  232. init_data.fwnode = of_fwnode_handle(child);
  233. if (!of_property_read_u32(child, "led-max-microamp", &imax)) {
  234. led->imax = min_t(u32, imax / 5000, 3);
  235. } else {
  236. led->imax = 1; // 5mA
  237. dev_info(&chip->client->dev,
  238. "DT property led-max-microamp is missing\n");
  239. }
  240. led->cdev.brightness_set_blocking = aw2013_brightness_set;
  241. led->cdev.blink_set = aw2013_blink_set;
  242. ret = devm_led_classdev_register_ext(&chip->client->dev,
  243. &led->cdev, &init_data);
  244. if (ret < 0)
  245. return ret;
  246. i++;
  247. }
  248. if (!count)
  249. return -EINVAL;
  250. chip->num_leds = i;
  251. return 0;
  252. }
  253. static void aw2013_chip_disable_action(void *data)
  254. {
  255. aw2013_chip_disable(data);
  256. }
  257. static const struct regmap_config aw2013_regmap_config = {
  258. .reg_bits = 8,
  259. .val_bits = 8,
  260. .max_register = AW2013_REG_MAX,
  261. };
  262. static int aw2013_probe(struct i2c_client *client)
  263. {
  264. struct aw2013 *chip;
  265. int ret;
  266. unsigned int chipid;
  267. chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL);
  268. if (!chip)
  269. return -ENOMEM;
  270. ret = devm_mutex_init(&client->dev, &chip->mutex);
  271. if (ret)
  272. return ret;
  273. mutex_lock(&chip->mutex);
  274. chip->client = client;
  275. i2c_set_clientdata(client, chip);
  276. chip->regmap = devm_regmap_init_i2c(client, &aw2013_regmap_config);
  277. if (IS_ERR(chip->regmap)) {
  278. ret = PTR_ERR(chip->regmap);
  279. dev_err(&client->dev, "Failed to allocate register map: %d\n",
  280. ret);
  281. goto error;
  282. }
  283. chip->regulators[0].supply = "vcc";
  284. chip->regulators[1].supply = "vio";
  285. ret = devm_regulator_bulk_get(&client->dev,
  286. ARRAY_SIZE(chip->regulators),
  287. chip->regulators);
  288. if (ret < 0) {
  289. if (ret != -EPROBE_DEFER)
  290. dev_err(&client->dev,
  291. "Failed to request regulators: %d\n", ret);
  292. goto error;
  293. }
  294. ret = regulator_bulk_enable(ARRAY_SIZE(chip->regulators),
  295. chip->regulators);
  296. if (ret) {
  297. dev_err(&client->dev,
  298. "Failed to enable regulators: %d\n", ret);
  299. goto error;
  300. }
  301. ret = regmap_read(chip->regmap, AW2013_RSTR, &chipid);
  302. if (ret) {
  303. dev_err(&client->dev, "Failed to read chip ID: %d\n",
  304. ret);
  305. goto error_reg;
  306. }
  307. if (chipid != AW2013_RSTR_CHIP_ID) {
  308. dev_err(&client->dev, "Chip reported wrong ID: %x\n",
  309. chipid);
  310. ret = -ENODEV;
  311. goto error_reg;
  312. }
  313. ret = devm_add_action(&client->dev, aw2013_chip_disable_action, chip);
  314. if (ret)
  315. goto error_reg;
  316. ret = aw2013_probe_dt(chip);
  317. if (ret < 0)
  318. goto error_reg;
  319. ret = regulator_bulk_disable(ARRAY_SIZE(chip->regulators),
  320. chip->regulators);
  321. if (ret) {
  322. dev_err(&client->dev,
  323. "Failed to disable regulators: %d\n", ret);
  324. goto error;
  325. }
  326. mutex_unlock(&chip->mutex);
  327. return 0;
  328. error_reg:
  329. regulator_bulk_disable(ARRAY_SIZE(chip->regulators),
  330. chip->regulators);
  331. error:
  332. mutex_unlock(&chip->mutex);
  333. return ret;
  334. }
  335. static const struct of_device_id aw2013_match_table[] = {
  336. { .compatible = "awinic,aw2013", },
  337. { /* sentinel */ },
  338. };
  339. MODULE_DEVICE_TABLE(of, aw2013_match_table);
  340. static struct i2c_driver aw2013_driver = {
  341. .driver = {
  342. .name = "leds-aw2013",
  343. .of_match_table = aw2013_match_table,
  344. },
  345. .probe = aw2013_probe,
  346. };
  347. module_i2c_driver(aw2013_driver);
  348. MODULE_AUTHOR("Nikita Travkin <nikitos.tr@gmail.com>");
  349. MODULE_DESCRIPTION("AW2013 LED driver");
  350. MODULE_LICENSE("GPL v2");