Merge series "ASoC: qcom: Fix broken lpass driver" from Srinivas Kandagatla <srinivas.kandagatla@linaro.org>:
LPASS driver is partially broken on DragonBoard DB410c on 5.10 and its totally broken on other Supported Qualcomm SoCs. This was due to DAI ids being over written by the SoC specific header files in the dt-bindings. Idea of having SoC specific headers is not doable when we are dealing with a common driver. So this patchset attempts to fix this properly by creating a common dt-bindings header for lpass which can be updated with new entries if required. This patchset also add an simple of_xlate function to resolve the dai names and different SoCs might not have 1:1 mapping for the dai_driver array with dai ids. Changes since v1: - removed array indexes as suggested by Stephan G. - rebased to sound/for-next branch - collected Srinivasa tested-by tag for sc7180 platform. Thanks, srini Srinivas Kandagatla (2): ASoC: dt-bindings: lpass: Fix and common up lpass dai ids ASoC: qcom: Fix broken support to MI2S TERTIARY and QUATERNARY include/dt-bindings/sound/apq8016-lpass.h | 7 +++---- include/dt-bindings/sound/qcom,lpass.h | 15 +++++++++++++++ include/dt-bindings/sound/sc7180-lpass.h | 6 ++---- sound/soc/qcom/lpass-cpu.c | 22 ++++++++++++++++++++++ sound/soc/qcom/lpass-platform.c | 12 ++++++++++++ sound/soc/qcom/lpass-sc7180.c | 9 +++------ sound/soc/qcom/lpass.h | 2 +- 7 files changed, 58 insertions(+), 15 deletions(-) create mode 100644 include/dt-bindings/sound/qcom,lpass.h -- 2.21.0
This commit is contained in:
Коммит
411fc208eb
|
@ -2,9 +2,8 @@
|
|||
#ifndef __DT_APQ8016_LPASS_H
|
||||
#define __DT_APQ8016_LPASS_H
|
||||
|
||||
#define MI2S_PRIMARY 0
|
||||
#define MI2S_SECONDARY 1
|
||||
#define MI2S_TERTIARY 2
|
||||
#define MI2S_QUATERNARY 3
|
||||
#include <dt-bindings/sound/qcom,lpass.h>
|
||||
|
||||
/* NOTE: Use qcom,lpass.h to define any AIF ID's for LPASS */
|
||||
|
||||
#endif /* __DT_APQ8016_LPASS_H */
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef __DT_QCOM_LPASS_H
|
||||
#define __DT_QCOM_LPASS_H
|
||||
|
||||
#define MI2S_PRIMARY 0
|
||||
#define MI2S_SECONDARY 1
|
||||
#define MI2S_TERTIARY 2
|
||||
#define MI2S_QUATERNARY 3
|
||||
#define MI2S_QUINARY 4
|
||||
|
||||
#define LPASS_DP_RX 5
|
||||
|
||||
#define LPASS_MCLK0 0
|
||||
|
||||
#endif /* __DT_QCOM_LPASS_H */
|
|
@ -2,10 +2,8 @@
|
|||
#ifndef __DT_SC7180_LPASS_H
|
||||
#define __DT_SC7180_LPASS_H
|
||||
|
||||
#define MI2S_PRIMARY 0
|
||||
#define MI2S_SECONDARY 1
|
||||
#define LPASS_DP_RX 2
|
||||
#include <dt-bindings/sound/qcom,lpass.h>
|
||||
|
||||
#define LPASS_MCLK0 0
|
||||
/* NOTE: Use qcom,lpass.h to define any AIF ID's for LPASS */
|
||||
|
||||
#endif /* __DT_APQ8016_LPASS_H */
|
||||
|
|
|
@ -344,8 +344,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)
|
||||
|
|
|
@ -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) {
|
||||
|
@ -507,6 +510,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:
|
||||
reg_irqclr = LPAIF_IRQCLEAR_REG(v, LPAIF_IRQ_PORT_HOST);
|
||||
val_irqclr = LPAIF_IRQ_ALL(ch);
|
||||
|
||||
|
@ -559,6 +565,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:
|
||||
reg_irqen = LPAIF_IRQEN_REG(v, LPAIF_IRQ_PORT_HOST);
|
||||
val_mask = LPAIF_IRQ_ALL(ch);
|
||||
val_irqen = 0;
|
||||
|
@ -655,6 +664,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;
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
#include "lpass.h"
|
||||
|
||||
static struct snd_soc_dai_driver sc7180_lpass_cpu_dai_driver[] = {
|
||||
[MI2S_PRIMARY] = {
|
||||
{
|
||||
.id = MI2S_PRIMARY,
|
||||
.name = "Primary MI2S",
|
||||
.playback = {
|
||||
|
@ -44,9 +44,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,
|
||||
},
|
||||
|
||||
[MI2S_SECONDARY] = {
|
||||
}, {
|
||||
.id = MI2S_SECONDARY,
|
||||
.name = "Secondary MI2S",
|
||||
.playback = {
|
||||
|
@ -60,8 +58,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] = {
|
||||
}, {
|
||||
.id = LPASS_DP_RX,
|
||||
.name = "Hdmi",
|
||||
.playback = {
|
||||
|
|
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче