ir: remove irq affinity in hard decode mode [1/1]
authorQianggui Song <qianggui.song@amlogic.com>
Tue, 25 Jun 2019 02:44:29 +0000 (10:44 +0800)
committerJianxin Pan <jianxin.pan@amlogic.com>
Fri, 16 Aug 2019 03:05:53 +0000 (20:05 -0700)
PD#SWPL-9797

Problem:
ir irq is binded to cup 1 and will re-set in every resume process.
cup 0 wakeup first in resume, if there comes a irq during resume in
a critical time it may occurs concurrency.

Solution:
remove irq affinity in hard decode mode and only use it in learning
mode.

Verify:
w400

Change-Id: I26fad9f67665a2bfe9c6d2455559eb1d95e8b2ba
Signed-off-by: Qianggui Song <qianggui.song@amlogic.com>
drivers/amlogic/input/remote/remote_cdev.c
drivers/amlogic/input/remote/remote_meson.c
drivers/amlogic/input/remote/sysfs.c

index 6705b64..4eb02cc 100644 (file)
@@ -162,6 +162,8 @@ static long remote_ioctl(struct file *file, unsigned int cmd,
                        /*backup protocol*/
                        chip->r_dev->protocol = chip->protocol;
                        chip->protocol = REMOTE_TYPE_RAW_NEC;
+                       irq_set_affinity(chip->irqno,
+                                        cpumask_of(chip->irq_cpumask));
                } else {
                        chip->protocol = chip->r_dev->protocol;
                        chip->set_register_config(chip, chip->protocol);
index 7f6f430..cf5900d 100644 (file)
@@ -770,7 +770,6 @@ static int ir_hardware_init(struct platform_device *pdev)
                goto error_irq;
 
        chip->irq_cpumask = 1;
-       irq_set_affinity(chip->irqno, cpumask_of(chip->irq_cpumask));
 
        tasklet_enable(&tasklet);
        tasklet.data = (unsigned long)chip;
@@ -944,7 +943,6 @@ static int remote_resume(struct device *dev)
        }
 #endif
 
-       irq_set_affinity(chip->irqno, cpumask_of(chip->irq_cpumask));
        enable_irq(chip->irqno);
        return 0;
 }
index 5bd084c..a6adb4f 100644 (file)
@@ -362,6 +362,8 @@ static ssize_t ir_learning_store(struct device *dev,
                chip->set_register_config(chip, REMOTE_TYPE_RAW_NEC);
                r_dev->protocol = chip->protocol;/*backup protocol*/
                chip->protocol = REMOTE_TYPE_RAW_NEC;
+               irq_set_affinity(chip->irqno,
+                                cpumask_of(chip->irq_cpumask));
        } else {
                chip->protocol = r_dev->protocol;
                chip->set_register_config(chip, chip->protocol);