mirror of https://gitee.com/openkylin/linux.git
Input: request threaded-only IRQs with IRQF_ONESHOT
Since commit 1c6c69525b
("genirq: Reject bogus threaded irq requests")
threaded IRQs without a primary handler need to be requested with
IRQF_ONESHOT, otherwise the request will fail. This patch adds the
IRQF_ONESHOT to input drivers where it is missing. Not modified by
this patch are those drivers where the requested IRQ will always be a
nested IRQ (e.g. because it's part of an MFD), since for this special
case IRQF_ONESHOT is not required to be specified when requesting the
IRQ.
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
parent
1cecc5cc06
commit
9b7e31bbf4
|
@ -281,7 +281,8 @@ static int __devinit as5011_probe(struct i2c_client *client,
|
|||
|
||||
error = request_threaded_irq(as5011->button_irq,
|
||||
NULL, as5011_button_interrupt,
|
||||
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
|
||||
IRQF_TRIGGER_RISING |
|
||||
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
|
||||
"as5011_button", as5011);
|
||||
if (error < 0) {
|
||||
dev_err(&client->dev,
|
||||
|
@ -295,7 +296,7 @@ static int __devinit as5011_probe(struct i2c_client *client,
|
|||
|
||||
error = request_threaded_irq(as5011->axis_irq, NULL,
|
||||
as5011_axis_interrupt,
|
||||
plat_data->axis_irqflags,
|
||||
plat_data->axis_irqflags | IRQF_ONESHOT,
|
||||
"as5011_joystick", as5011);
|
||||
if (error) {
|
||||
dev_err(&client->dev,
|
||||
|
|
|
@ -178,7 +178,8 @@ static int __devinit mcs_touchkey_probe(struct i2c_client *client,
|
|||
}
|
||||
|
||||
error = request_threaded_irq(client->irq, NULL, mcs_touchkey_interrupt,
|
||||
IRQF_TRIGGER_FALLING, client->dev.driver->name, data);
|
||||
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
|
||||
client->dev.driver->name, data);
|
||||
if (error) {
|
||||
dev_err(&client->dev, "Failed to register interrupt\n");
|
||||
goto err_free_mem;
|
||||
|
|
|
@ -248,7 +248,7 @@ static int __devinit mpr_touchkey_probe(struct i2c_client *client,
|
|||
|
||||
error = request_threaded_irq(client->irq, NULL,
|
||||
mpr_touchkey_interrupt,
|
||||
IRQF_TRIGGER_FALLING,
|
||||
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
|
||||
client->dev.driver->name, mpr121);
|
||||
if (error) {
|
||||
dev_err(&client->dev, "Failed to register interrupt\n");
|
||||
|
|
|
@ -201,7 +201,8 @@ static int __devinit qt1070_probe(struct i2c_client *client,
|
|||
msleep(QT1070_RESET_TIME);
|
||||
|
||||
err = request_threaded_irq(client->irq, NULL, qt1070_interrupt,
|
||||
IRQF_TRIGGER_NONE, client->dev.driver->name, data);
|
||||
IRQF_TRIGGER_NONE | IRQF_ONESHOT,
|
||||
client->dev.driver->name, data);
|
||||
if (err) {
|
||||
dev_err(&client->dev, "fail to request irq\n");
|
||||
goto err_free_mem;
|
||||
|
|
|
@ -278,7 +278,8 @@ static int __devinit tca6416_keypad_probe(struct i2c_client *client,
|
|||
|
||||
error = request_threaded_irq(chip->irqnum, NULL,
|
||||
tca6416_keys_isr,
|
||||
IRQF_TRIGGER_FALLING,
|
||||
IRQF_TRIGGER_FALLING |
|
||||
IRQF_ONESHOT,
|
||||
"tca6416-keypad", chip);
|
||||
if (error) {
|
||||
dev_dbg(&client->dev,
|
||||
|
|
|
@ -360,7 +360,7 @@ static int __devinit tca8418_keypad_probe(struct i2c_client *client,
|
|||
client->irq = gpio_to_irq(client->irq);
|
||||
|
||||
error = request_threaded_irq(client->irq, NULL, tca8418_irq_handler,
|
||||
IRQF_TRIGGER_FALLING,
|
||||
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
|
||||
client->name, keypad_data);
|
||||
if (error) {
|
||||
dev_dbg(&client->dev,
|
||||
|
|
|
@ -227,15 +227,15 @@ static int __devinit keypad_probe(struct platform_device *pdev)
|
|||
goto error_clk;
|
||||
}
|
||||
|
||||
error = request_threaded_irq(kp->irq_press, NULL, keypad_irq, 0,
|
||||
dev_name(dev), kp);
|
||||
error = request_threaded_irq(kp->irq_press, NULL, keypad_irq,
|
||||
IRQF_ONESHOT, dev_name(dev), kp);
|
||||
if (error < 0) {
|
||||
dev_err(kp->dev, "Could not allocate keypad press key irq\n");
|
||||
goto error_irq_press;
|
||||
}
|
||||
|
||||
error = request_threaded_irq(kp->irq_release, NULL, keypad_irq, 0,
|
||||
dev_name(dev), kp);
|
||||
error = request_threaded_irq(kp->irq_release, NULL, keypad_irq,
|
||||
IRQF_ONESHOT, dev_name(dev), kp);
|
||||
if (error < 0) {
|
||||
dev_err(kp->dev, "Could not allocate keypad release key irq\n");
|
||||
goto error_irq_release;
|
||||
|
|
|
@ -972,6 +972,7 @@ struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq,
|
|||
struct ad714x_platform_data *plat_data = dev->platform_data;
|
||||
struct ad714x_chip *ad714x;
|
||||
void *drv_mem;
|
||||
unsigned long irqflags;
|
||||
|
||||
struct ad714x_button_drv *bt_drv;
|
||||
struct ad714x_slider_drv *sd_drv;
|
||||
|
@ -1162,10 +1163,11 @@ struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq,
|
|||
alloc_idx++;
|
||||
}
|
||||
|
||||
irqflags = plat_data->irqflags ?: IRQF_TRIGGER_FALLING;
|
||||
irqflags |= IRQF_ONESHOT;
|
||||
|
||||
error = request_threaded_irq(ad714x->irq, NULL, ad714x_interrupt_thread,
|
||||
plat_data->irqflags ?
|
||||
plat_data->irqflags : IRQF_TRIGGER_FALLING,
|
||||
"ad714x_captouch", ad714x);
|
||||
irqflags, "ad714x_captouch", ad714x);
|
||||
if (error) {
|
||||
dev_err(dev, "can't allocate irq %d\n", ad714x->irq);
|
||||
goto err_unreg_dev;
|
||||
|
|
|
@ -213,7 +213,8 @@ static int __devinit dm355evm_keys_probe(struct platform_device *pdev)
|
|||
/* REVISIT: flush the event queue? */
|
||||
|
||||
status = request_threaded_irq(keys->irq, NULL, dm355evm_keys_irq,
|
||||
IRQF_TRIGGER_FALLING, dev_name(&pdev->dev), keys);
|
||||
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
|
||||
dev_name(&pdev->dev), keys);
|
||||
if (status < 0)
|
||||
goto fail2;
|
||||
|
||||
|
|
|
@ -597,7 +597,7 @@ struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned int irq,
|
|||
AD7879_TMR(ts->pen_down_acc_interval);
|
||||
|
||||
err = request_threaded_irq(ts->irq, NULL, ad7879_irq,
|
||||
IRQF_TRIGGER_FALLING,
|
||||
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
|
||||
dev_name(dev), ts);
|
||||
if (err) {
|
||||
dev_err(dev, "irq %d busy?\n", ts->irq);
|
||||
|
|
|
@ -1149,7 +1149,8 @@ static int __devinit mxt_probe(struct i2c_client *client,
|
|||
goto err_free_object;
|
||||
|
||||
error = request_threaded_irq(client->irq, NULL, mxt_interrupt,
|
||||
pdata->irqflags, client->dev.driver->name, data);
|
||||
pdata->irqflags | IRQF_ONESHOT,
|
||||
client->dev.driver->name, data);
|
||||
if (error) {
|
||||
dev_err(&client->dev, "Failed to register interrupt\n");
|
||||
goto err_free_object;
|
||||
|
|
|
@ -509,7 +509,8 @@ static int __devinit bu21013_probe(struct i2c_client *client,
|
|||
input_set_drvdata(in_dev, bu21013_data);
|
||||
|
||||
error = request_threaded_irq(pdata->irq, NULL, bu21013_gpio_irq,
|
||||
IRQF_TRIGGER_FALLING | IRQF_SHARED,
|
||||
IRQF_TRIGGER_FALLING | IRQF_SHARED |
|
||||
IRQF_ONESHOT,
|
||||
DRIVER_TP, bu21013_data);
|
||||
if (error) {
|
||||
dev_err(&client->dev, "request irq %d failed\n", pdata->irq);
|
||||
|
|
|
@ -251,7 +251,8 @@ static int __devinit cy8ctmg110_probe(struct i2c_client *client,
|
|||
}
|
||||
|
||||
err = request_threaded_irq(client->irq, NULL, cy8ctmg110_irq_thread,
|
||||
IRQF_TRIGGER_RISING, "touch_reset_key", ts);
|
||||
IRQF_TRIGGER_RISING | IRQF_ONESHOT,
|
||||
"touch_reset_key", ts);
|
||||
if (err < 0) {
|
||||
dev_err(&client->dev,
|
||||
"irq %d busy? error %d\n", client->irq, err);
|
||||
|
|
|
@ -620,7 +620,7 @@ static int __devinit mrstouch_probe(struct platform_device *pdev)
|
|||
MRST_PRESSURE_MIN, MRST_PRESSURE_MAX, 0, 0);
|
||||
|
||||
err = request_threaded_irq(tsdev->irq, NULL, mrstouch_pendet_irq,
|
||||
0, "mrstouch", tsdev);
|
||||
IRQF_ONESHOT, "mrstouch", tsdev);
|
||||
if (err) {
|
||||
dev_err(tsdev->dev, "unable to allocate irq\n");
|
||||
goto err_free_mem;
|
||||
|
|
|
@ -165,7 +165,7 @@ static int __devinit pixcir_i2c_ts_probe(struct i2c_client *client,
|
|||
input_set_drvdata(input, tsdata);
|
||||
|
||||
error = request_threaded_irq(client->irq, NULL, pixcir_ts_isr,
|
||||
IRQF_TRIGGER_FALLING,
|
||||
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
|
||||
client->name, tsdata);
|
||||
if (error) {
|
||||
dev_err(&client->dev, "Unable to request touchscreen IRQ.\n");
|
||||
|
|
|
@ -297,7 +297,7 @@ static int __devinit tsc_probe(struct platform_device *pdev)
|
|||
goto error_clk;
|
||||
}
|
||||
|
||||
error = request_threaded_irq(ts->tsc_irq, NULL, tsc_irq, 0,
|
||||
error = request_threaded_irq(ts->tsc_irq, NULL, tsc_irq, IRQF_ONESHOT,
|
||||
dev_name(dev), ts);
|
||||
if (error < 0) {
|
||||
dev_err(ts->dev, "Could not allocate ts irq\n");
|
||||
|
|
|
@ -650,7 +650,8 @@ static int __devinit tsc2005_probe(struct spi_device *spi)
|
|||
tsc2005_stop_scan(ts);
|
||||
|
||||
error = request_threaded_irq(spi->irq, NULL, tsc2005_irq_thread,
|
||||
IRQF_TRIGGER_RISING, "tsc2005", ts);
|
||||
IRQF_TRIGGER_RISING | IRQF_ONESHOT,
|
||||
"tsc2005", ts);
|
||||
if (error) {
|
||||
dev_err(&spi->dev, "Failed to request irq, err: %d\n", error);
|
||||
goto err_free_mem;
|
||||
|
|
Loading…
Reference in New Issue