All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Éric Piel" <eric.piel-VkQ1JFuSMpfAbQlEx87xDw@public.gmane.org>
To: Samu Onkalo <samu.p.onkalo-xNZwKgViW5gAvxtiuMwx3w@public.gmane.org>
Cc: khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org,
	guenter.roeck-IzeFyvvaP7pWk0Htik3J/w@public.gmane.org,
	jic23-KWPb1pKIrIJaa/9Udqfwiw@public.gmane.org,
	lm-sensors-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org,
	linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH 10/12] hwmon: lis3: Enhance lis3 selftest with IRQ line test
Date: Sun, 24 Oct 2010 16:58:53 +0200	[thread overview]
Message-ID: <4CC449AD.7010503@tremplin-utc.net> (raw)
In-Reply-To: <1287748654-2626-11-git-send-email-samu.p.onkalo-xNZwKgViW5gAvxtiuMwx3w@public.gmane.org>

Op 22-10-10 13:57, Samu Onkalo schreef:
> Configure chip to data ready mode in selftest and count received
> interrupts to see that interrupt line(s) are working.
>
> Signed-off-by: Samu Onkalo<samu.p.onkalo-xNZwKgViW5gAvxtiuMwx3w@public.gmane.org>
Acked-by: Eric Piel <eric.piel-VkQ1JFuSMpfAbQlEx87xDw@public.gmane.org>
> ---
>   drivers/hwmon/lis3lv02d.c |   87 ++++++++++++++++++++++++++++++++++++++++----
>   drivers/hwmon/lis3lv02d.h |    3 +-
>   2 files changed, 81 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/hwmon/lis3lv02d.c b/drivers/hwmon/lis3lv02d.c
> index 9fd946c..f0343f3 100644
> --- a/drivers/hwmon/lis3lv02d.c
> +++ b/drivers/hwmon/lis3lv02d.c
> @@ -48,6 +48,13 @@
>
>   #define LIS3_SYSFS_POWERDOWN_DELAY 5000 /* In milliseconds */
>
> +#define SELFTEST_OK	       0
> +#define SELFTEST_FAIL	       -1
> +#define SELFTEST_IRQ	       -2
> +
> +#define IRQ_LINE0	       0
> +#define IRQ_LINE1	       1
> +
>   /*
>    * The sensor can also generate interrupts (DRDY) but it's pretty pointless
>    * because they are generated even if the data do not change. So it's better
> @@ -198,6 +205,8 @@ static int lis3lv02d_selftest(struct lis3lv02d *lis3, s16 results[3])
>   	s16 x, y, z;
>   	u8 selftest;
>   	int ret;
> +	u8 ctrl_reg_data;
> +	unsigned char irq_cfg;
>
>   	mutex_lock(&lis3->mutex);
>   	if (lis3_dev.whoami == WAI_12B)
> @@ -205,6 +214,20 @@ static int lis3lv02d_selftest(struct lis3lv02d *lis3, s16 results[3])
>   	else
>   		selftest = CTRL1_STP;
>
> +	irq_cfg = lis3->irq_cfg;
> +	if (lis3_dev.whoami == WAI_8B) {
> +		lis3->data_ready_count[IRQ_LINE0] = 0;
> +		lis3->data_ready_count[IRQ_LINE1] = 0;
> +
> +		/* Change interrupt cfg to data ready for selftest */
> +		atomic_inc(&lis3_dev.wake_thread);
> +		lis3->irq_cfg = LIS3_IRQ1_DATA_READY | LIS3_IRQ2_DATA_READY;
> +		lis3->read(lis3, CTRL_REG3,&ctrl_reg_data);
> +		lis3->write(lis3, CTRL_REG3, (ctrl_reg_data&
> +				~(LIS3_IRQ1_MASK | LIS3_IRQ2_MASK)) |
> +				(LIS3_IRQ1_DATA_READY | LIS3_IRQ2_DATA_READY));
> +	}
> +
>   	lis3->read(lis3, CTRL_REG1,&reg);
>   	lis3->write(lis3, CTRL_REG1, (reg | selftest));
>   	msleep(lis3->pwron_delay / lis3lv02d_get_odr());
> @@ -223,13 +246,33 @@ static int lis3lv02d_selftest(struct lis3lv02d *lis3, s16 results[3])
>   	results[2] = z - lis3->read_data(lis3, OUTZ);
>
>   	ret = 0;
> +
> +	if (lis3_dev.whoami == WAI_8B) {
> +		/* Restore original interrupt configuration */
> +		atomic_dec(&lis3_dev.wake_thread);
> +		lis3->write(lis3, CTRL_REG3, ctrl_reg_data);
> +		lis3->irq_cfg = irq_cfg;
> +
> +		if ((irq_cfg&  LIS3_IRQ1_MASK)&&
> +			lis3->data_ready_count[IRQ_LINE0]<  2) {
> +			ret = SELFTEST_IRQ;
> +			goto fail;
> +		}
> +
> +		if ((irq_cfg&  LIS3_IRQ2_MASK)&&
> +			lis3->data_ready_count[IRQ_LINE1]<  2) {
> +			ret = SELFTEST_IRQ;
> +			goto fail;
> +		}
> +	}
> +
>   	if (lis3->pdata) {
>   		int i;
>   		for (i = 0; i<  3; i++) {
>   			/* Check against selftest acceptance limits */
>   			if ((results[i]<  lis3->pdata->st_min_limits[i]) ||
>   			    (results[i]>  lis3->pdata->st_max_limits[i])) {
> -				ret = -EIO;
> +				ret = SELFTEST_FAIL;
>   				goto fail;
>   			}
>   		}
> @@ -392,13 +435,24 @@ static void lis302dl_interrupt_handle_click(struct lis3lv02d *lis3)
>   	mutex_unlock(&lis3->mutex);
>   }
>
> -static irqreturn_t lis302dl_interrupt_thread1_8b(int irq, void *data)
> +static inline void lis302dl_data_ready(struct lis3lv02d *lis3, int index)
>   {
> +	int dummy;
>
> +	/* Dummy read to ack interrupt */
> +	lis3lv02d_get_xyz(lis3,&dummy,&dummy,&dummy);
> +	lis3->data_ready_count[index]++;
> +}
> +
> +static irqreturn_t lis302dl_interrupt_thread1_8b(int irq, void *data)
> +{
>   	struct lis3lv02d *lis3 = data;
> +	u8 irq_cfg = lis3->irq_cfg&  LIS3_IRQ1_MASK;
>
> -	if ((lis3->irq_cfg&  LIS3_IRQ1_MASK) == LIS3_IRQ1_CLICK)
> +	if (irq_cfg == LIS3_IRQ1_CLICK)
>   		lis302dl_interrupt_handle_click(lis3);
> +	else if (unlikely(irq_cfg == LIS3_IRQ1_DATA_READY))
> +		lis302dl_data_ready(lis3, IRQ_LINE0);
>   	else
>   		lis3lv02d_joystick_poll(lis3->idev);
>
> @@ -407,11 +461,13 @@ static irqreturn_t lis302dl_interrupt_thread1_8b(int irq, void *data)
>
>   static irqreturn_t lis302dl_interrupt_thread2_8b(int irq, void *data)
>   {
> -
>   	struct lis3lv02d *lis3 = data;
> +	u8 irq_cfg = lis3->irq_cfg&  LIS3_IRQ2_MASK;
>
> -	if ((lis3->irq_cfg&  LIS3_IRQ2_MASK) == LIS3_IRQ2_CLICK)
> +	if (irq_cfg == LIS3_IRQ2_CLICK)
>   		lis302dl_interrupt_handle_click(lis3);
> +	else if (unlikely(irq_cfg == LIS3_IRQ2_DATA_READY))
> +		lis302dl_data_ready(lis3, IRQ_LINE1);
>   	else
>   		lis3lv02d_joystick_poll(lis3->idev);
>
> @@ -614,12 +670,27 @@ static void lis3lv02d_sysfs_poweron(struct lis3lv02d *lis3)
>   static ssize_t lis3lv02d_selftest_show(struct device *dev,
>   				struct device_attribute *attr, char *buf)
>   {
> -	int result;
>   	s16 values[3];
>
> +	static const char ok[] = "OK";
> +	static const char fail[] = "FAIL";
> +	static const char irq[] = "FAIL_IRQ";
> +	const char *res;
> +
>   	lis3lv02d_sysfs_poweron(&lis3_dev);
> -	result = lis3lv02d_selftest(&lis3_dev, values);
> -	return sprintf(buf, "%s %d %d %d\n", result == 0 ? "OK" : "FAIL",
> +	switch (lis3lv02d_selftest(&lis3_dev, values)) {
> +	case SELFTEST_FAIL:
> +		res = fail;
> +		break;
> +	case SELFTEST_IRQ:
> +		res = irq;
> +		break;
> +	case SELFTEST_OK:
> +	default:
> +		res = ok;
> +		break;
> +	}
> +	return sprintf(buf, "%s %d %d %d\n", res,
>   		values[0], values[1], values[2]);
>   }
>
> diff --git a/drivers/hwmon/lis3lv02d.h b/drivers/hwmon/lis3lv02d.h
> index d3cb662..7b22cd9 100644
> --- a/drivers/hwmon/lis3lv02d.h
> +++ b/drivers/hwmon/lis3lv02d.h
> @@ -254,7 +254,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;
> +	int                     data_ready_count[2];
> +	atomic_t		wake_thread;
>   	unsigned char           irq_cfg;
>
>   	struct lis3lv02d_platform_data *pdata;	/* for passing board config */

WARNING: multiple messages have this Message-ID (diff)
From: "Éric Piel" <eric.piel@tremplin-utc.net>
To: Samu Onkalo <samu.p.onkalo@nokia.com>
Cc: khali@linux-fr.org, guenter.roeck@ericsson.com, jic23@cam.ac.uk,
	lm-sensors@lm-sensors.org, linux-i2c@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [lm-sensors] [PATCH 10/12] hwmon: lis3: Enhance lis3 selftest
Date: Sun, 24 Oct 2010 14:58:53 +0000	[thread overview]
Message-ID: <4CC449AD.7010503@tremplin-utc.net> (raw)
In-Reply-To: <1287748654-2626-11-git-send-email-samu.p.onkalo@nokia.com>

Op 22-10-10 13:57, Samu Onkalo schreef:
> Configure chip to data ready mode in selftest and count received
> interrupts to see that interrupt line(s) are working.
>
> Signed-off-by: Samu Onkalo<samu.p.onkalo@nokia.com>
Acked-by: Eric Piel <eric.piel@tremplin-utc.net>
> ---
>   drivers/hwmon/lis3lv02d.c |   87 ++++++++++++++++++++++++++++++++++++++++----
>   drivers/hwmon/lis3lv02d.h |    3 +-
>   2 files changed, 81 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/hwmon/lis3lv02d.c b/drivers/hwmon/lis3lv02d.c
> index 9fd946c..f0343f3 100644
> --- a/drivers/hwmon/lis3lv02d.c
> +++ b/drivers/hwmon/lis3lv02d.c
> @@ -48,6 +48,13 @@
>
>   #define LIS3_SYSFS_POWERDOWN_DELAY 5000 /* In milliseconds */
>
> +#define SELFTEST_OK	       0
> +#define SELFTEST_FAIL	       -1
> +#define SELFTEST_IRQ	       -2
> +
> +#define IRQ_LINE0	       0
> +#define IRQ_LINE1	       1
> +
>   /*
>    * The sensor can also generate interrupts (DRDY) but it's pretty pointless
>    * because they are generated even if the data do not change. So it's better
> @@ -198,6 +205,8 @@ static int lis3lv02d_selftest(struct lis3lv02d *lis3, s16 results[3])
>   	s16 x, y, z;
>   	u8 selftest;
>   	int ret;
> +	u8 ctrl_reg_data;
> +	unsigned char irq_cfg;
>
>   	mutex_lock(&lis3->mutex);
>   	if (lis3_dev.whoami = WAI_12B)
> @@ -205,6 +214,20 @@ static int lis3lv02d_selftest(struct lis3lv02d *lis3, s16 results[3])
>   	else
>   		selftest = CTRL1_STP;
>
> +	irq_cfg = lis3->irq_cfg;
> +	if (lis3_dev.whoami = WAI_8B) {
> +		lis3->data_ready_count[IRQ_LINE0] = 0;
> +		lis3->data_ready_count[IRQ_LINE1] = 0;
> +
> +		/* Change interrupt cfg to data ready for selftest */
> +		atomic_inc(&lis3_dev.wake_thread);
> +		lis3->irq_cfg = LIS3_IRQ1_DATA_READY | LIS3_IRQ2_DATA_READY;
> +		lis3->read(lis3, CTRL_REG3,&ctrl_reg_data);
> +		lis3->write(lis3, CTRL_REG3, (ctrl_reg_data&
> +				~(LIS3_IRQ1_MASK | LIS3_IRQ2_MASK)) |
> +				(LIS3_IRQ1_DATA_READY | LIS3_IRQ2_DATA_READY));
> +	}
> +
>   	lis3->read(lis3, CTRL_REG1,&reg);
>   	lis3->write(lis3, CTRL_REG1, (reg | selftest));
>   	msleep(lis3->pwron_delay / lis3lv02d_get_odr());
> @@ -223,13 +246,33 @@ static int lis3lv02d_selftest(struct lis3lv02d *lis3, s16 results[3])
>   	results[2] = z - lis3->read_data(lis3, OUTZ);
>
>   	ret = 0;
> +
> +	if (lis3_dev.whoami = WAI_8B) {
> +		/* Restore original interrupt configuration */
> +		atomic_dec(&lis3_dev.wake_thread);
> +		lis3->write(lis3, CTRL_REG3, ctrl_reg_data);
> +		lis3->irq_cfg = irq_cfg;
> +
> +		if ((irq_cfg&  LIS3_IRQ1_MASK)&&
> +			lis3->data_ready_count[IRQ_LINE0]<  2) {
> +			ret = SELFTEST_IRQ;
> +			goto fail;
> +		}
> +
> +		if ((irq_cfg&  LIS3_IRQ2_MASK)&&
> +			lis3->data_ready_count[IRQ_LINE1]<  2) {
> +			ret = SELFTEST_IRQ;
> +			goto fail;
> +		}
> +	}
> +
>   	if (lis3->pdata) {
>   		int i;
>   		for (i = 0; i<  3; i++) {
>   			/* Check against selftest acceptance limits */
>   			if ((results[i]<  lis3->pdata->st_min_limits[i]) ||
>   			    (results[i]>  lis3->pdata->st_max_limits[i])) {
> -				ret = -EIO;
> +				ret = SELFTEST_FAIL;
>   				goto fail;
>   			}
>   		}
> @@ -392,13 +435,24 @@ static void lis302dl_interrupt_handle_click(struct lis3lv02d *lis3)
>   	mutex_unlock(&lis3->mutex);
>   }
>
> -static irqreturn_t lis302dl_interrupt_thread1_8b(int irq, void *data)
> +static inline void lis302dl_data_ready(struct lis3lv02d *lis3, int index)
>   {
> +	int dummy;
>
> +	/* Dummy read to ack interrupt */
> +	lis3lv02d_get_xyz(lis3,&dummy,&dummy,&dummy);
> +	lis3->data_ready_count[index]++;
> +}
> +
> +static irqreturn_t lis302dl_interrupt_thread1_8b(int irq, void *data)
> +{
>   	struct lis3lv02d *lis3 = data;
> +	u8 irq_cfg = lis3->irq_cfg&  LIS3_IRQ1_MASK;
>
> -	if ((lis3->irq_cfg&  LIS3_IRQ1_MASK) = LIS3_IRQ1_CLICK)
> +	if (irq_cfg = LIS3_IRQ1_CLICK)
>   		lis302dl_interrupt_handle_click(lis3);
> +	else if (unlikely(irq_cfg = LIS3_IRQ1_DATA_READY))
> +		lis302dl_data_ready(lis3, IRQ_LINE0);
>   	else
>   		lis3lv02d_joystick_poll(lis3->idev);
>
> @@ -407,11 +461,13 @@ static irqreturn_t lis302dl_interrupt_thread1_8b(int irq, void *data)
>
>   static irqreturn_t lis302dl_interrupt_thread2_8b(int irq, void *data)
>   {
> -
>   	struct lis3lv02d *lis3 = data;
> +	u8 irq_cfg = lis3->irq_cfg&  LIS3_IRQ2_MASK;
>
> -	if ((lis3->irq_cfg&  LIS3_IRQ2_MASK) = LIS3_IRQ2_CLICK)
> +	if (irq_cfg = LIS3_IRQ2_CLICK)
>   		lis302dl_interrupt_handle_click(lis3);
> +	else if (unlikely(irq_cfg = LIS3_IRQ2_DATA_READY))
> +		lis302dl_data_ready(lis3, IRQ_LINE1);
>   	else
>   		lis3lv02d_joystick_poll(lis3->idev);
>
> @@ -614,12 +670,27 @@ static void lis3lv02d_sysfs_poweron(struct lis3lv02d *lis3)
>   static ssize_t lis3lv02d_selftest_show(struct device *dev,
>   				struct device_attribute *attr, char *buf)
>   {
> -	int result;
>   	s16 values[3];
>
> +	static const char ok[] = "OK";
> +	static const char fail[] = "FAIL";
> +	static const char irq[] = "FAIL_IRQ";
> +	const char *res;
> +
>   	lis3lv02d_sysfs_poweron(&lis3_dev);
> -	result = lis3lv02d_selftest(&lis3_dev, values);
> -	return sprintf(buf, "%s %d %d %d\n", result = 0 ? "OK" : "FAIL",
> +	switch (lis3lv02d_selftest(&lis3_dev, values)) {
> +	case SELFTEST_FAIL:
> +		res = fail;
> +		break;
> +	case SELFTEST_IRQ:
> +		res = irq;
> +		break;
> +	case SELFTEST_OK:
> +	default:
> +		res = ok;
> +		break;
> +	}
> +	return sprintf(buf, "%s %d %d %d\n", res,
>   		values[0], values[1], values[2]);
>   }
>
> diff --git a/drivers/hwmon/lis3lv02d.h b/drivers/hwmon/lis3lv02d.h
> index d3cb662..7b22cd9 100644
> --- a/drivers/hwmon/lis3lv02d.h
> +++ b/drivers/hwmon/lis3lv02d.h
> @@ -254,7 +254,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;
> +	int                     data_ready_count[2];
> +	atomic_t		wake_thread;
>   	unsigned char           irq_cfg;
>
>   	struct lis3lv02d_platform_data *pdata;	/* for passing board config */


_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors

WARNING: multiple messages have this Message-ID (diff)
From: "Éric Piel" <eric.piel@tremplin-utc.net>
To: Samu Onkalo <samu.p.onkalo@nokia.com>
Cc: khali@linux-fr.org, guenter.roeck@ericsson.com, jic23@cam.ac.uk,
	lm-sensors@lm-sensors.org, linux-i2c@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH 10/12] hwmon: lis3: Enhance lis3 selftest with IRQ line test
Date: Sun, 24 Oct 2010 16:58:53 +0200	[thread overview]
Message-ID: <4CC449AD.7010503@tremplin-utc.net> (raw)
In-Reply-To: <1287748654-2626-11-git-send-email-samu.p.onkalo@nokia.com>

Op 22-10-10 13:57, Samu Onkalo schreef:
> Configure chip to data ready mode in selftest and count received
> interrupts to see that interrupt line(s) are working.
>
> Signed-off-by: Samu Onkalo<samu.p.onkalo@nokia.com>
Acked-by: Eric Piel <eric.piel@tremplin-utc.net>
> ---
>   drivers/hwmon/lis3lv02d.c |   87 ++++++++++++++++++++++++++++++++++++++++----
>   drivers/hwmon/lis3lv02d.h |    3 +-
>   2 files changed, 81 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/hwmon/lis3lv02d.c b/drivers/hwmon/lis3lv02d.c
> index 9fd946c..f0343f3 100644
> --- a/drivers/hwmon/lis3lv02d.c
> +++ b/drivers/hwmon/lis3lv02d.c
> @@ -48,6 +48,13 @@
>
>   #define LIS3_SYSFS_POWERDOWN_DELAY 5000 /* In milliseconds */
>
> +#define SELFTEST_OK	       0
> +#define SELFTEST_FAIL	       -1
> +#define SELFTEST_IRQ	       -2
> +
> +#define IRQ_LINE0	       0
> +#define IRQ_LINE1	       1
> +
>   /*
>    * The sensor can also generate interrupts (DRDY) but it's pretty pointless
>    * because they are generated even if the data do not change. So it's better
> @@ -198,6 +205,8 @@ static int lis3lv02d_selftest(struct lis3lv02d *lis3, s16 results[3])
>   	s16 x, y, z;
>   	u8 selftest;
>   	int ret;
> +	u8 ctrl_reg_data;
> +	unsigned char irq_cfg;
>
>   	mutex_lock(&lis3->mutex);
>   	if (lis3_dev.whoami == WAI_12B)
> @@ -205,6 +214,20 @@ static int lis3lv02d_selftest(struct lis3lv02d *lis3, s16 results[3])
>   	else
>   		selftest = CTRL1_STP;
>
> +	irq_cfg = lis3->irq_cfg;
> +	if (lis3_dev.whoami == WAI_8B) {
> +		lis3->data_ready_count[IRQ_LINE0] = 0;
> +		lis3->data_ready_count[IRQ_LINE1] = 0;
> +
> +		/* Change interrupt cfg to data ready for selftest */
> +		atomic_inc(&lis3_dev.wake_thread);
> +		lis3->irq_cfg = LIS3_IRQ1_DATA_READY | LIS3_IRQ2_DATA_READY;
> +		lis3->read(lis3, CTRL_REG3,&ctrl_reg_data);
> +		lis3->write(lis3, CTRL_REG3, (ctrl_reg_data&
> +				~(LIS3_IRQ1_MASK | LIS3_IRQ2_MASK)) |
> +				(LIS3_IRQ1_DATA_READY | LIS3_IRQ2_DATA_READY));
> +	}
> +
>   	lis3->read(lis3, CTRL_REG1,&reg);
>   	lis3->write(lis3, CTRL_REG1, (reg | selftest));
>   	msleep(lis3->pwron_delay / lis3lv02d_get_odr());
> @@ -223,13 +246,33 @@ static int lis3lv02d_selftest(struct lis3lv02d *lis3, s16 results[3])
>   	results[2] = z - lis3->read_data(lis3, OUTZ);
>
>   	ret = 0;
> +
> +	if (lis3_dev.whoami == WAI_8B) {
> +		/* Restore original interrupt configuration */
> +		atomic_dec(&lis3_dev.wake_thread);
> +		lis3->write(lis3, CTRL_REG3, ctrl_reg_data);
> +		lis3->irq_cfg = irq_cfg;
> +
> +		if ((irq_cfg&  LIS3_IRQ1_MASK)&&
> +			lis3->data_ready_count[IRQ_LINE0]<  2) {
> +			ret = SELFTEST_IRQ;
> +			goto fail;
> +		}
> +
> +		if ((irq_cfg&  LIS3_IRQ2_MASK)&&
> +			lis3->data_ready_count[IRQ_LINE1]<  2) {
> +			ret = SELFTEST_IRQ;
> +			goto fail;
> +		}
> +	}
> +
>   	if (lis3->pdata) {
>   		int i;
>   		for (i = 0; i<  3; i++) {
>   			/* Check against selftest acceptance limits */
>   			if ((results[i]<  lis3->pdata->st_min_limits[i]) ||
>   			    (results[i]>  lis3->pdata->st_max_limits[i])) {
> -				ret = -EIO;
> +				ret = SELFTEST_FAIL;
>   				goto fail;
>   			}
>   		}
> @@ -392,13 +435,24 @@ static void lis302dl_interrupt_handle_click(struct lis3lv02d *lis3)
>   	mutex_unlock(&lis3->mutex);
>   }
>
> -static irqreturn_t lis302dl_interrupt_thread1_8b(int irq, void *data)
> +static inline void lis302dl_data_ready(struct lis3lv02d *lis3, int index)
>   {
> +	int dummy;
>
> +	/* Dummy read to ack interrupt */
> +	lis3lv02d_get_xyz(lis3,&dummy,&dummy,&dummy);
> +	lis3->data_ready_count[index]++;
> +}
> +
> +static irqreturn_t lis302dl_interrupt_thread1_8b(int irq, void *data)
> +{
>   	struct lis3lv02d *lis3 = data;
> +	u8 irq_cfg = lis3->irq_cfg&  LIS3_IRQ1_MASK;
>
> -	if ((lis3->irq_cfg&  LIS3_IRQ1_MASK) == LIS3_IRQ1_CLICK)
> +	if (irq_cfg == LIS3_IRQ1_CLICK)
>   		lis302dl_interrupt_handle_click(lis3);
> +	else if (unlikely(irq_cfg == LIS3_IRQ1_DATA_READY))
> +		lis302dl_data_ready(lis3, IRQ_LINE0);
>   	else
>   		lis3lv02d_joystick_poll(lis3->idev);
>
> @@ -407,11 +461,13 @@ static irqreturn_t lis302dl_interrupt_thread1_8b(int irq, void *data)
>
>   static irqreturn_t lis302dl_interrupt_thread2_8b(int irq, void *data)
>   {
> -
>   	struct lis3lv02d *lis3 = data;
> +	u8 irq_cfg = lis3->irq_cfg&  LIS3_IRQ2_MASK;
>
> -	if ((lis3->irq_cfg&  LIS3_IRQ2_MASK) == LIS3_IRQ2_CLICK)
> +	if (irq_cfg == LIS3_IRQ2_CLICK)
>   		lis302dl_interrupt_handle_click(lis3);
> +	else if (unlikely(irq_cfg == LIS3_IRQ2_DATA_READY))
> +		lis302dl_data_ready(lis3, IRQ_LINE1);
>   	else
>   		lis3lv02d_joystick_poll(lis3->idev);
>
> @@ -614,12 +670,27 @@ static void lis3lv02d_sysfs_poweron(struct lis3lv02d *lis3)
>   static ssize_t lis3lv02d_selftest_show(struct device *dev,
>   				struct device_attribute *attr, char *buf)
>   {
> -	int result;
>   	s16 values[3];
>
> +	static const char ok[] = "OK";
> +	static const char fail[] = "FAIL";
> +	static const char irq[] = "FAIL_IRQ";
> +	const char *res;
> +
>   	lis3lv02d_sysfs_poweron(&lis3_dev);
> -	result = lis3lv02d_selftest(&lis3_dev, values);
> -	return sprintf(buf, "%s %d %d %d\n", result == 0 ? "OK" : "FAIL",
> +	switch (lis3lv02d_selftest(&lis3_dev, values)) {
> +	case SELFTEST_FAIL:
> +		res = fail;
> +		break;
> +	case SELFTEST_IRQ:
> +		res = irq;
> +		break;
> +	case SELFTEST_OK:
> +	default:
> +		res = ok;
> +		break;
> +	}
> +	return sprintf(buf, "%s %d %d %d\n", res,
>   		values[0], values[1], values[2]);
>   }
>
> diff --git a/drivers/hwmon/lis3lv02d.h b/drivers/hwmon/lis3lv02d.h
> index d3cb662..7b22cd9 100644
> --- a/drivers/hwmon/lis3lv02d.h
> +++ b/drivers/hwmon/lis3lv02d.h
> @@ -254,7 +254,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;
> +	int                     data_ready_count[2];
> +	atomic_t		wake_thread;
>   	unsigned char           irq_cfg;
>
>   	struct lis3lv02d_platform_data *pdata;	/* for passing board config */


  parent reply	other threads:[~2010-10-24 14:58 UTC|newest]

Thread overview: 101+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-10-22 11:57 [PATCH 00/12] lis3 accelerator feature update Samu Onkalo
2010-10-22 11:57 ` [lm-sensors] " Samu Onkalo
     [not found] ` <1287748654-2626-1-git-send-email-samu.p.onkalo-xNZwKgViW5gAvxtiuMwx3w@public.gmane.org>
2010-10-22 11:57   ` [PATCH 01/12] hwmon: lis3: pm_runtime support Samu Onkalo
2010-10-22 11:57     ` Samu Onkalo
2010-10-22 11:57     ` [lm-sensors] " Samu Onkalo
     [not found]     ` <1287748654-2626-2-git-send-email-samu.p.onkalo-xNZwKgViW5gAvxtiuMwx3w@public.gmane.org>
2010-10-22 16:13       ` Jonathan Cameron
2010-10-22 16:13         ` Jonathan Cameron
2010-10-22 16:13         ` [lm-sensors] " Jonathan Cameron
2010-10-24 14:03     ` Éric Piel
2010-10-24 14:03       ` Éric Piel
2010-10-24 14:03       ` [lm-sensors] " Éric Piel
2010-10-22 11:57   ` [PATCH 02/12] hwmon: lis3: regulator control Samu Onkalo
2010-10-22 11:57     ` Samu Onkalo
2010-10-22 11:57     ` [lm-sensors] " Samu Onkalo
     [not found]     ` <1287748654-2626-3-git-send-email-samu.p.onkalo-xNZwKgViW5gAvxtiuMwx3w@public.gmane.org>
2010-10-22 16:11       ` Jonathan Cameron
2010-10-22 16:11         ` Jonathan Cameron
2010-10-22 16:11         ` [lm-sensors] " Jonathan Cameron
2010-10-24 14:59     ` Éric Piel
2010-10-24 14:59       ` [lm-sensors] " Éric Piel
2010-10-22 11:57   ` [PATCH 06/12] hwmon: lis3: restore axis enabled bits Samu Onkalo
2010-10-22 11:57     ` Samu Onkalo
2010-10-22 11:57     ` [lm-sensors] " Samu Onkalo
2010-10-24 14:24     ` Éric Piel
2010-10-24 14:24       ` [lm-sensors] [PATCH 06/12] hwmon: lis3: restore axis enabled Éric Piel
2010-10-22 11:57   ` [PATCH 11/12] hwmon: lis3: Short explanations of platform data fields Samu Onkalo
2010-10-22 11:57     ` Samu Onkalo
2010-10-22 11:57     ` [lm-sensors] [PATCH 11/12] hwmon: lis3: Short explanations of Samu Onkalo
     [not found]     ` <1287748654-2626-12-git-send-email-samu.p.onkalo-xNZwKgViW5gAvxtiuMwx3w@public.gmane.org>
2010-10-22 16:25       ` [PATCH 11/12] hwmon: lis3: Short explanations of platform data fields Jonathan Cameron
2010-10-22 16:25         ` Jonathan Cameron
2010-10-22 16:25         ` [lm-sensors] [PATCH 11/12] hwmon: lis3: Short explanations of Jonathan Cameron
     [not found]         ` <4CC1BAEE.3030708-KWPb1pKIrIJaa/9Udqfwiw@public.gmane.org>
2010-10-23 13:39           ` [PATCHv2] hwmon: lis3: Short explanations of platform data fields Samu Onkalo
2010-10-23 13:39             ` [lm-sensors] [PATCHv2] hwmon: lis3: Short explanations of platform Samu Onkalo
     [not found]             ` <1287841184-4871-1-git-send-email-samu.p.onkalo-xNZwKgViW5gAvxtiuMwx3w@public.gmane.org>
2010-10-24 14:59               ` [PATCHv2] hwmon: lis3: Short explanations of platform data fields Éric Piel
2010-10-24 14:59                 ` [lm-sensors] [PATCHv2] hwmon: lis3: Short explanations of Éric Piel
2010-10-22 20:08   ` [PATCH 00/12] lis3 accelerator feature update Guenter Roeck
2010-10-22 20:08     ` Guenter Roeck
2010-10-22 20:08     ` [lm-sensors] " Guenter Roeck
2010-10-22 23:44     ` Éric Piel
2010-10-22 23:44       ` [lm-sensors] " Éric Piel
     [not found]       ` <4CC221F0.5040608-VkQ1JFuSMpfAbQlEx87xDw@public.gmane.org>
2010-10-23  1:05         ` Guenter Roeck
2010-10-23  1:05           ` Guenter Roeck
2010-10-23  1:05           ` [lm-sensors] " Guenter Roeck
2010-10-24 15:05   ` Éric Piel
2010-10-24 15:05     ` Éric Piel
2010-10-24 15:05     ` [lm-sensors] " Éric Piel
     [not found]     ` <4CC44B3D.5030404-VkQ1JFuSMpfAbQlEx87xDw@public.gmane.org>
2010-10-24 15:35       ` Guenter Roeck
2010-10-24 15:35         ` Guenter Roeck
2010-10-24 15:35         ` [lm-sensors] " Guenter Roeck
     [not found]         ` <20101024153548.GA14303-IzeFyvvaP7pWk0Htik3J/w@public.gmane.org>
2010-10-24 16:35           ` Guenter Roeck
2010-10-24 16:35             ` Guenter Roeck
2010-10-24 16:35             ` Guenter Roeck
     [not found]             ` <20101024163529.GA14650-IzeFyvvaP7pWk0Htik3J/w@public.gmane.org>
2010-10-24 17:01               ` Guenter Roeck
2010-10-24 17:01                 ` Guenter Roeck
2010-10-24 17:01                 ` Guenter Roeck
2010-10-25  6:10       ` samu.p.onkalo-xNZwKgViW5gAvxtiuMwx3w
2010-10-25  6:10         ` samu.p.onkalo
2010-10-25  6:10         ` [lm-sensors] " samu.p.onkalo
2010-10-22 11:57 ` [PATCH 03/12] hwmon: lis3: Cleanup interrupt handling Samu Onkalo
2010-10-22 11:57   ` [lm-sensors] " Samu Onkalo
2010-10-24 14:18   ` Éric Piel
2010-10-24 14:18     ` Éric Piel
2010-10-24 14:18     ` [lm-sensors] [PATCH 03/12] hwmon: lis3: Cleanup interrupt Éric Piel
2010-10-22 11:57 ` [PATCH 04/12] hwmon: lis3: Update coordinates at polled device open Samu Onkalo
2010-10-22 11:57   ` [lm-sensors] [PATCH 04/12] hwmon: lis3: Update coordinates at Samu Onkalo
2010-10-24 14:19   ` [PATCH 04/12] hwmon: lis3: Update coordinates at polled device open Éric Piel
2010-10-24 14:19     ` [lm-sensors] [PATCH 04/12] hwmon: lis3: Update coordinates at Éric Piel
2010-10-22 11:57 ` [PATCH 05/12] hwmon: lis3: Power on corrections Samu Onkalo
2010-10-22 11:57   ` Samu Onkalo
2010-10-22 11:57   ` [lm-sensors] " Samu Onkalo
2010-10-24 14:22   ` Éric Piel
2010-10-24 14:22     ` Éric Piel
2010-10-24 14:22     ` [lm-sensors] " Éric Piel
2010-10-22 11:57 ` [PATCH 07/12] hwmon: lis3: New parameters to platform data Samu Onkalo
2010-10-22 11:57   ` [lm-sensors] [PATCH 07/12] hwmon: lis3: New parameters to platform Samu Onkalo
     [not found]   ` <1287748654-2626-8-git-send-email-samu.p.onkalo-xNZwKgViW5gAvxtiuMwx3w@public.gmane.org>
2010-10-22 16:17     ` [PATCH 07/12] hwmon: lis3: New parameters to platform data Jonathan Cameron
2010-10-22 16:17       ` Jonathan Cameron
2010-10-22 16:17       ` [lm-sensors] [PATCH 07/12] hwmon: lis3: New parameters to Jonathan Cameron
2010-10-24 14:27   ` [PATCH 07/12] hwmon: lis3: New parameters to platform data Éric Piel
2010-10-24 14:27     ` Éric Piel
2010-10-24 14:27     ` [lm-sensors] [PATCH 07/12] hwmon: lis3: New parameters to Éric Piel
2010-10-22 11:57 ` [PATCH 08/12] hwmon: lis3: Adjust fuzziness for 8 bit device Samu Onkalo
2010-10-22 11:57   ` [lm-sensors] [PATCH 08/12] hwmon: lis3: Adjust fuzziness for 8 bit Samu Onkalo
2010-10-24 14:33   ` [PATCH 08/12] hwmon: lis3: Adjust fuzziness for 8 bit device Éric Piel
2010-10-24 14:33     ` [lm-sensors] [PATCH 08/12] hwmon: lis3: Adjust fuzziness for 8 Éric Piel
2010-10-22 11:57 ` [PATCH 09/12] hwmon: lis3: use block read to access data registers Samu Onkalo
2010-10-22 11:57   ` [lm-sensors] [PATCH 09/12] hwmon: lis3: use block read to access Samu Onkalo
2010-10-22 16:20   ` [PATCH 09/12] hwmon: lis3: use block read to access data registers Jonathan Cameron
2010-10-22 16:20     ` [lm-sensors] [PATCH 09/12] hwmon: lis3: use block read to Jonathan Cameron
2010-10-24 14:53   ` [PATCH 09/12] hwmon: lis3: use block read to access data registers Éric Piel
2010-10-24 14:53     ` [lm-sensors] [PATCH 09/12] hwmon: lis3: use block read to Éric Piel
2010-10-22 11:57 ` [PATCH 10/12] hwmon: lis3: Enhance lis3 selftest with IRQ line test Samu Onkalo
2010-10-22 11:57   ` [lm-sensors] [PATCH 10/12] hwmon: lis3: Enhance lis3 selftest with Samu Onkalo
     [not found]   ` <1287748654-2626-11-git-send-email-samu.p.onkalo-xNZwKgViW5gAvxtiuMwx3w@public.gmane.org>
2010-10-24 14:58     ` Éric Piel [this message]
2010-10-24 14:58       ` [PATCH 10/12] hwmon: lis3: Enhance lis3 selftest with IRQ line test Éric Piel
2010-10-24 14:58       ` [lm-sensors] [PATCH 10/12] hwmon: lis3: Enhance lis3 selftest Éric Piel
2010-10-22 11:57 ` [PATCH 12/12] hwmon: lis3: Release resources is case of failure Samu Onkalo
2010-10-22 11:57   ` Samu Onkalo
2010-10-22 11:57   ` [lm-sensors] [PATCH 12/12] hwmon: lis3: Release resources is case Samu Onkalo
     [not found]   ` <1287748654-2626-13-git-send-email-samu.p.onkalo-xNZwKgViW5gAvxtiuMwx3w@public.gmane.org>
2010-10-24 14:59     ` [PATCH 12/12] hwmon: lis3: Release resources is case of failure Éric Piel
2010-10-24 14:59       ` Éric Piel
2010-10-24 14:59       ` [lm-sensors] [PATCH 12/12] hwmon: lis3: Release resources is Éric Piel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4CC449AD.7010503@tremplin-utc.net \
    --to=eric.piel-vkq1jfusmpfabqlex87xdw@public.gmane.org \
    --cc=guenter.roeck-IzeFyvvaP7pWk0Htik3J/w@public.gmane.org \
    --cc=jic23-KWPb1pKIrIJaa/9Udqfwiw@public.gmane.org \
    --cc=khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org \
    --cc=linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=lm-sensors-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org \
    --cc=samu.p.onkalo-xNZwKgViW5gAvxtiuMwx3w@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.