2 * STMicroelectronics hts221 i2c driver
4 * Copyright 2016 STMicroelectronics Inc.
6 * Lorenzo Bianconi <lorenzo.bianconi@st.com>
8 * Licensed under the GPL-2.
11 #include <linux/kernel.h>
12 #include <linux/module.h>
13 #include <linux/i2c.h>
14 #include <linux/slab.h>
17 #define I2C_AUTO_INCREMENT 0x80
19 static int hts221_i2c_read(struct device
*dev
, u8 addr
, int len
, u8
*data
)
21 struct i2c_msg msg
[2];
22 struct i2c_client
*client
= to_i2c_client(dev
);
25 addr
|= I2C_AUTO_INCREMENT
;
27 msg
[0].addr
= client
->addr
;
28 msg
[0].flags
= client
->flags
;
32 msg
[1].addr
= client
->addr
;
33 msg
[1].flags
= client
->flags
| I2C_M_RD
;
37 return i2c_transfer(client
->adapter
, msg
, 2);
40 static int hts221_i2c_write(struct device
*dev
, u8 addr
, int len
, u8
*data
)
44 struct i2c_client
*client
= to_i2c_client(dev
);
47 addr
|= I2C_AUTO_INCREMENT
;
50 memcpy(&send
[1], data
, len
* sizeof(u8
));
52 msg
.addr
= client
->addr
;
53 msg
.flags
= client
->flags
;
57 return i2c_transfer(client
->adapter
, &msg
, 1);
60 static const struct hts221_transfer_function hts221_transfer_fn
= {
61 .read
= hts221_i2c_read
,
62 .write
= hts221_i2c_write
,
65 static int hts221_i2c_probe(struct i2c_client
*client
,
66 const struct i2c_device_id
*id
)
69 struct iio_dev
*iio_dev
;
71 iio_dev
= devm_iio_device_alloc(&client
->dev
, sizeof(*hw
));
75 i2c_set_clientdata(client
, iio_dev
);
77 hw
= iio_priv(iio_dev
);
78 hw
->name
= client
->name
;
79 hw
->dev
= &client
->dev
;
80 hw
->irq
= client
->irq
;
81 hw
->tf
= &hts221_transfer_fn
;
83 return hts221_probe(iio_dev
);
86 static const struct of_device_id hts221_i2c_of_match
[] = {
87 { .compatible
= "st,hts221", },
90 MODULE_DEVICE_TABLE(of
, hts221_i2c_of_match
);
92 static const struct i2c_device_id hts221_i2c_id_table
[] = {
96 MODULE_DEVICE_TABLE(i2c
, hts221_i2c_id_table
);
98 static struct i2c_driver hts221_driver
= {
100 .name
= "hts221_i2c",
101 .of_match_table
= of_match_ptr(hts221_i2c_of_match
),
103 .probe
= hts221_i2c_probe
,
104 .id_table
= hts221_i2c_id_table
,
106 module_i2c_driver(hts221_driver
);
108 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi@st.com>");
109 MODULE_DESCRIPTION("STMicroelectronics hts221 i2c driver");
110 MODULE_LICENSE("GPL v2");