Message ID | 20210118164509.32307-3-srinivas.kandagatla@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | ASoC: qcom: Fix broken lpass driver | expand |
Hi Srinivas, Thanks a lot for the patch! On Mon, Jan 18, 2021 at 04:45:09PM +0000, Srinivas Kandagatla wrote: > lpass hdmi support patch totally removed support for MI2S TERTIARY > and QUATERNARY. > > One of the major issue was spotted with the design of having > separate SoC specific header files for the common lpass driver. > This design is prone to break as an when new SoC header is added > as the common DAI ids of other SoCs will be overwritten by the > new ones. > > Having a common header qcom,lpass.h should fix the issue and any new > DAI ids should be added to the common header. > > With this change lpass also needs a new of_xlate function to resolve > dai name. > > Fixes: 7cb37b7bd0d3 ("ASoC: qcom: Add support for lpass hdmi driver") > Reported-by: Jun Nie <jun.nie@linaro.org> > Reported-by: Stephan Gerhold <stephan@gerhold.net> > Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> For some reason this does not seem to apply to asoc/for-next or asoc/for-linus: Applying: ASoC: qcom: Fix broken support to MI2S TERTIARY and QUATERNARY error: patch failed: sound/soc/qcom/lpass-platform.c:519 error: sound/soc/qcom/lpass-platform.c: patch does not apply Patch failed at 0001 ASoC: qcom: Fix broken support to MI2S TERTIARY and QUATERNARY Can you check if you need to rebase this patch? Also small comment below in case you re-send: > --- > sound/soc/qcom/lpass-cpu.c | 22 ++++++++++++++++++++++ > sound/soc/qcom/lpass-platform.c | 12 ++++++++++++ > sound/soc/qcom/lpass-sc7180.c | 6 +++--- > sound/soc/qcom/lpass.h | 2 +- > 4 files changed, 38 insertions(+), 4 deletions(-) > > [...] > diff --git a/sound/soc/qcom/lpass-sc7180.c b/sound/soc/qcom/lpass-sc7180.c > index 85db650c2169..eff5de918e3a 100644 > --- a/sound/soc/qcom/lpass-sc7180.c > +++ b/sound/soc/qcom/lpass-sc7180.c > @@ -20,7 +20,7 @@ > #include "lpass.h" > > static struct snd_soc_dai_driver sc7180_lpass_cpu_dai_driver[] = { > - [MI2S_PRIMARY] = { > + [0] = { > .id = MI2S_PRIMARY, > .name = "Primary MI2S", > .playback = { > @@ -46,7 +46,7 @@ static struct snd_soc_dai_driver sc7180_lpass_cpu_dai_driver[] = { > .ops = &asoc_qcom_lpass_cpu_dai_ops, > }, > > - [MI2S_SECONDARY] = { > + [1] = { > .id = MI2S_SECONDARY, > .name = "Secondary MI2S", > .playback = { > @@ -61,7 +61,7 @@ static struct snd_soc_dai_driver sc7180_lpass_cpu_dai_driver[] = { > .probe = &asoc_qcom_lpass_cpu_dai_probe, > .ops = &asoc_qcom_lpass_cpu_dai_ops, > }, > - [LPASS_DP_RX] = { > + [2] = { > .id = LPASS_DP_RX, > .name = "Hdmi", > .playback = { Specifying the indexes here explicitly seems pointless now, perhaps change this to just { .id = MI2S_PRIMARY, /* ... */ }, { .id = MI2S_SECONDARY, /* ... */ } Thanks, Stephan
diff --git a/sound/soc/qcom/lpass-cpu.c b/sound/soc/qcom/lpass-cpu.c index af684fd19ab9..02441021a13d 100644 --- a/sound/soc/qcom/lpass-cpu.c +++ b/sound/soc/qcom/lpass-cpu.c @@ -356,8 +356,30 @@ int asoc_qcom_lpass_cpu_dai_probe(struct snd_soc_dai *dai) } EXPORT_SYMBOL_GPL(asoc_qcom_lpass_cpu_dai_probe); +static int asoc_qcom_of_xlate_dai_name(struct snd_soc_component *component, + struct of_phandle_args *args, + const char **dai_name) +{ + struct lpass_data *drvdata = snd_soc_component_get_drvdata(component); + struct lpass_variant *variant = drvdata->variant; + int id = args->args[0]; + int ret = -EINVAL; + int i; + + for (i = 0; i < variant->num_dai; i++) { + if (variant->dai_driver[i].id == id) { + *dai_name = variant->dai_driver[i].name; + ret = 0; + break; + } + } + + return ret; +} + static const struct snd_soc_component_driver lpass_cpu_comp_driver = { .name = "lpass-cpu", + .of_xlate_dai_name = asoc_qcom_of_xlate_dai_name, }; static bool lpass_cpu_regmap_writeable(struct device *dev, unsigned int reg) diff --git a/sound/soc/qcom/lpass-platform.c b/sound/soc/qcom/lpass-platform.c index 80b09dede5f9..e27443e520de 100644 --- a/sound/soc/qcom/lpass-platform.c +++ b/sound/soc/qcom/lpass-platform.c @@ -257,6 +257,9 @@ static int lpass_platform_pcmops_hw_params(struct snd_soc_component *component, break; case MI2S_PRIMARY: case MI2S_SECONDARY: + case MI2S_TERTIARY: + case MI2S_QUATERNARY: + case MI2S_QUINARY: ret = regmap_fields_write(dmactl->intf, id, LPAIF_DMACTL_AUDINTF(dma_port)); if (ret) { @@ -519,6 +522,9 @@ static int lpass_platform_pcmops_trigger(struct snd_soc_component *component, break; case MI2S_PRIMARY: case MI2S_SECONDARY: + case MI2S_TERTIARY: + case MI2S_QUATERNARY: + case MI2S_QUINARY: map = drvdata->lpaif_map; reg_irqclr = LPAIF_IRQCLEAR_REG(v, LPAIF_IRQ_PORT_HOST); val_irqclr = LPAIF_IRQ_ALL(ch); @@ -573,6 +579,9 @@ static int lpass_platform_pcmops_trigger(struct snd_soc_component *component, break; case MI2S_PRIMARY: case MI2S_SECONDARY: + case MI2S_TERTIARY: + case MI2S_QUATERNARY: + case MI2S_QUINARY: map = drvdata->lpaif_map; reg_irqen = LPAIF_IRQEN_REG(v, LPAIF_IRQ_PORT_HOST); val_mask = LPAIF_IRQ_ALL(ch); @@ -670,6 +679,9 @@ static irqreturn_t lpass_dma_interrupt_handler( break; case MI2S_PRIMARY: case MI2S_SECONDARY: + case MI2S_TERTIARY: + case MI2S_QUATERNARY: + case MI2S_QUINARY: map = drvdata->lpaif_map; reg = LPAIF_IRQCLEAR_REG(v, LPAIF_IRQ_PORT_HOST); val = 0; diff --git a/sound/soc/qcom/lpass-sc7180.c b/sound/soc/qcom/lpass-sc7180.c index 85db650c2169..eff5de918e3a 100644 --- a/sound/soc/qcom/lpass-sc7180.c +++ b/sound/soc/qcom/lpass-sc7180.c @@ -20,7 +20,7 @@ #include "lpass.h" static struct snd_soc_dai_driver sc7180_lpass_cpu_dai_driver[] = { - [MI2S_PRIMARY] = { + [0] = { .id = MI2S_PRIMARY, .name = "Primary MI2S", .playback = { @@ -46,7 +46,7 @@ static struct snd_soc_dai_driver sc7180_lpass_cpu_dai_driver[] = { .ops = &asoc_qcom_lpass_cpu_dai_ops, }, - [MI2S_SECONDARY] = { + [1] = { .id = MI2S_SECONDARY, .name = "Secondary MI2S", .playback = { @@ -61,7 +61,7 @@ static struct snd_soc_dai_driver sc7180_lpass_cpu_dai_driver[] = { .probe = &asoc_qcom_lpass_cpu_dai_probe, .ops = &asoc_qcom_lpass_cpu_dai_ops, }, - [LPASS_DP_RX] = { + [2] = { .id = LPASS_DP_RX, .name = "Hdmi", .playback = { diff --git a/sound/soc/qcom/lpass.h b/sound/soc/qcom/lpass.h index 0195372905ed..2d68af0da34d 100644 --- a/sound/soc/qcom/lpass.h +++ b/sound/soc/qcom/lpass.h @@ -12,7 +12,7 @@ #include <linux/compiler.h> #include <linux/platform_device.h> #include <linux/regmap.h> -#include <dt-bindings/sound/sc7180-lpass.h> +#include <dt-bindings/sound/qcom,lpass.h> #include "lpass-hdmi.h" #define LPASS_AHBIX_CLOCK_FREQUENCY 131072000
lpass hdmi support patch totally removed support for MI2S TERTIARY and QUATERNARY. One of the major issue was spotted with the design of having separate SoC specific header files for the common lpass driver. This design is prone to break as an when new SoC header is added as the common DAI ids of other SoCs will be overwritten by the new ones. Having a common header qcom,lpass.h should fix the issue and any new DAI ids should be added to the common header. With this change lpass also needs a new of_xlate function to resolve dai name. Fixes: 7cb37b7bd0d3 ("ASoC: qcom: Add support for lpass hdmi driver") Reported-by: Jun Nie <jun.nie@linaro.org> Reported-by: Stephan Gerhold <stephan@gerhold.net> Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> --- sound/soc/qcom/lpass-cpu.c | 22 ++++++++++++++++++++++ sound/soc/qcom/lpass-platform.c | 12 ++++++++++++ sound/soc/qcom/lpass-sc7180.c | 6 +++--- sound/soc/qcom/lpass.h | 2 +- 4 files changed, 38 insertions(+), 4 deletions(-)