Commit 474fdc08 authored by Joonyoung Shim's avatar Joonyoung Shim Committed by Mauro Carvalho Chehab

[media] radio-si470x: convert to use request_threaded_irq()

Signed-off-by: default avatarJoonyoung Shim <jy0922.shim@samsung.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 949cf31c
...@@ -262,12 +262,11 @@ int si470x_vidioc_querycap(struct file *file, void *priv, ...@@ -262,12 +262,11 @@ int si470x_vidioc_querycap(struct file *file, void *priv,
**************************************************************************/ **************************************************************************/
/* /*
* si470x_i2c_interrupt_work - rds processing function * si470x_i2c_interrupt - interrupt handler
*/ */
static void si470x_i2c_interrupt_work(struct work_struct *work) static irqreturn_t si470x_i2c_interrupt(int irq, void *dev_id)
{ {
struct si470x_device *radio = container_of(work, struct si470x_device *radio = dev_id;
struct si470x_device, radio_work);
unsigned char regnr; unsigned char regnr;
unsigned char blocknum; unsigned char blocknum;
unsigned short bler; /* rds block errors */ unsigned short bler; /* rds block errors */
...@@ -278,26 +277,26 @@ static void si470x_i2c_interrupt_work(struct work_struct *work) ...@@ -278,26 +277,26 @@ static void si470x_i2c_interrupt_work(struct work_struct *work)
/* check Seek/Tune Complete */ /* check Seek/Tune Complete */
retval = si470x_get_register(radio, STATUSRSSI); retval = si470x_get_register(radio, STATUSRSSI);
if (retval < 0) if (retval < 0)
return; goto end;
if (radio->registers[STATUSRSSI] & STATUSRSSI_STC) if (radio->registers[STATUSRSSI] & STATUSRSSI_STC)
complete(&radio->completion); complete(&radio->completion);
/* safety checks */ /* safety checks */
if ((radio->registers[SYSCONFIG1] & SYSCONFIG1_RDS) == 0) if ((radio->registers[SYSCONFIG1] & SYSCONFIG1_RDS) == 0)
return; goto end;
/* Update RDS registers */ /* Update RDS registers */
for (regnr = 1; regnr < RDS_REGISTER_NUM; regnr++) { for (regnr = 1; regnr < RDS_REGISTER_NUM; regnr++) {
retval = si470x_get_register(radio, STATUSRSSI + regnr); retval = si470x_get_register(radio, STATUSRSSI + regnr);
if (retval < 0) if (retval < 0)
return; goto end;
} }
/* get rds blocks */ /* get rds blocks */
if ((radio->registers[STATUSRSSI] & STATUSRSSI_RDSR) == 0) if ((radio->registers[STATUSRSSI] & STATUSRSSI_RDSR) == 0)
/* No RDS group ready, better luck next time */ /* No RDS group ready, better luck next time */
return; goto end;
for (blocknum = 0; blocknum < 4; blocknum++) { for (blocknum = 0; blocknum < 4; blocknum++) {
switch (blocknum) { switch (blocknum) {
...@@ -351,19 +350,8 @@ static void si470x_i2c_interrupt_work(struct work_struct *work) ...@@ -351,19 +350,8 @@ static void si470x_i2c_interrupt_work(struct work_struct *work)
if (radio->wr_index != radio->rd_index) if (radio->wr_index != radio->rd_index)
wake_up_interruptible(&radio->read_queue); wake_up_interruptible(&radio->read_queue);
}
/*
* si470x_i2c_interrupt - interrupt handler
*/
static irqreturn_t si470x_i2c_interrupt(int irq, void *dev_id)
{
struct si470x_device *radio = dev_id;
if (!work_pending(&radio->radio_work))
schedule_work(&radio->radio_work);
end:
return IRQ_HANDLED; return IRQ_HANDLED;
} }
...@@ -385,7 +373,6 @@ static int __devinit si470x_i2c_probe(struct i2c_client *client, ...@@ -385,7 +373,6 @@ static int __devinit si470x_i2c_probe(struct i2c_client *client,
goto err_initial; goto err_initial;
} }
INIT_WORK(&radio->radio_work, si470x_i2c_interrupt_work);
radio->users = 0; radio->users = 0;
radio->client = client; radio->client = client;
mutex_init(&radio->lock); mutex_init(&radio->lock);
...@@ -454,7 +441,7 @@ static int __devinit si470x_i2c_probe(struct i2c_client *client, ...@@ -454,7 +441,7 @@ static int __devinit si470x_i2c_probe(struct i2c_client *client,
radio->stci_enabled = true; radio->stci_enabled = true;
init_completion(&radio->completion); init_completion(&radio->completion);
retval = request_irq(client->irq, si470x_i2c_interrupt, retval = request_threaded_irq(client->irq, NULL, si470x_i2c_interrupt,
IRQF_TRIGGER_FALLING, DRIVER_NAME, radio); IRQF_TRIGGER_FALLING, DRIVER_NAME, radio);
if (retval) { if (retval) {
dev_err(&client->dev, "Failed to register interrupt\n"); dev_err(&client->dev, "Failed to register interrupt\n");
...@@ -492,7 +479,6 @@ static __devexit int si470x_i2c_remove(struct i2c_client *client) ...@@ -492,7 +479,6 @@ static __devexit int si470x_i2c_remove(struct i2c_client *client)
struct si470x_device *radio = i2c_get_clientdata(client); struct si470x_device *radio = i2c_get_clientdata(client);
free_irq(client->irq, radio); free_irq(client->irq, radio);
cancel_work_sync(&radio->radio_work);
video_unregister_device(radio->videodev); video_unregister_device(radio->videodev);
kfree(radio); kfree(radio);
......
...@@ -182,7 +182,6 @@ struct si470x_device { ...@@ -182,7 +182,6 @@ struct si470x_device {
#if defined(CONFIG_I2C_SI470X) || defined(CONFIG_I2C_SI470X_MODULE) #if defined(CONFIG_I2C_SI470X) || defined(CONFIG_I2C_SI470X_MODULE)
struct i2c_client *client; struct i2c_client *client;
struct work_struct radio_work;
#endif #endif
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment