Lines Matching refs:arizona

3  * extcon-arizona.c - Extcon driver Wolfson Arizona devices
23 #include <linux/mfd/arizona/core.h>
24 #include <linux/mfd/arizona/pdata.h>
25 #include <linux/mfd/arizona/registers.h>
26 #include <dt-bindings/mfd/arizona.h>
28 #include "arizona.h"
100 struct arizona *arizona = info->arizona;
105 switch (arizona->type) {
122 ret = regmap_update_bits(arizona->regmap,
127 dev_warn(arizona->dev, "Failed to set TST_CAP_SEL: %d\n", ret);
136 snd_soc_dapm_mutex_lock(arizona->dapm);
138 arizona->hpdet_clamp = clamp;
142 ret = regmap_update_bits(arizona->regmap,
147 dev_warn(arizona->dev, "Failed to disable headphone outputs: %d\n", ret);
151 ret = regmap_update_bits(arizona->regmap, ARIZONA_HP_CTRL_1L,
154 dev_warn(arizona->dev, "Failed to do clamp: %d\n", ret);
156 ret = regmap_update_bits(arizona->regmap, ARIZONA_HP_CTRL_1R,
159 dev_warn(arizona->dev, "Failed to do clamp: %d\n", ret);
164 ret = regmap_update_bits(arizona->regmap,
167 ARIZONA_OUT1R_ENA, arizona->hp_ena);
169 dev_warn(arizona->dev, "Failed to restore headphone outputs: %d\n", ret);
172 snd_soc_dapm_mutex_unlock(arizona->dapm);
177 struct arizona *arizona = info->arizona;
184 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
188 regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1,
193 dev_dbg(arizona->dev, "Set jack polarity to %d\n", mode);
212 struct arizona *arizona = info->arizona;
214 struct snd_soc_dapm_context *dapm = arizona->dapm;
220 dev_warn(arizona->dev, "Failed to enable %s: %d\n", widget, ret);
224 if (!arizona->pdata.micd_force_micbias) {
227 dev_warn(arizona->dev, "Failed to disable %s: %d\n", widget, ret);
235 struct arizona *arizona = info->arizona;
241 pm_runtime_get_sync(arizona->dev);
246 dev_err(arizona->dev, "Failed to regulate MICVDD: %d\n", ret);
251 dev_err(arizona->dev, "Failed to enable MICVDD: %d\n", ret);
260 regmap_multi_reg_write(arizona->regmap, reva, ARRAY_SIZE(reva));
263 if (info->detecting && arizona->pdata.micd_software_compare)
268 regmap_update_bits(arizona->regmap,
274 ret = regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
278 dev_err(arizona->dev, "Failed to enable micd: %d\n", ret);
281 pm_runtime_put_autosuspend(arizona->dev);
287 struct arizona *arizona = info->arizona;
289 struct snd_soc_dapm_context *dapm = arizona->dapm;
294 ret = regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
298 dev_err(arizona->dev, "Failed to disable micd: %d\n", ret);
302 dev_warn(arizona->dev, "Failed to disable %s: %d\n", widget, ret);
313 regmap_multi_reg_write(arizona->regmap, reva, ARRAY_SIZE(reva));
318 dev_err(arizona->dev, "Failed to bypass MICVDD: %d\n", ret);
322 pm_runtime_mark_last_busy(arizona->dev);
323 pm_runtime_put_autosuspend(arizona->dev);
351 struct arizona *arizona = info->arizona;
355 ret = regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_2, &val);
357 dev_err(arizona->dev, "Failed to read HPDET status: %d\n", ret);
364 dev_err(arizona->dev, "HPDET did not complete: %x\n", val);
373 dev_err(arizona->dev, "HPDET did not complete: %x\n", val);
377 ret = regmap_read(arizona->regmap, ARIZONA_HP_DACVAL, &val);
379 dev_err(arizona->dev, "Failed to read HP value: %d\n", ret);
383 regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
392 dev_dbg(arizona->dev, "Moving to HPDET range %d\n", range);
393 regmap_update_bits(arizona->regmap,
404 dev_dbg(arizona->dev, "Measurement out of range\n");
408 dev_dbg(arizona->dev, "HPDET read %d in range %d\n", val, range);
417 dev_err(arizona->dev, "HPDET did not complete: %x\n", val);
425 regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
434 dev_dbg(arizona->dev, "Moving to HPDET range %d-%d\n",
437 regmap_update_bits(arizona->regmap,
446 dev_dbg(arizona->dev, "Reporting range boundary %d\n",
453 dev_warn(arizona->dev, "Unknown HPDET IP revision %d\n", info->hpdet_ip_version);
457 dev_dbg(arizona->dev, "HP impedance %d ohms\n", val);
464 struct arizona *arizona = info->arizona;
465 int id_gpio = arizona->pdata.hpdet_id_gpio;
467 if (!arizona->pdata.hpdet_acc_id)
478 dev_dbg(arizona->dev, "Measuring mic\n");
480 regmap_update_bits(arizona->regmap,
489 regmap_update_bits(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
495 dev_dbg(arizona->dev, "HPDET measured %d %d\n",
503 dev_dbg(arizona->dev, "Retrying high impedance\n");
507 pm_runtime_put(arizona->dev);
515 dev_dbg(arizona->dev, "Detected mic\n");
519 dev_dbg(arizona->dev, "Detected headphone\n");
523 regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1,
532 struct arizona *arizona = info->arizona;
533 int id_gpio = arizona->pdata.hpdet_id_gpio;
541 dev_warn(arizona->dev, "Spurious HPDET IRQ\n");
549 dev_dbg(arizona->dev, "Ignoring HPDET for removed cable\n");
561 regmap_update_bits(arizona->regmap,
582 regmap_update_bits(arizona->regmap,
597 pm_runtime_put_autosuspend(arizona->dev);
613 struct arizona *arizona = info->arizona;
619 dev_dbg(arizona->dev, "Starting HPDET\n");
622 pm_runtime_get_sync(arizona->dev);
630 ret = regmap_update_bits(arizona->regmap,
633 arizona->pdata.hpdet_channel);
635 dev_err(arizona->dev, "Failed to set HPDET mode: %d\n", ret);
639 ret = regmap_update_bits(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
642 dev_err(arizona->dev, "Can't start HPDETL measurement: %d\n", ret);
650 pm_runtime_put_autosuspend(arizona->dev);
664 struct arizona *arizona = info->arizona;
669 dev_dbg(arizona->dev, "Starting identification via HPDET\n");
672 pm_runtime_get_sync(arizona->dev);
678 ret = regmap_update_bits(arizona->regmap,
682 arizona->pdata.hpdet_channel);
684 dev_err(arizona->dev, "Failed to set HPDET mode: %d\n", ret);
688 if (arizona->pdata.hpdet_acc_id_line) {
689 ret = regmap_update_bits(arizona->regmap,
693 dev_err(arizona->dev, "Can't start HPDETL measurement: %d\n", ret);
718 dev_dbg(info->arizona->dev, "MICD timed out, reporting HP\n");
729 struct arizona *arizona = info->arizona;
734 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
737 ret = regmap_read(arizona->regmap, ARIZONA_MIC_DETECT_4, &val);
739 dev_err(arizona->dev, "Failed to read MICDET_ADCVAL: %d\n", ret);
743 dev_dbg(arizona->dev, "MICDET_ADCVAL: %x\n", val);
765 struct arizona *arizona = info->arizona;
770 ret = regmap_read(arizona->regmap, ARIZONA_MIC_DETECT_3, &val);
772 dev_err(arizona->dev, "Failed to read MICDET: %d\n", ret);
776 dev_dbg(arizona->dev, "MICDET: %x\n", val);
779 dev_warn(arizona->dev, "Microphone detection state invalid\n");
785 dev_err(arizona->dev, "Failed to get valid MICDET value\n");
795 struct arizona *arizona = info->arizona;
798 if (info->detecting && arizona->pdata.micd_software_compare)
809 dev_warn(arizona->dev, "Detected open circuit\n");
828 dev_err(arizona->dev, "Failed to bypass MICVDD: %d\n", ret);
841 dev_dbg(arizona->dev, "Detected HP/line\n");
854 if (arizona->pdata.micd_software_compare)
855 regmap_update_bits(arizona->regmap,
862 msecs_to_jiffies(arizona->pdata.micd_timeout));
872 dev_dbg(arizona->dev, "Headphone detected\n");
883 struct arizona *arizona = info->arizona;
896 dev_dbg(arizona->dev, "Mic button detected\n");
907 dev_err(arizona->dev, "Button out of range\n");
910 dev_warn(arizona->dev, "Button with no mic: %x\n", val);
913 dev_dbg(arizona->dev, "Mic button released\n");
926 struct arizona *arizona = info->arizona;
934 dev_dbg(arizona->dev, "Ignoring MICDET for removed cable\n");
944 pm_runtime_mark_last_busy(arizona->dev);
951 struct arizona *arizona = info->arizona;
952 int debounce = arizona->pdata.micd_detect_debounce;
985 struct arizona *arizona = info->arizona;
990 ret = regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_2,
993 dev_err(arizona->dev, "Failed to read HPDET state: %d\n", ret);
1011 dev_warn(arizona->dev, "HPDET did not appear to complete\n");
1019 struct arizona *arizona = info->arizona;
1027 pm_runtime_get_sync(arizona->dev);
1036 if (arizona->pdata.jd_invert)
1042 ret = regmap_read(arizona->regmap, ARIZONA_AOD_IRQ_RAW_STATUS, &val);
1044 dev_err(arizona->dev, "Failed to read jackdet status: %d\n", ret);
1046 pm_runtime_put_autosuspend(arizona->dev);
1052 dev_dbg(arizona->dev, "Suppressing duplicate JACKDET\n");
1059 int micd_timeout = arizona->pdata.micd_timeout;
1071 dev_dbg(arizona->dev, "Detected jack\n");
1078 if (!arizona->pdata.hpdet_acc_id) {
1086 if (info->micd_clamp || !arizona->pdata.jd_invert)
1087 regmap_update_bits(arizona->regmap,
1092 dev_dbg(arizona->dev, "Detected jack removal\n");
1114 regmap_update_bits(arizona->regmap,
1122 regmap_write(arizona->regmap, ARIZONA_AOD_WKUP_AND_TRIG,
1130 pm_runtime_mark_last_busy(arizona->dev);
1131 pm_runtime_put_autosuspend(arizona->dev);
1137 static void arizona_micd_set_level(struct arizona *arizona, int index,
1153 regmap_update_bits(arizona->regmap, reg, mask, level);
1157 struct arizona *arizona)
1166 nconfs = device_property_count_u32(arizona->dev, prop);
1174 ret = device_property_read_u32_array(arizona->dev, prop, vals, nconfs);
1192 arizona->pdata.micd_configs = micd_configs;
1193 arizona->pdata.num_micd_configs = nconfs;
1201 struct arizona *arizona)
1203 struct arizona_pdata *pdata = &arizona->pdata;
1207 device_property_read_u32(arizona->dev, "wlf,hpdet-channel", &val);
1214 dev_err(arizona->dev, "Wrong wlf,hpdet-channel DT value %d\n", val);
1218 device_property_read_u32(arizona->dev, "wlf,micd-detect-debounce",
1221 device_property_read_u32(arizona->dev, "wlf,micd-bias-start-time",
1224 device_property_read_u32(arizona->dev, "wlf,micd-rate",
1227 device_property_read_u32(arizona->dev, "wlf,micd-dbtime",
1230 device_property_read_u32(arizona->dev, "wlf,micd-timeout-ms",
1233 pdata->micd_force_micbias = device_property_read_bool(arizona->dev,
1236 pdata->micd_software_compare = device_property_read_bool(arizona->dev,
1239 pdata->jd_invert = device_property_read_bool(arizona->dev,
1242 device_property_read_u32(arizona->dev, "wlf,gpsw", &pdata->gpsw);
1244 pdata->jd_gpio5 = device_property_read_bool(arizona->dev,
1246 pdata->jd_gpio5_nopull = device_property_read_bool(arizona->dev,
1249 ret = arizona_extcon_get_micd_configs(dev, arizona);
1251 dev_err(arizona->dev, "Failed to read micd configs: %d\n", ret);
1258 struct arizona *arizona = info->arizona;
1259 struct arizona_pdata *pdata = &arizona->pdata;
1262 if (!dev_get_platdata(arizona->dev))
1263 arizona_extcon_device_get_pdata(dev, arizona);
1267 return dev_err_probe(arizona->dev, PTR_ERR(info->micvdd), "getting MICVDD\n");
1275 switch (arizona->type) {
1277 switch (arizona->rev) {
1289 switch (arizona->rev) {
1318 if (arizona->pdata.gpsw > 0)
1319 regmap_update_bits(arizona->regmap, ARIZONA_GP_SWITCH_1,
1320 ARIZONA_SW1_MODE_MASK, arizona->pdata.gpsw);
1331 dev_err(arizona->dev, "Failed to request GPIO%d: %d\n",
1348 info->micd_pol_gpio = gpiod_get_optional(arizona->dev,
1353 dev_err_probe(arizona->dev, ret, "getting microphone polarity GPIO\n");
1358 if (arizona->pdata.hpdet_id_gpio > 0) {
1359 ret = devm_gpio_request_one(dev, arizona->pdata.hpdet_id_gpio,
1363 dev_err(arizona->dev, "Failed to request GPIO%d: %d\n",
1364 arizona->pdata.hpdet_id_gpio, ret);
1384 struct arizona *arizona = info->arizona;
1385 struct arizona_pdata *pdata = &arizona->pdata;
1391 if (arizona->pdata.micd_bias_start_time)
1392 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1394 arizona->pdata.micd_bias_start_time
1397 if (arizona->pdata.micd_rate)
1398 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1400 arizona->pdata.micd_rate
1403 switch (arizona->pdata.micd_dbtime) {
1405 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1410 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1420 if (arizona->pdata.num_micd_ranges) {
1428 if (arizona->pdata.num_micd_ranges > ARIZONA_MAX_MICD_BUTTONS) {
1429 dev_err(arizona->dev, "Too many MICD ranges: %d > %d\n",
1430 arizona->pdata.num_micd_ranges, ARIZONA_MAX_MICD_BUTTONS);
1438 dev_err(arizona->dev, "MICD ranges must be sorted\n");
1445 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_2,
1455 dev_err(arizona->dev, "Unsupported MICD level %d\n",
1460 dev_dbg(arizona->dev, "%d ohms for MICD threshold %d\n",
1463 arizona_micd_set_level(arizona, i, j);
1471 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_2,
1477 arizona_micd_set_level(arizona, i, 0x3f);
1484 if (arizona->pdata.jd_gpio5) {
1487 if (arizona->pdata.jd_gpio5_nopull)
1490 regmap_write(arizona->regmap, ARIZONA_GPIO5_CTRL,
1493 if (arizona->pdata.jd_invert)
1498 if (arizona->pdata.jd_invert)
1504 regmap_update_bits(arizona->regmap,
1508 regmap_update_bits(arizona->regmap,
1518 pm_runtime_get_sync(arizona->dev);
1528 ret = arizona_request_irq(arizona, jack_irq_rise,
1531 dev_err(arizona->dev, "Failed to get JACKDET rise IRQ: %d\n", ret);
1535 ret = arizona_set_irq_wake(arizona, jack_irq_rise, 1);
1537 dev_err(arizona->dev, "Failed to set JD rise IRQ wake: %d\n", ret);
1541 ret = arizona_request_irq(arizona, jack_irq_fall,
1544 dev_err(arizona->dev, "Failed to get JD fall IRQ: %d\n", ret);
1548 ret = arizona_set_irq_wake(arizona, jack_irq_fall, 1);
1550 dev_err(arizona->dev, "Failed to set JD fall IRQ wake: %d\n", ret);
1554 ret = arizona_request_irq(arizona, ARIZONA_IRQ_MICDET,
1557 dev_err(arizona->dev, "Failed to get MICDET IRQ: %d\n", ret);
1561 ret = arizona_request_irq(arizona, ARIZONA_IRQ_HPDET,
1564 dev_err(arizona->dev, "Failed to get HPDET IRQ: %d\n", ret);
1568 arizona_clk32k_enable(arizona);
1569 regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_DEBOUNCE,
1571 regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE,
1576 dev_warn(arizona->dev, "Failed to set MICVDD to bypass: %d\n", ret);
1578 pm_runtime_put(arizona->dev);
1583 arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info);
1585 arizona_set_irq_wake(arizona, jack_irq_fall, 0);
1587 arizona_free_irq(arizona, jack_irq_fall, info);
1589 arizona_set_irq_wake(arizona, jack_irq_rise, 0);
1591 arizona_free_irq(arizona, jack_irq_rise, info);
1593 pm_runtime_put(arizona->dev);
1600 struct arizona *arizona = info->arizona;
1616 arizona_set_irq_wake(arizona, jack_irq_rise, 0);
1617 arizona_set_irq_wake(arizona, jack_irq_fall, 0);
1618 arizona_free_irq(arizona, ARIZONA_IRQ_HPDET, info);
1619 arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info);
1620 arizona_free_irq(arizona, jack_irq_rise, info);
1621 arizona_free_irq(arizona, jack_irq_fall, info);
1626 ret = regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
1630 dev_err(arizona->dev, "Failed to disable micd on remove: %d\n", ret);
1633 pm_runtime_put(arizona->dev);
1636 regmap_update_bits(arizona->regmap,
1639 regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE,
1641 arizona_clk32k_disable(arizona);