[PATCH v2] ASoC: pcm3168a: Add option to force clock consumer

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]



Hi,

Resending with signoff tag and including linux-sound on CC.

Scenario is that DAC's clock pins are tied to ADC's clock pins, with
codec acting as clock producer for the I2S bus, and the CPU has a single
pair of I2S clock pins used for both playback and capture.


                                 ,-------------------
---------            ------------| LRCK     DAC
     LRCK|-------+--/     -------| BCK   (producer)  C
CPU      |       |       /       |                   O
      BCK|-------|---+--/        | ----------------  D
consumer |       \   |           |                   E
---------         ---------------| LRCK     ADC      C
                     `-----------| BCK    (consumer)
                                 `--------------------

Both DAI links will have codec acting as a clock producer, but we need

to configure the codec so that only one of ADC/DAC drives the lines.


Add DT options to support this configuration. adc-force-cons/dac-force-cons

cause the corresponding component to be configured in consumer mode.


Signed-off-by: Stephen Gordon <gordoste@xxxxxxxxxxxx>




diff --git a/sound/soc/codecs/pcm3168a.c b/sound/soc/codecs/pcm3168a.c
index 9d6431338..1a4cf8d63 100644
--- a/sound/soc/codecs/pcm3168a.c
+++ b/sound/soc/codecs/pcm3168a.c
@@ -61,6 +61,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];
@@ -479,6 +480,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)
@@ -757,6 +764,15 @@ int pcm3168a_probe(struct device *dev, struct regmap *regmap)

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

+       adc_fc = false;
+       dac_fc = false;
+       if (dev->of_node) {
+               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];









[Index of Archives]     [Pulseaudio]     [Linux Audio Users]     [ALSA Devel]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]

  Powered by Linux