lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <4CC44035.5070303@tremplin-utc.net>
Date:	Sun, 24 Oct 2010 16:18:29 +0200
From:	Éric Piel <eric.piel@...mplin-utc.net>
To:	Samu Onkalo <samu.p.onkalo@...ia.com>
CC:	khali@...ux-fr.org, guenter.roeck@...csson.com, jic23@....ac.uk,
	lm-sensors@...sensors.org, linux-i2c@...r.kernel.org,
	linux-kernel@...r.kernel.org
Subject: Re: [PATCH 03/12] hwmon: lis3: Cleanup interrupt handling

Op 22-10-10 13:57, Samu Onkalo schreef:
> Irqcfg moved to chip data instead of platform data.
> This simplifies access in interrupt handler little bit.
>
> Input device open and close functions set status for
> interrupt threaded handler once.
>
> Unnecessary check for interrupt source removed since
> it is enough that active interrupt line indicates that
> there was an interrupt.
>
> Signed-off-by: Samu Onkalo<samu.p.onkalo@...ia.com>
Acked-by: Eric Piel <eric.piel@...mplin-utc.net>
> ---
>   drivers/hwmon/lis3lv02d.c |   33 +++++++++++----------------------
>   drivers/hwmon/lis3lv02d.h |    2 ++
>   2 files changed, 13 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/hwmon/lis3lv02d.c b/drivers/hwmon/lis3lv02d.c
> index ade6f3a..fe97390 100644
> --- a/drivers/hwmon/lis3lv02d.c
> +++ b/drivers/hwmon/lis3lv02d.c
> @@ -309,10 +309,14 @@ static void lis3lv02d_joystick_open(struct input_polled_dev *pidev)
>   {
>   	if (lis3_dev.pm_dev)
>   		pm_runtime_get_sync(lis3_dev.pm_dev);
> +
> +	if (lis3_dev.pdata&&  lis3_dev.whoami == WAI_8B&&  lis3_dev.idev)
> +		atomic_set(&lis3_dev.wake_thread, 1);
>   }
>
>   static void lis3lv02d_joystick_close(struct input_polled_dev *pidev)
>   {
> +	atomic_set(&lis3_dev.wake_thread, 0);
>   	if (lis3_dev.pm_dev)
>   		pm_runtime_put(lis3_dev.pm_dev);
>   }
> @@ -332,8 +336,7 @@ static irqreturn_t lis302dl_interrupt(int irq, void *dummy)
>   	wake_up_interruptible(&lis3_dev.misc_wait);
>   	kill_fasync(&lis3_dev.async_queue, SIGIO, POLL_IN);
>   out:
> -	if (lis3_dev.pdata&&  lis3_dev.whoami == WAI_8B&&  lis3_dev.idev&&
> -	    lis3_dev.idev->input->users)
> +	if (atomic_read(&lis3_dev.wake_thread))
>   		return IRQ_WAKE_THREAD;
>   	return IRQ_HANDLED;
>   }
> @@ -364,31 +367,15 @@ static void lis302dl_interrupt_handle_click(struct lis3lv02d *lis3)
>   	mutex_unlock(&lis3->mutex);
>   }
>
> -static void lis302dl_interrupt_handle_ff_wu(struct lis3lv02d *lis3)
> -{
> -	u8 wu1_src;
> -	u8 wu2_src;
> -
> -	lis3->read(lis3, FF_WU_SRC_1,&wu1_src);
> -	lis3->read(lis3, FF_WU_SRC_2,&wu2_src);
> -
> -	wu1_src = wu1_src&  FF_WU_SRC_IA ? wu1_src : 0;
> -	wu2_src = wu2_src&  FF_WU_SRC_IA ? wu2_src : 0;
> -
> -	/* joystick poll is internally protected by the lis3->mutex. */
> -	if (wu1_src || wu2_src)
> -		lis3lv02d_joystick_poll(lis3_dev.idev);
> -}
> -
>   static irqreturn_t lis302dl_interrupt_thread1_8b(int irq, void *data)
>   {
>
>   	struct lis3lv02d *lis3 = data;
>
> -	if ((lis3->pdata->irq_cfg&  LIS3_IRQ1_MASK) == LIS3_IRQ1_CLICK)
> +	if ((lis3->irq_cfg&  LIS3_IRQ1_MASK) == LIS3_IRQ1_CLICK)
>   		lis302dl_interrupt_handle_click(lis3);
>   	else
> -		lis302dl_interrupt_handle_ff_wu(lis3);
> +		lis3lv02d_joystick_poll(lis3->idev);
>
>   	return IRQ_HANDLED;
>   }
> @@ -398,10 +385,10 @@ static irqreturn_t lis302dl_interrupt_thread2_8b(int irq, void *data)
>
>   	struct lis3lv02d *lis3 = data;
>
> -	if ((lis3->pdata->irq_cfg&  LIS3_IRQ2_MASK) == LIS3_IRQ2_CLICK)
> +	if ((lis3->irq_cfg&  LIS3_IRQ2_MASK) == LIS3_IRQ2_CLICK)
>   		lis302dl_interrupt_handle_click(lis3);
>   	else
> -		lis302dl_interrupt_handle_ff_wu(lis3);
> +		lis3lv02d_joystick_poll(lis3->idev);
>
>   	return IRQ_HANDLED;
>   }
> @@ -788,6 +775,7 @@ int lis3lv02d_init_device(struct lis3lv02d *dev)
>   	}
>
>   	mutex_init(&dev->mutex);
> +	atomic_set(&dev->wake_thread, 0);
>
>   	lis3lv02d_add_fs(dev);
>   	lis3lv02d_poweron(dev);
> @@ -808,6 +796,7 @@ int lis3lv02d_init_device(struct lis3lv02d *dev)
>   		if (dev->whoami == WAI_8B)
>   			lis3lv02d_8b_configure(dev, p);
>
> +		dev->irq_cfg = p->irq_cfg;
>   		if (p->irq_cfg)
>   			dev->write(dev, CTRL_REG3, p->irq_cfg);
>   	}
> diff --git a/drivers/hwmon/lis3lv02d.h b/drivers/hwmon/lis3lv02d.h
> index 7661e59..66e37b1 100644
> --- a/drivers/hwmon/lis3lv02d.h
> +++ b/drivers/hwmon/lis3lv02d.h
> @@ -252,6 +252,8 @@ struct lis3lv02d {
>   	struct fasync_struct	*async_queue; /* queue for the misc device */
>   	wait_queue_head_t	misc_wait; /* Wait queue for the misc device */
>   	unsigned long		misc_opened; /* bit0: whether the device is open */
> +	atomic_t                wake_thread;
> +	unsigned char           irq_cfg;
>
>   	struct lis3lv02d_platform_data *pdata;	/* for passing board config */
>   	struct mutex		mutex;     /* Serialize poll and selftest */

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ