leds-aw2013.c 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  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 *vcc_regulator;
  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_disable(chip->vcc_regulator);
  87. if (ret) {
  88. dev_err(&chip->client->dev,
  89. "Failed to disable regulator: %d\n", ret);
  90. return;
  91. }
  92. chip->enabled = false;
  93. }
  94. static int aw2013_chip_enable(struct aw2013 *chip)
  95. {
  96. int ret;
  97. if (chip->enabled)
  98. return 0;
  99. ret = regulator_enable(chip->vcc_regulator);
  100. if (ret) {
  101. dev_err(&chip->client->dev,
  102. "Failed to enable regulator: %d\n", ret);
  103. return ret;
  104. }
  105. chip->enabled = true;
  106. ret = aw2013_chip_init(chip);
  107. if (ret)
  108. aw2013_chip_disable(chip);
  109. return ret;
  110. }
  111. static bool aw2013_chip_in_use(struct aw2013 *chip)
  112. {
  113. int i;
  114. for (i = 0; i < chip->num_leds; i++)
  115. if (chip->leds[i].cdev.brightness)
  116. return true;
  117. return false;
  118. }
  119. static int aw2013_brightness_set(struct led_classdev *cdev,
  120. enum led_brightness brightness)
  121. {
  122. struct aw2013_led *led = container_of(cdev, struct aw2013_led, cdev);
  123. int ret, num;
  124. mutex_lock(&led->chip->mutex);
  125. if (aw2013_chip_in_use(led->chip)) {
  126. ret = aw2013_chip_enable(led->chip);
  127. if (ret)
  128. goto error;
  129. }
  130. num = led->num;
  131. ret = regmap_write(led->chip->regmap, AW2013_REG_PWM(num), brightness);
  132. if (ret)
  133. goto error;
  134. if (brightness) {
  135. ret = regmap_update_bits(led->chip->regmap, AW2013_LCTR,
  136. AW2013_LCTR_LE(num), 0xFF);
  137. } else {
  138. ret = regmap_update_bits(led->chip->regmap, AW2013_LCTR,
  139. AW2013_LCTR_LE(num), 0);
  140. if (ret)
  141. goto error;
  142. ret = regmap_update_bits(led->chip->regmap, AW2013_LCFG(num),
  143. AW2013_LCFG_MD, 0);
  144. }
  145. if (ret)
  146. goto error;
  147. if (!aw2013_chip_in_use(led->chip))
  148. aw2013_chip_disable(led->chip);
  149. error:
  150. mutex_unlock(&led->chip->mutex);
  151. return ret;
  152. }
  153. static int aw2013_blink_set(struct led_classdev *cdev,
  154. unsigned long *delay_on, unsigned long *delay_off)
  155. {
  156. struct aw2013_led *led = container_of(cdev, struct aw2013_led, cdev);
  157. int ret, num = led->num;
  158. unsigned long off = 0, on = 0;
  159. /* If no blink specified, default to 1 Hz. */
  160. if (!*delay_off && !*delay_on) {
  161. *delay_off = 500;
  162. *delay_on = 500;
  163. }
  164. if (!led->cdev.brightness) {
  165. led->cdev.brightness = LED_FULL;
  166. ret = aw2013_brightness_set(&led->cdev, led->cdev.brightness);
  167. if (ret)
  168. return ret;
  169. }
  170. /* Never on - just set to off */
  171. if (!*delay_on) {
  172. led->cdev.brightness = LED_OFF;
  173. return aw2013_brightness_set(&led->cdev, LED_OFF);
  174. }
  175. mutex_lock(&led->chip->mutex);
  176. /* Never off - brightness is already set, disable blinking */
  177. if (!*delay_off) {
  178. ret = regmap_update_bits(led->chip->regmap, AW2013_LCFG(num),
  179. AW2013_LCFG_MD, 0);
  180. goto out;
  181. }
  182. /* Convert into values the HW will understand. */
  183. off = min(5, ilog2((*delay_off - 1) / AW2013_TIME_STEP) + 1);
  184. on = min(7, ilog2((*delay_on - 1) / AW2013_TIME_STEP) + 1);
  185. *delay_off = BIT(off) * AW2013_TIME_STEP;
  186. *delay_on = BIT(on) * AW2013_TIME_STEP;
  187. /* Set timings */
  188. ret = regmap_write(led->chip->regmap,
  189. AW2013_LEDT0(num), AW2013_LEDT0_T2(on));
  190. if (ret)
  191. goto out;
  192. ret = regmap_write(led->chip->regmap,
  193. AW2013_LEDT1(num), AW2013_LEDT1_T4(off));
  194. if (ret)
  195. goto out;
  196. /* Finally, enable the LED */
  197. ret = regmap_update_bits(led->chip->regmap, AW2013_LCFG(num),
  198. AW2013_LCFG_MD, 0xFF);
  199. if (ret)
  200. goto out;
  201. ret = regmap_update_bits(led->chip->regmap, AW2013_LCTR,
  202. AW2013_LCTR_LE(num), 0xFF);
  203. out:
  204. mutex_unlock(&led->chip->mutex);
  205. return ret;
  206. }
  207. static int aw2013_probe_dt(struct aw2013 *chip)
  208. {
  209. struct device_node *np = dev_of_node(&chip->client->dev), *child;
  210. int count, ret = 0, i = 0;
  211. struct aw2013_led *led;
  212. count = of_get_available_child_count(np);
  213. if (!count || count > AW2013_MAX_LEDS)
  214. return -EINVAL;
  215. regmap_write(chip->regmap, AW2013_RSTR, AW2013_RSTR_RESET);
  216. for_each_available_child_of_node(np, child) {
  217. struct led_init_data init_data = {};
  218. u32 source;
  219. u32 imax;
  220. ret = of_property_read_u32(child, "reg", &source);
  221. if (ret != 0 || source >= AW2013_MAX_LEDS) {
  222. dev_err(&chip->client->dev,
  223. "Couldn't read LED address: %d\n", ret);
  224. count--;
  225. continue;
  226. }
  227. led = &chip->leds[i];
  228. led->num = source;
  229. led->chip = chip;
  230. init_data.fwnode = of_fwnode_handle(child);
  231. if (!of_property_read_u32(child, "led-max-microamp", &imax)) {
  232. led->imax = min_t(u32, imax / 5000, 3);
  233. } else {
  234. led->imax = 1; // 5mA
  235. dev_info(&chip->client->dev,
  236. "DT property led-max-microamp is missing\n");
  237. }
  238. led->cdev.brightness_set_blocking = aw2013_brightness_set;
  239. led->cdev.blink_set = aw2013_blink_set;
  240. ret = devm_led_classdev_register_ext(&chip->client->dev,
  241. &led->cdev, &init_data);
  242. if (ret < 0) {
  243. of_node_put(child);
  244. return ret;
  245. }
  246. i++;
  247. }
  248. if (!count)
  249. return -EINVAL;
  250. chip->num_leds = i;
  251. return 0;
  252. }
  253. static const struct regmap_config aw2013_regmap_config = {
  254. .reg_bits = 8,
  255. .val_bits = 8,
  256. .max_register = AW2013_REG_MAX,
  257. };
  258. static int aw2013_probe(struct i2c_client *client)
  259. {
  260. struct aw2013 *chip;
  261. int ret;
  262. unsigned int chipid;
  263. chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL);
  264. if (!chip)
  265. return -ENOMEM;
  266. mutex_init(&chip->mutex);
  267. mutex_lock(&chip->mutex);
  268. chip->client = client;
  269. i2c_set_clientdata(client, chip);
  270. chip->regmap = devm_regmap_init_i2c(client, &aw2013_regmap_config);
  271. if (IS_ERR(chip->regmap)) {
  272. ret = PTR_ERR(chip->regmap);
  273. dev_err(&client->dev, "Failed to allocate register map: %d\n",
  274. ret);
  275. goto error;
  276. }
  277. chip->vcc_regulator = devm_regulator_get(&client->dev, "vcc");
  278. ret = PTR_ERR_OR_ZERO(chip->vcc_regulator);
  279. if (ret) {
  280. if (ret != -EPROBE_DEFER)
  281. dev_err(&client->dev,
  282. "Failed to request regulator: %d\n", ret);
  283. goto error;
  284. }
  285. ret = regulator_enable(chip->vcc_regulator);
  286. if (ret) {
  287. dev_err(&client->dev,
  288. "Failed to enable regulator: %d\n", ret);
  289. goto error;
  290. }
  291. ret = regmap_read(chip->regmap, AW2013_RSTR, &chipid);
  292. if (ret) {
  293. dev_err(&client->dev, "Failed to read chip ID: %d\n",
  294. ret);
  295. goto error_reg;
  296. }
  297. if (chipid != AW2013_RSTR_CHIP_ID) {
  298. dev_err(&client->dev, "Chip reported wrong ID: %x\n",
  299. chipid);
  300. ret = -ENODEV;
  301. goto error_reg;
  302. }
  303. ret = aw2013_probe_dt(chip);
  304. if (ret < 0)
  305. goto error_reg;
  306. ret = regulator_disable(chip->vcc_regulator);
  307. if (ret) {
  308. dev_err(&client->dev,
  309. "Failed to disable regulator: %d\n", ret);
  310. goto error;
  311. }
  312. mutex_unlock(&chip->mutex);
  313. return 0;
  314. error_reg:
  315. regulator_disable(chip->vcc_regulator);
  316. error:
  317. mutex_destroy(&chip->mutex);
  318. return ret;
  319. }
  320. static int aw2013_remove(struct i2c_client *client)
  321. {
  322. struct aw2013 *chip = i2c_get_clientdata(client);
  323. aw2013_chip_disable(chip);
  324. mutex_destroy(&chip->mutex);
  325. return 0;
  326. }
  327. static const struct of_device_id aw2013_match_table[] = {
  328. { .compatible = "awinic,aw2013", },
  329. { /* sentinel */ },
  330. };
  331. MODULE_DEVICE_TABLE(of, aw2013_match_table);
  332. static struct i2c_driver aw2013_driver = {
  333. .driver = {
  334. .name = "leds-aw2013",
  335. .of_match_table = of_match_ptr(aw2013_match_table),
  336. },
  337. .probe_new = aw2013_probe,
  338. .remove = aw2013_remove,
  339. };
  340. module_i2c_driver(aw2013_driver);
  341. MODULE_AUTHOR("Nikita Travkin <nikitos.tr@gmail.com>");
  342. MODULE_DESCRIPTION("AW2013 LED driver");
  343. MODULE_LICENSE("GPL v2");