mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-06 02:50:43 +00:00
drm/i2c: tda998x: allow interrupt to be shared
Some TDA998x contain several different I2C devices - there is the HDMI encoder, and there is a TDA9950 CEC engine. These two share the same interrupt signal. In order to allow a driver for the CEC engine to work, we need to be able to share the interrupt with the CEC driver, so convert the handler and registration to allow this to happen. Tested-by: Brian Starkey <brian.starkey@arm.com> Reviewed-by: Brian Starkey <brian.starkey@arm.com> Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
This commit is contained in:
parent
9476ed2e38
commit
ae81553c30
1 changed files with 25 additions and 23 deletions
|
@ -634,6 +634,7 @@ static irqreturn_t tda998x_irq_thread(int irq, void *data)
|
|||
bool handled = false;
|
||||
|
||||
sta = cec_read(priv, REG_CEC_INTSTATUS);
|
||||
if (sta & CEC_INTSTATUS_HDMI) {
|
||||
cec = cec_read(priv, REG_CEC_RXSHPDINT);
|
||||
lvl = cec_read(priv, REG_CEC_RXSHPDLEV);
|
||||
flag0 = reg_read(priv, REG_INT_FLAGS_0);
|
||||
|
@ -657,6 +658,7 @@ static irqreturn_t tda998x_irq_thread(int irq, void *data)
|
|||
wake_up(&priv->wq_edid);
|
||||
handled = true;
|
||||
}
|
||||
}
|
||||
|
||||
return IRQ_RETVAL(handled);
|
||||
}
|
||||
|
@ -1544,7 +1546,7 @@ static int tda998x_create(struct i2c_client *client, struct tda998x_priv *priv)
|
|||
|
||||
/* initialize the optional IRQ */
|
||||
if (client->irq) {
|
||||
int irqf_trigger;
|
||||
unsigned long irq_flags;
|
||||
|
||||
/* init read EDID waitqueue and HDP work */
|
||||
init_waitqueue_head(&priv->wq_edid);
|
||||
|
@ -1554,11 +1556,11 @@ static int tda998x_create(struct i2c_client *client, struct tda998x_priv *priv)
|
|||
reg_read(priv, REG_INT_FLAGS_1);
|
||||
reg_read(priv, REG_INT_FLAGS_2);
|
||||
|
||||
irqf_trigger =
|
||||
irq_flags =
|
||||
irqd_get_trigger_type(irq_get_irq_data(client->irq));
|
||||
irq_flags |= IRQF_SHARED | IRQF_ONESHOT;
|
||||
ret = request_threaded_irq(client->irq, NULL,
|
||||
tda998x_irq_thread,
|
||||
irqf_trigger | IRQF_ONESHOT,
|
||||
tda998x_irq_thread, irq_flags,
|
||||
"tda998x", priv);
|
||||
if (ret) {
|
||||
dev_err(&client->dev,
|
||||
|
|
Loading…
Reference in a new issue