summaryrefslogtreecommitdiff
path: root/patches.tizen/0261-iio-st_sensors-Add-handling-of-multiple-interrupts.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches.tizen/0261-iio-st_sensors-Add-handling-of-multiple-interrupts.patch')
-rw-r--r--patches.tizen/0261-iio-st_sensors-Add-handling-of-multiple-interrupts.patch175
1 files changed, 175 insertions, 0 deletions
diff --git a/patches.tizen/0261-iio-st_sensors-Add-handling-of-multiple-interrupts.patch b/patches.tizen/0261-iio-st_sensors-Add-handling-of-multiple-interrupts.patch
new file mode 100644
index 00000000000..146ae1c611e
--- /dev/null
+++ b/patches.tizen/0261-iio-st_sensors-Add-handling-of-multiple-interrupts.patch
@@ -0,0 +1,175 @@
+From 17a938cb6784d6c40b98aeb0d3bf587861eef1dd Mon Sep 17 00:00:00 2001
+From: Lukasz Czerwinski <l.czerwinski@samsung.com>
+Date: Thu, 23 May 2013 13:35:28 +0200
+Subject: [PATCH 0261/1302] iio: st_sensors: Add handling of multiple
+ interrupts
+
+This patch adds handling of multiple interrupts for st_sensors.
+Each mapped interrupt can be declared from DT.
+
+Signed-off-by: Lukasz Czerwinski <l.czerwinski@samsung.com>
+Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
+---
+ drivers/iio/common/st_sensors/st_sensors_i2c.c | 32 ++++++++++++++++++++++---
+ drivers/iio/common/st_sensors/st_sensors_spi.c | 33 +++++++++++++++++++++++---
+ include/linux/iio/common/st_sensors.h | 9 +++++++
+ 3 files changed, 68 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/iio/common/st_sensors/st_sensors_i2c.c b/drivers/iio/common/st_sensors/st_sensors_i2c.c
+index 38af944..5ef7682 100644
+--- a/drivers/iio/common/st_sensors/st_sensors_i2c.c
++++ b/drivers/iio/common/st_sensors/st_sensors_i2c.c
+@@ -8,6 +8,8 @@
+ * Licensed under the GPL-2.
+ */
+
++#include <linux/of.h>
++#include <linux/of_irq.h>
+ #include <linux/kernel.h>
+ #include <linux/module.h>
+ #include <linux/slab.h>
+@@ -18,11 +20,33 @@
+
+ #define ST_SENSORS_I2C_MULTIREAD 0x80
+
+-static unsigned int st_sensors_i2c_get_irq(struct iio_dev *indio_dev)
++static unsigned int st_sensors_i2c_get_data_rdy_irq(struct iio_dev *indio_dev)
+ {
+ struct st_sensor_data *sdata = iio_priv(indio_dev);
+
+- return to_i2c_client(sdata->dev)->irq;
++ return sdata->irq_map[ST_SENSORS_INT1];
++}
++
++static void st_sensors_i2c_map_irqs(struct i2c_client *client,
++ struct iio_dev *indio_dev)
++{
++ struct st_sensor_data *sdata = iio_priv(indio_dev);
++ struct device_node *np = client->dev.of_node;
++ u32 irq_policy = 0;
++
++ of_property_read_u32(np, "irq-map-policy", &irq_policy);
++
++ switch (irq_policy) {
++ case ST_SENSORS_MAP_ONLY_DRDY_IRQ:
++ sdata->irq_map[ST_SENSORS_INT1] = irq_of_parse_and_map(np, 0);
++ break;
++ case ST_SENSORS_MAP_ONLY_EVENT_IRQ:
++ sdata->irq_map[ST_SENSORS_INT2] = irq_of_parse_and_map(np, 0);
++ break;
++ default:
++ sdata->irq_map[ST_SENSORS_INT1] = 0;
++ sdata->irq_map[ST_SENSORS_INT2] = 0;
++ }
+ }
+
+ static int st_sensors_i2c_read_byte(struct st_sensor_transfer_buffer *tb,
+@@ -72,7 +96,9 @@ void st_sensors_i2c_configure(struct iio_dev *indio_dev,
+ indio_dev->name = client->name;
+
+ sdata->tf = &st_sensors_tf_i2c;
+- sdata->get_irq_data_ready = st_sensors_i2c_get_irq;
++
++ st_sensors_i2c_map_irqs(client, indio_dev);
++ sdata->get_irq_data_ready = st_sensors_i2c_get_data_rdy_irq;
+ }
+ EXPORT_SYMBOL(st_sensors_i2c_configure);
+
+diff --git a/drivers/iio/common/st_sensors/st_sensors_spi.c b/drivers/iio/common/st_sensors/st_sensors_spi.c
+index 251baf6..69c7069 100644
+--- a/drivers/iio/common/st_sensors/st_sensors_spi.c
++++ b/drivers/iio/common/st_sensors/st_sensors_spi.c
+@@ -8,6 +8,8 @@
+ * Licensed under the GPL-2.
+ */
+
++#include <linux/of.h>
++#include <linux/of_irq.h>
+ #include <linux/kernel.h>
+ #include <linux/module.h>
+ #include <linux/slab.h>
+@@ -19,11 +21,34 @@
+ #define ST_SENSORS_SPI_MULTIREAD 0xc0
+ #define ST_SENSORS_SPI_READ 0x80
+
+-static unsigned int st_sensors_spi_get_irq(struct iio_dev *indio_dev)
++static unsigned int st_sensors_spi_get_data_rdy_irq(struct iio_dev *indio_dev)
+ {
+ struct st_sensor_data *sdata = iio_priv(indio_dev);
+
+- return to_spi_device(sdata->dev)->irq;
++ return sdata->irq_map[ST_SENSORS_INT1];
++}
++
++static void st_sensors_spi_map_irqs(struct spi_device *spi,
++ struct iio_dev *indio_dev)
++{
++ struct st_sensor_data *sdata = iio_priv(indio_dev);
++ struct device_node *np = spi->dev.of_node;
++ u32 irq_policy = 0;
++
++ of_property_read_u32(np, "irq-map-policy", &irq_policy);
++
++ switch (irq_policy) {
++ case ST_SENSORS_MAP_ONLY_DRDY_IRQ:
++ sdata->irq_map[ST_SENSORS_INT1] = irq_of_parse_and_map(np, 0);
++ break;
++ case ST_SENSORS_MAP_ONLY_EVENT_IRQ:
++ sdata->irq_map[ST_SENSORS_INT2] = irq_of_parse_and_map(np, 0);
++ break;
++ default:
++ sdata->irq_map[ST_SENSORS_INT1] = 0;
++ sdata->irq_map[ST_SENSORS_INT2] = 0;
++ break;
++ }
+ }
+
+ static int st_sensors_spi_read(struct st_sensor_transfer_buffer *tb,
+@@ -112,7 +137,9 @@ void st_sensors_spi_configure(struct iio_dev *indio_dev,
+ indio_dev->name = spi->modalias;
+
+ sdata->tf = &st_sensors_tf_spi;
+- sdata->get_irq_data_ready = st_sensors_spi_get_irq;
++
++ st_sensors_spi_map_irqs(spi, indio_dev);
++ sdata->get_irq_data_ready = st_sensors_spi_get_data_rdy_irq;
+ }
+ EXPORT_SYMBOL(st_sensors_spi_configure);
+
+diff --git a/include/linux/iio/common/st_sensors.h b/include/linux/iio/common/st_sensors.h
+index 172c5b2..2fd12a6 100644
+--- a/include/linux/iio/common/st_sensors.h
++++ b/include/linux/iio/common/st_sensors.h
+@@ -42,6 +42,13 @@
+ #define ST_SENSORS_MAX_NAME 17
+ #define ST_SENSORS_MAX_4WAI 7
+
++#define ST_SENSORS_INT_MAX 2
++#define ST_SENSORS_INT1 0
++#define ST_SENSORS_INT2 1
++#define ST_SENSORS_MAP_ONLY_DRDY_IRQ 1
++#define ST_SENSORS_MAP_ONLY_EVENT_IRQ 2
++
++
+ #define ST_SENSORS_LSM_CHANNELS(device_type, index, mod, endian, bits, addr) \
+ { \
+ .type = device_type, \
+@@ -204,6 +211,7 @@ struct st_sensors {
+ * @multiread_bit: Use or not particular bit for [I2C/SPI] multiread.
+ * @buffer_data: Data used by buffer part.
+ * @odr: Output data rate of the sensor [Hz].
++ * @irq_map: Container of mapped IRQs.
+ * @get_irq_data_ready: Function to get the IRQ used for data ready signal.
+ * @tf: Transfer function structure used by I/O operations.
+ * @tb: Transfer buffers and mutex used by I/O operations.
+@@ -220,6 +228,7 @@ struct st_sensor_data {
+ char *buffer_data;
+
+ unsigned int odr;
++ unsigned int irq_map[ST_SENSORS_INT_MAX];
+
+ unsigned int (*get_irq_data_ready) (struct iio_dev *indio_dev);
+
+--
+1.8.3.2
+