diff options
author | Per Persson <per.xb.persson@stericsson.com> | 2011-10-19 09:32:01 +0200 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@stericsson.com> | 2012-05-22 11:04:16 +0200 |
commit | 24cba5dcc671bf1ddbdc689072f72af9eef924e3 (patch) | |
tree | 60d00a8d00e81abcbb1314fd0bc8f6261cdbc0f5 | |
parent | 654346981b43fcddfbb80fa1db63af55b8d482d7 (diff) |
video: av8100: free irq when powerdown
irq is requested when chip is powered up and freed when
powered down.
ST-Ericsson ID: 368561
ST-Ericsson Linux next: Not tested
ST-Ericsson FOSS-OUT ID: Trivial
Change-Id: I42145787b15630a7c09a28887f76026b2b9004e0
Signed-off-by: Per Persson <per.xb.persson@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/34495
Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com>
Reviewed-by: Jimmy RUBIN <jimmy.rubin@stericsson.com>
-rw-r--r-- | drivers/video/av8100/av8100.c | 40 |
1 files changed, 20 insertions, 20 deletions
diff --git a/drivers/video/av8100/av8100.c b/drivers/video/av8100/av8100.c index 00995e8d02e..356e0061335 100644 --- a/drivers/video/av8100/av8100.c +++ b/drivers/video/av8100/av8100.c @@ -191,6 +191,7 @@ struct av8100_params { bool regulator_requested; bool pre_suspend_power; bool ints_enabled; + bool irq_requested; }; /** @@ -1076,6 +1077,8 @@ static int av8100_params_init(struct av8100_device *adev) { dev_dbg(adev->dev, "%s\n", __func__); + memset(&adev->params, 0, sizeof(struct av8100_params)); + adev->params.denc_off_time = AV8100_DENC_OFF_TIME; adev->params.hdmi_off_time = AV8100_HDMI_OFF_TIME; adev->params.on_time = AV8100_ON_TIME; @@ -1086,12 +1089,6 @@ static int av8100_params_init(struct av8100_device *adev) adev->params.cecm = AV8100_GENERAL_INTERRUPT_MASK_CECM_HIGH; adev->params.uovbm = AV8100_GENERAL_INTERRUPT_MASK_UOVBM_HIGH; - adev->params.plug_state = AV8100_UNPLUGGED; - adev->params.inputclk = NULL; - adev->params.inputclk_requested = false; - adev->params.opp_requested = false; - adev->params.regulator_requested = false; - return 0; } @@ -2053,7 +2050,15 @@ static int av8100_powerup1(struct av8100_device *adev) break; } - return 0; + retval = request_irq(pdata->irq, av8100_intr_handler, + IRQF_TRIGGER_RISING, "av8100", adev); + if (retval == 0) + adev->params.irq_requested = true; + else + dev_err(adev->dev, "request_irq %d failed %d\n", + pdata->irq, retval); + + return retval; av8100_powerup1_err: av8100_powerdown(); @@ -2231,6 +2236,10 @@ int av8100_powerdown(void) av8100_disable_interrupt(); + if (adev->params.irq_requested) + free_irq(pdata->irq, adev); + adev->params.irq_requested = false; + if (pdata->alt_powerupseq) { retval = av8100_reg_stby_pend_int_w( AV8100_STANDBY_PENDING_INTERRUPT_HPDI_LOW, @@ -2258,6 +2267,10 @@ int av8100_powerdown(void) adev->params.inputclk_requested = false; } + av8100_set_state(adev, AV8100_OPMODE_SHUTDOWN); + + gpio_set_value_cansleep(pdata->reset, 0); + /* Regulator disable */ if ((adev->params.regulator_pwr) && (adev->params.regulator_requested)) { @@ -2266,13 +2279,9 @@ int av8100_powerdown(void) adev->params.regulator_requested = false; } - gpio_set_value_cansleep(pdata->reset, 0); - if (pdata->alt_powerupseq) mdelay(AV8100_WAITTIME_5MS); - av8100_set_state(adev, AV8100_OPMODE_SHUTDOWN); - av8100_powerdown_end: return retval; } @@ -4064,15 +4073,6 @@ static int __devinit av8100_probe(struct i2c_client *i2c_client, kthread_run(av8100_thread, adev, "av8100_thread"); - ret = request_irq(pdata->irq, av8100_intr_handler, - IRQF_TRIGGER_RISING, "av8100", adev); - if (ret) { - dev_err(dev, "av8100_hw request_irq %d failed %d\n", - pdata->irq, ret); - gpio_free(pdata->irq); - goto err; - } - /* Get regulator resource */ if (pdata->regulator_pwr_id) { adev->params.regulator_pwr = regulator_get(dev, |