Commit 729fd8b2 authored by Brent Lu's avatar Brent Lu Committed by Mark Brown

ASoC: Intel: sof_da7219: use maxim-common module

Use maxim-common module to handle speaker amp DAI link registration.
No functional change in this commit.
Signed-off-by: default avatarBrent Lu <brent.lu@intel.com>
Reviewed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: default avatarBard Liao <yung-chuan.liao@linux.intel.com>
Link: https://lore.kernel.org/r/20230915124852.1696857-18-yung-chuan.liao@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 18e12093
...@@ -620,6 +620,7 @@ config SND_SOC_INTEL_SOF_DA7219_MACH ...@@ -620,6 +620,7 @@ config SND_SOC_INTEL_SOF_DA7219_MACH
select SND_SOC_MAX98357A select SND_SOC_MAX98357A
select SND_SOC_MAX98373_I2C select SND_SOC_MAX98373_I2C
select SND_SOC_DMIC select SND_SOC_DMIC
select SND_SOC_INTEL_SOF_MAXIM_COMMON
help help
This adds support for ASoC machine driver for SOF platforms This adds support for ASoC machine driver for SOF platforms
with Dialog DA7219 I2S audio codec. with Dialog DA7219 I2S audio codec.
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Copyright(c) 2019 Intel Corporation. // Copyright(c) 2019 Intel Corporation.
/* /*
* Intel SOF Machine driver for DA7219 + MAX98373/MAX98360A codec * Intel SOF Machine driver for Dialog headphone codec
*/ */
#include <linux/input.h> #include <linux/input.h>
...@@ -15,11 +15,15 @@ ...@@ -15,11 +15,15 @@
#include <sound/soc-acpi.h> #include <sound/soc-acpi.h>
#include "../../codecs/da7219.h" #include "../../codecs/da7219.h"
#include "hda_dsp_common.h" #include "hda_dsp_common.h"
#include "sof_maxim_common.h"
/* Speaker amp type
* TBD: use ssp-common module for type detection
*/
#define SOF_MAX98360A_SPEAKER_AMP_PRESENT BIT(0)
#define SOF_MAX98373_SPEAKER_AMP_PRESENT BIT(1)
#define DIALOG_CODEC_DAI "da7219-hifi" #define DIALOG_CODEC_DAI "da7219-hifi"
#define MAX98373_CODEC_DAI "max98373-aif1"
#define MAXIM_DEV0_NAME "i2c-MX98373:00"
#define MAXIM_DEV1_NAME "i2c-MX98373:01"
struct hdmi_pcm { struct hdmi_pcm {
struct list_head head; struct list_head head;
...@@ -28,7 +32,7 @@ struct hdmi_pcm { ...@@ -28,7 +32,7 @@ struct hdmi_pcm {
}; };
struct card_private { struct card_private {
struct snd_soc_jack headset; struct snd_soc_jack headset_jack;
struct list_head hdmi_pcm_list; struct list_head hdmi_pcm_list;
struct snd_soc_jack hdmi[3]; struct snd_soc_jack hdmi[3];
}; };
...@@ -70,14 +74,6 @@ static const struct snd_kcontrol_new controls[] = { ...@@ -70,14 +74,6 @@ static const struct snd_kcontrol_new controls[] = {
SOC_DAPM_PIN_SWITCH("Right Spk"), SOC_DAPM_PIN_SWITCH("Right Spk"),
}; };
static const struct snd_kcontrol_new m98360a_controls[] = {
SOC_DAPM_PIN_SWITCH("Headphone Jack"),
SOC_DAPM_PIN_SWITCH("Headset Mic"),
SOC_DAPM_PIN_SWITCH("Line Out"),
SOC_DAPM_PIN_SWITCH("Spk"),
};
/* For MAX98373 amp */
static const struct snd_soc_dapm_widget widgets[] = { static const struct snd_soc_dapm_widget widgets[] = {
SND_SOC_DAPM_HP("Headphone Jack", NULL), SND_SOC_DAPM_HP("Headphone Jack", NULL),
SND_SOC_DAPM_MIC("Headset Mic", NULL), SND_SOC_DAPM_MIC("Headset Mic", NULL),
...@@ -103,40 +99,6 @@ static const struct snd_soc_dapm_route audio_map[] = { ...@@ -103,40 +99,6 @@ static const struct snd_soc_dapm_route audio_map[] = {
{ "Headset Mic", NULL, "Platform Clock" }, { "Headset Mic", NULL, "Platform Clock" },
{ "Line Out", NULL, "Platform Clock" }, { "Line Out", NULL, "Platform Clock" },
{ "Left Spk", NULL, "Left BE_OUT" },
{ "Right Spk", NULL, "Right BE_OUT" },
/* digital mics */
{"DMic", NULL, "SoC DMIC"},
};
/* For MAX98360A amp */
static const struct snd_soc_dapm_widget max98360a_widgets[] = {
SND_SOC_DAPM_HP("Headphone Jack", NULL),
SND_SOC_DAPM_MIC("Headset Mic", NULL),
SND_SOC_DAPM_LINE("Line Out", NULL),
SND_SOC_DAPM_SPK("Spk", NULL),
SND_SOC_DAPM_SUPPLY("Platform Clock", SND_SOC_NOPM, 0, 0,
platform_clock_control, SND_SOC_DAPM_POST_PMD |
SND_SOC_DAPM_PRE_PMU),
SND_SOC_DAPM_MIC("SoC DMIC", NULL),
};
static const struct snd_soc_dapm_route max98360a_map[] = {
{ "Headphone Jack", NULL, "HPL" },
{ "Headphone Jack", NULL, "HPR" },
{ "MIC", NULL, "Headset Mic" },
{ "Headphone Jack", NULL, "Platform Clock" },
{ "Headset Mic", NULL, "Platform Clock" },
{ "Line Out", NULL, "Platform Clock" },
{"Spk", NULL, "Speaker"},
/* digital mics */ /* digital mics */
{"DMic", NULL, "SoC DMIC"}, {"DMic", NULL, "SoC DMIC"},
}; };
...@@ -156,13 +118,12 @@ static struct snd_soc_jack_pin jack_pins[] = { ...@@ -156,13 +118,12 @@ static struct snd_soc_jack_pin jack_pins[] = {
}, },
}; };
static struct snd_soc_jack headset;
static int da7219_codec_init(struct snd_soc_pcm_runtime *rtd) static int da7219_codec_init(struct snd_soc_pcm_runtime *rtd)
{ {
struct card_private *ctx = snd_soc_card_get_drvdata(rtd->card);
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0); struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
struct snd_soc_component *component = codec_dai->component; struct snd_soc_component *component = codec_dai->component;
struct snd_soc_jack *jack; struct snd_soc_jack *jack = &ctx->headset_jack;
int ret; int ret;
/* Configure sysclk for codec */ /* Configure sysclk for codec */
...@@ -181,25 +142,27 @@ static int da7219_codec_init(struct snd_soc_pcm_runtime *rtd) ...@@ -181,25 +142,27 @@ static int da7219_codec_init(struct snd_soc_pcm_runtime *rtd)
SND_JACK_HEADSET | SND_JACK_BTN_0 | SND_JACK_HEADSET | SND_JACK_BTN_0 |
SND_JACK_BTN_1 | SND_JACK_BTN_2 | SND_JACK_BTN_1 | SND_JACK_BTN_2 |
SND_JACK_BTN_3 | SND_JACK_LINEOUT, SND_JACK_BTN_3 | SND_JACK_LINEOUT,
&headset, jack, jack_pins, ARRAY_SIZE(jack_pins));
jack_pins,
ARRAY_SIZE(jack_pins));
if (ret) { if (ret) {
dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret); dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
return ret; return ret;
} }
jack = &headset;
snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOLUMEUP); snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOLUMEUP);
snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEDOWN); snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEDOWN);
snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOICECOMMAND); snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOICECOMMAND);
snd_soc_component_set_jack(component, jack, NULL);
ret = snd_soc_component_set_jack(component, jack, NULL);
if (ret) {
dev_err(rtd->dev, "fail to set component jack, ret %d\n", ret);
return ret;
}
return ret; return ret;
} }
static int ssp1_hw_params(struct snd_pcm_substream *substream, static int max98373_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params) struct snd_pcm_hw_params *params)
{ {
struct snd_soc_pcm_runtime *runtime = asoc_substream_to_rtd(substream); struct snd_soc_pcm_runtime *runtime = asoc_substream_to_rtd(substream);
...@@ -208,7 +171,7 @@ static int ssp1_hw_params(struct snd_pcm_substream *substream, ...@@ -208,7 +171,7 @@ static int ssp1_hw_params(struct snd_pcm_substream *substream,
for (j = 0; j < runtime->dai_link->num_codecs; j++) { for (j = 0; j < runtime->dai_link->num_codecs; j++) {
struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(runtime, j); struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(runtime, j);
if (!strcmp(codec_dai->component->name, MAXIM_DEV0_NAME)) { if (!strcmp(codec_dai->component->name, MAX_98373_DEV0_NAME)) {
/* vmon_slot_no = 0 imon_slot_no = 1 for TX slots */ /* vmon_slot_no = 0 imon_slot_no = 1 for TX slots */
ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x3, 3, 4, 16); ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x3, 3, 4, 16);
if (ret < 0) { if (ret < 0) {
...@@ -216,7 +179,7 @@ static int ssp1_hw_params(struct snd_pcm_substream *substream, ...@@ -216,7 +179,7 @@ static int ssp1_hw_params(struct snd_pcm_substream *substream,
return ret; return ret;
} }
} }
if (!strcmp(codec_dai->component->name, MAXIM_DEV1_NAME)) { if (!strcmp(codec_dai->component->name, MAX_98373_DEV1_NAME)) {
/* vmon_slot_no = 2 imon_slot_no = 3 for TX slots */ /* vmon_slot_no = 2 imon_slot_no = 3 for TX slots */
ret = snd_soc_dai_set_tdm_slot(codec_dai, 0xC, 3, 4, 16); ret = snd_soc_dai_set_tdm_slot(codec_dai, 0xC, 3, 4, 16);
if (ret < 0) { if (ret < 0) {
...@@ -229,19 +192,8 @@ static int ssp1_hw_params(struct snd_pcm_substream *substream, ...@@ -229,19 +192,8 @@ static int ssp1_hw_params(struct snd_pcm_substream *substream,
return 0; return 0;
} }
static struct snd_soc_ops ssp1_ops = { static const struct snd_soc_ops max98373_ops = {
.hw_params = ssp1_hw_params, .hw_params = max98373_hw_params,
};
static struct snd_soc_codec_conf max98373_codec_conf[] = {
{
.dlc = COMP_CODEC_CONF(MAXIM_DEV0_NAME),
.name_prefix = "Right",
},
{
.dlc = COMP_CODEC_CONF(MAXIM_DEV1_NAME),
.name_prefix = "Left",
},
}; };
static int hdmi_init(struct snd_soc_pcm_runtime *rtd) static int hdmi_init(struct snd_soc_pcm_runtime *rtd)
...@@ -285,13 +237,6 @@ SND_SOC_DAILINK_DEF(ssp0_codec, ...@@ -285,13 +237,6 @@ SND_SOC_DAILINK_DEF(ssp0_codec,
SND_SOC_DAILINK_DEF(ssp1_pin, SND_SOC_DAILINK_DEF(ssp1_pin,
DAILINK_COMP_ARRAY(COMP_CPU("SSP1 Pin"))); DAILINK_COMP_ARRAY(COMP_CPU("SSP1 Pin")));
SND_SOC_DAILINK_DEF(ssp1_amps,
DAILINK_COMP_ARRAY(
/* Left */ COMP_CODEC(MAXIM_DEV0_NAME, MAX98373_CODEC_DAI),
/* Right */ COMP_CODEC(MAXIM_DEV1_NAME, MAX98373_CODEC_DAI)));
SND_SOC_DAILINK_DEF(ssp1_m98360a,
DAILINK_COMP_ARRAY(COMP_CODEC("MX98360A:00", "HiFi")));
SND_SOC_DAILINK_DEF(dmic_pin, SND_SOC_DAILINK_DEF(dmic_pin,
DAILINK_COMP_ARRAY(COMP_CPU("DMIC01 Pin"))); DAILINK_COMP_ARRAY(COMP_CPU("DMIC01 Pin")));
...@@ -328,8 +273,7 @@ static struct snd_soc_dai_link dais[] = { ...@@ -328,8 +273,7 @@ static struct snd_soc_dai_link dais[] = {
.no_pcm = 1, .no_pcm = 1,
.dpcm_playback = 1, .dpcm_playback = 1,
.dpcm_capture = 1, /* IV feedback */ .dpcm_capture = 1, /* IV feedback */
.ops = &ssp1_ops, SND_SOC_DAILINK_REG(ssp1_pin, max_98373_components, platform),
SND_SOC_DAILINK_REG(ssp1_pin, ssp1_amps, platform),
}, },
{ {
.name = "SSP0-Codec", .name = "SSP0-Codec",
...@@ -383,8 +327,8 @@ static struct snd_soc_dai_link dais[] = { ...@@ -383,8 +327,8 @@ static struct snd_soc_dai_link dais[] = {
} }
}; };
static struct snd_soc_card card_da7219_m98373 = { static struct snd_soc_card card_da7219 = {
.name = "da7219max", .name = "da7219", /* the sof- prefix is added by the core */
.owner = THIS_MODULE, .owner = THIS_MODULE,
.dai_link = dais, .dai_link = dais,
.num_links = ARRAY_SIZE(dais), .num_links = ARRAY_SIZE(dais),
...@@ -394,72 +338,68 @@ static struct snd_soc_card card_da7219_m98373 = { ...@@ -394,72 +338,68 @@ static struct snd_soc_card card_da7219_m98373 = {
.num_dapm_widgets = ARRAY_SIZE(widgets), .num_dapm_widgets = ARRAY_SIZE(widgets),
.dapm_routes = audio_map, .dapm_routes = audio_map,
.num_dapm_routes = ARRAY_SIZE(audio_map), .num_dapm_routes = ARRAY_SIZE(audio_map),
.codec_conf = max98373_codec_conf,
.num_configs = ARRAY_SIZE(max98373_codec_conf),
.fully_routed = true,
.late_probe = card_late_probe,
};
static struct snd_soc_card card_da7219_m98360a = {
.name = "da7219max98360a",
.owner = THIS_MODULE,
.dai_link = dais,
.num_links = ARRAY_SIZE(dais),
.controls = m98360a_controls,
.num_controls = ARRAY_SIZE(m98360a_controls),
.dapm_widgets = max98360a_widgets,
.num_dapm_widgets = ARRAY_SIZE(max98360a_widgets),
.dapm_routes = max98360a_map,
.num_dapm_routes = ARRAY_SIZE(max98360a_map),
.fully_routed = true, .fully_routed = true,
.late_probe = card_late_probe, .late_probe = card_late_probe,
}; };
static int audio_probe(struct platform_device *pdev) static int audio_probe(struct platform_device *pdev)
{ {
static struct snd_soc_card *card; struct snd_soc_acpi_mach *mach = pdev->dev.platform_data;
struct snd_soc_acpi_mach *mach;
struct card_private *ctx; struct card_private *ctx;
unsigned long board_quirk = 0;
int ret; int ret;
ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL); ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL);
if (!ctx) if (!ctx)
return -ENOMEM; return -ENOMEM;
/* By default dais[0] is configured for max98373 */ if (pdev->id_entry && pdev->id_entry->driver_data)
if (!strcmp(pdev->name, "sof_da7219_mx98360a")) { board_quirk = (unsigned long)pdev->id_entry->driver_data;
dais[0] = (struct snd_soc_dai_link) {
.name = "SSP1-Codec", /* backward-compatible with existing devices */
.id = 0, if (board_quirk & SOF_MAX98360A_SPEAKER_AMP_PRESENT)
.no_pcm = 1, card_da7219.name = devm_kstrdup(&pdev->dev, "da7219max98360a",
.dpcm_playback = 1, GFP_KERNEL);
.ignore_pmdown_time = 1, else if (board_quirk & SOF_MAX98373_SPEAKER_AMP_PRESENT)
SND_SOC_DAILINK_REG(ssp1_pin, ssp1_m98360a, platform) }; card_da7219.name = devm_kstrdup(&pdev->dev, "da7219max",
GFP_KERNEL);
dev_dbg(&pdev->dev, "board_quirk = %lx\n", board_quirk);
/* speaker amp */
if (board_quirk & SOF_MAX98360A_SPEAKER_AMP_PRESENT) {
max_98360a_dai_link(&dais[0]);
} else if (board_quirk & SOF_MAX98373_SPEAKER_AMP_PRESENT) {
dais[0].codecs = max_98373_components;
dais[0].num_codecs = ARRAY_SIZE(max_98373_components);
dais[0].init = max_98373_spk_codec_init;
dais[0].ops = &max98373_ops; /* use local ops */
max_98373_set_codec_conf(&card_da7219);
} }
INIT_LIST_HEAD(&ctx->hdmi_pcm_list); INIT_LIST_HEAD(&ctx->hdmi_pcm_list);
card = (struct snd_soc_card *)pdev->id_entry->driver_data;
card->dev = &pdev->dev;
mach = pdev->dev.platform_data; card_da7219.dev = &pdev->dev;
ret = snd_soc_fixup_dai_links_platform_name(card,
ret = snd_soc_fixup_dai_links_platform_name(&card_da7219,
mach->mach_params.platform); mach->mach_params.platform);
if (ret) if (ret)
return ret; return ret;
snd_soc_card_set_drvdata(card, ctx); snd_soc_card_set_drvdata(&card_da7219, ctx);
return devm_snd_soc_register_card(&pdev->dev, card); return devm_snd_soc_register_card(&pdev->dev, &card_da7219);
} }
static const struct platform_device_id board_ids[] = { static const struct platform_device_id board_ids[] = {
{ {
.name = "sof_da7219_mx98373", .name = "sof_da7219_mx98373",
.driver_data = (kernel_ulong_t)&card_da7219_m98373, .driver_data = (kernel_ulong_t)(SOF_MAX98373_SPEAKER_AMP_PRESENT),
}, },
{ {
.name = "sof_da7219_mx98360a", .name = "sof_da7219_mx98360a",
.driver_data = (kernel_ulong_t)&card_da7219_m98360a, .driver_data = (kernel_ulong_t)(SOF_MAX98360A_SPEAKER_AMP_PRESENT),
}, },
{ } { }
}; };
...@@ -468,7 +408,7 @@ MODULE_DEVICE_TABLE(platform, board_ids); ...@@ -468,7 +408,7 @@ MODULE_DEVICE_TABLE(platform, board_ids);
static struct platform_driver audio = { static struct platform_driver audio = {
.probe = audio_probe, .probe = audio_probe,
.driver = { .driver = {
.name = "sof_da7219_max98_360a_373", .name = "sof_da7219",
.pm = &snd_soc_pm_ops, .pm = &snd_soc_pm_ops,
}, },
.id_table = board_ids, .id_table = board_ids,
...@@ -476,7 +416,9 @@ static struct platform_driver audio = { ...@@ -476,7 +416,9 @@ static struct platform_driver audio = {
module_platform_driver(audio) module_platform_driver(audio)
/* Module information */ /* Module information */
MODULE_DESCRIPTION("ASoC Intel(R) SOF Machine driver"); MODULE_DESCRIPTION("ASoC Intel(R) SOF Machine driver for Dialog codec");
MODULE_AUTHOR("Yong Zhi <yong.zhi@intel.com>"); MODULE_AUTHOR("Yong Zhi <yong.zhi@intel.com>");
MODULE_AUTHOR("Brent Lu <brent.lu@intel.com>");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
MODULE_IMPORT_NS(SND_SOC_INTEL_HDA_DSP_COMMON); MODULE_IMPORT_NS(SND_SOC_INTEL_HDA_DSP_COMMON);
MODULE_IMPORT_NS(SND_SOC_INTEL_SOF_MAXIM_COMMON);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment