aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/codecs/wm8994.c
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2011-08-15 23:01:27 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2011-08-16 11:49:03 -0400
commitf0b182b003e22320efac5a33cacc460e0079c135 (patch)
treecc251a0cc1ce1b5399f485b82b14eb0808c09570 /sound/soc/codecs/wm8994.c
parent1ddc07d0f13a753f8e345e0538562e1899d2bc26 (diff)
ASoC: Implement WM8994 thermal warning and shutdown interrupt support
ALSA doesn't really have good mechanisms for dealing with these so we just log them - the hardware already has automatic shutdown support. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/codecs/wm8994.c')
-rw-r--r--sound/soc/codecs/wm8994.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c
index a0d6274ec280..94124913bb3e 100644
--- a/sound/soc/codecs/wm8994.c
+++ b/sound/soc/codecs/wm8994.c
@@ -3045,6 +3045,24 @@ static irqreturn_t wm8994_fifo_error(int irq, void *data)
3045 return IRQ_HANDLED; 3045 return IRQ_HANDLED;
3046} 3046}
3047 3047
3048static irqreturn_t wm8994_temp_warn(int irq, void *data)
3049{
3050 struct snd_soc_codec *codec = data;
3051
3052 dev_err(codec->dev, "Thermal warning\n");
3053
3054 return IRQ_HANDLED;
3055}
3056
3057static irqreturn_t wm8994_temp_shut(int irq, void *data)
3058{
3059 struct snd_soc_codec *codec = data;
3060
3061 dev_crit(codec->dev, "Thermal shutdown\n");
3062
3063 return IRQ_HANDLED;
3064}
3065
3048static int wm8994_codec_probe(struct snd_soc_codec *codec) 3066static int wm8994_codec_probe(struct snd_soc_codec *codec)
3049{ 3067{
3050 struct wm8994 *control; 3068 struct wm8994 *control;
@@ -3123,6 +3141,10 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)
3123 3141
3124 wm8994_request_irq(codec->control_data, WM8994_IRQ_FIFOS_ERR, 3142 wm8994_request_irq(codec->control_data, WM8994_IRQ_FIFOS_ERR,
3125 wm8994_fifo_error, "FIFO error", codec); 3143 wm8994_fifo_error, "FIFO error", codec);
3144 wm8994_request_irq(wm8994->wm8994, WM8994_IRQ_TEMP_WARN,
3145 wm8994_temp_warn, "Thermal warning", codec);
3146 wm8994_request_irq(wm8994->wm8994, WM8994_IRQ_TEMP_SHUT,
3147 wm8994_temp_shut, "Thermal shutdown", codec);
3126 3148
3127 ret = wm8994_request_irq(codec->control_data, WM8994_IRQ_DCS_DONE, 3149 ret = wm8994_request_irq(codec->control_data, WM8994_IRQ_DCS_DONE,
3128 wm_hubs_dcs_done, "DC servo done", 3150 wm_hubs_dcs_done, "DC servo done",
@@ -3387,6 +3409,8 @@ err_irq:
3387 wm8994_free_irq(codec->control_data, WM8994_IRQ_DCS_DONE, 3409 wm8994_free_irq(codec->control_data, WM8994_IRQ_DCS_DONE,
3388 &wm8994->hubs); 3410 &wm8994->hubs);
3389 wm8994_free_irq(codec->control_data, WM8994_IRQ_FIFOS_ERR, codec); 3411 wm8994_free_irq(codec->control_data, WM8994_IRQ_FIFOS_ERR, codec);
3412 wm8994_free_irq(codec->control_data, WM8994_IRQ_TEMP_SHUT, codec);
3413 wm8994_free_irq(codec->control_data, WM8994_IRQ_TEMP_WARN, codec);
3390err: 3414err:
3391 kfree(wm8994); 3415 kfree(wm8994);
3392 return ret; 3416 return ret;
@@ -3409,6 +3433,8 @@ static int wm8994_codec_remove(struct snd_soc_codec *codec)
3409 wm8994_free_irq(codec->control_data, WM8994_IRQ_DCS_DONE, 3433 wm8994_free_irq(codec->control_data, WM8994_IRQ_DCS_DONE,
3410 &wm8994->hubs); 3434 &wm8994->hubs);
3411 wm8994_free_irq(codec->control_data, WM8994_IRQ_FIFOS_ERR, codec); 3435 wm8994_free_irq(codec->control_data, WM8994_IRQ_FIFOS_ERR, codec);
3436 wm8994_free_irq(codec->control_data, WM8994_IRQ_TEMP_SHUT, codec);
3437 wm8994_free_irq(codec->control_data, WM8994_IRQ_TEMP_WARN, codec);
3412 3438
3413 switch (control->type) { 3439 switch (control->type) {
3414 case WM8994: 3440 case WM8994: