[media] radio-si470x: convert to use request_threaded_irq()
Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
949cf31cb0
commit
474fdc0822
|
@ -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)
|
||||||
/* 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)
|
||||||
|
|
||||||
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,
|
||||||
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,
|
||||||
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)
|
||||||
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 {
|
||||||
|
|
||||||
#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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue