smb5-iio.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. #include <linux/delay.h>
  7. #include <linux/pmic-voter.h>
  8. #include <linux/power_supply.h>
  9. #include <linux/iio/consumer.h>
  10. #include "smb5-lib.h"
  11. #include "smb5-iio.h"
  12. #include "smb5-reg.h"
  13. #include "schgm-flash.h"
  14. #define MIN_THERMAL_VOTE_UA 500000
  15. int smb5_iio_get_prop(struct smb_charger *chg, int channel, int *val)
  16. {
  17. union power_supply_propval pval = {0, };
  18. int rc = 0;
  19. u8 reg = 0, buff[2] = {0};
  20. pval.intval = 0;
  21. *val = 0;
  22. switch (channel) {
  23. /* USB */
  24. case PSY_IIO_VOLTAGE_MAX_LIMIT:
  25. if (chg->usbin_forced_max_uv) {
  26. *val = chg->usbin_forced_max_uv;
  27. } else {
  28. rc = smblib_get_prop_usb_voltage_max_design(chg, &pval);
  29. *val = pval.intval;
  30. }
  31. break;
  32. case PSY_IIO_PD_CURRENT_MAX:
  33. *val = get_client_vote(chg->usb_icl_votable, PD_VOTER);
  34. break;
  35. case PSY_IIO_USB_REAL_TYPE:
  36. *val = chg->real_charger_type;
  37. break;
  38. case PSY_IIO_TYPEC_MODE:
  39. rc = smblib_get_usb_prop_typec_mode(chg, val);
  40. break;
  41. case PSY_IIO_TYPEC_POWER_ROLE:
  42. rc = smblib_get_prop_typec_power_role(chg, val);
  43. break;
  44. case PSY_IIO_TYPEC_CC_ORIENTATION:
  45. rc = smblib_get_prop_typec_cc_orientation(chg, val);
  46. break;
  47. case PSY_IIO_TYPEC_SRC_RP:
  48. rc = smblib_get_prop_typec_select_rp(chg, val);
  49. break;
  50. case PSY_IIO_PD_ACTIVE:
  51. *val = chg->pd_active;
  52. break;
  53. case PSY_IIO_USB_INPUT_CURRENT_SETTLED:
  54. rc = smblib_get_prop_input_current_settled(chg, &pval);
  55. if (!rc)
  56. *val = pval.intval;
  57. break;
  58. case PSY_IIO_PD_IN_HARD_RESET:
  59. rc = smblib_get_prop_pd_in_hard_reset(chg, val);
  60. break;
  61. case PSY_IIO_PD_USB_SUSPEND_SUPPORTED:
  62. *val = chg->system_suspend_supported;
  63. break;
  64. case PSY_IIO_PE_START:
  65. rc = smblib_get_pe_start(chg, val);
  66. break;
  67. case PSY_IIO_CTM_CURRENT_MAX:
  68. *val = get_client_vote(chg->usb_icl_votable, CTM_VOTER);
  69. break;
  70. case PSY_IIO_HW_CURRENT_MAX:
  71. rc = smblib_get_charge_current(chg, val);
  72. break;
  73. case PSY_IIO_PR_SWAP:
  74. rc = smblib_get_prop_pr_swap_in_progress(chg, val);
  75. break;
  76. case PSY_IIO_PD_VOLTAGE_MAX:
  77. *val = chg->voltage_max_uv;
  78. break;
  79. case PSY_IIO_PD_VOLTAGE_MIN:
  80. *val = chg->voltage_min_uv;
  81. break;
  82. case PSY_IIO_VOLTAGE_QNOVO:
  83. *val = get_client_vote_locked(chg->fv_votable,
  84. QNOVO_VOTER);
  85. break;
  86. case PSY_IIO_CURRENT_QNOVO:
  87. *val = get_client_vote_locked(chg->fcc_votable,
  88. QNOVO_VOTER);
  89. break;
  90. case PSY_IIO_CONNECTOR_TYPE:
  91. *val = chg->connector_type;
  92. break;
  93. case PSY_IIO_CONNECTOR_HEALTH:
  94. *val = smblib_get_prop_connector_health(chg);
  95. break;
  96. case PSY_IIO_SMB_EN_MODE:
  97. mutex_lock(&chg->smb_lock);
  98. *val = chg->sec_chg_selected;
  99. mutex_unlock(&chg->smb_lock);
  100. break;
  101. case PSY_IIO_SMB_EN_REASON:
  102. *val = chg->cp_reason;
  103. break;
  104. case PSY_IIO_MOISTURE_DETECTED:
  105. *val = chg->moisture_present;
  106. break;
  107. case PSY_IIO_MOISTURE_DETECTION_EN:
  108. *val = !chg->lpd_disabled;
  109. break;
  110. case PSY_IIO_HVDCP_OPTI_ALLOWED:
  111. *val = !chg->flash_active;
  112. break;
  113. case PSY_IIO_QC_OPTI_DISABLE:
  114. if (chg->hw_die_temp_mitigation)
  115. *val = QC_THERMAL_BALANCE_DISABLE
  116. | QC_INOV_THERMAL_DISABLE;
  117. if (chg->hw_connector_mitigation)
  118. *val |= QC_CTM_DISABLE;
  119. break;
  120. case PSY_IIO_VOLTAGE_VPH:
  121. rc = smblib_get_prop_vph_voltage_now(chg, val);
  122. break;
  123. case PSY_IIO_THERM_ICL_LIMIT:
  124. *val = get_client_vote(chg->usb_icl_votable,
  125. THERMAL_THROTTLE_VOTER);
  126. break;
  127. case PSY_IIO_ADAPTER_CC_MODE:
  128. *val = chg->adapter_cc_mode;
  129. break;
  130. case PSY_IIO_SKIN_HEALTH:
  131. *val = smblib_get_skin_temp_status(chg);
  132. break;
  133. case PSY_IIO_APSD_RERUN:
  134. *val = 0;
  135. break;
  136. case PSY_IIO_APSD_TIMEOUT:
  137. *val = chg->apsd_ext_timeout;
  138. break;
  139. case PSY_IIO_CHARGER_STATUS:
  140. *val = 0;
  141. if (chg->sdam_base) {
  142. rc = smblib_read(chg,
  143. chg->sdam_base + SDAM_QC_DET_STATUS_REG, &reg);
  144. if (!rc)
  145. *val = reg;
  146. }
  147. break;
  148. case PSY_IIO_USB_INPUT_VOLTAGE_SETTLED:
  149. *val = 0;
  150. if (chg->sdam_base) {
  151. rc = smblib_batch_read(chg,
  152. chg->sdam_base + SDAM_QC_ADC_LSB_REG, buff, 2);
  153. if (!rc)
  154. *val = (buff[1] << 8 | buff[0]) * 1038;
  155. }
  156. break;
  157. /* MAIN */
  158. case PSY_IIO_MAIN_INPUT_CURRENT_SETTLED:
  159. rc = smblib_get_prop_input_current_settled(chg, &pval);
  160. if (!rc)
  161. *val = pval.intval;
  162. break;
  163. case PSY_IIO_MAIN_INPUT_VOLTAGE_SETTLED:
  164. rc = smblib_get_prop_input_voltage_settled(chg, val);
  165. break;
  166. case PSY_IIO_FCC_DELTA:
  167. rc = smblib_get_prop_fcc_delta(chg, val);
  168. break;
  169. case PSY_IIO_FLASH_ACTIVE:
  170. *val = chg->flash_active;
  171. break;
  172. case PSY_IIO_FLASH_TRIGGER:
  173. *val = 0;
  174. if (chg->chg_param.smb_version == PMI632)
  175. rc = schgm_flash_get_vreg_ok(chg, val);
  176. break;
  177. case PSY_IIO_TOGGLE_STAT:
  178. *val = 0;
  179. break;
  180. case PSY_IIO_MAIN_FCC_MAX:
  181. *val = chg->main_fcc_max;
  182. break;
  183. case PSY_IIO_IRQ_STATUS:
  184. rc = smblib_get_irq_status(chg, val);
  185. break;
  186. case PSY_IIO_FORCE_MAIN_FCC:
  187. rc = smblib_get_charge_param(chg, &chg->param.fcc,
  188. val);
  189. break;
  190. case PSY_IIO_FORCE_MAIN_ICL:
  191. rc = smblib_get_charge_param(chg, &chg->param.usb_icl,
  192. val);
  193. break;
  194. case PSY_IIO_COMP_CLAMP_LEVEL:
  195. *val = chg->comp_clamp_level;
  196. break;
  197. /* Use this property to report overheat status */
  198. case PSY_IIO_HOT_TEMP:
  199. *val = chg->thermal_overheat;
  200. break;
  201. case PSY_IIO_VOLTAGE_MAX:
  202. rc = smblib_get_charge_param(chg, &chg->param.fv, val);
  203. break;
  204. case PSY_IIO_CONSTANT_CHARGE_CURRENT_MAX:
  205. rc = smblib_get_charge_param(chg, &chg->param.fcc,
  206. val);
  207. break;
  208. case PSY_IIO_CURRENT_MAX:
  209. rc = smblib_get_icl_current(chg, val);
  210. break;
  211. case PSY_IIO_HEALTH:
  212. rc = *val = smblib_get_prop_smb_health(chg);
  213. break;
  214. /* DC */
  215. case PSY_IIO_DC_REAL_TYPE:
  216. *val = POWER_SUPPLY_TYPE_MAINS;
  217. break;
  218. case PSY_IIO_INPUT_VOLTAGE_REGULATION:
  219. rc = smblib_get_prop_voltage_wls_output(chg, &pval);
  220. if (!rc)
  221. *val = pval.intval;
  222. break;
  223. case PSY_IIO_DC_RESET:
  224. *val = 0;
  225. break;
  226. case PSY_IIO_AICL_DONE:
  227. *val = chg->dcin_aicl_done;
  228. break;
  229. /* BATTERY */
  230. case PSY_IIO_CHARGER_TEMP:
  231. rc = smblib_get_prop_charger_temp(chg, val);
  232. break;
  233. case PSY_IIO_CHARGER_TEMP_MAX:
  234. *val = chg->charger_temp_max;
  235. break;
  236. case PSY_IIO_SW_JEITA_ENABLED:
  237. *val = chg->sw_jeita_enabled;
  238. break;
  239. case PSY_IIO_PARALLEL_DISABLE:
  240. *val = get_client_vote(chg->pl_disable_votable,
  241. USER_VOTER);
  242. break;
  243. case PSY_IIO_CHARGE_DONE:
  244. rc = smblib_get_prop_batt_charge_done(chg, val);
  245. break;
  246. case PSY_IIO_SET_SHIP_MODE:
  247. /* Not in ship mode as long as device is active */
  248. *val = 0;
  249. break;
  250. case PSY_IIO_RERUN_AICL:
  251. *val = 0;
  252. break;
  253. case PSY_IIO_DP_DM:
  254. *val = chg->pulse_cnt;
  255. break;
  256. case PSY_IIO_INPUT_CURRENT_LIMITED:
  257. rc = smblib_get_prop_input_current_limited(chg, val);
  258. break;
  259. case PSY_IIO_DIE_HEALTH:
  260. rc = smblib_get_die_health(chg, val);
  261. break;
  262. case PSY_IIO_RECHARGE_SOC:
  263. *val = chg->auto_recharge_soc;
  264. break;
  265. case PSY_IIO_FORCE_RECHARGE:
  266. *val = 0;
  267. break;
  268. case PSY_IIO_FCC_STEPPER_ENABLE:
  269. *val = chg->fcc_stepper_enable;
  270. break;
  271. case PSY_IIO_TYPEC_ACCESSORY_MODE:
  272. rc = smblib_get_usb_prop_typec_accessory_mode(chg, val);
  273. break;
  274. default:
  275. pr_err("get prop %d is not supported\n", channel);
  276. rc = -EINVAL;
  277. break;
  278. }
  279. if (rc < 0) {
  280. pr_err("Couldn't get prop %d rc = %d\n", channel, rc);
  281. return rc;
  282. }
  283. return IIO_VAL_INT;
  284. }
  285. int smb5_iio_set_prop(struct smb_charger *chg, int channel, int val)
  286. {
  287. union power_supply_propval pval = {0, };
  288. int real_chg_type = chg->real_charger_type;
  289. int icl, rc = 0, offset_ua = 0;
  290. switch (channel) {
  291. /* USB */
  292. case PSY_IIO_PD_CURRENT_MAX:
  293. rc = smblib_set_prop_pd_current_max(chg, val);
  294. break;
  295. case PSY_IIO_TYPEC_POWER_ROLE:
  296. rc = smblib_set_prop_typec_power_role(chg, val);
  297. break;
  298. case PSY_IIO_TYPEC_SRC_RP:
  299. rc = smblib_set_prop_typec_select_rp(chg, val);
  300. break;
  301. case PSY_IIO_PD_ACTIVE:
  302. rc = smblib_set_prop_pd_active(chg, val);
  303. break;
  304. case PSY_IIO_PD_IN_HARD_RESET:
  305. rc = smblib_set_prop_pd_in_hard_reset(chg, val);
  306. break;
  307. case PSY_IIO_PD_USB_SUSPEND_SUPPORTED:
  308. chg->system_suspend_supported = val;
  309. break;
  310. case PSY_IIO_CTM_CURRENT_MAX:
  311. rc = vote(chg->usb_icl_votable, CTM_VOTER,
  312. val >= 0, val);
  313. break;
  314. case PSY_IIO_PR_SWAP:
  315. rc = smblib_set_prop_pr_swap_in_progress(chg, val);
  316. break;
  317. case PSY_IIO_PD_VOLTAGE_MAX:
  318. rc = smblib_set_prop_pd_voltage_max(chg, val);
  319. break;
  320. case PSY_IIO_PD_VOLTAGE_MIN:
  321. rc = smblib_set_prop_pd_voltage_min(chg, val);
  322. break;
  323. case PSY_IIO_VOLTAGE_QNOVO:
  324. if (val == -EINVAL) {
  325. vote(chg->fv_votable, BATT_PROFILE_VOTER, true,
  326. chg->batt_profile_fv_uv);
  327. vote(chg->fv_votable, QNOVO_VOTER, false, 0);
  328. } else {
  329. vote(chg->fv_votable, QNOVO_VOTER, true, val);
  330. vote(chg->fv_votable, BATT_PROFILE_VOTER, false, 0);
  331. }
  332. break;
  333. case PSY_IIO_CURRENT_QNOVO:
  334. vote(chg->pl_disable_votable, PL_QNOVO_VOTER,
  335. val != -EINVAL && val < 2000000, 0);
  336. if (val == -EINVAL) {
  337. vote(chg->fcc_votable, BATT_PROFILE_VOTER,
  338. true, chg->batt_profile_fcc_ua);
  339. vote(chg->fcc_votable, QNOVO_VOTER, false, 0);
  340. } else {
  341. vote(chg->fcc_votable, QNOVO_VOTER, true, val);
  342. vote(chg->fcc_votable, BATT_PROFILE_VOTER, false, 0);
  343. }
  344. break;
  345. case PSY_IIO_CONNECTOR_HEALTH:
  346. chg->connector_health = val;
  347. if (chg->usb_psy)
  348. power_supply_changed(chg->usb_psy);
  349. break;
  350. case PSY_IIO_THERM_ICL_LIMIT:
  351. if (!is_client_vote_enabled(chg->usb_icl_votable,
  352. THERMAL_THROTTLE_VOTER)) {
  353. chg->init_thermal_ua = get_effective_result(
  354. chg->usb_icl_votable);
  355. icl = chg->init_thermal_ua + val;
  356. } else {
  357. icl = get_client_vote(chg->usb_icl_votable,
  358. THERMAL_THROTTLE_VOTER) + val;
  359. }
  360. if (icl >= MIN_THERMAL_VOTE_UA)
  361. rc = vote(chg->usb_icl_votable, THERMAL_THROTTLE_VOTER,
  362. (icl != chg->init_thermal_ua), icl);
  363. else
  364. rc = -EINVAL;
  365. break;
  366. case PSY_IIO_VOLTAGE_MAX_LIMIT:
  367. smblib_set_prop_usb_voltage_max_limit(chg, val);
  368. break;
  369. case PSY_IIO_ADAPTER_CC_MODE:
  370. chg->adapter_cc_mode = val;
  371. break;
  372. case PSY_IIO_APSD_RERUN:
  373. del_timer_sync(&chg->apsd_timer);
  374. chg->apsd_ext_timeout = false;
  375. smblib_rerun_apsd(chg);
  376. break;
  377. case PSY_IIO_MOISTURE_DETECTION_EN:
  378. smblib_moisture_detection_enable(chg, val);
  379. break;
  380. /* MAIN */
  381. case PSY_IIO_FLASH_ACTIVE:
  382. if ((chg->chg_param.smb_version == PMI632)
  383. && (chg->flash_active != val)) {
  384. chg->flash_active = val;
  385. rc = smblib_get_prop_usb_present(chg, &pval);
  386. if (rc < 0)
  387. pr_err("Failed to get USB preset status rc=%d\n",
  388. rc);
  389. if (pval.intval) {
  390. rc = smblib_force_vbus_voltage(chg,
  391. chg->flash_active ? FORCE_5V_BIT
  392. : IDLE_BIT);
  393. if (rc < 0)
  394. pr_err("Failed to force 5V\n");
  395. else
  396. chg->pulse_cnt = 0;
  397. } else {
  398. /* USB absent & flash not-active - vote 100mA */
  399. vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER,
  400. true, SDP_100_MA);
  401. }
  402. pr_debug("flash active VBUS 5V restriction %s\n",
  403. chg->flash_active ? "applied" : "removed");
  404. /* Update userspace */
  405. if (chg->batt_psy)
  406. power_supply_changed(chg->batt_psy);
  407. }
  408. break;
  409. case PSY_IIO_TOGGLE_STAT:
  410. rc = smblib_toggle_smb_en(chg, val);
  411. break;
  412. case PSY_IIO_MAIN_FCC_MAX:
  413. chg->main_fcc_max = val;
  414. rerun_election(chg->fcc_votable);
  415. break;
  416. case PSY_IIO_FORCE_MAIN_FCC:
  417. vote_override(chg->fcc_main_votable, CC_MODE_VOTER,
  418. (val < 0) ? false : true, val);
  419. if (val >= 0)
  420. chg->chg_param.forced_main_fcc = val;
  421. /*
  422. * Remove low vote on FCC_MAIN, for WLS, to allow FCC_MAIN to
  423. * rise to its full value.
  424. */
  425. if (val < 0)
  426. vote(chg->fcc_main_votable, WLS_PL_CHARGING_VOTER,
  427. false, 0);
  428. /* Main FCC updated re-calculate FCC */
  429. rerun_election(chg->fcc_votable);
  430. break;
  431. case PSY_IIO_FORCE_MAIN_ICL:
  432. vote_override(chg->usb_icl_votable, CC_MODE_VOTER,
  433. (val < 0) ? false : true, val);
  434. /* Main ICL updated re-calculate ILIM */
  435. if (real_chg_type == QTI_POWER_SUPPLY_TYPE_USB_HVDCP_3 ||
  436. real_chg_type == QTI_POWER_SUPPLY_TYPE_USB_HVDCP_3P5)
  437. rerun_election(chg->fcc_votable);
  438. break;
  439. #ifdef CONFIG_QPNP_SMB5
  440. case PSY_IIO_COMP_CLAMP_LEVEL:
  441. rc = smb5_set_prop_comp_clamp_level(chg, val);
  442. break;
  443. #endif
  444. case PSY_IIO_HOT_TEMP:
  445. rc = smblib_set_prop_thermal_overheat(chg, val);
  446. break;
  447. case PSY_IIO_VOLTAGE_MAX:
  448. rc = smblib_set_charge_param(chg, &chg->param.fv, val);
  449. break;
  450. case PSY_IIO_CONSTANT_CHARGE_CURRENT_MAX:
  451. /* Adjust Main FCC for QC3.0 + SMB1390 */
  452. rc = smblib_get_qc3_main_icl_offset(chg, &offset_ua);
  453. if (rc < 0)
  454. offset_ua = 0;
  455. rc = smblib_set_charge_param(chg, &chg->param.fcc,
  456. val + offset_ua);
  457. break;
  458. case PSY_IIO_CURRENT_MAX:
  459. rc = smblib_set_icl_current(chg, val);
  460. break;
  461. /* DC */
  462. case PSY_IIO_INPUT_VOLTAGE_REGULATION:
  463. pval.intval = val;
  464. rc = smblib_set_prop_voltage_wls_output(chg, &pval);
  465. break;
  466. case PSY_IIO_DC_RESET:
  467. rc = smblib_set_prop_dc_reset(chg);
  468. break;
  469. /* BATTERY */
  470. case PSY_IIO_PARALLEL_DISABLE:
  471. vote(chg->pl_disable_votable, USER_VOTER, (bool)val, 0);
  472. break;
  473. case PSY_IIO_SET_SHIP_MODE:
  474. /* Not in ship mode as long as the device is active */
  475. if (!val)
  476. break;
  477. if (chg->iio_chan_list_smb_parallel)
  478. rc = iio_write_channel_raw(
  479. chg->iio_chan_list_smb_parallel[SMB_SET_SHIP_MODE],
  480. val);
  481. rc = smblib_set_prop_ship_mode(chg, val);
  482. break;
  483. case PSY_IIO_RERUN_AICL:
  484. rc = smblib_run_aicl(chg, RERUN_AICL);
  485. break;
  486. case PSY_IIO_DP_DM:
  487. if (!chg->flash_active)
  488. rc = smblib_dp_dm(chg, val);
  489. break;
  490. case PSY_IIO_INPUT_CURRENT_LIMITED:
  491. rc = smblib_set_prop_input_current_limited(chg, val);
  492. break;
  493. case PSY_IIO_DIE_HEALTH:
  494. chg->die_health = val;
  495. if (chg->batt_psy)
  496. power_supply_changed(chg->batt_psy);
  497. break;
  498. case PSY_IIO_RECHARGE_SOC:
  499. rc = smblib_set_prop_rechg_soc_thresh(chg, val);
  500. break;
  501. case PSY_IIO_FORCE_RECHARGE:
  502. /* toggle charging to force recharge */
  503. vote(chg->chg_disable_votable, FORCE_RECHARGE_VOTER,
  504. true, 0);
  505. /* charge disable delay */
  506. msleep(50);
  507. vote(chg->chg_disable_votable, FORCE_RECHARGE_VOTER,
  508. false, 0);
  509. break;
  510. case PSY_IIO_FCC_STEPPER_ENABLE:
  511. chg->fcc_stepper_enable = val;
  512. break;
  513. default:
  514. pr_err("get prop %d is not supported\n", channel);
  515. rc = -EINVAL;
  516. break;
  517. }
  518. if (rc < 0) {
  519. pr_err("Couldn't set prop %d rc = %d\n", channel, rc);
  520. return rc;
  521. }
  522. return 0;
  523. }
  524. #ifndef CONFIG_QPNP_SMBLITE
  525. struct iio_channel **get_ext_channels(struct device *dev,
  526. const char *const *channel_map, int size)
  527. {
  528. int i, rc = 0;
  529. struct iio_channel **iio_ch_ext;
  530. iio_ch_ext = devm_kcalloc(dev, size, sizeof(*iio_ch_ext), GFP_KERNEL);
  531. if (!iio_ch_ext)
  532. return ERR_PTR(-ENOMEM);
  533. for (i = 0; i < size; i++) {
  534. iio_ch_ext[i] = devm_iio_channel_get(dev, channel_map[i]);
  535. if (IS_ERR(iio_ch_ext[i])) {
  536. rc = PTR_ERR(iio_ch_ext[i]);
  537. if (rc != -EPROBE_DEFER)
  538. dev_err(dev, "%s channel unavailable, %d\n",
  539. channel_map[i], rc);
  540. return ERR_PTR(rc);
  541. }
  542. }
  543. return iio_ch_ext;
  544. }
  545. #endif