2021-03-04 06:42:13

by Lucas Tanure

[permalink] [raw]
Subject: [PATCH 07/15] ASoC: cs42l42: Set clock source for both ways of stream

Move the enable/disable of clocks to cs42l42_mute_stream so the record
path also get clocks.

Signed-off-by: Lucas Tanure <[email protected]>
---
sound/soc/codecs/cs42l42.c | 85 +++++++++++++++++++++-----------------
sound/soc/codecs/cs42l42.h | 1 +
2 files changed, 48 insertions(+), 38 deletions(-)

diff --git a/sound/soc/codecs/cs42l42.c b/sound/soc/codecs/cs42l42.c
index 663a6a8104171..670f28f09ae01 100644
--- a/sound/soc/codecs/cs42l42.c
+++ b/sound/soc/codecs/cs42l42.c
@@ -786,52 +786,62 @@ static int cs42l42_set_sysclk(struct snd_soc_dai *dai,
return 0;
}

-static int cs42l42_mute(struct snd_soc_dai *dai, int mute, int direction)
+static int cs42l42_mute_stream(struct snd_soc_dai *dai, int mute, int stream)
{
struct snd_soc_component *component = dai->component;
unsigned int regval;
u8 fullScaleVol;

if (mute) {
- /* Mark SCLK as not present to turn on the internal
- * oscillator.
- */
- snd_soc_component_update_bits(component, CS42L42_OSC_SWITCH,
- CS42L42_SCLK_PRESENT_MASK, 0);
-
- snd_soc_component_update_bits(component, CS42L42_PLL_CTL1,
- CS42L42_PLL_START_MASK,
- 0 << CS42L42_PLL_START_SHIFT);
-
/* Mute the headphone */
- snd_soc_component_update_bits(component, CS42L42_HP_CTL,
- CS42L42_HP_ANA_AMUTE_MASK |
- CS42L42_HP_ANA_BMUTE_MASK,
- CS42L42_HP_ANA_AMUTE_MASK |
- CS42L42_HP_ANA_BMUTE_MASK);
+ if (stream == SNDRV_PCM_STREAM_PLAYBACK)
+ snd_soc_component_update_bits(component, CS42L42_HP_CTL,
+ CS42L42_HP_ANA_AMUTE_MASK |
+ CS42L42_HP_ANA_BMUTE_MASK,
+ CS42L42_HP_ANA_AMUTE_MASK |
+ CS42L42_HP_ANA_BMUTE_MASK);
+
+ cs42l42->stream_use &= ~(1 << stream);
+ if(!cs42l42->stream_use) {
+ /*
+ * Switch to the internal oscillator.
+ * SCLK must remain running until after this clock switch.
+ * Without a source of clock the I2C bus doesn't work.
+ */
+ snd_soc_component_update_bits(component, CS42L42_OSC_SWITCH,
+ CS42L42_SCLK_PRESENT_MASK, 0);
+ snd_soc_component_update_bits(component, CS42L42_PLL_CTL1,
+ CS42L42_PLL_START_MASK, 0);
+ }
} else {
- snd_soc_component_update_bits(component, CS42L42_PLL_CTL1,
- CS42L42_PLL_START_MASK,
- 1 << CS42L42_PLL_START_SHIFT);
- /* Read the headphone load */
- regval = snd_soc_component_read(component, CS42L42_LOAD_DET_RCSTAT);
- if (((regval & CS42L42_RLA_STAT_MASK) >>
- CS42L42_RLA_STAT_SHIFT) == CS42L42_RLA_STAT_15_OHM) {
- fullScaleVol = CS42L42_HP_FULL_SCALE_VOL_MASK;
- } else {
- fullScaleVol = 0;
+ if (!cs42l42->stream_use) {
+ /* SCLK must be running before codec unmute */
+ snd_soc_component_update_bits(component, CS42L42_PLL_CTL1,
+ CS42L42_PLL_START_MASK, 1);
+
+ /* Mark SCLK as present, turn off internal oscillator */
+ snd_soc_component_update_bits(component, CS42L42_OSC_SWITCH,
+ CS42L42_SCLK_PRESENT_MASK,
+ CS42L42_SCLK_PRESENT_MASK);
}
+ cs42l42->stream_use |= 1 << stream;
+
+ if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
+ /* Read the headphone load */
+ regval = snd_soc_component_read(component, CS42L42_LOAD_DET_RCSTAT);
+ if (((regval & CS42L42_RLA_STAT_MASK) >> CS42L42_RLA_STAT_SHIFT) ==
+ CS42L42_RLA_STAT_15_OHM) {
+ fullScaleVol = CS42L42_HP_FULL_SCALE_VOL_MASK;
+ } else {
+ fullScaleVol = 0;
+ }

- /* Un-mute the headphone, set the full scale volume flag */
- snd_soc_component_update_bits(component, CS42L42_HP_CTL,
- CS42L42_HP_ANA_AMUTE_MASK |
- CS42L42_HP_ANA_BMUTE_MASK |
- CS42L42_HP_FULL_SCALE_VOL_MASK, fullScaleVol);
-
- /* Mark SCLK as present, turn off internal oscillator */
- snd_soc_component_update_bits(component, CS42L42_OSC_SWITCH,
- CS42L42_SCLK_PRESENT_MASK,
- CS42L42_SCLK_PRESENT_MASK);
+ /* Un-mute the headphone, set the full scale volume flag */
+ snd_soc_component_update_bits(component, CS42L42_HP_CTL,
+ CS42L42_HP_ANA_AMUTE_MASK |
+ CS42L42_HP_ANA_BMUTE_MASK |
+ CS42L42_HP_FULL_SCALE_VOL_MASK, fullScaleVol);
+ }
}

return 0;
@@ -846,8 +856,7 @@ static const struct snd_soc_dai_ops cs42l42_ops = {
.hw_params = cs42l42_pcm_hw_params,
.set_fmt = cs42l42_set_dai_fmt,
.set_sysclk = cs42l42_set_sysclk,
- .mute_stream = cs42l42_mute,
- .no_capture_mute = 1,
+ .mute_stream = cs42l42_mute_stream,
};

static struct snd_soc_dai_driver cs42l42_dai = {
diff --git a/sound/soc/codecs/cs42l42.h b/sound/soc/codecs/cs42l42.h
index e17a0c0aeb4a0..59e6eccb8d731 100644
--- a/sound/soc/codecs/cs42l42.h
+++ b/sound/soc/codecs/cs42l42.h
@@ -769,6 +769,7 @@ struct cs42l42_private {
u8 bias_thresholds[CS42L42_NUM_BIASES];
u8 hs_bias_ramp_rate;
u8 hs_bias_ramp_time;
+ u8 stream_use;
};

#endif /* __CS42L42_H__ */
--
2.30.1


2021-03-04 20:37:15

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH 07/15] ASoC: cs42l42: Set clock source for both ways of stream

Hi Lucas,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on asoc/for-next]
[also build test ERROR on v5.12-rc1 next-20210302]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url: https://github.com/0day-ci/linux/commits/Lucas-Tanure/Report-jack-and-button-detection-Capture-Support/20210303-012348
base: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next
config: arc-allyesconfig (attached as .config)
compiler: arceb-elf-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/d004d17fc0cf6b114d467e0b352fe619c2d653a4
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Lucas-Tanure/Report-jack-and-button-detection-Capture-Support/20210303-012348
git checkout d004d17fc0cf6b114d467e0b352fe619c2d653a4
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=arc

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>

Note: the linux-review/Lucas-Tanure/Report-jack-and-button-detection-Capture-Support/20210303-012348 HEAD 844324ce32306dc48f88e1a9fb44f51783b3942d builds fine.
It only hurts bisectibility.

All errors (new ones prefixed by >>):

sound/soc/codecs/cs42l42.c: In function 'cs42l42_mute_stream':
>> sound/soc/codecs/cs42l42.c:804:3: error: 'cs42l42' undeclared (first use in this function)
804 | cs42l42->stream_use &= ~(1 << stream);
| ^~~~~~~
sound/soc/codecs/cs42l42.c:804:3: note: each undeclared identifier is reported only once for each function it appears in


vim +/cs42l42 +804 sound/soc/codecs/cs42l42.c

788
789 static int cs42l42_mute_stream(struct snd_soc_dai *dai, int mute, int stream)
790 {
791 struct snd_soc_component *component = dai->component;
792 unsigned int regval;
793 u8 fullScaleVol;
794
795 if (mute) {
796 /* Mute the headphone */
797 if (stream == SNDRV_PCM_STREAM_PLAYBACK)
798 snd_soc_component_update_bits(component, CS42L42_HP_CTL,
799 CS42L42_HP_ANA_AMUTE_MASK |
800 CS42L42_HP_ANA_BMUTE_MASK,
801 CS42L42_HP_ANA_AMUTE_MASK |
802 CS42L42_HP_ANA_BMUTE_MASK);
803
> 804 cs42l42->stream_use &= ~(1 << stream);
805 if(!cs42l42->stream_use) {
806 /*
807 * Switch to the internal oscillator.
808 * SCLK must remain running until after this clock switch.
809 * Without a source of clock the I2C bus doesn't work.
810 */
811 snd_soc_component_update_bits(component, CS42L42_OSC_SWITCH,
812 CS42L42_SCLK_PRESENT_MASK, 0);
813 snd_soc_component_update_bits(component, CS42L42_PLL_CTL1,
814 CS42L42_PLL_START_MASK, 0);
815 }
816 } else {
817 if (!cs42l42->stream_use) {
818 /* SCLK must be running before codec unmute */
819 snd_soc_component_update_bits(component, CS42L42_PLL_CTL1,
820 CS42L42_PLL_START_MASK, 1);
821
822 /* Mark SCLK as present, turn off internal oscillator */
823 snd_soc_component_update_bits(component, CS42L42_OSC_SWITCH,
824 CS42L42_SCLK_PRESENT_MASK,
825 CS42L42_SCLK_PRESENT_MASK);
826 }
827 cs42l42->stream_use |= 1 << stream;
828
829 if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
830 /* Read the headphone load */
831 regval = snd_soc_component_read(component, CS42L42_LOAD_DET_RCSTAT);
832 if (((regval & CS42L42_RLA_STAT_MASK) >> CS42L42_RLA_STAT_SHIFT) ==
833 CS42L42_RLA_STAT_15_OHM) {
834 fullScaleVol = CS42L42_HP_FULL_SCALE_VOL_MASK;
835 } else {
836 fullScaleVol = 0;
837 }
838
839 /* Un-mute the headphone, set the full scale volume flag */
840 snd_soc_component_update_bits(component, CS42L42_HP_CTL,
841 CS42L42_HP_ANA_AMUTE_MASK |
842 CS42L42_HP_ANA_BMUTE_MASK |
843 CS42L42_HP_FULL_SCALE_VOL_MASK, fullScaleVol);
844 }
845 }
846
847 return 0;
848 }
849

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]


Attachments:
(No filename) (4.59 kB)
.config.gz (65.93 kB)
Download all attachments