summaryrefslogtreecommitdiffstats
path: root/drivers/input
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2015-02-11 02:47:04 +0100
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2015-02-16 01:06:04 +0100
commit7694f44d63c61883fefba6e8ad12075f17d3ebd3 (patch)
tree80a38c05a787047337557a85b3a6e7aad602062a /drivers/input
parentLinux 3.19 (diff)
downloadlinux-7694f44d63c61883fefba6e8ad12075f17d3ebd3.tar.xz
linux-7694f44d63c61883fefba6e8ad12075f17d3ebd3.zip
Input: bfin_rotary - fix potential oops in interrupt handler
The interrupt handler in the driver tries to fetch driver data from platform device, unfortunately it is only set up after interrupt handler is registered. Since interrupt handler does not really need to access the platform device itself let's change it to get the driver data instance instead. Acked-by: Sonic Zhang <sonic.zhang@analog.com> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input')
-rw-r--r--drivers/input/misc/bfin_rotary.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/drivers/input/misc/bfin_rotary.c b/drivers/input/misc/bfin_rotary.c
index 3f4351579372..2bf93df9403f 100644
--- a/drivers/input/misc/bfin_rotary.c
+++ b/drivers/input/misc/bfin_rotary.c
@@ -59,8 +59,7 @@ static void report_rotary_event(struct bfin_rot *rotary, int delta)
static irqreturn_t bfin_rotary_isr(int irq, void *dev_id)
{
- struct platform_device *pdev = dev_id;
- struct bfin_rot *rotary = platform_get_drvdata(pdev);
+ struct bfin_rot *rotary = dev_id;
int delta;
switch (bfin_read_CNT_STATUS()) {
@@ -152,7 +151,7 @@ static int bfin_rotary_probe(struct platform_device *pdev)
}
error = request_irq(rotary->irq, bfin_rotary_isr,
- 0, dev_name(&pdev->dev), pdev);
+ 0, dev_name(&pdev->dev), rotary);
if (error) {
dev_err(&pdev->dev,
"unable to claim irq %d; error %d\n",
@@ -186,7 +185,7 @@ static int bfin_rotary_probe(struct platform_device *pdev)
return 0;
out2:
- free_irq(rotary->irq, pdev);
+ free_irq(rotary->irq, rotary);
out1:
input_free_device(input);
kfree(rotary);
@@ -202,7 +201,7 @@ static int bfin_rotary_remove(struct platform_device *pdev)
bfin_write_CNT_CONFIG(0);
bfin_write_CNT_IMASK(0);
- free_irq(rotary->irq, pdev);
+ free_irq(rotary->irq, rotary);
input_unregister_device(rotary->input);
peripheral_free_list(per_cnt);