aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/codecs/wm5100.c
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2012-01-18 09:53:08 -0500
committerMark Brown <broonie@opensource.wolfsonmicro.com>2012-01-20 08:58:32 -0500
commit46c1a877c6fc29519760a3aaedf807332cd8a781 (patch)
tree75dfeecaa3521e1f2f6f4199d9ed3be38402e7d9 /sound/soc/codecs/wm5100.c
parent218240e27f89b477564a638ff77d45147e42a8fd (diff)
ASoC: Make WM5100 interrupt path use regmap directly
This will allow us to move the interrupt allocation out of the ASoC part of the driver and simplifies the locking by removing any reliance in the bulk of the interrupt path on the big CODEC lock. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/codecs/wm5100.c')
-rw-r--r--sound/soc/codecs/wm5100.c188
1 files changed, 108 insertions, 80 deletions
diff --git a/sound/soc/codecs/wm5100.c b/sound/soc/codecs/wm5100.c
index 8ea2089f7aa1..4b2c724ed9b5 100644
--- a/sound/soc/codecs/wm5100.c
+++ b/sound/soc/codecs/wm5100.c
@@ -50,6 +50,7 @@ struct wm5100_fll {
50 50
51/* codec private data */ 51/* codec private data */
52struct wm5100_priv { 52struct wm5100_priv {
53 struct device *dev;
53 struct regmap *regmap; 54 struct regmap *regmap;
54 struct snd_soc_codec *codec; 55 struct snd_soc_codec *codec;
55 56
@@ -855,48 +856,48 @@ static int wm5100_dbvdd_ev(struct snd_soc_dapm_widget *w,
855 } 856 }
856} 857}
857 858
858static void wm5100_log_status3(struct snd_soc_codec *codec, int val) 859static void wm5100_log_status3(struct wm5100_priv *wm5100, int val)
859{ 860{
860 if (val & WM5100_SPK_SHUTDOWN_WARN_EINT) 861 if (val & WM5100_SPK_SHUTDOWN_WARN_EINT)
861 dev_crit(codec->dev, "Speaker shutdown warning\n"); 862 dev_crit(wm5100->dev, "Speaker shutdown warning\n");
862 if (val & WM5100_SPK_SHUTDOWN_EINT) 863 if (val & WM5100_SPK_SHUTDOWN_EINT)
863 dev_crit(codec->dev, "Speaker shutdown\n"); 864 dev_crit(wm5100->dev, "Speaker shutdown\n");
864 if (val & WM5100_CLKGEN_ERR_EINT) 865 if (val & WM5100_CLKGEN_ERR_EINT)
865 dev_crit(codec->dev, "SYSCLK underclocked\n"); 866 dev_crit(wm5100->dev, "SYSCLK underclocked\n");
866 if (val & WM5100_CLKGEN_ERR_ASYNC_EINT) 867 if (val & WM5100_CLKGEN_ERR_ASYNC_EINT)
867 dev_crit(codec->dev, "ASYNCCLK underclocked\n"); 868 dev_crit(wm5100->dev, "ASYNCCLK underclocked\n");
868} 869}
869 870
870static void wm5100_log_status4(struct snd_soc_codec *codec, int val) 871static void wm5100_log_status4(struct wm5100_priv *wm5100, int val)
871{ 872{
872 if (val & WM5100_AIF3_ERR_EINT) 873 if (val & WM5100_AIF3_ERR_EINT)
873 dev_err(codec->dev, "AIF3 configuration error\n"); 874 dev_err(wm5100->dev, "AIF3 configuration error\n");
874 if (val & WM5100_AIF2_ERR_EINT) 875 if (val & WM5100_AIF2_ERR_EINT)
875 dev_err(codec->dev, "AIF2 configuration error\n"); 876 dev_err(wm5100->dev, "AIF2 configuration error\n");
876 if (val & WM5100_AIF1_ERR_EINT) 877 if (val & WM5100_AIF1_ERR_EINT)
877 dev_err(codec->dev, "AIF1 configuration error\n"); 878 dev_err(wm5100->dev, "AIF1 configuration error\n");
878 if (val & WM5100_CTRLIF_ERR_EINT) 879 if (val & WM5100_CTRLIF_ERR_EINT)
879 dev_err(codec->dev, "Control interface error\n"); 880 dev_err(wm5100->dev, "Control interface error\n");
880 if (val & WM5100_ISRC2_UNDERCLOCKED_EINT) 881 if (val & WM5100_ISRC2_UNDERCLOCKED_EINT)
881 dev_err(codec->dev, "ISRC2 underclocked\n"); 882 dev_err(wm5100->dev, "ISRC2 underclocked\n");
882 if (val & WM5100_ISRC1_UNDERCLOCKED_EINT) 883 if (val & WM5100_ISRC1_UNDERCLOCKED_EINT)
883 dev_err(codec->dev, "ISRC1 underclocked\n"); 884 dev_err(wm5100->dev, "ISRC1 underclocked\n");
884 if (val & WM5100_FX_UNDERCLOCKED_EINT) 885 if (val & WM5100_FX_UNDERCLOCKED_EINT)
885 dev_err(codec->dev, "FX underclocked\n"); 886 dev_err(wm5100->dev, "FX underclocked\n");
886 if (val & WM5100_AIF3_UNDERCLOCKED_EINT) 887 if (val & WM5100_AIF3_UNDERCLOCKED_EINT)
887 dev_err(codec->dev, "AIF3 underclocked\n"); 888 dev_err(wm5100->dev, "AIF3 underclocked\n");
888 if (val & WM5100_AIF2_UNDERCLOCKED_EINT) 889 if (val & WM5100_AIF2_UNDERCLOCKED_EINT)
889 dev_err(codec->dev, "AIF2 underclocked\n"); 890 dev_err(wm5100->dev, "AIF2 underclocked\n");
890 if (val & WM5100_AIF1_UNDERCLOCKED_EINT) 891 if (val & WM5100_AIF1_UNDERCLOCKED_EINT)
891 dev_err(codec->dev, "AIF1 underclocked\n"); 892 dev_err(wm5100->dev, "AIF1 underclocked\n");
892 if (val & WM5100_ASRC_UNDERCLOCKED_EINT) 893 if (val & WM5100_ASRC_UNDERCLOCKED_EINT)
893 dev_err(codec->dev, "ASRC underclocked\n"); 894 dev_err(wm5100->dev, "ASRC underclocked\n");
894 if (val & WM5100_DAC_UNDERCLOCKED_EINT) 895 if (val & WM5100_DAC_UNDERCLOCKED_EINT)
895 dev_err(codec->dev, "DAC underclocked\n"); 896 dev_err(wm5100->dev, "DAC underclocked\n");
896 if (val & WM5100_ADC_UNDERCLOCKED_EINT) 897 if (val & WM5100_ADC_UNDERCLOCKED_EINT)
897 dev_err(codec->dev, "ADC underclocked\n"); 898 dev_err(wm5100->dev, "ADC underclocked\n");
898 if (val & WM5100_MIXER_UNDERCLOCKED_EINT) 899 if (val & WM5100_MIXER_UNDERCLOCKED_EINT)
899 dev_err(codec->dev, "Mixer underclocked\n"); 900 dev_err(wm5100->dev, "Mixer underclocked\n");
900} 901}
901 902
902static int wm5100_post_ev(struct snd_soc_dapm_widget *w, 903static int wm5100_post_ev(struct snd_soc_dapm_widget *w,
@@ -904,16 +905,17 @@ static int wm5100_post_ev(struct snd_soc_dapm_widget *w,
904 int event) 905 int event)
905{ 906{
906 struct snd_soc_codec *codec = w->codec; 907 struct snd_soc_codec *codec = w->codec;
908 struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec);
907 int ret; 909 int ret;
908 910
909 ret = snd_soc_read(codec, WM5100_INTERRUPT_RAW_STATUS_3); 911 ret = snd_soc_read(codec, WM5100_INTERRUPT_RAW_STATUS_3);
910 ret &= WM5100_SPK_SHUTDOWN_WARN_STS | 912 ret &= WM5100_SPK_SHUTDOWN_WARN_STS |
911 WM5100_SPK_SHUTDOWN_STS | WM5100_CLKGEN_ERR_STS | 913 WM5100_SPK_SHUTDOWN_STS | WM5100_CLKGEN_ERR_STS |
912 WM5100_CLKGEN_ERR_ASYNC_STS; 914 WM5100_CLKGEN_ERR_ASYNC_STS;
913 wm5100_log_status3(codec, ret); 915 wm5100_log_status3(wm5100, ret);
914 916
915 ret = snd_soc_read(codec, WM5100_INTERRUPT_RAW_STATUS_4); 917 ret = snd_soc_read(codec, WM5100_INTERRUPT_RAW_STATUS_4);
916 wm5100_log_status4(codec, ret); 918 wm5100_log_status4(wm5100, ret);
917 919
918 return 0; 920 return 0;
919} 921}
@@ -2123,55 +2125,59 @@ static int wm5100_dig_vu[] = {
2123 WM5100_DAC_DIGITAL_VOLUME_6R, 2125 WM5100_DAC_DIGITAL_VOLUME_6R,
2124}; 2126};
2125 2127
2126static void wm5100_set_detect_mode(struct snd_soc_codec *codec, int the_mode) 2128static void wm5100_set_detect_mode(struct wm5100_priv *wm5100, int the_mode)
2127{ 2129{
2128 struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec);
2129 struct wm5100_jack_mode *mode = &wm5100->pdata.jack_modes[the_mode]; 2130 struct wm5100_jack_mode *mode = &wm5100->pdata.jack_modes[the_mode];
2130 2131
2131 BUG_ON(the_mode >= ARRAY_SIZE(wm5100->pdata.jack_modes)); 2132 BUG_ON(the_mode >= ARRAY_SIZE(wm5100->pdata.jack_modes));
2132 2133
2133 gpio_set_value_cansleep(wm5100->pdata.hp_pol, mode->hp_pol); 2134 gpio_set_value_cansleep(wm5100->pdata.hp_pol, mode->hp_pol);
2134 snd_soc_update_bits(codec, WM5100_ACCESSORY_DETECT_MODE_1, 2135 regmap_update_bits(wm5100->regmap, WM5100_ACCESSORY_DETECT_MODE_1,
2135 WM5100_ACCDET_BIAS_SRC_MASK | 2136 WM5100_ACCDET_BIAS_SRC_MASK |
2136 WM5100_ACCDET_SRC, 2137 WM5100_ACCDET_SRC,
2137 (mode->bias << WM5100_ACCDET_BIAS_SRC_SHIFT) | 2138 (mode->bias << WM5100_ACCDET_BIAS_SRC_SHIFT) |
2138 mode->micd_src << WM5100_ACCDET_SRC_SHIFT); 2139 mode->micd_src << WM5100_ACCDET_SRC_SHIFT);
2139 snd_soc_update_bits(codec, WM5100_MISC_CONTROL, 2140 regmap_update_bits(wm5100->regmap, WM5100_MISC_CONTROL,
2140 WM5100_HPCOM_SRC, 2141 WM5100_HPCOM_SRC,
2141 mode->micd_src << WM5100_HPCOM_SRC_SHIFT); 2142 mode->micd_src << WM5100_HPCOM_SRC_SHIFT);
2142 2143
2143 wm5100->jack_mode = the_mode; 2144 wm5100->jack_mode = the_mode;
2144 2145
2145 dev_dbg(codec->dev, "Set microphone polarity to %d\n", 2146 dev_dbg(wm5100->dev, "Set microphone polarity to %d\n",
2146 wm5100->jack_mode); 2147 wm5100->jack_mode);
2147} 2148}
2148 2149
2149static void wm5100_micd_irq(struct snd_soc_codec *codec) 2150static void wm5100_micd_irq(struct wm5100_priv *wm5100)
2150{ 2151{
2151 struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec); 2152 unsigned int val;
2152 int val; 2153 int ret;
2153 2154
2154 val = snd_soc_read(codec, WM5100_MIC_DETECT_3); 2155 ret = regmap_read(wm5100->regmap, WM5100_MIC_DETECT_3, &val);
2156 if (ret != 0) {
2157 dev_err(wm5100->dev, "Failed to read micropone status: %d\n",
2158 ret);
2159 return;
2160 }
2155 2161
2156 dev_dbg(codec->dev, "Microphone event: %x\n", val); 2162 dev_dbg(wm5100->dev, "Microphone event: %x\n", val);
2157 2163
2158 if (!(val & WM5100_ACCDET_VALID)) { 2164 if (!(val & WM5100_ACCDET_VALID)) {
2159 dev_warn(codec->dev, "Microphone detection state invalid\n"); 2165 dev_warn(wm5100->dev, "Microphone detection state invalid\n");
2160 return; 2166 return;
2161 } 2167 }
2162 2168
2163 /* No accessory, reset everything and report removal */ 2169 /* No accessory, reset everything and report removal */
2164 if (!(val & WM5100_ACCDET_STS)) { 2170 if (!(val & WM5100_ACCDET_STS)) {
2165 dev_dbg(codec->dev, "Jack removal detected\n"); 2171 dev_dbg(wm5100->dev, "Jack removal detected\n");
2166 wm5100->jack_mic = false; 2172 wm5100->jack_mic = false;
2167 wm5100->jack_detecting = true; 2173 wm5100->jack_detecting = true;
2168 snd_soc_jack_report(wm5100->jack, 0, 2174 snd_soc_jack_report(wm5100->jack, 0,
2169 SND_JACK_LINEOUT | SND_JACK_HEADSET | 2175 SND_JACK_LINEOUT | SND_JACK_HEADSET |
2170 SND_JACK_BTN_0); 2176 SND_JACK_BTN_0);
2171 2177
2172 snd_soc_update_bits(codec, WM5100_MIC_DETECT_1, 2178 regmap_update_bits(wm5100->regmap, WM5100_MIC_DETECT_1,
2173 WM5100_ACCDET_RATE_MASK, 2179 WM5100_ACCDET_RATE_MASK,
2174 WM5100_ACCDET_RATE_MASK); 2180 WM5100_ACCDET_RATE_MASK);
2175 return; 2181 return;
2176 } 2182 }
2177 2183
@@ -2181,7 +2187,7 @@ static void wm5100_micd_irq(struct snd_soc_codec *codec)
2181 */ 2187 */
2182 if (val & 0x400) { 2188 if (val & 0x400) {
2183 if (wm5100->jack_detecting) { 2189 if (wm5100->jack_detecting) {
2184 dev_dbg(codec->dev, "Microphone detected\n"); 2190 dev_dbg(wm5100->dev, "Microphone detected\n");
2185 wm5100->jack_mic = true; 2191 wm5100->jack_mic = true;
2186 snd_soc_jack_report(wm5100->jack, 2192 snd_soc_jack_report(wm5100->jack,
2187 SND_JACK_HEADSET, 2193 SND_JACK_HEADSET,
@@ -2189,11 +2195,11 @@ static void wm5100_micd_irq(struct snd_soc_codec *codec)
2189 2195
2190 /* Increase poll rate to give better responsiveness 2196 /* Increase poll rate to give better responsiveness
2191 * for buttons */ 2197 * for buttons */
2192 snd_soc_update_bits(codec, WM5100_MIC_DETECT_1, 2198 regmap_update_bits(wm5100->regmap, WM5100_MIC_DETECT_1,
2193 WM5100_ACCDET_RATE_MASK, 2199 WM5100_ACCDET_RATE_MASK,
2194 5 << WM5100_ACCDET_RATE_SHIFT); 2200 5 << WM5100_ACCDET_RATE_SHIFT);
2195 } else { 2201 } else {
2196 dev_dbg(codec->dev, "Mic button up\n"); 2202 dev_dbg(wm5100->dev, "Mic button up\n");
2197 snd_soc_jack_report(wm5100->jack, 0, SND_JACK_BTN_0); 2203 snd_soc_jack_report(wm5100->jack, 0, SND_JACK_BTN_0);
2198 } 2204 }
2199 2205
@@ -2206,7 +2212,7 @@ static void wm5100_micd_irq(struct snd_soc_codec *codec)
2206 * plain headphones. 2212 * plain headphones.
2207 */ 2213 */
2208 if (wm5100->jack_detecting && (val & 0x3f8)) { 2214 if (wm5100->jack_detecting && (val & 0x3f8)) {
2209 wm5100_set_detect_mode(codec, !wm5100->jack_mode); 2215 wm5100_set_detect_mode(wm5100, !wm5100->jack_mode);
2210 2216
2211 return; 2217 return;
2212 } 2218 }
@@ -2216,20 +2222,20 @@ static void wm5100_micd_irq(struct snd_soc_codec *codec)
2216 */ 2222 */
2217 if (val & 0x3fc) { 2223 if (val & 0x3fc) {
2218 if (wm5100->jack_mic) { 2224 if (wm5100->jack_mic) {
2219 dev_dbg(codec->dev, "Mic button detected\n"); 2225 dev_dbg(wm5100->dev, "Mic button detected\n");
2220 snd_soc_jack_report(wm5100->jack, SND_JACK_BTN_0, 2226 snd_soc_jack_report(wm5100->jack, SND_JACK_BTN_0,
2221 SND_JACK_BTN_0); 2227 SND_JACK_BTN_0);
2222 } else if (wm5100->jack_detecting) { 2228 } else if (wm5100->jack_detecting) {
2223 dev_dbg(codec->dev, "Headphone detected\n"); 2229 dev_dbg(wm5100->dev, "Headphone detected\n");
2224 snd_soc_jack_report(wm5100->jack, SND_JACK_HEADPHONE, 2230 snd_soc_jack_report(wm5100->jack, SND_JACK_HEADPHONE,
2225 SND_JACK_HEADPHONE); 2231 SND_JACK_HEADPHONE);
2226 2232
2227 /* Increase the detection rate a bit for 2233 /* Increase the detection rate a bit for
2228 * responsiveness. 2234 * responsiveness.
2229 */ 2235 */
2230 snd_soc_update_bits(codec, WM5100_MIC_DETECT_1, 2236 regmap_update_bits(wm5100->regmap, WM5100_MIC_DETECT_1,
2231 WM5100_ACCDET_RATE_MASK, 2237 WM5100_ACCDET_RATE_MASK,
2232 7 << WM5100_ACCDET_RATE_SHIFT); 2238 7 << WM5100_ACCDET_RATE_SHIFT);
2233 } 2239 }
2234 } 2240 }
2235} 2241}
@@ -2242,7 +2248,7 @@ int wm5100_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack)
2242 wm5100->jack = jack; 2248 wm5100->jack = jack;
2243 wm5100->jack_detecting = true; 2249 wm5100->jack_detecting = true;
2244 2250
2245 wm5100_set_detect_mode(codec, 0); 2251 wm5100_set_detect_mode(wm5100, 0);
2246 2252
2247 /* Slowest detection rate, gives debounce for initial 2253 /* Slowest detection rate, gives debounce for initial
2248 * detection */ 2254 * detection */
@@ -2281,52 +2287,70 @@ int wm5100_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack)
2281 2287
2282static irqreturn_t wm5100_irq(int irq, void *data) 2288static irqreturn_t wm5100_irq(int irq, void *data)
2283{ 2289{
2284 struct snd_soc_codec *codec = data; 2290 struct wm5100_priv *wm5100 = data;
2285 struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec);
2286 irqreturn_t status = IRQ_NONE; 2291 irqreturn_t status = IRQ_NONE;
2287 int irq_val; 2292 unsigned int irq_val, mask_val;
2293 int ret;
2288 2294
2289 irq_val = snd_soc_read(codec, WM5100_INTERRUPT_STATUS_3); 2295 ret = regmap_read(wm5100->regmap, WM5100_INTERRUPT_STATUS_3, &irq_val);
2290 if (irq_val < 0) { 2296 if (ret < 0) {
2291 dev_err(codec->dev, "Failed to read IRQ status 3: %d\n", 2297 dev_err(wm5100->dev, "Failed to read IRQ status 3: %d\n",
2292 irq_val); 2298 ret);
2293 irq_val = 0; 2299 irq_val = 0;
2294 } 2300 }
2295 irq_val &= ~snd_soc_read(codec, WM5100_INTERRUPT_STATUS_3_MASK);
2296 2301
2297 snd_soc_write(codec, WM5100_INTERRUPT_STATUS_3, irq_val); 2302 ret = regmap_read(wm5100->regmap, WM5100_INTERRUPT_STATUS_3_MASK,
2303 &mask_val);
2304 if (ret < 0) {
2305 dev_err(wm5100->dev, "Failed to read IRQ mask 3: %d\n",
2306 ret);
2307 mask_val = 0xffff;
2308 }
2309
2310 irq_val &= ~mask_val;
2311
2312 regmap_write(wm5100->regmap, WM5100_INTERRUPT_STATUS_3, irq_val);
2298 2313
2299 if (irq_val) 2314 if (irq_val)
2300 status = IRQ_HANDLED; 2315 status = IRQ_HANDLED;
2301 2316
2302 wm5100_log_status3(codec, irq_val); 2317 wm5100_log_status3(wm5100, irq_val);
2303 2318
2304 if (irq_val & WM5100_FLL1_LOCK_EINT) { 2319 if (irq_val & WM5100_FLL1_LOCK_EINT) {
2305 dev_dbg(codec->dev, "FLL1 locked\n"); 2320 dev_dbg(wm5100->dev, "FLL1 locked\n");
2306 complete(&wm5100->fll[0].lock); 2321 complete(&wm5100->fll[0].lock);
2307 } 2322 }
2308 if (irq_val & WM5100_FLL2_LOCK_EINT) { 2323 if (irq_val & WM5100_FLL2_LOCK_EINT) {
2309 dev_dbg(codec->dev, "FLL2 locked\n"); 2324 dev_dbg(wm5100->dev, "FLL2 locked\n");
2310 complete(&wm5100->fll[1].lock); 2325 complete(&wm5100->fll[1].lock);
2311 } 2326 }
2312 2327
2313 if (irq_val & WM5100_ACCDET_EINT) 2328 if (irq_val & WM5100_ACCDET_EINT)
2314 wm5100_micd_irq(codec); 2329 wm5100_micd_irq(wm5100);
2315 2330
2316 irq_val = snd_soc_read(codec, WM5100_INTERRUPT_STATUS_4); 2331 ret = regmap_read(wm5100->regmap, WM5100_INTERRUPT_STATUS_4, &irq_val);
2317 if (irq_val < 0) { 2332 if (ret < 0) {
2318 dev_err(codec->dev, "Failed to read IRQ status 4: %d\n", 2333 dev_err(wm5100->dev, "Failed to read IRQ status 4: %d\n",
2319 irq_val); 2334 ret);
2320 irq_val = 0; 2335 irq_val = 0;
2321 } 2336 }
2322 irq_val &= ~snd_soc_read(codec, WM5100_INTERRUPT_STATUS_4_MASK); 2337
2338 ret = regmap_read(wm5100->regmap, WM5100_INTERRUPT_STATUS_4_MASK,
2339 &mask_val);
2340 if (ret < 0) {
2341 dev_err(wm5100->dev, "Failed to read IRQ mask 4: %d\n",
2342 ret);
2343 mask_val = 0xffff;
2344 }
2345
2346 irq_val &= ~mask_val;
2323 2347
2324 if (irq_val) 2348 if (irq_val)
2325 status = IRQ_HANDLED; 2349 status = IRQ_HANDLED;
2326 2350
2327 snd_soc_write(codec, WM5100_INTERRUPT_STATUS_4, irq_val); 2351 regmap_write(wm5100->regmap, WM5100_INTERRUPT_STATUS_4, irq_val);
2328 2352
2329 wm5100_log_status4(codec, irq_val); 2353 wm5100_log_status4(wm5100, irq_val);
2330 2354
2331 return status; 2355 return status;
2332} 2356}
@@ -2485,11 +2509,12 @@ static int wm5100_probe(struct snd_soc_codec *codec)
2485 2509
2486 if (irq_flags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)) 2510 if (irq_flags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING))
2487 ret = request_threaded_irq(i2c->irq, NULL, 2511 ret = request_threaded_irq(i2c->irq, NULL,
2488 wm5100_edge_irq, 2512 wm5100_edge_irq, irq_flags,
2489 irq_flags, "wm5100", codec); 2513 "wm5100", wm5100);
2490 else 2514 else
2491 ret = request_threaded_irq(i2c->irq, NULL, wm5100_irq, 2515 ret = request_threaded_irq(i2c->irq, NULL, wm5100_irq,
2492 irq_flags, "wm5100", codec); 2516 irq_flags, "wm5100",
2517 wm5100);
2493 2518
2494 if (ret != 0) { 2519 if (ret != 0) {
2495 dev_err(codec->dev, "Failed to request IRQ %d: %d\n", 2520 dev_err(codec->dev, "Failed to request IRQ %d: %d\n",
@@ -2552,7 +2577,7 @@ static int wm5100_probe(struct snd_soc_codec *codec)
2552 2577
2553err_gpio: 2578err_gpio:
2554 if (i2c->irq) 2579 if (i2c->irq)
2555 free_irq(i2c->irq, codec); 2580 free_irq(i2c->irq, wm5100);
2556 2581
2557 return ret; 2582 return ret;
2558} 2583}
@@ -2566,7 +2591,8 @@ static int wm5100_remove(struct snd_soc_codec *codec)
2566 gpio_free(wm5100->pdata.hp_pol); 2591 gpio_free(wm5100->pdata.hp_pol);
2567 } 2592 }
2568 if (i2c->irq) 2593 if (i2c->irq)
2569 free_irq(i2c->irq, codec); 2594 free_irq(i2c->irq, wm5100);
2595
2570 return 0; 2596 return 0;
2571} 2597}
2572 2598
@@ -2622,6 +2648,8 @@ static __devinit int wm5100_i2c_probe(struct i2c_client *i2c,
2622 if (wm5100 == NULL) 2648 if (wm5100 == NULL)
2623 return -ENOMEM; 2649 return -ENOMEM;
2624 2650
2651 wm5100->dev = &i2c->dev;
2652
2625 wm5100->regmap = regmap_init_i2c(i2c, &wm5100_regmap); 2653 wm5100->regmap = regmap_init_i2c(i2c, &wm5100_regmap);
2626 if (IS_ERR(wm5100->regmap)) { 2654 if (IS_ERR(wm5100->regmap)) {
2627 ret = PTR_ERR(wm5100->regmap); 2655 ret = PTR_ERR(wm5100->regmap);