Merge "radio: radio-tavarua: Re-org code for workqueue" into msm-3.0
diff --git a/drivers/media/radio/radio-tavarua.c b/drivers/media/radio/radio-tavarua.c
index 5ec2932..288ec6d 100644
--- a/drivers/media/radio/radio-tavarua.c
+++ b/drivers/media/radio/radio-tavarua.c
@@ -92,6 +92,7 @@
/* synchrnous xfr data */
unsigned char sync_xfr_regs[XFR_REG_NUM];
struct completion sync_xfr_start;
+ struct completion shutdown_done;
struct completion sync_req_done;
int tune_req;
/* internal register status */
@@ -1073,6 +1074,15 @@
tavarua_handle_interrupts(radio);
}
+static void fm_shutdown(struct work_struct *work)
+{
+ struct tavarua_device *radio = container_of(work,
+ struct tavarua_device, work.work);
+ radio->pdata->fm_shutdown(radio->pdata);
+ complete(&radio->shutdown_done);
+}
+
+
/*************************************************************************
* irq helper functions
************************************************************************/
@@ -1100,9 +1110,6 @@
* is limited to ten characters; it is only used for generating the "command"
* for the kernel thread(s) (which can be seen in ps or top).
*/
- radio->wqueue = create_singlethread_workqueue("kfmradio");
- if (!radio->wqueue)
- return -ENOMEM;
/* allocate an interrupt line */
/* On success, request_irq() returns 0 if everything goes as
planned. Your interrupt handler will start receiving its
@@ -1156,10 +1163,8 @@
return -EINVAL;
irq = radio->pdata->irq;
disable_irq_wake(irq);
- cancel_delayed_work_sync(&radio->work);
flush_workqueue(radio->wqueue);
free_irq(irq, radio);
- destroy_workqueue(radio->wqueue);
return 0;
}
@@ -1805,6 +1810,7 @@
char buffer[] = {0x00, 0x48, 0x8A, 0x8E, 0x97, 0xB7};
int bahama_present = -ENODEV;
+ INIT_DELAYED_WORK(&radio->work, read_int_stat);
if (!atomic_dec_and_test(&radio->users)) {
pr_err("%s: Device already in use."
"Try again later", __func__);
@@ -2048,11 +2054,15 @@
return retval;
}
+ init_completion(&radio->shutdown_done);
+
bahama_present = is_bahama();
if (bahama_present == -ENODEV)
return -ENODEV;
+ INIT_DELAYED_WORK(&radio->work, fm_shutdown);
+
if (bahama_present) {
/*Write first sequence of bytes to FM_CTL0*/
for (i = 0; i < 1; i++) {
@@ -2131,15 +2141,17 @@
}
exit:
FMDBG("%s, Calling fm_shutdown\n", __func__);
+ queue_delayed_work(radio->wqueue, &radio->work,
+ msecs_to_jiffies(TAVARUA_DELAY/2));
/* teardown gpio and pmic */
-
marimba_set_fm_status(radio->marimba, false);
- radio->pdata->fm_shutdown(radio->pdata);
+ wait_for_completion(&radio->shutdown_done);
if (radio->pdata->config_i2s_gpio != NULL)
radio->pdata->config_i2s_gpio(FM_I2S_OFF);
radio->handle_irq = 1;
atomic_inc(&radio->users);
radio->marimba->mod_id = SLAVE_ID_BAHAMA;
+ flush_workqueue(radio->wqueue);
return retval;
}
@@ -4028,7 +4040,9 @@
video_set_drvdata(radio->videodev, radio);
/*Start the worker thread for event handling and register read_int_stat
as worker function*/
- INIT_DELAYED_WORK(&radio->work, read_int_stat);
+ radio->wqueue = create_singlethread_workqueue("kfmradio");
+ if (!radio->wqueue)
+ return -ENOMEM;
/* register video device */
if (video_register_device(radio->videodev, VFL_TYPE_RADIO, radio_nr)) {
@@ -4068,6 +4082,8 @@
/* disable irq */
tavarua_disable_irq(radio);
+ destroy_workqueue(radio->wqueue);
+
video_unregister_device(radio->videodev);
/* free internal buffers */