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/acpi.h>
14 #include <linux/i2c.h>
15 #include <linux/slab.h>
18 #define I2C_AUTO_INCREMENT 0x80
20 static int hts221_i2c_read(struct device
*dev
, u8 addr
, int len
, u8
*data
)
22 struct i2c_msg msg
[2];
23 struct i2c_client
*client
= to_i2c_client(dev
);
26 addr
|= I2C_AUTO_INCREMENT
;
28 msg
[0].addr
= client
->addr
;
29 msg
[0].flags
= client
->flags
;
33 msg
[1].addr
= client
->addr
;
34 msg
[1].flags
= client
->flags
| I2C_M_RD
;
38 return i2c_transfer(client
->adapter
, msg
, 2);
41 static int hts221_i2c_write(struct device
*dev
, u8 addr
, int len
, u8
*data
)
45 struct i2c_client
*client
= to_i2c_client(dev
);
48 addr
|= I2C_AUTO_INCREMENT
;
51 memcpy(&send
[1], data
, len
* sizeof(u8
));
53 msg
.addr
= client
->addr
;
54 msg
.flags
= client
->flags
;
58 return i2c_transfer(client
->adapter
, &msg
, 1);
61 static const struct hts221_transfer_function hts221_transfer_fn
= {
62 .read
= hts221_i2c_read
,
63 .write
= hts221_i2c_write
,
66 static int hts221_i2c_probe(struct i2c_client
*client
,
67 const struct i2c_device_id
*id
)
70 struct iio_dev
*iio_dev
;
72 iio_dev
= devm_iio_device_alloc(&client
->dev
, sizeof(*hw
));
76 i2c_set_clientdata(client
, iio_dev
);
78 hw
= iio_priv(iio_dev
);
79 hw
->name
= client
->name
;
80 hw
->dev
= &client
->dev
;
81 hw
->irq
= client
->irq
;
82 hw
->tf
= &hts221_transfer_fn
;
84 return hts221_probe(iio_dev
);
87 static const struct acpi_device_id hts221_acpi_match
[] = {
91 MODULE_DEVICE_TABLE(acpi
, hts221_acpi_match
);
93 static const struct of_device_id hts221_i2c_of_match
[] = {
94 { .compatible
= "st,hts221", },
97 MODULE_DEVICE_TABLE(of
, hts221_i2c_of_match
);
99 static const struct i2c_device_id hts221_i2c_id_table
[] = {
103 MODULE_DEVICE_TABLE(i2c
, hts221_i2c_id_table
);
105 static struct i2c_driver hts221_driver
= {
107 .name
= "hts221_i2c",
108 .of_match_table
= of_match_ptr(hts221_i2c_of_match
),
109 .acpi_match_table
= ACPI_PTR(hts221_acpi_match
),
111 .probe
= hts221_i2c_probe
,
112 .id_table
= hts221_i2c_id_table
,
114 module_i2c_driver(hts221_driver
);
116 MODULE_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi@st.com>");
117 MODULE_DESCRIPTION("STMicroelectronics hts221 i2c driver");
118 MODULE_LICENSE("GPL v2");