forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-01-31 f70575805708cabdedea7498aaa3f710fde4d920
kernel/sound/soc/codecs/da7219-aad.c
....@@ -1,14 +1,10 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * da7219-aad.c - Dialog DA7219 ALSA SoC AAD Driver
34 *
45 * Copyright (c) 2015 Dialog Semiconductor Ltd.
56 *
67 * 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.
128 */
139
1410 #include <linux/module.h>
....@@ -77,7 +73,7 @@
7773 snd_soc_dapm_sync(dapm);
7874
7975 do {
80
- statusa = snd_soc_component_read32(component, DA7219_ACCDET_STATUS_A);
76
+ statusa = snd_soc_component_read(component, DA7219_ACCDET_STATUS_A);
8177 if (statusa & DA7219_MICBIAS_UP_STS_MASK)
8278 micbias_up = true;
8379 else if (retries++ < DA7219_AAD_MICBIAS_CHK_RETRIES)
....@@ -95,7 +91,7 @@
9591 */
9692 if (da7219_aad->micbias_pulse_lvl && da7219_aad->micbias_pulse_time) {
9793 /* 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);
9995 snd_soc_component_update_bits(component, DA7219_MICBIAS_CTRL,
10096 DA7219_MICBIAS1_LEVEL_MASK,
10197 da7219_aad->micbias_pulse_lvl);
....@@ -117,7 +113,7 @@
117113 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
118114 struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component);
119115
120
- u16 tonegen_freq_hptest;
116
+ __le16 tonegen_freq_hptest;
121117 u8 pll_srm_sts, pll_ctrl, gain_ramp_ctrl, accdet_cfg8;
122118 int report = 0, ret = 0;
123119
....@@ -145,11 +141,11 @@
145141 * If MCLK is present, but PLL is not enabled then we enable it here to
146142 * ensure a consistent detection procedure.
147143 */
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);
149145 if (pll_srm_sts & DA7219_PLL_SRM_STS_MCLK) {
150146 tonegen_freq_hptest = cpu_to_le16(DA7219_AAD_HPTEST_RAMP_FREQ);
151147
152
- pll_ctrl = snd_soc_component_read32(component, DA7219_PLL_CTRL);
148
+ pll_ctrl = snd_soc_component_read(component, DA7219_PLL_CTRL);
153149 if ((pll_ctrl & DA7219_PLL_MODE_MASK) == DA7219_PLL_MODE_BYPASS)
154150 da7219_set_pll(component, DA7219_SYSCLK_PLL,
155151 DA7219_PLL_FREQ_OUT_98304);
....@@ -158,7 +154,7 @@
158154 }
159155
160156 /* 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);
162158 snd_soc_component_write(component, DA7219_GAIN_RAMP_CTRL, DA7219_GAIN_RAMP_RATE_X8);
163159
164160 /* Bypass cache so it saves current settings */
....@@ -252,7 +248,7 @@
252248 msleep(DA7219_AAD_HPTEST_PERIOD);
253249
254250 /* 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);
256252 if (accdet_cfg8 & DA7219_HPTEST_COMP_MASK)
257253 report |= SND_JACK_HEADPHONE;
258254 else
....@@ -351,17 +347,21 @@
351347 struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component);
352348 u8 events[DA7219_AAD_IRQ_REG_MAX];
353349 u8 statusa;
354
- int i, report = 0, mask = 0;
350
+ int i, ret, report = 0, mask = 0;
355351
356352 /* Read current IRQ events */
357
- regmap_bulk_read(da7219->regmap, DA7219_ACCDET_IRQ_EVENT_A,
358
- events, DA7219_AAD_IRQ_REG_MAX);
353
+ ret = regmap_bulk_read(da7219->regmap, DA7219_ACCDET_IRQ_EVENT_A,
354
+ events, DA7219_AAD_IRQ_REG_MAX);
355
+ if (ret) {
356
+ dev_warn_ratelimited(component->dev, "Failed to read IRQ events: %d\n", ret);
357
+ return IRQ_NONE;
358
+ }
359359
360360 if (!events[DA7219_AAD_IRQ_REG_A] && !events[DA7219_AAD_IRQ_REG_B])
361361 return IRQ_NONE;
362362
363363 /* Read status register for jack insertion & type status */
364
- statusa = snd_soc_component_read32(component, DA7219_ACCDET_STATUS_A);
364
+ statusa = snd_soc_component_read(component, DA7219_ACCDET_STATUS_A);
365365
366366 /* Clear events */
367367 regmap_bulk_write(da7219->regmap, DA7219_ACCDET_IRQ_EVENT_A,
....@@ -464,7 +464,7 @@
464464 */
465465
466466 static enum da7219_aad_micbias_pulse_lvl
467
- da7219_aad_fw_micbias_pulse_lvl(struct snd_soc_component *component, u32 val)
467
+ da7219_aad_fw_micbias_pulse_lvl(struct device *dev, u32 val)
468468 {
469469 switch (val) {
470470 case 2800:
....@@ -472,13 +472,13 @@
472472 case 2900:
473473 return DA7219_AAD_MICBIAS_PULSE_LVL_2_9V;
474474 default:
475
- dev_warn(component->dev, "Invalid micbias pulse level");
475
+ dev_warn(dev, "Invalid micbias pulse level");
476476 return DA7219_AAD_MICBIAS_PULSE_LVL_OFF;
477477 }
478478 }
479479
480480 static enum da7219_aad_btn_cfg
481
- da7219_aad_fw_btn_cfg(struct snd_soc_component *component, u32 val)
481
+ da7219_aad_fw_btn_cfg(struct device *dev, u32 val)
482482 {
483483 switch (val) {
484484 case 2:
....@@ -496,13 +496,13 @@
496496 case 500:
497497 return DA7219_AAD_BTN_CFG_500MS;
498498 default:
499
- dev_warn(component->dev, "Invalid button config");
499
+ dev_warn(dev, "Invalid button config");
500500 return DA7219_AAD_BTN_CFG_10MS;
501501 }
502502 }
503503
504504 static enum da7219_aad_mic_det_thr
505
- da7219_aad_fw_mic_det_thr(struct snd_soc_component *component, u32 val)
505
+ da7219_aad_fw_mic_det_thr(struct device *dev, u32 val)
506506 {
507507 switch (val) {
508508 case 200:
....@@ -514,13 +514,13 @@
514514 case 1000:
515515 return DA7219_AAD_MIC_DET_THR_1000_OHMS;
516516 default:
517
- dev_warn(component->dev, "Invalid mic detect threshold");
517
+ dev_warn(dev, "Invalid mic detect threshold");
518518 return DA7219_AAD_MIC_DET_THR_500_OHMS;
519519 }
520520 }
521521
522522 static enum da7219_aad_jack_ins_deb
523
- da7219_aad_fw_jack_ins_deb(struct snd_soc_component *component, u32 val)
523
+ da7219_aad_fw_jack_ins_deb(struct device *dev, u32 val)
524524 {
525525 switch (val) {
526526 case 5:
....@@ -540,13 +540,13 @@
540540 case 1000:
541541 return DA7219_AAD_JACK_INS_DEB_1S;
542542 default:
543
- dev_warn(component->dev, "Invalid jack insert debounce");
543
+ dev_warn(dev, "Invalid jack insert debounce");
544544 return DA7219_AAD_JACK_INS_DEB_20MS;
545545 }
546546 }
547547
548548 static enum da7219_aad_jack_det_rate
549
- da7219_aad_fw_jack_det_rate(struct snd_soc_component *component, const char *str)
549
+ da7219_aad_fw_jack_det_rate(struct device *dev, const char *str)
550550 {
551551 if (!strcmp(str, "32ms_64ms")) {
552552 return DA7219_AAD_JACK_DET_RATE_32_64MS;
....@@ -557,13 +557,13 @@
557557 } else if (!strcmp(str, "256ms_512ms")) {
558558 return DA7219_AAD_JACK_DET_RATE_256_512MS;
559559 } else {
560
- dev_warn(component->dev, "Invalid jack detect rate");
560
+ dev_warn(dev, "Invalid jack detect rate");
561561 return DA7219_AAD_JACK_DET_RATE_256_512MS;
562562 }
563563 }
564564
565565 static enum da7219_aad_jack_rem_deb
566
- da7219_aad_fw_jack_rem_deb(struct snd_soc_component *component, u32 val)
566
+ da7219_aad_fw_jack_rem_deb(struct device *dev, u32 val)
567567 {
568568 switch (val) {
569569 case 1:
....@@ -575,13 +575,13 @@
575575 case 20:
576576 return DA7219_AAD_JACK_REM_DEB_20MS;
577577 default:
578
- dev_warn(component->dev, "Invalid jack removal debounce");
578
+ dev_warn(dev, "Invalid jack removal debounce");
579579 return DA7219_AAD_JACK_REM_DEB_1MS;
580580 }
581581 }
582582
583583 static enum da7219_aad_btn_avg
584
- da7219_aad_fw_btn_avg(struct snd_soc_component *component, u32 val)
584
+ da7219_aad_fw_btn_avg(struct device *dev, u32 val)
585585 {
586586 switch (val) {
587587 case 1:
....@@ -593,13 +593,13 @@
593593 case 8:
594594 return DA7219_AAD_BTN_AVG_8;
595595 default:
596
- dev_warn(component->dev, "Invalid button average value");
596
+ dev_warn(dev, "Invalid button average value");
597597 return DA7219_AAD_BTN_AVG_2;
598598 }
599599 }
600600
601601 static enum da7219_aad_adc_1bit_rpt
602
- da7219_aad_fw_adc_1bit_rpt(struct snd_soc_component *component, u32 val)
602
+ da7219_aad_fw_adc_1bit_rpt(struct device *dev, u32 val)
603603 {
604604 switch (val) {
605605 case 1:
....@@ -611,14 +611,13 @@
611611 case 8:
612612 return DA7219_AAD_ADC_1BIT_RPT_8;
613613 default:
614
- dev_warn(component->dev, "Invalid ADC 1-bit repeat value");
614
+ dev_warn(dev, "Invalid ADC 1-bit repeat value");
615615 return DA7219_AAD_ADC_1BIT_RPT_1;
616616 }
617617 }
618618
619
-static struct da7219_aad_pdata *da7219_aad_fw_to_pdata(struct snd_soc_component *component)
619
+static struct da7219_aad_pdata *da7219_aad_fw_to_pdata(struct device *dev)
620620 {
621
- struct device *dev = component->dev;
622621 struct i2c_client *i2c = to_i2c_client(dev);
623622 struct fwnode_handle *aad_np;
624623 struct da7219_aad_pdata *aad_pdata;
....@@ -638,7 +637,7 @@
638637 if (fwnode_property_read_u32(aad_np, "dlg,micbias-pulse-lvl",
639638 &fw_val32) >= 0)
640639 aad_pdata->micbias_pulse_lvl =
641
- da7219_aad_fw_micbias_pulse_lvl(component, fw_val32);
640
+ da7219_aad_fw_micbias_pulse_lvl(dev, fw_val32);
642641 else
643642 aad_pdata->micbias_pulse_lvl = DA7219_AAD_MICBIAS_PULSE_LVL_OFF;
644643
....@@ -647,31 +646,31 @@
647646 aad_pdata->micbias_pulse_time = fw_val32;
648647
649648 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);
649
+ aad_pdata->btn_cfg = da7219_aad_fw_btn_cfg(dev, fw_val32);
651650 else
652651 aad_pdata->btn_cfg = DA7219_AAD_BTN_CFG_10MS;
653652
654653 if (fwnode_property_read_u32(aad_np, "dlg,mic-det-thr", &fw_val32) >= 0)
655654 aad_pdata->mic_det_thr =
656
- da7219_aad_fw_mic_det_thr(component, fw_val32);
655
+ da7219_aad_fw_mic_det_thr(dev, fw_val32);
657656 else
658657 aad_pdata->mic_det_thr = DA7219_AAD_MIC_DET_THR_500_OHMS;
659658
660659 if (fwnode_property_read_u32(aad_np, "dlg,jack-ins-deb", &fw_val32) >= 0)
661660 aad_pdata->jack_ins_deb =
662
- da7219_aad_fw_jack_ins_deb(component, fw_val32);
661
+ da7219_aad_fw_jack_ins_deb(dev, fw_val32);
663662 else
664663 aad_pdata->jack_ins_deb = DA7219_AAD_JACK_INS_DEB_20MS;
665664
666665 if (!fwnode_property_read_string(aad_np, "dlg,jack-det-rate", &fw_str))
667666 aad_pdata->jack_det_rate =
668
- da7219_aad_fw_jack_det_rate(component, fw_str);
667
+ da7219_aad_fw_jack_det_rate(dev, fw_str);
669668 else
670669 aad_pdata->jack_det_rate = DA7219_AAD_JACK_DET_RATE_256_512MS;
671670
672671 if (fwnode_property_read_u32(aad_np, "dlg,jack-rem-deb", &fw_val32) >= 0)
673672 aad_pdata->jack_rem_deb =
674
- da7219_aad_fw_jack_rem_deb(component, fw_val32);
673
+ da7219_aad_fw_jack_rem_deb(dev, fw_val32);
675674 else
676675 aad_pdata->jack_rem_deb = DA7219_AAD_JACK_REM_DEB_1MS;
677676
....@@ -696,13 +695,13 @@
696695 aad_pdata->c_mic_btn_thr = 0x3E;
697696
698697 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);
698
+ aad_pdata->btn_avg = da7219_aad_fw_btn_avg(dev, fw_val32);
700699 else
701700 aad_pdata->btn_avg = DA7219_AAD_BTN_AVG_2;
702701
703702 if (fwnode_property_read_u32(aad_np, "dlg,adc-1bit-rpt", &fw_val32) >= 0)
704703 aad_pdata->adc_1bit_rpt =
705
- da7219_aad_fw_adc_1bit_rpt(component, fw_val32);
704
+ da7219_aad_fw_adc_1bit_rpt(dev, fw_val32);
706705 else
707706 aad_pdata->adc_1bit_rpt = DA7219_AAD_ADC_1BIT_RPT_1;
708707
....@@ -851,7 +850,7 @@
851850 * suspend then this will be dealt with through the IRQ handler.
852851 */
853852 if (da7219_aad->jack_inserted) {
854
- micbias_ctrl = snd_soc_component_read32(component, DA7219_MICBIAS_CTRL);
853
+ micbias_ctrl = snd_soc_component_read(component, DA7219_MICBIAS_CTRL);
855854 if (micbias_ctrl & DA7219_MICBIAS1_EN_MASK) {
856855 snd_soc_dapm_disable_pin(dapm, "Mic Bias");
857856 snd_soc_dapm_sync(dapm);
....@@ -859,6 +858,8 @@
859858 }
860859 }
861860 }
861
+
862
+ synchronize_irq(da7219_aad->irq);
862863 }
863864
864865 void da7219_aad_resume(struct snd_soc_component *component)
....@@ -891,21 +892,13 @@
891892 int da7219_aad_init(struct snd_soc_component *component)
892893 {
893894 struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component);
894
- struct da7219_aad_priv *da7219_aad;
895
+ struct da7219_aad_priv *da7219_aad = da7219->aad;
895896 u8 mask[DA7219_AAD_IRQ_REG_MAX];
896897 int ret;
897898
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;
903899 da7219_aad->component = component;
904900
905901 /* 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
-
909902 da7219_aad_handle_pdata(component);
910903
911904 /* Disable button detection */
....@@ -951,6 +944,30 @@
951944 }
952945 EXPORT_SYMBOL_GPL(da7219_aad_exit);
953946
947
+/*
948
+ * AAD related I2C probe handling
949
+ */
950
+
951
+int da7219_aad_probe(struct i2c_client *i2c)
952
+{
953
+ struct da7219_priv *da7219 = i2c_get_clientdata(i2c);
954
+ struct device *dev = &i2c->dev;
955
+ struct da7219_aad_priv *da7219_aad;
956
+
957
+ da7219_aad = devm_kzalloc(dev, sizeof(*da7219_aad), GFP_KERNEL);
958
+ if (!da7219_aad)
959
+ return -ENOMEM;
960
+
961
+ da7219->aad = da7219_aad;
962
+
963
+ /* Retrieve any DT/ACPI/platform data */
964
+ if (da7219->pdata && !da7219->pdata->aad_pdata)
965
+ da7219->pdata->aad_pdata = da7219_aad_fw_to_pdata(dev);
966
+
967
+ return 0;
968
+}
969
+EXPORT_SYMBOL_GPL(da7219_aad_probe);
970
+
954971 MODULE_DESCRIPTION("ASoC DA7219 AAD Driver");
955972 MODULE_AUTHOR("Adam Thomson <Adam.Thomson.Opensource@diasemi.com>");
956973 MODULE_LICENSE("GPL");