leds-qti-flash.c 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. #define pr_fmt(fmt) "qti-flash: %s: " fmt, __func__
  7. #include <linux/errno.h>
  8. #include <linux/gpio.h>
  9. #include <linux/hrtimer.h>
  10. #include <linux/interrupt.h>
  11. #include <linux/kernel.h>
  12. #include <linux/led-class-flash.h>
  13. #include <linux/leds-qti-flash.h>
  14. #include <linux/module.h>
  15. #include <linux/of_device.h>
  16. #include <linux/of_gpio.h>
  17. #include <linux/of_irq.h>
  18. #include <linux/platform_device.h>
  19. #include <linux/power_supply.h>
  20. #include <linux/regmap.h>
  21. #include <linux/soc/qcom/battery_charger.h>
  22. #include "leds.h"
  23. #define FLASH_LED_REVISION1 0x00
  24. #define FLASH_LED_PERIPH_SUBTYPE 0x05
  25. #define FLASH_LED_STATUS1 0x06
  26. #define FLASH_LED_STATUS2 0x07
  27. #define FLASH_LED_OTST1_STATUS BIT(5)
  28. #define FLASH_LED_OTST2_STATUS BIT(4)
  29. #define FLASH_LED_VPH_PWR_LOW BIT(0)
  30. #define FLASH_INT_RT_STS 0x10
  31. #define FLASH_LED_FAULT_RT_STS BIT(0)
  32. #define FLASH_LED_ALL_RAMP_DN_DONE_RT_STS BIT(3)
  33. #define FLASH_LED_ALL_RAMP_UP_DONE_RT_STS BIT(4)
  34. #define FLASH_LED_SAFETY_TIMER(id) (0x3E + id)
  35. #define FLASH_LED_SAFETY_TIMER_EN_MASK BIT(7)
  36. #define FLASH_LED_SAFETY_TIMER_EN BIT(7)
  37. #define SAFETY_TIMER_MAX_TIMEOUT_MS 1280
  38. #define SAFETY_TIMER_MIN_TIMEOUT_MS 10
  39. #define SAFETY_TIMER_STEP_SIZE 10
  40. #define SAFETY_TIMER_DEFAULT_TIMEOUT_MS 200
  41. #define FLASH_LED_ITARGET(id) (0x42 + id)
  42. #define FLASH_LED_ITARGET_MASK GENMASK(6, 0)
  43. #define FLASH_ENABLE_CONTROL 0x46
  44. #define FLASH_MODULE_ENABLE BIT(7)
  45. #define FLASH_MODULE_DISABLE 0x0
  46. #define FLASH_LED_IRESOLUTION 0x49
  47. #define FLASH_LED_IRESOLUTION_MASK(id) BIT(id)
  48. #define FLASH_LED_STROBE_CTRL(id) (0x4A + id)
  49. #define FLASH_LED_STROBE_CFG_MASK GENMASK(6, 4)
  50. #define FLASH_LED_STROBE_CFG_SHIFT 4
  51. #define FLASH_LED_HW_SW_STROBE_SEL BIT(2)
  52. #define FLASH_LED_STROBE_SEL_SHIFT 2
  53. #define FLASH_LED_STROBE_TRIGGER BIT(1)
  54. #define FLASH_LED_STROBE_POLARITY BIT(0)
  55. #define FLASH_EN_LED_CTRL 0x4E
  56. #define FLASH_LED_ENABLE(id) BIT(id)
  57. #define FLASH_LED_DISABLE 0
  58. #define FLASH_LED_HDRM_WINDOW 0x4F
  59. #define FLASH_LED_HI_LO_WIN_MASK GENMASK(1, 0)
  60. #define FLASH_LED_HDRM_PRGM(id) (0x50 + id)
  61. #define FLASH_LED_HDRM_CTRL_MODE_MASK GENMASK(5, 4)
  62. #define FLASH_LED_VOLTAGE_MASK GENMASK(2, 0)
  63. #define FLASH_LED_WARMUP_DELAY 0x55
  64. #define FLASH_LED_WARMUP_DELAY_MASK GENMASK(1, 0)
  65. #define FLASH_LED_ISC_DELAY 0x56
  66. #define FLASH_LED_ISC_DELAY_MASK GENMASK(1, 0)
  67. #define FLASH_LED_RGLR_RAMP_RATE 0x58
  68. #define FLASH_LED_RAMP_UP_STEP_MASK GENMASK(6, 4)
  69. #define FLASH_LED_RAMP_DN_STEP_MASK GENMASK(2, 0)
  70. #define FLASH_LED_ALT_RAMP_DN_RATE 0x59
  71. #define FLASH_LED_ALTERNATE_DN_STEP_MASK GENMASK(1, 0)
  72. #define FLASH_LED_STROBE_DEBOUNCE 0x5A
  73. #define FLASH_LED_STROBE_DEBOUNCE_TIME_MASK GENMASK(1, 0)
  74. #define FLASH_LED_MITIGATION_SW 0x65
  75. #define FLASH_LED_LMH_MITIGATION_SW_EN BIT(0)
  76. #define FLASH_LED_MULTI_STROBE_CTRL 0x67
  77. #define FLASH_LED_FLASH_ONCE_ONLY BIT(0)
  78. #define FLASH_LED_THERMAL_OTST2_CFG1 0x78
  79. #define FLASH_LED_THERMAL_OTST1_CFG1 0x7A
  80. #define FLASH_LED_THERMAL_THRSH_MASK GENMASK(2, 0)
  81. #define FLASH_LED_V1_OTST1_THRSH_MIN 0x13
  82. #define FLASH_LED_V2_OTST1_THRSH_MIN 0x10
  83. #define FLASH_LED_OTST2_THRSH_MIN 0x30
  84. #define FLASH_LED_FAST_RAMPUP_CTRL 0x90
  85. #define FLASH_LED_FAST_RAMPUP_MODE BIT(4)
  86. #define FLASH_LED_SMART_FAST_RAMPUP_MODE BIT(1)
  87. #define FLASH_LED_EN_BOB_VDN_RMP_UP_DN BIT(0)
  88. #define MAX_IRES_LEVELS 2
  89. #define IRES_12P5_MAX_CURR_MA 1500
  90. #define IRES_5P0_MAX_CURR_MA 640
  91. #define TORCH_MAX_CURR_MA 500
  92. #define IRES_12P5_UA 12500
  93. #define IRES_5P0_UA 5000
  94. #define IRES_DEFAULT_UA IRES_12P5_UA
  95. #define MAX_FLASH_CURRENT_MA 2000
  96. #define IBATT_OCP_THRESH_DEFAULT_UA 4500000
  97. #define OTST1_CURR_LIM_MA 200
  98. #define OTST2_CURR_LIM_MA 500
  99. #define VLED_MAX_DEFAULT_UV 3500000
  100. #define LED_MASK_ALL(led) GENMASK(led->max_channels - 1, 0)
  101. enum flash_led_type {
  102. FLASH_LED_TYPE_UNKNOWN,
  103. FLASH_LED_TYPE_FLASH,
  104. FLASH_LED_TYPE_TORCH,
  105. };
  106. enum flash_led_revision {
  107. FLASH_LED_REVISION_2P0 = 1,
  108. };
  109. enum flash_led_subtype {
  110. FLASH_LED_4_CHAN = 0x7,
  111. };
  112. enum strobe_type {
  113. SW_STROBE = 0,
  114. HW_STROBE,
  115. };
  116. enum thermal_levels {
  117. OTST1_IDX,
  118. OTST2_IDX,
  119. OTST_MAX,
  120. };
  121. struct flash_node_data {
  122. struct qti_flash_led *led;
  123. struct led_classdev_flash fdev;
  124. u32 ires_ua;
  125. u32 default_ires_ua;
  126. u32 user_current_ma;
  127. u32 current_ma;
  128. u32 max_current;
  129. u8 duration;
  130. u8 id;
  131. u8 updated_ires_idx;
  132. u8 ires_idx;
  133. u8 strobe_config;
  134. u8 strobe_sel;
  135. enum flash_led_type type;
  136. bool configured;
  137. bool enabled;
  138. };
  139. struct flash_switch_data {
  140. struct qti_flash_led *led;
  141. struct led_classdev cdev;
  142. struct hrtimer on_timer;
  143. struct hrtimer off_timer;
  144. u64 on_time_ms;
  145. u64 off_time_ms;
  146. u32 led_mask;
  147. bool enabled;
  148. bool symmetry_en;
  149. };
  150. /**
  151. * struct qti_flash_led: Main Flash LED data structure
  152. * @pdev: Pointer for platform device
  153. * @regmap: Pointer for regmap structure
  154. * @fnode: Pointer for array of child LED devices
  155. * @snode: Pointer for array of child switch devices
  156. * @batt_psy: Pointer for battery power supply
  157. * @lock: Spinlock to be used for critical section
  158. * @num_fnodes: Number of flash/torch nodes defined in device
  159. * tree
  160. * @num_snodes: Number of switch nodes defined in device tree
  161. * @hw_strobe_gpio: Pointer for array of GPIOs for HW strobing
  162. * @all_ramp_up_done_irq: IRQ number for all ramp up interrupt
  163. * @all_ramp_down_done_irq: IRQ number for all ramp down interrupt
  164. * @led_fault_irq: IRQ number for LED fault interrupt
  165. * @max_current: Maximum current available for flash
  166. * @thermal_derate_current: Thermal derating current limits
  167. * @base: Base address of the flash LED module
  168. * @revision: Revision of the flash LED module
  169. * @subtype: Peripheral subtype of the flash LED module
  170. * @max_channels: Maximum number of channels supported by flash
  171. * module
  172. * @chan_en_map: Bit map of individual channel enable
  173. * @module_en: Flag used to enable/disable flash LED module
  174. * @trigger_lmh: Flag to enable lmh mitigation
  175. * @non_all_mask_switch_present: Used in handling symmetry for all_mask switch
  176. * @secure_vm: Flag indicating whether flash LED is used by
  177. * secure VM
  178. * @debug_board_present: Flag to indicate debug board present
  179. * @ext_led: Flag to indicate LED channel used to power
  180. * external IR LED with HW strobing.
  181. */
  182. struct qti_flash_led {
  183. struct platform_device *pdev;
  184. struct regmap *regmap;
  185. struct flash_node_data *fnode;
  186. struct flash_switch_data *snode;
  187. struct power_supply *batt_psy;
  188. spinlock_t lock;
  189. u32 num_fnodes;
  190. u32 num_snodes;
  191. int *hw_strobe_gpio;
  192. int all_ramp_up_done_irq;
  193. int all_ramp_down_done_irq;
  194. int led_fault_irq;
  195. int max_current;
  196. int thermal_derate_current[OTST_MAX];
  197. u16 base;
  198. u8 revision;
  199. u8 subtype;
  200. u8 max_channels;
  201. u8 chan_en_map;
  202. bool module_en;
  203. bool trigger_lmh;
  204. bool non_all_mask_switch_present;
  205. bool secure_vm;
  206. bool debug_board_present;
  207. bool ext_led;
  208. };
  209. struct flash_current_headroom {
  210. u16 current_ma;
  211. u16 headroom_mv;
  212. };
  213. static const struct flash_current_headroom pm8350c_map[4] = {
  214. {750, 200}, {1000, 250}, {1250, 300}, {1500, 400},
  215. };
  216. static const u32 flash_led_max_ires_values[MAX_IRES_LEVELS] = {
  217. IRES_5P0_MAX_CURR_MA, IRES_12P5_MAX_CURR_MA
  218. };
  219. static int timeout_to_code(u32 timeout)
  220. {
  221. if (!timeout || timeout > SAFETY_TIMER_MAX_TIMEOUT_MS)
  222. return -EINVAL;
  223. return DIV_ROUND_CLOSEST(timeout, SAFETY_TIMER_STEP_SIZE) - 1;
  224. }
  225. static int get_ires_idx(u32 ires_ua)
  226. {
  227. if (ires_ua == IRES_5P0_UA)
  228. return 0;
  229. else if (ires_ua == IRES_12P5_UA)
  230. return 1;
  231. else
  232. return -EINVAL;
  233. }
  234. static int current_to_code(u32 target_curr_ma, u32 ires_ua)
  235. {
  236. if (!ires_ua || !target_curr_ma ||
  237. (target_curr_ma < DIV_ROUND_CLOSEST(ires_ua, 1000)))
  238. return 0;
  239. return DIV_ROUND_CLOSEST(target_curr_ma * 1000, ires_ua) - 1;
  240. }
  241. static bool is_channel_configured(struct flash_node_data *fnode)
  242. {
  243. int i;
  244. for (i = 0; i < fnode->led->num_fnodes; i++) {
  245. if (fnode->led->fnode[i].id == fnode->id &&
  246. fnode->led->fnode[i].type != fnode->type &&
  247. fnode->led->fnode[i].configured) {
  248. pr_debug("Channel %d for %s is already configured by %s\n", fnode->id,
  249. fnode->fdev.led_cdev.name, fnode->led->fnode[i].fdev.led_cdev.name);
  250. return true;
  251. }
  252. }
  253. return false;
  254. }
  255. static int qti_flash_led_read(struct qti_flash_led *led, u16 offset,
  256. u8 *data, u8 len)
  257. {
  258. int rc;
  259. rc = regmap_bulk_read(led->regmap, (led->base + offset), data, len);
  260. if (rc < 0)
  261. pr_err("Failed to read from 0x%04X rc = %d\n",
  262. (led->base + offset), rc);
  263. else
  264. pr_debug("Read %*ph from addr %#x\n", len, data,
  265. (led->base + offset));
  266. return rc;
  267. }
  268. static int qti_flash_led_write(struct qti_flash_led *led, u16 offset,
  269. u8 *data, u8 len)
  270. {
  271. int rc;
  272. rc = regmap_bulk_write(led->regmap, (led->base + offset), data,
  273. len);
  274. if (rc < 0)
  275. pr_err("Failed to write to 0x%04X rc = %d\n",
  276. (led->base + offset), rc);
  277. else
  278. pr_debug("Wrote %*ph to addr %#x\n", len, data,
  279. (led->base + offset));
  280. return rc;
  281. }
  282. static int qti_flash_led_masked_write(struct qti_flash_led *led,
  283. u16 offset, u8 mask, u8 data)
  284. {
  285. int rc;
  286. rc = regmap_update_bits(led->regmap, (led->base + offset),
  287. mask, data);
  288. if (rc < 0)
  289. pr_err("Failed to update bits from 0x%04X, rc = %d\n",
  290. (led->base + offset), rc);
  291. else
  292. pr_debug("Wrote %#x mask %#x to addr %#x\n", data, mask,
  293. (led->base + offset));
  294. return rc;
  295. }
  296. static int qti_flash_led_module_control(struct qti_flash_led *led,
  297. bool enable)
  298. {
  299. int rc = 0;
  300. u8 val;
  301. if (enable) {
  302. if (!led->module_en && led->chan_en_map) {
  303. val = FLASH_MODULE_ENABLE;
  304. rc = qti_flash_led_write(led, FLASH_ENABLE_CONTROL,
  305. &val, 1);
  306. if (rc < 0)
  307. return rc;
  308. led->module_en = true;
  309. }
  310. } else {
  311. if (led->module_en && !led->chan_en_map) {
  312. val = FLASH_MODULE_DISABLE;
  313. rc = qti_flash_led_write(led, FLASH_ENABLE_CONTROL,
  314. &val, 1);
  315. if (rc < 0)
  316. return rc;
  317. led->module_en = false;
  318. }
  319. }
  320. return rc;
  321. }
  322. static int qti_flash_lmh_mitigation_config(struct qti_flash_led *led,
  323. bool enable)
  324. {
  325. u8 val = enable ? FLASH_LED_LMH_MITIGATION_SW_EN : 0;
  326. int rc;
  327. if (led->debug_board_present || enable == led->trigger_lmh)
  328. return 0;
  329. rc = qti_flash_led_write(led, FLASH_LED_MITIGATION_SW, &val, 1);
  330. if (rc < 0) {
  331. pr_err("Failed to %s LMH mitigation, rc=%d\n",
  332. enable ? "enable" : "disable", rc);
  333. } else {
  334. pr_debug("%s LMH mitigation\n",
  335. enable ? "enabled" : "disabled");
  336. led->trigger_lmh = enable;
  337. }
  338. return rc;
  339. }
  340. static int qti_flash_led_strobe(struct qti_flash_led *led,
  341. struct flash_switch_data *snode,
  342. u8 mask, u8 value)
  343. {
  344. int rc, i;
  345. bool enable = mask & value;
  346. unsigned long flags;
  347. spin_lock_irqsave(&led->lock, flags);
  348. if (enable) {
  349. for (i = 0; i < led->max_channels; i++)
  350. if ((mask & BIT(i)) && (value & BIT(i)))
  351. led->chan_en_map |= BIT(i);
  352. rc = qti_flash_led_module_control(led, enable);
  353. if (rc < 0)
  354. goto error;
  355. if (snode && snode->off_time_ms) {
  356. pr_debug("Off timer started with delay %d ms\n",
  357. snode->off_time_ms);
  358. hrtimer_start(&snode->off_timer,
  359. ms_to_ktime(snode->off_time_ms),
  360. HRTIMER_MODE_REL);
  361. }
  362. rc = qti_flash_led_masked_write(led, FLASH_EN_LED_CTRL,
  363. mask, value);
  364. if (rc < 0)
  365. goto error;
  366. } else {
  367. for (i = 0; i < led->max_channels; i++)
  368. if ((led->chan_en_map & BIT(i)) &&
  369. (mask & BIT(i)) && !(value & BIT(i)))
  370. led->chan_en_map &= ~(BIT(i));
  371. rc = qti_flash_led_masked_write(led, FLASH_EN_LED_CTRL,
  372. mask, value);
  373. if (rc < 0)
  374. goto error;
  375. if (led->trigger_lmh) {
  376. rc = qti_flash_lmh_mitigation_config(led, false);
  377. if (rc < 0)
  378. goto error;
  379. }
  380. rc = qti_flash_led_module_control(led, enable);
  381. if (rc < 0)
  382. goto error;
  383. }
  384. error:
  385. spin_unlock_irqrestore(&led->lock, flags);
  386. return rc;
  387. }
  388. static int qti_flash_led_enable(struct flash_node_data *fnode)
  389. {
  390. struct qti_flash_led *led = fnode->led;
  391. int rc;
  392. u8 val, addr_offset;
  393. unsigned long flags;
  394. addr_offset = fnode->id;
  395. spin_lock_irqsave(&led->lock, flags);
  396. val = (fnode->updated_ires_idx ? 0 : 1) << fnode->id;
  397. rc = qti_flash_led_masked_write(led, FLASH_LED_IRESOLUTION,
  398. FLASH_LED_IRESOLUTION_MASK(fnode->id), val);
  399. if (rc < 0)
  400. goto out;
  401. rc = qti_flash_led_masked_write(led,
  402. FLASH_LED_ITARGET(addr_offset), FLASH_LED_ITARGET_MASK,
  403. current_to_code(fnode->current_ma, fnode->ires_ua));
  404. if (rc < 0)
  405. goto out;
  406. /*
  407. * For dynamic brightness control of Torch LEDs,
  408. * just configure the target current.
  409. */
  410. if (fnode->type == FLASH_LED_TYPE_TORCH && fnode->enabled) {
  411. spin_unlock_irqrestore(&led->lock, flags);
  412. return 0;
  413. }
  414. if (fnode->type == FLASH_LED_TYPE_FLASH && !led->ext_led) {
  415. val = fnode->duration | FLASH_LED_SAFETY_TIMER_EN;
  416. rc = qti_flash_led_write(led,
  417. FLASH_LED_SAFETY_TIMER(addr_offset), &val, 1);
  418. if (rc < 0)
  419. goto out;
  420. }
  421. fnode->configured = true;
  422. if ((fnode->strobe_sel == HW_STROBE) &&
  423. gpio_is_valid(led->hw_strobe_gpio[fnode->id]))
  424. gpio_set_value(led->hw_strobe_gpio[fnode->id], 1);
  425. out:
  426. spin_unlock_irqrestore(&led->lock, flags);
  427. return rc;
  428. }
  429. static int qti_flash_led_disable(struct flash_node_data *fnode)
  430. {
  431. struct qti_flash_led *led = fnode->led;
  432. int rc;
  433. unsigned long flags;
  434. if (!fnode->configured) {
  435. pr_debug("%s is not configured\n", fnode->fdev.led_cdev.name);
  436. return 0;
  437. }
  438. spin_lock_irqsave(&led->lock, flags);
  439. if ((fnode->strobe_sel == HW_STROBE) &&
  440. gpio_is_valid(led->hw_strobe_gpio[fnode->id]))
  441. gpio_set_value(led->hw_strobe_gpio[fnode->id], 0);
  442. rc = qti_flash_led_masked_write(led,
  443. FLASH_LED_ITARGET(fnode->id), FLASH_LED_ITARGET_MASK, 0);
  444. if (rc < 0)
  445. goto out;
  446. rc = qti_flash_led_masked_write(led,
  447. FLASH_LED_SAFETY_TIMER(fnode->id),
  448. FLASH_LED_SAFETY_TIMER_EN_MASK, 0);
  449. if (rc < 0)
  450. goto out;
  451. fnode->configured = false;
  452. fnode->current_ma = 0;
  453. fnode->user_current_ma = 0;
  454. out:
  455. spin_unlock_irqrestore(&led->lock, flags);
  456. return rc;
  457. }
  458. static enum led_brightness qti_flash_led_brightness_get(
  459. struct led_classdev *led_cdev)
  460. {
  461. return led_cdev->brightness;
  462. }
  463. static int __qti_flash_led_brightness_set(struct led_classdev *led_cdev,
  464. enum led_brightness brightness)
  465. {
  466. struct flash_node_data *fnode = NULL;
  467. struct led_classdev_flash *fdev = NULL;
  468. int rc;
  469. u32 current_ma = brightness;
  470. u32 min_current_ma;
  471. fdev = container_of(led_cdev, struct led_classdev_flash, led_cdev);
  472. fnode = container_of(fdev, struct flash_node_data, fdev);
  473. if (!brightness) {
  474. rc = qti_flash_led_strobe(fnode->led, NULL,
  475. FLASH_LED_ENABLE(fnode->id), 0);
  476. if (rc < 0) {
  477. pr_err("Failed to destrobe LED, rc=%d\n", rc);
  478. return rc;
  479. }
  480. rc = qti_flash_led_disable(fnode);
  481. if (rc < 0)
  482. pr_err("Failed to disable LED\n");
  483. led_cdev->brightness = 0;
  484. return rc;
  485. }
  486. min_current_ma = DIV_ROUND_CLOSEST(fnode->ires_ua, 1000);
  487. if (current_ma < min_current_ma)
  488. current_ma = min_current_ma;
  489. fnode->updated_ires_idx = fnode->ires_idx;
  490. fnode->ires_ua = fnode->default_ires_ua;
  491. current_ma = min(current_ma, fnode->max_current);
  492. if (current_ma > flash_led_max_ires_values[fnode->ires_idx]) {
  493. if (current_ma > IRES_5P0_MAX_CURR_MA)
  494. fnode->ires_ua = IRES_12P5_UA;
  495. else
  496. fnode->ires_ua = IRES_5P0_UA;
  497. fnode->ires_idx = get_ires_idx(fnode->ires_ua);
  498. }
  499. fnode->current_ma = current_ma;
  500. led_cdev->brightness = current_ma;
  501. rc = qti_flash_led_enable(fnode);
  502. if (rc < 0)
  503. pr_err("Failed to set brightness %d to LED\n", brightness);
  504. return rc;
  505. }
  506. static int qti_flash_config_group_symmetry(struct qti_flash_led *led,
  507. enum flash_led_type type,
  508. u32 led_mask)
  509. {
  510. int i, rc = 0, total_curr_ma = 0, symmetric_leds = 0, per_led_curr_ma;
  511. for (i = 0; i < led->num_fnodes; i++) {
  512. if ((led_mask & BIT(led->fnode[i].id)) &&
  513. (led->fnode[i].type == type)) {
  514. total_curr_ma += led->fnode[i].user_current_ma;
  515. symmetric_leds++;
  516. }
  517. }
  518. if (!symmetric_leds) {
  519. pr_err("led-mask %#x has zero symmetric leds\n", led_mask);
  520. return -EINVAL;
  521. }
  522. per_led_curr_ma = total_curr_ma / symmetric_leds;
  523. pr_debug("mask: %#x symmetric_leds: %d total: %d per_led_curr_ma: %d\n",
  524. led_mask, symmetric_leds, total_curr_ma, per_led_curr_ma);
  525. for (i = 0; i < led->num_fnodes; i++) {
  526. if (led_mask & BIT(led->fnode[i].id) &&
  527. led->fnode[i].type == type) {
  528. rc = __qti_flash_led_brightness_set(
  529. &led->fnode[i].fdev.led_cdev, per_led_curr_ma);
  530. if (rc < 0)
  531. return rc;
  532. }
  533. }
  534. return rc;
  535. }
  536. static int qti_flash_led_symmetry_config(struct flash_switch_data *snode)
  537. {
  538. struct qti_flash_led *led = snode->led;
  539. enum flash_led_type type = FLASH_LED_TYPE_UNKNOWN;
  540. int i, rc = 0;
  541. /* Determine which LED type has triggered switch ON */
  542. for (i = 0; i < led->num_fnodes; i++) {
  543. if ((snode->led_mask & BIT(led->fnode[i].id)) &&
  544. (led->fnode[i].configured))
  545. type = led->fnode[i].type;
  546. }
  547. if (type == FLASH_LED_TYPE_UNKNOWN) {
  548. /* No channels are configured */
  549. return 0;
  550. }
  551. if (snode->led_mask == LED_MASK_ALL(led) &&
  552. led->non_all_mask_switch_present) {
  553. /*
  554. * Gather masks from the other switches and configure symmetry
  555. * accordingly.
  556. */
  557. for (i = 0; i < led->num_snodes; i++) {
  558. if (led->snode[i].led_mask != LED_MASK_ALL(led)) {
  559. rc = qti_flash_config_group_symmetry(led, type,
  560. led->snode[i].led_mask);
  561. if (rc < 0)
  562. return rc;
  563. }
  564. }
  565. } else {
  566. rc = qti_flash_config_group_symmetry(led, type,
  567. snode->led_mask);
  568. }
  569. return rc;
  570. }
  571. static void qti_flash_led_brightness_set(struct led_classdev *led_cdev,
  572. enum led_brightness brightness)
  573. {
  574. struct led_classdev_flash *fdev;
  575. struct flash_node_data *fnode;
  576. struct qti_flash_led *led;
  577. int i, rc;
  578. fdev = container_of(led_cdev, struct led_classdev_flash, led_cdev);
  579. fnode = container_of(fdev, struct flash_node_data, fdev);
  580. led = fnode->led;
  581. if (is_channel_configured(fnode))
  582. return;
  583. rc = __qti_flash_led_brightness_set(led_cdev, brightness);
  584. if (!rc)
  585. fnode->user_current_ma = brightness;
  586. else
  587. return;
  588. for (i = 0; i < led->num_snodes; i++) {
  589. pr_debug("snode[%d] symm %d, enabled %d\n", i,
  590. led->snode[i].symmetry_en,
  591. led->snode[i].enabled);
  592. if (led->snode[i].symmetry_en && led->snode[i].enabled) {
  593. qti_flash_led_symmetry_config(&led->snode[i]);
  594. break;
  595. }
  596. }
  597. }
  598. #define FLASH_LMH_TRIGGER_LIMIT_MA 1000
  599. static int qti_flash_switch_enable(struct flash_switch_data *snode)
  600. {
  601. struct qti_flash_led *led = snode->led;
  602. int rc = 0, total_curr_ma = 0, i;
  603. enum flash_led_type type = FLASH_LED_TYPE_UNKNOWN;
  604. u8 led_en = 0;
  605. /* If symmetry enabled switch, then turn ON all its LEDs */
  606. if (snode->symmetry_en) {
  607. rc = qti_flash_led_symmetry_config(snode);
  608. if (rc < 0) {
  609. pr_err("Failed to configure switch symmetrically, rc=%d\n",
  610. rc);
  611. return rc;
  612. }
  613. }
  614. for (i = 0; i < led->num_fnodes; i++) {
  615. /*
  616. * Do not turn ON flash/torch device if
  617. * i. the device is not under this switch or
  618. * ii. brightness is not configured for device under this switch
  619. */
  620. if (!(snode->led_mask & BIT(led->fnode[i].id)) ||
  621. !led->fnode[i].configured)
  622. continue;
  623. /*
  624. * For flash, LMH mitigation needs to be enabled
  625. * if total current used is greater than or
  626. * equal to 1A.
  627. */
  628. type = led->fnode[i].type;
  629. if (type == FLASH_LED_TYPE_FLASH)
  630. total_curr_ma += led->fnode[i].user_current_ma;
  631. led_en |= (1 << led->fnode[i].id);
  632. }
  633. if (total_curr_ma >= FLASH_LMH_TRIGGER_LIMIT_MA) {
  634. rc = qti_flash_lmh_mitigation_config(led, true);
  635. if (rc < 0)
  636. return rc;
  637. /* Wait for lmh mitigation to take effect */
  638. udelay(500);
  639. } else if (led->trigger_lmh) {
  640. rc = qti_flash_lmh_mitigation_config(led, false);
  641. if (rc < 0)
  642. return rc;
  643. }
  644. return qti_flash_led_strobe(led, snode, snode->led_mask, led_en);
  645. }
  646. static int qti_flash_switch_disable(struct flash_switch_data *snode)
  647. {
  648. struct qti_flash_led *led = snode->led;
  649. int rc = 0, i;
  650. u8 led_dis = 0;
  651. for (i = 0; i < led->num_fnodes; i++) {
  652. if (!(snode->led_mask & BIT(led->fnode[i].id)) ||
  653. !led->fnode[i].configured)
  654. continue;
  655. led_dis |= BIT(led->fnode[i].id);
  656. }
  657. rc = qti_flash_led_strobe(led, NULL, led_dis, ~led_dis);
  658. if (rc < 0) {
  659. pr_err("Failed to destrobe LEDs under with switch, rc=%d\n",
  660. rc);
  661. return rc;
  662. }
  663. for (i = 0; i < led->num_fnodes; i++) {
  664. /*
  665. * Do not turn OFF flash/torch device if
  666. * i. the device is not under this switch or
  667. * ii. brightness is not configured for device under this switch
  668. */
  669. if (!(snode->led_mask & BIT(led->fnode[i].id)) ||
  670. !led->fnode[i].configured)
  671. continue;
  672. rc = qti_flash_led_disable(&led->fnode[i]);
  673. if (rc < 0) {
  674. pr_err("Failed to disable LED%d\n",
  675. &led->fnode[i].id);
  676. break;
  677. }
  678. }
  679. snode->on_time_ms = 0;
  680. snode->off_time_ms = 0;
  681. return rc;
  682. }
  683. static void qti_flash_led_switch_brightness_set(
  684. struct led_classdev *led_cdev, enum led_brightness value)
  685. {
  686. struct flash_switch_data *snode = NULL;
  687. int rc = 0;
  688. bool state = value > 0;
  689. snode = container_of(led_cdev, struct flash_switch_data, cdev);
  690. if (snode->enabled == state) {
  691. pr_debug("Switch is already %s!\n",
  692. state ? "enabled" : "disabled");
  693. return;
  694. }
  695. if (state) {
  696. if (snode->on_time_ms) {
  697. pr_debug("On timer started with delay %d ms\n",
  698. snode->on_time_ms);
  699. hrtimer_start(&snode->on_timer,
  700. ms_to_ktime(snode->on_time_ms),
  701. HRTIMER_MODE_REL);
  702. return;
  703. }
  704. rc = qti_flash_switch_enable(snode);
  705. } else {
  706. rc = qti_flash_switch_disable(snode);
  707. }
  708. if (rc < 0)
  709. pr_err("Failed to %s switch, rc=%d\n",
  710. state ? "enable" : "disable", rc);
  711. else
  712. snode->enabled = state;
  713. }
  714. static struct led_classdev *trigger_to_lcdev(struct led_trigger *trig)
  715. {
  716. struct led_classdev *led_cdev;
  717. rcu_read_lock();
  718. list_for_each_entry_rcu(led_cdev, &trig->led_cdevs, trig_list) {
  719. if (!strcmp(led_cdev->default_trigger, trig->name)) {
  720. rcu_read_unlock();
  721. return led_cdev;
  722. }
  723. }
  724. rcu_read_unlock();
  725. return NULL;
  726. }
  727. static enum hrtimer_restart off_timer_function(struct hrtimer *timer)
  728. {
  729. struct flash_switch_data *snode = container_of(timer,
  730. struct flash_switch_data, off_timer);
  731. int rc = 0;
  732. rc = qti_flash_switch_disable(snode);
  733. if (rc < 0)
  734. pr_err("Failed to disable flash LED switch %s, rc=%d\n",
  735. snode->cdev.name, rc);
  736. else
  737. snode->enabled = false;
  738. return HRTIMER_NORESTART;
  739. }
  740. static enum hrtimer_restart on_timer_function(struct hrtimer *timer)
  741. {
  742. struct flash_switch_data *snode = container_of(timer,
  743. struct flash_switch_data, on_timer);
  744. int rc = 0;
  745. rc = qti_flash_switch_enable(snode);
  746. if (rc < 0) {
  747. snode->enabled = false;
  748. pr_err("Failed to enable flash LED switch %s, rc=%d\n",
  749. snode->cdev.name, rc);
  750. } else {
  751. snode->enabled = true;
  752. }
  753. return HRTIMER_NORESTART;
  754. }
  755. int qti_flash_led_set_param(struct led_trigger *trig,
  756. struct flash_led_param param)
  757. {
  758. struct led_classdev *led_cdev = trigger_to_lcdev(trig);
  759. struct flash_switch_data *snode;
  760. if (!led_cdev) {
  761. pr_err("Invalid led_cdev in trigger %s\n", trig->name);
  762. return -EINVAL;
  763. }
  764. if (!param.on_time_ms && !param.off_time_ms) {
  765. pr_err("Invalid param, on_time/off_time cannot be 0\n");
  766. return -EINVAL;
  767. }
  768. snode = container_of(led_cdev, struct flash_switch_data, cdev);
  769. snode->on_time_ms = param.on_time_ms;
  770. snode->off_time_ms = param.off_time_ms;
  771. return 0;
  772. }
  773. EXPORT_SYMBOL(qti_flash_led_set_param);
  774. #if IS_ENABLED(CONFIG_LEDS_QTI_FLASH) && (IS_ENABLED(CONFIG_SENSORS_STK6D2X) || IS_ENABLED(CONFIG_SENSORS_TSL2511))
  775. #define FLASH_LED_MULTI_STROBE_CTRL 0x67
  776. #define FLASH_LED_MULTI_STROBE_SEL BIT(0)
  777. int qti_flash_led_set_strobe_sel(struct led_trigger *trig,
  778. int strobe_sel)
  779. {
  780. struct led_classdev *led_cdev = trigger_to_lcdev(trig);
  781. struct flash_switch_data *snode;
  782. struct qti_flash_led *led;
  783. int rc = 0, i;
  784. if (!led_cdev) {
  785. pr_err("Invalid led_cdev in trigger %s\n", trig->name);
  786. return -EINVAL;
  787. }
  788. snode = container_of(led_cdev, struct flash_switch_data, cdev);
  789. led = snode->led;
  790. for (i = 0; i < led->num_fnodes; i++) {
  791. led->fnode[i].strobe_sel = strobe_sel; //0:SW_STROBE, 1:HW_STROBE
  792. rc = qti_flash_led_masked_write(led,
  793. FLASH_LED_STROBE_CTRL(led->fnode[i].id), FLASH_LED_HW_SW_STROBE_SEL, led->fnode[i].strobe_sel << FLASH_LED_STROBE_SEL_SHIFT);
  794. if (rc < 0)
  795. return rc;
  796. }
  797. qti_flash_led_masked_write(led,
  798. FLASH_LED_MULTI_STROBE_CTRL, FLASH_LED_MULTI_STROBE_SEL, strobe_sel? 0 : 1);
  799. return 0;
  800. }
  801. EXPORT_SYMBOL(qti_flash_led_set_strobe_sel);
  802. #endif
  803. #define UCONV 1000000LL
  804. #define MCONV 1000LL
  805. #define VIN_FLASH_MIN_UV 3300000LL
  806. #define BOB_EFFICIENCY 900LL
  807. #define VFLASH_DIP_MARGIN_UV 50000
  808. #define VOLTAGE_HDRM_DEFAULT_MV 400
  809. #define VDIP_THRESH_DEFAULT_UV 2800000LL
  810. static int qti_flash_led_get_voltage_headroom(
  811. struct qti_flash_led *led)
  812. {
  813. static const struct flash_current_headroom *hdrm_map;
  814. int i, j, voltage_hdrm_mv = 0, voltage_hdrm_max = 0;
  815. u32 map_size = 0;
  816. if (led->subtype == FLASH_LED_4_CHAN) {
  817. hdrm_map = pm8350c_map;
  818. map_size = ARRAY_SIZE(pm8350c_map);
  819. }
  820. for (i = 0; i < led->num_fnodes; i++) {
  821. if (!led->fnode[i].configured)
  822. continue;
  823. voltage_hdrm_mv = VOLTAGE_HDRM_DEFAULT_MV;
  824. for (j = 0; j < map_size; j++) {
  825. if (led->fnode[i].current_ma <= hdrm_map[j].current_ma)
  826. voltage_hdrm_mv = hdrm_map[j].headroom_mv;
  827. }
  828. voltage_hdrm_max = max(voltage_hdrm_max, voltage_hdrm_mv);
  829. }
  830. if (!voltage_hdrm_max)
  831. voltage_hdrm_max = VOLTAGE_HDRM_DEFAULT_MV;
  832. return voltage_hdrm_max;
  833. }
  834. static int qti_flash_led_calc_max_avail_current(
  835. struct qti_flash_led *led,
  836. int *max_current_ma)
  837. {
  838. int rc;
  839. int rbatt_uohm, ocv_uv, ibatt_now_ua, voltage_hdrm_mv;
  840. int64_t ibatt_safe_ua, i_flash_ua, i_avail_ua, vflash_vdip,
  841. vph_flash_uv, vin_flash_uv, p_flash_fw;
  842. union power_supply_propval prop = {};
  843. if (!led->batt_psy)
  844. led->batt_psy = power_supply_get_by_name("battery");
  845. if (!led->batt_psy) {
  846. *max_current_ma = MAX_FLASH_CURRENT_MA;
  847. return 0;
  848. }
  849. rc = qti_battery_charger_get_prop("battery", BATTERY_RESISTANCE,
  850. &rbatt_uohm);
  851. if (rc < 0) {
  852. pr_err("Failed to get battery resistance, rc=%d\n",
  853. rc);
  854. return rc;
  855. }
  856. if (!rbatt_uohm) {
  857. *max_current_ma = MAX_FLASH_CURRENT_MA;
  858. led->debug_board_present = true;
  859. return 0;
  860. }
  861. rc = power_supply_get_property(led->batt_psy,
  862. POWER_SUPPLY_PROP_VOLTAGE_OCV, &prop);
  863. if (rc < 0) {
  864. pr_err("Failed to get battery OCV, rc=%d\n", rc);
  865. return rc;
  866. }
  867. ocv_uv = prop.intval;
  868. rc = power_supply_get_property(led->batt_psy,
  869. POWER_SUPPLY_PROP_CURRENT_NOW, &prop);
  870. if (rc < 0) {
  871. pr_err("Failed to get battery current, rc=%d\n", rc);
  872. return rc;
  873. }
  874. /* Battery power supply returns -ve value for discharging */
  875. ibatt_now_ua = -(prop.intval);
  876. voltage_hdrm_mv = qti_flash_led_get_voltage_headroom(led);
  877. vflash_vdip = VDIP_THRESH_DEFAULT_UV;
  878. ibatt_safe_ua = DIV_ROUND_CLOSEST((ocv_uv -
  879. (vflash_vdip + VFLASH_DIP_MARGIN_UV)) * UCONV,
  880. rbatt_uohm);
  881. if (ibatt_safe_ua < IBATT_OCP_THRESH_DEFAULT_UA) {
  882. i_flash_ua = ibatt_safe_ua - ibatt_now_ua;
  883. vph_flash_uv = vflash_vdip + VFLASH_DIP_MARGIN_UV;
  884. } else {
  885. i_flash_ua = IBATT_OCP_THRESH_DEFAULT_UA - ibatt_now_ua;
  886. vph_flash_uv = ocv_uv - DIV_ROUND_CLOSEST((int64_t)rbatt_uohm
  887. * IBATT_OCP_THRESH_DEFAULT_UA, UCONV);
  888. }
  889. vin_flash_uv = max(VLED_MAX_DEFAULT_UV +
  890. (voltage_hdrm_mv * MCONV), VIN_FLASH_MIN_UV);
  891. p_flash_fw = BOB_EFFICIENCY * vph_flash_uv * i_flash_ua;
  892. i_avail_ua = DIV_ROUND_CLOSEST(p_flash_fw, (vin_flash_uv * MCONV));
  893. *max_current_ma = min(MAX_FLASH_CURRENT_MA,
  894. (int)(DIV_ROUND_CLOSEST(i_avail_ua, MCONV)));
  895. pr_debug("rbatt_uohm=%d ocv_uv=%d ibatt_now_ua=%d i_avail_ua=%lld\n",
  896. rbatt_uohm, ocv_uv, ibatt_now_ua, i_avail_ua);
  897. return 0;
  898. }
  899. static int qti_flash_led_calc_thermal_current(
  900. struct qti_flash_led *led,
  901. int *thermal_current_limit)
  902. {
  903. int rc;
  904. u8 otst_status, thrsh_min = 0;
  905. if (led->subtype == FLASH_LED_4_CHAN) {
  906. thrsh_min = FLASH_LED_V1_OTST1_THRSH_MIN;
  907. if (led->revision == FLASH_LED_REVISION_2P0)
  908. thrsh_min = FLASH_LED_V2_OTST1_THRSH_MIN;
  909. }
  910. rc = qti_flash_led_masked_write(led,
  911. FLASH_LED_THERMAL_OTST1_CFG1,
  912. FLASH_LED_THERMAL_THRSH_MASK,
  913. thrsh_min);
  914. if (rc < 0)
  915. return rc;
  916. rc = qti_flash_led_masked_write(led,
  917. FLASH_LED_THERMAL_OTST2_CFG1,
  918. FLASH_LED_THERMAL_THRSH_MASK,
  919. FLASH_LED_OTST2_THRSH_MIN);
  920. if (rc < 0)
  921. return rc;
  922. /* Check THERMAL OTST status */
  923. rc = qti_flash_led_read(led, FLASH_LED_STATUS2, &otst_status, 1);
  924. if (rc < 0)
  925. return rc;
  926. if (otst_status & FLASH_LED_OTST1_STATUS)
  927. *thermal_current_limit = led->thermal_derate_current[OTST1_IDX];
  928. else if (otst_status & FLASH_LED_OTST2_STATUS)
  929. *thermal_current_limit = led->thermal_derate_current[OTST2_IDX];
  930. pr_debug("thermal_current_limit=%d\n", *thermal_current_limit);
  931. return 0;
  932. }
  933. static int qti_flash_led_get_max_avail_current(
  934. struct qti_flash_led *led, int *max_current_ma)
  935. {
  936. int thermal_current_limit = 0, rc;
  937. if (led->secure_vm || led->ext_led) {
  938. led->max_current = MAX_FLASH_CURRENT_MA;
  939. return 0;
  940. }
  941. rc = qti_flash_led_calc_max_avail_current(led, max_current_ma);
  942. if (rc < 0) {
  943. pr_err("Failed to calculate max avail current, rc=%d\n", rc);
  944. return rc;
  945. }
  946. rc = qti_flash_led_calc_thermal_current(led,
  947. &thermal_current_limit);
  948. if (rc < 0) {
  949. pr_err("Failed to calculate thermal current limit, rc=%d\n",
  950. rc);
  951. return rc;
  952. }
  953. if (thermal_current_limit)
  954. *max_current_ma = min(*max_current_ma, thermal_current_limit);
  955. led->max_current = *max_current_ma;
  956. pr_debug("max_current_ma=%d\n", *max_current_ma);
  957. return 0;
  958. }
  959. int qti_flash_led_prepare(struct led_trigger *trig, int options,
  960. int *max_current)
  961. {
  962. struct led_classdev *led_cdev;
  963. struct flash_switch_data *snode;
  964. int rc = 0;
  965. if (!trig) {
  966. pr_err("Invalid led_trigger\n");
  967. return -EINVAL;
  968. }
  969. led_cdev = trigger_to_lcdev(trig);
  970. if (!led_cdev) {
  971. pr_err("Invalid led_cdev in trigger %s\n", trig->name);
  972. return -ENODEV;
  973. }
  974. snode = container_of(led_cdev, struct flash_switch_data, cdev);
  975. if (options & QUERY_MAX_AVAIL_CURRENT) {
  976. if (!max_current) {
  977. pr_err("Invalid max_current pointer\n");
  978. return -EINVAL;
  979. }
  980. rc = qti_flash_led_get_max_avail_current(snode->led,
  981. max_current);
  982. if (rc < 0) {
  983. pr_err("Failed to query max avail current, rc=%d\n",
  984. rc);
  985. return rc;
  986. }
  987. }
  988. return 0;
  989. }
  990. EXPORT_SYMBOL(qti_flash_led_prepare);
  991. static ssize_t qti_flash_led_max_current_show(struct device *dev,
  992. struct device_attribute *attr, char *buf)
  993. {
  994. struct flash_switch_data *snode;
  995. struct led_classdev *led_cdev = dev_get_drvdata(dev);
  996. int rc;
  997. snode = container_of(led_cdev, struct flash_switch_data, cdev);
  998. rc = qti_flash_led_get_max_avail_current(snode->led,
  999. &snode->led->max_current);
  1000. if (rc < 0) {
  1001. pr_err("Failed to get max current, rc=%d\n", rc);
  1002. return -EINVAL;
  1003. }
  1004. return scnprintf(buf, PAGE_SIZE, "%d\n", snode->led->max_current);
  1005. }
  1006. static ssize_t qti_flash_on_time_store(struct device *dev,
  1007. struct device_attribute *attr, const char *buf, size_t count)
  1008. {
  1009. int rc;
  1010. struct flash_switch_data *snode;
  1011. struct led_classdev *led_cdev = dev_get_drvdata(dev);
  1012. u64 val;
  1013. rc = kstrtou64(buf, 0, &val);
  1014. if (rc < 0)
  1015. return rc;
  1016. if (!val)
  1017. return -EINVAL;
  1018. snode = container_of(led_cdev, struct flash_switch_data, cdev);
  1019. snode->on_time_ms = val;
  1020. return count;
  1021. }
  1022. static ssize_t qti_flash_on_time_show(struct device *dev,
  1023. struct device_attribute *attr, char *buf)
  1024. {
  1025. struct flash_switch_data *snode;
  1026. struct led_classdev *led_cdev = dev_get_drvdata(dev);
  1027. snode = container_of(led_cdev, struct flash_switch_data, cdev);
  1028. return scnprintf(buf, PAGE_SIZE, "%lu\n", snode->on_time_ms * 1000);
  1029. }
  1030. static ssize_t qti_flash_off_time_store(struct device *dev,
  1031. struct device_attribute *attr, const char *buf, size_t count)
  1032. {
  1033. int rc;
  1034. struct flash_switch_data *snode;
  1035. struct led_classdev *led_cdev = dev_get_drvdata(dev);
  1036. u64 val;
  1037. rc = kstrtou64(buf, 0, &val);
  1038. if (rc < 0)
  1039. return rc;
  1040. val = min_t(u64, val, SAFETY_TIMER_MAX_TIMEOUT_MS);
  1041. snode = container_of(led_cdev, struct flash_switch_data, cdev);
  1042. snode->off_time_ms = val;
  1043. return count;
  1044. }
  1045. static ssize_t qti_flash_off_time_show(struct device *dev,
  1046. struct device_attribute *attr, char *buf)
  1047. {
  1048. struct flash_switch_data *snode;
  1049. struct led_classdev *led_cdev = dev_get_drvdata(dev);
  1050. snode = container_of(led_cdev, struct flash_switch_data, cdev);
  1051. return scnprintf(buf, PAGE_SIZE, "%lu\n", snode->off_time_ms * 1000);
  1052. }
  1053. static struct device_attribute qti_flash_led_attrs[] = {
  1054. __ATTR(max_current, 0400, qti_flash_led_max_current_show, NULL),
  1055. __ATTR(on_time, 0600, qti_flash_on_time_show,
  1056. qti_flash_on_time_store),
  1057. __ATTR(off_time, 0600, qti_flash_off_time_show,
  1058. qti_flash_off_time_store),
  1059. };
  1060. static int qti_flash_brightness_set_blocking(
  1061. struct led_classdev *led_cdev, enum led_brightness value)
  1062. {
  1063. qti_flash_led_brightness_set(led_cdev, value);
  1064. return 0;
  1065. }
  1066. static int qti_flash_brightness_set(
  1067. struct led_classdev_flash *fdev, u32 brightness)
  1068. {
  1069. qti_flash_led_brightness_set(&fdev->led_cdev, brightness);
  1070. return 0;
  1071. }
  1072. static int qti_flash_brightness_get(
  1073. struct led_classdev_flash *fdev, u32 *brightness)
  1074. {
  1075. *brightness = qti_flash_led_brightness_get(&fdev->led_cdev);
  1076. return 0;
  1077. }
  1078. static int qti_flash_strobe_set(struct led_classdev_flash *fdev,
  1079. bool state)
  1080. {
  1081. struct flash_node_data *fnode;
  1082. int rc;
  1083. u8 mask, value;
  1084. fnode = container_of(fdev, struct flash_node_data, fdev);
  1085. if (fnode->enabled == state || fnode->led->ext_led)
  1086. return 0;
  1087. if (state && !fnode->configured)
  1088. return -EINVAL;
  1089. if (!fnode->duration) {
  1090. pr_debug("Safety time duration is zero, strobe not set\n");
  1091. return -EINVAL;
  1092. }
  1093. mask = FLASH_LED_ENABLE(fnode->id);
  1094. value = state ? FLASH_LED_ENABLE(fnode->id) : 0;
  1095. rc = qti_flash_led_strobe(fnode->led, NULL, mask, value);
  1096. if (rc < 0) {
  1097. pr_err("Failed to %s LED, rc=%d\n",
  1098. state ? "strobe" : "desrobe", rc);
  1099. return rc;
  1100. }
  1101. fnode->enabled = state;
  1102. if (!state) {
  1103. rc = qti_flash_led_disable(fnode);
  1104. if (rc < 0)
  1105. pr_err("Failed to disable LED %u\n", fnode->id);
  1106. }
  1107. return rc;
  1108. }
  1109. static int qti_flash_strobe_get(struct led_classdev_flash *fdev,
  1110. bool *state)
  1111. {
  1112. struct flash_node_data *fnode = container_of(fdev,
  1113. struct flash_node_data, fdev);
  1114. *state = fnode->enabled;
  1115. return 0;
  1116. }
  1117. static int qti_flash_timeout_set(struct led_classdev_flash *fdev,
  1118. u32 timeout)
  1119. {
  1120. struct qti_flash_led *led;
  1121. struct flash_node_data *fnode;
  1122. int rc = 0;
  1123. u8 val;
  1124. fnode = container_of(fdev, struct flash_node_data, fdev);
  1125. led = fnode->led;
  1126. if (!timeout || led->ext_led) {
  1127. fnode->duration = 0;
  1128. return 0;
  1129. }
  1130. timeout = timeout / 1000;
  1131. rc = timeout_to_code(timeout);
  1132. if (rc < 0)
  1133. return rc;
  1134. fnode->duration = rc;
  1135. val = fnode->duration | FLASH_LED_SAFETY_TIMER_EN;
  1136. rc = qti_flash_led_write(led,
  1137. FLASH_LED_SAFETY_TIMER(fnode->id), &val, 1);
  1138. return rc;
  1139. }
  1140. static const struct led_flash_ops flash_ops = {
  1141. .flash_brightness_set = qti_flash_brightness_set,
  1142. .flash_brightness_get = qti_flash_brightness_get,
  1143. .strobe_set = qti_flash_strobe_set,
  1144. .strobe_get = qti_flash_strobe_get,
  1145. .timeout_set = qti_flash_timeout_set,
  1146. };
  1147. struct flash_led_register {
  1148. u16 address;
  1149. u8 value;
  1150. u8 mask;
  1151. };
  1152. static const struct flash_led_register ext_setup_reg_list[] = {
  1153. { FLASH_LED_HDRM_WINDOW, 0x0, FLASH_LED_HI_LO_WIN_MASK },
  1154. { FLASH_LED_HDRM_PRGM(0), 0x20, FLASH_LED_HDRM_CTRL_MODE_MASK | FLASH_LED_VOLTAGE_MASK },
  1155. { FLASH_LED_HDRM_PRGM(1), 0x20, FLASH_LED_HDRM_CTRL_MODE_MASK | FLASH_LED_VOLTAGE_MASK },
  1156. { FLASH_LED_WARMUP_DELAY, 0x0, FLASH_LED_WARMUP_DELAY_MASK },
  1157. { FLASH_LED_ISC_DELAY, 0x0, FLASH_LED_ISC_DELAY_MASK },
  1158. { FLASH_LED_RGLR_RAMP_RATE, 0x0, FLASH_LED_RAMP_UP_STEP_MASK |
  1159. FLASH_LED_RAMP_DN_STEP_MASK },
  1160. { FLASH_LED_ALT_RAMP_DN_RATE, 0x0, FLASH_LED_ALTERNATE_DN_STEP_MASK },
  1161. { FLASH_LED_STROBE_DEBOUNCE, 0x0, FLASH_LED_STROBE_DEBOUNCE_TIME_MASK },
  1162. { FLASH_LED_MULTI_STROBE_CTRL, 0x0, FLASH_LED_FLASH_ONCE_ONLY },
  1163. { FLASH_LED_FAST_RAMPUP_CTRL, 0x13, FLASH_LED_FAST_RAMPUP_MODE |
  1164. FLASH_LED_SMART_FAST_RAMPUP_MODE | FLASH_LED_EN_BOB_VDN_RMP_UP_DN },
  1165. };
  1166. static int qti_flash_led_setup(struct qti_flash_led *led)
  1167. {
  1168. int rc = 0, i, addr_offset;
  1169. u8 val, mask;
  1170. rc = qti_flash_led_read(led, FLASH_LED_REVISION1, &val, 1);
  1171. if (rc < 0)
  1172. return rc;
  1173. led->revision = val;
  1174. rc = qti_flash_led_read(led, FLASH_LED_PERIPH_SUBTYPE, &val, 1);
  1175. if (rc < 0)
  1176. return rc;
  1177. led->subtype = val;
  1178. for (i = 0; i < led->num_fnodes; i++) {
  1179. addr_offset = led->fnode[i].id;
  1180. rc = qti_flash_led_masked_write(led,
  1181. FLASH_LED_SAFETY_TIMER(addr_offset),
  1182. FLASH_LED_SAFETY_TIMER_EN_MASK, 0);
  1183. if (rc < 0)
  1184. return rc;
  1185. val = (led->fnode[i].strobe_config <<
  1186. FLASH_LED_STROBE_CFG_SHIFT) |
  1187. (led->fnode[i].strobe_sel <<
  1188. FLASH_LED_STROBE_SEL_SHIFT);
  1189. mask = FLASH_LED_STROBE_CFG_MASK | FLASH_LED_HW_SW_STROBE_SEL;
  1190. if (led->ext_led) {
  1191. val |= FLASH_LED_STROBE_TRIGGER | FLASH_LED_STROBE_POLARITY;
  1192. mask |= FLASH_LED_STROBE_TRIGGER | FLASH_LED_STROBE_POLARITY;
  1193. }
  1194. rc = qti_flash_led_masked_write(led,
  1195. FLASH_LED_STROBE_CTRL(addr_offset), mask, val);
  1196. if (rc < 0)
  1197. return rc;
  1198. }
  1199. if (led->ext_led) {
  1200. for (i = 0; i < ARRAY_SIZE(ext_setup_reg_list); i++) {
  1201. rc = qti_flash_led_masked_write(led, ext_setup_reg_list[i].address,
  1202. ext_setup_reg_list[i].mask, ext_setup_reg_list[i].value);
  1203. if (rc < 0)
  1204. return rc;
  1205. }
  1206. }
  1207. led->max_current = MAX_FLASH_CURRENT_MA;
  1208. led->thermal_derate_current[OTST1_IDX] = OTST1_CURR_LIM_MA;
  1209. led->thermal_derate_current[OTST2_IDX] = OTST2_CURR_LIM_MA;
  1210. return rc;
  1211. }
  1212. static irqreturn_t qti_flash_led_irq_handler(int irq, void *_led)
  1213. {
  1214. struct qti_flash_led *led = _led;
  1215. int rc;
  1216. u8 irq_status, led_status1, led_status2;
  1217. rc = qti_flash_led_read(led, FLASH_INT_RT_STS, &irq_status, 1);
  1218. if (rc < 0)
  1219. goto exit;
  1220. if (irq == led->led_fault_irq) {
  1221. if (irq_status & FLASH_LED_FAULT_RT_STS)
  1222. pr_debug("Led fault open/short/vreg_not_ready detected\n");
  1223. } else if (irq == led->all_ramp_down_done_irq) {
  1224. if (irq_status & FLASH_LED_ALL_RAMP_DN_DONE_RT_STS)
  1225. pr_debug("All LED channels ramp down done detected\n");
  1226. } else if (irq == led->all_ramp_up_done_irq) {
  1227. if (irq_status & FLASH_LED_ALL_RAMP_UP_DONE_RT_STS)
  1228. pr_debug("All LED channels ramp up done detected\n");
  1229. }
  1230. rc = qti_flash_led_read(led, FLASH_LED_STATUS1, &led_status1, 1);
  1231. if (rc < 0)
  1232. goto exit;
  1233. if (led_status1)
  1234. pr_debug("LED channel open/short fault detected\n");
  1235. rc = qti_flash_led_read(led, FLASH_LED_STATUS2, &led_status2, 1);
  1236. if (rc < 0)
  1237. goto exit;
  1238. if (led_status2 & FLASH_LED_VPH_PWR_LOW)
  1239. pr_debug("LED vph_droop fault detected!\n");
  1240. pr_debug("LED irq handled, irq_status=%02x led_status1=%02x led_status2=%02x\n",
  1241. irq_status, led_status1, led_status2);
  1242. exit:
  1243. return IRQ_HANDLED;
  1244. }
  1245. static int qti_flash_led_register_interrupts(struct qti_flash_led *led)
  1246. {
  1247. int rc;
  1248. if (led->all_ramp_up_done_irq >= 0) {
  1249. rc = devm_request_threaded_irq(&led->pdev->dev,
  1250. led->all_ramp_up_done_irq, NULL, qti_flash_led_irq_handler,
  1251. IRQF_ONESHOT, "flash_all_ramp_up", led);
  1252. if (rc < 0) {
  1253. pr_err("Failed to request all_ramp_up_done(%d) IRQ(err:%d)\n",
  1254. led->all_ramp_up_done_irq, rc);
  1255. return rc;
  1256. }
  1257. }
  1258. if (led->all_ramp_down_done_irq >= 0) {
  1259. rc = devm_request_threaded_irq(&led->pdev->dev,
  1260. led->all_ramp_down_done_irq, NULL, qti_flash_led_irq_handler,
  1261. IRQF_ONESHOT, "flash_all_ramp_down", led);
  1262. if (rc < 0) {
  1263. pr_err("Failed to request all_ramp_down_done(%d) IRQ(err:%d)\n",
  1264. led->all_ramp_down_done_irq,
  1265. rc);
  1266. return rc;
  1267. }
  1268. }
  1269. if (led->led_fault_irq >= 0) {
  1270. rc = devm_request_threaded_irq(&led->pdev->dev,
  1271. led->led_fault_irq, NULL, qti_flash_led_irq_handler,
  1272. IRQF_ONESHOT, "flash_fault", led);
  1273. if (rc < 0) {
  1274. pr_err("Failed to request led_fault(%d) IRQ(err:%d)\n",
  1275. led->led_fault_irq, rc);
  1276. return rc;
  1277. }
  1278. }
  1279. return 0;
  1280. }
  1281. static int register_switch_device(struct qti_flash_led *led,
  1282. struct flash_switch_data *snode, struct device_node *node)
  1283. {
  1284. int rc, i;
  1285. rc = of_property_read_string(node, "qcom,led-name",
  1286. &snode->cdev.name);
  1287. if (rc < 0) {
  1288. pr_err("Failed to read switch node name, rc=%d\n", rc);
  1289. return rc;
  1290. }
  1291. rc = of_property_read_string(node, "qcom,default-led-trigger",
  1292. &snode->cdev.default_trigger);
  1293. if (rc < 0) {
  1294. pr_err("Failed to read trigger name, rc=%d\n", rc);
  1295. return rc;
  1296. }
  1297. rc = of_property_read_u32(node, "qcom,led-mask", &snode->led_mask);
  1298. if (rc < 0) {
  1299. pr_err("Failed to read led mask rc=%d\n", rc);
  1300. return rc;
  1301. }
  1302. if (!snode->led_mask || snode->led_mask > LED_MASK_ALL(led)) {
  1303. pr_err("led-mask %#x invalid\n", snode->led_mask);
  1304. return -EINVAL;
  1305. } else if (snode->led_mask < LED_MASK_ALL(led)) {
  1306. led->non_all_mask_switch_present = true;
  1307. }
  1308. snode->symmetry_en = of_property_read_bool(node, "qcom,symmetry-en");
  1309. snode->on_time_ms = 0;
  1310. snode->off_time_ms = 0;
  1311. hrtimer_init(&snode->on_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
  1312. hrtimer_init(&snode->off_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
  1313. snode->on_timer.function = on_timer_function;
  1314. snode->off_timer.function = off_timer_function;
  1315. snode->led = led;
  1316. snode->cdev.brightness_set = qti_flash_led_switch_brightness_set;
  1317. snode->cdev.brightness_get = qti_flash_led_brightness_get;
  1318. rc = devm_led_classdev_register(&led->pdev->dev, &snode->cdev);
  1319. if (rc < 0) {
  1320. pr_err("Failed to register led switch device:%s\n",
  1321. snode->cdev.name);
  1322. return rc;
  1323. }
  1324. for (i = 0; i < ARRAY_SIZE(qti_flash_led_attrs); i++) {
  1325. rc = sysfs_create_file(&snode->cdev.dev->kobj,
  1326. &qti_flash_led_attrs[i].attr);
  1327. if (rc < 0) {
  1328. pr_err("Failed to create sysfs attrs, rc=%d\n", rc);
  1329. goto sysfs_fail;
  1330. }
  1331. }
  1332. return 0;
  1333. sysfs_fail:
  1334. while (i >= 0)
  1335. sysfs_remove_file(&snode->cdev.dev->kobj,
  1336. &qti_flash_led_attrs[i--].attr);
  1337. return rc;
  1338. }
  1339. static int register_flash_device(struct qti_flash_led *led,
  1340. struct flash_node_data *fnode, struct device_node *node)
  1341. {
  1342. struct led_flash_setting *setting;
  1343. const char *temp_string;
  1344. int rc;
  1345. u32 val, default_curr_ma, duration;
  1346. rc = of_property_read_string(node, "qcom,led-name",
  1347. &fnode->fdev.led_cdev.name);
  1348. if (rc < 0) {
  1349. pr_err("Failed to read flash LED names\n");
  1350. return rc;
  1351. }
  1352. rc = of_property_read_string(node, "label", &temp_string);
  1353. if (rc < 0) {
  1354. pr_err("Failed to read flash LED label\n");
  1355. return rc;
  1356. }
  1357. if (!strcmp(temp_string, "flash")) {
  1358. fnode->type = FLASH_LED_TYPE_FLASH;
  1359. } else if (!strcmp(temp_string, "torch")) {
  1360. fnode->type = FLASH_LED_TYPE_TORCH;
  1361. } else {
  1362. pr_err("Incorrect flash LED type %s\n", temp_string);
  1363. return rc;
  1364. }
  1365. rc = of_property_read_u32(node, "qcom,id", &val);
  1366. if (rc < 0) {
  1367. pr_err("Failed to read flash LED ID\n");
  1368. return rc;
  1369. }
  1370. fnode->id = (u8)val;
  1371. rc = of_property_read_string(node, "qcom,default-led-trigger",
  1372. &fnode->fdev.led_cdev.default_trigger);
  1373. if (rc < 0) {
  1374. pr_err("Failed to read trigger name\n");
  1375. return rc;
  1376. }
  1377. rc = of_property_read_u32(node, "qcom,ires-ua", &val);
  1378. if (rc < 0) {
  1379. pr_err("Failed to read current resolution, rc=%d\n", rc);
  1380. return rc;
  1381. } else if (!rc) {
  1382. rc = get_ires_idx(val);
  1383. if (rc < 0) {
  1384. pr_err("Incorrect ires-ua configured, ires-ua=%u\n",
  1385. val);
  1386. return rc;
  1387. }
  1388. fnode->default_ires_ua = fnode->ires_ua = val;
  1389. fnode->updated_ires_idx = fnode->ires_idx = rc;
  1390. }
  1391. rc = of_property_read_u32(node, "qcom,max-current-ma", &val);
  1392. if (rc < 0) {
  1393. pr_err("Failed to read max current, rc=%d\n", rc);
  1394. return rc;
  1395. }
  1396. if (fnode->type == FLASH_LED_TYPE_FLASH &&
  1397. (val > IRES_12P5_MAX_CURR_MA)) {
  1398. pr_err("Incorrect max-current-ma for flash %u\n",
  1399. val);
  1400. return -EINVAL;
  1401. }
  1402. if (fnode->type == FLASH_LED_TYPE_TORCH &&
  1403. (val > TORCH_MAX_CURR_MA)) {
  1404. pr_err("Incorrect max-current-ma for torch %u\n",
  1405. val);
  1406. return -EINVAL;
  1407. }
  1408. fnode->max_current = val;
  1409. fnode->fdev.led_cdev.max_brightness = val;
  1410. duration = SAFETY_TIMER_DEFAULT_TIMEOUT_MS;
  1411. rc = of_property_read_u32(node, "qcom,duration-ms", &val);
  1412. if (!rc && (val >= SAFETY_TIMER_MIN_TIMEOUT_MS &&
  1413. val <= SAFETY_TIMER_MAX_TIMEOUT_MS))
  1414. duration = val;
  1415. rc = timeout_to_code(duration);
  1416. if (rc < 0) {
  1417. pr_err("Incorrect timeout configured %u\n", duration);
  1418. return rc;
  1419. }
  1420. fnode->duration = rc;
  1421. fnode->strobe_sel = SW_STROBE;
  1422. rc = of_property_read_u32(node, "qcom,strobe-sel", &val);
  1423. if (!rc)
  1424. fnode->strobe_sel = (u8)val;
  1425. if (fnode->strobe_sel == HW_STROBE) {
  1426. rc = of_property_read_u32(node, "qcom,strobe-config", &val);
  1427. if (!rc) {
  1428. fnode->strobe_config = (u8)val;
  1429. } else {
  1430. pr_err("Failed to read qcom,strobe-config property\n");
  1431. return rc;
  1432. }
  1433. }
  1434. fnode->led = led;
  1435. fnode->fdev.led_cdev.brightness_set = qti_flash_led_brightness_set;
  1436. fnode->fdev.led_cdev.brightness_get = qti_flash_led_brightness_get;
  1437. fnode->enabled = false;
  1438. fnode->configured = false;
  1439. fnode->fdev.ops = &flash_ops;
  1440. if (fnode->type == FLASH_LED_TYPE_FLASH) {
  1441. fnode->fdev.led_cdev.flags = LED_DEV_CAP_FLASH;
  1442. fnode->fdev.led_cdev.brightness_set_blocking =
  1443. qti_flash_brightness_set_blocking;
  1444. }
  1445. default_curr_ma = DIV_ROUND_CLOSEST(fnode->ires_ua, 1000);
  1446. setting = &fnode->fdev.brightness;
  1447. setting->min = 0;
  1448. setting->max = fnode->max_current;
  1449. setting->step = 1;
  1450. setting->val = default_curr_ma;
  1451. setting = &fnode->fdev.timeout;
  1452. setting->min = 0;
  1453. setting->max = SAFETY_TIMER_MAX_TIMEOUT_MS * 1000;
  1454. setting->step = SAFETY_TIMER_STEP_SIZE * 1000;
  1455. setting->val = SAFETY_TIMER_DEFAULT_TIMEOUT_MS * 1000;
  1456. rc = devm_led_classdev_flash_register(&led->pdev->dev, &fnode->fdev);
  1457. if (rc < 0)
  1458. pr_err("Failed to register flash led device:%s\n",
  1459. fnode->fdev.led_cdev.name);
  1460. return rc;
  1461. }
  1462. static int qti_flash_led_register_device(struct qti_flash_led *led,
  1463. struct device_node *node)
  1464. {
  1465. struct device_node *temp;
  1466. char buffer[20];
  1467. const char *label;
  1468. int rc, i = 0, j = 0;
  1469. u32 val;
  1470. rc = of_property_read_u32(node, "reg", &val);
  1471. if (rc < 0) {
  1472. pr_err("Failed to find reg in node %s, rc = %d\n",
  1473. node->full_name, rc);
  1474. return rc;
  1475. }
  1476. led->base = val;
  1477. led->hw_strobe_gpio = devm_kcalloc(&led->pdev->dev,
  1478. led->max_channels, sizeof(u32), GFP_KERNEL);
  1479. if (!led->hw_strobe_gpio)
  1480. return -ENOMEM;
  1481. for (i = 0; i < led->max_channels; i++) {
  1482. led->hw_strobe_gpio[i] = -EINVAL;
  1483. rc = of_get_named_gpio(node, "hw-strobe-gpios", i);
  1484. if (rc < 0) {
  1485. pr_debug("Failed to get hw strobe gpio, rc = %d\n", rc);
  1486. continue;
  1487. }
  1488. if (!gpio_is_valid(rc)) {
  1489. pr_err("Error, Invalid gpio specified\n");
  1490. return -EINVAL;
  1491. }
  1492. led->hw_strobe_gpio[i] = rc;
  1493. scnprintf(buffer, sizeof(buffer), "hw_strobe_gpio%d", i);
  1494. rc = devm_gpio_request_one(&led->pdev->dev,
  1495. led->hw_strobe_gpio[i], GPIOF_DIR_OUT,
  1496. buffer);
  1497. if (rc < 0) {
  1498. pr_err("Failed to acquire gpio rc = %d\n", rc);
  1499. return rc;
  1500. }
  1501. gpio_direction_output(led->hw_strobe_gpio[i], 0);
  1502. }
  1503. led->secure_vm = of_property_read_bool(node, "qcom,secure-vm");
  1504. led->all_ramp_up_done_irq = of_irq_get_byname(node,
  1505. "all-ramp-up-done-irq");
  1506. if (led->all_ramp_up_done_irq < 0)
  1507. pr_debug("all-ramp-up-done-irq not used\n");
  1508. led->all_ramp_down_done_irq = of_irq_get_byname(node,
  1509. "all-ramp-down-done-irq");
  1510. if (led->all_ramp_down_done_irq < 0)
  1511. pr_debug("all-ramp-down-done-irq not used\n");
  1512. led->led_fault_irq = of_irq_get_byname(node,
  1513. "led-fault-irq");
  1514. if (led->led_fault_irq < 0)
  1515. pr_debug("led-fault-irq not used\n");
  1516. for_each_available_child_of_node(node, temp) {
  1517. rc = of_property_read_string(temp, "label", &label);
  1518. if (rc < 0) {
  1519. pr_err("Failed to parse label, rc=%d\n", rc);
  1520. of_node_put(temp);
  1521. return rc;
  1522. }
  1523. if (!strcmp("flash", label) || !strcmp("torch", label)) {
  1524. led->num_fnodes++;
  1525. } else if (!strcmp("switch", label)) {
  1526. led->num_snodes++;
  1527. } else {
  1528. pr_err("Invalid label for led node label=%s\n",
  1529. label);
  1530. of_node_put(temp);
  1531. return -EINVAL;
  1532. }
  1533. }
  1534. if (!led->num_fnodes) {
  1535. pr_err("No flash/torch devices defined\n");
  1536. return -ECHILD;
  1537. }
  1538. if (!led->num_snodes) {
  1539. pr_err("No switch devices defined\n");
  1540. return -ECHILD;
  1541. }
  1542. led->fnode = devm_kcalloc(&led->pdev->dev, led->num_fnodes,
  1543. sizeof(*led->fnode), GFP_KERNEL);
  1544. led->snode = devm_kcalloc(&led->pdev->dev, led->num_snodes,
  1545. sizeof(*led->snode), GFP_KERNEL);
  1546. if ((!led->fnode) || (!led->snode))
  1547. return -ENOMEM;
  1548. i = 0;
  1549. for_each_available_child_of_node(node, temp) {
  1550. rc = of_property_read_string(temp, "label", &label);
  1551. if (rc < 0) {
  1552. pr_err("Failed to parse label, rc=%d\n", rc);
  1553. of_node_put(temp);
  1554. return rc;
  1555. }
  1556. if (!strcmp("flash", label) || !strcmp("torch", label)) {
  1557. rc = register_flash_device(led, &led->fnode[i], temp);
  1558. if (rc < 0) {
  1559. pr_err("Failed to register flash device %s rc=%d\n",
  1560. led->fnode[i].fdev.led_cdev.name, rc);
  1561. of_node_put(temp);
  1562. return rc;
  1563. }
  1564. led->fnode[i++].fdev.led_cdev.dev->of_node = temp;
  1565. } else {
  1566. rc = register_switch_device(led, &led->snode[j], temp);
  1567. if (rc < 0) {
  1568. pr_err("Failed to register switch device %s rc=%d\n",
  1569. led->snode[j].cdev.name, rc);
  1570. i--;
  1571. of_node_put(temp);
  1572. return rc;
  1573. }
  1574. led->snode[j++].cdev.dev->of_node = temp;
  1575. }
  1576. }
  1577. return 0;
  1578. }
  1579. static int qti_flash_led_probe(struct platform_device *pdev)
  1580. {
  1581. struct device_node *node = pdev->dev.of_node;
  1582. struct qti_flash_led *led;
  1583. int rc;
  1584. led = devm_kzalloc(&pdev->dev, sizeof(*led), GFP_KERNEL);
  1585. if (!led)
  1586. return -ENOMEM;
  1587. led->regmap = dev_get_regmap(pdev->dev.parent, NULL);
  1588. if (!led->regmap) {
  1589. pr_err("Failed to get parent's regmap\n");
  1590. return -EINVAL;
  1591. }
  1592. led->max_channels = (u8)(uintptr_t)of_device_get_match_data(&pdev->dev);
  1593. if (!led->max_channels) {
  1594. pr_err("Failed to get max supported led channels\n");
  1595. return -EINVAL;
  1596. }
  1597. led->pdev = pdev;
  1598. spin_lock_init(&led->lock);
  1599. rc = qti_flash_led_register_device(led, node);
  1600. if (rc < 0) {
  1601. pr_err("Failed to parse and register LED devices rc=%d\n", rc);
  1602. return rc;
  1603. }
  1604. if (of_property_read_bool(node, "qcom,external-led"))
  1605. led->ext_led = true;
  1606. rc = qti_flash_led_setup(led);
  1607. if (rc < 0) {
  1608. pr_err("Failed to initialize flash LED, rc=%d\n", rc);
  1609. return rc;
  1610. }
  1611. rc = qti_flash_led_register_interrupts(led);
  1612. if (rc < 0) {
  1613. pr_err("Failed to register LED interrupts rc=%d\n", rc);
  1614. return rc;
  1615. }
  1616. dev_set_drvdata(&pdev->dev, led);
  1617. return 0;
  1618. }
  1619. static int qti_flash_led_remove(struct platform_device *pdev)
  1620. {
  1621. struct qti_flash_led *led = dev_get_drvdata(&pdev->dev);
  1622. int i, j;
  1623. if (led->batt_psy)
  1624. power_supply_put(led->batt_psy);
  1625. for (i = 0; (i < led->num_snodes); i++) {
  1626. for (j = 0; j < ARRAY_SIZE(qti_flash_led_attrs); j++)
  1627. sysfs_remove_file(&led->snode[i].cdev.dev->kobj,
  1628. &qti_flash_led_attrs[j].attr);
  1629. }
  1630. return 0;
  1631. }
  1632. static const struct of_device_id qti_flash_led_match_table[] = {
  1633. { .compatible = "qcom,pm8350c-flash-led", .data = (void *)4, },
  1634. { },
  1635. };
  1636. static struct platform_driver qti_flash_led_driver = {
  1637. .driver = {
  1638. .name = "leds-qti-flash",
  1639. .of_match_table = qti_flash_led_match_table,
  1640. },
  1641. .probe = qti_flash_led_probe,
  1642. .remove = qti_flash_led_remove,
  1643. };
  1644. module_platform_driver(qti_flash_led_driver);
  1645. MODULE_DESCRIPTION("QTI Flash LED driver");
  1646. MODULE_LICENSE("GPL v2");