Lines Matching refs:arizona
3 * extcon-arizona.c - Extcon driver Wolfson Arizona devices
25 #include <linux/mfd/arizona/core.h>
26 #include <linux/mfd/arizona/pdata.h>
27 #include <linux/mfd/arizona/registers.h>
28 #include <dt-bindings/mfd/arizona.h>
66 struct arizona *arizona;
143 struct arizona *arizona = info->arizona;
148 switch (arizona->type) {
165 ret = regmap_update_bits(arizona->regmap,
170 dev_warn(arizona->dev,
180 snd_soc_dapm_mutex_lock(arizona->dapm);
182 arizona->hpdet_clamp = clamp;
186 ret = regmap_update_bits(arizona->regmap,
191 dev_warn(arizona->dev,
197 ret = regmap_update_bits(arizona->regmap, ARIZONA_HP_CTRL_1L,
200 dev_warn(arizona->dev, "Failed to do clamp: %d\n",
203 ret = regmap_update_bits(arizona->regmap, ARIZONA_HP_CTRL_1R,
206 dev_warn(arizona->dev, "Failed to do clamp: %d\n",
212 ret = regmap_update_bits(arizona->regmap,
215 ARIZONA_OUT1R_ENA, arizona->hp_ena);
217 dev_warn(arizona->dev,
222 snd_soc_dapm_mutex_unlock(arizona->dapm);
227 struct arizona *arizona = info->arizona;
234 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
238 regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1,
243 dev_dbg(arizona->dev, "Set jack polarity to %d\n", mode);
262 struct arizona *arizona = info->arizona;
264 struct snd_soc_dapm_context *dapm = arizona->dapm;
270 dev_warn(arizona->dev, "Failed to enable %s: %d\n",
275 if (!arizona->pdata.micd_force_micbias) {
278 dev_warn(arizona->dev, "Failed to disable %s: %d\n",
287 struct arizona *arizona = info->arizona;
298 dev_err(arizona->dev,
306 dev_err(arizona->dev, "Failed to enable MICVDD: %d\n",
317 regmap_multi_reg_write(arizona->regmap, reva, ARRAY_SIZE(reva));
320 if (info->detecting && arizona->pdata.micd_software_compare)
325 regmap_update_bits(arizona->regmap,
331 ret = regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
335 dev_err(arizona->dev, "Failed to enable micd: %d\n", ret);
344 struct arizona *arizona = info->arizona;
346 struct snd_soc_dapm_context *dapm = arizona->dapm;
351 ret = regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
355 dev_err(arizona->dev, "Failed to disable micd: %d\n", ret);
359 dev_warn(arizona->dev,
372 regmap_multi_reg_write(arizona->regmap, reva, ARRAY_SIZE(reva));
377 dev_err(arizona->dev, "Failed to bypass MICVDD: %d\n",
412 struct arizona *arizona = info->arizona;
416 ret = regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_2, &val);
418 dev_err(arizona->dev, "Failed to read HPDET status: %d\n",
426 dev_err(arizona->dev, "HPDET did not complete: %x\n",
436 dev_err(arizona->dev, "HPDET did not complete: %x\n",
441 ret = regmap_read(arizona->regmap, ARIZONA_HP_DACVAL, &val);
443 dev_err(arizona->dev, "Failed to read HP value: %d\n",
448 regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
457 dev_dbg(arizona->dev, "Moving to HPDET range %d\n",
459 regmap_update_bits(arizona->regmap,
470 dev_dbg(arizona->dev, "Measurement out of range\n");
474 dev_dbg(arizona->dev, "HPDET read %d in range %d\n",
484 dev_err(arizona->dev, "HPDET did not complete: %x\n",
493 regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
502 dev_dbg(arizona->dev, "Moving to HPDET range %d-%d\n",
505 regmap_update_bits(arizona->regmap,
514 dev_dbg(arizona->dev, "Reporting range boundary %d\n",
521 dev_warn(arizona->dev, "Unknown HPDET IP revision %d\n",
526 dev_dbg(arizona->dev, "HP impedance %d ohms\n", val);
533 struct arizona *arizona = info->arizona;
534 int id_gpio = arizona->pdata.hpdet_id_gpio;
536 if (!arizona->pdata.hpdet_acc_id)
547 dev_dbg(arizona->dev, "Measuring mic\n");
549 regmap_update_bits(arizona->regmap,
558 regmap_update_bits(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
564 dev_dbg(arizona->dev, "HPDET measured %d %d\n",
572 dev_dbg(arizona->dev, "Retrying high impedance\n");
584 dev_dbg(arizona->dev, "Detected mic\n");
588 dev_dbg(arizona->dev, "Detected headphone\n");
592 regmap_update_bits(arizona->regmap, ARIZONA_ACCESSORY_DETECT_MODE_1,
601 struct arizona *arizona = info->arizona;
602 int id_gpio = arizona->pdata.hpdet_id_gpio;
611 dev_warn(arizona->dev, "Spurious HPDET IRQ\n");
619 dev_err(arizona->dev, "Failed to check cable state: %d\n", state);
622 dev_dbg(arizona->dev, "Ignoring HPDET for removed cable\n");
634 regmap_update_bits(arizona->regmap,
653 dev_err(arizona->dev, "Failed to report HP/line: %d\n",
658 regmap_update_bits(arizona->regmap,
689 struct arizona *arizona = info->arizona;
695 dev_dbg(arizona->dev, "Starting HPDET\n");
706 ret = regmap_update_bits(arizona->regmap,
709 arizona->pdata.hpdet_channel);
711 dev_err(arizona->dev, "Failed to set HPDET mode: %d\n", ret);
715 ret = regmap_update_bits(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
718 dev_err(arizona->dev, "Can't start HPDETL measurement: %d\n",
732 dev_err(arizona->dev, "Failed to report headphone: %d\n", ret);
742 struct arizona *arizona = info->arizona;
747 dev_dbg(arizona->dev, "Starting identification via HPDET\n");
756 ret = regmap_update_bits(arizona->regmap,
760 arizona->pdata.hpdet_channel);
762 dev_err(arizona->dev, "Failed to set HPDET mode: %d\n", ret);
766 if (arizona->pdata.hpdet_acc_id_line) {
767 ret = regmap_update_bits(arizona->regmap,
771 dev_err(arizona->dev,
786 dev_err(arizona->dev, "Failed to report headphone: %d\n", ret);
799 dev_dbg(info->arizona->dev, "MICD timed out, reporting HP\n");
810 struct arizona *arizona = info->arizona;
815 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
818 ret = regmap_read(arizona->regmap, ARIZONA_MIC_DETECT_4, &val);
820 dev_err(arizona->dev,
825 dev_dbg(arizona->dev, "MICDET_ADCVAL: %x\n", val);
847 struct arizona *arizona = info->arizona;
852 ret = regmap_read(arizona->regmap, ARIZONA_MIC_DETECT_3, &val);
854 dev_err(arizona->dev,
859 dev_dbg(arizona->dev, "MICDET: %x\n", val);
862 dev_warn(arizona->dev,
869 dev_err(arizona->dev, "Failed to get valid MICDET value\n");
879 struct arizona *arizona = info->arizona;
882 if (info->detecting && arizona->pdata.micd_software_compare)
893 dev_warn(arizona->dev, "Detected open circuit\n");
910 dev_err(arizona->dev, "Headset report failed: %d\n",
916 dev_err(arizona->dev, "Failed to bypass MICVDD: %d\n",
931 dev_dbg(arizona->dev, "Detected HP/line\n");
944 if (arizona->pdata.micd_software_compare)
945 regmap_update_bits(arizona->regmap,
952 msecs_to_jiffies(arizona->pdata.micd_timeout));
962 dev_dbg(arizona->dev, "Headphone detected\n");
973 struct arizona *arizona = info->arizona;
986 dev_dbg(arizona->dev, "Mic button detected\n");
1000 dev_err(arizona->dev, "Button out of range\n");
1003 dev_warn(arizona->dev, "Button with no mic: %x\n",
1007 dev_dbg(arizona->dev, "Mic button released\n");
1023 struct arizona *arizona = info->arizona;
1033 dev_err(arizona->dev, "Failed to check cable state: %d\n",
1038 dev_dbg(arizona->dev, "Ignoring MICDET for removed cable\n");
1055 struct arizona *arizona = info->arizona;
1056 int debounce = arizona->pdata.micd_detect_debounce;
1089 struct arizona *arizona = info->arizona;
1094 ret = regmap_read(arizona->regmap, ARIZONA_HEADPHONE_DETECT_2,
1097 dev_err(arizona->dev,
1116 dev_warn(arizona->dev, "HPDET did not appear to complete\n");
1124 struct arizona *arizona = info->arizona;
1141 if (arizona->pdata.jd_invert)
1147 ret = regmap_read(arizona->regmap, ARIZONA_AOD_IRQ_RAW_STATUS, &val);
1149 dev_err(arizona->dev, "Failed to read jackdet status: %d\n",
1158 dev_dbg(arizona->dev, "Suppressing duplicate JACKDET\n");
1165 int micd_timeout = arizona->pdata.micd_timeout;
1177 dev_dbg(arizona->dev, "Detected jack\n");
1182 dev_err(arizona->dev, "Mechanical report failed: %d\n",
1189 if (!arizona->pdata.hpdet_acc_id) {
1197 if (info->micd_clamp || !arizona->pdata.jd_invert)
1198 regmap_update_bits(arizona->regmap,
1203 dev_dbg(arizona->dev, "Detected jack removal\n");
1223 dev_err(arizona->dev,
1236 regmap_update_bits(arizona->regmap,
1244 regmap_write(arizona->regmap, ARIZONA_AOD_WKUP_AND_TRIG,
1259 static void arizona_micd_set_level(struct arizona *arizona, int index,
1275 regmap_update_bits(arizona->regmap, reg, mask, level);
1279 struct arizona *arizona)
1288 nconfs = device_property_count_u32(arizona->dev, prop);
1296 ret = device_property_read_u32_array(arizona->dev, prop, vals, nconfs);
1314 arizona->pdata.micd_configs = micd_configs;
1315 arizona->pdata.num_micd_configs = nconfs;
1323 struct arizona *arizona)
1325 struct arizona_pdata *pdata = &arizona->pdata;
1329 device_property_read_u32(arizona->dev, "wlf,hpdet-channel", &val);
1336 dev_err(arizona->dev,
1341 device_property_read_u32(arizona->dev, "wlf,micd-detect-debounce",
1344 device_property_read_u32(arizona->dev, "wlf,micd-bias-start-time",
1347 device_property_read_u32(arizona->dev, "wlf,micd-rate",
1350 device_property_read_u32(arizona->dev, "wlf,micd-dbtime",
1353 device_property_read_u32(arizona->dev, "wlf,micd-timeout-ms",
1356 pdata->micd_force_micbias = device_property_read_bool(arizona->dev,
1359 pdata->micd_software_compare = device_property_read_bool(arizona->dev,
1362 pdata->jd_invert = device_property_read_bool(arizona->dev,
1365 device_property_read_u32(arizona->dev, "wlf,gpsw", &pdata->gpsw);
1367 pdata->jd_gpio5 = device_property_read_bool(arizona->dev,
1369 pdata->jd_gpio5_nopull = device_property_read_bool(arizona->dev,
1372 ret = arizona_extcon_get_micd_configs(dev, arizona);
1374 dev_err(arizona->dev, "Failed to read micd configs: %d\n", ret);
1381 struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
1382 struct arizona_pdata *pdata = &arizona->pdata;
1389 if (!arizona->dapm || !arizona->dapm->card)
1396 if (!dev_get_platdata(arizona->dev))
1397 arizona_extcon_device_get_pdata(&pdev->dev, arizona);
1402 dev_err(arizona->dev, "Failed to get MICVDD: %d\n", ret);
1407 info->arizona = arizona;
1415 switch (arizona->type) {
1417 switch (arizona->rev) {
1429 switch (arizona->rev) {
1455 dev_err(arizona->dev, "extcon_dev_register() failed: %d\n",
1462 dev_err(arizona->dev, "Can't allocate input dev\n");
1468 info->input->phys = "arizona/extcon";
1481 if (arizona->pdata.gpsw > 0)
1482 regmap_update_bits(arizona->regmap, ARIZONA_GP_SWITCH_1,
1483 ARIZONA_SW1_MODE_MASK, arizona->pdata.gpsw);
1494 dev_err(arizona->dev, "Failed to request GPIO%d: %d\n",
1511 info->micd_pol_gpio = gpiod_get_optional(arizona->dev,
1516 dev_err(arizona->dev,
1523 if (arizona->pdata.hpdet_id_gpio > 0) {
1525 arizona->pdata.hpdet_id_gpio,
1529 dev_err(arizona->dev, "Failed to request GPIO%d: %d\n",
1530 arizona->pdata.hpdet_id_gpio, ret);
1535 if (arizona->pdata.micd_bias_start_time)
1536 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1538 arizona->pdata.micd_bias_start_time
1541 if (arizona->pdata.micd_rate)
1542 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1544 arizona->pdata.micd_rate
1547 switch (arizona->pdata.micd_dbtime) {
1549 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1554 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_1,
1564 if (arizona->pdata.num_micd_ranges) {
1572 if (arizona->pdata.num_micd_ranges > ARIZONA_MAX_MICD_RANGE) {
1573 dev_err(arizona->dev, "Too many MICD ranges: %d\n",
1574 arizona->pdata.num_micd_ranges);
1581 dev_err(arizona->dev,
1590 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_2,
1600 dev_err(arizona->dev, "Unsupported MICD level %d\n",
1606 dev_dbg(arizona->dev, "%d ohms for MICD threshold %d\n",
1609 arizona_micd_set_level(arizona, i, j);
1614 regmap_update_bits(arizona->regmap, ARIZONA_MIC_DETECT_2,
1620 arizona_micd_set_level(arizona, i, 0x3f);
1627 if (arizona->pdata.jd_gpio5) {
1630 if (arizona->pdata.jd_gpio5_nopull)
1633 regmap_write(arizona->regmap, ARIZONA_GPIO5_CTRL,
1636 if (arizona->pdata.jd_invert)
1641 if (arizona->pdata.jd_invert)
1647 regmap_update_bits(arizona->regmap,
1651 regmap_update_bits(arizona->regmap,
1671 ret = arizona_request_irq(arizona, jack_irq_rise,
1679 ret = arizona_set_irq_wake(arizona, jack_irq_rise, 1);
1686 ret = arizona_request_irq(arizona, jack_irq_fall,
1693 ret = arizona_set_irq_wake(arizona, jack_irq_fall, 1);
1700 ret = arizona_request_irq(arizona, ARIZONA_IRQ_MICDET,
1707 ret = arizona_request_irq(arizona, ARIZONA_IRQ_HPDET,
1714 arizona_clk32k_enable(arizona);
1715 regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_DEBOUNCE,
1717 regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE,
1722 dev_warn(arizona->dev, "Failed to set MICVDD to bypass: %d\n",
1736 arizona_free_irq(arizona, ARIZONA_IRQ_HPDET, info);
1738 arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info);
1740 arizona_set_irq_wake(arizona, jack_irq_fall, 0);
1742 arizona_free_irq(arizona, jack_irq_fall, info);
1744 arizona_set_irq_wake(arizona, jack_irq_rise, 0);
1746 arizona_free_irq(arizona, jack_irq_rise, info);
1758 struct arizona *arizona = info->arizona;
1771 arizona_set_irq_wake(arizona, jack_irq_rise, 0);
1772 arizona_set_irq_wake(arizona, jack_irq_fall, 0);
1773 arizona_free_irq(arizona, ARIZONA_IRQ_HPDET, info);
1774 arizona_free_irq(arizona, ARIZONA_IRQ_MICDET, info);
1775 arizona_free_irq(arizona, jack_irq_rise, info);
1776 arizona_free_irq(arizona, jack_irq_fall, info);
1781 ret = regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
1792 regmap_update_bits(arizona->regmap,
1795 regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE,
1797 arizona_clk32k_disable(arizona);
1808 .name = "arizona-extcon",
1819 MODULE_ALIAS("platform:extcon-arizona");