diff options
Diffstat (limited to 'sound/soc/uniphier/evea.c')
-rw-r--r-- | sound/soc/uniphier/evea.c | 102 |
1 files changed, 49 insertions, 53 deletions
diff --git a/sound/soc/uniphier/evea.c b/sound/soc/uniphier/evea.c index 0cc9efff1d9a..73fd6730095c 100644 --- a/sound/soc/uniphier/evea.c +++ b/sound/soc/uniphier/evea.c @@ -1,22 +1,8 @@ // SPDX-License-Identifier: GPL-2.0 -/* - * Socionext UniPhier EVEA ADC/DAC codec driver. - * - * Copyright (c) 2016-2017 Socionext Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; version 2 - * of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see <http://www.gnu.org/licenses/>. - */ +// +// Socionext UniPhier EVEA ADC/DAC codec driver. +// +// Copyright (c) 2016-2017 Socionext Inc. #include <linux/clk.h> #include <linux/module.h> @@ -32,6 +18,8 @@ #define AADCPOW(n) (0x0078 + 0x04 * (n)) #define AADCPOW_AADC_POWD BIT(0) +#define ALINSW1 0x0088 +#define ALINSW1_SEL1_SHIFT 3 #define AHPOUTPOW 0x0098 #define AHPOUTPOW_HP_ON BIT(4) #define ALINEPOW 0x009c @@ -220,8 +208,8 @@ static void evea_update_switch_all(struct evea_priv *evea) static int evea_get_switch_lin(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct evea_priv *evea = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct evea_priv *evea = snd_soc_component_get_drvdata(component); ucontrol->value.integer.value[0] = evea->switch_lin; @@ -231,8 +219,8 @@ static int evea_get_switch_lin(struct snd_kcontrol *kcontrol, static int evea_set_switch_lin(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct evea_priv *evea = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct evea_priv *evea = snd_soc_component_get_drvdata(component); if (evea->switch_lin == ucontrol->value.integer.value[0]) return 0; @@ -245,8 +233,8 @@ static int evea_set_switch_lin(struct snd_kcontrol *kcontrol, static int evea_get_switch_lo(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct evea_priv *evea = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct evea_priv *evea = snd_soc_component_get_drvdata(component); ucontrol->value.integer.value[0] = evea->switch_lo; @@ -256,8 +244,8 @@ static int evea_get_switch_lo(struct snd_kcontrol *kcontrol, static int evea_set_switch_lo(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct evea_priv *evea = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct evea_priv *evea = snd_soc_component_get_drvdata(component); if (evea->switch_lo == ucontrol->value.integer.value[0]) return 0; @@ -270,8 +258,8 @@ static int evea_set_switch_lo(struct snd_kcontrol *kcontrol, static int evea_get_switch_hp(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct evea_priv *evea = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct evea_priv *evea = snd_soc_component_get_drvdata(component); ucontrol->value.integer.value[0] = evea->switch_hp; @@ -281,8 +269,8 @@ static int evea_get_switch_hp(struct snd_kcontrol *kcontrol, static int evea_set_switch_hp(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); - struct evea_priv *evea = snd_soc_codec_get_drvdata(codec); + struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); + struct evea_priv *evea = snd_soc_component_get_drvdata(component); if (evea->switch_hp == ucontrol->value.integer.value[0]) return 0; @@ -292,7 +280,16 @@ static int evea_set_switch_hp(struct snd_kcontrol *kcontrol, return evea_update_switch_hp(evea); } -static const struct snd_kcontrol_new eva_controls[] = { +static const char * const linsw1_sel1_text[] = { + "LIN1", "LIN2", "LIN3" +}; + +static SOC_ENUM_SINGLE_DECL(linsw1_sel1_enum, + ALINSW1, ALINSW1_SEL1_SHIFT, + linsw1_sel1_text); + +static const struct snd_kcontrol_new evea_controls[] = { + SOC_ENUM("Line Capture Source", linsw1_sel1_enum), SOC_SINGLE_BOOL_EXT("Line Capture Switch", 0, evea_get_switch_lin, evea_set_switch_lin), SOC_SINGLE_BOOL_EXT("Line Playback Switch", 0, @@ -301,9 +298,9 @@ static const struct snd_kcontrol_new eva_controls[] = { evea_get_switch_hp, evea_set_switch_hp), }; -static int evea_codec_probe(struct snd_soc_codec *codec) +static int evea_codec_probe(struct snd_soc_component *component) { - struct evea_priv *evea = snd_soc_codec_get_drvdata(codec); + struct evea_priv *evea = snd_soc_component_get_drvdata(component); evea->switch_lin = 1; evea->switch_lo = 1; @@ -315,9 +312,9 @@ static int evea_codec_probe(struct snd_soc_codec *codec) return 0; } -static int evea_codec_suspend(struct snd_soc_codec *codec) +static int evea_codec_suspend(struct snd_soc_component *component) { - struct evea_priv *evea = snd_soc_codec_get_drvdata(codec); + struct evea_priv *evea = snd_soc_component_get_drvdata(component); evea_set_power_state_off(evea); @@ -331,9 +328,9 @@ static int evea_codec_suspend(struct snd_soc_codec *codec) return 0; } -static int evea_codec_resume(struct snd_soc_codec *codec) +static int evea_codec_resume(struct snd_soc_component *component) { - struct evea_priv *evea = snd_soc_codec_get_drvdata(codec); + struct evea_priv *evea = snd_soc_component_get_drvdata(component); int ret; ret = clk_prepare_enable(evea->clk); @@ -376,19 +373,20 @@ err_out_clock: return ret; } -static struct snd_soc_codec_driver soc_codec_evea = { - .probe = evea_codec_probe, - .suspend = evea_codec_suspend, - .resume = evea_codec_resume, - - .component_driver = { - .dapm_widgets = evea_widgets, - .num_dapm_widgets = ARRAY_SIZE(evea_widgets), - .dapm_routes = evea_routes, - .num_dapm_routes = ARRAY_SIZE(evea_routes), - .controls = eva_controls, - .num_controls = ARRAY_SIZE(eva_controls), - }, +static struct snd_soc_component_driver soc_codec_evea = { + .probe = evea_codec_probe, + .suspend = evea_codec_suspend, + .resume = evea_codec_resume, + .dapm_widgets = evea_widgets, + .num_dapm_widgets = ARRAY_SIZE(evea_widgets), + .dapm_routes = evea_routes, + .num_dapm_routes = ARRAY_SIZE(evea_routes), + .controls = evea_controls, + .num_controls = ARRAY_SIZE(evea_controls), + .idle_bias_on = 1, + .use_pmdown_time = 1, + .endianness = 1, + .non_legacy_dai_naming = 1, }; static struct snd_soc_dai_driver soc_dai_evea[] = { @@ -505,7 +503,7 @@ static int evea_probe(struct platform_device *pdev) platform_set_drvdata(pdev, evea); - ret = snd_soc_register_codec(&pdev->dev, &soc_codec_evea, + ret = devm_snd_soc_register_component(&pdev->dev, &soc_codec_evea, soc_dai_evea, ARRAY_SIZE(soc_dai_evea)); if (ret) goto err_out_reset_adamv; @@ -534,8 +532,6 @@ static int evea_remove(struct platform_device *pdev) { struct evea_priv *evea = platform_get_drvdata(pdev); - snd_soc_unregister_codec(&pdev->dev); - reset_control_assert(evea->rst_adamv); reset_control_assert(evea->rst_exiv); reset_control_assert(evea->rst); |