diff options
author | Ryan Mallon <rmallon@gmail.com> | 2011-10-03 18:55:40 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2011-10-04 07:03:35 -0400 |
commit | 8754f2263fb0961c6dd26b4b4cbe73a4e632aa62 (patch) | |
tree | a6d4bc7bf396c0e5623d702d134c79855fa3f7a6 /sound/soc/codecs/max98088.c | |
parent | 81204c84ca46604a04ab3d43ccfa1e464e6b1303 (diff) |
ASoC: max98088 codec: Catch driver bugs for eq channel name
Move the EQ channel names to a separate array and iterate over it in
max98088_get_channel rather than duplicating the hardcoded channel
names. Add an error message if an invalid channel is passed and check
the error in the callers.
Also added a BUILD_BUG_ON to ensure that the eq_mode_name and controls
arrays are the same size.
Signed-off-by: Ryan Mallon <rmallon@gmail.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/codecs/max98088.c')
-rw-r--r-- | sound/soc/codecs/max98088.c | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/sound/soc/codecs/max98088.c b/sound/soc/codecs/max98088.c index 587043b6f79f..ebbf63c79c34 100644 --- a/sound/soc/codecs/max98088.c +++ b/sound/soc/codecs/max98088.c | |||
@@ -1696,13 +1696,19 @@ static struct snd_soc_dai_driver max98088_dai[] = { | |||
1696 | } | 1696 | } |
1697 | }; | 1697 | }; |
1698 | 1698 | ||
1699 | static int max98088_get_channel(const char *name) | 1699 | static const char *eq_mode_name[] = {"EQ1 Mode", "EQ2 Mode"}; |
1700 | |||
1701 | static int max98088_get_channel(struct snd_soc_codec *codec, const char *name) | ||
1700 | { | 1702 | { |
1701 | if (strcmp(name, "EQ1 Mode") == 0) | 1703 | int i; |
1702 | return 0; | 1704 | |
1703 | if (strcmp(name, "EQ2 Mode") == 0) | 1705 | for (i = 0; i < ARRAY_SIZE(eq_mode_name); i++) |
1704 | return 1; | 1706 | if (strcmp(name, eq_mode_name[i]) == 0) |
1705 | return -EINVAL; | 1707 | return i; |
1708 | |||
1709 | /* Shouldn't happen */ | ||
1710 | dev_err(codec->dev, "Bad EQ channel name '%s'\n", name); | ||
1711 | return -EINVAL; | ||
1706 | } | 1712 | } |
1707 | 1713 | ||
1708 | static void max98088_setup_eq1(struct snd_soc_codec *codec) | 1714 | static void max98088_setup_eq1(struct snd_soc_codec *codec) |
@@ -1806,10 +1812,13 @@ static int max98088_put_eq_enum(struct snd_kcontrol *kcontrol, | |||
1806 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); | 1812 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); |
1807 | struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); | 1813 | struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); |
1808 | struct max98088_pdata *pdata = max98088->pdata; | 1814 | struct max98088_pdata *pdata = max98088->pdata; |
1809 | int channel = max98088_get_channel(kcontrol->id.name); | 1815 | int channel = max98088_get_channel(codec, kcontrol->id.name); |
1810 | struct max98088_cdata *cdata; | 1816 | struct max98088_cdata *cdata; |
1811 | int sel = ucontrol->value.integer.value[0]; | 1817 | int sel = ucontrol->value.integer.value[0]; |
1812 | 1818 | ||
1819 | if (channel < 0) | ||
1820 | return channel; | ||
1821 | |||
1813 | cdata = &max98088->dai[channel]; | 1822 | cdata = &max98088->dai[channel]; |
1814 | 1823 | ||
1815 | if (sel >= pdata->eq_cfgcnt) | 1824 | if (sel >= pdata->eq_cfgcnt) |
@@ -1834,9 +1843,12 @@ static int max98088_get_eq_enum(struct snd_kcontrol *kcontrol, | |||
1834 | { | 1843 | { |
1835 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); | 1844 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); |
1836 | struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); | 1845 | struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); |
1837 | int channel = max98088_get_channel(kcontrol->id.name); | 1846 | int channel = max98088_get_channel(codec, kcontrol->id.name); |
1838 | struct max98088_cdata *cdata; | 1847 | struct max98088_cdata *cdata; |
1839 | 1848 | ||
1849 | if (channel < 0) | ||
1850 | return channel; | ||
1851 | |||
1840 | cdata = &max98088->dai[channel]; | 1852 | cdata = &max98088->dai[channel]; |
1841 | ucontrol->value.enumerated.item[0] = cdata->eq_sel; | 1853 | ucontrol->value.enumerated.item[0] = cdata->eq_sel; |
1842 | return 0; | 1854 | return 0; |
@@ -1851,17 +1863,17 @@ static void max98088_handle_eq_pdata(struct snd_soc_codec *codec) | |||
1851 | int i, j; | 1863 | int i, j; |
1852 | const char **t; | 1864 | const char **t; |
1853 | int ret; | 1865 | int ret; |
1854 | |||
1855 | struct snd_kcontrol_new controls[] = { | 1866 | struct snd_kcontrol_new controls[] = { |
1856 | SOC_ENUM_EXT("EQ1 Mode", | 1867 | SOC_ENUM_EXT((char *)eq_mode_name[0], |
1857 | max98088->eq_enum, | 1868 | max98088->eq_enum, |
1858 | max98088_get_eq_enum, | 1869 | max98088_get_eq_enum, |
1859 | max98088_put_eq_enum), | 1870 | max98088_put_eq_enum), |
1860 | SOC_ENUM_EXT("EQ2 Mode", | 1871 | SOC_ENUM_EXT((char *)eq_mode_name[1], |
1861 | max98088->eq_enum, | 1872 | max98088->eq_enum, |
1862 | max98088_get_eq_enum, | 1873 | max98088_get_eq_enum, |
1863 | max98088_put_eq_enum), | 1874 | max98088_put_eq_enum), |
1864 | }; | 1875 | }; |
1876 | BUILD_BUG_ON(ARRAY_SIZE(controls) != ARRAY_SIZE(eq_mode_name)); | ||
1865 | 1877 | ||
1866 | cfg = pdata->eq_cfg; | 1878 | cfg = pdata->eq_cfg; |
1867 | cfgcnt = pdata->eq_cfgcnt; | 1879 | cfgcnt = pdata->eq_cfgcnt; |