forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 133
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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: Brent Lu <[email protected]>
- Loading branch information
Showing
2 changed files
with
52 additions
and
111 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,7 +2,7 @@ | |
// 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> | ||
|
@@ -15,11 +15,15 @@ | |
#include <sound/soc-acpi.h> | ||
#include "../../codecs/da7219.h" | ||
#include "hda_dsp_common.h" | ||
#include "sof_maxim_common.h" | ||
|
||
/* Speaker amp type */ | ||
#define SOF_MAX98360A_SPEAKER_AMP_PRESENT BIT(0) | ||
#define SOF_MAX98373_SPEAKER_AMP_PRESENT BIT(1) | ||
|
||
#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" | ||
|
||
static unsigned long sof_da7219_quirk; | ||
|
||
struct hdmi_pcm { | ||
struct list_head head; | ||
|
@@ -70,14 +74,6 @@ static const struct snd_kcontrol_new controls[] = { | |
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[] = { | ||
SND_SOC_DAPM_HP("Headphone Jack", NULL), | ||
SND_SOC_DAPM_MIC("Headset Mic", NULL), | ||
|
@@ -103,40 +99,6 @@ static const struct snd_soc_dapm_route audio_map[] = { | |
{ "Headset Mic", 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 */ | ||
{"DMic", NULL, "SoC DMIC"}, | ||
}; | ||
|
@@ -199,7 +161,7 @@ static int da7219_codec_init(struct snd_soc_pcm_runtime *rtd) | |
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_soc_pcm_runtime *runtime = asoc_substream_to_rtd(substream); | ||
|
@@ -208,15 +170,15 @@ static int ssp1_hw_params(struct snd_pcm_substream *substream, | |
for (j = 0; j < runtime->dai_link->num_codecs; 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 */ | ||
ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x3, 3, 4, 16); | ||
if (ret < 0) { | ||
dev_err(runtime->dev, "DEV0 TDM slot err:%d\n", 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 */ | ||
ret = snd_soc_dai_set_tdm_slot(codec_dai, 0xC, 3, 4, 16); | ||
if (ret < 0) { | ||
|
@@ -229,19 +191,8 @@ static int ssp1_hw_params(struct snd_pcm_substream *substream, | |
return 0; | ||
} | ||
|
||
static struct snd_soc_ops ssp1_ops = { | ||
.hw_params = ssp1_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 struct snd_soc_ops max98373_ops = { | ||
.hw_params = max98373_hw_params, | ||
}; | ||
|
||
static int hdmi_init(struct snd_soc_pcm_runtime *rtd) | ||
|
@@ -285,13 +236,6 @@ SND_SOC_DAILINK_DEF(ssp0_codec, | |
|
||
SND_SOC_DAILINK_DEF(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, | ||
DAILINK_COMP_ARRAY(COMP_CPU("DMIC01 Pin"))); | ||
|
@@ -328,8 +272,7 @@ static struct snd_soc_dai_link dais[] = { | |
.no_pcm = 1, | ||
.dpcm_playback = 1, | ||
.dpcm_capture = 1, /* IV feedback */ | ||
.ops = &ssp1_ops, | ||
SND_SOC_DAILINK_REG(ssp1_pin, ssp1_amps, platform), | ||
SND_SOC_DAILINK_REG(ssp1_pin, max_98373_components, platform), | ||
}, | ||
{ | ||
.name = "SSP0-Codec", | ||
|
@@ -383,8 +326,8 @@ static struct snd_soc_dai_link dais[] = { | |
} | ||
}; | ||
|
||
static struct snd_soc_card card_da7219_m98373 = { | ||
.name = "da7219max", | ||
static struct snd_soc_card card_da7219 = { | ||
.name = "da7219", /* the sof- prefix is added by the core */ | ||
.owner = THIS_MODULE, | ||
.dai_link = dais, | ||
.num_links = ARRAY_SIZE(dais), | ||
|
@@ -394,72 +337,67 @@ static struct snd_soc_card card_da7219_m98373 = { | |
.num_dapm_widgets = ARRAY_SIZE(widgets), | ||
.dapm_routes = 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, | ||
.late_probe = card_late_probe, | ||
}; | ||
|
||
static int audio_probe(struct platform_device *pdev) | ||
{ | ||
static struct snd_soc_card *card; | ||
struct snd_soc_acpi_mach *mach; | ||
struct snd_soc_acpi_mach *mach = pdev->dev.platform_data; | ||
struct card_private *ctx; | ||
int ret; | ||
|
||
ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL); | ||
if (!ctx) | ||
return -ENOMEM; | ||
|
||
/* By default dais[0] is configured for max98373 */ | ||
if (!strcmp(pdev->name, "sof_da7219_mx98360a")) { | ||
dais[0] = (struct snd_soc_dai_link) { | ||
.name = "SSP1-Codec", | ||
.id = 0, | ||
.no_pcm = 1, | ||
.dpcm_playback = 1, | ||
.ignore_pmdown_time = 1, | ||
SND_SOC_DAILINK_REG(ssp1_pin, ssp1_m98360a, platform) }; | ||
if (pdev->id_entry && pdev->id_entry->driver_data) | ||
sof_da7219_quirk = (unsigned long)pdev->id_entry->driver_data; | ||
|
||
/* backward-compatible with existing devices */ | ||
if (sof_da7219_quirk & SOF_MAX98360A_SPEAKER_AMP_PRESENT) | ||
card_da7219.name = devm_kstrdup(&pdev->dev, "da7219max98360a", | ||
GFP_KERNEL); | ||
else if (sof_da7219_quirk & SOF_MAX98373_SPEAKER_AMP_PRESENT) | ||
card_da7219.name = devm_kstrdup(&pdev->dev, "da7219max", | ||
GFP_KERNEL); | ||
|
||
dev_dbg(&pdev->dev, "sof_da7219_quirk = %lx\n", sof_da7219_quirk); | ||
|
||
/* speaker amp */ | ||
if (sof_da7219_quirk & SOF_MAX98360A_SPEAKER_AMP_PRESENT) | ||
max_98360a_dai_link(&dais[0]); | ||
else if (sof_da7219_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); | ||
card = (struct snd_soc_card *)pdev->id_entry->driver_data; | ||
card->dev = &pdev->dev; | ||
|
||
mach = pdev->dev.platform_data; | ||
ret = snd_soc_fixup_dai_links_platform_name(card, | ||
card_da7219.dev = &pdev->dev; | ||
|
||
ret = snd_soc_fixup_dai_links_platform_name(&card_da7219, | ||
mach->mach_params.platform); | ||
if (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[] = { | ||
{ | ||
.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", | ||
.driver_data = (kernel_ulong_t)&card_da7219_m98360a, | ||
.driver_data = (kernel_ulong_t)(SOF_MAX98360A_SPEAKER_AMP_PRESENT), | ||
}, | ||
{ } | ||
}; | ||
|
@@ -468,15 +406,17 @@ MODULE_DEVICE_TABLE(platform, board_ids); | |
static struct platform_driver audio = { | ||
.probe = audio_probe, | ||
.driver = { | ||
.name = "sof_da7219_max98_360a_373", | ||
.name = "sof_da7219", | ||
.pm = &snd_soc_pm_ops, | ||
}, | ||
.id_table = board_ids, | ||
}; | ||
module_platform_driver(audio) | ||
|
||
/* 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 <[email protected]>"); | ||
MODULE_AUTHOR("Brent Lu <[email protected]>"); | ||
MODULE_LICENSE("GPL v2"); | ||
MODULE_IMPORT_NS(SND_SOC_INTEL_HDA_DSP_COMMON); | ||
MODULE_IMPORT_NS(SND_SOC_INTEL_SOF_MAXIM_COMMON); |