Skip to content

Commit

Permalink
soc: pcm3168a: Add DT binding to force clock consumer mode
Browse files Browse the repository at this point in the history
ASoC cannot configure the codec correctly when the ADC and DAC share clock
lines and one of them is the clock producer. Add a DT binding that
overrides ASoC and forces the component into clock consumer mode.

Signed-off-by: Stephen Gordon <[email protected]>
  • Loading branch information
gordoste authored and popcornmix committed Jan 2, 2025
1 parent 8a31601 commit 7e85025
Showing 1 changed file with 12 additions and 0 deletions.
12 changes: 12 additions & 0 deletions sound/soc/codecs/pcm3168a.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ struct pcm3168a_priv {
struct clk *scki;
struct gpio_desc *gpio_rst;
unsigned long sysclk;
bool adc_fc, dac_fc; // Force clock consumer mode

struct pcm3168a_io_params io_params[2];
struct snd_soc_dai_driver dai_drv[2];
Expand Down Expand Up @@ -478,6 +479,12 @@ static int pcm3168a_hw_params(struct snd_pcm_substream *substream,
ms = 0;
}

// Force clock consumer mode if needed
if (pcm3168a->adc_fc && dai->id == PCM3168A_DAI_ADC)
ms = 0;
if (pcm3168a->dac_fc && dai->id == PCM3168A_DAI_DAC)
ms = 0;

format = io_params->format;

if (io_params->slot_width)
Expand Down Expand Up @@ -756,6 +763,11 @@ int pcm3168a_probe(struct device *dev, struct regmap *regmap)

pcm3168a->sysclk = clk_get_rate(pcm3168a->scki);

pcm3168a->adc_fc = of_property_read_bool(dev->of_node,
"adc-force-cons");
pcm3168a->dac_fc = of_property_read_bool(dev->of_node,
"dac-force-cons");

for (i = 0; i < ARRAY_SIZE(pcm3168a->supplies); i++)
pcm3168a->supplies[i].supply = pcm3168a_supply_names[i];

Expand Down

0 comments on commit 7e85025

Please sign in to comment.