.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
---|
1 | 2 | /* |
---|
2 | 3 | * da7219-aad.c - Dialog DA7219 ALSA SoC AAD Driver |
---|
3 | 4 | * |
---|
4 | 5 | * Copyright (c) 2015 Dialog Semiconductor Ltd. |
---|
5 | 6 | * |
---|
6 | 7 | * Author: Adam Thomson <Adam.Thomson.Opensource@diasemi.com> |
---|
7 | | - * |
---|
8 | | - * This program is free software; you can redistribute it and/or modify it |
---|
9 | | - * under the terms of the GNU General Public License as published by the |
---|
10 | | - * Free Software Foundation; either version 2 of the License, or (at your |
---|
11 | | - * option) any later version. |
---|
12 | 8 | */ |
---|
13 | 9 | |
---|
14 | 10 | #include <linux/module.h> |
---|
.. | .. |
---|
77 | 73 | snd_soc_dapm_sync(dapm); |
---|
78 | 74 | |
---|
79 | 75 | do { |
---|
80 | | - statusa = snd_soc_component_read32(component, DA7219_ACCDET_STATUS_A); |
---|
| 76 | + statusa = snd_soc_component_read(component, DA7219_ACCDET_STATUS_A); |
---|
81 | 77 | if (statusa & DA7219_MICBIAS_UP_STS_MASK) |
---|
82 | 78 | micbias_up = true; |
---|
83 | 79 | else if (retries++ < DA7219_AAD_MICBIAS_CHK_RETRIES) |
---|
.. | .. |
---|
95 | 91 | */ |
---|
96 | 92 | if (da7219_aad->micbias_pulse_lvl && da7219_aad->micbias_pulse_time) { |
---|
97 | 93 | /* Pulse higher level voltage */ |
---|
98 | | - micbias_ctrl = snd_soc_component_read32(component, DA7219_MICBIAS_CTRL); |
---|
| 94 | + micbias_ctrl = snd_soc_component_read(component, DA7219_MICBIAS_CTRL); |
---|
99 | 95 | snd_soc_component_update_bits(component, DA7219_MICBIAS_CTRL, |
---|
100 | 96 | DA7219_MICBIAS1_LEVEL_MASK, |
---|
101 | 97 | da7219_aad->micbias_pulse_lvl); |
---|
.. | .. |
---|
117 | 113 | struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); |
---|
118 | 114 | struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); |
---|
119 | 115 | |
---|
120 | | - u16 tonegen_freq_hptest; |
---|
| 116 | + __le16 tonegen_freq_hptest; |
---|
121 | 117 | u8 pll_srm_sts, pll_ctrl, gain_ramp_ctrl, accdet_cfg8; |
---|
122 | 118 | int report = 0, ret = 0; |
---|
123 | 119 | |
---|
.. | .. |
---|
145 | 141 | * If MCLK is present, but PLL is not enabled then we enable it here to |
---|
146 | 142 | * ensure a consistent detection procedure. |
---|
147 | 143 | */ |
---|
148 | | - pll_srm_sts = snd_soc_component_read32(component, DA7219_PLL_SRM_STS); |
---|
| 144 | + pll_srm_sts = snd_soc_component_read(component, DA7219_PLL_SRM_STS); |
---|
149 | 145 | if (pll_srm_sts & DA7219_PLL_SRM_STS_MCLK) { |
---|
150 | 146 | tonegen_freq_hptest = cpu_to_le16(DA7219_AAD_HPTEST_RAMP_FREQ); |
---|
151 | 147 | |
---|
152 | | - pll_ctrl = snd_soc_component_read32(component, DA7219_PLL_CTRL); |
---|
| 148 | + pll_ctrl = snd_soc_component_read(component, DA7219_PLL_CTRL); |
---|
153 | 149 | if ((pll_ctrl & DA7219_PLL_MODE_MASK) == DA7219_PLL_MODE_BYPASS) |
---|
154 | 150 | da7219_set_pll(component, DA7219_SYSCLK_PLL, |
---|
155 | 151 | DA7219_PLL_FREQ_OUT_98304); |
---|
.. | .. |
---|
158 | 154 | } |
---|
159 | 155 | |
---|
160 | 156 | /* Ensure gain ramping at fastest rate */ |
---|
161 | | - gain_ramp_ctrl = snd_soc_component_read32(component, DA7219_GAIN_RAMP_CTRL); |
---|
| 157 | + gain_ramp_ctrl = snd_soc_component_read(component, DA7219_GAIN_RAMP_CTRL); |
---|
162 | 158 | snd_soc_component_write(component, DA7219_GAIN_RAMP_CTRL, DA7219_GAIN_RAMP_RATE_X8); |
---|
163 | 159 | |
---|
164 | 160 | /* Bypass cache so it saves current settings */ |
---|
.. | .. |
---|
252 | 248 | msleep(DA7219_AAD_HPTEST_PERIOD); |
---|
253 | 249 | |
---|
254 | 250 | /* Grab comparator reading */ |
---|
255 | | - accdet_cfg8 = snd_soc_component_read32(component, DA7219_ACCDET_CONFIG_8); |
---|
| 251 | + accdet_cfg8 = snd_soc_component_read(component, DA7219_ACCDET_CONFIG_8); |
---|
256 | 252 | if (accdet_cfg8 & DA7219_HPTEST_COMP_MASK) |
---|
257 | 253 | report |= SND_JACK_HEADPHONE; |
---|
258 | 254 | else |
---|
.. | .. |
---|
361 | 357 | return IRQ_NONE; |
---|
362 | 358 | |
---|
363 | 359 | /* Read status register for jack insertion & type status */ |
---|
364 | | - statusa = snd_soc_component_read32(component, DA7219_ACCDET_STATUS_A); |
---|
| 360 | + statusa = snd_soc_component_read(component, DA7219_ACCDET_STATUS_A); |
---|
365 | 361 | |
---|
366 | 362 | /* Clear events */ |
---|
367 | 363 | regmap_bulk_write(da7219->regmap, DA7219_ACCDET_IRQ_EVENT_A, |
---|
.. | .. |
---|
464 | 460 | */ |
---|
465 | 461 | |
---|
466 | 462 | static enum da7219_aad_micbias_pulse_lvl |
---|
467 | | - da7219_aad_fw_micbias_pulse_lvl(struct snd_soc_component *component, u32 val) |
---|
| 463 | + da7219_aad_fw_micbias_pulse_lvl(struct device *dev, u32 val) |
---|
468 | 464 | { |
---|
469 | 465 | switch (val) { |
---|
470 | 466 | case 2800: |
---|
.. | .. |
---|
472 | 468 | case 2900: |
---|
473 | 469 | return DA7219_AAD_MICBIAS_PULSE_LVL_2_9V; |
---|
474 | 470 | default: |
---|
475 | | - dev_warn(component->dev, "Invalid micbias pulse level"); |
---|
| 471 | + dev_warn(dev, "Invalid micbias pulse level"); |
---|
476 | 472 | return DA7219_AAD_MICBIAS_PULSE_LVL_OFF; |
---|
477 | 473 | } |
---|
478 | 474 | } |
---|
479 | 475 | |
---|
480 | 476 | static enum da7219_aad_btn_cfg |
---|
481 | | - da7219_aad_fw_btn_cfg(struct snd_soc_component *component, u32 val) |
---|
| 477 | + da7219_aad_fw_btn_cfg(struct device *dev, u32 val) |
---|
482 | 478 | { |
---|
483 | 479 | switch (val) { |
---|
484 | 480 | case 2: |
---|
.. | .. |
---|
496 | 492 | case 500: |
---|
497 | 493 | return DA7219_AAD_BTN_CFG_500MS; |
---|
498 | 494 | default: |
---|
499 | | - dev_warn(component->dev, "Invalid button config"); |
---|
| 495 | + dev_warn(dev, "Invalid button config"); |
---|
500 | 496 | return DA7219_AAD_BTN_CFG_10MS; |
---|
501 | 497 | } |
---|
502 | 498 | } |
---|
503 | 499 | |
---|
504 | 500 | static enum da7219_aad_mic_det_thr |
---|
505 | | - da7219_aad_fw_mic_det_thr(struct snd_soc_component *component, u32 val) |
---|
| 501 | + da7219_aad_fw_mic_det_thr(struct device *dev, u32 val) |
---|
506 | 502 | { |
---|
507 | 503 | switch (val) { |
---|
508 | 504 | case 200: |
---|
.. | .. |
---|
514 | 510 | case 1000: |
---|
515 | 511 | return DA7219_AAD_MIC_DET_THR_1000_OHMS; |
---|
516 | 512 | default: |
---|
517 | | - dev_warn(component->dev, "Invalid mic detect threshold"); |
---|
| 513 | + dev_warn(dev, "Invalid mic detect threshold"); |
---|
518 | 514 | return DA7219_AAD_MIC_DET_THR_500_OHMS; |
---|
519 | 515 | } |
---|
520 | 516 | } |
---|
521 | 517 | |
---|
522 | 518 | static enum da7219_aad_jack_ins_deb |
---|
523 | | - da7219_aad_fw_jack_ins_deb(struct snd_soc_component *component, u32 val) |
---|
| 519 | + da7219_aad_fw_jack_ins_deb(struct device *dev, u32 val) |
---|
524 | 520 | { |
---|
525 | 521 | switch (val) { |
---|
526 | 522 | case 5: |
---|
.. | .. |
---|
540 | 536 | case 1000: |
---|
541 | 537 | return DA7219_AAD_JACK_INS_DEB_1S; |
---|
542 | 538 | default: |
---|
543 | | - dev_warn(component->dev, "Invalid jack insert debounce"); |
---|
| 539 | + dev_warn(dev, "Invalid jack insert debounce"); |
---|
544 | 540 | return DA7219_AAD_JACK_INS_DEB_20MS; |
---|
545 | 541 | } |
---|
546 | 542 | } |
---|
547 | 543 | |
---|
548 | 544 | static enum da7219_aad_jack_det_rate |
---|
549 | | - da7219_aad_fw_jack_det_rate(struct snd_soc_component *component, const char *str) |
---|
| 545 | + da7219_aad_fw_jack_det_rate(struct device *dev, const char *str) |
---|
550 | 546 | { |
---|
551 | 547 | if (!strcmp(str, "32ms_64ms")) { |
---|
552 | 548 | return DA7219_AAD_JACK_DET_RATE_32_64MS; |
---|
.. | .. |
---|
557 | 553 | } else if (!strcmp(str, "256ms_512ms")) { |
---|
558 | 554 | return DA7219_AAD_JACK_DET_RATE_256_512MS; |
---|
559 | 555 | } else { |
---|
560 | | - dev_warn(component->dev, "Invalid jack detect rate"); |
---|
| 556 | + dev_warn(dev, "Invalid jack detect rate"); |
---|
561 | 557 | return DA7219_AAD_JACK_DET_RATE_256_512MS; |
---|
562 | 558 | } |
---|
563 | 559 | } |
---|
564 | 560 | |
---|
565 | 561 | static enum da7219_aad_jack_rem_deb |
---|
566 | | - da7219_aad_fw_jack_rem_deb(struct snd_soc_component *component, u32 val) |
---|
| 562 | + da7219_aad_fw_jack_rem_deb(struct device *dev, u32 val) |
---|
567 | 563 | { |
---|
568 | 564 | switch (val) { |
---|
569 | 565 | case 1: |
---|
.. | .. |
---|
575 | 571 | case 20: |
---|
576 | 572 | return DA7219_AAD_JACK_REM_DEB_20MS; |
---|
577 | 573 | default: |
---|
578 | | - dev_warn(component->dev, "Invalid jack removal debounce"); |
---|
| 574 | + dev_warn(dev, "Invalid jack removal debounce"); |
---|
579 | 575 | return DA7219_AAD_JACK_REM_DEB_1MS; |
---|
580 | 576 | } |
---|
581 | 577 | } |
---|
582 | 578 | |
---|
583 | 579 | static enum da7219_aad_btn_avg |
---|
584 | | - da7219_aad_fw_btn_avg(struct snd_soc_component *component, u32 val) |
---|
| 580 | + da7219_aad_fw_btn_avg(struct device *dev, u32 val) |
---|
585 | 581 | { |
---|
586 | 582 | switch (val) { |
---|
587 | 583 | case 1: |
---|
.. | .. |
---|
593 | 589 | case 8: |
---|
594 | 590 | return DA7219_AAD_BTN_AVG_8; |
---|
595 | 591 | default: |
---|
596 | | - dev_warn(component->dev, "Invalid button average value"); |
---|
| 592 | + dev_warn(dev, "Invalid button average value"); |
---|
597 | 593 | return DA7219_AAD_BTN_AVG_2; |
---|
598 | 594 | } |
---|
599 | 595 | } |
---|
600 | 596 | |
---|
601 | 597 | static enum da7219_aad_adc_1bit_rpt |
---|
602 | | - da7219_aad_fw_adc_1bit_rpt(struct snd_soc_component *component, u32 val) |
---|
| 598 | + da7219_aad_fw_adc_1bit_rpt(struct device *dev, u32 val) |
---|
603 | 599 | { |
---|
604 | 600 | switch (val) { |
---|
605 | 601 | case 1: |
---|
.. | .. |
---|
611 | 607 | case 8: |
---|
612 | 608 | return DA7219_AAD_ADC_1BIT_RPT_8; |
---|
613 | 609 | default: |
---|
614 | | - dev_warn(component->dev, "Invalid ADC 1-bit repeat value"); |
---|
| 610 | + dev_warn(dev, "Invalid ADC 1-bit repeat value"); |
---|
615 | 611 | return DA7219_AAD_ADC_1BIT_RPT_1; |
---|
616 | 612 | } |
---|
617 | 613 | } |
---|
618 | 614 | |
---|
619 | | -static struct da7219_aad_pdata *da7219_aad_fw_to_pdata(struct snd_soc_component *component) |
---|
| 615 | +static struct da7219_aad_pdata *da7219_aad_fw_to_pdata(struct device *dev) |
---|
620 | 616 | { |
---|
621 | | - struct device *dev = component->dev; |
---|
622 | 617 | struct i2c_client *i2c = to_i2c_client(dev); |
---|
623 | 618 | struct fwnode_handle *aad_np; |
---|
624 | 619 | struct da7219_aad_pdata *aad_pdata; |
---|
.. | .. |
---|
638 | 633 | if (fwnode_property_read_u32(aad_np, "dlg,micbias-pulse-lvl", |
---|
639 | 634 | &fw_val32) >= 0) |
---|
640 | 635 | aad_pdata->micbias_pulse_lvl = |
---|
641 | | - da7219_aad_fw_micbias_pulse_lvl(component, fw_val32); |
---|
| 636 | + da7219_aad_fw_micbias_pulse_lvl(dev, fw_val32); |
---|
642 | 637 | else |
---|
643 | 638 | aad_pdata->micbias_pulse_lvl = DA7219_AAD_MICBIAS_PULSE_LVL_OFF; |
---|
644 | 639 | |
---|
.. | .. |
---|
647 | 642 | aad_pdata->micbias_pulse_time = fw_val32; |
---|
648 | 643 | |
---|
649 | 644 | if (fwnode_property_read_u32(aad_np, "dlg,btn-cfg", &fw_val32) >= 0) |
---|
650 | | - aad_pdata->btn_cfg = da7219_aad_fw_btn_cfg(component, fw_val32); |
---|
| 645 | + aad_pdata->btn_cfg = da7219_aad_fw_btn_cfg(dev, fw_val32); |
---|
651 | 646 | else |
---|
652 | 647 | aad_pdata->btn_cfg = DA7219_AAD_BTN_CFG_10MS; |
---|
653 | 648 | |
---|
654 | 649 | if (fwnode_property_read_u32(aad_np, "dlg,mic-det-thr", &fw_val32) >= 0) |
---|
655 | 650 | aad_pdata->mic_det_thr = |
---|
656 | | - da7219_aad_fw_mic_det_thr(component, fw_val32); |
---|
| 651 | + da7219_aad_fw_mic_det_thr(dev, fw_val32); |
---|
657 | 652 | else |
---|
658 | 653 | aad_pdata->mic_det_thr = DA7219_AAD_MIC_DET_THR_500_OHMS; |
---|
659 | 654 | |
---|
660 | 655 | if (fwnode_property_read_u32(aad_np, "dlg,jack-ins-deb", &fw_val32) >= 0) |
---|
661 | 656 | aad_pdata->jack_ins_deb = |
---|
662 | | - da7219_aad_fw_jack_ins_deb(component, fw_val32); |
---|
| 657 | + da7219_aad_fw_jack_ins_deb(dev, fw_val32); |
---|
663 | 658 | else |
---|
664 | 659 | aad_pdata->jack_ins_deb = DA7219_AAD_JACK_INS_DEB_20MS; |
---|
665 | 660 | |
---|
666 | 661 | if (!fwnode_property_read_string(aad_np, "dlg,jack-det-rate", &fw_str)) |
---|
667 | 662 | aad_pdata->jack_det_rate = |
---|
668 | | - da7219_aad_fw_jack_det_rate(component, fw_str); |
---|
| 663 | + da7219_aad_fw_jack_det_rate(dev, fw_str); |
---|
669 | 664 | else |
---|
670 | 665 | aad_pdata->jack_det_rate = DA7219_AAD_JACK_DET_RATE_256_512MS; |
---|
671 | 666 | |
---|
672 | 667 | if (fwnode_property_read_u32(aad_np, "dlg,jack-rem-deb", &fw_val32) >= 0) |
---|
673 | 668 | aad_pdata->jack_rem_deb = |
---|
674 | | - da7219_aad_fw_jack_rem_deb(component, fw_val32); |
---|
| 669 | + da7219_aad_fw_jack_rem_deb(dev, fw_val32); |
---|
675 | 670 | else |
---|
676 | 671 | aad_pdata->jack_rem_deb = DA7219_AAD_JACK_REM_DEB_1MS; |
---|
677 | 672 | |
---|
.. | .. |
---|
696 | 691 | aad_pdata->c_mic_btn_thr = 0x3E; |
---|
697 | 692 | |
---|
698 | 693 | if (fwnode_property_read_u32(aad_np, "dlg,btn-avg", &fw_val32) >= 0) |
---|
699 | | - aad_pdata->btn_avg = da7219_aad_fw_btn_avg(component, fw_val32); |
---|
| 694 | + aad_pdata->btn_avg = da7219_aad_fw_btn_avg(dev, fw_val32); |
---|
700 | 695 | else |
---|
701 | 696 | aad_pdata->btn_avg = DA7219_AAD_BTN_AVG_2; |
---|
702 | 697 | |
---|
703 | 698 | if (fwnode_property_read_u32(aad_np, "dlg,adc-1bit-rpt", &fw_val32) >= 0) |
---|
704 | 699 | aad_pdata->adc_1bit_rpt = |
---|
705 | | - da7219_aad_fw_adc_1bit_rpt(component, fw_val32); |
---|
| 700 | + da7219_aad_fw_adc_1bit_rpt(dev, fw_val32); |
---|
706 | 701 | else |
---|
707 | 702 | aad_pdata->adc_1bit_rpt = DA7219_AAD_ADC_1BIT_RPT_1; |
---|
708 | 703 | |
---|
.. | .. |
---|
851 | 846 | * suspend then this will be dealt with through the IRQ handler. |
---|
852 | 847 | */ |
---|
853 | 848 | if (da7219_aad->jack_inserted) { |
---|
854 | | - micbias_ctrl = snd_soc_component_read32(component, DA7219_MICBIAS_CTRL); |
---|
| 849 | + micbias_ctrl = snd_soc_component_read(component, DA7219_MICBIAS_CTRL); |
---|
855 | 850 | if (micbias_ctrl & DA7219_MICBIAS1_EN_MASK) { |
---|
856 | 851 | snd_soc_dapm_disable_pin(dapm, "Mic Bias"); |
---|
857 | 852 | snd_soc_dapm_sync(dapm); |
---|
.. | .. |
---|
891 | 886 | int da7219_aad_init(struct snd_soc_component *component) |
---|
892 | 887 | { |
---|
893 | 888 | struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); |
---|
894 | | - struct da7219_aad_priv *da7219_aad; |
---|
| 889 | + struct da7219_aad_priv *da7219_aad = da7219->aad; |
---|
895 | 890 | u8 mask[DA7219_AAD_IRQ_REG_MAX]; |
---|
896 | 891 | int ret; |
---|
897 | 892 | |
---|
898 | | - da7219_aad = devm_kzalloc(component->dev, sizeof(*da7219_aad), GFP_KERNEL); |
---|
899 | | - if (!da7219_aad) |
---|
900 | | - return -ENOMEM; |
---|
901 | | - |
---|
902 | | - da7219->aad = da7219_aad; |
---|
903 | 893 | da7219_aad->component = component; |
---|
904 | 894 | |
---|
905 | 895 | /* Handle any DT/ACPI/platform data */ |
---|
906 | | - if (da7219->pdata && !da7219->pdata->aad_pdata) |
---|
907 | | - da7219->pdata->aad_pdata = da7219_aad_fw_to_pdata(component); |
---|
908 | | - |
---|
909 | 896 | da7219_aad_handle_pdata(component); |
---|
910 | 897 | |
---|
911 | 898 | /* Disable button detection */ |
---|
.. | .. |
---|
951 | 938 | } |
---|
952 | 939 | EXPORT_SYMBOL_GPL(da7219_aad_exit); |
---|
953 | 940 | |
---|
| 941 | +/* |
---|
| 942 | + * AAD related I2C probe handling |
---|
| 943 | + */ |
---|
| 944 | + |
---|
| 945 | +int da7219_aad_probe(struct i2c_client *i2c) |
---|
| 946 | +{ |
---|
| 947 | + struct da7219_priv *da7219 = i2c_get_clientdata(i2c); |
---|
| 948 | + struct device *dev = &i2c->dev; |
---|
| 949 | + struct da7219_aad_priv *da7219_aad; |
---|
| 950 | + |
---|
| 951 | + da7219_aad = devm_kzalloc(dev, sizeof(*da7219_aad), GFP_KERNEL); |
---|
| 952 | + if (!da7219_aad) |
---|
| 953 | + return -ENOMEM; |
---|
| 954 | + |
---|
| 955 | + da7219->aad = da7219_aad; |
---|
| 956 | + |
---|
| 957 | + /* Retrieve any DT/ACPI/platform data */ |
---|
| 958 | + if (da7219->pdata && !da7219->pdata->aad_pdata) |
---|
| 959 | + da7219->pdata->aad_pdata = da7219_aad_fw_to_pdata(dev); |
---|
| 960 | + |
---|
| 961 | + return 0; |
---|
| 962 | +} |
---|
| 963 | +EXPORT_SYMBOL_GPL(da7219_aad_probe); |
---|
| 964 | + |
---|
954 | 965 | MODULE_DESCRIPTION("ASoC DA7219 AAD Driver"); |
---|
955 | 966 | MODULE_AUTHOR("Adam Thomson <Adam.Thomson.Opensource@diasemi.com>"); |
---|
956 | 967 | MODULE_LICENSE("GPL"); |
---|