hc
2023-12-08 01573e231f18eb2d99162747186f59511f56b64d
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
....@@ -361,7 +357,7 @@
361357 return IRQ_NONE;
362358
363359 /* 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);
365361
366362 /* Clear events */
367363 regmap_bulk_write(da7219->regmap, DA7219_ACCDET_IRQ_EVENT_A,
....@@ -464,7 +460,7 @@
464460 */
465461
466462 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)
468464 {
469465 switch (val) {
470466 case 2800:
....@@ -472,13 +468,13 @@
472468 case 2900:
473469 return DA7219_AAD_MICBIAS_PULSE_LVL_2_9V;
474470 default:
475
- dev_warn(component->dev, "Invalid micbias pulse level");
471
+ dev_warn(dev, "Invalid micbias pulse level");
476472 return DA7219_AAD_MICBIAS_PULSE_LVL_OFF;
477473 }
478474 }
479475
480476 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)
482478 {
483479 switch (val) {
484480 case 2:
....@@ -496,13 +492,13 @@
496492 case 500:
497493 return DA7219_AAD_BTN_CFG_500MS;
498494 default:
499
- dev_warn(component->dev, "Invalid button config");
495
+ dev_warn(dev, "Invalid button config");
500496 return DA7219_AAD_BTN_CFG_10MS;
501497 }
502498 }
503499
504500 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)
506502 {
507503 switch (val) {
508504 case 200:
....@@ -514,13 +510,13 @@
514510 case 1000:
515511 return DA7219_AAD_MIC_DET_THR_1000_OHMS;
516512 default:
517
- dev_warn(component->dev, "Invalid mic detect threshold");
513
+ dev_warn(dev, "Invalid mic detect threshold");
518514 return DA7219_AAD_MIC_DET_THR_500_OHMS;
519515 }
520516 }
521517
522518 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)
524520 {
525521 switch (val) {
526522 case 5:
....@@ -540,13 +536,13 @@
540536 case 1000:
541537 return DA7219_AAD_JACK_INS_DEB_1S;
542538 default:
543
- dev_warn(component->dev, "Invalid jack insert debounce");
539
+ dev_warn(dev, "Invalid jack insert debounce");
544540 return DA7219_AAD_JACK_INS_DEB_20MS;
545541 }
546542 }
547543
548544 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)
550546 {
551547 if (!strcmp(str, "32ms_64ms")) {
552548 return DA7219_AAD_JACK_DET_RATE_32_64MS;
....@@ -557,13 +553,13 @@
557553 } else if (!strcmp(str, "256ms_512ms")) {
558554 return DA7219_AAD_JACK_DET_RATE_256_512MS;
559555 } else {
560
- dev_warn(component->dev, "Invalid jack detect rate");
556
+ dev_warn(dev, "Invalid jack detect rate");
561557 return DA7219_AAD_JACK_DET_RATE_256_512MS;
562558 }
563559 }
564560
565561 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)
567563 {
568564 switch (val) {
569565 case 1:
....@@ -575,13 +571,13 @@
575571 case 20:
576572 return DA7219_AAD_JACK_REM_DEB_20MS;
577573 default:
578
- dev_warn(component->dev, "Invalid jack removal debounce");
574
+ dev_warn(dev, "Invalid jack removal debounce");
579575 return DA7219_AAD_JACK_REM_DEB_1MS;
580576 }
581577 }
582578
583579 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)
585581 {
586582 switch (val) {
587583 case 1:
....@@ -593,13 +589,13 @@
593589 case 8:
594590 return DA7219_AAD_BTN_AVG_8;
595591 default:
596
- dev_warn(component->dev, "Invalid button average value");
592
+ dev_warn(dev, "Invalid button average value");
597593 return DA7219_AAD_BTN_AVG_2;
598594 }
599595 }
600596
601597 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)
603599 {
604600 switch (val) {
605601 case 1:
....@@ -611,14 +607,13 @@
611607 case 8:
612608 return DA7219_AAD_ADC_1BIT_RPT_8;
613609 default:
614
- dev_warn(component->dev, "Invalid ADC 1-bit repeat value");
610
+ dev_warn(dev, "Invalid ADC 1-bit repeat value");
615611 return DA7219_AAD_ADC_1BIT_RPT_1;
616612 }
617613 }
618614
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)
620616 {
621
- struct device *dev = component->dev;
622617 struct i2c_client *i2c = to_i2c_client(dev);
623618 struct fwnode_handle *aad_np;
624619 struct da7219_aad_pdata *aad_pdata;
....@@ -638,7 +633,7 @@
638633 if (fwnode_property_read_u32(aad_np, "dlg,micbias-pulse-lvl",
639634 &fw_val32) >= 0)
640635 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);
642637 else
643638 aad_pdata->micbias_pulse_lvl = DA7219_AAD_MICBIAS_PULSE_LVL_OFF;
644639
....@@ -647,31 +642,31 @@
647642 aad_pdata->micbias_pulse_time = fw_val32;
648643
649644 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);
651646 else
652647 aad_pdata->btn_cfg = DA7219_AAD_BTN_CFG_10MS;
653648
654649 if (fwnode_property_read_u32(aad_np, "dlg,mic-det-thr", &fw_val32) >= 0)
655650 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);
657652 else
658653 aad_pdata->mic_det_thr = DA7219_AAD_MIC_DET_THR_500_OHMS;
659654
660655 if (fwnode_property_read_u32(aad_np, "dlg,jack-ins-deb", &fw_val32) >= 0)
661656 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);
663658 else
664659 aad_pdata->jack_ins_deb = DA7219_AAD_JACK_INS_DEB_20MS;
665660
666661 if (!fwnode_property_read_string(aad_np, "dlg,jack-det-rate", &fw_str))
667662 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);
669664 else
670665 aad_pdata->jack_det_rate = DA7219_AAD_JACK_DET_RATE_256_512MS;
671666
672667 if (fwnode_property_read_u32(aad_np, "dlg,jack-rem-deb", &fw_val32) >= 0)
673668 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);
675670 else
676671 aad_pdata->jack_rem_deb = DA7219_AAD_JACK_REM_DEB_1MS;
677672
....@@ -696,13 +691,13 @@
696691 aad_pdata->c_mic_btn_thr = 0x3E;
697692
698693 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);
700695 else
701696 aad_pdata->btn_avg = DA7219_AAD_BTN_AVG_2;
702697
703698 if (fwnode_property_read_u32(aad_np, "dlg,adc-1bit-rpt", &fw_val32) >= 0)
704699 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);
706701 else
707702 aad_pdata->adc_1bit_rpt = DA7219_AAD_ADC_1BIT_RPT_1;
708703
....@@ -851,7 +846,7 @@
851846 * suspend then this will be dealt with through the IRQ handler.
852847 */
853848 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);
855850 if (micbias_ctrl & DA7219_MICBIAS1_EN_MASK) {
856851 snd_soc_dapm_disable_pin(dapm, "Mic Bias");
857852 snd_soc_dapm_sync(dapm);
....@@ -891,21 +886,13 @@
891886 int da7219_aad_init(struct snd_soc_component *component)
892887 {
893888 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;
895890 u8 mask[DA7219_AAD_IRQ_REG_MAX];
896891 int ret;
897892
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;
903893 da7219_aad->component = component;
904894
905895 /* 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
-
909896 da7219_aad_handle_pdata(component);
910897
911898 /* Disable button detection */
....@@ -951,6 +938,30 @@
951938 }
952939 EXPORT_SYMBOL_GPL(da7219_aad_exit);
953940
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
+
954965 MODULE_DESCRIPTION("ASoC DA7219 AAD Driver");
955966 MODULE_AUTHOR("Adam Thomson <Adam.Thomson.Opensource@diasemi.com>");
956967 MODULE_LICENSE("GPL");