* [PATCH 0/2 V2] iio: magnetometer: ak8975: Add support for DT and interrupt handling
@ 2013-05-07 10:41 Jacek Anaszewski
[not found] ` <1367923299-30594-1-git-send-email-j.anaszewski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
0 siblings, 1 reply; 4+ messages in thread
From: Jacek Anaszewski @ 2013-05-07 10:41 UTC (permalink / raw)
To: linux-iio-u79uwXL29TY76Z2rM5mHXA
Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ,
achew-DDmLM1+adcrQT0dZR+AlfA, s.nawrocki-Sze3O3UU22JBDgjK7y7TUQ,
Jacek Anaszewski
These patches add 'data ready' interrupt handling for AK8975
magnetometer, so as to provide more efficient alternative of
waiting for the end of conversion. This short series adds also
support for parsing 'gpios' property when initializing from oftree.
This is a follow-up of the previous patchset and it includes
following improvements:
- replaced NULL with 'data' in the second argument of the free_irq calls,
which fixes problem on the module removal
- changed the order of checking for the platform_data and added
checking for the -EPROBE_DEFER as spotted by Lars-Peter Clausen
- moved ak8975.txt out of staging as spotted by Jonathan Cameron
- modified header description in ak8975.txt
- renamed '0C' to '0c' in the examplary device node in ak8975.txt
Thanks,
Jacek Anaszewski
Jacek Anaszewski (2):
iio:ak8975 Add support for gpios DT property
iio:ak8975 Implement data ready interrupt handling
.../bindings/iio/magnetometer/ak8975.txt | 18 ++++
drivers/iio/magnetometer/ak8975.c | 103 +++++++++++++++++++-
2 files changed, 116 insertions(+), 5 deletions(-)
create mode 100644 Documentation/devicetree/bindings/iio/magnetometer/ak8975.txt
--
1.7.5.4
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/2 V2] iio:ak8975 Add support for gpios DT property
[not found] ` <1367923299-30594-1-git-send-email-j.anaszewski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
@ 2013-05-07 10:41 ` Jacek Anaszewski
2013-05-07 10:41 ` [PATCH 2/2 V2] iio:ak8975 Implement data ready interrupt handling Jacek Anaszewski
2013-05-11 10:00 ` [PATCH 0/2 V2] iio: magnetometer: ak8975: Add support for DT and " Jonathan Cameron
2 siblings, 0 replies; 4+ messages in thread
From: Jacek Anaszewski @ 2013-05-07 10:41 UTC (permalink / raw)
To: linux-iio-u79uwXL29TY76Z2rM5mHXA
Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ,
achew-DDmLM1+adcrQT0dZR+AlfA, s.nawrocki-Sze3O3UU22JBDgjK7y7TUQ,
Jacek Anaszewski, Kyungmin Park
Add support for parsing 'gpios' property when initializing
from oftree.
This patch adds also the binding documentation file.
Signed-off-by: Jacek Anaszewski <j.anaszewski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
Signed-off-by: Kyungmin Park <kyungmin.park-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
---
.../bindings/iio/magnetometer/ak8975.txt | 18 ++++++++++++++++++
drivers/iio/magnetometer/ak8975.c | 12 +++++++++---
2 files changed, 27 insertions(+), 3 deletions(-)
create mode 100644 Documentation/devicetree/bindings/iio/magnetometer/ak8975.txt
diff --git a/Documentation/devicetree/bindings/iio/magnetometer/ak8975.txt b/Documentation/devicetree/bindings/iio/magnetometer/ak8975.txt
new file mode 100644
index 0000000..011679f
--- /dev/null
+++ b/Documentation/devicetree/bindings/iio/magnetometer/ak8975.txt
@@ -0,0 +1,18 @@
+* AsahiKASEI AK8975 magnetometer sensor
+
+Required properties:
+
+ - compatible : should be "asahi-kasei,ak8975"
+ - reg : the I2C address of the magnetometer
+
+Optional properties:
+
+ - gpios : should be device tree identifier of the magnetometer DRDY pin
+
+Example:
+
+ak8975@0c {
+ compatible = "asahi-kasei,ak8975";
+ reg = <0x0c>;
+ gpios = <&gpj0 7 0>;
+};
diff --git a/drivers/iio/magnetometer/ak8975.c b/drivers/iio/magnetometer/ak8975.c
index af6c320..d75cc23 100644
--- a/drivers/iio/magnetometer/ak8975.c
+++ b/drivers/iio/magnetometer/ak8975.c
@@ -29,6 +29,7 @@
#include <linux/delay.h>
#include <linux/gpio.h>
+#include <linux/of_gpio.h>
#include <linux/iio/iio.h>
#include <linux/iio/sysfs.h>
@@ -384,10 +385,15 @@ static int ak8975_probe(struct i2c_client *client,
int err;
/* Grab and set up the supplied GPIO. */
- if (client->dev.platform_data == NULL)
- eoc_gpio = -1;
- else
+ if (client->dev.platform_data)
eoc_gpio = *(int *)(client->dev.platform_data);
+ else if (client->dev.of_node)
+ eoc_gpio = of_get_gpio(client->dev.of_node, 0);
+ else
+ eoc_gpio = -1;
+
+ if (eoc_gpio == -EPROBE_DEFER)
+ return -EPROBE_DEFER;
/* We may not have a GPIO based IRQ to scan, that is fine, we will
poll if so */
--
1.7.5.4
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/2 V2] iio:ak8975 Implement data ready interrupt handling
[not found] ` <1367923299-30594-1-git-send-email-j.anaszewski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2013-05-07 10:41 ` [PATCH 1/2 V2] iio:ak8975 Add support for gpios DT property Jacek Anaszewski
@ 2013-05-07 10:41 ` Jacek Anaszewski
2013-05-11 10:00 ` [PATCH 0/2 V2] iio: magnetometer: ak8975: Add support for DT and " Jonathan Cameron
2 siblings, 0 replies; 4+ messages in thread
From: Jacek Anaszewski @ 2013-05-07 10:41 UTC (permalink / raw)
To: linux-iio-u79uwXL29TY76Z2rM5mHXA
Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ,
achew-DDmLM1+adcrQT0dZR+AlfA, s.nawrocki-Sze3O3UU22JBDgjK7y7TUQ,
Jacek Anaszewski, Kyungmin Park
Implement "data ready" interrupt handling in addition to the
two existing read modes - DRDY GPIO polling and ST1 register
DRDY bit polling.
Signed-off-by: Jacek Anaszewski <j.anaszewski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
Signed-off-by: Kyungmin Park <kyungmin.park-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
---
drivers/iio/magnetometer/ak8975.c | 91 ++++++++++++++++++++++++++++++++++++-
1 files changed, 89 insertions(+), 2 deletions(-)
diff --git a/drivers/iio/magnetometer/ak8975.c b/drivers/iio/magnetometer/ak8975.c
index d75cc23..7105f22 100644
--- a/drivers/iio/magnetometer/ak8975.c
+++ b/drivers/iio/magnetometer/ak8975.c
@@ -24,10 +24,11 @@
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/i2c.h>
+#include <linux/interrupt.h>
#include <linux/err.h>
#include <linux/mutex.h>
#include <linux/delay.h>
-
+#include <linux/bitops.h>
#include <linux/gpio.h>
#include <linux/of_gpio.h>
@@ -83,6 +84,7 @@
*/
#define AK8975_MAX_CONVERSION_TIMEOUT 500
#define AK8975_CONVERSION_DONE_POLL_TIME 10
+#define AK8975_DATA_READY_TIMEOUT ((100*HZ)/1000)
/*
* Per-instance context data for the device.
@@ -95,6 +97,9 @@ struct ak8975_data {
long raw_to_gauss[3];
u8 reg_cache[AK8975_MAX_REGS];
int eoc_gpio;
+ int eoc_irq;
+ wait_queue_head_t data_ready_queue;
+ unsigned long flags;
};
static const int ak8975_index_to_reg[] = {
@@ -124,6 +129,51 @@ static int ak8975_write_data(struct i2c_client *client,
}
/*
+ * Handle data ready irq
+ */
+static irqreturn_t ak8975_irq_handler(int irq, void *data)
+{
+ struct ak8975_data *ak8975 = data;
+
+ set_bit(0, &ak8975->flags);
+ wake_up(&ak8975->data_ready_queue);
+
+ return IRQ_HANDLED;
+}
+
+/*
+ * Install data ready interrupt handler
+ */
+static int ak8975_setup_irq(struct ak8975_data *data)
+{
+ struct i2c_client *client = data->client;
+ int rc;
+ int irq;
+
+ if (client->irq)
+ irq = client->irq;
+ else
+ irq = gpio_to_irq(data->eoc_gpio);
+
+ rc = request_irq(irq, ak8975_irq_handler,
+ IRQF_TRIGGER_RISING | IRQF_ONESHOT,
+ dev_name(&client->dev), data);
+ if (rc < 0) {
+ dev_err(&client->dev,
+ "irq %d request failed, (gpio %d): %d\n",
+ irq, data->eoc_gpio, rc);
+ return rc;
+ }
+
+ init_waitqueue_head(&data->data_ready_queue);
+ clear_bit(0, &data->flags);
+ data->eoc_irq = irq;
+
+ return rc;
+}
+
+
+/*
* Perform some start-of-day setup, including reading the asa calibration
* values and caching them.
*/
@@ -171,6 +221,16 @@ static int ak8975_setup(struct i2c_client *client)
AK8975_REG_CNTL_MODE_POWER_DOWN,
AK8975_REG_CNTL_MODE_MASK,
AK8975_REG_CNTL_MODE_SHIFT);
+
+ if (data->eoc_gpio > 0 || client->irq) {
+ ret = ak8975_setup_irq(data);
+ if (ret < 0) {
+ dev_err(&client->dev,
+ "Error setting data ready interrupt\n");
+ return ret;
+ }
+ }
+
if (ret < 0) {
dev_err(&client->dev, "Error in setting power-down mode\n");
return ret;
@@ -267,9 +327,23 @@ static int wait_conversion_complete_polled(struct ak8975_data *data)
dev_err(&client->dev, "Conversion timeout happened\n");
return -EINVAL;
}
+
return read_status;
}
+/* Returns 0 if the end of conversion interrupt occured or -ETIME otherwise */
+static int wait_conversion_complete_interrupt(struct ak8975_data *data)
+{
+ int ret;
+
+ ret = wait_event_timeout(data->data_ready_queue,
+ test_bit(0, &data->flags),
+ AK8975_DATA_READY_TIMEOUT);
+ clear_bit(0, &data->flags);
+
+ return ret > 0 ? 0 : -ETIME;
+}
+
/*
* Emits the raw flux value for the x, y, or z axis.
*/
@@ -295,13 +369,16 @@ static int ak8975_read_axis(struct iio_dev *indio_dev, int index, int *val)
}
/* Wait for the conversion to complete. */
- if (gpio_is_valid(data->eoc_gpio))
+ if (data->eoc_irq)
+ ret = wait_conversion_complete_interrupt(data);
+ else if (gpio_is_valid(data->eoc_gpio))
ret = wait_conversion_complete_gpio(data);
else
ret = wait_conversion_complete_polled(data);
if (ret < 0)
goto exit;
+ /* This will be executed only for non-interrupt based waiting case */
if (ret & AK8975_REG_ST1_DRDY_MASK) {
ret = i2c_smbus_read_byte_data(client, AK8975_REG_ST2);
if (ret < 0) {
@@ -415,6 +492,11 @@ static int ak8975_probe(struct i2c_client *client,
}
data = iio_priv(indio_dev);
i2c_set_clientdata(client, indio_dev);
+
+ data->client = client;
+ data->eoc_gpio = eoc_gpio;
+ data->eoc_irq = 0;
+
/* Perform some basic start-of-day setup of the device. */
err = ak8975_setup(client);
if (err < 0) {
@@ -439,6 +521,8 @@ static int ak8975_probe(struct i2c_client *client,
exit_free_iio:
iio_device_free(indio_dev);
+ if (data->eoc_irq)
+ free_irq(data->eoc_irq, data);
exit_gpio:
if (gpio_is_valid(eoc_gpio))
gpio_free(eoc_gpio);
@@ -453,6 +537,9 @@ static int ak8975_remove(struct i2c_client *client)
iio_device_unregister(indio_dev);
+ if (data->eoc_irq)
+ free_irq(data->eoc_irq, data);
+
if (gpio_is_valid(data->eoc_gpio))
gpio_free(data->eoc_gpio);
--
1.7.5.4
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 0/2 V2] iio: magnetometer: ak8975: Add support for DT and interrupt handling
[not found] ` <1367923299-30594-1-git-send-email-j.anaszewski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2013-05-07 10:41 ` [PATCH 1/2 V2] iio:ak8975 Add support for gpios DT property Jacek Anaszewski
2013-05-07 10:41 ` [PATCH 2/2 V2] iio:ak8975 Implement data ready interrupt handling Jacek Anaszewski
@ 2013-05-11 10:00 ` Jonathan Cameron
2 siblings, 0 replies; 4+ messages in thread
From: Jonathan Cameron @ 2013-05-11 10:00 UTC (permalink / raw)
To: Jacek Anaszewski
Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ,
achew-DDmLM1+adcrQT0dZR+AlfA, s.nawrocki-Sze3O3UU22JBDgjK7y7TUQ
Applied to togreg branch of iio.git.
I'll send upstream after merge window has closed
(so if anyone else wants to take a look at this, you have
a couple of days)
Thanks,
On 05/07/2013 11:41 AM, Jacek Anaszewski wrote:
> These patches add 'data ready' interrupt handling for AK8975
> magnetometer, so as to provide more efficient alternative of
> waiting for the end of conversion. This short series adds also
> support for parsing 'gpios' property when initializing from oftree.
>
> This is a follow-up of the previous patchset and it includes
> following improvements:
>
> - replaced NULL with 'data' in the second argument of the free_irq calls,
> which fixes problem on the module removal
> - changed the order of checking for the platform_data and added
> checking for the -EPROBE_DEFER as spotted by Lars-Peter Clausen
> - moved ak8975.txt out of staging as spotted by Jonathan Cameron
> - modified header description in ak8975.txt
> - renamed '0C' to '0c' in the examplary device node in ak8975.txt
>
> Thanks,
> Jacek Anaszewski
>
> Jacek Anaszewski (2):
> iio:ak8975 Add support for gpios DT property
> iio:ak8975 Implement data ready interrupt handling
>
> .../bindings/iio/magnetometer/ak8975.txt | 18 ++++
> drivers/iio/magnetometer/ak8975.c | 103 +++++++++++++++++++-
> 2 files changed, 116 insertions(+), 5 deletions(-)
> create mode 100644 Documentation/devicetree/bindings/iio/magnetometer/ak8975.txt
>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2013-05-11 10:00 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-05-07 10:41 [PATCH 0/2 V2] iio: magnetometer: ak8975: Add support for DT and interrupt handling Jacek Anaszewski
[not found] ` <1367923299-30594-1-git-send-email-j.anaszewski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2013-05-07 10:41 ` [PATCH 1/2 V2] iio:ak8975 Add support for gpios DT property Jacek Anaszewski
2013-05-07 10:41 ` [PATCH 2/2 V2] iio:ak8975 Implement data ready interrupt handling Jacek Anaszewski
2013-05-11 10:00 ` [PATCH 0/2 V2] iio: magnetometer: ak8975: Add support for DT and " Jonathan Cameron
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).