| From 134cbaf2d9ee78c43486948e5c7f4105d35cc699 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 9 Jan 2021 22:01:17 +0100 |
| Subject: ASoC: Intel: bytcr_rt5640: Add new BYT_RT5640_NO_SPEAKERS quirk-flag |
| |
| From: Hans de Goede <hdegoede@redhat.com> |
| |
| [ Upstream commit 1851ccf9e155b2a6f6cca1a7bd49325f5efbd5d2 ] |
| |
| Some devices, like mini PCs/media/top-set boxes do not have any speakers |
| at all, an example of the is the Mele PCG03 Mini PC. |
| |
| Add a new BYT_RT5640_NO_SPEAKERS quirk-flag which when sets does not add |
| speaker routes and modifies the components and the (optional) long_name |
| strings to reflect that there are no speakers. |
| |
| Cc: Rasmus Porsager <rasmus@beat.dk> |
| Signed-off-by: Hans de Goede <hdegoede@redhat.com> |
| Acked-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> |
| Link: https://lore.kernel.org/r/20210109210119.159032-2-hdegoede@redhat.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| sound/soc/intel/boards/bytcr_rt5640.c | 26 +++++++++++++++++++------- |
| 1 file changed, 19 insertions(+), 7 deletions(-) |
| |
| diff --git a/sound/soc/intel/boards/bytcr_rt5640.c b/sound/soc/intel/boards/bytcr_rt5640.c |
| index 5520d7c80019..dce2df30d4c5 100644 |
| --- a/sound/soc/intel/boards/bytcr_rt5640.c |
| +++ b/sound/soc/intel/boards/bytcr_rt5640.c |
| @@ -71,6 +71,7 @@ enum { |
| #define BYT_RT5640_SSP0_AIF2 BIT(21) |
| #define BYT_RT5640_MCLK_EN BIT(22) |
| #define BYT_RT5640_MCLK_25MHZ BIT(23) |
| +#define BYT_RT5640_NO_SPEAKERS BIT(24) |
| |
| #define BYTCR_INPUT_DEFAULTS \ |
| (BYT_RT5640_IN3_MAP | \ |
| @@ -132,6 +133,8 @@ static void log_quirks(struct device *dev) |
| dev_info(dev, "quirk JD_NOT_INV enabled\n"); |
| if (byt_rt5640_quirk & BYT_RT5640_MONO_SPEAKER) |
| dev_info(dev, "quirk MONO_SPEAKER enabled\n"); |
| + if (byt_rt5640_quirk & BYT_RT5640_NO_SPEAKERS) |
| + dev_info(dev, "quirk NO_SPEAKERS enabled\n"); |
| if (byt_rt5640_quirk & BYT_RT5640_DIFF_MIC) |
| dev_info(dev, "quirk DIFF_MIC enabled\n"); |
| if (byt_rt5640_quirk & BYT_RT5640_SSP0_AIF1) { |
| @@ -946,7 +949,7 @@ static int byt_rt5640_init(struct snd_soc_pcm_runtime *runtime) |
| ret = snd_soc_dapm_add_routes(&card->dapm, |
| byt_rt5640_mono_spk_map, |
| ARRAY_SIZE(byt_rt5640_mono_spk_map)); |
| - } else { |
| + } else if (!(byt_rt5640_quirk & BYT_RT5640_NO_SPEAKERS)) { |
| ret = snd_soc_dapm_add_routes(&card->dapm, |
| byt_rt5640_stereo_spk_map, |
| ARRAY_SIZE(byt_rt5640_stereo_spk_map)); |
| @@ -1188,6 +1191,7 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev) |
| { |
| struct device *dev = &pdev->dev; |
| static const char * const map_name[] = { "dmic1", "dmic2", "in1", "in3" }; |
| + __maybe_unused const char *spk_type; |
| const struct dmi_system_id *dmi_id; |
| struct byt_rt5640_private *priv; |
| struct snd_soc_acpi_mach *mach; |
| @@ -1196,7 +1200,7 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev) |
| bool sof_parent; |
| int ret_val = 0; |
| int dai_index = 0; |
| - int i; |
| + int i, cfg_spk; |
| |
| is_bytcr = false; |
| priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); |
| @@ -1335,16 +1339,24 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev) |
| } |
| } |
| |
| + if (byt_rt5640_quirk & BYT_RT5640_NO_SPEAKERS) { |
| + cfg_spk = 0; |
| + spk_type = "none"; |
| + } else if (byt_rt5640_quirk & BYT_RT5640_MONO_SPEAKER) { |
| + cfg_spk = 1; |
| + spk_type = "mono"; |
| + } else { |
| + cfg_spk = 2; |
| + spk_type = "stereo"; |
| + } |
| + |
| snprintf(byt_rt5640_components, sizeof(byt_rt5640_components), |
| - "cfg-spk:%s cfg-mic:%s", |
| - (byt_rt5640_quirk & BYT_RT5640_MONO_SPEAKER) ? "1" : "2", |
| + "cfg-spk:%d cfg-mic:%s", cfg_spk, |
| map_name[BYT_RT5640_MAP(byt_rt5640_quirk)]); |
| byt_rt5640_card.components = byt_rt5640_components; |
| #if !IS_ENABLED(CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES) |
| snprintf(byt_rt5640_long_name, sizeof(byt_rt5640_long_name), |
| - "bytcr-rt5640-%s-spk-%s-mic", |
| - (byt_rt5640_quirk & BYT_RT5640_MONO_SPEAKER) ? |
| - "mono" : "stereo", |
| + "bytcr-rt5640-%s-spk-%s-mic", spk_type, |
| map_name[BYT_RT5640_MAP(byt_rt5640_quirk)]); |
| byt_rt5640_card.long_name = byt_rt5640_long_name; |
| #endif |
| -- |
| 2.30.1 |
| |