Commit 9251f7aa authored by Lorenzo Bianconi's avatar Lorenzo Bianconi Committed by Jonathan Cameron

iio: humidity: hts221: support open drain mode

Add open drain support in order to share requested IRQ line between
hts221 device and other peripherals
Signed-off-by: default avatarLorenzo Bianconi <lorenzo.bianconi@st.com>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 8614206a
...@@ -20,10 +20,14 @@ ...@@ -20,10 +20,14 @@
#include <linux/iio/triggered_buffer.h> #include <linux/iio/triggered_buffer.h>
#include <linux/iio/buffer.h> #include <linux/iio/buffer.h>
#include <linux/platform_data/st_sensors_pdata.h>
#include "hts221.h" #include "hts221.h"
#define HTS221_REG_DRDY_HL_ADDR 0x22 #define HTS221_REG_DRDY_HL_ADDR 0x22
#define HTS221_REG_DRDY_HL_MASK BIT(7) #define HTS221_REG_DRDY_HL_MASK BIT(7)
#define HTS221_REG_DRDY_PP_OD_ADDR 0x22
#define HTS221_REG_DRDY_PP_OD_MASK BIT(6)
#define HTS221_REG_STATUS_ADDR 0x27 #define HTS221_REG_STATUS_ADDR 0x27
#define HTS221_RH_DRDY_MASK BIT(1) #define HTS221_RH_DRDY_MASK BIT(1)
#define HTS221_TEMP_DRDY_MASK BIT(0) #define HTS221_TEMP_DRDY_MASK BIT(0)
...@@ -69,7 +73,9 @@ static irqreturn_t hts221_trigger_handler_thread(int irq, void *private) ...@@ -69,7 +73,9 @@ static irqreturn_t hts221_trigger_handler_thread(int irq, void *private)
int hts221_allocate_trigger(struct hts221_hw *hw) int hts221_allocate_trigger(struct hts221_hw *hw)
{ {
struct iio_dev *iio_dev = iio_priv_to_dev(hw); struct iio_dev *iio_dev = iio_priv_to_dev(hw);
bool irq_active_low = false; bool irq_active_low = false, open_drain = false;
struct device_node *np = hw->dev->of_node;
struct st_sensors_platform_data *pdata;
unsigned long irq_type; unsigned long irq_type;
int err; int err;
...@@ -95,6 +101,20 @@ int hts221_allocate_trigger(struct hts221_hw *hw) ...@@ -95,6 +101,20 @@ int hts221_allocate_trigger(struct hts221_hw *hw)
HTS221_REG_DRDY_HL_MASK, irq_active_low); HTS221_REG_DRDY_HL_MASK, irq_active_low);
if (err < 0) if (err < 0)
return err; return err;
pdata = (struct st_sensors_platform_data *)hw->dev->platform_data;
if ((np && of_property_read_bool(np, "drive-open-drain")) ||
(pdata && pdata->open_drain)) {
irq_type |= IRQF_SHARED;
open_drain = true;
}
err = hts221_write_with_mask(hw, HTS221_REG_DRDY_PP_OD_ADDR,
HTS221_REG_DRDY_PP_OD_MASK,
open_drain);
if (err < 0)
return err;
err = devm_request_threaded_irq(hw->dev, hw->irq, NULL, err = devm_request_threaded_irq(hw->dev, hw->irq, NULL,
hts221_trigger_handler_thread, hts221_trigger_handler_thread,
irq_type | IRQF_ONESHOT, irq_type | IRQF_ONESHOT,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment