diff options
author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2015-02-10 14:35:36 -0500 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2015-02-10 14:35:36 -0500 |
commit | 4ba24fef3eb3b142197135223b90ced2f319cd53 (patch) | |
tree | a20c125b27740ec7b4c761b11d801108e1b316b2 /drivers/iio | |
parent | 47c1ffb2b6b630894e9a16442611c056ab21c057 (diff) | |
parent | 98a4a59ee31a12105a2b84f5b8b515ac2cb208ef (diff) |
Merge branch 'next' into for-linus
Prepare first round of input updates for 3.20.
Diffstat (limited to 'drivers/iio')
75 files changed, 7233 insertions, 549 deletions
diff --git a/drivers/iio/accel/Kconfig b/drivers/iio/accel/Kconfig index 12addf272a61..9b9be8725e9d 100644 --- a/drivers/iio/accel/Kconfig +++ b/drivers/iio/accel/Kconfig | |||
@@ -6,17 +6,32 @@ | |||
6 | menu "Accelerometers" | 6 | menu "Accelerometers" |
7 | 7 | ||
8 | config BMA180 | 8 | config BMA180 |
9 | tristate "Bosch BMA180 3-Axis Accelerometer Driver" | 9 | tristate "Bosch BMA180/BMA250 3-Axis Accelerometer Driver" |
10 | depends on I2C | 10 | depends on I2C |
11 | select IIO_BUFFER | 11 | select IIO_BUFFER |
12 | select IIO_TRIGGERED_BUFFER | 12 | select IIO_TRIGGERED_BUFFER |
13 | help | 13 | help |
14 | Say Y here if you want to build a driver for the Bosch BMA180 | 14 | Say Y here if you want to build a driver for the Bosch BMA180 or |
15 | triaxial acceleration sensor. | 15 | BMA250 triaxial acceleration sensor. |
16 | 16 | ||
17 | To compile this driver as a module, choose M here: the | 17 | To compile this driver as a module, choose M here: the |
18 | module will be called bma180. | 18 | module will be called bma180. |
19 | 19 | ||
20 | config BMC150_ACCEL | ||
21 | tristate "Bosch BMC150 Accelerometer Driver" | ||
22 | depends on I2C | ||
23 | select IIO_BUFFER | ||
24 | select IIO_TRIGGERED_BUFFER | ||
25 | help | ||
26 | Say yes here to build support for the following Bosch accelerometers: | ||
27 | BMC150, BMI055, BMA250E, BMA222E, BMA255, BMA280. | ||
28 | |||
29 | Currently this only supports the device via an i2c interface. | ||
30 | |||
31 | This is a combo module with both accelerometer and magnetometer. | ||
32 | This driver is only implementing accelerometer part, which has | ||
33 | its own address and register map. | ||
34 | |||
20 | config HID_SENSOR_ACCEL_3D | 35 | config HID_SENSOR_ACCEL_3D |
21 | depends on HID_SENSOR_HUB | 36 | depends on HID_SENSOR_HUB |
22 | select IIO_BUFFER | 37 | select IIO_BUFFER |
@@ -84,7 +99,8 @@ config KXCJK1013 | |||
84 | select IIO_TRIGGERED_BUFFER | 99 | select IIO_TRIGGERED_BUFFER |
85 | help | 100 | help |
86 | Say Y here if you want to build a driver for the Kionix KXCJK-1013 | 101 | Say Y here if you want to build a driver for the Kionix KXCJK-1013 |
87 | triaxial acceleration sensor. | 102 | triaxial acceleration sensor. This driver also supports KXCJ9-1008 |
103 | and KXTJ2-1009. | ||
88 | 104 | ||
89 | To compile this driver as a module, choose M here: the module will | 105 | To compile this driver as a module, choose M here: the module will |
90 | be called kxcjk-1013. | 106 | be called kxcjk-1013. |
diff --git a/drivers/iio/accel/Makefile b/drivers/iio/accel/Makefile index 6578ca1a8e09..a593996c6539 100644 --- a/drivers/iio/accel/Makefile +++ b/drivers/iio/accel/Makefile | |||
@@ -4,6 +4,7 @@ | |||
4 | 4 | ||
5 | # When adding new entries keep the list in alphabetical order | 5 | # When adding new entries keep the list in alphabetical order |
6 | obj-$(CONFIG_BMA180) += bma180.o | 6 | obj-$(CONFIG_BMA180) += bma180.o |
7 | obj-$(CONFIG_BMC150_ACCEL) += bmc150-accel.o | ||
7 | obj-$(CONFIG_HID_SENSOR_ACCEL_3D) += hid-sensor-accel-3d.o | 8 | obj-$(CONFIG_HID_SENSOR_ACCEL_3D) += hid-sensor-accel-3d.o |
8 | obj-$(CONFIG_KXCJK1013) += kxcjk-1013.o | 9 | obj-$(CONFIG_KXCJK1013) += kxcjk-1013.o |
9 | obj-$(CONFIG_KXSD9) += kxsd9.o | 10 | obj-$(CONFIG_KXSD9) += kxsd9.o |
diff --git a/drivers/iio/accel/bma180.c b/drivers/iio/accel/bma180.c index 19100fddd2ed..1096da327130 100644 --- a/drivers/iio/accel/bma180.c +++ b/drivers/iio/accel/bma180.c | |||
@@ -3,9 +3,15 @@ | |||
3 | * | 3 | * |
4 | * Copyright 2013 Oleksandr Kravchenko <x0199363@ti.com> | 4 | * Copyright 2013 Oleksandr Kravchenko <x0199363@ti.com> |
5 | * | 5 | * |
6 | * Support for BMA250 (c) Peter Meerwald <pmeerw@pmeerw.net> | ||
7 | * | ||
6 | * This file is subject to the terms and conditions of version 2 of | 8 | * This file is subject to the terms and conditions of version 2 of |
7 | * the GNU General Public License. See the file COPYING in the main | 9 | * the GNU General Public License. See the file COPYING in the main |
8 | * directory of this archive for more details. | 10 | * directory of this archive for more details. |
11 | * | ||
12 | * SPI is not supported by driver | ||
13 | * BMA180: 7-bit I2C slave address 0x40 or 0x41 | ||
14 | * BMA250: 7-bit I2C slave address 0x18 or 0x19 | ||
9 | */ | 15 | */ |
10 | 16 | ||
11 | #include <linux/module.h> | 17 | #include <linux/module.h> |
@@ -26,9 +32,37 @@ | |||
26 | #define BMA180_DRV_NAME "bma180" | 32 | #define BMA180_DRV_NAME "bma180" |
27 | #define BMA180_IRQ_NAME "bma180_event" | 33 | #define BMA180_IRQ_NAME "bma180_event" |
28 | 34 | ||
35 | enum { | ||
36 | BMA180, | ||
37 | BMA250, | ||
38 | }; | ||
39 | |||
40 | struct bma180_data; | ||
41 | |||
42 | struct bma180_part_info { | ||
43 | const struct iio_chan_spec *channels; | ||
44 | unsigned num_channels; | ||
45 | const int *scale_table; | ||
46 | unsigned num_scales; | ||
47 | const int *bw_table; | ||
48 | unsigned num_bw; | ||
49 | |||
50 | u8 int_reset_reg, int_reset_mask; | ||
51 | u8 sleep_reg, sleep_mask; | ||
52 | u8 bw_reg, bw_mask; | ||
53 | u8 scale_reg, scale_mask; | ||
54 | u8 power_reg, power_mask, lowpower_val; | ||
55 | u8 int_enable_reg, int_enable_mask; | ||
56 | u8 softreset_reg; | ||
57 | |||
58 | int (*chip_config)(struct bma180_data *data); | ||
59 | void (*chip_disable)(struct bma180_data *data); | ||
60 | }; | ||
61 | |||
29 | /* Register set */ | 62 | /* Register set */ |
30 | #define BMA180_CHIP_ID 0x00 /* Need to distinguish BMA180 from other */ | 63 | #define BMA180_CHIP_ID 0x00 /* Need to distinguish BMA180 from other */ |
31 | #define BMA180_ACC_X_LSB 0x02 /* First of 6 registers of accel data */ | 64 | #define BMA180_ACC_X_LSB 0x02 /* First of 6 registers of accel data */ |
65 | #define BMA180_TEMP 0x08 | ||
32 | #define BMA180_CTRL_REG0 0x0d | 66 | #define BMA180_CTRL_REG0 0x0d |
33 | #define BMA180_RESET 0x10 | 67 | #define BMA180_RESET 0x10 |
34 | #define BMA180_BW_TCS 0x20 | 68 | #define BMA180_BW_TCS 0x20 |
@@ -49,65 +83,81 @@ | |||
49 | #define BMA180_SMP_SKIP BIT(0) | 83 | #define BMA180_SMP_SKIP BIT(0) |
50 | 84 | ||
51 | /* Bit masks for registers bit fields */ | 85 | /* Bit masks for registers bit fields */ |
52 | #define BMA180_RANGE 0x0e /* Range of measured accel values*/ | 86 | #define BMA180_RANGE 0x0e /* Range of measured accel values */ |
53 | #define BMA180_BW 0xf0 /* Accel bandwidth */ | 87 | #define BMA180_BW 0xf0 /* Accel bandwidth */ |
54 | #define BMA180_MODE_CONFIG 0x03 /* Config operation modes */ | 88 | #define BMA180_MODE_CONFIG 0x03 /* Config operation modes */ |
55 | 89 | ||
56 | /* We have to write this value in reset register to do soft reset */ | 90 | /* We have to write this value in reset register to do soft reset */ |
57 | #define BMA180_RESET_VAL 0xb6 | 91 | #define BMA180_RESET_VAL 0xb6 |
58 | 92 | ||
59 | #define BMA_180_ID_REG_VAL 0x03 | 93 | #define BMA180_ID_REG_VAL 0x03 |
60 | 94 | ||
61 | /* Chip power modes */ | 95 | /* Chip power modes */ |
62 | #define BMA180_LOW_NOISE 0x00 | ||
63 | #define BMA180_LOW_POWER 0x03 | 96 | #define BMA180_LOW_POWER 0x03 |
64 | 97 | ||
65 | #define BMA180_LOW_NOISE_STR "low_noise" | 98 | #define BMA250_RANGE_REG 0x0f |
66 | #define BMA180_LOW_POWER_STR "low_power" | 99 | #define BMA250_BW_REG 0x10 |
67 | 100 | #define BMA250_POWER_REG 0x11 | |
68 | /* Defaults values */ | 101 | #define BMA250_RESET_REG 0x14 |
69 | #define BMA180_DEF_PMODE 0 | 102 | #define BMA250_INT_ENABLE_REG 0x17 |
70 | #define BMA180_DEF_BW 20 | 103 | #define BMA250_INT_MAP_REG 0x1a |
71 | #define BMA180_DEF_SCALE 2452 | 104 | #define BMA250_INT_RESET_REG 0x21 |
72 | 105 | ||
73 | /* Available values for sysfs */ | 106 | #define BMA250_RANGE_MASK GENMASK(3, 0) /* Range of accel values */ |
74 | #define BMA180_FLP_FREQ_AVAILABLE \ | 107 | #define BMA250_BW_MASK GENMASK(4, 0) /* Accel bandwidth */ |
75 | "10 20 40 75 150 300" | 108 | #define BMA250_SUSPEND_MASK BIT(7) /* chip will sleep */ |
76 | #define BMA180_SCALE_AVAILABLE \ | 109 | #define BMA250_LOWPOWER_MASK BIT(6) |
77 | "0.001275 0.001863 0.002452 0.003727 0.004903 0.009709 0.019417" | 110 | #define BMA250_DATA_INTEN_MASK BIT(4) |
111 | #define BMA250_INT1_DATA_MASK BIT(0) | ||
112 | #define BMA250_INT_RESET_MASK BIT(7) /* Reset pending interrupts */ | ||
78 | 113 | ||
79 | struct bma180_data { | 114 | struct bma180_data { |
80 | struct i2c_client *client; | 115 | struct i2c_client *client; |
81 | struct iio_trigger *trig; | 116 | struct iio_trigger *trig; |
117 | const struct bma180_part_info *part_info; | ||
82 | struct mutex mutex; | 118 | struct mutex mutex; |
83 | int sleep_state; | 119 | bool sleep_state; |
84 | int scale; | 120 | int scale; |
85 | int bw; | 121 | int bw; |
86 | int pmode; | 122 | bool pmode; |
87 | char *buff; | 123 | u8 buff[16]; /* 3x 16-bit + 8-bit + padding + timestamp */ |
88 | }; | 124 | }; |
89 | 125 | ||
90 | enum bma180_axis { | 126 | enum bma180_chan { |
91 | AXIS_X, | 127 | AXIS_X, |
92 | AXIS_Y, | 128 | AXIS_Y, |
93 | AXIS_Z, | 129 | AXIS_Z, |
130 | TEMP | ||
94 | }; | 131 | }; |
95 | 132 | ||
96 | static int bw_table[] = { 10, 20, 40, 75, 150, 300 }; /* Hz */ | 133 | static int bma180_bw_table[] = { 10, 20, 40, 75, 150, 300 }; /* Hz */ |
97 | static int scale_table[] = { 1275, 1863, 2452, 3727, 4903, 9709, 19417 }; | 134 | static int bma180_scale_table[] = { 1275, 1863, 2452, 3727, 4903, 9709, 19417 }; |
135 | |||
136 | static int bma250_bw_table[] = { 8, 16, 31, 63, 125, 250 }; /* Hz */ | ||
137 | static int bma250_scale_table[] = { 0, 0, 0, 38344, 0, 76590, 0, 0, 153180, 0, | ||
138 | 0, 0, 306458 }; | ||
98 | 139 | ||
99 | static int bma180_get_acc_reg(struct bma180_data *data, enum bma180_axis axis) | 140 | static int bma180_get_data_reg(struct bma180_data *data, enum bma180_chan chan) |
100 | { | 141 | { |
101 | u8 reg = BMA180_ACC_X_LSB + axis * 2; | ||
102 | int ret; | 142 | int ret; |
103 | 143 | ||
104 | if (data->sleep_state) | 144 | if (data->sleep_state) |
105 | return -EBUSY; | 145 | return -EBUSY; |
106 | 146 | ||
107 | ret = i2c_smbus_read_word_data(data->client, reg); | 147 | switch (chan) { |
108 | if (ret < 0) | 148 | case TEMP: |
109 | dev_err(&data->client->dev, | 149 | ret = i2c_smbus_read_byte_data(data->client, BMA180_TEMP); |
110 | "failed to read accel_%c registers\n", 'x' + axis); | 150 | if (ret < 0) |
151 | dev_err(&data->client->dev, "failed to read temp register\n"); | ||
152 | break; | ||
153 | default: | ||
154 | ret = i2c_smbus_read_word_data(data->client, | ||
155 | BMA180_ACC_X_LSB + chan * 2); | ||
156 | if (ret < 0) | ||
157 | dev_err(&data->client->dev, | ||
158 | "failed to read accel_%c register\n", | ||
159 | 'x' + chan); | ||
160 | } | ||
111 | 161 | ||
112 | return ret; | 162 | return ret; |
113 | } | 163 | } |
@@ -125,7 +175,8 @@ static int bma180_set_bits(struct bma180_data *data, u8 reg, u8 mask, u8 val) | |||
125 | 175 | ||
126 | static int bma180_reset_intr(struct bma180_data *data) | 176 | static int bma180_reset_intr(struct bma180_data *data) |
127 | { | 177 | { |
128 | int ret = bma180_set_bits(data, BMA180_CTRL_REG0, BMA180_RESET_INT, 1); | 178 | int ret = bma180_set_bits(data, data->part_info->int_reset_reg, |
179 | data->part_info->int_reset_mask, 1); | ||
129 | 180 | ||
130 | if (ret) | 181 | if (ret) |
131 | dev_err(&data->client->dev, "failed to reset interrupt\n"); | 182 | dev_err(&data->client->dev, "failed to reset interrupt\n"); |
@@ -133,12 +184,10 @@ static int bma180_reset_intr(struct bma180_data *data) | |||
133 | return ret; | 184 | return ret; |
134 | } | 185 | } |
135 | 186 | ||
136 | static int bma180_set_new_data_intr_state(struct bma180_data *data, int state) | 187 | static int bma180_set_new_data_intr_state(struct bma180_data *data, bool state) |
137 | { | 188 | { |
138 | u8 reg_val = state ? BMA180_NEW_DATA_INT : 0x00; | 189 | int ret = bma180_set_bits(data, data->part_info->int_enable_reg, |
139 | int ret = i2c_smbus_write_byte_data(data->client, BMA180_CTRL_REG3, | 190 | data->part_info->int_enable_mask, state); |
140 | reg_val); | ||
141 | |||
142 | if (ret) | 191 | if (ret) |
143 | goto err; | 192 | goto err; |
144 | ret = bma180_reset_intr(data); | 193 | ret = bma180_reset_intr(data); |
@@ -153,9 +202,10 @@ err: | |||
153 | return ret; | 202 | return ret; |
154 | } | 203 | } |
155 | 204 | ||
156 | static int bma180_set_sleep_state(struct bma180_data *data, int state) | 205 | static int bma180_set_sleep_state(struct bma180_data *data, bool state) |
157 | { | 206 | { |
158 | int ret = bma180_set_bits(data, BMA180_CTRL_REG0, BMA180_SLEEP, state); | 207 | int ret = bma180_set_bits(data, data->part_info->sleep_reg, |
208 | data->part_info->sleep_mask, state); | ||
159 | 209 | ||
160 | if (ret) { | 210 | if (ret) { |
161 | dev_err(&data->client->dev, | 211 | dev_err(&data->client->dev, |
@@ -167,7 +217,7 @@ static int bma180_set_sleep_state(struct bma180_data *data, int state) | |||
167 | return 0; | 217 | return 0; |
168 | } | 218 | } |
169 | 219 | ||
170 | static int bma180_set_ee_writing_state(struct bma180_data *data, int state) | 220 | static int bma180_set_ee_writing_state(struct bma180_data *data, bool state) |
171 | { | 221 | { |
172 | int ret = bma180_set_bits(data, BMA180_CTRL_REG0, BMA180_EE_W, state); | 222 | int ret = bma180_set_bits(data, BMA180_CTRL_REG0, BMA180_EE_W, state); |
173 | 223 | ||
@@ -185,10 +235,10 @@ static int bma180_set_bw(struct bma180_data *data, int val) | |||
185 | if (data->sleep_state) | 235 | if (data->sleep_state) |
186 | return -EBUSY; | 236 | return -EBUSY; |
187 | 237 | ||
188 | for (i = 0; i < ARRAY_SIZE(bw_table); ++i) { | 238 | for (i = 0; i < data->part_info->num_bw; ++i) { |
189 | if (bw_table[i] == val) { | 239 | if (data->part_info->bw_table[i] == val) { |
190 | ret = bma180_set_bits(data, | 240 | ret = bma180_set_bits(data, data->part_info->bw_reg, |
191 | BMA180_BW_TCS, BMA180_BW, i); | 241 | data->part_info->bw_mask, i); |
192 | if (ret) { | 242 | if (ret) { |
193 | dev_err(&data->client->dev, | 243 | dev_err(&data->client->dev, |
194 | "failed to set bandwidth\n"); | 244 | "failed to set bandwidth\n"); |
@@ -209,10 +259,10 @@ static int bma180_set_scale(struct bma180_data *data, int val) | |||
209 | if (data->sleep_state) | 259 | if (data->sleep_state) |
210 | return -EBUSY; | 260 | return -EBUSY; |
211 | 261 | ||
212 | for (i = 0; i < ARRAY_SIZE(scale_table); ++i) | 262 | for (i = 0; i < data->part_info->num_scales; ++i) |
213 | if (scale_table[i] == val) { | 263 | if (data->part_info->scale_table[i] == val) { |
214 | ret = bma180_set_bits(data, | 264 | ret = bma180_set_bits(data, data->part_info->scale_reg, |
215 | BMA180_OFFSET_LSB1, BMA180_RANGE, i); | 265 | data->part_info->scale_mask, i); |
216 | if (ret) { | 266 | if (ret) { |
217 | dev_err(&data->client->dev, | 267 | dev_err(&data->client->dev, |
218 | "failed to set scale\n"); | 268 | "failed to set scale\n"); |
@@ -225,11 +275,11 @@ static int bma180_set_scale(struct bma180_data *data, int val) | |||
225 | return -EINVAL; | 275 | return -EINVAL; |
226 | } | 276 | } |
227 | 277 | ||
228 | static int bma180_set_pmode(struct bma180_data *data, int mode) | 278 | static int bma180_set_pmode(struct bma180_data *data, bool mode) |
229 | { | 279 | { |
230 | u8 reg_val = mode ? BMA180_LOW_POWER : BMA180_LOW_NOISE; | 280 | u8 reg_val = mode ? data->part_info->lowpower_val : 0; |
231 | int ret = bma180_set_bits(data, BMA180_TCO_Z, BMA180_MODE_CONFIG, | 281 | int ret = bma180_set_bits(data, data->part_info->power_reg, |
232 | reg_val); | 282 | data->part_info->power_mask, reg_val); |
233 | 283 | ||
234 | if (ret) { | 284 | if (ret) { |
235 | dev_err(&data->client->dev, "failed to set power mode\n"); | 285 | dev_err(&data->client->dev, "failed to set power mode\n"); |
@@ -243,7 +293,7 @@ static int bma180_set_pmode(struct bma180_data *data, int mode) | |||
243 | static int bma180_soft_reset(struct bma180_data *data) | 293 | static int bma180_soft_reset(struct bma180_data *data) |
244 | { | 294 | { |
245 | int ret = i2c_smbus_write_byte_data(data->client, | 295 | int ret = i2c_smbus_write_byte_data(data->client, |
246 | BMA180_RESET, BMA180_RESET_VAL); | 296 | data->part_info->softreset_reg, BMA180_RESET_VAL); |
247 | 297 | ||
248 | if (ret) | 298 | if (ret) |
249 | dev_err(&data->client->dev, "failed to reset the chip\n"); | 299 | dev_err(&data->client->dev, "failed to reset the chip\n"); |
@@ -257,57 +307,99 @@ static int bma180_chip_init(struct bma180_data *data) | |||
257 | int ret = i2c_smbus_read_byte_data(data->client, BMA180_CHIP_ID); | 307 | int ret = i2c_smbus_read_byte_data(data->client, BMA180_CHIP_ID); |
258 | 308 | ||
259 | if (ret < 0) | 309 | if (ret < 0) |
260 | goto err; | 310 | return ret; |
261 | if (ret != BMA_180_ID_REG_VAL) { | 311 | if (ret != BMA180_ID_REG_VAL) |
262 | ret = -ENODEV; | 312 | return -ENODEV; |
263 | goto err; | ||
264 | } | ||
265 | 313 | ||
266 | ret = bma180_soft_reset(data); | 314 | ret = bma180_soft_reset(data); |
267 | if (ret) | 315 | if (ret) |
268 | goto err; | 316 | return ret; |
269 | /* | 317 | /* |
270 | * No serial transaction should occur within minimum 10 us | 318 | * No serial transaction should occur within minimum 10 us |
271 | * after soft_reset command | 319 | * after soft_reset command |
272 | */ | 320 | */ |
273 | msleep(20); | 321 | msleep(20); |
274 | 322 | ||
275 | ret = bma180_set_bits(data, BMA180_CTRL_REG0, BMA180_DIS_WAKE_UP, 1); | 323 | ret = bma180_set_new_data_intr_state(data, false); |
324 | if (ret) | ||
325 | return ret; | ||
326 | |||
327 | return bma180_set_pmode(data, false); | ||
328 | } | ||
329 | |||
330 | static int bma180_chip_config(struct bma180_data *data) | ||
331 | { | ||
332 | int ret = bma180_chip_init(data); | ||
333 | |||
276 | if (ret) | 334 | if (ret) |
277 | goto err; | 335 | goto err; |
278 | ret = bma180_set_ee_writing_state(data, 1); | 336 | ret = bma180_set_bits(data, BMA180_CTRL_REG0, BMA180_DIS_WAKE_UP, 1); |
279 | if (ret) | 337 | if (ret) |
280 | goto err; | 338 | goto err; |
281 | ret = bma180_set_new_data_intr_state(data, 0); | 339 | ret = bma180_set_ee_writing_state(data, true); |
282 | if (ret) | 340 | if (ret) |
283 | goto err; | 341 | goto err; |
284 | ret = bma180_set_bits(data, BMA180_OFFSET_LSB1, BMA180_SMP_SKIP, 1); | 342 | ret = bma180_set_bits(data, BMA180_OFFSET_LSB1, BMA180_SMP_SKIP, 1); |
285 | if (ret) | 343 | if (ret) |
286 | goto err; | 344 | goto err; |
287 | ret = bma180_set_pmode(data, BMA180_DEF_PMODE); | 345 | ret = bma180_set_bw(data, 20); /* 20 Hz */ |
288 | if (ret) | 346 | if (ret) |
289 | goto err; | 347 | goto err; |
290 | ret = bma180_set_bw(data, BMA180_DEF_BW); | 348 | ret = bma180_set_scale(data, 2452); /* 2 G */ |
349 | if (ret) | ||
350 | goto err; | ||
351 | |||
352 | return 0; | ||
353 | |||
354 | err: | ||
355 | dev_err(&data->client->dev, "failed to config the chip\n"); | ||
356 | return ret; | ||
357 | } | ||
358 | |||
359 | static int bma250_chip_config(struct bma180_data *data) | ||
360 | { | ||
361 | int ret = bma180_chip_init(data); | ||
362 | |||
291 | if (ret) | 363 | if (ret) |
292 | goto err; | 364 | goto err; |
293 | ret = bma180_set_scale(data, BMA180_DEF_SCALE); | 365 | ret = bma180_set_bw(data, 16); /* 16 Hz */ |
366 | if (ret) | ||
367 | goto err; | ||
368 | ret = bma180_set_scale(data, 38344); /* 2 G */ | ||
369 | if (ret) | ||
370 | goto err; | ||
371 | ret = bma180_set_bits(data, BMA250_INT_MAP_REG, | ||
372 | BMA250_INT1_DATA_MASK, 1); | ||
294 | if (ret) | 373 | if (ret) |
295 | goto err; | 374 | goto err; |
296 | 375 | ||
297 | return 0; | 376 | return 0; |
298 | 377 | ||
299 | err: | 378 | err: |
300 | dev_err(&data->client->dev, "failed to init the chip\n"); | 379 | dev_err(&data->client->dev, "failed to config the chip\n"); |
301 | return ret; | 380 | return ret; |
302 | } | 381 | } |
303 | 382 | ||
304 | static void bma180_chip_disable(struct bma180_data *data) | 383 | static void bma180_chip_disable(struct bma180_data *data) |
305 | { | 384 | { |
306 | if (bma180_set_new_data_intr_state(data, 0)) | 385 | if (bma180_set_new_data_intr_state(data, false)) |
307 | goto err; | 386 | goto err; |
308 | if (bma180_set_ee_writing_state(data, 0)) | 387 | if (bma180_set_ee_writing_state(data, false)) |
388 | goto err; | ||
389 | if (bma180_set_sleep_state(data, true)) | ||
390 | goto err; | ||
391 | |||
392 | return; | ||
393 | |||
394 | err: | ||
395 | dev_err(&data->client->dev, "failed to disable the chip\n"); | ||
396 | } | ||
397 | |||
398 | static void bma250_chip_disable(struct bma180_data *data) | ||
399 | { | ||
400 | if (bma180_set_new_data_intr_state(data, false)) | ||
309 | goto err; | 401 | goto err; |
310 | if (bma180_set_sleep_state(data, 1)) | 402 | if (bma180_set_sleep_state(data, true)) |
311 | goto err; | 403 | goto err; |
312 | 404 | ||
313 | return; | 405 | return; |
@@ -316,13 +408,51 @@ err: | |||
316 | dev_err(&data->client->dev, "failed to disable the chip\n"); | 408 | dev_err(&data->client->dev, "failed to disable the chip\n"); |
317 | } | 409 | } |
318 | 410 | ||
319 | static IIO_CONST_ATTR(in_accel_filter_low_pass_3db_frequency_available, | 411 | static ssize_t bma180_show_avail(char *buf, const int *vals, unsigned n, |
320 | BMA180_FLP_FREQ_AVAILABLE); | 412 | bool micros) |
321 | static IIO_CONST_ATTR(in_accel_scale_available, BMA180_SCALE_AVAILABLE); | 413 | { |
414 | size_t len = 0; | ||
415 | int i; | ||
416 | |||
417 | for (i = 0; i < n; i++) { | ||
418 | if (!vals[i]) | ||
419 | continue; | ||
420 | len += scnprintf(buf + len, PAGE_SIZE - len, | ||
421 | micros ? "0.%06d " : "%d ", vals[i]); | ||
422 | } | ||
423 | buf[len - 1] = '\n'; | ||
424 | |||
425 | return len; | ||
426 | } | ||
427 | |||
428 | static ssize_t bma180_show_filter_freq_avail(struct device *dev, | ||
429 | struct device_attribute *attr, char *buf) | ||
430 | { | ||
431 | struct bma180_data *data = iio_priv(dev_to_iio_dev(dev)); | ||
432 | |||
433 | return bma180_show_avail(buf, data->part_info->bw_table, | ||
434 | data->part_info->num_bw, false); | ||
435 | } | ||
436 | |||
437 | static ssize_t bma180_show_scale_avail(struct device *dev, | ||
438 | struct device_attribute *attr, char *buf) | ||
439 | { | ||
440 | struct bma180_data *data = iio_priv(dev_to_iio_dev(dev)); | ||
441 | |||
442 | return bma180_show_avail(buf, data->part_info->scale_table, | ||
443 | data->part_info->num_scales, true); | ||
444 | } | ||
445 | |||
446 | static IIO_DEVICE_ATTR(in_accel_filter_low_pass_3db_frequency_available, | ||
447 | S_IRUGO, bma180_show_filter_freq_avail, NULL, 0); | ||
448 | |||
449 | static IIO_DEVICE_ATTR(in_accel_scale_available, | ||
450 | S_IRUGO, bma180_show_scale_avail, NULL, 0); | ||
322 | 451 | ||
323 | static struct attribute *bma180_attributes[] = { | 452 | static struct attribute *bma180_attributes[] = { |
324 | &iio_const_attr_in_accel_filter_low_pass_3db_frequency_available.dev_attr.attr, | 453 | &iio_dev_attr_in_accel_filter_low_pass_3db_frequency_available. |
325 | &iio_const_attr_in_accel_scale_available.dev_attr.attr, | 454 | dev_attr.attr, |
455 | &iio_dev_attr_in_accel_scale_available.dev_attr.attr, | ||
326 | NULL, | 456 | NULL, |
327 | }; | 457 | }; |
328 | 458 | ||
@@ -340,22 +470,35 @@ static int bma180_read_raw(struct iio_dev *indio_dev, | |||
340 | switch (mask) { | 470 | switch (mask) { |
341 | case IIO_CHAN_INFO_RAW: | 471 | case IIO_CHAN_INFO_RAW: |
342 | mutex_lock(&data->mutex); | 472 | mutex_lock(&data->mutex); |
343 | if (iio_buffer_enabled(indio_dev)) | 473 | if (iio_buffer_enabled(indio_dev)) { |
344 | ret = -EBUSY; | 474 | mutex_unlock(&data->mutex); |
345 | else | 475 | return -EBUSY; |
346 | ret = bma180_get_acc_reg(data, chan->scan_index); | 476 | } |
477 | ret = bma180_get_data_reg(data, chan->scan_index); | ||
347 | mutex_unlock(&data->mutex); | 478 | mutex_unlock(&data->mutex); |
348 | if (ret < 0) | 479 | if (ret < 0) |
349 | return ret; | 480 | return ret; |
350 | *val = (s16)ret >> chan->scan_type.shift; | 481 | *val = sign_extend32(ret >> chan->scan_type.shift, |
482 | chan->scan_type.realbits - 1); | ||
351 | return IIO_VAL_INT; | 483 | return IIO_VAL_INT; |
352 | case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: | 484 | case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: |
353 | *val = data->bw; | 485 | *val = data->bw; |
354 | return IIO_VAL_INT; | 486 | return IIO_VAL_INT; |
355 | case IIO_CHAN_INFO_SCALE: | 487 | case IIO_CHAN_INFO_SCALE: |
356 | *val = 0; | 488 | switch (chan->type) { |
357 | *val2 = data->scale; | 489 | case IIO_ACCEL: |
358 | return IIO_VAL_INT_PLUS_MICRO; | 490 | *val = 0; |
491 | *val2 = data->scale; | ||
492 | return IIO_VAL_INT_PLUS_MICRO; | ||
493 | case IIO_TEMP: | ||
494 | *val = 500; | ||
495 | return IIO_VAL_INT; | ||
496 | default: | ||
497 | return -EINVAL; | ||
498 | } | ||
499 | case IIO_CHAN_INFO_OFFSET: | ||
500 | *val = 48; /* 0 LSB @ 24 degree C */ | ||
501 | return IIO_VAL_INT; | ||
359 | default: | 502 | default: |
360 | return -EINVAL; | 503 | return -EINVAL; |
361 | } | 504 | } |
@@ -387,33 +530,14 @@ static int bma180_write_raw(struct iio_dev *indio_dev, | |||
387 | } | 530 | } |
388 | } | 531 | } |
389 | 532 | ||
390 | static int bma180_update_scan_mode(struct iio_dev *indio_dev, | ||
391 | const unsigned long *scan_mask) | ||
392 | { | ||
393 | struct bma180_data *data = iio_priv(indio_dev); | ||
394 | |||
395 | if (data->buff) | ||
396 | devm_kfree(&indio_dev->dev, data->buff); | ||
397 | data->buff = devm_kzalloc(&indio_dev->dev, | ||
398 | indio_dev->scan_bytes, GFP_KERNEL); | ||
399 | if (!data->buff) | ||
400 | return -ENOMEM; | ||
401 | |||
402 | return 0; | ||
403 | } | ||
404 | |||
405 | static const struct iio_info bma180_info = { | 533 | static const struct iio_info bma180_info = { |
406 | .attrs = &bma180_attrs_group, | 534 | .attrs = &bma180_attrs_group, |
407 | .read_raw = bma180_read_raw, | 535 | .read_raw = bma180_read_raw, |
408 | .write_raw = bma180_write_raw, | 536 | .write_raw = bma180_write_raw, |
409 | .update_scan_mode = bma180_update_scan_mode, | ||
410 | .driver_module = THIS_MODULE, | 537 | .driver_module = THIS_MODULE, |
411 | }; | 538 | }; |
412 | 539 | ||
413 | static const char * const bma180_power_modes[] = { | 540 | static const char * const bma180_power_modes[] = { "low_noise", "low_power" }; |
414 | BMA180_LOW_NOISE_STR, | ||
415 | BMA180_LOW_POWER_STR, | ||
416 | }; | ||
417 | 541 | ||
418 | static int bma180_get_power_mode(struct iio_dev *indio_dev, | 542 | static int bma180_get_power_mode(struct iio_dev *indio_dev, |
419 | const struct iio_chan_spec *chan) | 543 | const struct iio_chan_spec *chan) |
@@ -449,7 +573,7 @@ static const struct iio_chan_spec_ext_info bma180_ext_info[] = { | |||
449 | { }, | 573 | { }, |
450 | }; | 574 | }; |
451 | 575 | ||
452 | #define BMA180_CHANNEL(_axis) { \ | 576 | #define BMA180_ACC_CHANNEL(_axis, _bits) { \ |
453 | .type = IIO_ACCEL, \ | 577 | .type = IIO_ACCEL, \ |
454 | .modified = 1, \ | 578 | .modified = 1, \ |
455 | .channel2 = IIO_MOD_##_axis, \ | 579 | .channel2 = IIO_MOD_##_axis, \ |
@@ -459,18 +583,70 @@ static const struct iio_chan_spec_ext_info bma180_ext_info[] = { | |||
459 | .scan_index = AXIS_##_axis, \ | 583 | .scan_index = AXIS_##_axis, \ |
460 | .scan_type = { \ | 584 | .scan_type = { \ |
461 | .sign = 's', \ | 585 | .sign = 's', \ |
462 | .realbits = 14, \ | 586 | .realbits = _bits, \ |
463 | .storagebits = 16, \ | 587 | .storagebits = 16, \ |
464 | .shift = 2, \ | 588 | .shift = 16 - _bits, \ |
465 | }, \ | 589 | }, \ |
466 | .ext_info = bma180_ext_info, \ | 590 | .ext_info = bma180_ext_info, \ |
467 | } | 591 | } |
468 | 592 | ||
593 | #define BMA180_TEMP_CHANNEL { \ | ||
594 | .type = IIO_TEMP, \ | ||
595 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ | ||
596 | BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_OFFSET), \ | ||
597 | .scan_index = TEMP, \ | ||
598 | .scan_type = { \ | ||
599 | .sign = 's', \ | ||
600 | .realbits = 8, \ | ||
601 | .storagebits = 16, \ | ||
602 | }, \ | ||
603 | } | ||
604 | |||
469 | static const struct iio_chan_spec bma180_channels[] = { | 605 | static const struct iio_chan_spec bma180_channels[] = { |
470 | BMA180_CHANNEL(X), | 606 | BMA180_ACC_CHANNEL(X, 14), |
471 | BMA180_CHANNEL(Y), | 607 | BMA180_ACC_CHANNEL(Y, 14), |
472 | BMA180_CHANNEL(Z), | 608 | BMA180_ACC_CHANNEL(Z, 14), |
473 | IIO_CHAN_SOFT_TIMESTAMP(3), | 609 | BMA180_TEMP_CHANNEL, |
610 | IIO_CHAN_SOFT_TIMESTAMP(4), | ||
611 | }; | ||
612 | |||
613 | static const struct iio_chan_spec bma250_channels[] = { | ||
614 | BMA180_ACC_CHANNEL(X, 10), | ||
615 | BMA180_ACC_CHANNEL(Y, 10), | ||
616 | BMA180_ACC_CHANNEL(Z, 10), | ||
617 | BMA180_TEMP_CHANNEL, | ||
618 | IIO_CHAN_SOFT_TIMESTAMP(4), | ||
619 | }; | ||
620 | |||
621 | static const struct bma180_part_info bma180_part_info[] = { | ||
622 | [BMA180] = { | ||
623 | bma180_channels, ARRAY_SIZE(bma180_channels), | ||
624 | bma180_scale_table, ARRAY_SIZE(bma180_scale_table), | ||
625 | bma180_bw_table, ARRAY_SIZE(bma180_bw_table), | ||
626 | BMA180_CTRL_REG0, BMA180_RESET_INT, | ||
627 | BMA180_CTRL_REG0, BMA180_SLEEP, | ||
628 | BMA180_BW_TCS, BMA180_BW, | ||
629 | BMA180_OFFSET_LSB1, BMA180_RANGE, | ||
630 | BMA180_TCO_Z, BMA180_MODE_CONFIG, BMA180_LOW_POWER, | ||
631 | BMA180_CTRL_REG3, BMA180_NEW_DATA_INT, | ||
632 | BMA180_RESET, | ||
633 | bma180_chip_config, | ||
634 | bma180_chip_disable, | ||
635 | }, | ||
636 | [BMA250] = { | ||
637 | bma250_channels, ARRAY_SIZE(bma250_channels), | ||
638 | bma250_scale_table, ARRAY_SIZE(bma250_scale_table), | ||
639 | bma250_bw_table, ARRAY_SIZE(bma250_bw_table), | ||
640 | BMA250_INT_RESET_REG, BMA250_INT_RESET_MASK, | ||
641 | BMA250_POWER_REG, BMA250_SUSPEND_MASK, | ||
642 | BMA250_BW_REG, BMA250_BW_MASK, | ||
643 | BMA250_RANGE_REG, BMA250_RANGE_MASK, | ||
644 | BMA250_POWER_REG, BMA250_LOWPOWER_MASK, 1, | ||
645 | BMA250_INT_ENABLE_REG, BMA250_DATA_INTEN_MASK, | ||
646 | BMA250_RESET_REG, | ||
647 | bma250_chip_config, | ||
648 | bma250_chip_disable, | ||
649 | }, | ||
474 | }; | 650 | }; |
475 | 651 | ||
476 | static irqreturn_t bma180_trigger_handler(int irq, void *p) | 652 | static irqreturn_t bma180_trigger_handler(int irq, void *p) |
@@ -485,13 +661,14 @@ static irqreturn_t bma180_trigger_handler(int irq, void *p) | |||
485 | 661 | ||
486 | for_each_set_bit(bit, indio_dev->buffer->scan_mask, | 662 | for_each_set_bit(bit, indio_dev->buffer->scan_mask, |
487 | indio_dev->masklength) { | 663 | indio_dev->masklength) { |
488 | ret = bma180_get_acc_reg(data, bit); | 664 | ret = bma180_get_data_reg(data, bit); |
489 | if (ret < 0) { | 665 | if (ret < 0) { |
490 | mutex_unlock(&data->mutex); | 666 | mutex_unlock(&data->mutex); |
491 | goto err; | 667 | goto err; |
492 | } | 668 | } |
493 | ((s16 *)data->buff)[i++] = ret; | 669 | ((s16 *)data->buff)[i++] = ret; |
494 | } | 670 | } |
671 | |||
495 | mutex_unlock(&data->mutex); | 672 | mutex_unlock(&data->mutex); |
496 | 673 | ||
497 | iio_push_to_buffers_with_timestamp(indio_dev, data->buff, time_ns); | 674 | iio_push_to_buffers_with_timestamp(indio_dev, data->buff, time_ns); |
@@ -529,7 +706,6 @@ static int bma180_probe(struct i2c_client *client, | |||
529 | { | 706 | { |
530 | struct bma180_data *data; | 707 | struct bma180_data *data; |
531 | struct iio_dev *indio_dev; | 708 | struct iio_dev *indio_dev; |
532 | struct iio_trigger *trig; | ||
533 | int ret; | 709 | int ret; |
534 | 710 | ||
535 | indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); | 711 | indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); |
@@ -539,43 +715,45 @@ static int bma180_probe(struct i2c_client *client, | |||
539 | data = iio_priv(indio_dev); | 715 | data = iio_priv(indio_dev); |
540 | i2c_set_clientdata(client, indio_dev); | 716 | i2c_set_clientdata(client, indio_dev); |
541 | data->client = client; | 717 | data->client = client; |
718 | data->part_info = &bma180_part_info[id->driver_data]; | ||
542 | 719 | ||
543 | ret = bma180_chip_init(data); | 720 | ret = data->part_info->chip_config(data); |
544 | if (ret < 0) | 721 | if (ret < 0) |
545 | goto err_chip_disable; | 722 | goto err_chip_disable; |
546 | 723 | ||
547 | mutex_init(&data->mutex); | 724 | mutex_init(&data->mutex); |
548 | |||
549 | indio_dev->dev.parent = &client->dev; | 725 | indio_dev->dev.parent = &client->dev; |
550 | indio_dev->channels = bma180_channels; | 726 | indio_dev->channels = data->part_info->channels; |
551 | indio_dev->num_channels = ARRAY_SIZE(bma180_channels); | 727 | indio_dev->num_channels = data->part_info->num_channels; |
552 | indio_dev->name = BMA180_DRV_NAME; | 728 | indio_dev->name = id->name; |
553 | indio_dev->modes = INDIO_DIRECT_MODE; | 729 | indio_dev->modes = INDIO_DIRECT_MODE; |
554 | indio_dev->info = &bma180_info; | 730 | indio_dev->info = &bma180_info; |
555 | 731 | ||
556 | trig = iio_trigger_alloc("%s-dev%d", indio_dev->name, indio_dev->id); | 732 | if (client->irq > 0) { |
557 | if (!trig) { | 733 | data->trig = iio_trigger_alloc("%s-dev%d", indio_dev->name, |
558 | ret = -ENOMEM; | 734 | indio_dev->id); |
559 | goto err_chip_disable; | 735 | if (!data->trig) { |
560 | } | 736 | ret = -ENOMEM; |
737 | goto err_chip_disable; | ||
738 | } | ||
561 | 739 | ||
562 | ret = devm_request_irq(&client->dev, client->irq, | 740 | ret = devm_request_irq(&client->dev, client->irq, |
563 | iio_trigger_generic_data_rdy_poll, | 741 | iio_trigger_generic_data_rdy_poll, IRQF_TRIGGER_RISING, |
564 | IRQF_TRIGGER_RISING, BMA180_IRQ_NAME, trig); | 742 | "bma180_event", data->trig); |
565 | if (ret) { | 743 | if (ret) { |
566 | dev_err(&client->dev, "unable to request IRQ\n"); | 744 | dev_err(&client->dev, "unable to request IRQ\n"); |
567 | goto err_trigger_free; | 745 | goto err_trigger_free; |
568 | } | 746 | } |
569 | 747 | ||
570 | trig->dev.parent = &client->dev; | 748 | data->trig->dev.parent = &client->dev; |
571 | trig->ops = &bma180_trigger_ops; | 749 | data->trig->ops = &bma180_trigger_ops; |
572 | iio_trigger_set_drvdata(trig, indio_dev); | 750 | iio_trigger_set_drvdata(data->trig, indio_dev); |
573 | data->trig = trig; | 751 | indio_dev->trig = iio_trigger_get(data->trig); |
574 | indio_dev->trig = iio_trigger_get(trig); | ||
575 | 752 | ||
576 | ret = iio_trigger_register(trig); | 753 | ret = iio_trigger_register(data->trig); |
577 | if (ret) | 754 | if (ret) |
578 | goto err_trigger_free; | 755 | goto err_trigger_free; |
756 | } | ||
579 | 757 | ||
580 | ret = iio_triggered_buffer_setup(indio_dev, NULL, | 758 | ret = iio_triggered_buffer_setup(indio_dev, NULL, |
581 | bma180_trigger_handler, NULL); | 759 | bma180_trigger_handler, NULL); |
@@ -595,11 +773,12 @@ static int bma180_probe(struct i2c_client *client, | |||
595 | err_buffer_cleanup: | 773 | err_buffer_cleanup: |
596 | iio_triggered_buffer_cleanup(indio_dev); | 774 | iio_triggered_buffer_cleanup(indio_dev); |
597 | err_trigger_unregister: | 775 | err_trigger_unregister: |
598 | iio_trigger_unregister(trig); | 776 | if (data->trig) |
777 | iio_trigger_unregister(data->trig); | ||
599 | err_trigger_free: | 778 | err_trigger_free: |
600 | iio_trigger_free(trig); | 779 | iio_trigger_free(data->trig); |
601 | err_chip_disable: | 780 | err_chip_disable: |
602 | bma180_chip_disable(data); | 781 | data->part_info->chip_disable(data); |
603 | 782 | ||
604 | return ret; | 783 | return ret; |
605 | } | 784 | } |
@@ -611,11 +790,13 @@ static int bma180_remove(struct i2c_client *client) | |||
611 | 790 | ||
612 | iio_device_unregister(indio_dev); | 791 | iio_device_unregister(indio_dev); |
613 | iio_triggered_buffer_cleanup(indio_dev); | 792 | iio_triggered_buffer_cleanup(indio_dev); |
614 | iio_trigger_unregister(data->trig); | 793 | if (data->trig) { |
615 | iio_trigger_free(data->trig); | 794 | iio_trigger_unregister(data->trig); |
795 | iio_trigger_free(data->trig); | ||
796 | } | ||
616 | 797 | ||
617 | mutex_lock(&data->mutex); | 798 | mutex_lock(&data->mutex); |
618 | bma180_chip_disable(data); | 799 | data->part_info->chip_disable(data); |
619 | mutex_unlock(&data->mutex); | 800 | mutex_unlock(&data->mutex); |
620 | 801 | ||
621 | return 0; | 802 | return 0; |
@@ -629,7 +810,7 @@ static int bma180_suspend(struct device *dev) | |||
629 | int ret; | 810 | int ret; |
630 | 811 | ||
631 | mutex_lock(&data->mutex); | 812 | mutex_lock(&data->mutex); |
632 | ret = bma180_set_sleep_state(data, 1); | 813 | ret = bma180_set_sleep_state(data, true); |
633 | mutex_unlock(&data->mutex); | 814 | mutex_unlock(&data->mutex); |
634 | 815 | ||
635 | return ret; | 816 | return ret; |
@@ -642,7 +823,7 @@ static int bma180_resume(struct device *dev) | |||
642 | int ret; | 823 | int ret; |
643 | 824 | ||
644 | mutex_lock(&data->mutex); | 825 | mutex_lock(&data->mutex); |
645 | ret = bma180_set_sleep_state(data, 0); | 826 | ret = bma180_set_sleep_state(data, false); |
646 | mutex_unlock(&data->mutex); | 827 | mutex_unlock(&data->mutex); |
647 | 828 | ||
648 | return ret; | 829 | return ret; |
@@ -654,27 +835,28 @@ static SIMPLE_DEV_PM_OPS(bma180_pm_ops, bma180_suspend, bma180_resume); | |||
654 | #define BMA180_PM_OPS NULL | 835 | #define BMA180_PM_OPS NULL |
655 | #endif | 836 | #endif |
656 | 837 | ||
657 | static struct i2c_device_id bma180_id[] = { | 838 | static struct i2c_device_id bma180_ids[] = { |
658 | { BMA180_DRV_NAME, 0 }, | 839 | { "bma180", BMA180 }, |
840 | { "bma250", BMA250 }, | ||
659 | { } | 841 | { } |
660 | }; | 842 | }; |
661 | 843 | ||
662 | MODULE_DEVICE_TABLE(i2c, bma180_id); | 844 | MODULE_DEVICE_TABLE(i2c, bma180_ids); |
663 | 845 | ||
664 | static struct i2c_driver bma180_driver = { | 846 | static struct i2c_driver bma180_driver = { |
665 | .driver = { | 847 | .driver = { |
666 | .name = BMA180_DRV_NAME, | 848 | .name = "bma180", |
667 | .owner = THIS_MODULE, | 849 | .owner = THIS_MODULE, |
668 | .pm = BMA180_PM_OPS, | 850 | .pm = BMA180_PM_OPS, |
669 | }, | 851 | }, |
670 | .probe = bma180_probe, | 852 | .probe = bma180_probe, |
671 | .remove = bma180_remove, | 853 | .remove = bma180_remove, |
672 | .id_table = bma180_id, | 854 | .id_table = bma180_ids, |
673 | }; | 855 | }; |
674 | 856 | ||
675 | module_i2c_driver(bma180_driver); | 857 | module_i2c_driver(bma180_driver); |
676 | 858 | ||
677 | MODULE_AUTHOR("Kravchenko Oleksandr <x0199363@ti.com>"); | 859 | MODULE_AUTHOR("Kravchenko Oleksandr <x0199363@ti.com>"); |
678 | MODULE_AUTHOR("Texas Instruments, Inc."); | 860 | MODULE_AUTHOR("Texas Instruments, Inc."); |
679 | MODULE_DESCRIPTION("Bosch BMA180 triaxial acceleration sensor"); | 861 | MODULE_DESCRIPTION("Bosch BMA180/BMA250 triaxial acceleration sensor"); |
680 | MODULE_LICENSE("GPL"); | 862 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/iio/accel/bmc150-accel.c b/drivers/iio/accel/bmc150-accel.c new file mode 100644 index 000000000000..066d0c04072c --- /dev/null +++ b/drivers/iio/accel/bmc150-accel.c | |||
@@ -0,0 +1,1456 @@ | |||
1 | /* | ||
2 | * 3-axis accelerometer driver supporting following Bosch-Sensortec chips: | ||
3 | * - BMC150 | ||
4 | * - BMI055 | ||
5 | * - BMA255 | ||
6 | * - BMA250E | ||
7 | * - BMA222E | ||
8 | * - BMA280 | ||
9 | * | ||
10 | * Copyright (c) 2014, Intel Corporation. | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or modify it | ||
13 | * under the terms and conditions of the GNU General Public License, | ||
14 | * version 2, as published by the Free Software Foundation. | ||
15 | * | ||
16 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
17 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
18 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
19 | * more details. | ||
20 | */ | ||
21 | |||
22 | #include <linux/module.h> | ||
23 | #include <linux/i2c.h> | ||
24 | #include <linux/interrupt.h> | ||
25 | #include <linux/delay.h> | ||
26 | #include <linux/slab.h> | ||
27 | #include <linux/acpi.h> | ||
28 | #include <linux/gpio/consumer.h> | ||
29 | #include <linux/pm.h> | ||
30 | #include <linux/pm_runtime.h> | ||
31 | #include <linux/iio/iio.h> | ||
32 | #include <linux/iio/sysfs.h> | ||
33 | #include <linux/iio/buffer.h> | ||
34 | #include <linux/iio/events.h> | ||
35 | #include <linux/iio/trigger.h> | ||
36 | #include <linux/iio/trigger_consumer.h> | ||
37 | #include <linux/iio/triggered_buffer.h> | ||
38 | |||
39 | #define BMC150_ACCEL_DRV_NAME "bmc150_accel" | ||
40 | #define BMC150_ACCEL_IRQ_NAME "bmc150_accel_event" | ||
41 | #define BMC150_ACCEL_GPIO_NAME "bmc150_accel_int" | ||
42 | |||
43 | #define BMC150_ACCEL_REG_CHIP_ID 0x00 | ||
44 | |||
45 | #define BMC150_ACCEL_REG_INT_STATUS_2 0x0B | ||
46 | #define BMC150_ACCEL_ANY_MOTION_MASK 0x07 | ||
47 | #define BMC150_ACCEL_ANY_MOTION_BIT_X BIT(0) | ||
48 | #define BMC150_ACCEL_ANY_MOTION_BIT_Y BIT(1) | ||
49 | #define BMC150_ACCEL_ANY_MOTION_BIT_Z BIT(2) | ||
50 | #define BMC150_ACCEL_ANY_MOTION_BIT_SIGN BIT(3) | ||
51 | |||
52 | #define BMC150_ACCEL_REG_PMU_LPW 0x11 | ||
53 | #define BMC150_ACCEL_PMU_MODE_MASK 0xE0 | ||
54 | #define BMC150_ACCEL_PMU_MODE_SHIFT 5 | ||
55 | #define BMC150_ACCEL_PMU_BIT_SLEEP_DUR_MASK 0x17 | ||
56 | #define BMC150_ACCEL_PMU_BIT_SLEEP_DUR_SHIFT 1 | ||
57 | |||
58 | #define BMC150_ACCEL_REG_PMU_RANGE 0x0F | ||
59 | |||
60 | #define BMC150_ACCEL_DEF_RANGE_2G 0x03 | ||
61 | #define BMC150_ACCEL_DEF_RANGE_4G 0x05 | ||
62 | #define BMC150_ACCEL_DEF_RANGE_8G 0x08 | ||
63 | #define BMC150_ACCEL_DEF_RANGE_16G 0x0C | ||
64 | |||
65 | /* Default BW: 125Hz */ | ||
66 | #define BMC150_ACCEL_REG_PMU_BW 0x10 | ||
67 | #define BMC150_ACCEL_DEF_BW 125 | ||
68 | |||
69 | #define BMC150_ACCEL_REG_INT_MAP_0 0x19 | ||
70 | #define BMC150_ACCEL_INT_MAP_0_BIT_SLOPE BIT(2) | ||
71 | |||
72 | #define BMC150_ACCEL_REG_INT_MAP_1 0x1A | ||
73 | #define BMC150_ACCEL_INT_MAP_1_BIT_DATA BIT(0) | ||
74 | |||
75 | #define BMC150_ACCEL_REG_INT_RST_LATCH 0x21 | ||
76 | #define BMC150_ACCEL_INT_MODE_LATCH_RESET 0x80 | ||
77 | #define BMC150_ACCEL_INT_MODE_LATCH_INT 0x0F | ||
78 | #define BMC150_ACCEL_INT_MODE_NON_LATCH_INT 0x00 | ||
79 | |||
80 | #define BMC150_ACCEL_REG_INT_EN_0 0x16 | ||
81 | #define BMC150_ACCEL_INT_EN_BIT_SLP_X BIT(0) | ||
82 | #define BMC150_ACCEL_INT_EN_BIT_SLP_Y BIT(1) | ||
83 | #define BMC150_ACCEL_INT_EN_BIT_SLP_Z BIT(2) | ||
84 | |||
85 | #define BMC150_ACCEL_REG_INT_EN_1 0x17 | ||
86 | #define BMC150_ACCEL_INT_EN_BIT_DATA_EN BIT(4) | ||
87 | |||
88 | #define BMC150_ACCEL_REG_INT_OUT_CTRL 0x20 | ||
89 | #define BMC150_ACCEL_INT_OUT_CTRL_INT1_LVL BIT(0) | ||
90 | |||
91 | #define BMC150_ACCEL_REG_INT_5 0x27 | ||
92 | #define BMC150_ACCEL_SLOPE_DUR_MASK 0x03 | ||
93 | |||
94 | #define BMC150_ACCEL_REG_INT_6 0x28 | ||
95 | #define BMC150_ACCEL_SLOPE_THRES_MASK 0xFF | ||
96 | |||
97 | /* Slope duration in terms of number of samples */ | ||
98 | #define BMC150_ACCEL_DEF_SLOPE_DURATION 1 | ||
99 | /* in terms of multiples of g's/LSB, based on range */ | ||
100 | #define BMC150_ACCEL_DEF_SLOPE_THRESHOLD 1 | ||
101 | |||
102 | #define BMC150_ACCEL_REG_XOUT_L 0x02 | ||
103 | |||
104 | #define BMC150_ACCEL_MAX_STARTUP_TIME_MS 100 | ||
105 | |||
106 | /* Sleep Duration values */ | ||
107 | #define BMC150_ACCEL_SLEEP_500_MICRO 0x05 | ||
108 | #define BMC150_ACCEL_SLEEP_1_MS 0x06 | ||
109 | #define BMC150_ACCEL_SLEEP_2_MS 0x07 | ||
110 | #define BMC150_ACCEL_SLEEP_4_MS 0x08 | ||
111 | #define BMC150_ACCEL_SLEEP_6_MS 0x09 | ||
112 | #define BMC150_ACCEL_SLEEP_10_MS 0x0A | ||
113 | #define BMC150_ACCEL_SLEEP_25_MS 0x0B | ||
114 | #define BMC150_ACCEL_SLEEP_50_MS 0x0C | ||
115 | #define BMC150_ACCEL_SLEEP_100_MS 0x0D | ||
116 | #define BMC150_ACCEL_SLEEP_500_MS 0x0E | ||
117 | #define BMC150_ACCEL_SLEEP_1_SEC 0x0F | ||
118 | |||
119 | #define BMC150_ACCEL_REG_TEMP 0x08 | ||
120 | #define BMC150_ACCEL_TEMP_CENTER_VAL 24 | ||
121 | |||
122 | #define BMC150_ACCEL_AXIS_TO_REG(axis) (BMC150_ACCEL_REG_XOUT_L + (axis * 2)) | ||
123 | #define BMC150_AUTO_SUSPEND_DELAY_MS 2000 | ||
124 | |||
125 | enum bmc150_accel_axis { | ||
126 | AXIS_X, | ||
127 | AXIS_Y, | ||
128 | AXIS_Z, | ||
129 | }; | ||
130 | |||
131 | enum bmc150_power_modes { | ||
132 | BMC150_ACCEL_SLEEP_MODE_NORMAL, | ||
133 | BMC150_ACCEL_SLEEP_MODE_DEEP_SUSPEND, | ||
134 | BMC150_ACCEL_SLEEP_MODE_LPM, | ||
135 | BMC150_ACCEL_SLEEP_MODE_SUSPEND = 0x04, | ||
136 | }; | ||
137 | |||
138 | struct bmc150_scale_info { | ||
139 | int scale; | ||
140 | u8 reg_range; | ||
141 | }; | ||
142 | |||
143 | struct bmc150_accel_chip_info { | ||
144 | u8 chip_id; | ||
145 | const struct iio_chan_spec *channels; | ||
146 | int num_channels; | ||
147 | const struct bmc150_scale_info scale_table[4]; | ||
148 | }; | ||
149 | |||
150 | struct bmc150_accel_data { | ||
151 | struct i2c_client *client; | ||
152 | struct iio_trigger *dready_trig; | ||
153 | struct iio_trigger *motion_trig; | ||
154 | struct mutex mutex; | ||
155 | s16 buffer[8]; | ||
156 | u8 bw_bits; | ||
157 | u32 slope_dur; | ||
158 | u32 slope_thres; | ||
159 | u32 range; | ||
160 | int ev_enable_state; | ||
161 | bool dready_trigger_on; | ||
162 | bool motion_trigger_on; | ||
163 | int64_t timestamp; | ||
164 | const struct bmc150_accel_chip_info *chip_info; | ||
165 | }; | ||
166 | |||
167 | static const struct { | ||
168 | int val; | ||
169 | int val2; | ||
170 | u8 bw_bits; | ||
171 | } bmc150_accel_samp_freq_table[] = { {7, 810000, 0x08}, | ||
172 | {15, 630000, 0x09}, | ||
173 | {31, 250000, 0x0A}, | ||
174 | {62, 500000, 0x0B}, | ||
175 | {125, 0, 0x0C}, | ||
176 | {250, 0, 0x0D}, | ||
177 | {500, 0, 0x0E}, | ||
178 | {1000, 0, 0x0F} }; | ||
179 | |||
180 | static const struct { | ||
181 | int bw_bits; | ||
182 | int msec; | ||
183 | } bmc150_accel_sample_upd_time[] = { {0x08, 64}, | ||
184 | {0x09, 32}, | ||
185 | {0x0A, 16}, | ||
186 | {0x0B, 8}, | ||
187 | {0x0C, 4}, | ||
188 | {0x0D, 2}, | ||
189 | {0x0E, 1}, | ||
190 | {0x0F, 1} }; | ||
191 | |||
192 | static const struct { | ||
193 | int sleep_dur; | ||
194 | u8 reg_value; | ||
195 | } bmc150_accel_sleep_value_table[] = { {0, 0}, | ||
196 | {500, BMC150_ACCEL_SLEEP_500_MICRO}, | ||
197 | {1000, BMC150_ACCEL_SLEEP_1_MS}, | ||
198 | {2000, BMC150_ACCEL_SLEEP_2_MS}, | ||
199 | {4000, BMC150_ACCEL_SLEEP_4_MS}, | ||
200 | {6000, BMC150_ACCEL_SLEEP_6_MS}, | ||
201 | {10000, BMC150_ACCEL_SLEEP_10_MS}, | ||
202 | {25000, BMC150_ACCEL_SLEEP_25_MS}, | ||
203 | {50000, BMC150_ACCEL_SLEEP_50_MS}, | ||
204 | {100000, BMC150_ACCEL_SLEEP_100_MS}, | ||
205 | {500000, BMC150_ACCEL_SLEEP_500_MS}, | ||
206 | {1000000, BMC150_ACCEL_SLEEP_1_SEC} }; | ||
207 | |||
208 | |||
209 | static int bmc150_accel_set_mode(struct bmc150_accel_data *data, | ||
210 | enum bmc150_power_modes mode, | ||
211 | int dur_us) | ||
212 | { | ||
213 | int i; | ||
214 | int ret; | ||
215 | u8 lpw_bits; | ||
216 | int dur_val = -1; | ||
217 | |||
218 | if (dur_us > 0) { | ||
219 | for (i = 0; i < ARRAY_SIZE(bmc150_accel_sleep_value_table); | ||
220 | ++i) { | ||
221 | if (bmc150_accel_sleep_value_table[i].sleep_dur == | ||
222 | dur_us) | ||
223 | dur_val = | ||
224 | bmc150_accel_sleep_value_table[i].reg_value; | ||
225 | } | ||
226 | } else | ||
227 | dur_val = 0; | ||
228 | |||
229 | if (dur_val < 0) | ||
230 | return -EINVAL; | ||
231 | |||
232 | lpw_bits = mode << BMC150_ACCEL_PMU_MODE_SHIFT; | ||
233 | lpw_bits |= (dur_val << BMC150_ACCEL_PMU_BIT_SLEEP_DUR_SHIFT); | ||
234 | |||
235 | dev_dbg(&data->client->dev, "Set Mode bits %x\n", lpw_bits); | ||
236 | |||
237 | ret = i2c_smbus_write_byte_data(data->client, | ||
238 | BMC150_ACCEL_REG_PMU_LPW, lpw_bits); | ||
239 | if (ret < 0) { | ||
240 | dev_err(&data->client->dev, "Error writing reg_pmu_lpw\n"); | ||
241 | return ret; | ||
242 | } | ||
243 | |||
244 | return 0; | ||
245 | } | ||
246 | |||
247 | static int bmc150_accel_set_bw(struct bmc150_accel_data *data, int val, | ||
248 | int val2) | ||
249 | { | ||
250 | int i; | ||
251 | int ret; | ||
252 | |||
253 | for (i = 0; i < ARRAY_SIZE(bmc150_accel_samp_freq_table); ++i) { | ||
254 | if (bmc150_accel_samp_freq_table[i].val == val && | ||
255 | bmc150_accel_samp_freq_table[i].val2 == val2) { | ||
256 | ret = i2c_smbus_write_byte_data( | ||
257 | data->client, | ||
258 | BMC150_ACCEL_REG_PMU_BW, | ||
259 | bmc150_accel_samp_freq_table[i].bw_bits); | ||
260 | if (ret < 0) | ||
261 | return ret; | ||
262 | |||
263 | data->bw_bits = | ||
264 | bmc150_accel_samp_freq_table[i].bw_bits; | ||
265 | return 0; | ||
266 | } | ||
267 | } | ||
268 | |||
269 | return -EINVAL; | ||
270 | } | ||
271 | |||
272 | static int bmc150_accel_chip_init(struct bmc150_accel_data *data) | ||
273 | { | ||
274 | int ret; | ||
275 | |||
276 | ret = i2c_smbus_read_byte_data(data->client, BMC150_ACCEL_REG_CHIP_ID); | ||
277 | if (ret < 0) { | ||
278 | dev_err(&data->client->dev, | ||
279 | "Error: Reading chip id\n"); | ||
280 | return ret; | ||
281 | } | ||
282 | |||
283 | dev_dbg(&data->client->dev, "Chip Id %x\n", ret); | ||
284 | if (ret != data->chip_info->chip_id) { | ||
285 | dev_err(&data->client->dev, "Invalid chip %x\n", ret); | ||
286 | return -ENODEV; | ||
287 | } | ||
288 | |||
289 | ret = bmc150_accel_set_mode(data, BMC150_ACCEL_SLEEP_MODE_NORMAL, 0); | ||
290 | if (ret < 0) | ||
291 | return ret; | ||
292 | |||
293 | /* Set Bandwidth */ | ||
294 | ret = bmc150_accel_set_bw(data, BMC150_ACCEL_DEF_BW, 0); | ||
295 | if (ret < 0) | ||
296 | return ret; | ||
297 | |||
298 | /* Set Default Range */ | ||
299 | ret = i2c_smbus_write_byte_data(data->client, | ||
300 | BMC150_ACCEL_REG_PMU_RANGE, | ||
301 | BMC150_ACCEL_DEF_RANGE_4G); | ||
302 | if (ret < 0) { | ||
303 | dev_err(&data->client->dev, | ||
304 | "Error writing reg_pmu_range\n"); | ||
305 | return ret; | ||
306 | } | ||
307 | |||
308 | data->range = BMC150_ACCEL_DEF_RANGE_4G; | ||
309 | |||
310 | /* Set default slope duration */ | ||
311 | ret = i2c_smbus_read_byte_data(data->client, BMC150_ACCEL_REG_INT_5); | ||
312 | if (ret < 0) { | ||
313 | dev_err(&data->client->dev, "Error reading reg_int_5\n"); | ||
314 | return ret; | ||
315 | } | ||
316 | data->slope_dur |= BMC150_ACCEL_DEF_SLOPE_DURATION; | ||
317 | ret = i2c_smbus_write_byte_data(data->client, | ||
318 | BMC150_ACCEL_REG_INT_5, | ||
319 | data->slope_dur); | ||
320 | if (ret < 0) { | ||
321 | dev_err(&data->client->dev, "Error writing reg_int_5\n"); | ||
322 | return ret; | ||
323 | } | ||
324 | dev_dbg(&data->client->dev, "slope_dur %x\n", data->slope_dur); | ||
325 | |||
326 | /* Set default slope thresholds */ | ||
327 | ret = i2c_smbus_write_byte_data(data->client, | ||
328 | BMC150_ACCEL_REG_INT_6, | ||
329 | BMC150_ACCEL_DEF_SLOPE_THRESHOLD); | ||
330 | if (ret < 0) { | ||
331 | dev_err(&data->client->dev, "Error writing reg_int_6\n"); | ||
332 | return ret; | ||
333 | } | ||
334 | data->slope_thres = BMC150_ACCEL_DEF_SLOPE_THRESHOLD; | ||
335 | dev_dbg(&data->client->dev, "slope_thres %x\n", data->slope_thres); | ||
336 | |||
337 | /* Set default as latched interrupts */ | ||
338 | ret = i2c_smbus_write_byte_data(data->client, | ||
339 | BMC150_ACCEL_REG_INT_RST_LATCH, | ||
340 | BMC150_ACCEL_INT_MODE_LATCH_INT | | ||
341 | BMC150_ACCEL_INT_MODE_LATCH_RESET); | ||
342 | if (ret < 0) { | ||
343 | dev_err(&data->client->dev, | ||
344 | "Error writing reg_int_rst_latch\n"); | ||
345 | return ret; | ||
346 | } | ||
347 | |||
348 | return 0; | ||
349 | } | ||
350 | |||
351 | static int bmc150_accel_setup_any_motion_interrupt( | ||
352 | struct bmc150_accel_data *data, | ||
353 | bool status) | ||
354 | { | ||
355 | int ret; | ||
356 | |||
357 | /* Enable/Disable INT1 mapping */ | ||
358 | ret = i2c_smbus_read_byte_data(data->client, | ||
359 | BMC150_ACCEL_REG_INT_MAP_0); | ||
360 | if (ret < 0) { | ||
361 | dev_err(&data->client->dev, "Error reading reg_int_map_0\n"); | ||
362 | return ret; | ||
363 | } | ||
364 | if (status) | ||
365 | ret |= BMC150_ACCEL_INT_MAP_0_BIT_SLOPE; | ||
366 | else | ||
367 | ret &= ~BMC150_ACCEL_INT_MAP_0_BIT_SLOPE; | ||
368 | |||
369 | ret = i2c_smbus_write_byte_data(data->client, | ||
370 | BMC150_ACCEL_REG_INT_MAP_0, | ||
371 | ret); | ||
372 | if (ret < 0) { | ||
373 | dev_err(&data->client->dev, "Error writing reg_int_map_0\n"); | ||
374 | return ret; | ||
375 | } | ||
376 | |||
377 | if (status) { | ||
378 | /* Set slope duration (no of samples) */ | ||
379 | ret = i2c_smbus_write_byte_data(data->client, | ||
380 | BMC150_ACCEL_REG_INT_5, | ||
381 | data->slope_dur); | ||
382 | if (ret < 0) { | ||
383 | dev_err(&data->client->dev, "Error write reg_int_5\n"); | ||
384 | return ret; | ||
385 | } | ||
386 | |||
387 | /* Set slope thresholds */ | ||
388 | ret = i2c_smbus_write_byte_data(data->client, | ||
389 | BMC150_ACCEL_REG_INT_6, | ||
390 | data->slope_thres); | ||
391 | if (ret < 0) { | ||
392 | dev_err(&data->client->dev, "Error write reg_int_6\n"); | ||
393 | return ret; | ||
394 | } | ||
395 | |||
396 | /* | ||
397 | * New data interrupt is always non-latched, | ||
398 | * which will have higher priority, so no need | ||
399 | * to set latched mode, we will be flooded anyway with INTR | ||
400 | */ | ||
401 | if (!data->dready_trigger_on) { | ||
402 | ret = i2c_smbus_write_byte_data(data->client, | ||
403 | BMC150_ACCEL_REG_INT_RST_LATCH, | ||
404 | BMC150_ACCEL_INT_MODE_LATCH_INT | | ||
405 | BMC150_ACCEL_INT_MODE_LATCH_RESET); | ||
406 | if (ret < 0) { | ||
407 | dev_err(&data->client->dev, | ||
408 | "Error writing reg_int_rst_latch\n"); | ||
409 | return ret; | ||
410 | } | ||
411 | } | ||
412 | |||
413 | ret = i2c_smbus_write_byte_data(data->client, | ||
414 | BMC150_ACCEL_REG_INT_EN_0, | ||
415 | BMC150_ACCEL_INT_EN_BIT_SLP_X | | ||
416 | BMC150_ACCEL_INT_EN_BIT_SLP_Y | | ||
417 | BMC150_ACCEL_INT_EN_BIT_SLP_Z); | ||
418 | } else | ||
419 | ret = i2c_smbus_write_byte_data(data->client, | ||
420 | BMC150_ACCEL_REG_INT_EN_0, | ||
421 | 0); | ||
422 | |||
423 | if (ret < 0) { | ||
424 | dev_err(&data->client->dev, "Error writing reg_int_en_0\n"); | ||
425 | return ret; | ||
426 | } | ||
427 | |||
428 | return 0; | ||
429 | } | ||
430 | |||
431 | static int bmc150_accel_setup_new_data_interrupt(struct bmc150_accel_data *data, | ||
432 | bool status) | ||
433 | { | ||
434 | int ret; | ||
435 | |||
436 | /* Enable/Disable INT1 mapping */ | ||
437 | ret = i2c_smbus_read_byte_data(data->client, | ||
438 | BMC150_ACCEL_REG_INT_MAP_1); | ||
439 | if (ret < 0) { | ||
440 | dev_err(&data->client->dev, "Error reading reg_int_map_1\n"); | ||
441 | return ret; | ||
442 | } | ||
443 | if (status) | ||
444 | ret |= BMC150_ACCEL_INT_MAP_1_BIT_DATA; | ||
445 | else | ||
446 | ret &= ~BMC150_ACCEL_INT_MAP_1_BIT_DATA; | ||
447 | |||
448 | ret = i2c_smbus_write_byte_data(data->client, | ||
449 | BMC150_ACCEL_REG_INT_MAP_1, | ||
450 | ret); | ||
451 | if (ret < 0) { | ||
452 | dev_err(&data->client->dev, "Error writing reg_int_map_1\n"); | ||
453 | return ret; | ||
454 | } | ||
455 | |||
456 | if (status) { | ||
457 | /* | ||
458 | * Set non latched mode interrupt and clear any latched | ||
459 | * interrupt | ||
460 | */ | ||
461 | ret = i2c_smbus_write_byte_data(data->client, | ||
462 | BMC150_ACCEL_REG_INT_RST_LATCH, | ||
463 | BMC150_ACCEL_INT_MODE_NON_LATCH_INT | | ||
464 | BMC150_ACCEL_INT_MODE_LATCH_RESET); | ||
465 | if (ret < 0) { | ||
466 | dev_err(&data->client->dev, | ||
467 | "Error writing reg_int_rst_latch\n"); | ||
468 | return ret; | ||
469 | } | ||
470 | |||
471 | ret = i2c_smbus_write_byte_data(data->client, | ||
472 | BMC150_ACCEL_REG_INT_EN_1, | ||
473 | BMC150_ACCEL_INT_EN_BIT_DATA_EN); | ||
474 | |||
475 | } else { | ||
476 | /* Restore default interrupt mode */ | ||
477 | ret = i2c_smbus_write_byte_data(data->client, | ||
478 | BMC150_ACCEL_REG_INT_RST_LATCH, | ||
479 | BMC150_ACCEL_INT_MODE_LATCH_INT | | ||
480 | BMC150_ACCEL_INT_MODE_LATCH_RESET); | ||
481 | if (ret < 0) { | ||
482 | dev_err(&data->client->dev, | ||
483 | "Error writing reg_int_rst_latch\n"); | ||
484 | return ret; | ||
485 | } | ||
486 | |||
487 | ret = i2c_smbus_write_byte_data(data->client, | ||
488 | BMC150_ACCEL_REG_INT_EN_1, | ||
489 | 0); | ||
490 | } | ||
491 | |||
492 | if (ret < 0) { | ||
493 | dev_err(&data->client->dev, "Error writing reg_int_en_1\n"); | ||
494 | return ret; | ||
495 | } | ||
496 | |||
497 | return 0; | ||
498 | } | ||
499 | |||
500 | static int bmc150_accel_get_bw(struct bmc150_accel_data *data, int *val, | ||
501 | int *val2) | ||
502 | { | ||
503 | int i; | ||
504 | |||
505 | for (i = 0; i < ARRAY_SIZE(bmc150_accel_samp_freq_table); ++i) { | ||
506 | if (bmc150_accel_samp_freq_table[i].bw_bits == data->bw_bits) { | ||
507 | *val = bmc150_accel_samp_freq_table[i].val; | ||
508 | *val2 = bmc150_accel_samp_freq_table[i].val2; | ||
509 | return IIO_VAL_INT_PLUS_MICRO; | ||
510 | } | ||
511 | } | ||
512 | |||
513 | return -EINVAL; | ||
514 | } | ||
515 | |||
516 | #ifdef CONFIG_PM | ||
517 | static int bmc150_accel_get_startup_times(struct bmc150_accel_data *data) | ||
518 | { | ||
519 | int i; | ||
520 | |||
521 | for (i = 0; i < ARRAY_SIZE(bmc150_accel_sample_upd_time); ++i) { | ||
522 | if (bmc150_accel_sample_upd_time[i].bw_bits == data->bw_bits) | ||
523 | return bmc150_accel_sample_upd_time[i].msec; | ||
524 | } | ||
525 | |||
526 | return BMC150_ACCEL_MAX_STARTUP_TIME_MS; | ||
527 | } | ||
528 | |||
529 | static int bmc150_accel_set_power_state(struct bmc150_accel_data *data, bool on) | ||
530 | { | ||
531 | int ret; | ||
532 | |||
533 | if (on) | ||
534 | ret = pm_runtime_get_sync(&data->client->dev); | ||
535 | else { | ||
536 | pm_runtime_mark_last_busy(&data->client->dev); | ||
537 | ret = pm_runtime_put_autosuspend(&data->client->dev); | ||
538 | } | ||
539 | if (ret < 0) { | ||
540 | dev_err(&data->client->dev, | ||
541 | "Failed: bmc150_accel_set_power_state for %d\n", on); | ||
542 | if (on) | ||
543 | pm_runtime_put_noidle(&data->client->dev); | ||
544 | |||
545 | return ret; | ||
546 | } | ||
547 | |||
548 | return 0; | ||
549 | } | ||
550 | #else | ||
551 | static int bmc150_accel_set_power_state(struct bmc150_accel_data *data, bool on) | ||
552 | { | ||
553 | return 0; | ||
554 | } | ||
555 | #endif | ||
556 | |||
557 | static int bmc150_accel_set_scale(struct bmc150_accel_data *data, int val) | ||
558 | { | ||
559 | int ret, i; | ||
560 | |||
561 | for (i = 0; i < ARRAY_SIZE(data->chip_info->scale_table); ++i) { | ||
562 | if (data->chip_info->scale_table[i].scale == val) { | ||
563 | ret = i2c_smbus_write_byte_data( | ||
564 | data->client, | ||
565 | BMC150_ACCEL_REG_PMU_RANGE, | ||
566 | data->chip_info->scale_table[i].reg_range); | ||
567 | if (ret < 0) { | ||
568 | dev_err(&data->client->dev, | ||
569 | "Error writing pmu_range\n"); | ||
570 | return ret; | ||
571 | } | ||
572 | |||
573 | data->range = data->chip_info->scale_table[i].reg_range; | ||
574 | return 0; | ||
575 | } | ||
576 | } | ||
577 | |||
578 | return -EINVAL; | ||
579 | } | ||
580 | |||
581 | static int bmc150_accel_get_temp(struct bmc150_accel_data *data, int *val) | ||
582 | { | ||
583 | int ret; | ||
584 | |||
585 | mutex_lock(&data->mutex); | ||
586 | |||
587 | ret = i2c_smbus_read_byte_data(data->client, BMC150_ACCEL_REG_TEMP); | ||
588 | if (ret < 0) { | ||
589 | dev_err(&data->client->dev, "Error reading reg_temp\n"); | ||
590 | mutex_unlock(&data->mutex); | ||
591 | return ret; | ||
592 | } | ||
593 | *val = sign_extend32(ret, 7); | ||
594 | |||
595 | mutex_unlock(&data->mutex); | ||
596 | |||
597 | return IIO_VAL_INT; | ||
598 | } | ||
599 | |||
600 | static int bmc150_accel_get_axis(struct bmc150_accel_data *data, | ||
601 | struct iio_chan_spec const *chan, | ||
602 | int *val) | ||
603 | { | ||
604 | int ret; | ||
605 | int axis = chan->scan_index; | ||
606 | |||
607 | mutex_lock(&data->mutex); | ||
608 | ret = bmc150_accel_set_power_state(data, true); | ||
609 | if (ret < 0) { | ||
610 | mutex_unlock(&data->mutex); | ||
611 | return ret; | ||
612 | } | ||
613 | |||
614 | ret = i2c_smbus_read_word_data(data->client, | ||
615 | BMC150_ACCEL_AXIS_TO_REG(axis)); | ||
616 | if (ret < 0) { | ||
617 | dev_err(&data->client->dev, "Error reading axis %d\n", axis); | ||
618 | bmc150_accel_set_power_state(data, false); | ||
619 | mutex_unlock(&data->mutex); | ||
620 | return ret; | ||
621 | } | ||
622 | *val = sign_extend32(ret >> chan->scan_type.shift, | ||
623 | chan->scan_type.realbits - 1); | ||
624 | ret = bmc150_accel_set_power_state(data, false); | ||
625 | mutex_unlock(&data->mutex); | ||
626 | if (ret < 0) | ||
627 | return ret; | ||
628 | |||
629 | return IIO_VAL_INT; | ||
630 | } | ||
631 | |||
632 | static int bmc150_accel_read_raw(struct iio_dev *indio_dev, | ||
633 | struct iio_chan_spec const *chan, | ||
634 | int *val, int *val2, long mask) | ||
635 | { | ||
636 | struct bmc150_accel_data *data = iio_priv(indio_dev); | ||
637 | int ret; | ||
638 | |||
639 | switch (mask) { | ||
640 | case IIO_CHAN_INFO_RAW: | ||
641 | switch (chan->type) { | ||
642 | case IIO_TEMP: | ||
643 | return bmc150_accel_get_temp(data, val); | ||
644 | case IIO_ACCEL: | ||
645 | if (iio_buffer_enabled(indio_dev)) | ||
646 | return -EBUSY; | ||
647 | else | ||
648 | return bmc150_accel_get_axis(data, chan, val); | ||
649 | default: | ||
650 | return -EINVAL; | ||
651 | } | ||
652 | case IIO_CHAN_INFO_OFFSET: | ||
653 | if (chan->type == IIO_TEMP) { | ||
654 | *val = BMC150_ACCEL_TEMP_CENTER_VAL; | ||
655 | return IIO_VAL_INT; | ||
656 | } else | ||
657 | return -EINVAL; | ||
658 | case IIO_CHAN_INFO_SCALE: | ||
659 | *val = 0; | ||
660 | switch (chan->type) { | ||
661 | case IIO_TEMP: | ||
662 | *val2 = 500000; | ||
663 | return IIO_VAL_INT_PLUS_MICRO; | ||
664 | case IIO_ACCEL: | ||
665 | { | ||
666 | int i; | ||
667 | const struct bmc150_scale_info *si; | ||
668 | int st_size = ARRAY_SIZE(data->chip_info->scale_table); | ||
669 | |||
670 | for (i = 0; i < st_size; ++i) { | ||
671 | si = &data->chip_info->scale_table[i]; | ||
672 | if (si->reg_range == data->range) { | ||
673 | *val2 = si->scale; | ||
674 | return IIO_VAL_INT_PLUS_MICRO; | ||
675 | } | ||
676 | } | ||
677 | return -EINVAL; | ||
678 | } | ||
679 | default: | ||
680 | return -EINVAL; | ||
681 | } | ||
682 | case IIO_CHAN_INFO_SAMP_FREQ: | ||
683 | mutex_lock(&data->mutex); | ||
684 | ret = bmc150_accel_get_bw(data, val, val2); | ||
685 | mutex_unlock(&data->mutex); | ||
686 | return ret; | ||
687 | default: | ||
688 | return -EINVAL; | ||
689 | } | ||
690 | } | ||
691 | |||
692 | static int bmc150_accel_write_raw(struct iio_dev *indio_dev, | ||
693 | struct iio_chan_spec const *chan, | ||
694 | int val, int val2, long mask) | ||
695 | { | ||
696 | struct bmc150_accel_data *data = iio_priv(indio_dev); | ||
697 | int ret; | ||
698 | |||
699 | switch (mask) { | ||
700 | case IIO_CHAN_INFO_SAMP_FREQ: | ||
701 | mutex_lock(&data->mutex); | ||
702 | ret = bmc150_accel_set_bw(data, val, val2); | ||
703 | mutex_unlock(&data->mutex); | ||
704 | break; | ||
705 | case IIO_CHAN_INFO_SCALE: | ||
706 | if (val) | ||
707 | return -EINVAL; | ||
708 | |||
709 | mutex_lock(&data->mutex); | ||
710 | ret = bmc150_accel_set_scale(data, val2); | ||
711 | mutex_unlock(&data->mutex); | ||
712 | return ret; | ||
713 | default: | ||
714 | ret = -EINVAL; | ||
715 | } | ||
716 | |||
717 | return ret; | ||
718 | } | ||
719 | |||
720 | static int bmc150_accel_read_event(struct iio_dev *indio_dev, | ||
721 | const struct iio_chan_spec *chan, | ||
722 | enum iio_event_type type, | ||
723 | enum iio_event_direction dir, | ||
724 | enum iio_event_info info, | ||
725 | int *val, int *val2) | ||
726 | { | ||
727 | struct bmc150_accel_data *data = iio_priv(indio_dev); | ||
728 | |||
729 | *val2 = 0; | ||
730 | switch (info) { | ||
731 | case IIO_EV_INFO_VALUE: | ||
732 | *val = data->slope_thres; | ||
733 | break; | ||
734 | case IIO_EV_INFO_PERIOD: | ||
735 | *val = data->slope_dur & BMC150_ACCEL_SLOPE_DUR_MASK; | ||
736 | break; | ||
737 | default: | ||
738 | return -EINVAL; | ||
739 | } | ||
740 | |||
741 | return IIO_VAL_INT; | ||
742 | } | ||
743 | |||
744 | static int bmc150_accel_write_event(struct iio_dev *indio_dev, | ||
745 | const struct iio_chan_spec *chan, | ||
746 | enum iio_event_type type, | ||
747 | enum iio_event_direction dir, | ||
748 | enum iio_event_info info, | ||
749 | int val, int val2) | ||
750 | { | ||
751 | struct bmc150_accel_data *data = iio_priv(indio_dev); | ||
752 | |||
753 | if (data->ev_enable_state) | ||
754 | return -EBUSY; | ||
755 | |||
756 | switch (info) { | ||
757 | case IIO_EV_INFO_VALUE: | ||
758 | data->slope_thres = val; | ||
759 | break; | ||
760 | case IIO_EV_INFO_PERIOD: | ||
761 | data->slope_dur &= ~BMC150_ACCEL_SLOPE_DUR_MASK; | ||
762 | data->slope_dur |= val & BMC150_ACCEL_SLOPE_DUR_MASK; | ||
763 | break; | ||
764 | default: | ||
765 | return -EINVAL; | ||
766 | } | ||
767 | |||
768 | return 0; | ||
769 | } | ||
770 | |||
771 | static int bmc150_accel_read_event_config(struct iio_dev *indio_dev, | ||
772 | const struct iio_chan_spec *chan, | ||
773 | enum iio_event_type type, | ||
774 | enum iio_event_direction dir) | ||
775 | { | ||
776 | |||
777 | struct bmc150_accel_data *data = iio_priv(indio_dev); | ||
778 | |||
779 | return data->ev_enable_state; | ||
780 | } | ||
781 | |||
782 | static int bmc150_accel_write_event_config(struct iio_dev *indio_dev, | ||
783 | const struct iio_chan_spec *chan, | ||
784 | enum iio_event_type type, | ||
785 | enum iio_event_direction dir, | ||
786 | int state) | ||
787 | { | ||
788 | struct bmc150_accel_data *data = iio_priv(indio_dev); | ||
789 | int ret; | ||
790 | |||
791 | if (state && data->ev_enable_state) | ||
792 | return 0; | ||
793 | |||
794 | mutex_lock(&data->mutex); | ||
795 | |||
796 | if (!state && data->motion_trigger_on) { | ||
797 | data->ev_enable_state = 0; | ||
798 | mutex_unlock(&data->mutex); | ||
799 | return 0; | ||
800 | } | ||
801 | |||
802 | /* | ||
803 | * We will expect the enable and disable to do operation in | ||
804 | * in reverse order. This will happen here anyway as our | ||
805 | * resume operation uses sync mode runtime pm calls, the | ||
806 | * suspend operation will be delayed by autosuspend delay | ||
807 | * So the disable operation will still happen in reverse of | ||
808 | * enable operation. When runtime pm is disabled the mode | ||
809 | * is always on so sequence doesn't matter | ||
810 | */ | ||
811 | |||
812 | ret = bmc150_accel_set_power_state(data, state); | ||
813 | if (ret < 0) { | ||
814 | mutex_unlock(&data->mutex); | ||
815 | return ret; | ||
816 | } | ||
817 | |||
818 | ret = bmc150_accel_setup_any_motion_interrupt(data, state); | ||
819 | if (ret < 0) { | ||
820 | bmc150_accel_set_power_state(data, false); | ||
821 | mutex_unlock(&data->mutex); | ||
822 | return ret; | ||
823 | } | ||
824 | |||
825 | data->ev_enable_state = state; | ||
826 | mutex_unlock(&data->mutex); | ||
827 | |||
828 | return 0; | ||
829 | } | ||
830 | |||
831 | static int bmc150_accel_validate_trigger(struct iio_dev *indio_dev, | ||
832 | struct iio_trigger *trig) | ||
833 | { | ||
834 | struct bmc150_accel_data *data = iio_priv(indio_dev); | ||
835 | |||
836 | if (data->dready_trig != trig && data->motion_trig != trig) | ||
837 | return -EINVAL; | ||
838 | |||
839 | return 0; | ||
840 | } | ||
841 | |||
842 | static IIO_CONST_ATTR_SAMP_FREQ_AVAIL( | ||
843 | "7.810000 15.630000 31.250000 62.500000 125 250 500 1000"); | ||
844 | |||
845 | static struct attribute *bmc150_accel_attributes[] = { | ||
846 | &iio_const_attr_sampling_frequency_available.dev_attr.attr, | ||
847 | NULL, | ||
848 | }; | ||
849 | |||
850 | static const struct attribute_group bmc150_accel_attrs_group = { | ||
851 | .attrs = bmc150_accel_attributes, | ||
852 | }; | ||
853 | |||
854 | static const struct iio_event_spec bmc150_accel_event = { | ||
855 | .type = IIO_EV_TYPE_ROC, | ||
856 | .dir = IIO_EV_DIR_EITHER, | ||
857 | .mask_separate = BIT(IIO_EV_INFO_VALUE) | | ||
858 | BIT(IIO_EV_INFO_ENABLE) | | ||
859 | BIT(IIO_EV_INFO_PERIOD) | ||
860 | }; | ||
861 | |||
862 | #define BMC150_ACCEL_CHANNEL(_axis, bits) { \ | ||
863 | .type = IIO_ACCEL, \ | ||
864 | .modified = 1, \ | ||
865 | .channel2 = IIO_MOD_##_axis, \ | ||
866 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ | ||
867 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ | ||
868 | BIT(IIO_CHAN_INFO_SAMP_FREQ), \ | ||
869 | .scan_index = AXIS_##_axis, \ | ||
870 | .scan_type = { \ | ||
871 | .sign = 's', \ | ||
872 | .realbits = (bits), \ | ||
873 | .storagebits = 16, \ | ||
874 | .shift = 16 - (bits), \ | ||
875 | }, \ | ||
876 | .event_spec = &bmc150_accel_event, \ | ||
877 | .num_event_specs = 1 \ | ||
878 | } | ||
879 | |||
880 | #define BMC150_ACCEL_CHANNELS(bits) { \ | ||
881 | { \ | ||
882 | .type = IIO_TEMP, \ | ||
883 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ | ||
884 | BIT(IIO_CHAN_INFO_SCALE) | \ | ||
885 | BIT(IIO_CHAN_INFO_OFFSET), \ | ||
886 | .scan_index = -1, \ | ||
887 | }, \ | ||
888 | BMC150_ACCEL_CHANNEL(X, bits), \ | ||
889 | BMC150_ACCEL_CHANNEL(Y, bits), \ | ||
890 | BMC150_ACCEL_CHANNEL(Z, bits), \ | ||
891 | IIO_CHAN_SOFT_TIMESTAMP(3), \ | ||
892 | } | ||
893 | |||
894 | static const struct iio_chan_spec bma222e_accel_channels[] = | ||
895 | BMC150_ACCEL_CHANNELS(8); | ||
896 | static const struct iio_chan_spec bma250e_accel_channels[] = | ||
897 | BMC150_ACCEL_CHANNELS(10); | ||
898 | static const struct iio_chan_spec bmc150_accel_channels[] = | ||
899 | BMC150_ACCEL_CHANNELS(12); | ||
900 | static const struct iio_chan_spec bma280_accel_channels[] = | ||
901 | BMC150_ACCEL_CHANNELS(14); | ||
902 | |||
903 | enum { | ||
904 | bmc150, | ||
905 | bmi055, | ||
906 | bma255, | ||
907 | bma250e, | ||
908 | bma222e, | ||
909 | bma280, | ||
910 | }; | ||
911 | |||
912 | static const struct bmc150_accel_chip_info bmc150_accel_chip_info_tbl[] = { | ||
913 | [bmc150] = { | ||
914 | .chip_id = 0xFA, | ||
915 | .channels = bmc150_accel_channels, | ||
916 | .num_channels = ARRAY_SIZE(bmc150_accel_channels), | ||
917 | .scale_table = { {9610, BMC150_ACCEL_DEF_RANGE_2G}, | ||
918 | {19122, BMC150_ACCEL_DEF_RANGE_4G}, | ||
919 | {38344, BMC150_ACCEL_DEF_RANGE_8G}, | ||
920 | {76590, BMC150_ACCEL_DEF_RANGE_16G} }, | ||
921 | }, | ||
922 | [bmi055] = { | ||
923 | .chip_id = 0xFA, | ||
924 | .channels = bmc150_accel_channels, | ||
925 | .num_channels = ARRAY_SIZE(bmc150_accel_channels), | ||
926 | .scale_table = { {9610, BMC150_ACCEL_DEF_RANGE_2G}, | ||
927 | {19122, BMC150_ACCEL_DEF_RANGE_4G}, | ||
928 | {38344, BMC150_ACCEL_DEF_RANGE_8G}, | ||
929 | {76590, BMC150_ACCEL_DEF_RANGE_16G} }, | ||
930 | }, | ||
931 | [bma255] = { | ||
932 | .chip_id = 0xFA, | ||
933 | .channels = bmc150_accel_channels, | ||
934 | .num_channels = ARRAY_SIZE(bmc150_accel_channels), | ||
935 | .scale_table = { {9610, BMC150_ACCEL_DEF_RANGE_2G}, | ||
936 | {19122, BMC150_ACCEL_DEF_RANGE_4G}, | ||
937 | {38344, BMC150_ACCEL_DEF_RANGE_8G}, | ||
938 | {76590, BMC150_ACCEL_DEF_RANGE_16G} }, | ||
939 | }, | ||
940 | [bma250e] = { | ||
941 | .chip_id = 0xF9, | ||
942 | .channels = bma250e_accel_channels, | ||
943 | .num_channels = ARRAY_SIZE(bma250e_accel_channels), | ||
944 | .scale_table = { {38344, BMC150_ACCEL_DEF_RANGE_2G}, | ||
945 | {76590, BMC150_ACCEL_DEF_RANGE_4G}, | ||
946 | {153277, BMC150_ACCEL_DEF_RANGE_8G}, | ||
947 | {306457, BMC150_ACCEL_DEF_RANGE_16G} }, | ||
948 | }, | ||
949 | [bma222e] = { | ||
950 | .chip_id = 0xF8, | ||
951 | .channels = bma222e_accel_channels, | ||
952 | .num_channels = ARRAY_SIZE(bma222e_accel_channels), | ||
953 | .scale_table = { {153277, BMC150_ACCEL_DEF_RANGE_2G}, | ||
954 | {306457, BMC150_ACCEL_DEF_RANGE_4G}, | ||
955 | {612915, BMC150_ACCEL_DEF_RANGE_8G}, | ||
956 | {1225831, BMC150_ACCEL_DEF_RANGE_16G} }, | ||
957 | }, | ||
958 | [bma280] = { | ||
959 | .chip_id = 0xFB, | ||
960 | .channels = bma280_accel_channels, | ||
961 | .num_channels = ARRAY_SIZE(bma280_accel_channels), | ||
962 | .scale_table = { {2392, BMC150_ACCEL_DEF_RANGE_2G}, | ||
963 | {4785, BMC150_ACCEL_DEF_RANGE_4G}, | ||
964 | {9581, BMC150_ACCEL_DEF_RANGE_8G}, | ||
965 | {19152, BMC150_ACCEL_DEF_RANGE_16G} }, | ||
966 | }, | ||
967 | }; | ||
968 | |||
969 | static const struct iio_info bmc150_accel_info = { | ||
970 | .attrs = &bmc150_accel_attrs_group, | ||
971 | .read_raw = bmc150_accel_read_raw, | ||
972 | .write_raw = bmc150_accel_write_raw, | ||
973 | .read_event_value = bmc150_accel_read_event, | ||
974 | .write_event_value = bmc150_accel_write_event, | ||
975 | .write_event_config = bmc150_accel_write_event_config, | ||
976 | .read_event_config = bmc150_accel_read_event_config, | ||
977 | .validate_trigger = bmc150_accel_validate_trigger, | ||
978 | .driver_module = THIS_MODULE, | ||
979 | }; | ||
980 | |||
981 | static irqreturn_t bmc150_accel_trigger_handler(int irq, void *p) | ||
982 | { | ||
983 | struct iio_poll_func *pf = p; | ||
984 | struct iio_dev *indio_dev = pf->indio_dev; | ||
985 | struct bmc150_accel_data *data = iio_priv(indio_dev); | ||
986 | int bit, ret, i = 0; | ||
987 | |||
988 | mutex_lock(&data->mutex); | ||
989 | for_each_set_bit(bit, indio_dev->buffer->scan_mask, | ||
990 | indio_dev->masklength) { | ||
991 | ret = i2c_smbus_read_word_data(data->client, | ||
992 | BMC150_ACCEL_AXIS_TO_REG(bit)); | ||
993 | if (ret < 0) { | ||
994 | mutex_unlock(&data->mutex); | ||
995 | goto err_read; | ||
996 | } | ||
997 | data->buffer[i++] = ret; | ||
998 | } | ||
999 | mutex_unlock(&data->mutex); | ||
1000 | |||
1001 | iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, | ||
1002 | data->timestamp); | ||
1003 | err_read: | ||
1004 | iio_trigger_notify_done(indio_dev->trig); | ||
1005 | |||
1006 | return IRQ_HANDLED; | ||
1007 | } | ||
1008 | |||
1009 | static int bmc150_accel_trig_try_reen(struct iio_trigger *trig) | ||
1010 | { | ||
1011 | struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig); | ||
1012 | struct bmc150_accel_data *data = iio_priv(indio_dev); | ||
1013 | int ret; | ||
1014 | |||
1015 | /* new data interrupts don't need ack */ | ||
1016 | if (data->dready_trigger_on) | ||
1017 | return 0; | ||
1018 | |||
1019 | mutex_lock(&data->mutex); | ||
1020 | /* clear any latched interrupt */ | ||
1021 | ret = i2c_smbus_write_byte_data(data->client, | ||
1022 | BMC150_ACCEL_REG_INT_RST_LATCH, | ||
1023 | BMC150_ACCEL_INT_MODE_LATCH_INT | | ||
1024 | BMC150_ACCEL_INT_MODE_LATCH_RESET); | ||
1025 | mutex_unlock(&data->mutex); | ||
1026 | if (ret < 0) { | ||
1027 | dev_err(&data->client->dev, | ||
1028 | "Error writing reg_int_rst_latch\n"); | ||
1029 | return ret; | ||
1030 | } | ||
1031 | |||
1032 | return 0; | ||
1033 | } | ||
1034 | |||
1035 | static int bmc150_accel_data_rdy_trigger_set_state(struct iio_trigger *trig, | ||
1036 | bool state) | ||
1037 | { | ||
1038 | struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig); | ||
1039 | struct bmc150_accel_data *data = iio_priv(indio_dev); | ||
1040 | int ret; | ||
1041 | |||
1042 | mutex_lock(&data->mutex); | ||
1043 | |||
1044 | if (!state && data->ev_enable_state && data->motion_trigger_on) { | ||
1045 | data->motion_trigger_on = false; | ||
1046 | mutex_unlock(&data->mutex); | ||
1047 | return 0; | ||
1048 | } | ||
1049 | |||
1050 | /* | ||
1051 | * Refer to comment in bmc150_accel_write_event_config for | ||
1052 | * enable/disable operation order | ||
1053 | */ | ||
1054 | ret = bmc150_accel_set_power_state(data, state); | ||
1055 | if (ret < 0) { | ||
1056 | mutex_unlock(&data->mutex); | ||
1057 | return ret; | ||
1058 | } | ||
1059 | if (data->motion_trig == trig) | ||
1060 | ret = bmc150_accel_setup_any_motion_interrupt(data, state); | ||
1061 | else | ||
1062 | ret = bmc150_accel_setup_new_data_interrupt(data, state); | ||
1063 | if (ret < 0) { | ||
1064 | bmc150_accel_set_power_state(data, false); | ||
1065 | mutex_unlock(&data->mutex); | ||
1066 | return ret; | ||
1067 | } | ||
1068 | if (data->motion_trig == trig) | ||
1069 | data->motion_trigger_on = state; | ||
1070 | else | ||
1071 | data->dready_trigger_on = state; | ||
1072 | |||
1073 | mutex_unlock(&data->mutex); | ||
1074 | |||
1075 | return ret; | ||
1076 | } | ||
1077 | |||
1078 | static const struct iio_trigger_ops bmc150_accel_trigger_ops = { | ||
1079 | .set_trigger_state = bmc150_accel_data_rdy_trigger_set_state, | ||
1080 | .try_reenable = bmc150_accel_trig_try_reen, | ||
1081 | .owner = THIS_MODULE, | ||
1082 | }; | ||
1083 | |||
1084 | static irqreturn_t bmc150_accel_event_handler(int irq, void *private) | ||
1085 | { | ||
1086 | struct iio_dev *indio_dev = private; | ||
1087 | struct bmc150_accel_data *data = iio_priv(indio_dev); | ||
1088 | int ret; | ||
1089 | int dir; | ||
1090 | |||
1091 | ret = i2c_smbus_read_byte_data(data->client, | ||
1092 | BMC150_ACCEL_REG_INT_STATUS_2); | ||
1093 | if (ret < 0) { | ||
1094 | dev_err(&data->client->dev, "Error reading reg_int_status_2\n"); | ||
1095 | goto ack_intr_status; | ||
1096 | } | ||
1097 | |||
1098 | if (ret & BMC150_ACCEL_ANY_MOTION_BIT_SIGN) | ||
1099 | dir = IIO_EV_DIR_FALLING; | ||
1100 | else | ||
1101 | dir = IIO_EV_DIR_RISING; | ||
1102 | |||
1103 | if (ret & BMC150_ACCEL_ANY_MOTION_BIT_X) | ||
1104 | iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ACCEL, | ||
1105 | 0, | ||
1106 | IIO_MOD_X, | ||
1107 | IIO_EV_TYPE_ROC, | ||
1108 | dir), | ||
1109 | data->timestamp); | ||
1110 | if (ret & BMC150_ACCEL_ANY_MOTION_BIT_Y) | ||
1111 | iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ACCEL, | ||
1112 | 0, | ||
1113 | IIO_MOD_Y, | ||
1114 | IIO_EV_TYPE_ROC, | ||
1115 | dir), | ||
1116 | data->timestamp); | ||
1117 | if (ret & BMC150_ACCEL_ANY_MOTION_BIT_Z) | ||
1118 | iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ACCEL, | ||
1119 | 0, | ||
1120 | IIO_MOD_Z, | ||
1121 | IIO_EV_TYPE_ROC, | ||
1122 | dir), | ||
1123 | data->timestamp); | ||
1124 | ack_intr_status: | ||
1125 | if (!data->dready_trigger_on) | ||
1126 | ret = i2c_smbus_write_byte_data(data->client, | ||
1127 | BMC150_ACCEL_REG_INT_RST_LATCH, | ||
1128 | BMC150_ACCEL_INT_MODE_LATCH_INT | | ||
1129 | BMC150_ACCEL_INT_MODE_LATCH_RESET); | ||
1130 | |||
1131 | return IRQ_HANDLED; | ||
1132 | } | ||
1133 | |||
1134 | static irqreturn_t bmc150_accel_data_rdy_trig_poll(int irq, void *private) | ||
1135 | { | ||
1136 | struct iio_dev *indio_dev = private; | ||
1137 | struct bmc150_accel_data *data = iio_priv(indio_dev); | ||
1138 | |||
1139 | data->timestamp = iio_get_time_ns(); | ||
1140 | |||
1141 | if (data->dready_trigger_on) | ||
1142 | iio_trigger_poll(data->dready_trig); | ||
1143 | else if (data->motion_trigger_on) | ||
1144 | iio_trigger_poll(data->motion_trig); | ||
1145 | |||
1146 | if (data->ev_enable_state) | ||
1147 | return IRQ_WAKE_THREAD; | ||
1148 | else | ||
1149 | return IRQ_HANDLED; | ||
1150 | } | ||
1151 | |||
1152 | static const char *bmc150_accel_match_acpi_device(struct device *dev, int *data) | ||
1153 | { | ||
1154 | const struct acpi_device_id *id; | ||
1155 | |||
1156 | id = acpi_match_device(dev->driver->acpi_match_table, dev); | ||
1157 | |||
1158 | if (!id) | ||
1159 | return NULL; | ||
1160 | |||
1161 | *data = (int) id->driver_data; | ||
1162 | |||
1163 | return dev_name(dev); | ||
1164 | } | ||
1165 | |||
1166 | static int bmc150_accel_gpio_probe(struct i2c_client *client, | ||
1167 | struct bmc150_accel_data *data) | ||
1168 | { | ||
1169 | struct device *dev; | ||
1170 | struct gpio_desc *gpio; | ||
1171 | int ret; | ||
1172 | |||
1173 | if (!client) | ||
1174 | return -EINVAL; | ||
1175 | |||
1176 | dev = &client->dev; | ||
1177 | |||
1178 | /* data ready gpio interrupt pin */ | ||
1179 | gpio = devm_gpiod_get_index(dev, BMC150_ACCEL_GPIO_NAME, 0); | ||
1180 | if (IS_ERR(gpio)) { | ||
1181 | dev_err(dev, "Failed: gpio get index\n"); | ||
1182 | return PTR_ERR(gpio); | ||
1183 | } | ||
1184 | |||
1185 | ret = gpiod_direction_input(gpio); | ||
1186 | if (ret) | ||
1187 | return ret; | ||
1188 | |||
1189 | ret = gpiod_to_irq(gpio); | ||
1190 | |||
1191 | dev_dbg(dev, "GPIO resource, no:%d irq:%d\n", desc_to_gpio(gpio), ret); | ||
1192 | |||
1193 | return ret; | ||
1194 | } | ||
1195 | |||
1196 | static int bmc150_accel_probe(struct i2c_client *client, | ||
1197 | const struct i2c_device_id *id) | ||
1198 | { | ||
1199 | struct bmc150_accel_data *data; | ||
1200 | struct iio_dev *indio_dev; | ||
1201 | int ret; | ||
1202 | const char *name = NULL; | ||
1203 | int chip_id = 0; | ||
1204 | |||
1205 | indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); | ||
1206 | if (!indio_dev) | ||
1207 | return -ENOMEM; | ||
1208 | |||
1209 | data = iio_priv(indio_dev); | ||
1210 | i2c_set_clientdata(client, indio_dev); | ||
1211 | data->client = client; | ||
1212 | |||
1213 | if (id) { | ||
1214 | name = id->name; | ||
1215 | chip_id = id->driver_data; | ||
1216 | } | ||
1217 | |||
1218 | if (ACPI_HANDLE(&client->dev)) | ||
1219 | name = bmc150_accel_match_acpi_device(&client->dev, &chip_id); | ||
1220 | |||
1221 | data->chip_info = &bmc150_accel_chip_info_tbl[chip_id]; | ||
1222 | |||
1223 | ret = bmc150_accel_chip_init(data); | ||
1224 | if (ret < 0) | ||
1225 | return ret; | ||
1226 | |||
1227 | mutex_init(&data->mutex); | ||
1228 | |||
1229 | indio_dev->dev.parent = &client->dev; | ||
1230 | indio_dev->channels = data->chip_info->channels; | ||
1231 | indio_dev->num_channels = data->chip_info->num_channels; | ||
1232 | indio_dev->name = name; | ||
1233 | indio_dev->modes = INDIO_DIRECT_MODE; | ||
1234 | indio_dev->info = &bmc150_accel_info; | ||
1235 | |||
1236 | if (client->irq < 0) | ||
1237 | client->irq = bmc150_accel_gpio_probe(client, data); | ||
1238 | |||
1239 | if (client->irq >= 0) { | ||
1240 | ret = devm_request_threaded_irq( | ||
1241 | &client->dev, client->irq, | ||
1242 | bmc150_accel_data_rdy_trig_poll, | ||
1243 | bmc150_accel_event_handler, | ||
1244 | IRQF_TRIGGER_RISING, | ||
1245 | BMC150_ACCEL_IRQ_NAME, | ||
1246 | indio_dev); | ||
1247 | if (ret) | ||
1248 | return ret; | ||
1249 | |||
1250 | data->dready_trig = devm_iio_trigger_alloc(&client->dev, | ||
1251 | "%s-dev%d", | ||
1252 | indio_dev->name, | ||
1253 | indio_dev->id); | ||
1254 | if (!data->dready_trig) | ||
1255 | return -ENOMEM; | ||
1256 | |||
1257 | data->motion_trig = devm_iio_trigger_alloc(&client->dev, | ||
1258 | "%s-any-motion-dev%d", | ||
1259 | indio_dev->name, | ||
1260 | indio_dev->id); | ||
1261 | if (!data->motion_trig) | ||
1262 | return -ENOMEM; | ||
1263 | |||
1264 | data->dready_trig->dev.parent = &client->dev; | ||
1265 | data->dready_trig->ops = &bmc150_accel_trigger_ops; | ||
1266 | iio_trigger_set_drvdata(data->dready_trig, indio_dev); | ||
1267 | ret = iio_trigger_register(data->dready_trig); | ||
1268 | if (ret) | ||
1269 | return ret; | ||
1270 | |||
1271 | data->motion_trig->dev.parent = &client->dev; | ||
1272 | data->motion_trig->ops = &bmc150_accel_trigger_ops; | ||
1273 | iio_trigger_set_drvdata(data->motion_trig, indio_dev); | ||
1274 | ret = iio_trigger_register(data->motion_trig); | ||
1275 | if (ret) { | ||
1276 | data->motion_trig = NULL; | ||
1277 | goto err_trigger_unregister; | ||
1278 | } | ||
1279 | |||
1280 | ret = iio_triggered_buffer_setup(indio_dev, | ||
1281 | &iio_pollfunc_store_time, | ||
1282 | bmc150_accel_trigger_handler, | ||
1283 | NULL); | ||
1284 | if (ret < 0) { | ||
1285 | dev_err(&client->dev, | ||
1286 | "Failed: iio triggered buffer setup\n"); | ||
1287 | goto err_trigger_unregister; | ||
1288 | } | ||
1289 | } | ||
1290 | |||
1291 | ret = iio_device_register(indio_dev); | ||
1292 | if (ret < 0) { | ||
1293 | dev_err(&client->dev, "Unable to register iio device\n"); | ||
1294 | goto err_buffer_cleanup; | ||
1295 | } | ||
1296 | |||
1297 | ret = pm_runtime_set_active(&client->dev); | ||
1298 | if (ret) | ||
1299 | goto err_iio_unregister; | ||
1300 | |||
1301 | pm_runtime_enable(&client->dev); | ||
1302 | pm_runtime_set_autosuspend_delay(&client->dev, | ||
1303 | BMC150_AUTO_SUSPEND_DELAY_MS); | ||
1304 | pm_runtime_use_autosuspend(&client->dev); | ||
1305 | |||
1306 | return 0; | ||
1307 | |||
1308 | err_iio_unregister: | ||
1309 | iio_device_unregister(indio_dev); | ||
1310 | err_buffer_cleanup: | ||
1311 | if (data->dready_trig) | ||
1312 | iio_triggered_buffer_cleanup(indio_dev); | ||
1313 | err_trigger_unregister: | ||
1314 | if (data->dready_trig) | ||
1315 | iio_trigger_unregister(data->dready_trig); | ||
1316 | if (data->motion_trig) | ||
1317 | iio_trigger_unregister(data->motion_trig); | ||
1318 | |||
1319 | return ret; | ||
1320 | } | ||
1321 | |||
1322 | static int bmc150_accel_remove(struct i2c_client *client) | ||
1323 | { | ||
1324 | struct iio_dev *indio_dev = i2c_get_clientdata(client); | ||
1325 | struct bmc150_accel_data *data = iio_priv(indio_dev); | ||
1326 | |||
1327 | pm_runtime_disable(&client->dev); | ||
1328 | pm_runtime_set_suspended(&client->dev); | ||
1329 | pm_runtime_put_noidle(&client->dev); | ||
1330 | |||
1331 | iio_device_unregister(indio_dev); | ||
1332 | |||
1333 | if (data->dready_trig) { | ||
1334 | iio_triggered_buffer_cleanup(indio_dev); | ||
1335 | iio_trigger_unregister(data->dready_trig); | ||
1336 | iio_trigger_unregister(data->motion_trig); | ||
1337 | } | ||
1338 | |||
1339 | mutex_lock(&data->mutex); | ||
1340 | bmc150_accel_set_mode(data, BMC150_ACCEL_SLEEP_MODE_DEEP_SUSPEND, 0); | ||
1341 | mutex_unlock(&data->mutex); | ||
1342 | |||
1343 | return 0; | ||
1344 | } | ||
1345 | |||
1346 | #ifdef CONFIG_PM_SLEEP | ||
1347 | static int bmc150_accel_suspend(struct device *dev) | ||
1348 | { | ||
1349 | struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); | ||
1350 | struct bmc150_accel_data *data = iio_priv(indio_dev); | ||
1351 | |||
1352 | mutex_lock(&data->mutex); | ||
1353 | bmc150_accel_set_mode(data, BMC150_ACCEL_SLEEP_MODE_SUSPEND, 0); | ||
1354 | mutex_unlock(&data->mutex); | ||
1355 | |||
1356 | return 0; | ||
1357 | } | ||
1358 | |||
1359 | static int bmc150_accel_resume(struct device *dev) | ||
1360 | { | ||
1361 | struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); | ||
1362 | struct bmc150_accel_data *data = iio_priv(indio_dev); | ||
1363 | |||
1364 | mutex_lock(&data->mutex); | ||
1365 | if (data->dready_trigger_on || data->motion_trigger_on || | ||
1366 | data->ev_enable_state) | ||
1367 | bmc150_accel_set_mode(data, BMC150_ACCEL_SLEEP_MODE_NORMAL, 0); | ||
1368 | mutex_unlock(&data->mutex); | ||
1369 | |||
1370 | return 0; | ||
1371 | } | ||
1372 | #endif | ||
1373 | |||
1374 | #ifdef CONFIG_PM | ||
1375 | static int bmc150_accel_runtime_suspend(struct device *dev) | ||
1376 | { | ||
1377 | struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); | ||
1378 | struct bmc150_accel_data *data = iio_priv(indio_dev); | ||
1379 | int ret; | ||
1380 | |||
1381 | dev_dbg(&data->client->dev, __func__); | ||
1382 | ret = bmc150_accel_set_mode(data, BMC150_ACCEL_SLEEP_MODE_SUSPEND, 0); | ||
1383 | if (ret < 0) | ||
1384 | return -EAGAIN; | ||
1385 | |||
1386 | return 0; | ||
1387 | } | ||
1388 | |||
1389 | static int bmc150_accel_runtime_resume(struct device *dev) | ||
1390 | { | ||
1391 | struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); | ||
1392 | struct bmc150_accel_data *data = iio_priv(indio_dev); | ||
1393 | int ret; | ||
1394 | int sleep_val; | ||
1395 | |||
1396 | dev_dbg(&data->client->dev, __func__); | ||
1397 | |||
1398 | ret = bmc150_accel_set_mode(data, BMC150_ACCEL_SLEEP_MODE_NORMAL, 0); | ||
1399 | if (ret < 0) | ||
1400 | return ret; | ||
1401 | |||
1402 | sleep_val = bmc150_accel_get_startup_times(data); | ||
1403 | if (sleep_val < 20) | ||
1404 | usleep_range(sleep_val * 1000, 20000); | ||
1405 | else | ||
1406 | msleep_interruptible(sleep_val); | ||
1407 | |||
1408 | return 0; | ||
1409 | } | ||
1410 | #endif | ||
1411 | |||
1412 | static const struct dev_pm_ops bmc150_accel_pm_ops = { | ||
1413 | SET_SYSTEM_SLEEP_PM_OPS(bmc150_accel_suspend, bmc150_accel_resume) | ||
1414 | SET_RUNTIME_PM_OPS(bmc150_accel_runtime_suspend, | ||
1415 | bmc150_accel_runtime_resume, NULL) | ||
1416 | }; | ||
1417 | |||
1418 | static const struct acpi_device_id bmc150_accel_acpi_match[] = { | ||
1419 | {"BSBA0150", bmc150}, | ||
1420 | {"BMC150A", bmc150}, | ||
1421 | {"BMI055A", bmi055}, | ||
1422 | {"BMA0255", bma255}, | ||
1423 | {"BMA250E", bma250e}, | ||
1424 | {"BMA222E", bma222e}, | ||
1425 | {"BMA0280", bma280}, | ||
1426 | { }, | ||
1427 | }; | ||
1428 | MODULE_DEVICE_TABLE(acpi, bmc150_accel_acpi_match); | ||
1429 | |||
1430 | static const struct i2c_device_id bmc150_accel_id[] = { | ||
1431 | {"bmc150_accel", bmc150}, | ||
1432 | {"bmi055_accel", bmi055}, | ||
1433 | {"bma255", bma255}, | ||
1434 | {"bma250e", bma250e}, | ||
1435 | {"bma222e", bma222e}, | ||
1436 | {"bma280", bma280}, | ||
1437 | {} | ||
1438 | }; | ||
1439 | |||
1440 | MODULE_DEVICE_TABLE(i2c, bmc150_accel_id); | ||
1441 | |||
1442 | static struct i2c_driver bmc150_accel_driver = { | ||
1443 | .driver = { | ||
1444 | .name = BMC150_ACCEL_DRV_NAME, | ||
1445 | .acpi_match_table = ACPI_PTR(bmc150_accel_acpi_match), | ||
1446 | .pm = &bmc150_accel_pm_ops, | ||
1447 | }, | ||
1448 | .probe = bmc150_accel_probe, | ||
1449 | .remove = bmc150_accel_remove, | ||
1450 | .id_table = bmc150_accel_id, | ||
1451 | }; | ||
1452 | module_i2c_driver(bmc150_accel_driver); | ||
1453 | |||
1454 | MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>"); | ||
1455 | MODULE_LICENSE("GPL v2"); | ||
1456 | MODULE_DESCRIPTION("BMC150 accelerometer driver"); | ||
diff --git a/drivers/iio/accel/hid-sensor-accel-3d.c b/drivers/iio/accel/hid-sensor-accel-3d.c index 54e464e4bb72..d5d95317003a 100644 --- a/drivers/iio/accel/hid-sensor-accel-3d.c +++ b/drivers/iio/accel/hid-sensor-accel-3d.c | |||
@@ -419,7 +419,6 @@ static struct platform_driver hid_accel_3d_platform_driver = { | |||
419 | .id_table = hid_accel_3d_ids, | 419 | .id_table = hid_accel_3d_ids, |
420 | .driver = { | 420 | .driver = { |
421 | .name = KBUILD_MODNAME, | 421 | .name = KBUILD_MODNAME, |
422 | .owner = THIS_MODULE, | ||
423 | }, | 422 | }, |
424 | .probe = hid_accel_3d_probe, | 423 | .probe = hid_accel_3d_probe, |
425 | .remove = hid_accel_3d_remove, | 424 | .remove = hid_accel_3d_remove, |
diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c index 7941cf2d31ee..da2fe93739a2 100644 --- a/drivers/iio/accel/kxcjk-1013.c +++ b/drivers/iio/accel/kxcjk-1013.c | |||
@@ -21,10 +21,13 @@ | |||
21 | #include <linux/string.h> | 21 | #include <linux/string.h> |
22 | #include <linux/acpi.h> | 22 | #include <linux/acpi.h> |
23 | #include <linux/gpio/consumer.h> | 23 | #include <linux/gpio/consumer.h> |
24 | #include <linux/pm.h> | ||
25 | #include <linux/pm_runtime.h> | ||
24 | #include <linux/iio/iio.h> | 26 | #include <linux/iio/iio.h> |
25 | #include <linux/iio/sysfs.h> | 27 | #include <linux/iio/sysfs.h> |
26 | #include <linux/iio/buffer.h> | 28 | #include <linux/iio/buffer.h> |
27 | #include <linux/iio/trigger.h> | 29 | #include <linux/iio/trigger.h> |
30 | #include <linux/iio/events.h> | ||
28 | #include <linux/iio/trigger_consumer.h> | 31 | #include <linux/iio/trigger_consumer.h> |
29 | #include <linux/iio/triggered_buffer.h> | 32 | #include <linux/iio/triggered_buffer.h> |
30 | #include <linux/iio/accel/kxcjk_1013.h> | 33 | #include <linux/iio/accel/kxcjk_1013.h> |
@@ -71,15 +74,40 @@ | |||
71 | #define KXCJK1013_DATA_MASK_12_BIT 0x0FFF | 74 | #define KXCJK1013_DATA_MASK_12_BIT 0x0FFF |
72 | #define KXCJK1013_MAX_STARTUP_TIME_US 100000 | 75 | #define KXCJK1013_MAX_STARTUP_TIME_US 100000 |
73 | 76 | ||
77 | #define KXCJK1013_SLEEP_DELAY_MS 2000 | ||
78 | |||
79 | #define KXCJK1013_REG_INT_SRC2_BIT_ZP BIT(0) | ||
80 | #define KXCJK1013_REG_INT_SRC2_BIT_ZN BIT(1) | ||
81 | #define KXCJK1013_REG_INT_SRC2_BIT_YP BIT(2) | ||
82 | #define KXCJK1013_REG_INT_SRC2_BIT_YN BIT(3) | ||
83 | #define KXCJK1013_REG_INT_SRC2_BIT_XP BIT(4) | ||
84 | #define KXCJK1013_REG_INT_SRC2_BIT_XN BIT(5) | ||
85 | |||
86 | #define KXCJK1013_DEFAULT_WAKE_THRES 1 | ||
87 | |||
88 | enum kx_chipset { | ||
89 | KXCJK1013, | ||
90 | KXCJ91008, | ||
91 | KXTJ21009, | ||
92 | KX_MAX_CHIPS /* this must be last */ | ||
93 | }; | ||
94 | |||
74 | struct kxcjk1013_data { | 95 | struct kxcjk1013_data { |
75 | struct i2c_client *client; | 96 | struct i2c_client *client; |
76 | struct iio_trigger *trig; | 97 | struct iio_trigger *dready_trig; |
77 | bool trig_mode; | 98 | struct iio_trigger *motion_trig; |
78 | struct mutex mutex; | 99 | struct mutex mutex; |
79 | s16 buffer[8]; | 100 | s16 buffer[8]; |
80 | int power_state; | ||
81 | u8 odr_bits; | 101 | u8 odr_bits; |
102 | u8 range; | ||
103 | int wake_thres; | ||
104 | int wake_dur; | ||
82 | bool active_high_intr; | 105 | bool active_high_intr; |
106 | bool dready_trigger_on; | ||
107 | int ev_enable_state; | ||
108 | bool motion_trigger_on; | ||
109 | int64_t timestamp; | ||
110 | enum kx_chipset chipset; | ||
83 | }; | 111 | }; |
84 | 112 | ||
85 | enum kxcjk1013_axis { | 113 | enum kxcjk1013_axis { |
@@ -93,6 +121,12 @@ enum kxcjk1013_mode { | |||
93 | OPERATION, | 121 | OPERATION, |
94 | }; | 122 | }; |
95 | 123 | ||
124 | enum kxcjk1013_range { | ||
125 | KXCJK1013_RANGE_2G, | ||
126 | KXCJK1013_RANGE_4G, | ||
127 | KXCJK1013_RANGE_8G, | ||
128 | }; | ||
129 | |||
96 | static const struct { | 130 | static const struct { |
97 | int val; | 131 | int val; |
98 | int val2; | 132 | int val2; |
@@ -107,10 +141,78 @@ static const struct { | |||
107 | static const struct { | 141 | static const struct { |
108 | int odr_bits; | 142 | int odr_bits; |
109 | int usec; | 143 | int usec; |
110 | } odr_start_up_times[] = { {0x08, 100000}, {0x09, 100000}, {0x0A, 100000}, | 144 | } odr_start_up_times[KX_MAX_CHIPS][12] = { |
111 | {0x0B, 100000}, { 0, 80000}, {0x01, 41000}, | 145 | /* KXCJK-1013 */ |
112 | {0x02, 21000}, {0x03, 11000}, {0x04, 6400}, | 146 | { |
113 | {0x05, 3900}, {0x06, 2700}, {0x07, 2100} }; | 147 | {0x08, 100000}, |
148 | {0x09, 100000}, | ||
149 | {0x0A, 100000}, | ||
150 | {0x0B, 100000}, | ||
151 | {0, 80000}, | ||
152 | {0x01, 41000}, | ||
153 | {0x02, 21000}, | ||
154 | {0x03, 11000}, | ||
155 | {0x04, 6400}, | ||
156 | {0x05, 3900}, | ||
157 | {0x06, 2700}, | ||
158 | {0x07, 2100}, | ||
159 | }, | ||
160 | /* KXCJ9-1008 */ | ||
161 | { | ||
162 | {0x08, 100000}, | ||
163 | {0x09, 100000}, | ||
164 | {0x0A, 100000}, | ||
165 | {0x0B, 100000}, | ||
166 | {0, 80000}, | ||
167 | {0x01, 41000}, | ||
168 | {0x02, 21000}, | ||
169 | {0x03, 11000}, | ||
170 | {0x04, 6400}, | ||
171 | {0x05, 3900}, | ||
172 | {0x06, 2700}, | ||
173 | {0x07, 2100}, | ||
174 | }, | ||
175 | /* KXCTJ2-1009 */ | ||
176 | { | ||
177 | {0x08, 1240000}, | ||
178 | {0x09, 621000}, | ||
179 | {0x0A, 309000}, | ||
180 | {0x0B, 151000}, | ||
181 | {0, 80000}, | ||
182 | {0x01, 41000}, | ||
183 | {0x02, 21000}, | ||
184 | {0x03, 11000}, | ||
185 | {0x04, 6000}, | ||
186 | {0x05, 4000}, | ||
187 | {0x06, 3000}, | ||
188 | {0x07, 2000}, | ||
189 | }, | ||
190 | }; | ||
191 | |||
192 | static const struct { | ||
193 | u16 scale; | ||
194 | u8 gsel_0; | ||
195 | u8 gsel_1; | ||
196 | } KXCJK1013_scale_table[] = { {9582, 0, 0}, | ||
197 | {19163, 1, 0}, | ||
198 | {38326, 0, 1} }; | ||
199 | |||
200 | static const struct { | ||
201 | int val; | ||
202 | int val2; | ||
203 | int odr_bits; | ||
204 | } wake_odr_data_rate_table[] = { {0, 781000, 0x00}, | ||
205 | {1, 563000, 0x01}, | ||
206 | {3, 125000, 0x02}, | ||
207 | {6, 250000, 0x03}, | ||
208 | {12, 500000, 0x04}, | ||
209 | {25, 0, 0x05}, | ||
210 | {50, 0, 0x06}, | ||
211 | {100, 0, 0x06}, | ||
212 | {200, 0, 0x06}, | ||
213 | {400, 0, 0x06}, | ||
214 | {800, 0, 0x06}, | ||
215 | {1600, 0, 0x06} }; | ||
114 | 216 | ||
115 | static int kxcjk1013_set_mode(struct kxcjk1013_data *data, | 217 | static int kxcjk1013_set_mode(struct kxcjk1013_data *data, |
116 | enum kxcjk1013_mode mode) | 218 | enum kxcjk1013_mode mode) |
@@ -138,6 +240,53 @@ static int kxcjk1013_set_mode(struct kxcjk1013_data *data, | |||
138 | return 0; | 240 | return 0; |
139 | } | 241 | } |
140 | 242 | ||
243 | static int kxcjk1013_get_mode(struct kxcjk1013_data *data, | ||
244 | enum kxcjk1013_mode *mode) | ||
245 | { | ||
246 | int ret; | ||
247 | |||
248 | ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_CTRL1); | ||
249 | if (ret < 0) { | ||
250 | dev_err(&data->client->dev, "Error reading reg_ctrl1\n"); | ||
251 | return ret; | ||
252 | } | ||
253 | |||
254 | if (ret & KXCJK1013_REG_CTRL1_BIT_PC1) | ||
255 | *mode = OPERATION; | ||
256 | else | ||
257 | *mode = STANDBY; | ||
258 | |||
259 | return 0; | ||
260 | } | ||
261 | |||
262 | static int kxcjk1013_set_range(struct kxcjk1013_data *data, int range_index) | ||
263 | { | ||
264 | int ret; | ||
265 | |||
266 | ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_CTRL1); | ||
267 | if (ret < 0) { | ||
268 | dev_err(&data->client->dev, "Error reading reg_ctrl1\n"); | ||
269 | return ret; | ||
270 | } | ||
271 | |||
272 | ret &= ~(KXCJK1013_REG_CTRL1_BIT_GSEL0 | | ||
273 | KXCJK1013_REG_CTRL1_BIT_GSEL1); | ||
274 | ret |= (KXCJK1013_scale_table[range_index].gsel_0 << 3); | ||
275 | ret |= (KXCJK1013_scale_table[range_index].gsel_1 << 4); | ||
276 | |||
277 | ret = i2c_smbus_write_byte_data(data->client, | ||
278 | KXCJK1013_REG_CTRL1, | ||
279 | ret); | ||
280 | if (ret < 0) { | ||
281 | dev_err(&data->client->dev, "Error writing reg_ctrl1\n"); | ||
282 | return ret; | ||
283 | } | ||
284 | |||
285 | data->range = range_index; | ||
286 | |||
287 | return 0; | ||
288 | } | ||
289 | |||
141 | static int kxcjk1013_chip_init(struct kxcjk1013_data *data) | 290 | static int kxcjk1013_chip_init(struct kxcjk1013_data *data) |
142 | { | 291 | { |
143 | int ret; | 292 | int ret; |
@@ -160,10 +309,6 @@ static int kxcjk1013_chip_init(struct kxcjk1013_data *data) | |||
160 | return ret; | 309 | return ret; |
161 | } | 310 | } |
162 | 311 | ||
163 | /* Setting range to 4G */ | ||
164 | ret |= KXCJK1013_REG_CTRL1_BIT_GSEL0; | ||
165 | ret &= ~KXCJK1013_REG_CTRL1_BIT_GSEL1; | ||
166 | |||
167 | /* Set 12 bit mode */ | 312 | /* Set 12 bit mode */ |
168 | ret |= KXCJK1013_REG_CTRL1_BIT_RES; | 313 | ret |= KXCJK1013_REG_CTRL1_BIT_RES; |
169 | 314 | ||
@@ -174,6 +319,11 @@ static int kxcjk1013_chip_init(struct kxcjk1013_data *data) | |||
174 | return ret; | 319 | return ret; |
175 | } | 320 | } |
176 | 321 | ||
322 | /* Setting range to 4G */ | ||
323 | ret = kxcjk1013_set_range(data, KXCJK1013_RANGE_4G); | ||
324 | if (ret < 0) | ||
325 | return ret; | ||
326 | |||
177 | ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_DATA_CTRL); | 327 | ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_DATA_CTRL); |
178 | if (ret < 0) { | 328 | if (ret < 0) { |
179 | dev_err(&data->client->dev, "Error reading reg_data_ctrl\n"); | 329 | dev_err(&data->client->dev, "Error reading reg_data_ctrl\n"); |
@@ -201,14 +351,147 @@ static int kxcjk1013_chip_init(struct kxcjk1013_data *data) | |||
201 | return ret; | 351 | return ret; |
202 | } | 352 | } |
203 | 353 | ||
354 | ret = kxcjk1013_set_mode(data, OPERATION); | ||
355 | if (ret < 0) | ||
356 | return ret; | ||
357 | |||
358 | data->wake_thres = KXCJK1013_DEFAULT_WAKE_THRES; | ||
359 | |||
204 | return 0; | 360 | return 0; |
205 | } | 361 | } |
206 | 362 | ||
207 | static int kxcjk1013_chip_setup_interrupt(struct kxcjk1013_data *data, | 363 | #ifdef CONFIG_PM |
208 | bool status) | 364 | static int kxcjk1013_get_startup_times(struct kxcjk1013_data *data) |
365 | { | ||
366 | int i; | ||
367 | int idx = data->chipset; | ||
368 | |||
369 | for (i = 0; i < ARRAY_SIZE(odr_start_up_times[idx]); ++i) { | ||
370 | if (odr_start_up_times[idx][i].odr_bits == data->odr_bits) | ||
371 | return odr_start_up_times[idx][i].usec; | ||
372 | } | ||
373 | |||
374 | return KXCJK1013_MAX_STARTUP_TIME_US; | ||
375 | } | ||
376 | #endif | ||
377 | |||
378 | static int kxcjk1013_set_power_state(struct kxcjk1013_data *data, bool on) | ||
209 | { | 379 | { |
210 | int ret; | 380 | int ret; |
211 | 381 | ||
382 | if (on) | ||
383 | ret = pm_runtime_get_sync(&data->client->dev); | ||
384 | else { | ||
385 | pm_runtime_mark_last_busy(&data->client->dev); | ||
386 | ret = pm_runtime_put_autosuspend(&data->client->dev); | ||
387 | } | ||
388 | if (ret < 0) { | ||
389 | dev_err(&data->client->dev, | ||
390 | "Failed: kxcjk1013_set_power_state for %d\n", on); | ||
391 | return ret; | ||
392 | } | ||
393 | |||
394 | return 0; | ||
395 | } | ||
396 | |||
397 | static int kxcjk1013_chip_update_thresholds(struct kxcjk1013_data *data) | ||
398 | { | ||
399 | int ret; | ||
400 | |||
401 | ret = i2c_smbus_write_byte_data(data->client, | ||
402 | KXCJK1013_REG_WAKE_TIMER, | ||
403 | data->wake_dur); | ||
404 | if (ret < 0) { | ||
405 | dev_err(&data->client->dev, | ||
406 | "Error writing reg_wake_timer\n"); | ||
407 | return ret; | ||
408 | } | ||
409 | |||
410 | ret = i2c_smbus_write_byte_data(data->client, | ||
411 | KXCJK1013_REG_WAKE_THRES, | ||
412 | data->wake_thres); | ||
413 | if (ret < 0) { | ||
414 | dev_err(&data->client->dev, "Error writing reg_wake_thres\n"); | ||
415 | return ret; | ||
416 | } | ||
417 | |||
418 | return 0; | ||
419 | } | ||
420 | |||
421 | static int kxcjk1013_setup_any_motion_interrupt(struct kxcjk1013_data *data, | ||
422 | bool status) | ||
423 | { | ||
424 | int ret; | ||
425 | enum kxcjk1013_mode store_mode; | ||
426 | |||
427 | ret = kxcjk1013_get_mode(data, &store_mode); | ||
428 | if (ret < 0) | ||
429 | return ret; | ||
430 | |||
431 | /* This is requirement by spec to change state to STANDBY */ | ||
432 | ret = kxcjk1013_set_mode(data, STANDBY); | ||
433 | if (ret < 0) | ||
434 | return ret; | ||
435 | |||
436 | ret = kxcjk1013_chip_update_thresholds(data); | ||
437 | if (ret < 0) | ||
438 | return ret; | ||
439 | |||
440 | ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_INT_CTRL1); | ||
441 | if (ret < 0) { | ||
442 | dev_err(&data->client->dev, "Error reading reg_int_ctrl1\n"); | ||
443 | return ret; | ||
444 | } | ||
445 | |||
446 | if (status) | ||
447 | ret |= KXCJK1013_REG_INT_REG1_BIT_IEN; | ||
448 | else | ||
449 | ret &= ~KXCJK1013_REG_INT_REG1_BIT_IEN; | ||
450 | |||
451 | ret = i2c_smbus_write_byte_data(data->client, KXCJK1013_REG_INT_CTRL1, | ||
452 | ret); | ||
453 | if (ret < 0) { | ||
454 | dev_err(&data->client->dev, "Error writing reg_int_ctrl1\n"); | ||
455 | return ret; | ||
456 | } | ||
457 | |||
458 | ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_CTRL1); | ||
459 | if (ret < 0) { | ||
460 | dev_err(&data->client->dev, "Error reading reg_ctrl1\n"); | ||
461 | return ret; | ||
462 | } | ||
463 | |||
464 | if (status) | ||
465 | ret |= KXCJK1013_REG_CTRL1_BIT_WUFE; | ||
466 | else | ||
467 | ret &= ~KXCJK1013_REG_CTRL1_BIT_WUFE; | ||
468 | |||
469 | ret = i2c_smbus_write_byte_data(data->client, | ||
470 | KXCJK1013_REG_CTRL1, ret); | ||
471 | if (ret < 0) { | ||
472 | dev_err(&data->client->dev, "Error writing reg_ctrl1\n"); | ||
473 | return ret; | ||
474 | } | ||
475 | |||
476 | if (store_mode == OPERATION) { | ||
477 | ret = kxcjk1013_set_mode(data, OPERATION); | ||
478 | if (ret < 0) | ||
479 | return ret; | ||
480 | } | ||
481 | |||
482 | return 0; | ||
483 | } | ||
484 | |||
485 | static int kxcjk1013_setup_new_data_interrupt(struct kxcjk1013_data *data, | ||
486 | bool status) | ||
487 | { | ||
488 | int ret; | ||
489 | enum kxcjk1013_mode store_mode; | ||
490 | |||
491 | ret = kxcjk1013_get_mode(data, &store_mode); | ||
492 | if (ret < 0) | ||
493 | return ret; | ||
494 | |||
212 | /* This is requirement by spec to change state to STANDBY */ | 495 | /* This is requirement by spec to change state to STANDBY */ |
213 | ret = kxcjk1013_set_mode(data, STANDBY); | 496 | ret = kxcjk1013_set_mode(data, STANDBY); |
214 | if (ret < 0) | 497 | if (ret < 0) |
@@ -250,7 +533,13 @@ static int kxcjk1013_chip_setup_interrupt(struct kxcjk1013_data *data, | |||
250 | return ret; | 533 | return ret; |
251 | } | 534 | } |
252 | 535 | ||
253 | return ret; | 536 | if (store_mode == OPERATION) { |
537 | ret = kxcjk1013_set_mode(data, OPERATION); | ||
538 | if (ret < 0) | ||
539 | return ret; | ||
540 | } | ||
541 | |||
542 | return 0; | ||
254 | } | 543 | } |
255 | 544 | ||
256 | static int kxcjk1013_convert_freq_to_bit(int val, int val2) | 545 | static int kxcjk1013_convert_freq_to_bit(int val, int val2) |
@@ -267,10 +556,29 @@ static int kxcjk1013_convert_freq_to_bit(int val, int val2) | |||
267 | return -EINVAL; | 556 | return -EINVAL; |
268 | } | 557 | } |
269 | 558 | ||
559 | static int kxcjk1013_convert_wake_odr_to_bit(int val, int val2) | ||
560 | { | ||
561 | int i; | ||
562 | |||
563 | for (i = 0; i < ARRAY_SIZE(wake_odr_data_rate_table); ++i) { | ||
564 | if (wake_odr_data_rate_table[i].val == val && | ||
565 | wake_odr_data_rate_table[i].val2 == val2) { | ||
566 | return wake_odr_data_rate_table[i].odr_bits; | ||
567 | } | ||
568 | } | ||
569 | |||
570 | return -EINVAL; | ||
571 | } | ||
572 | |||
270 | static int kxcjk1013_set_odr(struct kxcjk1013_data *data, int val, int val2) | 573 | static int kxcjk1013_set_odr(struct kxcjk1013_data *data, int val, int val2) |
271 | { | 574 | { |
272 | int ret; | 575 | int ret; |
273 | int odr_bits; | 576 | int odr_bits; |
577 | enum kxcjk1013_mode store_mode; | ||
578 | |||
579 | ret = kxcjk1013_get_mode(data, &store_mode); | ||
580 | if (ret < 0) | ||
581 | return ret; | ||
274 | 582 | ||
275 | odr_bits = kxcjk1013_convert_freq_to_bit(val, val2); | 583 | odr_bits = kxcjk1013_convert_freq_to_bit(val, val2); |
276 | if (odr_bits < 0) | 584 | if (odr_bits < 0) |
@@ -290,9 +598,18 @@ static int kxcjk1013_set_odr(struct kxcjk1013_data *data, int val, int val2) | |||
290 | 598 | ||
291 | data->odr_bits = odr_bits; | 599 | data->odr_bits = odr_bits; |
292 | 600 | ||
293 | /* Check, if the ODR is changed after data enable */ | 601 | odr_bits = kxcjk1013_convert_wake_odr_to_bit(val, val2); |
294 | if (data->power_state) { | 602 | if (odr_bits < 0) |
295 | /* Set the state back to operation */ | 603 | return odr_bits; |
604 | |||
605 | ret = i2c_smbus_write_byte_data(data->client, KXCJK1013_REG_CTRL2, | ||
606 | odr_bits); | ||
607 | if (ret < 0) { | ||
608 | dev_err(&data->client->dev, "Error writing reg_ctrl2\n"); | ||
609 | return ret; | ||
610 | } | ||
611 | |||
612 | if (store_mode == OPERATION) { | ||
296 | ret = kxcjk1013_set_mode(data, OPERATION); | 613 | ret = kxcjk1013_set_mode(data, OPERATION); |
297 | if (ret < 0) | 614 | if (ret < 0) |
298 | return ret; | 615 | return ret; |
@@ -331,16 +648,38 @@ static int kxcjk1013_get_acc_reg(struct kxcjk1013_data *data, int axis) | |||
331 | return ret; | 648 | return ret; |
332 | } | 649 | } |
333 | 650 | ||
334 | static int kxcjk1013_get_startup_times(struct kxcjk1013_data *data) | 651 | static int kxcjk1013_set_scale(struct kxcjk1013_data *data, int val) |
335 | { | 652 | { |
336 | int i; | 653 | int ret, i; |
654 | enum kxcjk1013_mode store_mode; | ||
655 | |||
656 | |||
657 | for (i = 0; i < ARRAY_SIZE(KXCJK1013_scale_table); ++i) { | ||
658 | if (KXCJK1013_scale_table[i].scale == val) { | ||
659 | |||
660 | ret = kxcjk1013_get_mode(data, &store_mode); | ||
661 | if (ret < 0) | ||
662 | return ret; | ||
663 | |||
664 | ret = kxcjk1013_set_mode(data, STANDBY); | ||
665 | if (ret < 0) | ||
666 | return ret; | ||
667 | |||
668 | ret = kxcjk1013_set_range(data, i); | ||
669 | if (ret < 0) | ||
670 | return ret; | ||
337 | 671 | ||
338 | for (i = 0; i < ARRAY_SIZE(odr_start_up_times); ++i) { | 672 | if (store_mode == OPERATION) { |
339 | if (odr_start_up_times[i].odr_bits == data->odr_bits) | 673 | ret = kxcjk1013_set_mode(data, OPERATION); |
340 | return odr_start_up_times[i].usec; | 674 | if (ret) |
675 | return ret; | ||
676 | } | ||
677 | |||
678 | return 0; | ||
679 | } | ||
341 | } | 680 | } |
342 | 681 | ||
343 | return KXCJK1013_MAX_STARTUP_TIME_US; | 682 | return -EINVAL; |
344 | } | 683 | } |
345 | 684 | ||
346 | static int kxcjk1013_read_raw(struct iio_dev *indio_dev, | 685 | static int kxcjk1013_read_raw(struct iio_dev *indio_dev, |
@@ -356,34 +695,30 @@ static int kxcjk1013_read_raw(struct iio_dev *indio_dev, | |||
356 | if (iio_buffer_enabled(indio_dev)) | 695 | if (iio_buffer_enabled(indio_dev)) |
357 | ret = -EBUSY; | 696 | ret = -EBUSY; |
358 | else { | 697 | else { |
359 | int sleep_val; | 698 | ret = kxcjk1013_set_power_state(data, true); |
360 | |||
361 | ret = kxcjk1013_set_mode(data, OPERATION); | ||
362 | if (ret < 0) { | 699 | if (ret < 0) { |
363 | mutex_unlock(&data->mutex); | 700 | mutex_unlock(&data->mutex); |
364 | return ret; | 701 | return ret; |
365 | } | 702 | } |
366 | ++data->power_state; | ||
367 | sleep_val = kxcjk1013_get_startup_times(data); | ||
368 | if (sleep_val < 20000) | ||
369 | usleep_range(sleep_val, 20000); | ||
370 | else | ||
371 | msleep_interruptible(sleep_val/1000); | ||
372 | ret = kxcjk1013_get_acc_reg(data, chan->scan_index); | 703 | ret = kxcjk1013_get_acc_reg(data, chan->scan_index); |
373 | if (--data->power_state == 0) | 704 | if (ret < 0) { |
374 | kxcjk1013_set_mode(data, STANDBY); | 705 | kxcjk1013_set_power_state(data, false); |
706 | mutex_unlock(&data->mutex); | ||
707 | return ret; | ||
708 | } | ||
709 | *val = sign_extend32(ret >> 4, 11); | ||
710 | ret = kxcjk1013_set_power_state(data, false); | ||
375 | } | 711 | } |
376 | mutex_unlock(&data->mutex); | 712 | mutex_unlock(&data->mutex); |
377 | 713 | ||
378 | if (ret < 0) | 714 | if (ret < 0) |
379 | return ret; | 715 | return ret; |
380 | 716 | ||
381 | *val = sign_extend32(ret >> 4, 11); | ||
382 | return IIO_VAL_INT; | 717 | return IIO_VAL_INT; |
383 | 718 | ||
384 | case IIO_CHAN_INFO_SCALE: | 719 | case IIO_CHAN_INFO_SCALE: |
385 | *val = 0; | 720 | *val = 0; |
386 | *val2 = 19163; /* range +-4g (4/2047*9.806650) */ | 721 | *val2 = KXCJK1013_scale_table[data->range].scale; |
387 | return IIO_VAL_INT_PLUS_MICRO; | 722 | return IIO_VAL_INT_PLUS_MICRO; |
388 | 723 | ||
389 | case IIO_CHAN_INFO_SAMP_FREQ: | 724 | case IIO_CHAN_INFO_SAMP_FREQ: |
@@ -410,6 +745,14 @@ static int kxcjk1013_write_raw(struct iio_dev *indio_dev, | |||
410 | ret = kxcjk1013_set_odr(data, val, val2); | 745 | ret = kxcjk1013_set_odr(data, val, val2); |
411 | mutex_unlock(&data->mutex); | 746 | mutex_unlock(&data->mutex); |
412 | break; | 747 | break; |
748 | case IIO_CHAN_INFO_SCALE: | ||
749 | if (val) | ||
750 | return -EINVAL; | ||
751 | |||
752 | mutex_lock(&data->mutex); | ||
753 | ret = kxcjk1013_set_scale(data, val2); | ||
754 | mutex_unlock(&data->mutex); | ||
755 | break; | ||
413 | default: | 756 | default: |
414 | ret = -EINVAL; | 757 | ret = -EINVAL; |
415 | } | 758 | } |
@@ -417,12 +760,120 @@ static int kxcjk1013_write_raw(struct iio_dev *indio_dev, | |||
417 | return ret; | 760 | return ret; |
418 | } | 761 | } |
419 | 762 | ||
763 | static int kxcjk1013_read_event(struct iio_dev *indio_dev, | ||
764 | const struct iio_chan_spec *chan, | ||
765 | enum iio_event_type type, | ||
766 | enum iio_event_direction dir, | ||
767 | enum iio_event_info info, | ||
768 | int *val, int *val2) | ||
769 | { | ||
770 | struct kxcjk1013_data *data = iio_priv(indio_dev); | ||
771 | |||
772 | *val2 = 0; | ||
773 | switch (info) { | ||
774 | case IIO_EV_INFO_VALUE: | ||
775 | *val = data->wake_thres; | ||
776 | break; | ||
777 | case IIO_EV_INFO_PERIOD: | ||
778 | *val = data->wake_dur; | ||
779 | break; | ||
780 | default: | ||
781 | return -EINVAL; | ||
782 | } | ||
783 | |||
784 | return IIO_VAL_INT; | ||
785 | } | ||
786 | |||
787 | static int kxcjk1013_write_event(struct iio_dev *indio_dev, | ||
788 | const struct iio_chan_spec *chan, | ||
789 | enum iio_event_type type, | ||
790 | enum iio_event_direction dir, | ||
791 | enum iio_event_info info, | ||
792 | int val, int val2) | ||
793 | { | ||
794 | struct kxcjk1013_data *data = iio_priv(indio_dev); | ||
795 | |||
796 | if (data->ev_enable_state) | ||
797 | return -EBUSY; | ||
798 | |||
799 | switch (info) { | ||
800 | case IIO_EV_INFO_VALUE: | ||
801 | data->wake_thres = val; | ||
802 | break; | ||
803 | case IIO_EV_INFO_PERIOD: | ||
804 | data->wake_dur = val; | ||
805 | break; | ||
806 | default: | ||
807 | return -EINVAL; | ||
808 | } | ||
809 | |||
810 | return 0; | ||
811 | } | ||
812 | |||
813 | static int kxcjk1013_read_event_config(struct iio_dev *indio_dev, | ||
814 | const struct iio_chan_spec *chan, | ||
815 | enum iio_event_type type, | ||
816 | enum iio_event_direction dir) | ||
817 | { | ||
818 | |||
819 | struct kxcjk1013_data *data = iio_priv(indio_dev); | ||
820 | |||
821 | return data->ev_enable_state; | ||
822 | } | ||
823 | |||
824 | static int kxcjk1013_write_event_config(struct iio_dev *indio_dev, | ||
825 | const struct iio_chan_spec *chan, | ||
826 | enum iio_event_type type, | ||
827 | enum iio_event_direction dir, | ||
828 | int state) | ||
829 | { | ||
830 | struct kxcjk1013_data *data = iio_priv(indio_dev); | ||
831 | int ret; | ||
832 | |||
833 | if (state && data->ev_enable_state) | ||
834 | return 0; | ||
835 | |||
836 | mutex_lock(&data->mutex); | ||
837 | |||
838 | if (!state && data->motion_trigger_on) { | ||
839 | data->ev_enable_state = 0; | ||
840 | mutex_unlock(&data->mutex); | ||
841 | return 0; | ||
842 | } | ||
843 | |||
844 | /* | ||
845 | * We will expect the enable and disable to do operation in | ||
846 | * in reverse order. This will happen here anyway as our | ||
847 | * resume operation uses sync mode runtime pm calls, the | ||
848 | * suspend operation will be delayed by autosuspend delay | ||
849 | * So the disable operation will still happen in reverse of | ||
850 | * enable operation. When runtime pm is disabled the mode | ||
851 | * is always on so sequence doesn't matter | ||
852 | */ | ||
853 | ret = kxcjk1013_set_power_state(data, state); | ||
854 | if (ret < 0) { | ||
855 | mutex_unlock(&data->mutex); | ||
856 | return ret; | ||
857 | } | ||
858 | |||
859 | ret = kxcjk1013_setup_any_motion_interrupt(data, state); | ||
860 | if (ret < 0) { | ||
861 | mutex_unlock(&data->mutex); | ||
862 | return ret; | ||
863 | } | ||
864 | |||
865 | data->ev_enable_state = state; | ||
866 | mutex_unlock(&data->mutex); | ||
867 | |||
868 | return 0; | ||
869 | } | ||
870 | |||
420 | static int kxcjk1013_validate_trigger(struct iio_dev *indio_dev, | 871 | static int kxcjk1013_validate_trigger(struct iio_dev *indio_dev, |
421 | struct iio_trigger *trig) | 872 | struct iio_trigger *trig) |
422 | { | 873 | { |
423 | struct kxcjk1013_data *data = iio_priv(indio_dev); | 874 | struct kxcjk1013_data *data = iio_priv(indio_dev); |
424 | 875 | ||
425 | if (data->trig != trig) | 876 | if (data->dready_trig != trig && data->motion_trig != trig) |
426 | return -EINVAL; | 877 | return -EINVAL; |
427 | 878 | ||
428 | return 0; | 879 | return 0; |
@@ -431,8 +882,11 @@ static int kxcjk1013_validate_trigger(struct iio_dev *indio_dev, | |||
431 | static IIO_CONST_ATTR_SAMP_FREQ_AVAIL( | 882 | static IIO_CONST_ATTR_SAMP_FREQ_AVAIL( |
432 | "0.781000 1.563000 3.125000 6.250000 12.500000 25 50 100 200 400 800 1600"); | 883 | "0.781000 1.563000 3.125000 6.250000 12.500000 25 50 100 200 400 800 1600"); |
433 | 884 | ||
885 | static IIO_CONST_ATTR(in_accel_scale_available, "0.009582 0.019163 0.038326"); | ||
886 | |||
434 | static struct attribute *kxcjk1013_attributes[] = { | 887 | static struct attribute *kxcjk1013_attributes[] = { |
435 | &iio_const_attr_sampling_frequency_available.dev_attr.attr, | 888 | &iio_const_attr_sampling_frequency_available.dev_attr.attr, |
889 | &iio_const_attr_in_accel_scale_available.dev_attr.attr, | ||
436 | NULL, | 890 | NULL, |
437 | }; | 891 | }; |
438 | 892 | ||
@@ -440,6 +894,14 @@ static const struct attribute_group kxcjk1013_attrs_group = { | |||
440 | .attrs = kxcjk1013_attributes, | 894 | .attrs = kxcjk1013_attributes, |
441 | }; | 895 | }; |
442 | 896 | ||
897 | static const struct iio_event_spec kxcjk1013_event = { | ||
898 | .type = IIO_EV_TYPE_THRESH, | ||
899 | .dir = IIO_EV_DIR_EITHER, | ||
900 | .mask_separate = BIT(IIO_EV_INFO_VALUE) | | ||
901 | BIT(IIO_EV_INFO_ENABLE) | | ||
902 | BIT(IIO_EV_INFO_PERIOD) | ||
903 | }; | ||
904 | |||
443 | #define KXCJK1013_CHANNEL(_axis) { \ | 905 | #define KXCJK1013_CHANNEL(_axis) { \ |
444 | .type = IIO_ACCEL, \ | 906 | .type = IIO_ACCEL, \ |
445 | .modified = 1, \ | 907 | .modified = 1, \ |
@@ -455,6 +917,8 @@ static const struct attribute_group kxcjk1013_attrs_group = { | |||
455 | .shift = 4, \ | 917 | .shift = 4, \ |
456 | .endianness = IIO_CPU, \ | 918 | .endianness = IIO_CPU, \ |
457 | }, \ | 919 | }, \ |
920 | .event_spec = &kxcjk1013_event, \ | ||
921 | .num_event_specs = 1 \ | ||
458 | } | 922 | } |
459 | 923 | ||
460 | static const struct iio_chan_spec kxcjk1013_channels[] = { | 924 | static const struct iio_chan_spec kxcjk1013_channels[] = { |
@@ -468,6 +932,10 @@ static const struct iio_info kxcjk1013_info = { | |||
468 | .attrs = &kxcjk1013_attrs_group, | 932 | .attrs = &kxcjk1013_attrs_group, |
469 | .read_raw = kxcjk1013_read_raw, | 933 | .read_raw = kxcjk1013_read_raw, |
470 | .write_raw = kxcjk1013_write_raw, | 934 | .write_raw = kxcjk1013_write_raw, |
935 | .read_event_value = kxcjk1013_read_event, | ||
936 | .write_event_value = kxcjk1013_write_event, | ||
937 | .write_event_config = kxcjk1013_write_event_config, | ||
938 | .read_event_config = kxcjk1013_read_event_config, | ||
471 | .validate_trigger = kxcjk1013_validate_trigger, | 939 | .validate_trigger = kxcjk1013_validate_trigger, |
472 | .driver_module = THIS_MODULE, | 940 | .driver_module = THIS_MODULE, |
473 | }; | 941 | }; |
@@ -493,7 +961,7 @@ static irqreturn_t kxcjk1013_trigger_handler(int irq, void *p) | |||
493 | mutex_unlock(&data->mutex); | 961 | mutex_unlock(&data->mutex); |
494 | 962 | ||
495 | iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, | 963 | iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, |
496 | pf->timestamp); | 964 | data->timestamp); |
497 | err: | 965 | err: |
498 | iio_trigger_notify_done(indio_dev->trig); | 966 | iio_trigger_notify_done(indio_dev->trig); |
499 | 967 | ||
@@ -520,20 +988,34 @@ static int kxcjk1013_data_rdy_trigger_set_state(struct iio_trigger *trig, | |||
520 | { | 988 | { |
521 | struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig); | 989 | struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig); |
522 | struct kxcjk1013_data *data = iio_priv(indio_dev); | 990 | struct kxcjk1013_data *data = iio_priv(indio_dev); |
991 | int ret; | ||
523 | 992 | ||
524 | mutex_lock(&data->mutex); | 993 | mutex_lock(&data->mutex); |
525 | if (state) { | 994 | |
526 | kxcjk1013_chip_setup_interrupt(data, true); | 995 | if (!state && data->ev_enable_state && data->motion_trigger_on) { |
527 | kxcjk1013_set_mode(data, OPERATION); | 996 | data->motion_trigger_on = false; |
528 | ++data->power_state; | 997 | mutex_unlock(&data->mutex); |
529 | } else { | 998 | return 0; |
530 | if (--data->power_state) { | ||
531 | mutex_unlock(&data->mutex); | ||
532 | return 0; | ||
533 | } | ||
534 | kxcjk1013_chip_setup_interrupt(data, false); | ||
535 | kxcjk1013_set_mode(data, STANDBY); | ||
536 | } | 999 | } |
1000 | |||
1001 | ret = kxcjk1013_set_power_state(data, state); | ||
1002 | if (ret < 0) { | ||
1003 | mutex_unlock(&data->mutex); | ||
1004 | return ret; | ||
1005 | } | ||
1006 | if (data->motion_trig == trig) | ||
1007 | ret = kxcjk1013_setup_any_motion_interrupt(data, state); | ||
1008 | else | ||
1009 | ret = kxcjk1013_setup_new_data_interrupt(data, state); | ||
1010 | if (ret < 0) { | ||
1011 | mutex_unlock(&data->mutex); | ||
1012 | return ret; | ||
1013 | } | ||
1014 | if (data->motion_trig == trig) | ||
1015 | data->motion_trigger_on = state; | ||
1016 | else | ||
1017 | data->dready_trigger_on = state; | ||
1018 | |||
537 | mutex_unlock(&data->mutex); | 1019 | mutex_unlock(&data->mutex); |
538 | 1020 | ||
539 | return 0; | 1021 | return 0; |
@@ -545,10 +1027,124 @@ static const struct iio_trigger_ops kxcjk1013_trigger_ops = { | |||
545 | .owner = THIS_MODULE, | 1027 | .owner = THIS_MODULE, |
546 | }; | 1028 | }; |
547 | 1029 | ||
548 | static int kxcjk1013_acpi_gpio_probe(struct i2c_client *client, | 1030 | static irqreturn_t kxcjk1013_event_handler(int irq, void *private) |
549 | struct kxcjk1013_data *data) | 1031 | { |
1032 | struct iio_dev *indio_dev = private; | ||
1033 | struct kxcjk1013_data *data = iio_priv(indio_dev); | ||
1034 | int ret; | ||
1035 | |||
1036 | ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_INT_SRC1); | ||
1037 | if (ret < 0) { | ||
1038 | dev_err(&data->client->dev, "Error reading reg_int_src1\n"); | ||
1039 | goto ack_intr; | ||
1040 | } | ||
1041 | |||
1042 | if (ret & 0x02) { | ||
1043 | ret = i2c_smbus_read_byte_data(data->client, | ||
1044 | KXCJK1013_REG_INT_SRC2); | ||
1045 | if (ret < 0) { | ||
1046 | dev_err(&data->client->dev, | ||
1047 | "Error reading reg_int_src2\n"); | ||
1048 | goto ack_intr; | ||
1049 | } | ||
1050 | |||
1051 | if (ret & KXCJK1013_REG_INT_SRC2_BIT_XN) | ||
1052 | iio_push_event(indio_dev, | ||
1053 | IIO_MOD_EVENT_CODE(IIO_ACCEL, | ||
1054 | 0, | ||
1055 | IIO_MOD_X, | ||
1056 | IIO_EV_TYPE_THRESH, | ||
1057 | IIO_EV_DIR_FALLING), | ||
1058 | data->timestamp); | ||
1059 | if (ret & KXCJK1013_REG_INT_SRC2_BIT_XP) | ||
1060 | iio_push_event(indio_dev, | ||
1061 | IIO_MOD_EVENT_CODE(IIO_ACCEL, | ||
1062 | 0, | ||
1063 | IIO_MOD_X, | ||
1064 | IIO_EV_TYPE_THRESH, | ||
1065 | IIO_EV_DIR_RISING), | ||
1066 | data->timestamp); | ||
1067 | |||
1068 | |||
1069 | if (ret & KXCJK1013_REG_INT_SRC2_BIT_YN) | ||
1070 | iio_push_event(indio_dev, | ||
1071 | IIO_MOD_EVENT_CODE(IIO_ACCEL, | ||
1072 | 0, | ||
1073 | IIO_MOD_Y, | ||
1074 | IIO_EV_TYPE_THRESH, | ||
1075 | IIO_EV_DIR_FALLING), | ||
1076 | data->timestamp); | ||
1077 | if (ret & KXCJK1013_REG_INT_SRC2_BIT_YP) | ||
1078 | iio_push_event(indio_dev, | ||
1079 | IIO_MOD_EVENT_CODE(IIO_ACCEL, | ||
1080 | 0, | ||
1081 | IIO_MOD_Y, | ||
1082 | IIO_EV_TYPE_THRESH, | ||
1083 | IIO_EV_DIR_RISING), | ||
1084 | data->timestamp); | ||
1085 | |||
1086 | if (ret & KXCJK1013_REG_INT_SRC2_BIT_ZN) | ||
1087 | iio_push_event(indio_dev, | ||
1088 | IIO_MOD_EVENT_CODE(IIO_ACCEL, | ||
1089 | 0, | ||
1090 | IIO_MOD_Z, | ||
1091 | IIO_EV_TYPE_THRESH, | ||
1092 | IIO_EV_DIR_FALLING), | ||
1093 | data->timestamp); | ||
1094 | if (ret & KXCJK1013_REG_INT_SRC2_BIT_ZP) | ||
1095 | iio_push_event(indio_dev, | ||
1096 | IIO_MOD_EVENT_CODE(IIO_ACCEL, | ||
1097 | 0, | ||
1098 | IIO_MOD_Z, | ||
1099 | IIO_EV_TYPE_THRESH, | ||
1100 | IIO_EV_DIR_RISING), | ||
1101 | data->timestamp); | ||
1102 | } | ||
1103 | |||
1104 | ack_intr: | ||
1105 | if (data->dready_trigger_on) | ||
1106 | return IRQ_HANDLED; | ||
1107 | |||
1108 | ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_INT_REL); | ||
1109 | if (ret < 0) | ||
1110 | dev_err(&data->client->dev, "Error reading reg_int_rel\n"); | ||
1111 | |||
1112 | return IRQ_HANDLED; | ||
1113 | } | ||
1114 | |||
1115 | static irqreturn_t kxcjk1013_data_rdy_trig_poll(int irq, void *private) | ||
1116 | { | ||
1117 | struct iio_dev *indio_dev = private; | ||
1118 | struct kxcjk1013_data *data = iio_priv(indio_dev); | ||
1119 | |||
1120 | data->timestamp = iio_get_time_ns(); | ||
1121 | |||
1122 | if (data->dready_trigger_on) | ||
1123 | iio_trigger_poll(data->dready_trig); | ||
1124 | else if (data->motion_trigger_on) | ||
1125 | iio_trigger_poll(data->motion_trig); | ||
1126 | |||
1127 | if (data->ev_enable_state) | ||
1128 | return IRQ_WAKE_THREAD; | ||
1129 | else | ||
1130 | return IRQ_HANDLED; | ||
1131 | } | ||
1132 | |||
1133 | static const char *kxcjk1013_match_acpi_device(struct device *dev, | ||
1134 | enum kx_chipset *chipset) | ||
550 | { | 1135 | { |
551 | const struct acpi_device_id *id; | 1136 | const struct acpi_device_id *id; |
1137 | id = acpi_match_device(dev->driver->acpi_match_table, dev); | ||
1138 | if (!id) | ||
1139 | return NULL; | ||
1140 | *chipset = (enum kx_chipset)id->driver_data; | ||
1141 | |||
1142 | return dev_name(dev); | ||
1143 | } | ||
1144 | |||
1145 | static int kxcjk1013_gpio_probe(struct i2c_client *client, | ||
1146 | struct kxcjk1013_data *data) | ||
1147 | { | ||
552 | struct device *dev; | 1148 | struct device *dev; |
553 | struct gpio_desc *gpio; | 1149 | struct gpio_desc *gpio; |
554 | int ret; | 1150 | int ret; |
@@ -557,12 +1153,6 @@ static int kxcjk1013_acpi_gpio_probe(struct i2c_client *client, | |||
557 | return -EINVAL; | 1153 | return -EINVAL; |
558 | 1154 | ||
559 | dev = &client->dev; | 1155 | dev = &client->dev; |
560 | if (!ACPI_HANDLE(dev)) | ||
561 | return -ENODEV; | ||
562 | |||
563 | id = acpi_match_device(dev->driver->acpi_match_table, dev); | ||
564 | if (!id) | ||
565 | return -ENODEV; | ||
566 | 1156 | ||
567 | /* data ready gpio interrupt pin */ | 1157 | /* data ready gpio interrupt pin */ |
568 | gpio = devm_gpiod_get_index(dev, "kxcjk1013_int", 0); | 1158 | gpio = devm_gpiod_get_index(dev, "kxcjk1013_int", 0); |
@@ -587,8 +1177,8 @@ static int kxcjk1013_probe(struct i2c_client *client, | |||
587 | { | 1177 | { |
588 | struct kxcjk1013_data *data; | 1178 | struct kxcjk1013_data *data; |
589 | struct iio_dev *indio_dev; | 1179 | struct iio_dev *indio_dev; |
590 | struct iio_trigger *trig = NULL; | ||
591 | struct kxcjk_1013_platform_data *pdata; | 1180 | struct kxcjk_1013_platform_data *pdata; |
1181 | const char *name; | ||
592 | int ret; | 1182 | int ret; |
593 | 1183 | ||
594 | indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); | 1184 | indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); |
@@ -605,6 +1195,15 @@ static int kxcjk1013_probe(struct i2c_client *client, | |||
605 | else | 1195 | else |
606 | data->active_high_intr = true; /* default polarity */ | 1196 | data->active_high_intr = true; /* default polarity */ |
607 | 1197 | ||
1198 | if (id) { | ||
1199 | data->chipset = (enum kx_chipset)(id->driver_data); | ||
1200 | name = id->name; | ||
1201 | } else if (ACPI_HANDLE(&client->dev)) { | ||
1202 | name = kxcjk1013_match_acpi_device(&client->dev, | ||
1203 | &data->chipset); | ||
1204 | } else | ||
1205 | return -ENODEV; | ||
1206 | |||
608 | ret = kxcjk1013_chip_init(data); | 1207 | ret = kxcjk1013_chip_init(data); |
609 | if (ret < 0) | 1208 | if (ret < 0) |
610 | return ret; | 1209 | return ret; |
@@ -614,41 +1213,54 @@ static int kxcjk1013_probe(struct i2c_client *client, | |||
614 | indio_dev->dev.parent = &client->dev; | 1213 | indio_dev->dev.parent = &client->dev; |
615 | indio_dev->channels = kxcjk1013_channels; | 1214 | indio_dev->channels = kxcjk1013_channels; |
616 | indio_dev->num_channels = ARRAY_SIZE(kxcjk1013_channels); | 1215 | indio_dev->num_channels = ARRAY_SIZE(kxcjk1013_channels); |
617 | indio_dev->name = KXCJK1013_DRV_NAME; | 1216 | indio_dev->name = name; |
618 | indio_dev->modes = INDIO_DIRECT_MODE; | 1217 | indio_dev->modes = INDIO_DIRECT_MODE; |
619 | indio_dev->info = &kxcjk1013_info; | 1218 | indio_dev->info = &kxcjk1013_info; |
620 | 1219 | ||
621 | if (client->irq < 0) | 1220 | if (client->irq < 0) |
622 | client->irq = kxcjk1013_acpi_gpio_probe(client, data); | 1221 | client->irq = kxcjk1013_gpio_probe(client, data); |
623 | 1222 | ||
624 | if (client->irq >= 0) { | 1223 | if (client->irq >= 0) { |
625 | trig = iio_trigger_alloc("%s-dev%d", indio_dev->name, | 1224 | ret = devm_request_threaded_irq(&client->dev, client->irq, |
626 | indio_dev->id); | 1225 | kxcjk1013_data_rdy_trig_poll, |
627 | if (!trig) | 1226 | kxcjk1013_event_handler, |
628 | return -ENOMEM; | 1227 | IRQF_TRIGGER_RISING, |
1228 | KXCJK1013_IRQ_NAME, | ||
1229 | indio_dev); | ||
1230 | if (ret) | ||
1231 | return ret; | ||
629 | 1232 | ||
630 | data->trig_mode = true; | 1233 | data->dready_trig = devm_iio_trigger_alloc(&client->dev, |
1234 | "%s-dev%d", | ||
1235 | indio_dev->name, | ||
1236 | indio_dev->id); | ||
1237 | if (!data->dready_trig) | ||
1238 | return -ENOMEM; | ||
631 | 1239 | ||
632 | ret = devm_request_irq(&client->dev, client->irq, | 1240 | data->motion_trig = devm_iio_trigger_alloc(&client->dev, |
633 | iio_trigger_generic_data_rdy_poll, | 1241 | "%s-any-motion-dev%d", |
634 | IRQF_TRIGGER_RISING, | 1242 | indio_dev->name, |
635 | KXCJK1013_IRQ_NAME, | 1243 | indio_dev->id); |
636 | trig); | 1244 | if (!data->motion_trig) |
637 | if (ret) { | 1245 | return -ENOMEM; |
638 | dev_err(&client->dev, "unable to request IRQ\n"); | ||
639 | goto err_trigger_free; | ||
640 | } | ||
641 | 1246 | ||
642 | trig->dev.parent = &client->dev; | 1247 | data->dready_trig->dev.parent = &client->dev; |
643 | trig->ops = &kxcjk1013_trigger_ops; | 1248 | data->dready_trig->ops = &kxcjk1013_trigger_ops; |
644 | iio_trigger_set_drvdata(trig, indio_dev); | 1249 | iio_trigger_set_drvdata(data->dready_trig, indio_dev); |
645 | data->trig = trig; | 1250 | indio_dev->trig = data->dready_trig; |
646 | indio_dev->trig = trig; | ||
647 | iio_trigger_get(indio_dev->trig); | 1251 | iio_trigger_get(indio_dev->trig); |
648 | 1252 | ret = iio_trigger_register(data->dready_trig); | |
649 | ret = iio_trigger_register(trig); | ||
650 | if (ret) | 1253 | if (ret) |
651 | goto err_trigger_free; | 1254 | return ret; |
1255 | |||
1256 | data->motion_trig->dev.parent = &client->dev; | ||
1257 | data->motion_trig->ops = &kxcjk1013_trigger_ops; | ||
1258 | iio_trigger_set_drvdata(data->motion_trig, indio_dev); | ||
1259 | ret = iio_trigger_register(data->motion_trig); | ||
1260 | if (ret) { | ||
1261 | data->motion_trig = NULL; | ||
1262 | goto err_trigger_unregister; | ||
1263 | } | ||
652 | 1264 | ||
653 | ret = iio_triggered_buffer_setup(indio_dev, | 1265 | ret = iio_triggered_buffer_setup(indio_dev, |
654 | &iio_pollfunc_store_time, | 1266 | &iio_pollfunc_store_time, |
@@ -661,23 +1273,33 @@ static int kxcjk1013_probe(struct i2c_client *client, | |||
661 | } | 1273 | } |
662 | } | 1274 | } |
663 | 1275 | ||
664 | ret = devm_iio_device_register(&client->dev, indio_dev); | 1276 | ret = iio_device_register(indio_dev); |
665 | if (ret < 0) { | 1277 | if (ret < 0) { |
666 | dev_err(&client->dev, "unable to register iio device\n"); | 1278 | dev_err(&client->dev, "unable to register iio device\n"); |
667 | goto err_buffer_cleanup; | 1279 | goto err_buffer_cleanup; |
668 | } | 1280 | } |
669 | 1281 | ||
1282 | ret = pm_runtime_set_active(&client->dev); | ||
1283 | if (ret) | ||
1284 | goto err_iio_unregister; | ||
1285 | |||
1286 | pm_runtime_enable(&client->dev); | ||
1287 | pm_runtime_set_autosuspend_delay(&client->dev, | ||
1288 | KXCJK1013_SLEEP_DELAY_MS); | ||
1289 | pm_runtime_use_autosuspend(&client->dev); | ||
1290 | |||
670 | return 0; | 1291 | return 0; |
671 | 1292 | ||
1293 | err_iio_unregister: | ||
1294 | iio_device_unregister(indio_dev); | ||
672 | err_buffer_cleanup: | 1295 | err_buffer_cleanup: |
673 | if (data->trig_mode) | 1296 | if (data->dready_trig) |
674 | iio_triggered_buffer_cleanup(indio_dev); | 1297 | iio_triggered_buffer_cleanup(indio_dev); |
675 | err_trigger_unregister: | 1298 | err_trigger_unregister: |
676 | if (data->trig_mode) | 1299 | if (data->dready_trig) |
677 | iio_trigger_unregister(trig); | 1300 | iio_trigger_unregister(data->dready_trig); |
678 | err_trigger_free: | 1301 | if (data->motion_trig) |
679 | if (data->trig_mode) | 1302 | iio_trigger_unregister(data->motion_trig); |
680 | iio_trigger_free(trig); | ||
681 | 1303 | ||
682 | return ret; | 1304 | return ret; |
683 | } | 1305 | } |
@@ -687,10 +1309,16 @@ static int kxcjk1013_remove(struct i2c_client *client) | |||
687 | struct iio_dev *indio_dev = i2c_get_clientdata(client); | 1309 | struct iio_dev *indio_dev = i2c_get_clientdata(client); |
688 | struct kxcjk1013_data *data = iio_priv(indio_dev); | 1310 | struct kxcjk1013_data *data = iio_priv(indio_dev); |
689 | 1311 | ||
690 | if (data->trig_mode) { | 1312 | pm_runtime_disable(&client->dev); |
1313 | pm_runtime_set_suspended(&client->dev); | ||
1314 | pm_runtime_put_noidle(&client->dev); | ||
1315 | |||
1316 | iio_device_unregister(indio_dev); | ||
1317 | |||
1318 | if (data->dready_trig) { | ||
691 | iio_triggered_buffer_cleanup(indio_dev); | 1319 | iio_triggered_buffer_cleanup(indio_dev); |
692 | iio_trigger_unregister(data->trig); | 1320 | iio_trigger_unregister(data->dready_trig); |
693 | iio_trigger_free(data->trig); | 1321 | iio_trigger_unregister(data->motion_trig); |
694 | } | 1322 | } |
695 | 1323 | ||
696 | mutex_lock(&data->mutex); | 1324 | mutex_lock(&data->mutex); |
@@ -705,43 +1333,80 @@ static int kxcjk1013_suspend(struct device *dev) | |||
705 | { | 1333 | { |
706 | struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); | 1334 | struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); |
707 | struct kxcjk1013_data *data = iio_priv(indio_dev); | 1335 | struct kxcjk1013_data *data = iio_priv(indio_dev); |
1336 | int ret; | ||
708 | 1337 | ||
709 | mutex_lock(&data->mutex); | 1338 | mutex_lock(&data->mutex); |
710 | kxcjk1013_set_mode(data, STANDBY); | 1339 | ret = kxcjk1013_set_mode(data, STANDBY); |
711 | mutex_unlock(&data->mutex); | 1340 | mutex_unlock(&data->mutex); |
712 | 1341 | ||
713 | return 0; | 1342 | return ret; |
714 | } | 1343 | } |
715 | 1344 | ||
716 | static int kxcjk1013_resume(struct device *dev) | 1345 | static int kxcjk1013_resume(struct device *dev) |
717 | { | 1346 | { |
718 | struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); | 1347 | struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); |
719 | struct kxcjk1013_data *data = iio_priv(indio_dev); | 1348 | struct kxcjk1013_data *data = iio_priv(indio_dev); |
1349 | int ret = 0; | ||
720 | 1350 | ||
721 | mutex_lock(&data->mutex); | 1351 | mutex_lock(&data->mutex); |
1352 | /* Check, if the suspend occured while active */ | ||
1353 | if (data->dready_trigger_on || data->motion_trigger_on || | ||
1354 | data->ev_enable_state) | ||
1355 | ret = kxcjk1013_set_mode(data, OPERATION); | ||
1356 | mutex_unlock(&data->mutex); | ||
722 | 1357 | ||
723 | if (data->power_state) | 1358 | return ret; |
724 | kxcjk1013_set_mode(data, OPERATION); | 1359 | } |
1360 | #endif | ||
725 | 1361 | ||
726 | mutex_unlock(&data->mutex); | 1362 | #ifdef CONFIG_PM |
1363 | static int kxcjk1013_runtime_suspend(struct device *dev) | ||
1364 | { | ||
1365 | struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); | ||
1366 | struct kxcjk1013_data *data = iio_priv(indio_dev); | ||
727 | 1367 | ||
728 | return 0; | 1368 | return kxcjk1013_set_mode(data, STANDBY); |
729 | } | 1369 | } |
730 | 1370 | ||
731 | static SIMPLE_DEV_PM_OPS(kxcjk1013_pm_ops, kxcjk1013_suspend, kxcjk1013_resume); | 1371 | static int kxcjk1013_runtime_resume(struct device *dev) |
732 | #define KXCJK1013_PM_OPS (&kxcjk1013_pm_ops) | 1372 | { |
733 | #else | 1373 | struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); |
734 | #define KXCJK1013_PM_OPS NULL | 1374 | struct kxcjk1013_data *data = iio_priv(indio_dev); |
1375 | int ret; | ||
1376 | int sleep_val; | ||
1377 | |||
1378 | ret = kxcjk1013_set_mode(data, OPERATION); | ||
1379 | if (ret < 0) | ||
1380 | return ret; | ||
1381 | |||
1382 | sleep_val = kxcjk1013_get_startup_times(data); | ||
1383 | if (sleep_val < 20000) | ||
1384 | usleep_range(sleep_val, 20000); | ||
1385 | else | ||
1386 | msleep_interruptible(sleep_val/1000); | ||
1387 | |||
1388 | return 0; | ||
1389 | } | ||
735 | #endif | 1390 | #endif |
736 | 1391 | ||
1392 | static const struct dev_pm_ops kxcjk1013_pm_ops = { | ||
1393 | SET_SYSTEM_SLEEP_PM_OPS(kxcjk1013_suspend, kxcjk1013_resume) | ||
1394 | SET_RUNTIME_PM_OPS(kxcjk1013_runtime_suspend, | ||
1395 | kxcjk1013_runtime_resume, NULL) | ||
1396 | }; | ||
1397 | |||
737 | static const struct acpi_device_id kx_acpi_match[] = { | 1398 | static const struct acpi_device_id kx_acpi_match[] = { |
738 | {"KXCJ1013", 0}, | 1399 | {"KXCJ1013", KXCJK1013}, |
1400 | {"KXCJ1008", KXCJ91008}, | ||
1401 | {"KXTJ1009", KXTJ21009}, | ||
739 | { }, | 1402 | { }, |
740 | }; | 1403 | }; |
741 | MODULE_DEVICE_TABLE(acpi, kx_acpi_match); | 1404 | MODULE_DEVICE_TABLE(acpi, kx_acpi_match); |
742 | 1405 | ||
743 | static const struct i2c_device_id kxcjk1013_id[] = { | 1406 | static const struct i2c_device_id kxcjk1013_id[] = { |
744 | {"kxcjk1013", 0}, | 1407 | {"kxcjk1013", KXCJK1013}, |
1408 | {"kxcj91008", KXCJ91008}, | ||
1409 | {"kxtj21009", KXTJ21009}, | ||
745 | {} | 1410 | {} |
746 | }; | 1411 | }; |
747 | 1412 | ||
@@ -751,7 +1416,7 @@ static struct i2c_driver kxcjk1013_driver = { | |||
751 | .driver = { | 1416 | .driver = { |
752 | .name = KXCJK1013_DRV_NAME, | 1417 | .name = KXCJK1013_DRV_NAME, |
753 | .acpi_match_table = ACPI_PTR(kx_acpi_match), | 1418 | .acpi_match_table = ACPI_PTR(kx_acpi_match), |
754 | .pm = KXCJK1013_PM_OPS, | 1419 | .pm = &kxcjk1013_pm_ops, |
755 | }, | 1420 | }, |
756 | .probe = kxcjk1013_probe, | 1421 | .probe = kxcjk1013_probe, |
757 | .remove = kxcjk1013_remove, | 1422 | .remove = kxcjk1013_remove, |
diff --git a/drivers/iio/accel/st_accel.h b/drivers/iio/accel/st_accel.h index c3877630b2e4..fa9646034305 100644 --- a/drivers/iio/accel/st_accel.h +++ b/drivers/iio/accel/st_accel.h | |||
@@ -33,8 +33,7 @@ static const struct st_sensors_platform_data default_accel_pdata = { | |||
33 | .drdy_int_pin = 1, | 33 | .drdy_int_pin = 1, |
34 | }; | 34 | }; |
35 | 35 | ||
36 | int st_accel_common_probe(struct iio_dev *indio_dev, | 36 | int st_accel_common_probe(struct iio_dev *indio_dev); |
37 | struct st_sensors_platform_data *pdata); | ||
38 | void st_accel_common_remove(struct iio_dev *indio_dev); | 37 | void st_accel_common_remove(struct iio_dev *indio_dev); |
39 | 38 | ||
40 | #ifdef CONFIG_IIO_BUFFER | 39 | #ifdef CONFIG_IIO_BUFFER |
diff --git a/drivers/iio/accel/st_accel_core.c b/drivers/iio/accel/st_accel_core.c index 087864854c61..53f32629283a 100644 --- a/drivers/iio/accel/st_accel_core.c +++ b/drivers/iio/accel/st_accel_core.c | |||
@@ -161,7 +161,7 @@ static const struct iio_chan_spec st_accel_16bit_channels[] = { | |||
161 | IIO_CHAN_SOFT_TIMESTAMP(3) | 161 | IIO_CHAN_SOFT_TIMESTAMP(3) |
162 | }; | 162 | }; |
163 | 163 | ||
164 | static const struct st_sensors st_accel_sensors[] = { | 164 | static const struct st_sensor_settings st_accel_sensors_settings[] = { |
165 | { | 165 | { |
166 | .wai = ST_ACCEL_1_WAI_EXP, | 166 | .wai = ST_ACCEL_1_WAI_EXP, |
167 | .sensors_supported = { | 167 | .sensors_supported = { |
@@ -457,8 +457,7 @@ static const struct iio_trigger_ops st_accel_trigger_ops = { | |||
457 | #define ST_ACCEL_TRIGGER_OPS NULL | 457 | #define ST_ACCEL_TRIGGER_OPS NULL |
458 | #endif | 458 | #endif |
459 | 459 | ||
460 | int st_accel_common_probe(struct iio_dev *indio_dev, | 460 | int st_accel_common_probe(struct iio_dev *indio_dev) |
461 | struct st_sensors_platform_data *plat_data) | ||
462 | { | 461 | { |
463 | struct st_sensor_data *adata = iio_priv(indio_dev); | 462 | struct st_sensor_data *adata = iio_priv(indio_dev); |
464 | int irq = adata->get_irq_data_ready(indio_dev); | 463 | int irq = adata->get_irq_data_ready(indio_dev); |
@@ -470,24 +469,25 @@ int st_accel_common_probe(struct iio_dev *indio_dev, | |||
470 | st_sensors_power_enable(indio_dev); | 469 | st_sensors_power_enable(indio_dev); |
471 | 470 | ||
472 | err = st_sensors_check_device_support(indio_dev, | 471 | err = st_sensors_check_device_support(indio_dev, |
473 | ARRAY_SIZE(st_accel_sensors), st_accel_sensors); | 472 | ARRAY_SIZE(st_accel_sensors_settings), |
473 | st_accel_sensors_settings); | ||
474 | if (err < 0) | 474 | if (err < 0) |
475 | return err; | 475 | return err; |
476 | 476 | ||
477 | adata->num_data_channels = ST_ACCEL_NUMBER_DATA_CHANNELS; | 477 | adata->num_data_channels = ST_ACCEL_NUMBER_DATA_CHANNELS; |
478 | adata->multiread_bit = adata->sensor->multi_read_bit; | 478 | adata->multiread_bit = adata->sensor_settings->multi_read_bit; |
479 | indio_dev->channels = adata->sensor->ch; | 479 | indio_dev->channels = adata->sensor_settings->ch; |
480 | indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS; | 480 | indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS; |
481 | 481 | ||
482 | adata->current_fullscale = (struct st_sensor_fullscale_avl *) | 482 | adata->current_fullscale = (struct st_sensor_fullscale_avl *) |
483 | &adata->sensor->fs.fs_avl[0]; | 483 | &adata->sensor_settings->fs.fs_avl[0]; |
484 | adata->odr = adata->sensor->odr.odr_avl[0].hz; | 484 | adata->odr = adata->sensor_settings->odr.odr_avl[0].hz; |
485 | 485 | ||
486 | if (!plat_data) | 486 | if (!adata->dev->platform_data) |
487 | plat_data = | 487 | adata->dev->platform_data = |
488 | (struct st_sensors_platform_data *)&default_accel_pdata; | 488 | (struct st_sensors_platform_data *)&default_accel_pdata; |
489 | 489 | ||
490 | err = st_sensors_init_sensor(indio_dev, plat_data); | 490 | err = st_sensors_init_sensor(indio_dev, adata->dev->platform_data); |
491 | if (err < 0) | 491 | if (err < 0) |
492 | return err; | 492 | return err; |
493 | 493 | ||
diff --git a/drivers/iio/accel/st_accel_i2c.c b/drivers/iio/accel/st_accel_i2c.c index 7164aeff3ab1..c7246bdd30b9 100644 --- a/drivers/iio/accel/st_accel_i2c.c +++ b/drivers/iio/accel/st_accel_i2c.c | |||
@@ -79,12 +79,11 @@ static int st_accel_i2c_probe(struct i2c_client *client, | |||
79 | return -ENOMEM; | 79 | return -ENOMEM; |
80 | 80 | ||
81 | adata = iio_priv(indio_dev); | 81 | adata = iio_priv(indio_dev); |
82 | adata->dev = &client->dev; | ||
83 | st_sensors_of_i2c_probe(client, st_accel_of_match); | 82 | st_sensors_of_i2c_probe(client, st_accel_of_match); |
84 | 83 | ||
85 | st_sensors_i2c_configure(indio_dev, client, adata); | 84 | st_sensors_i2c_configure(indio_dev, client, adata); |
86 | 85 | ||
87 | err = st_accel_common_probe(indio_dev, client->dev.platform_data); | 86 | err = st_accel_common_probe(indio_dev); |
88 | if (err < 0) | 87 | if (err < 0) |
89 | return err; | 88 | return err; |
90 | 89 | ||
diff --git a/drivers/iio/accel/st_accel_spi.c b/drivers/iio/accel/st_accel_spi.c index 195639646e34..12ec29389e4b 100644 --- a/drivers/iio/accel/st_accel_spi.c +++ b/drivers/iio/accel/st_accel_spi.c | |||
@@ -29,11 +29,10 @@ static int st_accel_spi_probe(struct spi_device *spi) | |||
29 | return -ENOMEM; | 29 | return -ENOMEM; |
30 | 30 | ||
31 | adata = iio_priv(indio_dev); | 31 | adata = iio_priv(indio_dev); |
32 | adata->dev = &spi->dev; | ||
33 | 32 | ||
34 | st_sensors_spi_configure(indio_dev, spi, adata); | 33 | st_sensors_spi_configure(indio_dev, spi, adata); |
35 | 34 | ||
36 | err = st_accel_common_probe(indio_dev, spi->dev.platform_data); | 35 | err = st_accel_common_probe(indio_dev); |
37 | if (err < 0) | 36 | if (err < 0) |
38 | return err; | 37 | return err; |
39 | 38 | ||
diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig index 11b048a59fde..0f79e4725763 100644 --- a/drivers/iio/adc/Kconfig +++ b/drivers/iio/adc/Kconfig | |||
@@ -127,9 +127,17 @@ config AT91_ADC | |||
127 | help | 127 | help |
128 | Say yes here to build support for Atmel AT91 ADC. | 128 | Say yes here to build support for Atmel AT91 ADC. |
129 | 129 | ||
130 | config AXP288_ADC | ||
131 | tristate "X-Powers AXP288 ADC driver" | ||
132 | depends on MFD_AXP20X | ||
133 | help | ||
134 | Say yes here to have support for X-Powers power management IC (PMIC) ADC | ||
135 | device. Depending on platform configuration, this general purpose ADC can | ||
136 | be used for sampling sensors such as thermal resistors. | ||
137 | |||
130 | config EXYNOS_ADC | 138 | config EXYNOS_ADC |
131 | tristate "Exynos ADC driver support" | 139 | tristate "Exynos ADC driver support" |
132 | depends on ARCH_EXYNOS || (OF && COMPILE_TEST) | 140 | depends on ARCH_EXYNOS || ARCH_S3C24XX || ARCH_S3C64XX || (OF && COMPILE_TEST) |
133 | help | 141 | help |
134 | Core support for the ADC block found in the Samsung EXYNOS series | 142 | Core support for the ADC block found in the Samsung EXYNOS series |
135 | of SoCs for drivers such as the touchscreen and hwmon to use to share | 143 | of SoCs for drivers such as the touchscreen and hwmon to use to share |
@@ -206,6 +214,30 @@ config NAU7802 | |||
206 | To compile this driver as a module, choose M here: the | 214 | To compile this driver as a module, choose M here: the |
207 | module will be called nau7802. | 215 | module will be called nau7802. |
208 | 216 | ||
217 | config QCOM_SPMI_IADC | ||
218 | tristate "Qualcomm SPMI PMIC current ADC" | ||
219 | depends on SPMI | ||
220 | select REGMAP_SPMI | ||
221 | help | ||
222 | This is the IIO Current ADC driver for Qualcomm QPNP IADC Chip. | ||
223 | |||
224 | The driver supports single mode operation to read from one of two | ||
225 | channels (external or internal). Hardware have additional | ||
226 | channels internally used for gain and offset calibration. | ||
227 | |||
228 | To compile this driver as a module, choose M here: the module will | ||
229 | be called qcom-spmi-iadc. | ||
230 | |||
231 | config ROCKCHIP_SARADC | ||
232 | tristate "Rockchip SARADC driver" | ||
233 | depends on ARCH_ROCKCHIP || (ARM && COMPILE_TEST) | ||
234 | help | ||
235 | Say yes here to build support for the SARADC found in SoCs from | ||
236 | Rockchip. | ||
237 | |||
238 | To compile this driver as a module, choose M here: the | ||
239 | module will be called rockchip_saradc. | ||
240 | |||
209 | config TI_ADC081C | 241 | config TI_ADC081C |
210 | tristate "Texas Instruments ADC081C021/027" | 242 | tristate "Texas Instruments ADC081C021/027" |
211 | depends on I2C | 243 | depends on I2C |
@@ -216,6 +248,16 @@ config TI_ADC081C | |||
216 | This driver can also be built as a module. If so, the module will be | 248 | This driver can also be built as a module. If so, the module will be |
217 | called ti-adc081c. | 249 | called ti-adc081c. |
218 | 250 | ||
251 | config TI_ADC128S052 | ||
252 | tristate "Texas Instruments ADC128S052" | ||
253 | depends on SPI | ||
254 | help | ||
255 | If you say yes here you get support for Texas Instruments ADC128S052 | ||
256 | chip. | ||
257 | |||
258 | This driver can also be built as a module. If so, the module will be | ||
259 | called ti-adc128s052. | ||
260 | |||
219 | config TI_AM335X_ADC | 261 | config TI_AM335X_ADC |
220 | tristate "TI's AM335X ADC driver" | 262 | tristate "TI's AM335X ADC driver" |
221 | depends on MFD_TI_AM335X_TSCADC | 263 | depends on MFD_TI_AM335X_TSCADC |
diff --git a/drivers/iio/adc/Makefile b/drivers/iio/adc/Makefile index ad81b512aa3d..701fdb7c96aa 100644 --- a/drivers/iio/adc/Makefile +++ b/drivers/iio/adc/Makefile | |||
@@ -14,6 +14,7 @@ obj-$(CONFIG_AD7793) += ad7793.o | |||
14 | obj-$(CONFIG_AD7887) += ad7887.o | 14 | obj-$(CONFIG_AD7887) += ad7887.o |
15 | obj-$(CONFIG_AD799X) += ad799x.o | 15 | obj-$(CONFIG_AD799X) += ad799x.o |
16 | obj-$(CONFIG_AT91_ADC) += at91_adc.o | 16 | obj-$(CONFIG_AT91_ADC) += at91_adc.o |
17 | obj-$(CONFIG_AXP288_ADC) += axp288_adc.o | ||
17 | obj-$(CONFIG_EXYNOS_ADC) += exynos_adc.o | 18 | obj-$(CONFIG_EXYNOS_ADC) += exynos_adc.o |
18 | obj-$(CONFIG_LP8788_ADC) += lp8788_adc.o | 19 | obj-$(CONFIG_LP8788_ADC) += lp8788_adc.o |
19 | obj-$(CONFIG_MAX1027) += max1027.o | 20 | obj-$(CONFIG_MAX1027) += max1027.o |
@@ -22,7 +23,10 @@ obj-$(CONFIG_MCP320X) += mcp320x.o | |||
22 | obj-$(CONFIG_MCP3422) += mcp3422.o | 23 | obj-$(CONFIG_MCP3422) += mcp3422.o |
23 | obj-$(CONFIG_MEN_Z188_ADC) += men_z188_adc.o | 24 | obj-$(CONFIG_MEN_Z188_ADC) += men_z188_adc.o |
24 | obj-$(CONFIG_NAU7802) += nau7802.o | 25 | obj-$(CONFIG_NAU7802) += nau7802.o |
26 | obj-$(CONFIG_QCOM_SPMI_IADC) += qcom-spmi-iadc.o | ||
27 | obj-$(CONFIG_ROCKCHIP_SARADC) += rockchip_saradc.o | ||
25 | obj-$(CONFIG_TI_ADC081C) += ti-adc081c.o | 28 | obj-$(CONFIG_TI_ADC081C) += ti-adc081c.o |
29 | obj-$(CONFIG_TI_ADC128S052) += ti-adc128s052.o | ||
26 | obj-$(CONFIG_TI_AM335X_ADC) += ti_am335x_adc.o | 30 | obj-$(CONFIG_TI_AM335X_ADC) += ti_am335x_adc.o |
27 | obj-$(CONFIG_TWL4030_MADC) += twl4030-madc.o | 31 | obj-$(CONFIG_TWL4030_MADC) += twl4030-madc.o |
28 | obj-$(CONFIG_TWL6030_GPADC) += twl6030-gpadc.o | 32 | obj-$(CONFIG_TWL6030_GPADC) += twl6030-gpadc.o |
diff --git a/drivers/iio/adc/at91_adc.c b/drivers/iio/adc/at91_adc.c index 7eadaf16adc1..ff61ae55dd3f 100644 --- a/drivers/iio/adc/at91_adc.c +++ b/drivers/iio/adc/at91_adc.c | |||
@@ -267,7 +267,7 @@ static irqreturn_t at91_adc_trigger_handler(int irq, void *p) | |||
267 | } | 267 | } |
268 | 268 | ||
269 | /* Handler for classic adc channel eoc trigger */ | 269 | /* Handler for classic adc channel eoc trigger */ |
270 | void handle_adc_eoc_trigger(int irq, struct iio_dev *idev) | 270 | static void handle_adc_eoc_trigger(int irq, struct iio_dev *idev) |
271 | { | 271 | { |
272 | struct at91_adc_state *st = iio_priv(idev); | 272 | struct at91_adc_state *st = iio_priv(idev); |
273 | 273 | ||
diff --git a/drivers/iio/adc/axp288_adc.c b/drivers/iio/adc/axp288_adc.c new file mode 100644 index 000000000000..08bcfb061ca5 --- /dev/null +++ b/drivers/iio/adc/axp288_adc.c | |||
@@ -0,0 +1,261 @@ | |||
1 | /* | ||
2 | * axp288_adc.c - X-Powers AXP288 PMIC ADC Driver | ||
3 | * | ||
4 | * Copyright (C) 2014 Intel Corporation | ||
5 | * | ||
6 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License as published by | ||
10 | * the Free Software Foundation; version 2 of the License. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but | ||
13 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | * | ||
17 | */ | ||
18 | |||
19 | #include <linux/module.h> | ||
20 | #include <linux/kernel.h> | ||
21 | #include <linux/device.h> | ||
22 | #include <linux/regmap.h> | ||
23 | #include <linux/mfd/axp20x.h> | ||
24 | #include <linux/platform_device.h> | ||
25 | |||
26 | #include <linux/iio/iio.h> | ||
27 | #include <linux/iio/machine.h> | ||
28 | #include <linux/iio/driver.h> | ||
29 | |||
30 | #define AXP288_ADC_EN_MASK 0xF1 | ||
31 | #define AXP288_ADC_TS_PIN_GPADC 0xF2 | ||
32 | #define AXP288_ADC_TS_PIN_ON 0xF3 | ||
33 | |||
34 | enum axp288_adc_id { | ||
35 | AXP288_ADC_TS, | ||
36 | AXP288_ADC_PMIC, | ||
37 | AXP288_ADC_GP, | ||
38 | AXP288_ADC_BATT_CHRG_I, | ||
39 | AXP288_ADC_BATT_DISCHRG_I, | ||
40 | AXP288_ADC_BATT_V, | ||
41 | AXP288_ADC_NR_CHAN, | ||
42 | }; | ||
43 | |||
44 | struct axp288_adc_info { | ||
45 | int irq; | ||
46 | struct regmap *regmap; | ||
47 | }; | ||
48 | |||
49 | static const struct iio_chan_spec const axp288_adc_channels[] = { | ||
50 | { | ||
51 | .indexed = 1, | ||
52 | .type = IIO_TEMP, | ||
53 | .channel = 0, | ||
54 | .address = AXP288_TS_ADC_H, | ||
55 | .datasheet_name = "TS_PIN", | ||
56 | }, { | ||
57 | .indexed = 1, | ||
58 | .type = IIO_TEMP, | ||
59 | .channel = 1, | ||
60 | .address = AXP288_PMIC_ADC_H, | ||
61 | .datasheet_name = "PMIC_TEMP", | ||
62 | }, { | ||
63 | .indexed = 1, | ||
64 | .type = IIO_TEMP, | ||
65 | .channel = 2, | ||
66 | .address = AXP288_GP_ADC_H, | ||
67 | .datasheet_name = "GPADC", | ||
68 | }, { | ||
69 | .indexed = 1, | ||
70 | .type = IIO_CURRENT, | ||
71 | .channel = 3, | ||
72 | .address = AXP20X_BATT_CHRG_I_H, | ||
73 | .datasheet_name = "BATT_CHG_I", | ||
74 | .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), | ||
75 | }, { | ||
76 | .indexed = 1, | ||
77 | .type = IIO_CURRENT, | ||
78 | .channel = 4, | ||
79 | .address = AXP20X_BATT_DISCHRG_I_H, | ||
80 | .datasheet_name = "BATT_DISCHRG_I", | ||
81 | .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), | ||
82 | }, { | ||
83 | .indexed = 1, | ||
84 | .type = IIO_VOLTAGE, | ||
85 | .channel = 5, | ||
86 | .address = AXP20X_BATT_V_H, | ||
87 | .datasheet_name = "BATT_V", | ||
88 | .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), | ||
89 | }, | ||
90 | }; | ||
91 | |||
92 | #define AXP288_ADC_MAP(_adc_channel_label, _consumer_dev_name, \ | ||
93 | _consumer_channel) \ | ||
94 | { \ | ||
95 | .adc_channel_label = _adc_channel_label, \ | ||
96 | .consumer_dev_name = _consumer_dev_name, \ | ||
97 | .consumer_channel = _consumer_channel, \ | ||
98 | } | ||
99 | |||
100 | /* for consumer drivers */ | ||
101 | static struct iio_map axp288_adc_default_maps[] = { | ||
102 | AXP288_ADC_MAP("TS_PIN", "axp288-batt", "axp288-batt-temp"), | ||
103 | AXP288_ADC_MAP("PMIC_TEMP", "axp288-pmic", "axp288-pmic-temp"), | ||
104 | AXP288_ADC_MAP("GPADC", "axp288-gpadc", "axp288-system-temp"), | ||
105 | AXP288_ADC_MAP("BATT_CHG_I", "axp288-chrg", "axp288-chrg-curr"), | ||
106 | AXP288_ADC_MAP("BATT_DISCHRG_I", "axp288-chrg", "axp288-chrg-d-curr"), | ||
107 | AXP288_ADC_MAP("BATT_V", "axp288-batt", "axp288-batt-volt"), | ||
108 | {}, | ||
109 | }; | ||
110 | |||
111 | static int axp288_adc_read_channel(int *val, unsigned long address, | ||
112 | struct regmap *regmap) | ||
113 | { | ||
114 | u8 buf[2]; | ||
115 | |||
116 | if (regmap_bulk_read(regmap, address, buf, 2)) | ||
117 | return -EIO; | ||
118 | *val = (buf[0] << 4) + ((buf[1] >> 4) & 0x0F); | ||
119 | |||
120 | return IIO_VAL_INT; | ||
121 | } | ||
122 | |||
123 | static int axp288_adc_set_ts(struct regmap *regmap, unsigned int mode, | ||
124 | unsigned long address) | ||
125 | { | ||
126 | /* channels other than GPADC do not need to switch TS pin */ | ||
127 | if (address != AXP288_GP_ADC_H) | ||
128 | return 0; | ||
129 | |||
130 | return regmap_write(regmap, AXP288_ADC_TS_PIN_CTRL, mode); | ||
131 | } | ||
132 | |||
133 | static int axp288_adc_read_raw(struct iio_dev *indio_dev, | ||
134 | struct iio_chan_spec const *chan, | ||
135 | int *val, int *val2, long mask) | ||
136 | { | ||
137 | int ret; | ||
138 | struct axp288_adc_info *info = iio_priv(indio_dev); | ||
139 | |||
140 | mutex_lock(&indio_dev->mlock); | ||
141 | switch (mask) { | ||
142 | case IIO_CHAN_INFO_RAW: | ||
143 | if (axp288_adc_set_ts(info->regmap, AXP288_ADC_TS_PIN_GPADC, | ||
144 | chan->address)) { | ||
145 | dev_err(&indio_dev->dev, "GPADC mode\n"); | ||
146 | ret = -EINVAL; | ||
147 | break; | ||
148 | } | ||
149 | ret = axp288_adc_read_channel(val, chan->address, info->regmap); | ||
150 | if (axp288_adc_set_ts(info->regmap, AXP288_ADC_TS_PIN_ON, | ||
151 | chan->address)) | ||
152 | dev_err(&indio_dev->dev, "TS pin restore\n"); | ||
153 | break; | ||
154 | case IIO_CHAN_INFO_PROCESSED: | ||
155 | ret = axp288_adc_read_channel(val, chan->address, info->regmap); | ||
156 | break; | ||
157 | default: | ||
158 | ret = -EINVAL; | ||
159 | } | ||
160 | mutex_unlock(&indio_dev->mlock); | ||
161 | |||
162 | return ret; | ||
163 | } | ||
164 | |||
165 | static int axp288_adc_set_state(struct regmap *regmap) | ||
166 | { | ||
167 | /* ADC should be always enabled for internal FG to function */ | ||
168 | if (regmap_write(regmap, AXP288_ADC_TS_PIN_CTRL, AXP288_ADC_TS_PIN_ON)) | ||
169 | return -EIO; | ||
170 | |||
171 | return regmap_write(regmap, AXP20X_ADC_EN1, AXP288_ADC_EN_MASK); | ||
172 | } | ||
173 | |||
174 | static const struct iio_info axp288_adc_iio_info = { | ||
175 | .read_raw = &axp288_adc_read_raw, | ||
176 | .driver_module = THIS_MODULE, | ||
177 | }; | ||
178 | |||
179 | static int axp288_adc_probe(struct platform_device *pdev) | ||
180 | { | ||
181 | int ret; | ||
182 | struct axp288_adc_info *info; | ||
183 | struct iio_dev *indio_dev; | ||
184 | struct axp20x_dev *axp20x = dev_get_drvdata(pdev->dev.parent); | ||
185 | |||
186 | indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*info)); | ||
187 | if (!indio_dev) | ||
188 | return -ENOMEM; | ||
189 | |||
190 | info = iio_priv(indio_dev); | ||
191 | info->irq = platform_get_irq(pdev, 0); | ||
192 | if (info->irq < 0) { | ||
193 | dev_err(&pdev->dev, "no irq resource?\n"); | ||
194 | return info->irq; | ||
195 | } | ||
196 | platform_set_drvdata(pdev, indio_dev); | ||
197 | info->regmap = axp20x->regmap; | ||
198 | /* | ||
199 | * Set ADC to enabled state at all time, including system suspend. | ||
200 | * otherwise internal fuel gauge functionality may be affected. | ||
201 | */ | ||
202 | ret = axp288_adc_set_state(axp20x->regmap); | ||
203 | if (ret) { | ||
204 | dev_err(&pdev->dev, "unable to enable ADC device\n"); | ||
205 | return ret; | ||
206 | } | ||
207 | |||
208 | indio_dev->dev.parent = &pdev->dev; | ||
209 | indio_dev->name = pdev->name; | ||
210 | indio_dev->channels = axp288_adc_channels; | ||
211 | indio_dev->num_channels = ARRAY_SIZE(axp288_adc_channels); | ||
212 | indio_dev->info = &axp288_adc_iio_info; | ||
213 | indio_dev->modes = INDIO_DIRECT_MODE; | ||
214 | ret = iio_map_array_register(indio_dev, axp288_adc_default_maps); | ||
215 | if (ret < 0) | ||
216 | return ret; | ||
217 | |||
218 | ret = iio_device_register(indio_dev); | ||
219 | if (ret < 0) { | ||
220 | dev_err(&pdev->dev, "unable to register iio device\n"); | ||
221 | goto err_array_unregister; | ||
222 | } | ||
223 | return 0; | ||
224 | |||
225 | err_array_unregister: | ||
226 | iio_map_array_unregister(indio_dev); | ||
227 | |||
228 | return ret; | ||
229 | } | ||
230 | |||
231 | static int axp288_adc_remove(struct platform_device *pdev) | ||
232 | { | ||
233 | struct iio_dev *indio_dev = platform_get_drvdata(pdev); | ||
234 | |||
235 | iio_device_unregister(indio_dev); | ||
236 | iio_map_array_unregister(indio_dev); | ||
237 | |||
238 | return 0; | ||
239 | } | ||
240 | |||
241 | static struct platform_device_id axp288_adc_id_table[] = { | ||
242 | { .name = "axp288_adc" }, | ||
243 | {}, | ||
244 | }; | ||
245 | |||
246 | static struct platform_driver axp288_adc_driver = { | ||
247 | .probe = axp288_adc_probe, | ||
248 | .remove = axp288_adc_remove, | ||
249 | .id_table = axp288_adc_id_table, | ||
250 | .driver = { | ||
251 | .name = "axp288_adc", | ||
252 | }, | ||
253 | }; | ||
254 | |||
255 | MODULE_DEVICE_TABLE(platform, axp288_adc_id_table); | ||
256 | |||
257 | module_platform_driver(axp288_adc_driver); | ||
258 | |||
259 | MODULE_AUTHOR("Jacob Pan <jacob.jun.pan@linux.intel.com>"); | ||
260 | MODULE_DESCRIPTION("X-Powers AXP288 ADC Driver"); | ||
261 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/iio/adc/exynos_adc.c b/drivers/iio/adc/exynos_adc.c index fc9dfc23ecb7..3a2dbb3b4926 100644 --- a/drivers/iio/adc/exynos_adc.c +++ b/drivers/iio/adc/exynos_adc.c | |||
@@ -39,14 +39,19 @@ | |||
39 | #include <linux/iio/iio.h> | 39 | #include <linux/iio/iio.h> |
40 | #include <linux/iio/machine.h> | 40 | #include <linux/iio/machine.h> |
41 | #include <linux/iio/driver.h> | 41 | #include <linux/iio/driver.h> |
42 | #include <linux/mfd/syscon.h> | ||
43 | #include <linux/regmap.h> | ||
42 | 44 | ||
43 | /* EXYNOS4412/5250 ADC_V1 registers definitions */ | 45 | /* S3C/EXYNOS4412/5250 ADC_V1 registers definitions */ |
44 | #define ADC_V1_CON(x) ((x) + 0x00) | 46 | #define ADC_V1_CON(x) ((x) + 0x00) |
45 | #define ADC_V1_DLY(x) ((x) + 0x08) | 47 | #define ADC_V1_DLY(x) ((x) + 0x08) |
46 | #define ADC_V1_DATX(x) ((x) + 0x0C) | 48 | #define ADC_V1_DATX(x) ((x) + 0x0C) |
47 | #define ADC_V1_INTCLR(x) ((x) + 0x18) | 49 | #define ADC_V1_INTCLR(x) ((x) + 0x18) |
48 | #define ADC_V1_MUX(x) ((x) + 0x1c) | 50 | #define ADC_V1_MUX(x) ((x) + 0x1c) |
49 | 51 | ||
52 | /* S3C2410 ADC registers definitions */ | ||
53 | #define ADC_S3C2410_MUX(x) ((x) + 0x18) | ||
54 | |||
50 | /* Future ADC_V2 registers definitions */ | 55 | /* Future ADC_V2 registers definitions */ |
51 | #define ADC_V2_CON1(x) ((x) + 0x00) | 56 | #define ADC_V2_CON1(x) ((x) + 0x00) |
52 | #define ADC_V2_CON2(x) ((x) + 0x04) | 57 | #define ADC_V2_CON2(x) ((x) + 0x04) |
@@ -61,6 +66,11 @@ | |||
61 | #define ADC_V1_CON_PRSCLV(x) (((x) & 0xFF) << 6) | 66 | #define ADC_V1_CON_PRSCLV(x) (((x) & 0xFF) << 6) |
62 | #define ADC_V1_CON_STANDBY (1u << 2) | 67 | #define ADC_V1_CON_STANDBY (1u << 2) |
63 | 68 | ||
69 | /* Bit definitions for S3C2410 ADC */ | ||
70 | #define ADC_S3C2410_CON_SELMUX(x) (((x) & 7) << 3) | ||
71 | #define ADC_S3C2410_DATX_MASK 0x3FF | ||
72 | #define ADC_S3C2416_CON_RES_SEL (1u << 3) | ||
73 | |||
64 | /* Bit definitions for ADC_V2 */ | 74 | /* Bit definitions for ADC_V2 */ |
65 | #define ADC_V2_CON1_SOFT_RESET (1u << 2) | 75 | #define ADC_V2_CON1_SOFT_RESET (1u << 2) |
66 | 76 | ||
@@ -77,15 +87,19 @@ | |||
77 | 87 | ||
78 | /* Bit definitions common for ADC_V1 and ADC_V2 */ | 88 | /* Bit definitions common for ADC_V1 and ADC_V2 */ |
79 | #define ADC_CON_EN_START (1u << 0) | 89 | #define ADC_CON_EN_START (1u << 0) |
90 | #define ADC_CON_EN_START_MASK (0x3 << 0) | ||
80 | #define ADC_DATX_MASK 0xFFF | 91 | #define ADC_DATX_MASK 0xFFF |
81 | 92 | ||
82 | #define EXYNOS_ADC_TIMEOUT (msecs_to_jiffies(100)) | 93 | #define EXYNOS_ADC_TIMEOUT (msecs_to_jiffies(100)) |
83 | 94 | ||
95 | #define EXYNOS_ADCV1_PHY_OFFSET 0x0718 | ||
96 | #define EXYNOS_ADCV2_PHY_OFFSET 0x0720 | ||
97 | |||
84 | struct exynos_adc { | 98 | struct exynos_adc { |
85 | struct exynos_adc_data *data; | 99 | struct exynos_adc_data *data; |
86 | struct device *dev; | 100 | struct device *dev; |
87 | void __iomem *regs; | 101 | void __iomem *regs; |
88 | void __iomem *enable_reg; | 102 | struct regmap *pmu_map; |
89 | struct clk *clk; | 103 | struct clk *clk; |
90 | struct clk *sclk; | 104 | struct clk *sclk; |
91 | unsigned int irq; | 105 | unsigned int irq; |
@@ -100,6 +114,9 @@ struct exynos_adc { | |||
100 | struct exynos_adc_data { | 114 | struct exynos_adc_data { |
101 | int num_channels; | 115 | int num_channels; |
102 | bool needs_sclk; | 116 | bool needs_sclk; |
117 | bool needs_adc_phy; | ||
118 | int phy_offset; | ||
119 | u32 mask; | ||
103 | 120 | ||
104 | void (*init_hw)(struct exynos_adc *info); | 121 | void (*init_hw)(struct exynos_adc *info); |
105 | void (*exit_hw)(struct exynos_adc *info); | 122 | void (*exit_hw)(struct exynos_adc *info); |
@@ -171,7 +188,8 @@ static void exynos_adc_v1_init_hw(struct exynos_adc *info) | |||
171 | { | 188 | { |
172 | u32 con1; | 189 | u32 con1; |
173 | 190 | ||
174 | writel(1, info->enable_reg); | 191 | if (info->data->needs_adc_phy) |
192 | regmap_write(info->pmu_map, info->data->phy_offset, 1); | ||
175 | 193 | ||
176 | /* set default prescaler values and Enable prescaler */ | 194 | /* set default prescaler values and Enable prescaler */ |
177 | con1 = ADC_V1_CON_PRSCLV(49) | ADC_V1_CON_PRSCEN; | 195 | con1 = ADC_V1_CON_PRSCLV(49) | ADC_V1_CON_PRSCEN; |
@@ -185,7 +203,8 @@ static void exynos_adc_v1_exit_hw(struct exynos_adc *info) | |||
185 | { | 203 | { |
186 | u32 con; | 204 | u32 con; |
187 | 205 | ||
188 | writel(0, info->enable_reg); | 206 | if (info->data->needs_adc_phy) |
207 | regmap_write(info->pmu_map, info->data->phy_offset, 0); | ||
189 | 208 | ||
190 | con = readl(ADC_V1_CON(info->regs)); | 209 | con = readl(ADC_V1_CON(info->regs)); |
191 | con |= ADC_V1_CON_STANDBY; | 210 | con |= ADC_V1_CON_STANDBY; |
@@ -210,6 +229,9 @@ static void exynos_adc_v1_start_conv(struct exynos_adc *info, | |||
210 | 229 | ||
211 | static const struct exynos_adc_data exynos_adc_v1_data = { | 230 | static const struct exynos_adc_data exynos_adc_v1_data = { |
212 | .num_channels = MAX_ADC_V1_CHANNELS, | 231 | .num_channels = MAX_ADC_V1_CHANNELS, |
232 | .mask = ADC_DATX_MASK, /* 12 bit ADC resolution */ | ||
233 | .needs_adc_phy = true, | ||
234 | .phy_offset = EXYNOS_ADCV1_PHY_OFFSET, | ||
213 | 235 | ||
214 | .init_hw = exynos_adc_v1_init_hw, | 236 | .init_hw = exynos_adc_v1_init_hw, |
215 | .exit_hw = exynos_adc_v1_exit_hw, | 237 | .exit_hw = exynos_adc_v1_exit_hw, |
@@ -217,11 +239,89 @@ static const struct exynos_adc_data exynos_adc_v1_data = { | |||
217 | .start_conv = exynos_adc_v1_start_conv, | 239 | .start_conv = exynos_adc_v1_start_conv, |
218 | }; | 240 | }; |
219 | 241 | ||
242 | static void exynos_adc_s3c2416_start_conv(struct exynos_adc *info, | ||
243 | unsigned long addr) | ||
244 | { | ||
245 | u32 con1; | ||
246 | |||
247 | /* Enable 12 bit ADC resolution */ | ||
248 | con1 = readl(ADC_V1_CON(info->regs)); | ||
249 | con1 |= ADC_S3C2416_CON_RES_SEL; | ||
250 | writel(con1, ADC_V1_CON(info->regs)); | ||
251 | |||
252 | /* Select channel for S3C2416 */ | ||
253 | writel(addr, ADC_S3C2410_MUX(info->regs)); | ||
254 | |||
255 | con1 = readl(ADC_V1_CON(info->regs)); | ||
256 | writel(con1 | ADC_CON_EN_START, ADC_V1_CON(info->regs)); | ||
257 | } | ||
258 | |||
259 | static struct exynos_adc_data const exynos_adc_s3c2416_data = { | ||
260 | .num_channels = MAX_ADC_V1_CHANNELS, | ||
261 | .mask = ADC_DATX_MASK, /* 12 bit ADC resolution */ | ||
262 | |||
263 | .init_hw = exynos_adc_v1_init_hw, | ||
264 | .exit_hw = exynos_adc_v1_exit_hw, | ||
265 | .start_conv = exynos_adc_s3c2416_start_conv, | ||
266 | }; | ||
267 | |||
268 | static void exynos_adc_s3c2443_start_conv(struct exynos_adc *info, | ||
269 | unsigned long addr) | ||
270 | { | ||
271 | u32 con1; | ||
272 | |||
273 | /* Select channel for S3C2433 */ | ||
274 | writel(addr, ADC_S3C2410_MUX(info->regs)); | ||
275 | |||
276 | con1 = readl(ADC_V1_CON(info->regs)); | ||
277 | writel(con1 | ADC_CON_EN_START, ADC_V1_CON(info->regs)); | ||
278 | } | ||
279 | |||
280 | static struct exynos_adc_data const exynos_adc_s3c2443_data = { | ||
281 | .num_channels = MAX_ADC_V1_CHANNELS, | ||
282 | .mask = ADC_S3C2410_DATX_MASK, /* 10 bit ADC resolution */ | ||
283 | |||
284 | .init_hw = exynos_adc_v1_init_hw, | ||
285 | .exit_hw = exynos_adc_v1_exit_hw, | ||
286 | .start_conv = exynos_adc_s3c2443_start_conv, | ||
287 | }; | ||
288 | |||
289 | static void exynos_adc_s3c64xx_start_conv(struct exynos_adc *info, | ||
290 | unsigned long addr) | ||
291 | { | ||
292 | u32 con1; | ||
293 | |||
294 | con1 = readl(ADC_V1_CON(info->regs)); | ||
295 | con1 &= ~ADC_S3C2410_CON_SELMUX(0x7); | ||
296 | con1 |= ADC_S3C2410_CON_SELMUX(addr); | ||
297 | writel(con1 | ADC_CON_EN_START, ADC_V1_CON(info->regs)); | ||
298 | } | ||
299 | |||
300 | static struct exynos_adc_data const exynos_adc_s3c24xx_data = { | ||
301 | .num_channels = MAX_ADC_V1_CHANNELS, | ||
302 | .mask = ADC_S3C2410_DATX_MASK, /* 10 bit ADC resolution */ | ||
303 | |||
304 | .init_hw = exynos_adc_v1_init_hw, | ||
305 | .exit_hw = exynos_adc_v1_exit_hw, | ||
306 | .start_conv = exynos_adc_s3c64xx_start_conv, | ||
307 | }; | ||
308 | |||
309 | static struct exynos_adc_data const exynos_adc_s3c64xx_data = { | ||
310 | .num_channels = MAX_ADC_V1_CHANNELS, | ||
311 | .mask = ADC_DATX_MASK, /* 12 bit ADC resolution */ | ||
312 | |||
313 | .init_hw = exynos_adc_v1_init_hw, | ||
314 | .exit_hw = exynos_adc_v1_exit_hw, | ||
315 | .clear_irq = exynos_adc_v1_clear_irq, | ||
316 | .start_conv = exynos_adc_s3c64xx_start_conv, | ||
317 | }; | ||
318 | |||
220 | static void exynos_adc_v2_init_hw(struct exynos_adc *info) | 319 | static void exynos_adc_v2_init_hw(struct exynos_adc *info) |
221 | { | 320 | { |
222 | u32 con1, con2; | 321 | u32 con1, con2; |
223 | 322 | ||
224 | writel(1, info->enable_reg); | 323 | if (info->data->needs_adc_phy) |
324 | regmap_write(info->pmu_map, info->data->phy_offset, 1); | ||
225 | 325 | ||
226 | con1 = ADC_V2_CON1_SOFT_RESET; | 326 | con1 = ADC_V2_CON1_SOFT_RESET; |
227 | writel(con1, ADC_V2_CON1(info->regs)); | 327 | writel(con1, ADC_V2_CON1(info->regs)); |
@@ -238,7 +338,8 @@ static void exynos_adc_v2_exit_hw(struct exynos_adc *info) | |||
238 | { | 338 | { |
239 | u32 con; | 339 | u32 con; |
240 | 340 | ||
241 | writel(0, info->enable_reg); | 341 | if (info->data->needs_adc_phy) |
342 | regmap_write(info->pmu_map, info->data->phy_offset, 0); | ||
242 | 343 | ||
243 | con = readl(ADC_V2_CON1(info->regs)); | 344 | con = readl(ADC_V2_CON1(info->regs)); |
244 | con &= ~ADC_CON_EN_START; | 345 | con &= ~ADC_CON_EN_START; |
@@ -266,6 +367,9 @@ static void exynos_adc_v2_start_conv(struct exynos_adc *info, | |||
266 | 367 | ||
267 | static const struct exynos_adc_data exynos_adc_v2_data = { | 368 | static const struct exynos_adc_data exynos_adc_v2_data = { |
268 | .num_channels = MAX_ADC_V2_CHANNELS, | 369 | .num_channels = MAX_ADC_V2_CHANNELS, |
370 | .mask = ADC_DATX_MASK, /* 12 bit ADC resolution */ | ||
371 | .needs_adc_phy = true, | ||
372 | .phy_offset = EXYNOS_ADCV2_PHY_OFFSET, | ||
269 | 373 | ||
270 | .init_hw = exynos_adc_v2_init_hw, | 374 | .init_hw = exynos_adc_v2_init_hw, |
271 | .exit_hw = exynos_adc_v2_exit_hw, | 375 | .exit_hw = exynos_adc_v2_exit_hw, |
@@ -275,7 +379,10 @@ static const struct exynos_adc_data exynos_adc_v2_data = { | |||
275 | 379 | ||
276 | static const struct exynos_adc_data exynos3250_adc_data = { | 380 | static const struct exynos_adc_data exynos3250_adc_data = { |
277 | .num_channels = MAX_EXYNOS3250_ADC_CHANNELS, | 381 | .num_channels = MAX_EXYNOS3250_ADC_CHANNELS, |
382 | .mask = ADC_DATX_MASK, /* 12 bit ADC resolution */ | ||
278 | .needs_sclk = true, | 383 | .needs_sclk = true, |
384 | .needs_adc_phy = true, | ||
385 | .phy_offset = EXYNOS_ADCV1_PHY_OFFSET, | ||
279 | 386 | ||
280 | .init_hw = exynos_adc_v2_init_hw, | 387 | .init_hw = exynos_adc_v2_init_hw, |
281 | .exit_hw = exynos_adc_v2_exit_hw, | 388 | .exit_hw = exynos_adc_v2_exit_hw, |
@@ -283,8 +390,52 @@ static const struct exynos_adc_data exynos3250_adc_data = { | |||
283 | .start_conv = exynos_adc_v2_start_conv, | 390 | .start_conv = exynos_adc_v2_start_conv, |
284 | }; | 391 | }; |
285 | 392 | ||
393 | static void exynos_adc_exynos7_init_hw(struct exynos_adc *info) | ||
394 | { | ||
395 | u32 con1, con2; | ||
396 | |||
397 | if (info->data->needs_adc_phy) | ||
398 | regmap_write(info->pmu_map, info->data->phy_offset, 1); | ||
399 | |||
400 | con1 = ADC_V2_CON1_SOFT_RESET; | ||
401 | writel(con1, ADC_V2_CON1(info->regs)); | ||
402 | |||
403 | con2 = readl(ADC_V2_CON2(info->regs)); | ||
404 | con2 &= ~ADC_V2_CON2_C_TIME(7); | ||
405 | con2 |= ADC_V2_CON2_C_TIME(0); | ||
406 | writel(con2, ADC_V2_CON2(info->regs)); | ||
407 | |||
408 | /* Enable interrupts */ | ||
409 | writel(1, ADC_V2_INT_EN(info->regs)); | ||
410 | } | ||
411 | |||
412 | static const struct exynos_adc_data exynos7_adc_data = { | ||
413 | .num_channels = MAX_ADC_V1_CHANNELS, | ||
414 | .mask = ADC_DATX_MASK, /* 12 bit ADC resolution */ | ||
415 | |||
416 | .init_hw = exynos_adc_exynos7_init_hw, | ||
417 | .exit_hw = exynos_adc_v2_exit_hw, | ||
418 | .clear_irq = exynos_adc_v2_clear_irq, | ||
419 | .start_conv = exynos_adc_v2_start_conv, | ||
420 | }; | ||
421 | |||
286 | static const struct of_device_id exynos_adc_match[] = { | 422 | static const struct of_device_id exynos_adc_match[] = { |
287 | { | 423 | { |
424 | .compatible = "samsung,s3c2410-adc", | ||
425 | .data = &exynos_adc_s3c24xx_data, | ||
426 | }, { | ||
427 | .compatible = "samsung,s3c2416-adc", | ||
428 | .data = &exynos_adc_s3c2416_data, | ||
429 | }, { | ||
430 | .compatible = "samsung,s3c2440-adc", | ||
431 | .data = &exynos_adc_s3c24xx_data, | ||
432 | }, { | ||
433 | .compatible = "samsung,s3c2443-adc", | ||
434 | .data = &exynos_adc_s3c2443_data, | ||
435 | }, { | ||
436 | .compatible = "samsung,s3c6410-adc", | ||
437 | .data = &exynos_adc_s3c64xx_data, | ||
438 | }, { | ||
288 | .compatible = "samsung,exynos-adc-v1", | 439 | .compatible = "samsung,exynos-adc-v1", |
289 | .data = &exynos_adc_v1_data, | 440 | .data = &exynos_adc_v1_data, |
290 | }, { | 441 | }, { |
@@ -293,6 +444,9 @@ static const struct of_device_id exynos_adc_match[] = { | |||
293 | }, { | 444 | }, { |
294 | .compatible = "samsung,exynos3250-adc", | 445 | .compatible = "samsung,exynos3250-adc", |
295 | .data = &exynos3250_adc_data, | 446 | .data = &exynos3250_adc_data, |
447 | }, { | ||
448 | .compatible = "samsung,exynos7-adc", | ||
449 | .data = &exynos7_adc_data, | ||
296 | }, | 450 | }, |
297 | {}, | 451 | {}, |
298 | }; | 452 | }; |
@@ -347,9 +501,10 @@ static int exynos_read_raw(struct iio_dev *indio_dev, | |||
347 | static irqreturn_t exynos_adc_isr(int irq, void *dev_id) | 501 | static irqreturn_t exynos_adc_isr(int irq, void *dev_id) |
348 | { | 502 | { |
349 | struct exynos_adc *info = (struct exynos_adc *)dev_id; | 503 | struct exynos_adc *info = (struct exynos_adc *)dev_id; |
504 | u32 mask = info->data->mask; | ||
350 | 505 | ||
351 | /* Read value */ | 506 | /* Read value */ |
352 | info->value = readl(ADC_V1_DATX(info->regs)) & ADC_DATX_MASK; | 507 | info->value = readl(ADC_V1_DATX(info->regs)) & mask; |
353 | 508 | ||
354 | /* clear irq */ | 509 | /* clear irq */ |
355 | if (info->data->clear_irq) | 510 | if (info->data->clear_irq) |
@@ -442,10 +597,16 @@ static int exynos_adc_probe(struct platform_device *pdev) | |||
442 | if (IS_ERR(info->regs)) | 597 | if (IS_ERR(info->regs)) |
443 | return PTR_ERR(info->regs); | 598 | return PTR_ERR(info->regs); |
444 | 599 | ||
445 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 1); | 600 | |
446 | info->enable_reg = devm_ioremap_resource(&pdev->dev, mem); | 601 | if (info->data->needs_adc_phy) { |
447 | if (IS_ERR(info->enable_reg)) | 602 | info->pmu_map = syscon_regmap_lookup_by_phandle( |
448 | return PTR_ERR(info->enable_reg); | 603 | pdev->dev.of_node, |
604 | "samsung,syscon-phandle"); | ||
605 | if (IS_ERR(info->pmu_map)) { | ||
606 | dev_err(&pdev->dev, "syscon regmap lookup failed.\n"); | ||
607 | return PTR_ERR(info->pmu_map); | ||
608 | } | ||
609 | } | ||
449 | 610 | ||
450 | irq = platform_get_irq(pdev, 0); | 611 | irq = platform_get_irq(pdev, 0); |
451 | if (irq < 0) { | 612 | if (irq < 0) { |
@@ -606,7 +767,6 @@ static struct platform_driver exynos_adc_driver = { | |||
606 | .remove = exynos_adc_remove, | 767 | .remove = exynos_adc_remove, |
607 | .driver = { | 768 | .driver = { |
608 | .name = "exynos-adc", | 769 | .name = "exynos-adc", |
609 | .owner = THIS_MODULE, | ||
610 | .of_match_table = exynos_adc_match, | 770 | .of_match_table = exynos_adc_match, |
611 | .pm = &exynos_adc_pm_ops, | 771 | .pm = &exynos_adc_pm_ops, |
612 | }, | 772 | }, |
diff --git a/drivers/iio/adc/lp8788_adc.c b/drivers/iio/adc/lp8788_adc.c index 5c8c91595f47..152cfc8e1c7b 100644 --- a/drivers/iio/adc/lp8788_adc.c +++ b/drivers/iio/adc/lp8788_adc.c | |||
@@ -244,7 +244,6 @@ static struct platform_driver lp8788_adc_driver = { | |||
244 | .remove = lp8788_adc_remove, | 244 | .remove = lp8788_adc_remove, |
245 | .driver = { | 245 | .driver = { |
246 | .name = LP8788_DEV_ADC, | 246 | .name = LP8788_DEV_ADC, |
247 | .owner = THIS_MODULE, | ||
248 | }, | 247 | }, |
249 | }; | 248 | }; |
250 | module_platform_driver(lp8788_adc_driver); | 249 | module_platform_driver(lp8788_adc_driver); |
diff --git a/drivers/iio/adc/mcp320x.c b/drivers/iio/adc/mcp320x.c index 28a086e48776..efbfd12a4bfd 100644 --- a/drivers/iio/adc/mcp320x.c +++ b/drivers/iio/adc/mcp320x.c | |||
@@ -1,9 +1,30 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (C) 2013 Oskar Andero <oskar.andero@gmail.com> | 2 | * Copyright (C) 2013 Oskar Andero <oskar.andero@gmail.com> |
3 | * Copyright (C) 2014 Rose Technology | ||
4 | * Allan Bendorff Jensen <abj@rosetechnology.dk> | ||
5 | * Soren Andersen <san@rosetechnology.dk> | ||
6 | * | ||
7 | * Driver for following ADC chips from Microchip Technology's: | ||
8 | * 10 Bit converter | ||
9 | * MCP3001 | ||
10 | * MCP3002 | ||
11 | * MCP3004 | ||
12 | * MCP3008 | ||
13 | * ------------ | ||
14 | * 12 bit converter | ||
15 | * MCP3201 | ||
16 | * MCP3202 | ||
17 | * MCP3204 | ||
18 | * MCP3208 | ||
19 | * ------------ | ||
3 | * | 20 | * |
4 | * Driver for Microchip Technology's MCP3204 and MCP3208 ADC chips. | ||
5 | * Datasheet can be found here: | 21 | * Datasheet can be found here: |
6 | * http://ww1.microchip.com/downloads/en/devicedoc/21298c.pdf | 22 | * http://ww1.microchip.com/downloads/en/DeviceDoc/21293C.pdf mcp3001 |
23 | * http://ww1.microchip.com/downloads/en/DeviceDoc/21294E.pdf mcp3002 | ||
24 | * http://ww1.microchip.com/downloads/en/DeviceDoc/21295d.pdf mcp3004/08 | ||
25 | * http://ww1.microchip.com/downloads/en/DeviceDoc/21290D.pdf mcp3201 | ||
26 | * http://ww1.microchip.com/downloads/en/DeviceDoc/21034D.pdf mcp3202 | ||
27 | * http://ww1.microchip.com/downloads/en/DeviceDoc/21298c.pdf mcp3204/08 | ||
7 | * | 28 | * |
8 | * This program is free software; you can redistribute it and/or modify | 29 | * This program is free software; you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License version 2 as | 30 | * it under the terms of the GNU General Public License version 2 as |
@@ -11,19 +32,29 @@ | |||
11 | */ | 32 | */ |
12 | 33 | ||
13 | #include <linux/err.h> | 34 | #include <linux/err.h> |
35 | #include <linux/delay.h> | ||
14 | #include <linux/spi/spi.h> | 36 | #include <linux/spi/spi.h> |
15 | #include <linux/module.h> | 37 | #include <linux/module.h> |
16 | #include <linux/iio/iio.h> | 38 | #include <linux/iio/iio.h> |
17 | #include <linux/regulator/consumer.h> | 39 | #include <linux/regulator/consumer.h> |
18 | 40 | ||
19 | #define MCP_SINGLE_ENDED (1 << 3) | ||
20 | #define MCP_START_BIT (1 << 4) | ||
21 | |||
22 | enum { | 41 | enum { |
42 | mcp3001, | ||
43 | mcp3002, | ||
44 | mcp3004, | ||
45 | mcp3008, | ||
46 | mcp3201, | ||
47 | mcp3202, | ||
23 | mcp3204, | 48 | mcp3204, |
24 | mcp3208, | 49 | mcp3208, |
25 | }; | 50 | }; |
26 | 51 | ||
52 | struct mcp320x_chip_info { | ||
53 | const struct iio_chan_spec *channels; | ||
54 | unsigned int num_channels; | ||
55 | unsigned int resolution; | ||
56 | }; | ||
57 | |||
27 | struct mcp320x { | 58 | struct mcp320x { |
28 | struct spi_device *spi; | 59 | struct spi_device *spi; |
29 | struct spi_message msg; | 60 | struct spi_message msg; |
@@ -34,19 +65,69 @@ struct mcp320x { | |||
34 | 65 | ||
35 | struct regulator *reg; | 66 | struct regulator *reg; |
36 | struct mutex lock; | 67 | struct mutex lock; |
68 | const struct mcp320x_chip_info *chip_info; | ||
37 | }; | 69 | }; |
38 | 70 | ||
39 | static int mcp320x_adc_conversion(struct mcp320x *adc, u8 msg) | 71 | static int mcp320x_channel_to_tx_data(int device_index, |
72 | const unsigned int channel, bool differential) | ||
73 | { | ||
74 | int start_bit = 1; | ||
75 | |||
76 | switch (device_index) { | ||
77 | case mcp3001: | ||
78 | case mcp3201: | ||
79 | return 0; | ||
80 | case mcp3002: | ||
81 | case mcp3202: | ||
82 | return ((start_bit << 4) | (!differential << 3) | | ||
83 | (channel << 2)); | ||
84 | case mcp3004: | ||
85 | case mcp3204: | ||
86 | case mcp3008: | ||
87 | case mcp3208: | ||
88 | return ((start_bit << 6) | (!differential << 5) | | ||
89 | (channel << 2)); | ||
90 | default: | ||
91 | return -EINVAL; | ||
92 | } | ||
93 | } | ||
94 | |||
95 | static int mcp320x_adc_conversion(struct mcp320x *adc, u8 channel, | ||
96 | bool differential, int device_index) | ||
40 | { | 97 | { |
41 | int ret; | 98 | int ret; |
42 | 99 | ||
43 | adc->tx_buf = msg; | 100 | adc->rx_buf[0] = 0; |
44 | ret = spi_sync(adc->spi, &adc->msg); | 101 | adc->rx_buf[1] = 0; |
45 | if (ret < 0) | 102 | adc->tx_buf = mcp320x_channel_to_tx_data(device_index, |
46 | return ret; | 103 | channel, differential); |
104 | |||
105 | if (device_index != mcp3001 && device_index != mcp3201) { | ||
106 | ret = spi_sync(adc->spi, &adc->msg); | ||
107 | if (ret < 0) | ||
108 | return ret; | ||
109 | } else { | ||
110 | ret = spi_read(adc->spi, &adc->rx_buf, sizeof(adc->rx_buf)); | ||
111 | if (ret < 0) | ||
112 | return ret; | ||
113 | } | ||
47 | 114 | ||
48 | return ((adc->rx_buf[0] & 0x3f) << 6) | | 115 | switch (device_index) { |
49 | (adc->rx_buf[1] >> 2); | 116 | case mcp3001: |
117 | return (adc->rx_buf[0] << 5 | adc->rx_buf[1] >> 3); | ||
118 | case mcp3002: | ||
119 | case mcp3004: | ||
120 | case mcp3008: | ||
121 | return (adc->rx_buf[0] << 2 | adc->rx_buf[1] >> 6); | ||
122 | case mcp3201: | ||
123 | return (adc->rx_buf[0] << 7 | adc->rx_buf[1] >> 1); | ||
124 | case mcp3202: | ||
125 | case mcp3204: | ||
126 | case mcp3208: | ||
127 | return (adc->rx_buf[0] << 4 | adc->rx_buf[1] >> 4); | ||
128 | default: | ||
129 | return -EINVAL; | ||
130 | } | ||
50 | } | 131 | } |
51 | 132 | ||
52 | static int mcp320x_read_raw(struct iio_dev *indio_dev, | 133 | static int mcp320x_read_raw(struct iio_dev *indio_dev, |
@@ -55,18 +136,17 @@ static int mcp320x_read_raw(struct iio_dev *indio_dev, | |||
55 | { | 136 | { |
56 | struct mcp320x *adc = iio_priv(indio_dev); | 137 | struct mcp320x *adc = iio_priv(indio_dev); |
57 | int ret = -EINVAL; | 138 | int ret = -EINVAL; |
139 | int device_index = 0; | ||
58 | 140 | ||
59 | mutex_lock(&adc->lock); | 141 | mutex_lock(&adc->lock); |
60 | 142 | ||
143 | device_index = spi_get_device_id(adc->spi)->driver_data; | ||
144 | |||
61 | switch (mask) { | 145 | switch (mask) { |
62 | case IIO_CHAN_INFO_RAW: | 146 | case IIO_CHAN_INFO_RAW: |
63 | if (channel->differential) | 147 | ret = mcp320x_adc_conversion(adc, channel->address, |
64 | ret = mcp320x_adc_conversion(adc, | 148 | channel->differential, device_index); |
65 | MCP_START_BIT | channel->address); | 149 | |
66 | else | ||
67 | ret = mcp320x_adc_conversion(adc, | ||
68 | MCP_START_BIT | MCP_SINGLE_ENDED | | ||
69 | channel->address); | ||
70 | if (ret < 0) | 150 | if (ret < 0) |
71 | goto out; | 151 | goto out; |
72 | 152 | ||
@@ -75,18 +155,15 @@ static int mcp320x_read_raw(struct iio_dev *indio_dev, | |||
75 | break; | 155 | break; |
76 | 156 | ||
77 | case IIO_CHAN_INFO_SCALE: | 157 | case IIO_CHAN_INFO_SCALE: |
78 | /* Digital output code = (4096 * Vin) / Vref */ | ||
79 | ret = regulator_get_voltage(adc->reg); | 158 | ret = regulator_get_voltage(adc->reg); |
80 | if (ret < 0) | 159 | if (ret < 0) |
81 | goto out; | 160 | goto out; |
82 | 161 | ||
162 | /* convert regulator output voltage to mV */ | ||
83 | *val = ret / 1000; | 163 | *val = ret / 1000; |
84 | *val2 = 12; | 164 | *val2 = adc->chip_info->resolution; |
85 | ret = IIO_VAL_FRACTIONAL_LOG2; | 165 | ret = IIO_VAL_FRACTIONAL_LOG2; |
86 | break; | 166 | break; |
87 | |||
88 | default: | ||
89 | break; | ||
90 | } | 167 | } |
91 | 168 | ||
92 | out: | 169 | out: |
@@ -117,6 +194,16 @@ out: | |||
117 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) \ | 194 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) \ |
118 | } | 195 | } |
119 | 196 | ||
197 | static const struct iio_chan_spec mcp3201_channels[] = { | ||
198 | MCP320X_VOLTAGE_CHANNEL_DIFF(0), | ||
199 | }; | ||
200 | |||
201 | static const struct iio_chan_spec mcp3202_channels[] = { | ||
202 | MCP320X_VOLTAGE_CHANNEL(0), | ||
203 | MCP320X_VOLTAGE_CHANNEL(1), | ||
204 | MCP320X_VOLTAGE_CHANNEL_DIFF(0), | ||
205 | }; | ||
206 | |||
120 | static const struct iio_chan_spec mcp3204_channels[] = { | 207 | static const struct iio_chan_spec mcp3204_channels[] = { |
121 | MCP320X_VOLTAGE_CHANNEL(0), | 208 | MCP320X_VOLTAGE_CHANNEL(0), |
122 | MCP320X_VOLTAGE_CHANNEL(1), | 209 | MCP320X_VOLTAGE_CHANNEL(1), |
@@ -146,19 +233,46 @@ static const struct iio_info mcp320x_info = { | |||
146 | .driver_module = THIS_MODULE, | 233 | .driver_module = THIS_MODULE, |
147 | }; | 234 | }; |
148 | 235 | ||
149 | struct mcp3208_chip_info { | 236 | static const struct mcp320x_chip_info mcp320x_chip_infos[] = { |
150 | const struct iio_chan_spec *channels; | 237 | [mcp3001] = { |
151 | unsigned int num_channels; | 238 | .channels = mcp3201_channels, |
152 | }; | 239 | .num_channels = ARRAY_SIZE(mcp3201_channels), |
153 | 240 | .resolution = 10 | |
154 | static const struct mcp3208_chip_info mcp3208_chip_infos[] = { | 241 | }, |
242 | [mcp3002] = { | ||
243 | .channels = mcp3202_channels, | ||
244 | .num_channels = ARRAY_SIZE(mcp3202_channels), | ||
245 | .resolution = 10 | ||
246 | }, | ||
247 | [mcp3004] = { | ||
248 | .channels = mcp3204_channels, | ||
249 | .num_channels = ARRAY_SIZE(mcp3204_channels), | ||
250 | .resolution = 10 | ||
251 | }, | ||
252 | [mcp3008] = { | ||
253 | .channels = mcp3208_channels, | ||
254 | .num_channels = ARRAY_SIZE(mcp3208_channels), | ||
255 | .resolution = 10 | ||
256 | }, | ||
257 | [mcp3201] = { | ||
258 | .channels = mcp3201_channels, | ||
259 | .num_channels = ARRAY_SIZE(mcp3201_channels), | ||
260 | .resolution = 12 | ||
261 | }, | ||
262 | [mcp3202] = { | ||
263 | .channels = mcp3202_channels, | ||
264 | .num_channels = ARRAY_SIZE(mcp3202_channels), | ||
265 | .resolution = 12 | ||
266 | }, | ||
155 | [mcp3204] = { | 267 | [mcp3204] = { |
156 | .channels = mcp3204_channels, | 268 | .channels = mcp3204_channels, |
157 | .num_channels = ARRAY_SIZE(mcp3204_channels) | 269 | .num_channels = ARRAY_SIZE(mcp3204_channels), |
270 | .resolution = 12 | ||
158 | }, | 271 | }, |
159 | [mcp3208] = { | 272 | [mcp3208] = { |
160 | .channels = mcp3208_channels, | 273 | .channels = mcp3208_channels, |
161 | .num_channels = ARRAY_SIZE(mcp3208_channels) | 274 | .num_channels = ARRAY_SIZE(mcp3208_channels), |
275 | .resolution = 12 | ||
162 | }, | 276 | }, |
163 | }; | 277 | }; |
164 | 278 | ||
@@ -166,7 +280,7 @@ static int mcp320x_probe(struct spi_device *spi) | |||
166 | { | 280 | { |
167 | struct iio_dev *indio_dev; | 281 | struct iio_dev *indio_dev; |
168 | struct mcp320x *adc; | 282 | struct mcp320x *adc; |
169 | const struct mcp3208_chip_info *chip_info; | 283 | const struct mcp320x_chip_info *chip_info; |
170 | int ret; | 284 | int ret; |
171 | 285 | ||
172 | indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adc)); | 286 | indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adc)); |
@@ -181,7 +295,7 @@ static int mcp320x_probe(struct spi_device *spi) | |||
181 | indio_dev->modes = INDIO_DIRECT_MODE; | 295 | indio_dev->modes = INDIO_DIRECT_MODE; |
182 | indio_dev->info = &mcp320x_info; | 296 | indio_dev->info = &mcp320x_info; |
183 | 297 | ||
184 | chip_info = &mcp3208_chip_infos[spi_get_device_id(spi)->driver_data]; | 298 | chip_info = &mcp320x_chip_infos[spi_get_device_id(spi)->driver_data]; |
185 | indio_dev->channels = chip_info->channels; | 299 | indio_dev->channels = chip_info->channels; |
186 | indio_dev->num_channels = chip_info->num_channels; | 300 | indio_dev->num_channels = chip_info->num_channels; |
187 | 301 | ||
@@ -226,7 +340,45 @@ static int mcp320x_remove(struct spi_device *spi) | |||
226 | return 0; | 340 | return 0; |
227 | } | 341 | } |
228 | 342 | ||
343 | #if defined(CONFIG_OF) | ||
344 | static const struct of_device_id mcp320x_dt_ids[] = { | ||
345 | { | ||
346 | .compatible = "mcp3001", | ||
347 | .data = &mcp320x_chip_infos[mcp3001], | ||
348 | }, { | ||
349 | .compatible = "mcp3002", | ||
350 | .data = &mcp320x_chip_infos[mcp3002], | ||
351 | }, { | ||
352 | .compatible = "mcp3004", | ||
353 | .data = &mcp320x_chip_infos[mcp3004], | ||
354 | }, { | ||
355 | .compatible = "mcp3008", | ||
356 | .data = &mcp320x_chip_infos[mcp3008], | ||
357 | }, { | ||
358 | .compatible = "mcp3201", | ||
359 | .data = &mcp320x_chip_infos[mcp3201], | ||
360 | }, { | ||
361 | .compatible = "mcp3202", | ||
362 | .data = &mcp320x_chip_infos[mcp3202], | ||
363 | }, { | ||
364 | .compatible = "mcp3204", | ||
365 | .data = &mcp320x_chip_infos[mcp3204], | ||
366 | }, { | ||
367 | .compatible = "mcp3208", | ||
368 | .data = &mcp320x_chip_infos[mcp3208], | ||
369 | }, { | ||
370 | } | ||
371 | }; | ||
372 | MODULE_DEVICE_TABLE(of, mcp320x_dt_ids); | ||
373 | #endif | ||
374 | |||
229 | static const struct spi_device_id mcp320x_id[] = { | 375 | static const struct spi_device_id mcp320x_id[] = { |
376 | { "mcp3001", mcp3001 }, | ||
377 | { "mcp3002", mcp3002 }, | ||
378 | { "mcp3004", mcp3004 }, | ||
379 | { "mcp3008", mcp3008 }, | ||
380 | { "mcp3201", mcp3201 }, | ||
381 | { "mcp3202", mcp3202 }, | ||
230 | { "mcp3204", mcp3204 }, | 382 | { "mcp3204", mcp3204 }, |
231 | { "mcp3208", mcp3208 }, | 383 | { "mcp3208", mcp3208 }, |
232 | { } | 384 | { } |
@@ -245,5 +397,5 @@ static struct spi_driver mcp320x_driver = { | |||
245 | module_spi_driver(mcp320x_driver); | 397 | module_spi_driver(mcp320x_driver); |
246 | 398 | ||
247 | MODULE_AUTHOR("Oskar Andero <oskar.andero@gmail.com>"); | 399 | MODULE_AUTHOR("Oskar Andero <oskar.andero@gmail.com>"); |
248 | MODULE_DESCRIPTION("Microchip Technology MCP3204/08"); | 400 | MODULE_DESCRIPTION("Microchip Technology MCP3x01/02/04/08"); |
249 | MODULE_LICENSE("GPL v2"); | 401 | MODULE_LICENSE("GPL v2"); |
diff --git a/drivers/iio/adc/men_z188_adc.c b/drivers/iio/adc/men_z188_adc.c index b58d6302521f..d095efe1ba14 100644 --- a/drivers/iio/adc/men_z188_adc.c +++ b/drivers/iio/adc/men_z188_adc.c | |||
@@ -152,6 +152,7 @@ static void men_z188_remove(struct mcb_device *dev) | |||
152 | 152 | ||
153 | static const struct mcb_device_id men_z188_ids[] = { | 153 | static const struct mcb_device_id men_z188_ids[] = { |
154 | { .device = 0xbc }, | 154 | { .device = 0xbc }, |
155 | { } | ||
155 | }; | 156 | }; |
156 | MODULE_DEVICE_TABLE(mcb, men_z188_ids); | 157 | MODULE_DEVICE_TABLE(mcb, men_z188_ids); |
157 | 158 | ||
diff --git a/drivers/iio/adc/qcom-spmi-iadc.c b/drivers/iio/adc/qcom-spmi-iadc.c new file mode 100644 index 000000000000..b9666f2f5e51 --- /dev/null +++ b/drivers/iio/adc/qcom-spmi-iadc.c | |||
@@ -0,0 +1,595 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2012-2014, The Linux Foundation. All rights reserved. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 and | ||
6 | * only version 2 as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | */ | ||
13 | |||
14 | #include <linux/bitops.h> | ||
15 | #include <linux/completion.h> | ||
16 | #include <linux/delay.h> | ||
17 | #include <linux/err.h> | ||
18 | #include <linux/iio/iio.h> | ||
19 | #include <linux/interrupt.h> | ||
20 | #include <linux/kernel.h> | ||
21 | #include <linux/mutex.h> | ||
22 | #include <linux/module.h> | ||
23 | #include <linux/of.h> | ||
24 | #include <linux/of_device.h> | ||
25 | #include <linux/platform_device.h> | ||
26 | #include <linux/regmap.h> | ||
27 | #include <linux/slab.h> | ||
28 | |||
29 | /* IADC register and bit definition */ | ||
30 | #define IADC_REVISION2 0x1 | ||
31 | #define IADC_REVISION2_SUPPORTED_IADC 1 | ||
32 | |||
33 | #define IADC_PERPH_TYPE 0x4 | ||
34 | #define IADC_PERPH_TYPE_ADC 8 | ||
35 | |||
36 | #define IADC_PERPH_SUBTYPE 0x5 | ||
37 | #define IADC_PERPH_SUBTYPE_IADC 3 | ||
38 | |||
39 | #define IADC_STATUS1 0x8 | ||
40 | #define IADC_STATUS1_OP_MODE 4 | ||
41 | #define IADC_STATUS1_REQ_STS BIT(1) | ||
42 | #define IADC_STATUS1_EOC BIT(0) | ||
43 | #define IADC_STATUS1_REQ_STS_EOC_MASK 0x3 | ||
44 | |||
45 | #define IADC_MODE_CTL 0x40 | ||
46 | #define IADC_OP_MODE_SHIFT 3 | ||
47 | #define IADC_OP_MODE_NORMAL 0 | ||
48 | #define IADC_TRIM_EN BIT(0) | ||
49 | |||
50 | #define IADC_EN_CTL1 0x46 | ||
51 | #define IADC_EN_CTL1_SET BIT(7) | ||
52 | |||
53 | #define IADC_CH_SEL_CTL 0x48 | ||
54 | |||
55 | #define IADC_DIG_PARAM 0x50 | ||
56 | #define IADC_DIG_DEC_RATIO_SEL_SHIFT 2 | ||
57 | |||
58 | #define IADC_HW_SETTLE_DELAY 0x51 | ||
59 | |||
60 | #define IADC_CONV_REQ 0x52 | ||
61 | #define IADC_CONV_REQ_SET BIT(7) | ||
62 | |||
63 | #define IADC_FAST_AVG_CTL 0x5a | ||
64 | #define IADC_FAST_AVG_EN 0x5b | ||
65 | #define IADC_FAST_AVG_EN_SET BIT(7) | ||
66 | |||
67 | #define IADC_PERH_RESET_CTL3 0xda | ||
68 | #define IADC_FOLLOW_WARM_RB BIT(2) | ||
69 | |||
70 | #define IADC_DATA 0x60 /* 16 bits */ | ||
71 | |||
72 | #define IADC_SEC_ACCESS 0xd0 | ||
73 | #define IADC_SEC_ACCESS_DATA 0xa5 | ||
74 | |||
75 | #define IADC_NOMINAL_RSENSE 0xf4 | ||
76 | #define IADC_NOMINAL_RSENSE_SIGN_MASK BIT(7) | ||
77 | |||
78 | #define IADC_REF_GAIN_MICRO_VOLTS 17857 | ||
79 | |||
80 | #define IADC_INT_RSENSE_DEVIATION 15625 /* nano Ohms per bit */ | ||
81 | |||
82 | #define IADC_INT_RSENSE_IDEAL_VALUE 10000 /* micro Ohms */ | ||
83 | #define IADC_INT_RSENSE_DEFAULT_VALUE 7800 /* micro Ohms */ | ||
84 | #define IADC_INT_RSENSE_DEFAULT_GF 9000 /* micro Ohms */ | ||
85 | #define IADC_INT_RSENSE_DEFAULT_SMIC 9700 /* micro Ohms */ | ||
86 | |||
87 | #define IADC_CONV_TIME_MIN_US 2000 | ||
88 | #define IADC_CONV_TIME_MAX_US 2100 | ||
89 | |||
90 | #define IADC_DEF_PRESCALING 0 /* 1:1 */ | ||
91 | #define IADC_DEF_DECIMATION 0 /* 512 */ | ||
92 | #define IADC_DEF_HW_SETTLE_TIME 0 /* 0 us */ | ||
93 | #define IADC_DEF_AVG_SAMPLES 0 /* 1 sample */ | ||
94 | |||
95 | /* IADC channel list */ | ||
96 | #define IADC_INT_RSENSE 0 | ||
97 | #define IADC_EXT_RSENSE 1 | ||
98 | #define IADC_GAIN_17P857MV 3 | ||
99 | #define IADC_EXT_OFFSET_CSP_CSN 5 | ||
100 | #define IADC_INT_OFFSET_CSP2_CSN2 6 | ||
101 | |||
102 | /** | ||
103 | * struct iadc_chip - IADC Current ADC device structure. | ||
104 | * @regmap: regmap for register read/write. | ||
105 | * @dev: This device pointer. | ||
106 | * @base: base offset for the ADC peripheral. | ||
107 | * @rsense: Values of the internal and external sense resister in micro Ohms. | ||
108 | * @poll_eoc: Poll for end of conversion instead of waiting for IRQ. | ||
109 | * @offset: Raw offset values for the internal and external channels. | ||
110 | * @gain: Raw gain of the channels. | ||
111 | * @lock: ADC lock for access to the peripheral. | ||
112 | * @complete: ADC notification after end of conversion interrupt is received. | ||
113 | */ | ||
114 | struct iadc_chip { | ||
115 | struct regmap *regmap; | ||
116 | struct device *dev; | ||
117 | u16 base; | ||
118 | bool poll_eoc; | ||
119 | u32 rsense[2]; | ||
120 | u16 offset[2]; | ||
121 | u16 gain; | ||
122 | struct mutex lock; | ||
123 | struct completion complete; | ||
124 | }; | ||
125 | |||
126 | static int iadc_read(struct iadc_chip *iadc, u16 offset, u8 *data) | ||
127 | { | ||
128 | unsigned int val; | ||
129 | int ret; | ||
130 | |||
131 | ret = regmap_read(iadc->regmap, iadc->base + offset, &val); | ||
132 | if (ret < 0) | ||
133 | return ret; | ||
134 | |||
135 | *data = val; | ||
136 | return 0; | ||
137 | } | ||
138 | |||
139 | static int iadc_write(struct iadc_chip *iadc, u16 offset, u8 data) | ||
140 | { | ||
141 | return regmap_write(iadc->regmap, iadc->base + offset, data); | ||
142 | } | ||
143 | |||
144 | static int iadc_reset(struct iadc_chip *iadc) | ||
145 | { | ||
146 | u8 data; | ||
147 | int ret; | ||
148 | |||
149 | ret = iadc_write(iadc, IADC_SEC_ACCESS, IADC_SEC_ACCESS_DATA); | ||
150 | if (ret < 0) | ||
151 | return ret; | ||
152 | |||
153 | ret = iadc_read(iadc, IADC_PERH_RESET_CTL3, &data); | ||
154 | if (ret < 0) | ||
155 | return ret; | ||
156 | |||
157 | ret = iadc_write(iadc, IADC_SEC_ACCESS, IADC_SEC_ACCESS_DATA); | ||
158 | if (ret < 0) | ||
159 | return ret; | ||
160 | |||
161 | data |= IADC_FOLLOW_WARM_RB; | ||
162 | |||
163 | return iadc_write(iadc, IADC_PERH_RESET_CTL3, data); | ||
164 | } | ||
165 | |||
166 | static int iadc_set_state(struct iadc_chip *iadc, bool state) | ||
167 | { | ||
168 | return iadc_write(iadc, IADC_EN_CTL1, state ? IADC_EN_CTL1_SET : 0); | ||
169 | } | ||
170 | |||
171 | static void iadc_status_show(struct iadc_chip *iadc) | ||
172 | { | ||
173 | u8 mode, sta1, chan, dig, en, req; | ||
174 | int ret; | ||
175 | |||
176 | ret = iadc_read(iadc, IADC_MODE_CTL, &mode); | ||
177 | if (ret < 0) | ||
178 | return; | ||
179 | |||
180 | ret = iadc_read(iadc, IADC_DIG_PARAM, &dig); | ||
181 | if (ret < 0) | ||
182 | return; | ||
183 | |||
184 | ret = iadc_read(iadc, IADC_CH_SEL_CTL, &chan); | ||
185 | if (ret < 0) | ||
186 | return; | ||
187 | |||
188 | ret = iadc_read(iadc, IADC_CONV_REQ, &req); | ||
189 | if (ret < 0) | ||
190 | return; | ||
191 | |||
192 | ret = iadc_read(iadc, IADC_STATUS1, &sta1); | ||
193 | if (ret < 0) | ||
194 | return; | ||
195 | |||
196 | ret = iadc_read(iadc, IADC_EN_CTL1, &en); | ||
197 | if (ret < 0) | ||
198 | return; | ||
199 | |||
200 | dev_err(iadc->dev, | ||
201 | "mode:%02x en:%02x chan:%02x dig:%02x req:%02x sta1:%02x\n", | ||
202 | mode, en, chan, dig, req, sta1); | ||
203 | } | ||
204 | |||
205 | static int iadc_configure(struct iadc_chip *iadc, int channel) | ||
206 | { | ||
207 | u8 decim, mode; | ||
208 | int ret; | ||
209 | |||
210 | /* Mode selection */ | ||
211 | mode = (IADC_OP_MODE_NORMAL << IADC_OP_MODE_SHIFT) | IADC_TRIM_EN; | ||
212 | ret = iadc_write(iadc, IADC_MODE_CTL, mode); | ||
213 | if (ret < 0) | ||
214 | return ret; | ||
215 | |||
216 | /* Channel selection */ | ||
217 | ret = iadc_write(iadc, IADC_CH_SEL_CTL, channel); | ||
218 | if (ret < 0) | ||
219 | return ret; | ||
220 | |||
221 | /* Digital parameter setup */ | ||
222 | decim = IADC_DEF_DECIMATION << IADC_DIG_DEC_RATIO_SEL_SHIFT; | ||
223 | ret = iadc_write(iadc, IADC_DIG_PARAM, decim); | ||
224 | if (ret < 0) | ||
225 | return ret; | ||
226 | |||
227 | /* HW settle time delay */ | ||
228 | ret = iadc_write(iadc, IADC_HW_SETTLE_DELAY, IADC_DEF_HW_SETTLE_TIME); | ||
229 | if (ret < 0) | ||
230 | return ret; | ||
231 | |||
232 | ret = iadc_write(iadc, IADC_FAST_AVG_CTL, IADC_DEF_AVG_SAMPLES); | ||
233 | if (ret < 0) | ||
234 | return ret; | ||
235 | |||
236 | if (IADC_DEF_AVG_SAMPLES) | ||
237 | ret = iadc_write(iadc, IADC_FAST_AVG_EN, IADC_FAST_AVG_EN_SET); | ||
238 | else | ||
239 | ret = iadc_write(iadc, IADC_FAST_AVG_EN, 0); | ||
240 | |||
241 | if (ret < 0) | ||
242 | return ret; | ||
243 | |||
244 | if (!iadc->poll_eoc) | ||
245 | reinit_completion(&iadc->complete); | ||
246 | |||
247 | ret = iadc_set_state(iadc, true); | ||
248 | if (ret < 0) | ||
249 | return ret; | ||
250 | |||
251 | /* Request conversion */ | ||
252 | return iadc_write(iadc, IADC_CONV_REQ, IADC_CONV_REQ_SET); | ||
253 | } | ||
254 | |||
255 | static int iadc_poll_wait_eoc(struct iadc_chip *iadc, unsigned int interval_us) | ||
256 | { | ||
257 | unsigned int count, retry; | ||
258 | int ret; | ||
259 | u8 sta1; | ||
260 | |||
261 | retry = interval_us / IADC_CONV_TIME_MIN_US; | ||
262 | |||
263 | for (count = 0; count < retry; count++) { | ||
264 | ret = iadc_read(iadc, IADC_STATUS1, &sta1); | ||
265 | if (ret < 0) | ||
266 | return ret; | ||
267 | |||
268 | sta1 &= IADC_STATUS1_REQ_STS_EOC_MASK; | ||
269 | if (sta1 == IADC_STATUS1_EOC) | ||
270 | return 0; | ||
271 | |||
272 | usleep_range(IADC_CONV_TIME_MIN_US, IADC_CONV_TIME_MAX_US); | ||
273 | } | ||
274 | |||
275 | iadc_status_show(iadc); | ||
276 | |||
277 | return -ETIMEDOUT; | ||
278 | } | ||
279 | |||
280 | static int iadc_read_result(struct iadc_chip *iadc, u16 *data) | ||
281 | { | ||
282 | return regmap_bulk_read(iadc->regmap, iadc->base + IADC_DATA, data, 2); | ||
283 | } | ||
284 | |||
285 | static int iadc_do_conversion(struct iadc_chip *iadc, int chan, u16 *data) | ||
286 | { | ||
287 | unsigned int wait; | ||
288 | int ret; | ||
289 | |||
290 | ret = iadc_configure(iadc, chan); | ||
291 | if (ret < 0) | ||
292 | goto exit; | ||
293 | |||
294 | wait = BIT(IADC_DEF_AVG_SAMPLES) * IADC_CONV_TIME_MIN_US * 2; | ||
295 | |||
296 | if (iadc->poll_eoc) { | ||
297 | ret = iadc_poll_wait_eoc(iadc, wait); | ||
298 | } else { | ||
299 | ret = wait_for_completion_timeout(&iadc->complete, wait); | ||
300 | if (!ret) | ||
301 | ret = -ETIMEDOUT; | ||
302 | else | ||
303 | /* double check conversion status */ | ||
304 | ret = iadc_poll_wait_eoc(iadc, IADC_CONV_TIME_MIN_US); | ||
305 | } | ||
306 | |||
307 | if (!ret) | ||
308 | ret = iadc_read_result(iadc, data); | ||
309 | exit: | ||
310 | iadc_set_state(iadc, false); | ||
311 | if (ret < 0) | ||
312 | dev_err(iadc->dev, "conversion failed\n"); | ||
313 | |||
314 | return ret; | ||
315 | } | ||
316 | |||
317 | static int iadc_read_raw(struct iio_dev *indio_dev, | ||
318 | struct iio_chan_spec const *chan, | ||
319 | int *val, int *val2, long mask) | ||
320 | { | ||
321 | struct iadc_chip *iadc = iio_priv(indio_dev); | ||
322 | s32 isense_ua, vsense_uv; | ||
323 | u16 adc_raw, vsense_raw; | ||
324 | int ret; | ||
325 | |||
326 | switch (mask) { | ||
327 | case IIO_CHAN_INFO_RAW: | ||
328 | mutex_lock(&iadc->lock); | ||
329 | ret = iadc_do_conversion(iadc, chan->channel, &adc_raw); | ||
330 | mutex_unlock(&iadc->lock); | ||
331 | if (ret < 0) | ||
332 | return ret; | ||
333 | |||
334 | vsense_raw = adc_raw - iadc->offset[chan->channel]; | ||
335 | |||
336 | vsense_uv = vsense_raw * IADC_REF_GAIN_MICRO_VOLTS; | ||
337 | vsense_uv /= (s32)iadc->gain - iadc->offset[chan->channel]; | ||
338 | |||
339 | isense_ua = vsense_uv / iadc->rsense[chan->channel]; | ||
340 | |||
341 | dev_dbg(iadc->dev, "off %d gain %d adc %d %duV I %duA\n", | ||
342 | iadc->offset[chan->channel], iadc->gain, | ||
343 | adc_raw, vsense_uv, isense_ua); | ||
344 | |||
345 | *val = isense_ua; | ||
346 | return IIO_VAL_INT; | ||
347 | case IIO_CHAN_INFO_SCALE: | ||
348 | *val = 0; | ||
349 | *val2 = 1000; | ||
350 | return IIO_VAL_INT_PLUS_MICRO; | ||
351 | } | ||
352 | |||
353 | return -EINVAL; | ||
354 | } | ||
355 | |||
356 | static const struct iio_info iadc_info = { | ||
357 | .read_raw = iadc_read_raw, | ||
358 | .driver_module = THIS_MODULE, | ||
359 | }; | ||
360 | |||
361 | static irqreturn_t iadc_isr(int irq, void *dev_id) | ||
362 | { | ||
363 | struct iadc_chip *iadc = dev_id; | ||
364 | |||
365 | complete(&iadc->complete); | ||
366 | |||
367 | return IRQ_HANDLED; | ||
368 | } | ||
369 | |||
370 | static int iadc_update_offset(struct iadc_chip *iadc) | ||
371 | { | ||
372 | int ret; | ||
373 | |||
374 | ret = iadc_do_conversion(iadc, IADC_GAIN_17P857MV, &iadc->gain); | ||
375 | if (ret < 0) | ||
376 | return ret; | ||
377 | |||
378 | ret = iadc_do_conversion(iadc, IADC_INT_OFFSET_CSP2_CSN2, | ||
379 | &iadc->offset[IADC_INT_RSENSE]); | ||
380 | if (ret < 0) | ||
381 | return ret; | ||
382 | |||
383 | if (iadc->gain == iadc->offset[IADC_INT_RSENSE]) { | ||
384 | dev_err(iadc->dev, "error: internal offset == gain %d\n", | ||
385 | iadc->gain); | ||
386 | return -EINVAL; | ||
387 | } | ||
388 | |||
389 | ret = iadc_do_conversion(iadc, IADC_EXT_OFFSET_CSP_CSN, | ||
390 | &iadc->offset[IADC_EXT_RSENSE]); | ||
391 | if (ret < 0) | ||
392 | return ret; | ||
393 | |||
394 | if (iadc->gain == iadc->offset[IADC_EXT_RSENSE]) { | ||
395 | dev_err(iadc->dev, "error: external offset == gain %d\n", | ||
396 | iadc->gain); | ||
397 | return -EINVAL; | ||
398 | } | ||
399 | |||
400 | return 0; | ||
401 | } | ||
402 | |||
403 | static int iadc_version_check(struct iadc_chip *iadc) | ||
404 | { | ||
405 | u8 val; | ||
406 | int ret; | ||
407 | |||
408 | ret = iadc_read(iadc, IADC_PERPH_TYPE, &val); | ||
409 | if (ret < 0) | ||
410 | return ret; | ||
411 | |||
412 | if (val < IADC_PERPH_TYPE_ADC) { | ||
413 | dev_err(iadc->dev, "%d is not ADC\n", val); | ||
414 | return -EINVAL; | ||
415 | } | ||
416 | |||
417 | ret = iadc_read(iadc, IADC_PERPH_SUBTYPE, &val); | ||
418 | if (ret < 0) | ||
419 | return ret; | ||
420 | |||
421 | if (val < IADC_PERPH_SUBTYPE_IADC) { | ||
422 | dev_err(iadc->dev, "%d is not IADC\n", val); | ||
423 | return -EINVAL; | ||
424 | } | ||
425 | |||
426 | ret = iadc_read(iadc, IADC_REVISION2, &val); | ||
427 | if (ret < 0) | ||
428 | return ret; | ||
429 | |||
430 | if (val < IADC_REVISION2_SUPPORTED_IADC) { | ||
431 | dev_err(iadc->dev, "revision %d not supported\n", val); | ||
432 | return -EINVAL; | ||
433 | } | ||
434 | |||
435 | return 0; | ||
436 | } | ||
437 | |||
438 | static int iadc_rsense_read(struct iadc_chip *iadc, struct device_node *node) | ||
439 | { | ||
440 | int ret, sign, int_sense; | ||
441 | u8 deviation; | ||
442 | |||
443 | ret = of_property_read_u32(node, "qcom,external-resistor-micro-ohms", | ||
444 | &iadc->rsense[IADC_EXT_RSENSE]); | ||
445 | if (ret < 0) | ||
446 | iadc->rsense[IADC_EXT_RSENSE] = IADC_INT_RSENSE_IDEAL_VALUE; | ||
447 | |||
448 | if (!iadc->rsense[IADC_EXT_RSENSE]) { | ||
449 | dev_err(iadc->dev, "external resistor can't be zero Ohms"); | ||
450 | return -EINVAL; | ||
451 | } | ||
452 | |||
453 | ret = iadc_read(iadc, IADC_NOMINAL_RSENSE, &deviation); | ||
454 | if (ret < 0) | ||
455 | return ret; | ||
456 | |||
457 | /* | ||
458 | * Deviation value stored is an offset from 10 mili Ohms, bit 7 is | ||
459 | * the sign, the remaining bits have an LSB of 15625 nano Ohms. | ||
460 | */ | ||
461 | sign = (deviation & IADC_NOMINAL_RSENSE_SIGN_MASK) ? -1 : 1; | ||
462 | |||
463 | deviation &= ~IADC_NOMINAL_RSENSE_SIGN_MASK; | ||
464 | |||
465 | /* Scale it to nono Ohms */ | ||
466 | int_sense = IADC_INT_RSENSE_IDEAL_VALUE * 1000; | ||
467 | int_sense += sign * deviation * IADC_INT_RSENSE_DEVIATION; | ||
468 | int_sense /= 1000; /* micro Ohms */ | ||
469 | |||
470 | iadc->rsense[IADC_INT_RSENSE] = int_sense; | ||
471 | return 0; | ||
472 | } | ||
473 | |||
474 | static const struct iio_chan_spec iadc_channels[] = { | ||
475 | { | ||
476 | .type = IIO_CURRENT, | ||
477 | .datasheet_name = "INTERNAL_RSENSE", | ||
478 | .channel = 0, | ||
479 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | | ||
480 | BIT(IIO_CHAN_INFO_SCALE), | ||
481 | .indexed = 1, | ||
482 | }, | ||
483 | { | ||
484 | .type = IIO_CURRENT, | ||
485 | .datasheet_name = "EXTERNAL_RSENSE", | ||
486 | .channel = 1, | ||
487 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | | ||
488 | BIT(IIO_CHAN_INFO_SCALE), | ||
489 | .indexed = 1, | ||
490 | }, | ||
491 | }; | ||
492 | |||
493 | static int iadc_probe(struct platform_device *pdev) | ||
494 | { | ||
495 | struct device_node *node = pdev->dev.of_node; | ||
496 | struct device *dev = &pdev->dev; | ||
497 | struct iio_dev *indio_dev; | ||
498 | struct iadc_chip *iadc; | ||
499 | int ret, irq_eoc; | ||
500 | u32 res; | ||
501 | |||
502 | indio_dev = devm_iio_device_alloc(dev, sizeof(*iadc)); | ||
503 | if (!indio_dev) | ||
504 | return -ENOMEM; | ||
505 | |||
506 | iadc = iio_priv(indio_dev); | ||
507 | iadc->dev = dev; | ||
508 | |||
509 | iadc->regmap = dev_get_regmap(dev->parent, NULL); | ||
510 | if (!iadc->regmap) | ||
511 | return -ENODEV; | ||
512 | |||
513 | init_completion(&iadc->complete); | ||
514 | mutex_init(&iadc->lock); | ||
515 | |||
516 | ret = of_property_read_u32(node, "reg", &res); | ||
517 | if (ret < 0) | ||
518 | return -ENODEV; | ||
519 | |||
520 | iadc->base = res; | ||
521 | |||
522 | ret = iadc_version_check(iadc); | ||
523 | if (ret < 0) | ||
524 | return -ENODEV; | ||
525 | |||
526 | ret = iadc_rsense_read(iadc, node); | ||
527 | if (ret < 0) | ||
528 | return -ENODEV; | ||
529 | |||
530 | dev_dbg(iadc->dev, "sense resistors %d and %d micro Ohm\n", | ||
531 | iadc->rsense[IADC_INT_RSENSE], | ||
532 | iadc->rsense[IADC_EXT_RSENSE]); | ||
533 | |||
534 | irq_eoc = platform_get_irq(pdev, 0); | ||
535 | if (irq_eoc == -EPROBE_DEFER) | ||
536 | return irq_eoc; | ||
537 | |||
538 | if (irq_eoc < 0) | ||
539 | iadc->poll_eoc = true; | ||
540 | |||
541 | ret = iadc_reset(iadc); | ||
542 | if (ret < 0) { | ||
543 | dev_err(dev, "reset failed\n"); | ||
544 | return ret; | ||
545 | } | ||
546 | |||
547 | if (!iadc->poll_eoc) { | ||
548 | ret = devm_request_irq(dev, irq_eoc, iadc_isr, 0, | ||
549 | "spmi-iadc", iadc); | ||
550 | if (!ret) | ||
551 | enable_irq_wake(irq_eoc); | ||
552 | else | ||
553 | return ret; | ||
554 | } else { | ||
555 | device_init_wakeup(iadc->dev, 1); | ||
556 | } | ||
557 | |||
558 | ret = iadc_update_offset(iadc); | ||
559 | if (ret < 0) { | ||
560 | dev_err(dev, "failed offset calibration\n"); | ||
561 | return ret; | ||
562 | } | ||
563 | |||
564 | indio_dev->dev.parent = dev; | ||
565 | indio_dev->dev.of_node = node; | ||
566 | indio_dev->name = pdev->name; | ||
567 | indio_dev->modes = INDIO_DIRECT_MODE; | ||
568 | indio_dev->info = &iadc_info; | ||
569 | indio_dev->channels = iadc_channels; | ||
570 | indio_dev->num_channels = ARRAY_SIZE(iadc_channels); | ||
571 | |||
572 | return devm_iio_device_register(dev, indio_dev); | ||
573 | } | ||
574 | |||
575 | static const struct of_device_id iadc_match_table[] = { | ||
576 | { .compatible = "qcom,spmi-iadc" }, | ||
577 | { } | ||
578 | }; | ||
579 | |||
580 | MODULE_DEVICE_TABLE(of, iadc_match_table); | ||
581 | |||
582 | static struct platform_driver iadc_driver = { | ||
583 | .driver = { | ||
584 | .name = "qcom-spmi-iadc", | ||
585 | .of_match_table = iadc_match_table, | ||
586 | }, | ||
587 | .probe = iadc_probe, | ||
588 | }; | ||
589 | |||
590 | module_platform_driver(iadc_driver); | ||
591 | |||
592 | MODULE_ALIAS("platform:qcom-spmi-iadc"); | ||
593 | MODULE_DESCRIPTION("Qualcomm SPMI PMIC current ADC driver"); | ||
594 | MODULE_LICENSE("GPL v2"); | ||
595 | MODULE_AUTHOR("Ivan T. Ivanov <iivanov@mm-sol.com>"); | ||
diff --git a/drivers/iio/adc/rockchip_saradc.c b/drivers/iio/adc/rockchip_saradc.c new file mode 100644 index 000000000000..8d4e019ea4ca --- /dev/null +++ b/drivers/iio/adc/rockchip_saradc.c | |||
@@ -0,0 +1,351 @@ | |||
1 | /* | ||
2 | * Rockchip Successive Approximation Register (SAR) A/D Converter | ||
3 | * Copyright (C) 2014 ROCKCHIP, Inc. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation; either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | */ | ||
15 | |||
16 | #include <linux/module.h> | ||
17 | #include <linux/platform_device.h> | ||
18 | #include <linux/interrupt.h> | ||
19 | #include <linux/io.h> | ||
20 | #include <linux/of.h> | ||
21 | #include <linux/of_device.h> | ||
22 | #include <linux/clk.h> | ||
23 | #include <linux/completion.h> | ||
24 | #include <linux/regulator/consumer.h> | ||
25 | #include <linux/iio/iio.h> | ||
26 | |||
27 | #define SARADC_DATA 0x00 | ||
28 | |||
29 | #define SARADC_STAS 0x04 | ||
30 | #define SARADC_STAS_BUSY BIT(0) | ||
31 | |||
32 | #define SARADC_CTRL 0x08 | ||
33 | #define SARADC_CTRL_IRQ_STATUS BIT(6) | ||
34 | #define SARADC_CTRL_IRQ_ENABLE BIT(5) | ||
35 | #define SARADC_CTRL_POWER_CTRL BIT(3) | ||
36 | #define SARADC_CTRL_CHN_MASK 0x7 | ||
37 | |||
38 | #define SARADC_DLY_PU_SOC 0x0c | ||
39 | #define SARADC_DLY_PU_SOC_MASK 0x3f | ||
40 | |||
41 | #define SARADC_TIMEOUT msecs_to_jiffies(100) | ||
42 | |||
43 | struct rockchip_saradc_data { | ||
44 | int num_bits; | ||
45 | const struct iio_chan_spec *channels; | ||
46 | int num_channels; | ||
47 | unsigned long clk_rate; | ||
48 | }; | ||
49 | |||
50 | struct rockchip_saradc { | ||
51 | void __iomem *regs; | ||
52 | struct clk *pclk; | ||
53 | struct clk *clk; | ||
54 | struct completion completion; | ||
55 | struct regulator *vref; | ||
56 | const struct rockchip_saradc_data *data; | ||
57 | u16 last_val; | ||
58 | }; | ||
59 | |||
60 | static int rockchip_saradc_read_raw(struct iio_dev *indio_dev, | ||
61 | struct iio_chan_spec const *chan, | ||
62 | int *val, int *val2, long mask) | ||
63 | { | ||
64 | struct rockchip_saradc *info = iio_priv(indio_dev); | ||
65 | int ret; | ||
66 | |||
67 | switch (mask) { | ||
68 | case IIO_CHAN_INFO_RAW: | ||
69 | mutex_lock(&indio_dev->mlock); | ||
70 | |||
71 | reinit_completion(&info->completion); | ||
72 | |||
73 | /* 8 clock periods as delay between power up and start cmd */ | ||
74 | writel_relaxed(8, info->regs + SARADC_DLY_PU_SOC); | ||
75 | |||
76 | /* Select the channel to be used and trigger conversion */ | ||
77 | writel(SARADC_CTRL_POWER_CTRL | ||
78 | | (chan->channel & SARADC_CTRL_CHN_MASK) | ||
79 | | SARADC_CTRL_IRQ_ENABLE, | ||
80 | info->regs + SARADC_CTRL); | ||
81 | |||
82 | if (!wait_for_completion_timeout(&info->completion, | ||
83 | SARADC_TIMEOUT)) { | ||
84 | writel_relaxed(0, info->regs + SARADC_CTRL); | ||
85 | mutex_unlock(&indio_dev->mlock); | ||
86 | return -ETIMEDOUT; | ||
87 | } | ||
88 | |||
89 | *val = info->last_val; | ||
90 | mutex_unlock(&indio_dev->mlock); | ||
91 | return IIO_VAL_INT; | ||
92 | case IIO_CHAN_INFO_SCALE: | ||
93 | ret = regulator_get_voltage(info->vref); | ||
94 | if (ret < 0) { | ||
95 | dev_err(&indio_dev->dev, "failed to get voltage\n"); | ||
96 | return ret; | ||
97 | } | ||
98 | |||
99 | *val = ret / 1000; | ||
100 | *val2 = info->data->num_bits; | ||
101 | return IIO_VAL_FRACTIONAL_LOG2; | ||
102 | default: | ||
103 | return -EINVAL; | ||
104 | } | ||
105 | } | ||
106 | |||
107 | static irqreturn_t rockchip_saradc_isr(int irq, void *dev_id) | ||
108 | { | ||
109 | struct rockchip_saradc *info = (struct rockchip_saradc *)dev_id; | ||
110 | |||
111 | /* Read value */ | ||
112 | info->last_val = readl_relaxed(info->regs + SARADC_DATA); | ||
113 | info->last_val &= GENMASK(info->data->num_bits - 1, 0); | ||
114 | |||
115 | /* Clear irq & power down adc */ | ||
116 | writel_relaxed(0, info->regs + SARADC_CTRL); | ||
117 | |||
118 | complete(&info->completion); | ||
119 | |||
120 | return IRQ_HANDLED; | ||
121 | } | ||
122 | |||
123 | static const struct iio_info rockchip_saradc_iio_info = { | ||
124 | .read_raw = rockchip_saradc_read_raw, | ||
125 | .driver_module = THIS_MODULE, | ||
126 | }; | ||
127 | |||
128 | #define ADC_CHANNEL(_index, _id) { \ | ||
129 | .type = IIO_VOLTAGE, \ | ||
130 | .indexed = 1, \ | ||
131 | .channel = _index, \ | ||
132 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ | ||
133 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ | ||
134 | .datasheet_name = _id, \ | ||
135 | } | ||
136 | |||
137 | static const struct iio_chan_spec rockchip_saradc_iio_channels[] = { | ||
138 | ADC_CHANNEL(0, "adc0"), | ||
139 | ADC_CHANNEL(1, "adc1"), | ||
140 | ADC_CHANNEL(2, "adc2"), | ||
141 | }; | ||
142 | |||
143 | static const struct rockchip_saradc_data saradc_data = { | ||
144 | .num_bits = 10, | ||
145 | .channels = rockchip_saradc_iio_channels, | ||
146 | .num_channels = ARRAY_SIZE(rockchip_saradc_iio_channels), | ||
147 | .clk_rate = 1000000, | ||
148 | }; | ||
149 | |||
150 | static const struct iio_chan_spec rockchip_rk3066_tsadc_iio_channels[] = { | ||
151 | ADC_CHANNEL(0, "adc0"), | ||
152 | ADC_CHANNEL(1, "adc1"), | ||
153 | }; | ||
154 | |||
155 | static const struct rockchip_saradc_data rk3066_tsadc_data = { | ||
156 | .num_bits = 12, | ||
157 | .channels = rockchip_rk3066_tsadc_iio_channels, | ||
158 | .num_channels = ARRAY_SIZE(rockchip_rk3066_tsadc_iio_channels), | ||
159 | .clk_rate = 50000, | ||
160 | }; | ||
161 | |||
162 | static const struct of_device_id rockchip_saradc_match[] = { | ||
163 | { | ||
164 | .compatible = "rockchip,saradc", | ||
165 | .data = &saradc_data, | ||
166 | }, { | ||
167 | .compatible = "rockchip,rk3066-tsadc", | ||
168 | .data = &rk3066_tsadc_data, | ||
169 | }, | ||
170 | {}, | ||
171 | }; | ||
172 | MODULE_DEVICE_TABLE(of, rockchip_saradc_match); | ||
173 | |||
174 | static int rockchip_saradc_probe(struct platform_device *pdev) | ||
175 | { | ||
176 | struct rockchip_saradc *info = NULL; | ||
177 | struct device_node *np = pdev->dev.of_node; | ||
178 | struct iio_dev *indio_dev = NULL; | ||
179 | struct resource *mem; | ||
180 | const struct of_device_id *match; | ||
181 | int ret; | ||
182 | int irq; | ||
183 | |||
184 | if (!np) | ||
185 | return -ENODEV; | ||
186 | |||
187 | indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*info)); | ||
188 | if (!indio_dev) { | ||
189 | dev_err(&pdev->dev, "failed allocating iio device\n"); | ||
190 | return -ENOMEM; | ||
191 | } | ||
192 | info = iio_priv(indio_dev); | ||
193 | |||
194 | match = of_match_device(rockchip_saradc_match, &pdev->dev); | ||
195 | info->data = match->data; | ||
196 | |||
197 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
198 | info->regs = devm_ioremap_resource(&pdev->dev, mem); | ||
199 | if (IS_ERR(info->regs)) | ||
200 | return PTR_ERR(info->regs); | ||
201 | |||
202 | init_completion(&info->completion); | ||
203 | |||
204 | irq = platform_get_irq(pdev, 0); | ||
205 | if (irq < 0) { | ||
206 | dev_err(&pdev->dev, "no irq resource?\n"); | ||
207 | return irq; | ||
208 | } | ||
209 | |||
210 | ret = devm_request_irq(&pdev->dev, irq, rockchip_saradc_isr, | ||
211 | 0, dev_name(&pdev->dev), info); | ||
212 | if (ret < 0) { | ||
213 | dev_err(&pdev->dev, "failed requesting irq %d\n", irq); | ||
214 | return ret; | ||
215 | } | ||
216 | |||
217 | info->pclk = devm_clk_get(&pdev->dev, "apb_pclk"); | ||
218 | if (IS_ERR(info->pclk)) { | ||
219 | dev_err(&pdev->dev, "failed to get pclk\n"); | ||
220 | return PTR_ERR(info->pclk); | ||
221 | } | ||
222 | |||
223 | info->clk = devm_clk_get(&pdev->dev, "saradc"); | ||
224 | if (IS_ERR(info->clk)) { | ||
225 | dev_err(&pdev->dev, "failed to get adc clock\n"); | ||
226 | return PTR_ERR(info->clk); | ||
227 | } | ||
228 | |||
229 | info->vref = devm_regulator_get(&pdev->dev, "vref"); | ||
230 | if (IS_ERR(info->vref)) { | ||
231 | dev_err(&pdev->dev, "failed to get regulator, %ld\n", | ||
232 | PTR_ERR(info->vref)); | ||
233 | return PTR_ERR(info->vref); | ||
234 | } | ||
235 | |||
236 | /* | ||
237 | * Use a default value for the converter clock. | ||
238 | * This may become user-configurable in the future. | ||
239 | */ | ||
240 | ret = clk_set_rate(info->clk, info->data->clk_rate); | ||
241 | if (ret < 0) { | ||
242 | dev_err(&pdev->dev, "failed to set adc clk rate, %d\n", ret); | ||
243 | return ret; | ||
244 | } | ||
245 | |||
246 | ret = regulator_enable(info->vref); | ||
247 | if (ret < 0) { | ||
248 | dev_err(&pdev->dev, "failed to enable vref regulator\n"); | ||
249 | return ret; | ||
250 | } | ||
251 | |||
252 | ret = clk_prepare_enable(info->pclk); | ||
253 | if (ret < 0) { | ||
254 | dev_err(&pdev->dev, "failed to enable pclk\n"); | ||
255 | goto err_reg_voltage; | ||
256 | } | ||
257 | |||
258 | ret = clk_prepare_enable(info->clk); | ||
259 | if (ret < 0) { | ||
260 | dev_err(&pdev->dev, "failed to enable converter clock\n"); | ||
261 | goto err_pclk; | ||
262 | } | ||
263 | |||
264 | platform_set_drvdata(pdev, indio_dev); | ||
265 | |||
266 | indio_dev->name = dev_name(&pdev->dev); | ||
267 | indio_dev->dev.parent = &pdev->dev; | ||
268 | indio_dev->dev.of_node = pdev->dev.of_node; | ||
269 | indio_dev->info = &rockchip_saradc_iio_info; | ||
270 | indio_dev->modes = INDIO_DIRECT_MODE; | ||
271 | |||
272 | indio_dev->channels = info->data->channels; | ||
273 | indio_dev->num_channels = info->data->num_channels; | ||
274 | |||
275 | ret = iio_device_register(indio_dev); | ||
276 | if (ret) | ||
277 | goto err_clk; | ||
278 | |||
279 | return 0; | ||
280 | |||
281 | err_clk: | ||
282 | clk_disable_unprepare(info->clk); | ||
283 | err_pclk: | ||
284 | clk_disable_unprepare(info->pclk); | ||
285 | err_reg_voltage: | ||
286 | regulator_disable(info->vref); | ||
287 | return ret; | ||
288 | } | ||
289 | |||
290 | static int rockchip_saradc_remove(struct platform_device *pdev) | ||
291 | { | ||
292 | struct iio_dev *indio_dev = platform_get_drvdata(pdev); | ||
293 | struct rockchip_saradc *info = iio_priv(indio_dev); | ||
294 | |||
295 | iio_device_unregister(indio_dev); | ||
296 | clk_disable_unprepare(info->clk); | ||
297 | clk_disable_unprepare(info->pclk); | ||
298 | regulator_disable(info->vref); | ||
299 | |||
300 | return 0; | ||
301 | } | ||
302 | |||
303 | #ifdef CONFIG_PM_SLEEP | ||
304 | static int rockchip_saradc_suspend(struct device *dev) | ||
305 | { | ||
306 | struct iio_dev *indio_dev = dev_get_drvdata(dev); | ||
307 | struct rockchip_saradc *info = iio_priv(indio_dev); | ||
308 | |||
309 | clk_disable_unprepare(info->clk); | ||
310 | clk_disable_unprepare(info->pclk); | ||
311 | regulator_disable(info->vref); | ||
312 | |||
313 | return 0; | ||
314 | } | ||
315 | |||
316 | static int rockchip_saradc_resume(struct device *dev) | ||
317 | { | ||
318 | struct iio_dev *indio_dev = dev_get_drvdata(dev); | ||
319 | struct rockchip_saradc *info = iio_priv(indio_dev); | ||
320 | int ret; | ||
321 | |||
322 | ret = regulator_enable(info->vref); | ||
323 | if (ret) | ||
324 | return ret; | ||
325 | |||
326 | ret = clk_prepare_enable(info->pclk); | ||
327 | if (ret) | ||
328 | return ret; | ||
329 | |||
330 | ret = clk_prepare_enable(info->clk); | ||
331 | if (ret) | ||
332 | return ret; | ||
333 | |||
334 | return ret; | ||
335 | } | ||
336 | #endif | ||
337 | |||
338 | static SIMPLE_DEV_PM_OPS(rockchip_saradc_pm_ops, | ||
339 | rockchip_saradc_suspend, rockchip_saradc_resume); | ||
340 | |||
341 | static struct platform_driver rockchip_saradc_driver = { | ||
342 | .probe = rockchip_saradc_probe, | ||
343 | .remove = rockchip_saradc_remove, | ||
344 | .driver = { | ||
345 | .name = "rockchip-saradc", | ||
346 | .of_match_table = rockchip_saradc_match, | ||
347 | .pm = &rockchip_saradc_pm_ops, | ||
348 | }, | ||
349 | }; | ||
350 | |||
351 | module_platform_driver(rockchip_saradc_driver); | ||
diff --git a/drivers/iio/adc/ti-adc128s052.c b/drivers/iio/adc/ti-adc128s052.c new file mode 100644 index 000000000000..655cb564ec54 --- /dev/null +++ b/drivers/iio/adc/ti-adc128s052.c | |||
@@ -0,0 +1,179 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2014 Angelo Compagnucci <angelo.compagnucci@gmail.com> | ||
3 | * | ||
4 | * Driver for Texas Instruments' ADC128S052 ADC chip. | ||
5 | * Datasheet can be found here: | ||
6 | * http://www.ti.com/lit/ds/symlink/adc128s052.pdf | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/err.h> | ||
14 | #include <linux/spi/spi.h> | ||
15 | #include <linux/module.h> | ||
16 | #include <linux/iio/iio.h> | ||
17 | #include <linux/regulator/consumer.h> | ||
18 | |||
19 | struct adc128 { | ||
20 | struct spi_device *spi; | ||
21 | |||
22 | struct regulator *reg; | ||
23 | struct mutex lock; | ||
24 | |||
25 | u8 buffer[2] ____cacheline_aligned; | ||
26 | }; | ||
27 | |||
28 | static int adc128_adc_conversion(struct adc128 *adc, u8 channel) | ||
29 | { | ||
30 | int ret; | ||
31 | |||
32 | mutex_lock(&adc->lock); | ||
33 | |||
34 | adc->buffer[0] = channel << 3; | ||
35 | adc->buffer[1] = 0; | ||
36 | |||
37 | ret = spi_write(adc->spi, &adc->buffer, 2); | ||
38 | if (ret < 0) { | ||
39 | mutex_unlock(&adc->lock); | ||
40 | return ret; | ||
41 | } | ||
42 | |||
43 | ret = spi_read(adc->spi, &adc->buffer, 2); | ||
44 | |||
45 | mutex_unlock(&adc->lock); | ||
46 | |||
47 | if (ret < 0) | ||
48 | return ret; | ||
49 | |||
50 | return ((adc->buffer[0] << 8 | adc->buffer[1]) & 0xFFF); | ||
51 | } | ||
52 | |||
53 | static int adc128_read_raw(struct iio_dev *indio_dev, | ||
54 | struct iio_chan_spec const *channel, int *val, | ||
55 | int *val2, long mask) | ||
56 | { | ||
57 | struct adc128 *adc = iio_priv(indio_dev); | ||
58 | int ret; | ||
59 | |||
60 | switch (mask) { | ||
61 | case IIO_CHAN_INFO_RAW: | ||
62 | |||
63 | ret = adc128_adc_conversion(adc, channel->channel); | ||
64 | if (ret < 0) | ||
65 | return ret; | ||
66 | |||
67 | *val = ret; | ||
68 | return IIO_VAL_INT; | ||
69 | |||
70 | case IIO_CHAN_INFO_SCALE: | ||
71 | |||
72 | ret = regulator_get_voltage(adc->reg); | ||
73 | if (ret < 0) | ||
74 | return ret; | ||
75 | |||
76 | *val = ret / 1000; | ||
77 | *val2 = 12; | ||
78 | return IIO_VAL_FRACTIONAL_LOG2; | ||
79 | |||
80 | default: | ||
81 | return -EINVAL; | ||
82 | } | ||
83 | |||
84 | } | ||
85 | |||
86 | #define ADC128_VOLTAGE_CHANNEL(num) \ | ||
87 | { \ | ||
88 | .type = IIO_VOLTAGE, \ | ||
89 | .indexed = 1, \ | ||
90 | .channel = (num), \ | ||
91 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ | ||
92 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) \ | ||
93 | } | ||
94 | |||
95 | static const struct iio_chan_spec adc128_channels[] = { | ||
96 | ADC128_VOLTAGE_CHANNEL(0), | ||
97 | ADC128_VOLTAGE_CHANNEL(1), | ||
98 | ADC128_VOLTAGE_CHANNEL(2), | ||
99 | ADC128_VOLTAGE_CHANNEL(3), | ||
100 | ADC128_VOLTAGE_CHANNEL(4), | ||
101 | ADC128_VOLTAGE_CHANNEL(5), | ||
102 | ADC128_VOLTAGE_CHANNEL(6), | ||
103 | ADC128_VOLTAGE_CHANNEL(7), | ||
104 | }; | ||
105 | |||
106 | static const struct iio_info adc128_info = { | ||
107 | .read_raw = adc128_read_raw, | ||
108 | .driver_module = THIS_MODULE, | ||
109 | }; | ||
110 | |||
111 | static int adc128_probe(struct spi_device *spi) | ||
112 | { | ||
113 | struct iio_dev *indio_dev; | ||
114 | struct adc128 *adc; | ||
115 | int ret; | ||
116 | |||
117 | indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adc)); | ||
118 | if (!indio_dev) | ||
119 | return -ENOMEM; | ||
120 | |||
121 | adc = iio_priv(indio_dev); | ||
122 | adc->spi = spi; | ||
123 | |||
124 | spi_set_drvdata(spi, indio_dev); | ||
125 | |||
126 | indio_dev->dev.parent = &spi->dev; | ||
127 | indio_dev->name = spi_get_device_id(spi)->name; | ||
128 | indio_dev->modes = INDIO_DIRECT_MODE; | ||
129 | indio_dev->info = &adc128_info; | ||
130 | |||
131 | indio_dev->channels = adc128_channels; | ||
132 | indio_dev->num_channels = ARRAY_SIZE(adc128_channels); | ||
133 | |||
134 | adc->reg = devm_regulator_get(&spi->dev, "vref"); | ||
135 | if (IS_ERR(adc->reg)) | ||
136 | return PTR_ERR(adc->reg); | ||
137 | |||
138 | ret = regulator_enable(adc->reg); | ||
139 | if (ret < 0) | ||
140 | return ret; | ||
141 | |||
142 | mutex_init(&adc->lock); | ||
143 | |||
144 | ret = iio_device_register(indio_dev); | ||
145 | |||
146 | return ret; | ||
147 | } | ||
148 | |||
149 | static int adc128_remove(struct spi_device *spi) | ||
150 | { | ||
151 | struct iio_dev *indio_dev = spi_get_drvdata(spi); | ||
152 | struct adc128 *adc = iio_priv(indio_dev); | ||
153 | |||
154 | iio_device_unregister(indio_dev); | ||
155 | regulator_disable(adc->reg); | ||
156 | |||
157 | return 0; | ||
158 | } | ||
159 | |||
160 | static const struct spi_device_id adc128_id[] = { | ||
161 | { "adc128s052", 0}, | ||
162 | { } | ||
163 | }; | ||
164 | MODULE_DEVICE_TABLE(spi, adc128_id); | ||
165 | |||
166 | static struct spi_driver adc128_driver = { | ||
167 | .driver = { | ||
168 | .name = "adc128s052", | ||
169 | .owner = THIS_MODULE, | ||
170 | }, | ||
171 | .probe = adc128_probe, | ||
172 | .remove = adc128_remove, | ||
173 | .id_table = adc128_id, | ||
174 | }; | ||
175 | module_spi_driver(adc128_driver); | ||
176 | |||
177 | MODULE_AUTHOR("Angelo Compagnucci <angelo.compagnucci@gmail.com>"); | ||
178 | MODULE_DESCRIPTION("Texas Instruments ADC128S052"); | ||
179 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c index d5dc4c6ce86c..adba23246474 100644 --- a/drivers/iio/adc/ti_am335x_adc.c +++ b/drivers/iio/adc/ti_am335x_adc.c | |||
@@ -86,19 +86,18 @@ static void tiadc_step_config(struct iio_dev *indio_dev) | |||
86 | { | 86 | { |
87 | struct tiadc_device *adc_dev = iio_priv(indio_dev); | 87 | struct tiadc_device *adc_dev = iio_priv(indio_dev); |
88 | unsigned int stepconfig; | 88 | unsigned int stepconfig; |
89 | int i, steps; | 89 | int i, steps = 0; |
90 | 90 | ||
91 | /* | 91 | /* |
92 | * There are 16 configurable steps and 8 analog input | 92 | * There are 16 configurable steps and 8 analog input |
93 | * lines available which are shared between Touchscreen and ADC. | 93 | * lines available which are shared between Touchscreen and ADC. |
94 | * | 94 | * |
95 | * Steps backwards i.e. from 16 towards 0 are used by ADC | 95 | * Steps forwards i.e. from 0 towards 16 are used by ADC |
96 | * depending on number of input lines needed. | 96 | * depending on number of input lines needed. |
97 | * Channel would represent which analog input | 97 | * Channel would represent which analog input |
98 | * needs to be given to ADC to digitalize data. | 98 | * needs to be given to ADC to digitalize data. |
99 | */ | 99 | */ |
100 | 100 | ||
101 | steps = TOTAL_STEPS - adc_dev->channels; | ||
102 | if (iio_buffer_enabled(indio_dev)) | 101 | if (iio_buffer_enabled(indio_dev)) |
103 | stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1 | 102 | stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1 |
104 | | STEPCONFIG_MODE_SWCNT; | 103 | | STEPCONFIG_MODE_SWCNT; |
@@ -545,7 +544,6 @@ MODULE_DEVICE_TABLE(of, ti_adc_dt_ids); | |||
545 | static struct platform_driver tiadc_driver = { | 544 | static struct platform_driver tiadc_driver = { |
546 | .driver = { | 545 | .driver = { |
547 | .name = "TI-am335x-adc", | 546 | .name = "TI-am335x-adc", |
548 | .owner = THIS_MODULE, | ||
549 | .pm = TIADC_PM_OPS, | 547 | .pm = TIADC_PM_OPS, |
550 | .of_match_table = ti_adc_dt_ids, | 548 | .of_match_table = ti_adc_dt_ids, |
551 | }, | 549 | }, |
diff --git a/drivers/iio/adc/twl4030-madc.c b/drivers/iio/adc/twl4030-madc.c index eb86786e698e..94c5f05b4bc1 100644 --- a/drivers/iio/adc/twl4030-madc.c +++ b/drivers/iio/adc/twl4030-madc.c | |||
@@ -883,7 +883,6 @@ static struct platform_driver twl4030_madc_driver = { | |||
883 | .remove = twl4030_madc_remove, | 883 | .remove = twl4030_madc_remove, |
884 | .driver = { | 884 | .driver = { |
885 | .name = "twl4030_madc", | 885 | .name = "twl4030_madc", |
886 | .owner = THIS_MODULE, | ||
887 | .of_match_table = of_match_ptr(twl_madc_of_match), | 886 | .of_match_table = of_match_ptr(twl_madc_of_match), |
888 | }, | 887 | }, |
889 | }; | 888 | }; |
diff --git a/drivers/iio/adc/twl6030-gpadc.c b/drivers/iio/adc/twl6030-gpadc.c index 15282f148b3b..89d8aa1d2818 100644 --- a/drivers/iio/adc/twl6030-gpadc.c +++ b/drivers/iio/adc/twl6030-gpadc.c | |||
@@ -994,7 +994,6 @@ static struct platform_driver twl6030_gpadc_driver = { | |||
994 | .remove = twl6030_gpadc_remove, | 994 | .remove = twl6030_gpadc_remove, |
995 | .driver = { | 995 | .driver = { |
996 | .name = DRIVER_NAME, | 996 | .name = DRIVER_NAME, |
997 | .owner = THIS_MODULE, | ||
998 | .pm = &twl6030_gpadc_pm_ops, | 997 | .pm = &twl6030_gpadc_pm_ops, |
999 | .of_match_table = of_twl6030_match_tbl, | 998 | .of_match_table = of_twl6030_match_tbl, |
1000 | }, | 999 | }, |
diff --git a/drivers/iio/adc/vf610_adc.c b/drivers/iio/adc/vf610_adc.c index 44799eb5930e..8ec353c01d98 100644 --- a/drivers/iio/adc/vf610_adc.c +++ b/drivers/iio/adc/vf610_adc.c | |||
@@ -91,7 +91,7 @@ | |||
91 | #define VF610_ADC_CAL 0x80 | 91 | #define VF610_ADC_CAL 0x80 |
92 | 92 | ||
93 | /* Other field define */ | 93 | /* Other field define */ |
94 | #define VF610_ADC_ADCHC(x) ((x) & 0xF) | 94 | #define VF610_ADC_ADCHC(x) ((x) & 0x1F) |
95 | #define VF610_ADC_AIEN (0x1 << 7) | 95 | #define VF610_ADC_AIEN (0x1 << 7) |
96 | #define VF610_ADC_CONV_DISABLE 0x1F | 96 | #define VF610_ADC_CONV_DISABLE 0x1F |
97 | #define VF610_ADC_HS_COCO0 0x1 | 97 | #define VF610_ADC_HS_COCO0 0x1 |
@@ -153,6 +153,12 @@ struct vf610_adc { | |||
153 | BIT(IIO_CHAN_INFO_SAMP_FREQ), \ | 153 | BIT(IIO_CHAN_INFO_SAMP_FREQ), \ |
154 | } | 154 | } |
155 | 155 | ||
156 | #define VF610_ADC_TEMPERATURE_CHAN(_idx, _chan_type) { \ | ||
157 | .type = (_chan_type), \ | ||
158 | .channel = (_idx), \ | ||
159 | .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), \ | ||
160 | } | ||
161 | |||
156 | static const struct iio_chan_spec vf610_adc_iio_channels[] = { | 162 | static const struct iio_chan_spec vf610_adc_iio_channels[] = { |
157 | VF610_ADC_CHAN(0, IIO_VOLTAGE), | 163 | VF610_ADC_CHAN(0, IIO_VOLTAGE), |
158 | VF610_ADC_CHAN(1, IIO_VOLTAGE), | 164 | VF610_ADC_CHAN(1, IIO_VOLTAGE), |
@@ -170,6 +176,7 @@ static const struct iio_chan_spec vf610_adc_iio_channels[] = { | |||
170 | VF610_ADC_CHAN(13, IIO_VOLTAGE), | 176 | VF610_ADC_CHAN(13, IIO_VOLTAGE), |
171 | VF610_ADC_CHAN(14, IIO_VOLTAGE), | 177 | VF610_ADC_CHAN(14, IIO_VOLTAGE), |
172 | VF610_ADC_CHAN(15, IIO_VOLTAGE), | 178 | VF610_ADC_CHAN(15, IIO_VOLTAGE), |
179 | VF610_ADC_TEMPERATURE_CHAN(26, IIO_TEMP), | ||
173 | /* sentinel */ | 180 | /* sentinel */ |
174 | }; | 181 | }; |
175 | 182 | ||
@@ -451,6 +458,7 @@ static int vf610_read_raw(struct iio_dev *indio_dev, | |||
451 | 458 | ||
452 | switch (mask) { | 459 | switch (mask) { |
453 | case IIO_CHAN_INFO_RAW: | 460 | case IIO_CHAN_INFO_RAW: |
461 | case IIO_CHAN_INFO_PROCESSED: | ||
454 | mutex_lock(&indio_dev->mlock); | 462 | mutex_lock(&indio_dev->mlock); |
455 | reinit_completion(&info->completion); | 463 | reinit_completion(&info->completion); |
456 | 464 | ||
@@ -468,7 +476,23 @@ static int vf610_read_raw(struct iio_dev *indio_dev, | |||
468 | return ret; | 476 | return ret; |
469 | } | 477 | } |
470 | 478 | ||
471 | *val = info->value; | 479 | switch (chan->type) { |
480 | case IIO_VOLTAGE: | ||
481 | *val = info->value; | ||
482 | break; | ||
483 | case IIO_TEMP: | ||
484 | /* | ||
485 | * Calculate in degree Celsius times 1000 | ||
486 | * Using sensor slope of 1.84 mV/°C and | ||
487 | * V at 25°C of 696 mV | ||
488 | */ | ||
489 | *val = 25000 - ((int)info->value - 864) * 1000000 / 1840; | ||
490 | break; | ||
491 | default: | ||
492 | mutex_unlock(&indio_dev->mlock); | ||
493 | return -EINVAL; | ||
494 | } | ||
495 | |||
472 | mutex_unlock(&indio_dev->mlock); | 496 | mutex_unlock(&indio_dev->mlock); |
473 | return IIO_VAL_INT; | 497 | return IIO_VAL_INT; |
474 | 498 | ||
@@ -569,9 +593,9 @@ static int vf610_adc_probe(struct platform_device *pdev) | |||
569 | return PTR_ERR(info->regs); | 593 | return PTR_ERR(info->regs); |
570 | 594 | ||
571 | irq = platform_get_irq(pdev, 0); | 595 | irq = platform_get_irq(pdev, 0); |
572 | if (irq <= 0) { | 596 | if (irq < 0) { |
573 | dev_err(&pdev->dev, "no irq resource?\n"); | 597 | dev_err(&pdev->dev, "no irq resource?\n"); |
574 | return -EINVAL; | 598 | return irq; |
575 | } | 599 | } |
576 | 600 | ||
577 | ret = devm_request_irq(info->dev, irq, | 601 | ret = devm_request_irq(info->dev, irq, |
@@ -586,8 +610,7 @@ static int vf610_adc_probe(struct platform_device *pdev) | |||
586 | if (IS_ERR(info->clk)) { | 610 | if (IS_ERR(info->clk)) { |
587 | dev_err(&pdev->dev, "failed getting clock, err = %ld\n", | 611 | dev_err(&pdev->dev, "failed getting clock, err = %ld\n", |
588 | PTR_ERR(info->clk)); | 612 | PTR_ERR(info->clk)); |
589 | ret = PTR_ERR(info->clk); | 613 | return PTR_ERR(info->clk); |
590 | return ret; | ||
591 | } | 614 | } |
592 | 615 | ||
593 | info->vref = devm_regulator_get(&pdev->dev, "vref"); | 616 | info->vref = devm_regulator_get(&pdev->dev, "vref"); |
@@ -681,24 +704,25 @@ static int vf610_adc_resume(struct device *dev) | |||
681 | 704 | ||
682 | ret = clk_prepare_enable(info->clk); | 705 | ret = clk_prepare_enable(info->clk); |
683 | if (ret) | 706 | if (ret) |
684 | return ret; | 707 | goto disable_reg; |
685 | 708 | ||
686 | vf610_adc_hw_init(info); | 709 | vf610_adc_hw_init(info); |
687 | 710 | ||
688 | return 0; | 711 | return 0; |
712 | |||
713 | disable_reg: | ||
714 | regulator_disable(info->vref); | ||
715 | return ret; | ||
689 | } | 716 | } |
690 | #endif | 717 | #endif |
691 | 718 | ||
692 | static SIMPLE_DEV_PM_OPS(vf610_adc_pm_ops, | 719 | static SIMPLE_DEV_PM_OPS(vf610_adc_pm_ops, vf610_adc_suspend, vf610_adc_resume); |
693 | vf610_adc_suspend, | ||
694 | vf610_adc_resume); | ||
695 | 720 | ||
696 | static struct platform_driver vf610_adc_driver = { | 721 | static struct platform_driver vf610_adc_driver = { |
697 | .probe = vf610_adc_probe, | 722 | .probe = vf610_adc_probe, |
698 | .remove = vf610_adc_remove, | 723 | .remove = vf610_adc_remove, |
699 | .driver = { | 724 | .driver = { |
700 | .name = DRIVER_NAME, | 725 | .name = DRIVER_NAME, |
701 | .owner = THIS_MODULE, | ||
702 | .of_match_table = vf610_adc_match, | 726 | .of_match_table = vf610_adc_match, |
703 | .pm = &vf610_adc_pm_ops, | 727 | .pm = &vf610_adc_pm_ops, |
704 | }, | 728 | }, |
diff --git a/drivers/iio/adc/viperboard_adc.c b/drivers/iio/adc/viperboard_adc.c index 9acf6b6d705b..3be2e35721cc 100644 --- a/drivers/iio/adc/viperboard_adc.c +++ b/drivers/iio/adc/viperboard_adc.c | |||
@@ -145,7 +145,6 @@ static int vprbrd_adc_probe(struct platform_device *pdev) | |||
145 | static struct platform_driver vprbrd_adc_driver = { | 145 | static struct platform_driver vprbrd_adc_driver = { |
146 | .driver = { | 146 | .driver = { |
147 | .name = "viperboard-adc", | 147 | .name = "viperboard-adc", |
148 | .owner = THIS_MODULE, | ||
149 | }, | 148 | }, |
150 | .probe = vprbrd_adc_probe, | 149 | .probe = vprbrd_adc_probe, |
151 | }; | 150 | }; |
diff --git a/drivers/iio/adc/xilinx-xadc-core.c b/drivers/iio/adc/xilinx-xadc-core.c index 626b39749767..a221f7329b79 100644 --- a/drivers/iio/adc/xilinx-xadc-core.c +++ b/drivers/iio/adc/xilinx-xadc-core.c | |||
@@ -1201,12 +1201,16 @@ static int xadc_probe(struct platform_device *pdev) | |||
1201 | goto err_device_free; | 1201 | goto err_device_free; |
1202 | 1202 | ||
1203 | xadc->convst_trigger = xadc_alloc_trigger(indio_dev, "convst"); | 1203 | xadc->convst_trigger = xadc_alloc_trigger(indio_dev, "convst"); |
1204 | if (IS_ERR(xadc->convst_trigger)) | 1204 | if (IS_ERR(xadc->convst_trigger)) { |
1205 | ret = PTR_ERR(xadc->convst_trigger); | ||
1205 | goto err_triggered_buffer_cleanup; | 1206 | goto err_triggered_buffer_cleanup; |
1207 | } | ||
1206 | xadc->samplerate_trigger = xadc_alloc_trigger(indio_dev, | 1208 | xadc->samplerate_trigger = xadc_alloc_trigger(indio_dev, |
1207 | "samplerate"); | 1209 | "samplerate"); |
1208 | if (IS_ERR(xadc->samplerate_trigger)) | 1210 | if (IS_ERR(xadc->samplerate_trigger)) { |
1211 | ret = PTR_ERR(xadc->samplerate_trigger); | ||
1209 | goto err_free_convst_trigger; | 1212 | goto err_free_convst_trigger; |
1213 | } | ||
1210 | } | 1214 | } |
1211 | 1215 | ||
1212 | xadc->clk = devm_clk_get(&pdev->dev, NULL); | 1216 | xadc->clk = devm_clk_get(&pdev->dev, NULL); |
@@ -1322,7 +1326,6 @@ static struct platform_driver xadc_driver = { | |||
1322 | .remove = xadc_remove, | 1326 | .remove = xadc_remove, |
1323 | .driver = { | 1327 | .driver = { |
1324 | .name = "xadc", | 1328 | .name = "xadc", |
1325 | .owner = THIS_MODULE, | ||
1326 | .of_match_table = xadc_of_match_table, | 1329 | .of_match_table = xadc_of_match_table, |
1327 | }, | 1330 | }, |
1328 | }; | 1331 | }; |
diff --git a/drivers/iio/common/st_sensors/st_sensors_buffer.c b/drivers/iio/common/st_sensors/st_sensors_buffer.c index 1665c8e4b62b..e18bc6782256 100644 --- a/drivers/iio/common/st_sensors/st_sensors_buffer.c +++ b/drivers/iio/common/st_sensors/st_sensors_buffer.c | |||
@@ -71,7 +71,7 @@ int st_sensors_get_buffer_element(struct iio_dev *indio_dev, u8 *buf) | |||
71 | goto st_sensors_free_memory; | 71 | goto st_sensors_free_memory; |
72 | } | 72 | } |
73 | 73 | ||
74 | for (i = 0; i < n * num_data_channels; i++) { | 74 | for (i = 0; i < n * byte_for_channel; i++) { |
75 | if (i < n) | 75 | if (i < n) |
76 | buf[i] = rx_array[i]; | 76 | buf[i] = rx_array[i]; |
77 | else | 77 | else |
diff --git a/drivers/iio/common/st_sensors/st_sensors_core.c b/drivers/iio/common/st_sensors/st_sensors_core.c index 8a4ec00a91a0..edd13d2b4121 100644 --- a/drivers/iio/common/st_sensors/st_sensors_core.c +++ b/drivers/iio/common/st_sensors/st_sensors_core.c | |||
@@ -44,18 +44,18 @@ st_sensors_write_data_with_mask_error: | |||
44 | return err; | 44 | return err; |
45 | } | 45 | } |
46 | 46 | ||
47 | static int st_sensors_match_odr(struct st_sensors *sensor, | 47 | static int st_sensors_match_odr(struct st_sensor_settings *sensor_settings, |
48 | unsigned int odr, struct st_sensor_odr_avl *odr_out) | 48 | unsigned int odr, struct st_sensor_odr_avl *odr_out) |
49 | { | 49 | { |
50 | int i, ret = -EINVAL; | 50 | int i, ret = -EINVAL; |
51 | 51 | ||
52 | for (i = 0; i < ST_SENSORS_ODR_LIST_MAX; i++) { | 52 | for (i = 0; i < ST_SENSORS_ODR_LIST_MAX; i++) { |
53 | if (sensor->odr.odr_avl[i].hz == 0) | 53 | if (sensor_settings->odr.odr_avl[i].hz == 0) |
54 | goto st_sensors_match_odr_error; | 54 | goto st_sensors_match_odr_error; |
55 | 55 | ||
56 | if (sensor->odr.odr_avl[i].hz == odr) { | 56 | if (sensor_settings->odr.odr_avl[i].hz == odr) { |
57 | odr_out->hz = sensor->odr.odr_avl[i].hz; | 57 | odr_out->hz = sensor_settings->odr.odr_avl[i].hz; |
58 | odr_out->value = sensor->odr.odr_avl[i].value; | 58 | odr_out->value = sensor_settings->odr.odr_avl[i].value; |
59 | ret = 0; | 59 | ret = 0; |
60 | break; | 60 | break; |
61 | } | 61 | } |
@@ -71,23 +71,26 @@ int st_sensors_set_odr(struct iio_dev *indio_dev, unsigned int odr) | |||
71 | struct st_sensor_odr_avl odr_out = {0, 0}; | 71 | struct st_sensor_odr_avl odr_out = {0, 0}; |
72 | struct st_sensor_data *sdata = iio_priv(indio_dev); | 72 | struct st_sensor_data *sdata = iio_priv(indio_dev); |
73 | 73 | ||
74 | err = st_sensors_match_odr(sdata->sensor, odr, &odr_out); | 74 | err = st_sensors_match_odr(sdata->sensor_settings, odr, &odr_out); |
75 | if (err < 0) | 75 | if (err < 0) |
76 | goto st_sensors_match_odr_error; | 76 | goto st_sensors_match_odr_error; |
77 | 77 | ||
78 | if ((sdata->sensor->odr.addr == sdata->sensor->pw.addr) && | 78 | if ((sdata->sensor_settings->odr.addr == |
79 | (sdata->sensor->odr.mask == sdata->sensor->pw.mask)) { | 79 | sdata->sensor_settings->pw.addr) && |
80 | (sdata->sensor_settings->odr.mask == | ||
81 | sdata->sensor_settings->pw.mask)) { | ||
80 | if (sdata->enabled == true) { | 82 | if (sdata->enabled == true) { |
81 | err = st_sensors_write_data_with_mask(indio_dev, | 83 | err = st_sensors_write_data_with_mask(indio_dev, |
82 | sdata->sensor->odr.addr, | 84 | sdata->sensor_settings->odr.addr, |
83 | sdata->sensor->odr.mask, | 85 | sdata->sensor_settings->odr.mask, |
84 | odr_out.value); | 86 | odr_out.value); |
85 | } else { | 87 | } else { |
86 | err = 0; | 88 | err = 0; |
87 | } | 89 | } |
88 | } else { | 90 | } else { |
89 | err = st_sensors_write_data_with_mask(indio_dev, | 91 | err = st_sensors_write_data_with_mask(indio_dev, |
90 | sdata->sensor->odr.addr, sdata->sensor->odr.mask, | 92 | sdata->sensor_settings->odr.addr, |
93 | sdata->sensor_settings->odr.mask, | ||
91 | odr_out.value); | 94 | odr_out.value); |
92 | } | 95 | } |
93 | if (err >= 0) | 96 | if (err >= 0) |
@@ -98,16 +101,16 @@ st_sensors_match_odr_error: | |||
98 | } | 101 | } |
99 | EXPORT_SYMBOL(st_sensors_set_odr); | 102 | EXPORT_SYMBOL(st_sensors_set_odr); |
100 | 103 | ||
101 | static int st_sensors_match_fs(struct st_sensors *sensor, | 104 | static int st_sensors_match_fs(struct st_sensor_settings *sensor_settings, |
102 | unsigned int fs, int *index_fs_avl) | 105 | unsigned int fs, int *index_fs_avl) |
103 | { | 106 | { |
104 | int i, ret = -EINVAL; | 107 | int i, ret = -EINVAL; |
105 | 108 | ||
106 | for (i = 0; i < ST_SENSORS_FULLSCALE_AVL_MAX; i++) { | 109 | for (i = 0; i < ST_SENSORS_FULLSCALE_AVL_MAX; i++) { |
107 | if (sensor->fs.fs_avl[i].num == 0) | 110 | if (sensor_settings->fs.fs_avl[i].num == 0) |
108 | goto st_sensors_match_odr_error; | 111 | goto st_sensors_match_odr_error; |
109 | 112 | ||
110 | if (sensor->fs.fs_avl[i].num == fs) { | 113 | if (sensor_settings->fs.fs_avl[i].num == fs) { |
111 | *index_fs_avl = i; | 114 | *index_fs_avl = i; |
112 | ret = 0; | 115 | ret = 0; |
113 | break; | 116 | break; |
@@ -118,25 +121,24 @@ st_sensors_match_odr_error: | |||
118 | return ret; | 121 | return ret; |
119 | } | 122 | } |
120 | 123 | ||
121 | static int st_sensors_set_fullscale(struct iio_dev *indio_dev, | 124 | static int st_sensors_set_fullscale(struct iio_dev *indio_dev, unsigned int fs) |
122 | unsigned int fs) | ||
123 | { | 125 | { |
124 | int err, i = 0; | 126 | int err, i = 0; |
125 | struct st_sensor_data *sdata = iio_priv(indio_dev); | 127 | struct st_sensor_data *sdata = iio_priv(indio_dev); |
126 | 128 | ||
127 | err = st_sensors_match_fs(sdata->sensor, fs, &i); | 129 | err = st_sensors_match_fs(sdata->sensor_settings, fs, &i); |
128 | if (err < 0) | 130 | if (err < 0) |
129 | goto st_accel_set_fullscale_error; | 131 | goto st_accel_set_fullscale_error; |
130 | 132 | ||
131 | err = st_sensors_write_data_with_mask(indio_dev, | 133 | err = st_sensors_write_data_with_mask(indio_dev, |
132 | sdata->sensor->fs.addr, | 134 | sdata->sensor_settings->fs.addr, |
133 | sdata->sensor->fs.mask, | 135 | sdata->sensor_settings->fs.mask, |
134 | sdata->sensor->fs.fs_avl[i].value); | 136 | sdata->sensor_settings->fs.fs_avl[i].value); |
135 | if (err < 0) | 137 | if (err < 0) |
136 | goto st_accel_set_fullscale_error; | 138 | goto st_accel_set_fullscale_error; |
137 | 139 | ||
138 | sdata->current_fullscale = (struct st_sensor_fullscale_avl *) | 140 | sdata->current_fullscale = (struct st_sensor_fullscale_avl *) |
139 | &sdata->sensor->fs.fs_avl[i]; | 141 | &sdata->sensor_settings->fs.fs_avl[i]; |
140 | return err; | 142 | return err; |
141 | 143 | ||
142 | st_accel_set_fullscale_error: | 144 | st_accel_set_fullscale_error: |
@@ -153,10 +155,12 @@ int st_sensors_set_enable(struct iio_dev *indio_dev, bool enable) | |||
153 | struct st_sensor_data *sdata = iio_priv(indio_dev); | 155 | struct st_sensor_data *sdata = iio_priv(indio_dev); |
154 | 156 | ||
155 | if (enable) { | 157 | if (enable) { |
156 | tmp_value = sdata->sensor->pw.value_on; | 158 | tmp_value = sdata->sensor_settings->pw.value_on; |
157 | if ((sdata->sensor->odr.addr == sdata->sensor->pw.addr) && | 159 | if ((sdata->sensor_settings->odr.addr == |
158 | (sdata->sensor->odr.mask == sdata->sensor->pw.mask)) { | 160 | sdata->sensor_settings->pw.addr) && |
159 | err = st_sensors_match_odr(sdata->sensor, | 161 | (sdata->sensor_settings->odr.mask == |
162 | sdata->sensor_settings->pw.mask)) { | ||
163 | err = st_sensors_match_odr(sdata->sensor_settings, | ||
160 | sdata->odr, &odr_out); | 164 | sdata->odr, &odr_out); |
161 | if (err < 0) | 165 | if (err < 0) |
162 | goto set_enable_error; | 166 | goto set_enable_error; |
@@ -164,8 +168,8 @@ int st_sensors_set_enable(struct iio_dev *indio_dev, bool enable) | |||
164 | found = true; | 168 | found = true; |
165 | } | 169 | } |
166 | err = st_sensors_write_data_with_mask(indio_dev, | 170 | err = st_sensors_write_data_with_mask(indio_dev, |
167 | sdata->sensor->pw.addr, | 171 | sdata->sensor_settings->pw.addr, |
168 | sdata->sensor->pw.mask, tmp_value); | 172 | sdata->sensor_settings->pw.mask, tmp_value); |
169 | if (err < 0) | 173 | if (err < 0) |
170 | goto set_enable_error; | 174 | goto set_enable_error; |
171 | 175 | ||
@@ -175,9 +179,9 @@ int st_sensors_set_enable(struct iio_dev *indio_dev, bool enable) | |||
175 | sdata->odr = odr_out.hz; | 179 | sdata->odr = odr_out.hz; |
176 | } else { | 180 | } else { |
177 | err = st_sensors_write_data_with_mask(indio_dev, | 181 | err = st_sensors_write_data_with_mask(indio_dev, |
178 | sdata->sensor->pw.addr, | 182 | sdata->sensor_settings->pw.addr, |
179 | sdata->sensor->pw.mask, | 183 | sdata->sensor_settings->pw.mask, |
180 | sdata->sensor->pw.value_off); | 184 | sdata->sensor_settings->pw.value_off); |
181 | if (err < 0) | 185 | if (err < 0) |
182 | goto set_enable_error; | 186 | goto set_enable_error; |
183 | 187 | ||
@@ -194,8 +198,9 @@ int st_sensors_set_axis_enable(struct iio_dev *indio_dev, u8 axis_enable) | |||
194 | struct st_sensor_data *sdata = iio_priv(indio_dev); | 198 | struct st_sensor_data *sdata = iio_priv(indio_dev); |
195 | 199 | ||
196 | return st_sensors_write_data_with_mask(indio_dev, | 200 | return st_sensors_write_data_with_mask(indio_dev, |
197 | sdata->sensor->enable_axis.addr, | 201 | sdata->sensor_settings->enable_axis.addr, |
198 | sdata->sensor->enable_axis.mask, axis_enable); | 202 | sdata->sensor_settings->enable_axis.mask, |
203 | axis_enable); | ||
199 | } | 204 | } |
200 | EXPORT_SYMBOL(st_sensors_set_axis_enable); | 205 | EXPORT_SYMBOL(st_sensors_set_axis_enable); |
201 | 206 | ||
@@ -236,13 +241,13 @@ void st_sensors_power_disable(struct iio_dev *indio_dev) | |||
236 | EXPORT_SYMBOL(st_sensors_power_disable); | 241 | EXPORT_SYMBOL(st_sensors_power_disable); |
237 | 242 | ||
238 | static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev, | 243 | static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev, |
239 | struct st_sensors_platform_data *pdata) | 244 | struct st_sensors_platform_data *pdata) |
240 | { | 245 | { |
241 | struct st_sensor_data *sdata = iio_priv(indio_dev); | 246 | struct st_sensor_data *sdata = iio_priv(indio_dev); |
242 | 247 | ||
243 | switch (pdata->drdy_int_pin) { | 248 | switch (pdata->drdy_int_pin) { |
244 | case 1: | 249 | case 1: |
245 | if (sdata->sensor->drdy_irq.mask_int1 == 0) { | 250 | if (sdata->sensor_settings->drdy_irq.mask_int1 == 0) { |
246 | dev_err(&indio_dev->dev, | 251 | dev_err(&indio_dev->dev, |
247 | "DRDY on INT1 not available.\n"); | 252 | "DRDY on INT1 not available.\n"); |
248 | return -EINVAL; | 253 | return -EINVAL; |
@@ -250,7 +255,7 @@ static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev, | |||
250 | sdata->drdy_int_pin = 1; | 255 | sdata->drdy_int_pin = 1; |
251 | break; | 256 | break; |
252 | case 2: | 257 | case 2: |
253 | if (sdata->sensor->drdy_irq.mask_int2 == 0) { | 258 | if (sdata->sensor_settings->drdy_irq.mask_int2 == 0) { |
254 | dev_err(&indio_dev->dev, | 259 | dev_err(&indio_dev->dev, |
255 | "DRDY on INT2 not available.\n"); | 260 | "DRDY on INT2 not available.\n"); |
256 | return -EINVAL; | 261 | return -EINVAL; |
@@ -306,8 +311,11 @@ int st_sensors_init_sensor(struct iio_dev *indio_dev, | |||
306 | if (of_pdata) | 311 | if (of_pdata) |
307 | pdata = of_pdata; | 312 | pdata = of_pdata; |
308 | 313 | ||
309 | if (pdata) | 314 | if (pdata) { |
310 | err = st_sensors_set_drdy_int_pin(indio_dev, pdata); | 315 | err = st_sensors_set_drdy_int_pin(indio_dev, pdata); |
316 | if (err < 0) | ||
317 | return err; | ||
318 | } | ||
311 | 319 | ||
312 | err = st_sensors_set_enable(indio_dev, false); | 320 | err = st_sensors_set_enable(indio_dev, false); |
313 | if (err < 0) | 321 | if (err < 0) |
@@ -315,7 +323,7 @@ int st_sensors_init_sensor(struct iio_dev *indio_dev, | |||
315 | 323 | ||
316 | if (sdata->current_fullscale) { | 324 | if (sdata->current_fullscale) { |
317 | err = st_sensors_set_fullscale(indio_dev, | 325 | err = st_sensors_set_fullscale(indio_dev, |
318 | sdata->current_fullscale->num); | 326 | sdata->current_fullscale->num); |
319 | if (err < 0) | 327 | if (err < 0) |
320 | return err; | 328 | return err; |
321 | } else | 329 | } else |
@@ -327,7 +335,8 @@ int st_sensors_init_sensor(struct iio_dev *indio_dev, | |||
327 | 335 | ||
328 | /* set BDU */ | 336 | /* set BDU */ |
329 | err = st_sensors_write_data_with_mask(indio_dev, | 337 | err = st_sensors_write_data_with_mask(indio_dev, |
330 | sdata->sensor->bdu.addr, sdata->sensor->bdu.mask, true); | 338 | sdata->sensor_settings->bdu.addr, |
339 | sdata->sensor_settings->bdu.mask, true); | ||
331 | if (err < 0) | 340 | if (err < 0) |
332 | return err; | 341 | return err; |
333 | 342 | ||
@@ -343,26 +352,28 @@ int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable) | |||
343 | u8 drdy_mask; | 352 | u8 drdy_mask; |
344 | struct st_sensor_data *sdata = iio_priv(indio_dev); | 353 | struct st_sensor_data *sdata = iio_priv(indio_dev); |
345 | 354 | ||
346 | if (!sdata->sensor->drdy_irq.addr) | 355 | if (!sdata->sensor_settings->drdy_irq.addr) |
347 | return 0; | 356 | return 0; |
348 | 357 | ||
349 | /* Enable/Disable the interrupt generator 1. */ | 358 | /* Enable/Disable the interrupt generator 1. */ |
350 | if (sdata->sensor->drdy_irq.ig1.en_addr > 0) { | 359 | if (sdata->sensor_settings->drdy_irq.ig1.en_addr > 0) { |
351 | err = st_sensors_write_data_with_mask(indio_dev, | 360 | err = st_sensors_write_data_with_mask(indio_dev, |
352 | sdata->sensor->drdy_irq.ig1.en_addr, | 361 | sdata->sensor_settings->drdy_irq.ig1.en_addr, |
353 | sdata->sensor->drdy_irq.ig1.en_mask, (int)enable); | 362 | sdata->sensor_settings->drdy_irq.ig1.en_mask, |
363 | (int)enable); | ||
354 | if (err < 0) | 364 | if (err < 0) |
355 | goto st_accel_set_dataready_irq_error; | 365 | goto st_accel_set_dataready_irq_error; |
356 | } | 366 | } |
357 | 367 | ||
358 | if (sdata->drdy_int_pin == 1) | 368 | if (sdata->drdy_int_pin == 1) |
359 | drdy_mask = sdata->sensor->drdy_irq.mask_int1; | 369 | drdy_mask = sdata->sensor_settings->drdy_irq.mask_int1; |
360 | else | 370 | else |
361 | drdy_mask = sdata->sensor->drdy_irq.mask_int2; | 371 | drdy_mask = sdata->sensor_settings->drdy_irq.mask_int2; |
362 | 372 | ||
363 | /* Enable/Disable the interrupt generator for data ready. */ | 373 | /* Enable/Disable the interrupt generator for data ready. */ |
364 | err = st_sensors_write_data_with_mask(indio_dev, | 374 | err = st_sensors_write_data_with_mask(indio_dev, |
365 | sdata->sensor->drdy_irq.addr, drdy_mask, (int)enable); | 375 | sdata->sensor_settings->drdy_irq.addr, |
376 | drdy_mask, (int)enable); | ||
366 | 377 | ||
367 | st_accel_set_dataready_irq_error: | 378 | st_accel_set_dataready_irq_error: |
368 | return err; | 379 | return err; |
@@ -375,8 +386,8 @@ int st_sensors_set_fullscale_by_gain(struct iio_dev *indio_dev, int scale) | |||
375 | struct st_sensor_data *sdata = iio_priv(indio_dev); | 386 | struct st_sensor_data *sdata = iio_priv(indio_dev); |
376 | 387 | ||
377 | for (i = 0; i < ST_SENSORS_FULLSCALE_AVL_MAX; i++) { | 388 | for (i = 0; i < ST_SENSORS_FULLSCALE_AVL_MAX; i++) { |
378 | if ((sdata->sensor->fs.fs_avl[i].gain == scale) && | 389 | if ((sdata->sensor_settings->fs.fs_avl[i].gain == scale) && |
379 | (sdata->sensor->fs.fs_avl[i].gain != 0)) { | 390 | (sdata->sensor_settings->fs.fs_avl[i].gain != 0)) { |
380 | err = 0; | 391 | err = 0; |
381 | break; | 392 | break; |
382 | } | 393 | } |
@@ -385,7 +396,7 @@ int st_sensors_set_fullscale_by_gain(struct iio_dev *indio_dev, int scale) | |||
385 | goto st_sensors_match_scale_error; | 396 | goto st_sensors_match_scale_error; |
386 | 397 | ||
387 | err = st_sensors_set_fullscale(indio_dev, | 398 | err = st_sensors_set_fullscale(indio_dev, |
388 | sdata->sensor->fs.fs_avl[i].num); | 399 | sdata->sensor_settings->fs.fs_avl[i].num); |
389 | 400 | ||
390 | st_sensors_match_scale_error: | 401 | st_sensors_match_scale_error: |
391 | return err; | 402 | return err; |
@@ -436,7 +447,7 @@ int st_sensors_read_info_raw(struct iio_dev *indio_dev, | |||
436 | if (err < 0) | 447 | if (err < 0) |
437 | goto out; | 448 | goto out; |
438 | 449 | ||
439 | msleep((sdata->sensor->bootime * 1000) / sdata->odr); | 450 | msleep((sdata->sensor_settings->bootime * 1000) / sdata->odr); |
440 | err = st_sensors_read_axis_data(indio_dev, ch, val); | 451 | err = st_sensors_read_axis_data(indio_dev, ch, val); |
441 | if (err < 0) | 452 | if (err < 0) |
442 | goto out; | 453 | goto out; |
@@ -453,7 +464,8 @@ out: | |||
453 | EXPORT_SYMBOL(st_sensors_read_info_raw); | 464 | EXPORT_SYMBOL(st_sensors_read_info_raw); |
454 | 465 | ||
455 | int st_sensors_check_device_support(struct iio_dev *indio_dev, | 466 | int st_sensors_check_device_support(struct iio_dev *indio_dev, |
456 | int num_sensors_list, const struct st_sensors *sensors) | 467 | int num_sensors_list, |
468 | const struct st_sensor_settings *sensor_settings) | ||
457 | { | 469 | { |
458 | u8 wai; | 470 | u8 wai; |
459 | int i, n, err; | 471 | int i, n, err; |
@@ -467,23 +479,24 @@ int st_sensors_check_device_support(struct iio_dev *indio_dev, | |||
467 | } | 479 | } |
468 | 480 | ||
469 | for (i = 0; i < num_sensors_list; i++) { | 481 | for (i = 0; i < num_sensors_list; i++) { |
470 | if (sensors[i].wai == wai) | 482 | if (sensor_settings[i].wai == wai) |
471 | break; | 483 | break; |
472 | } | 484 | } |
473 | if (i == num_sensors_list) | 485 | if (i == num_sensors_list) |
474 | goto device_not_supported; | 486 | goto device_not_supported; |
475 | 487 | ||
476 | for (n = 0; n < ARRAY_SIZE(sensors[i].sensors_supported); n++) { | 488 | for (n = 0; n < ARRAY_SIZE(sensor_settings[i].sensors_supported); n++) { |
477 | if (strcmp(indio_dev->name, | 489 | if (strcmp(indio_dev->name, |
478 | &sensors[i].sensors_supported[n][0]) == 0) | 490 | &sensor_settings[i].sensors_supported[n][0]) == 0) |
479 | break; | 491 | break; |
480 | } | 492 | } |
481 | if (n == ARRAY_SIZE(sensors[i].sensors_supported)) { | 493 | if (n == ARRAY_SIZE(sensor_settings[i].sensors_supported)) { |
482 | dev_err(&indio_dev->dev, "device name and WhoAmI mismatch.\n"); | 494 | dev_err(&indio_dev->dev, "device name and WhoAmI mismatch.\n"); |
483 | goto sensor_name_mismatch; | 495 | goto sensor_name_mismatch; |
484 | } | 496 | } |
485 | 497 | ||
486 | sdata->sensor = (struct st_sensors *)&sensors[i]; | 498 | sdata->sensor_settings = |
499 | (struct st_sensor_settings *)&sensor_settings[i]; | ||
487 | 500 | ||
488 | return i; | 501 | return i; |
489 | 502 | ||
@@ -505,11 +518,11 @@ ssize_t st_sensors_sysfs_sampling_frequency_avail(struct device *dev, | |||
505 | 518 | ||
506 | mutex_lock(&indio_dev->mlock); | 519 | mutex_lock(&indio_dev->mlock); |
507 | for (i = 0; i < ST_SENSORS_ODR_LIST_MAX; i++) { | 520 | for (i = 0; i < ST_SENSORS_ODR_LIST_MAX; i++) { |
508 | if (sdata->sensor->odr.odr_avl[i].hz == 0) | 521 | if (sdata->sensor_settings->odr.odr_avl[i].hz == 0) |
509 | break; | 522 | break; |
510 | 523 | ||
511 | len += scnprintf(buf + len, PAGE_SIZE - len, "%d ", | 524 | len += scnprintf(buf + len, PAGE_SIZE - len, "%d ", |
512 | sdata->sensor->odr.odr_avl[i].hz); | 525 | sdata->sensor_settings->odr.odr_avl[i].hz); |
513 | } | 526 | } |
514 | mutex_unlock(&indio_dev->mlock); | 527 | mutex_unlock(&indio_dev->mlock); |
515 | buf[len - 1] = '\n'; | 528 | buf[len - 1] = '\n'; |
@@ -527,11 +540,11 @@ ssize_t st_sensors_sysfs_scale_avail(struct device *dev, | |||
527 | 540 | ||
528 | mutex_lock(&indio_dev->mlock); | 541 | mutex_lock(&indio_dev->mlock); |
529 | for (i = 0; i < ST_SENSORS_FULLSCALE_AVL_MAX; i++) { | 542 | for (i = 0; i < ST_SENSORS_FULLSCALE_AVL_MAX; i++) { |
530 | if (sdata->sensor->fs.fs_avl[i].num == 0) | 543 | if (sdata->sensor_settings->fs.fs_avl[i].num == 0) |
531 | break; | 544 | break; |
532 | 545 | ||
533 | len += scnprintf(buf + len, PAGE_SIZE - len, "0.%06u ", | 546 | len += scnprintf(buf + len, PAGE_SIZE - len, "0.%06u ", |
534 | sdata->sensor->fs.fs_avl[i].gain); | 547 | sdata->sensor_settings->fs.fs_avl[i].gain); |
535 | } | 548 | } |
536 | mutex_unlock(&indio_dev->mlock); | 549 | mutex_unlock(&indio_dev->mlock); |
537 | buf[len - 1] = '\n'; | 550 | buf[len - 1] = '\n'; |
diff --git a/drivers/iio/common/st_sensors/st_sensors_i2c.c b/drivers/iio/common/st_sensors/st_sensors_i2c.c index bb6f3085f57b..98cfee296d46 100644 --- a/drivers/iio/common/st_sensors/st_sensors_i2c.c +++ b/drivers/iio/common/st_sensors/st_sensors_i2c.c | |||
@@ -72,6 +72,7 @@ void st_sensors_i2c_configure(struct iio_dev *indio_dev, | |||
72 | indio_dev->dev.parent = &client->dev; | 72 | indio_dev->dev.parent = &client->dev; |
73 | indio_dev->name = client->name; | 73 | indio_dev->name = client->name; |
74 | 74 | ||
75 | sdata->dev = &client->dev; | ||
75 | sdata->tf = &st_sensors_tf_i2c; | 76 | sdata->tf = &st_sensors_tf_i2c; |
76 | sdata->get_irq_data_ready = st_sensors_i2c_get_irq; | 77 | sdata->get_irq_data_ready = st_sensors_i2c_get_irq; |
77 | } | 78 | } |
diff --git a/drivers/iio/common/st_sensors/st_sensors_spi.c b/drivers/iio/common/st_sensors/st_sensors_spi.c index 251baf6abc25..78a6a1ab3ece 100644 --- a/drivers/iio/common/st_sensors/st_sensors_spi.c +++ b/drivers/iio/common/st_sensors/st_sensors_spi.c | |||
@@ -111,6 +111,7 @@ void st_sensors_spi_configure(struct iio_dev *indio_dev, | |||
111 | indio_dev->dev.parent = &spi->dev; | 111 | indio_dev->dev.parent = &spi->dev; |
112 | indio_dev->name = spi->modalias; | 112 | indio_dev->name = spi->modalias; |
113 | 113 | ||
114 | sdata->dev = &spi->dev; | ||
114 | sdata->tf = &st_sensors_tf_spi; | 115 | sdata->tf = &st_sensors_tf_spi; |
115 | sdata->get_irq_data_ready = st_sensors_spi_get_irq; | 116 | sdata->get_irq_data_ready = st_sensors_spi_get_irq; |
116 | } | 117 | } |
diff --git a/drivers/iio/dac/Kconfig b/drivers/iio/dac/Kconfig index f278eff42a4c..2236ea22f98a 100644 --- a/drivers/iio/dac/Kconfig +++ b/drivers/iio/dac/Kconfig | |||
@@ -152,6 +152,14 @@ config MAX517 | |||
152 | This driver can also be built as a module. If so, the module | 152 | This driver can also be built as a module. If so, the module |
153 | will be called max517. | 153 | will be called max517. |
154 | 154 | ||
155 | config MAX5821 | ||
156 | tristate "Maxim MAX5821 DAC driver" | ||
157 | depends on I2C | ||
158 | depends on OF | ||
159 | help | ||
160 | Say yes here to build support for Maxim MAX5821 | ||
161 | 10 bits DAC. | ||
162 | |||
155 | config MCP4725 | 163 | config MCP4725 |
156 | tristate "MCP4725 DAC driver" | 164 | tristate "MCP4725 DAC driver" |
157 | depends on I2C | 165 | depends on I2C |
diff --git a/drivers/iio/dac/Makefile b/drivers/iio/dac/Makefile index 10107640bb46..52be7e1acf16 100644 --- a/drivers/iio/dac/Makefile +++ b/drivers/iio/dac/Makefile | |||
@@ -17,5 +17,6 @@ obj-$(CONFIG_AD5791) += ad5791.o | |||
17 | obj-$(CONFIG_AD5686) += ad5686.o | 17 | obj-$(CONFIG_AD5686) += ad5686.o |
18 | obj-$(CONFIG_AD7303) += ad7303.o | 18 | obj-$(CONFIG_AD7303) += ad7303.o |
19 | obj-$(CONFIG_MAX517) += max517.o | 19 | obj-$(CONFIG_MAX517) += max517.o |
20 | obj-$(CONFIG_MAX5821) += max5821.o | ||
20 | obj-$(CONFIG_MCP4725) += mcp4725.o | 21 | obj-$(CONFIG_MCP4725) += mcp4725.o |
21 | obj-$(CONFIG_MCP4922) += mcp4922.o | 22 | obj-$(CONFIG_MCP4922) += mcp4922.o |
diff --git a/drivers/iio/dac/max5821.c b/drivers/iio/dac/max5821.c new file mode 100644 index 000000000000..6e914495b346 --- /dev/null +++ b/drivers/iio/dac/max5821.c | |||
@@ -0,0 +1,405 @@ | |||
1 | /* | ||
2 | * iio/dac/max5821.c | ||
3 | * Copyright (C) 2014 Philippe Reynes | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
8 | */ | ||
9 | |||
10 | #include <linux/kernel.h> | ||
11 | #include <linux/module.h> | ||
12 | #include <linux/i2c.h> | ||
13 | #include <linux/iio/iio.h> | ||
14 | #include <linux/regulator/consumer.h> | ||
15 | |||
16 | #define MAX5821_MAX_DAC_CHANNELS 2 | ||
17 | |||
18 | /* command bytes */ | ||
19 | #define MAX5821_LOAD_DAC_A_IN_REG_B 0x00 | ||
20 | #define MAX5821_LOAD_DAC_B_IN_REG_A 0x10 | ||
21 | #define MAX5821_EXTENDED_COMMAND_MODE 0xf0 | ||
22 | #define MAX5821_READ_DAC_A_COMMAND 0xf1 | ||
23 | #define MAX5821_READ_DAC_B_COMMAND 0xf2 | ||
24 | |||
25 | #define MAX5821_EXTENDED_POWER_UP 0x00 | ||
26 | #define MAX5821_EXTENDED_POWER_DOWN_MODE0 0x01 | ||
27 | #define MAX5821_EXTENDED_POWER_DOWN_MODE1 0x02 | ||
28 | #define MAX5821_EXTENDED_POWER_DOWN_MODE2 0x03 | ||
29 | #define MAX5821_EXTENDED_DAC_A 0x04 | ||
30 | #define MAX5821_EXTENDED_DAC_B 0x08 | ||
31 | |||
32 | enum max5821_device_ids { | ||
33 | ID_MAX5821, | ||
34 | }; | ||
35 | |||
36 | struct max5821_data { | ||
37 | struct i2c_client *client; | ||
38 | struct regulator *vref_reg; | ||
39 | unsigned short vref_mv; | ||
40 | bool powerdown[MAX5821_MAX_DAC_CHANNELS]; | ||
41 | u8 powerdown_mode[MAX5821_MAX_DAC_CHANNELS]; | ||
42 | struct mutex lock; | ||
43 | }; | ||
44 | |||
45 | static const char * const max5821_powerdown_modes[] = { | ||
46 | "three_state", | ||
47 | "1kohm_to_gnd", | ||
48 | "100kohm_to_gnd", | ||
49 | }; | ||
50 | |||
51 | enum { | ||
52 | MAX5821_THREE_STATE, | ||
53 | MAX5821_1KOHM_TO_GND, | ||
54 | MAX5821_100KOHM_TO_GND | ||
55 | }; | ||
56 | |||
57 | static int max5821_get_powerdown_mode(struct iio_dev *indio_dev, | ||
58 | const struct iio_chan_spec *chan) | ||
59 | { | ||
60 | struct max5821_data *st = iio_priv(indio_dev); | ||
61 | |||
62 | return st->powerdown_mode[chan->channel]; | ||
63 | } | ||
64 | |||
65 | static int max5821_set_powerdown_mode(struct iio_dev *indio_dev, | ||
66 | const struct iio_chan_spec *chan, | ||
67 | unsigned int mode) | ||
68 | { | ||
69 | struct max5821_data *st = iio_priv(indio_dev); | ||
70 | |||
71 | st->powerdown_mode[chan->channel] = mode; | ||
72 | |||
73 | return 0; | ||
74 | } | ||
75 | |||
76 | static const struct iio_enum max5821_powerdown_mode_enum = { | ||
77 | .items = max5821_powerdown_modes, | ||
78 | .num_items = ARRAY_SIZE(max5821_powerdown_modes), | ||
79 | .get = max5821_get_powerdown_mode, | ||
80 | .set = max5821_set_powerdown_mode, | ||
81 | }; | ||
82 | |||
83 | static ssize_t max5821_read_dac_powerdown(struct iio_dev *indio_dev, | ||
84 | uintptr_t private, | ||
85 | const struct iio_chan_spec *chan, | ||
86 | char *buf) | ||
87 | { | ||
88 | struct max5821_data *st = iio_priv(indio_dev); | ||
89 | |||
90 | return sprintf(buf, "%d\n", st->powerdown[chan->channel]); | ||
91 | } | ||
92 | |||
93 | static int max5821_sync_powerdown_mode(struct max5821_data *data, | ||
94 | const struct iio_chan_spec *chan) | ||
95 | { | ||
96 | u8 outbuf[2]; | ||
97 | |||
98 | outbuf[0] = MAX5821_EXTENDED_COMMAND_MODE; | ||
99 | |||
100 | if (chan->channel == 0) | ||
101 | outbuf[1] = MAX5821_EXTENDED_DAC_A; | ||
102 | else | ||
103 | outbuf[1] = MAX5821_EXTENDED_DAC_B; | ||
104 | |||
105 | if (data->powerdown[chan->channel]) | ||
106 | outbuf[1] |= data->powerdown_mode[chan->channel] + 1; | ||
107 | else | ||
108 | outbuf[1] |= MAX5821_EXTENDED_POWER_UP; | ||
109 | |||
110 | return i2c_master_send(data->client, outbuf, 2); | ||
111 | } | ||
112 | |||
113 | static ssize_t max5821_write_dac_powerdown(struct iio_dev *indio_dev, | ||
114 | uintptr_t private, | ||
115 | const struct iio_chan_spec *chan, | ||
116 | const char *buf, size_t len) | ||
117 | { | ||
118 | struct max5821_data *data = iio_priv(indio_dev); | ||
119 | bool powerdown; | ||
120 | int ret; | ||
121 | |||
122 | ret = strtobool(buf, &powerdown); | ||
123 | if (ret) | ||
124 | return ret; | ||
125 | |||
126 | data->powerdown[chan->channel] = powerdown; | ||
127 | |||
128 | ret = max5821_sync_powerdown_mode(data, chan); | ||
129 | if (ret < 0) | ||
130 | return ret; | ||
131 | |||
132 | return len; | ||
133 | } | ||
134 | |||
135 | static const struct iio_chan_spec_ext_info max5821_ext_info[] = { | ||
136 | { | ||
137 | .name = "powerdown", | ||
138 | .read = max5821_read_dac_powerdown, | ||
139 | .write = max5821_write_dac_powerdown, | ||
140 | .shared = IIO_SEPARATE, | ||
141 | }, | ||
142 | IIO_ENUM("powerdown_mode", IIO_SEPARATE, &max5821_powerdown_mode_enum), | ||
143 | IIO_ENUM_AVAILABLE("powerdown_mode", &max5821_powerdown_mode_enum), | ||
144 | { }, | ||
145 | }; | ||
146 | |||
147 | #define MAX5821_CHANNEL(chan) { \ | ||
148 | .type = IIO_VOLTAGE, \ | ||
149 | .indexed = 1, \ | ||
150 | .output = 1, \ | ||
151 | .channel = (chan), \ | ||
152 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ | ||
153 | .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SCALE), \ | ||
154 | .ext_info = max5821_ext_info, \ | ||
155 | } | ||
156 | |||
157 | static const struct iio_chan_spec max5821_channels[] = { | ||
158 | MAX5821_CHANNEL(0), | ||
159 | MAX5821_CHANNEL(1) | ||
160 | }; | ||
161 | |||
162 | static const u8 max5821_read_dac_command[] = { | ||
163 | MAX5821_READ_DAC_A_COMMAND, | ||
164 | MAX5821_READ_DAC_B_COMMAND | ||
165 | }; | ||
166 | |||
167 | static const u8 max5821_load_dac_command[] = { | ||
168 | MAX5821_LOAD_DAC_A_IN_REG_B, | ||
169 | MAX5821_LOAD_DAC_B_IN_REG_A | ||
170 | }; | ||
171 | |||
172 | static int max5821_get_value(struct iio_dev *indio_dev, | ||
173 | int *val, int channel) | ||
174 | { | ||
175 | struct max5821_data *data = iio_priv(indio_dev); | ||
176 | struct i2c_client *client = data->client; | ||
177 | u8 outbuf[1]; | ||
178 | u8 inbuf[2]; | ||
179 | int ret; | ||
180 | |||
181 | if ((channel != 0) && (channel != 1)) | ||
182 | return -EINVAL; | ||
183 | |||
184 | outbuf[0] = max5821_read_dac_command[channel]; | ||
185 | |||
186 | mutex_lock(&data->lock); | ||
187 | |||
188 | ret = i2c_master_send(client, outbuf, 1); | ||
189 | if (ret < 0) { | ||
190 | mutex_unlock(&data->lock); | ||
191 | return ret; | ||
192 | } else if (ret != 1) { | ||
193 | mutex_unlock(&data->lock); | ||
194 | return -EIO; | ||
195 | } | ||
196 | |||
197 | ret = i2c_master_recv(client, inbuf, 2); | ||
198 | if (ret < 0) { | ||
199 | mutex_unlock(&data->lock); | ||
200 | return ret; | ||
201 | } else if (ret != 2) { | ||
202 | mutex_unlock(&data->lock); | ||
203 | return -EIO; | ||
204 | } | ||
205 | |||
206 | mutex_unlock(&data->lock); | ||
207 | |||
208 | *val = ((inbuf[0] & 0x0f) << 6) | (inbuf[1] >> 2); | ||
209 | |||
210 | return IIO_VAL_INT; | ||
211 | } | ||
212 | |||
213 | static int max5821_set_value(struct iio_dev *indio_dev, | ||
214 | int val, int channel) | ||
215 | { | ||
216 | struct max5821_data *data = iio_priv(indio_dev); | ||
217 | struct i2c_client *client = data->client; | ||
218 | u8 outbuf[2]; | ||
219 | int ret; | ||
220 | |||
221 | if ((val < 0) || (val > 1023)) | ||
222 | return -EINVAL; | ||
223 | |||
224 | if ((channel != 0) && (channel != 1)) | ||
225 | return -EINVAL; | ||
226 | |||
227 | outbuf[0] = max5821_load_dac_command[channel]; | ||
228 | outbuf[0] |= val >> 6; | ||
229 | outbuf[1] = (val & 0x3f) << 2; | ||
230 | |||
231 | ret = i2c_master_send(client, outbuf, 2); | ||
232 | if (ret < 0) | ||
233 | return ret; | ||
234 | else if (ret != 2) | ||
235 | return -EIO; | ||
236 | else | ||
237 | return 0; | ||
238 | } | ||
239 | |||
240 | static int max5821_read_raw(struct iio_dev *indio_dev, | ||
241 | struct iio_chan_spec const *chan, | ||
242 | int *val, int *val2, long mask) | ||
243 | { | ||
244 | struct max5821_data *data = iio_priv(indio_dev); | ||
245 | |||
246 | switch (mask) { | ||
247 | case IIO_CHAN_INFO_RAW: | ||
248 | return max5821_get_value(indio_dev, val, chan->channel); | ||
249 | case IIO_CHAN_INFO_SCALE: | ||
250 | *val = data->vref_mv; | ||
251 | *val2 = 10; | ||
252 | return IIO_VAL_FRACTIONAL_LOG2; | ||
253 | default: | ||
254 | return -EINVAL; | ||
255 | } | ||
256 | } | ||
257 | |||
258 | static int max5821_write_raw(struct iio_dev *indio_dev, | ||
259 | struct iio_chan_spec const *chan, | ||
260 | int val, int val2, long mask) | ||
261 | { | ||
262 | if (val2 != 0) | ||
263 | return -EINVAL; | ||
264 | |||
265 | switch (mask) { | ||
266 | case IIO_CHAN_INFO_RAW: | ||
267 | return max5821_set_value(indio_dev, val, chan->channel); | ||
268 | default: | ||
269 | return -EINVAL; | ||
270 | } | ||
271 | } | ||
272 | |||
273 | #ifdef CONFIG_PM_SLEEP | ||
274 | static int max5821_suspend(struct device *dev) | ||
275 | { | ||
276 | u8 outbuf[2] = { MAX5821_EXTENDED_COMMAND_MODE, | ||
277 | MAX5821_EXTENDED_DAC_A | | ||
278 | MAX5821_EXTENDED_DAC_B | | ||
279 | MAX5821_EXTENDED_POWER_DOWN_MODE2 }; | ||
280 | |||
281 | return i2c_master_send(to_i2c_client(dev), outbuf, 2); | ||
282 | } | ||
283 | |||
284 | static int max5821_resume(struct device *dev) | ||
285 | { | ||
286 | u8 outbuf[2] = { MAX5821_EXTENDED_COMMAND_MODE, | ||
287 | MAX5821_EXTENDED_DAC_A | | ||
288 | MAX5821_EXTENDED_DAC_B | | ||
289 | MAX5821_EXTENDED_POWER_UP }; | ||
290 | |||
291 | return i2c_master_send(to_i2c_client(dev), outbuf, 2); | ||
292 | } | ||
293 | |||
294 | static SIMPLE_DEV_PM_OPS(max5821_pm_ops, max5821_suspend, max5821_resume); | ||
295 | #define MAX5821_PM_OPS (&max5821_pm_ops) | ||
296 | #else | ||
297 | #define MAX5821_PM_OPS NULL | ||
298 | #endif /* CONFIG_PM_SLEEP */ | ||
299 | |||
300 | static const struct iio_info max5821_info = { | ||
301 | .read_raw = max5821_read_raw, | ||
302 | .write_raw = max5821_write_raw, | ||
303 | .driver_module = THIS_MODULE, | ||
304 | }; | ||
305 | |||
306 | static int max5821_probe(struct i2c_client *client, | ||
307 | const struct i2c_device_id *id) | ||
308 | { | ||
309 | struct max5821_data *data; | ||
310 | struct iio_dev *indio_dev; | ||
311 | u32 tmp; | ||
312 | int ret; | ||
313 | |||
314 | indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); | ||
315 | if (!indio_dev) | ||
316 | return -ENOMEM; | ||
317 | data = iio_priv(indio_dev); | ||
318 | i2c_set_clientdata(client, indio_dev); | ||
319 | data->client = client; | ||
320 | mutex_init(&data->lock); | ||
321 | |||
322 | /* max5821 start in powerdown mode 100Kohm to ground */ | ||
323 | for (tmp = 0; tmp < MAX5821_MAX_DAC_CHANNELS; tmp++) { | ||
324 | data->powerdown[tmp] = true; | ||
325 | data->powerdown_mode[tmp] = MAX5821_100KOHM_TO_GND; | ||
326 | } | ||
327 | |||
328 | data->vref_reg = devm_regulator_get(&client->dev, "vref"); | ||
329 | if (IS_ERR(data->vref_reg)) { | ||
330 | ret = PTR_ERR(data->vref_reg); | ||
331 | dev_err(&client->dev, | ||
332 | "Failed to get vref regulator: %d\n", ret); | ||
333 | goto error_free_reg; | ||
334 | } | ||
335 | |||
336 | ret = regulator_enable(data->vref_reg); | ||
337 | if (ret) { | ||
338 | dev_err(&client->dev, | ||
339 | "Failed to enable vref regulator: %d\n", ret); | ||
340 | goto error_free_reg; | ||
341 | } | ||
342 | |||
343 | ret = regulator_get_voltage(data->vref_reg); | ||
344 | if (ret < 0) { | ||
345 | dev_err(&client->dev, | ||
346 | "Failed to get voltage on regulator: %d\n", ret); | ||
347 | goto error_disable_reg; | ||
348 | } | ||
349 | |||
350 | data->vref_mv = ret / 1000; | ||
351 | |||
352 | indio_dev->name = id->name; | ||
353 | indio_dev->dev.parent = &client->dev; | ||
354 | indio_dev->num_channels = ARRAY_SIZE(max5821_channels); | ||
355 | indio_dev->channels = max5821_channels; | ||
356 | indio_dev->modes = INDIO_DIRECT_MODE; | ||
357 | indio_dev->info = &max5821_info; | ||
358 | |||
359 | return iio_device_register(indio_dev); | ||
360 | |||
361 | error_disable_reg: | ||
362 | regulator_disable(data->vref_reg); | ||
363 | |||
364 | error_free_reg: | ||
365 | |||
366 | return ret; | ||
367 | } | ||
368 | |||
369 | static int max5821_remove(struct i2c_client *client) | ||
370 | { | ||
371 | struct iio_dev *indio_dev = i2c_get_clientdata(client); | ||
372 | struct max5821_data *data = iio_priv(indio_dev); | ||
373 | |||
374 | iio_device_unregister(indio_dev); | ||
375 | regulator_disable(data->vref_reg); | ||
376 | |||
377 | return 0; | ||
378 | } | ||
379 | |||
380 | static const struct i2c_device_id max5821_id[] = { | ||
381 | { "max5821", ID_MAX5821 }, | ||
382 | { } | ||
383 | }; | ||
384 | MODULE_DEVICE_TABLE(i2c, max5821_id); | ||
385 | |||
386 | static const struct of_device_id max5821_of_match[] = { | ||
387 | { .compatible = "maxim,max5821" }, | ||
388 | { } | ||
389 | }; | ||
390 | |||
391 | static struct i2c_driver max5821_driver = { | ||
392 | .driver = { | ||
393 | .name = "max5821", | ||
394 | .pm = MAX5821_PM_OPS, | ||
395 | .owner = THIS_MODULE, | ||
396 | }, | ||
397 | .probe = max5821_probe, | ||
398 | .remove = max5821_remove, | ||
399 | .id_table = max5821_id, | ||
400 | }; | ||
401 | module_i2c_driver(max5821_driver); | ||
402 | |||
403 | MODULE_AUTHOR("Philippe Reynes <tremyfr@yahoo.fr>"); | ||
404 | MODULE_DESCRIPTION("MAX5821 DAC"); | ||
405 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/iio/gyro/Kconfig b/drivers/iio/gyro/Kconfig index ac2d69e34c8c..b3d0e94f72eb 100644 --- a/drivers/iio/gyro/Kconfig +++ b/drivers/iio/gyro/Kconfig | |||
@@ -50,6 +50,17 @@ config ADXRS450 | |||
50 | This driver can also be built as a module. If so, the module | 50 | This driver can also be built as a module. If so, the module |
51 | will be called adxrs450. | 51 | will be called adxrs450. |
52 | 52 | ||
53 | config BMG160 | ||
54 | tristate "BOSCH BMG160 Gyro Sensor" | ||
55 | depends on I2C | ||
56 | select IIO_TRIGGERED_BUFFER if IIO_BUFFER | ||
57 | help | ||
58 | Say yes here to build support for Bosch BMG160 Tri-axis Gyro Sensor | ||
59 | driver. This driver also supports BMI055 gyroscope. | ||
60 | |||
61 | This driver can also be built as a module. If so, the module | ||
62 | will be called bmg160. | ||
63 | |||
53 | config HID_SENSOR_GYRO_3D | 64 | config HID_SENSOR_GYRO_3D |
54 | depends on HID_SENSOR_HUB | 65 | depends on HID_SENSOR_HUB |
55 | select IIO_BUFFER | 66 | select IIO_BUFFER |
diff --git a/drivers/iio/gyro/Makefile b/drivers/iio/gyro/Makefile index 2f2752a4ea83..36a38776f739 100644 --- a/drivers/iio/gyro/Makefile +++ b/drivers/iio/gyro/Makefile | |||
@@ -8,6 +8,7 @@ obj-$(CONFIG_ADIS16130) += adis16130.o | |||
8 | obj-$(CONFIG_ADIS16136) += adis16136.o | 8 | obj-$(CONFIG_ADIS16136) += adis16136.o |
9 | obj-$(CONFIG_ADIS16260) += adis16260.o | 9 | obj-$(CONFIG_ADIS16260) += adis16260.o |
10 | obj-$(CONFIG_ADXRS450) += adxrs450.o | 10 | obj-$(CONFIG_ADXRS450) += adxrs450.o |
11 | obj-$(CONFIG_BMG160) += bmg160.o | ||
11 | 12 | ||
12 | obj-$(CONFIG_HID_SENSOR_GYRO_3D) += hid-sensor-gyro-3d.o | 13 | obj-$(CONFIG_HID_SENSOR_GYRO_3D) += hid-sensor-gyro-3d.o |
13 | 14 | ||
diff --git a/drivers/iio/gyro/bmg160.c b/drivers/iio/gyro/bmg160.c new file mode 100644 index 000000000000..60451b328242 --- /dev/null +++ b/drivers/iio/gyro/bmg160.c | |||
@@ -0,0 +1,1273 @@ | |||
1 | /* | ||
2 | * BMG160 Gyro Sensor driver | ||
3 | * Copyright (c) 2014, Intel Corporation. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms and conditions of the GNU General Public License, | ||
7 | * version 2, as published by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
12 | * more details. | ||
13 | */ | ||
14 | |||
15 | #include <linux/module.h> | ||
16 | #include <linux/i2c.h> | ||
17 | #include <linux/interrupt.h> | ||
18 | #include <linux/delay.h> | ||
19 | #include <linux/slab.h> | ||
20 | #include <linux/acpi.h> | ||
21 | #include <linux/gpio/consumer.h> | ||
22 | #include <linux/pm.h> | ||
23 | #include <linux/pm_runtime.h> | ||
24 | #include <linux/iio/iio.h> | ||
25 | #include <linux/iio/sysfs.h> | ||
26 | #include <linux/iio/buffer.h> | ||
27 | #include <linux/iio/trigger.h> | ||
28 | #include <linux/iio/events.h> | ||
29 | #include <linux/iio/trigger_consumer.h> | ||
30 | #include <linux/iio/triggered_buffer.h> | ||
31 | |||
32 | #define BMG160_DRV_NAME "bmg160" | ||
33 | #define BMG160_IRQ_NAME "bmg160_event" | ||
34 | #define BMG160_GPIO_NAME "gpio_int" | ||
35 | |||
36 | #define BMG160_REG_CHIP_ID 0x00 | ||
37 | #define BMG160_CHIP_ID_VAL 0x0F | ||
38 | |||
39 | #define BMG160_REG_PMU_LPW 0x11 | ||
40 | #define BMG160_MODE_NORMAL 0x00 | ||
41 | #define BMG160_MODE_DEEP_SUSPEND 0x20 | ||
42 | #define BMG160_MODE_SUSPEND 0x80 | ||
43 | |||
44 | #define BMG160_REG_RANGE 0x0F | ||
45 | |||
46 | #define BMG160_RANGE_2000DPS 0 | ||
47 | #define BMG160_RANGE_1000DPS 1 | ||
48 | #define BMG160_RANGE_500DPS 2 | ||
49 | #define BMG160_RANGE_250DPS 3 | ||
50 | #define BMG160_RANGE_125DPS 4 | ||
51 | |||
52 | #define BMG160_REG_PMU_BW 0x10 | ||
53 | #define BMG160_NO_FILTER 0 | ||
54 | #define BMG160_DEF_BW 100 | ||
55 | |||
56 | #define BMG160_REG_INT_MAP_0 0x17 | ||
57 | #define BMG160_INT_MAP_0_BIT_ANY BIT(1) | ||
58 | |||
59 | #define BMG160_REG_INT_MAP_1 0x18 | ||
60 | #define BMG160_INT_MAP_1_BIT_NEW_DATA BIT(0) | ||
61 | |||
62 | #define BMG160_REG_INT_RST_LATCH 0x21 | ||
63 | #define BMG160_INT_MODE_LATCH_RESET 0x80 | ||
64 | #define BMG160_INT_MODE_LATCH_INT 0x0F | ||
65 | #define BMG160_INT_MODE_NON_LATCH_INT 0x00 | ||
66 | |||
67 | #define BMG160_REG_INT_EN_0 0x15 | ||
68 | #define BMG160_DATA_ENABLE_INT BIT(7) | ||
69 | |||
70 | #define BMG160_REG_INT_EN_1 0x16 | ||
71 | #define BMG160_INT1_BIT_OD BIT(1) | ||
72 | |||
73 | #define BMG160_REG_XOUT_L 0x02 | ||
74 | #define BMG160_AXIS_TO_REG(axis) (BMG160_REG_XOUT_L + (axis * 2)) | ||
75 | |||
76 | #define BMG160_REG_SLOPE_THRES 0x1B | ||
77 | #define BMG160_SLOPE_THRES_MASK 0x0F | ||
78 | |||
79 | #define BMG160_REG_MOTION_INTR 0x1C | ||
80 | #define BMG160_INT_MOTION_X BIT(0) | ||
81 | #define BMG160_INT_MOTION_Y BIT(1) | ||
82 | #define BMG160_INT_MOTION_Z BIT(2) | ||
83 | #define BMG160_ANY_DUR_MASK 0x30 | ||
84 | #define BMG160_ANY_DUR_SHIFT 4 | ||
85 | |||
86 | #define BMG160_REG_INT_STATUS_2 0x0B | ||
87 | #define BMG160_ANY_MOTION_MASK 0x07 | ||
88 | #define BMG160_ANY_MOTION_BIT_X BIT(0) | ||
89 | #define BMG160_ANY_MOTION_BIT_Y BIT(1) | ||
90 | #define BMG160_ANY_MOTION_BIT_Z BIT(2) | ||
91 | |||
92 | #define BMG160_REG_TEMP 0x08 | ||
93 | #define BMG160_TEMP_CENTER_VAL 23 | ||
94 | |||
95 | #define BMG160_MAX_STARTUP_TIME_MS 80 | ||
96 | |||
97 | #define BMG160_AUTO_SUSPEND_DELAY_MS 2000 | ||
98 | |||
99 | struct bmg160_data { | ||
100 | struct i2c_client *client; | ||
101 | struct iio_trigger *dready_trig; | ||
102 | struct iio_trigger *motion_trig; | ||
103 | struct mutex mutex; | ||
104 | s16 buffer[8]; | ||
105 | u8 bw_bits; | ||
106 | u32 dps_range; | ||
107 | int ev_enable_state; | ||
108 | int slope_thres; | ||
109 | bool dready_trigger_on; | ||
110 | bool motion_trigger_on; | ||
111 | int64_t timestamp; | ||
112 | }; | ||
113 | |||
114 | enum bmg160_axis { | ||
115 | AXIS_X, | ||
116 | AXIS_Y, | ||
117 | AXIS_Z, | ||
118 | }; | ||
119 | |||
120 | static const struct { | ||
121 | int val; | ||
122 | int bw_bits; | ||
123 | } bmg160_samp_freq_table[] = { {100, 0x07}, | ||
124 | {200, 0x06}, | ||
125 | {400, 0x03}, | ||
126 | {1000, 0x02}, | ||
127 | {2000, 0x01} }; | ||
128 | |||
129 | static const struct { | ||
130 | int scale; | ||
131 | int dps_range; | ||
132 | } bmg160_scale_table[] = { { 1065, BMG160_RANGE_2000DPS}, | ||
133 | { 532, BMG160_RANGE_1000DPS}, | ||
134 | { 266, BMG160_RANGE_500DPS}, | ||
135 | { 133, BMG160_RANGE_250DPS}, | ||
136 | { 66, BMG160_RANGE_125DPS} }; | ||
137 | |||
138 | static int bmg160_set_mode(struct bmg160_data *data, u8 mode) | ||
139 | { | ||
140 | int ret; | ||
141 | |||
142 | ret = i2c_smbus_write_byte_data(data->client, | ||
143 | BMG160_REG_PMU_LPW, mode); | ||
144 | if (ret < 0) { | ||
145 | dev_err(&data->client->dev, "Error writing reg_pmu_lpw\n"); | ||
146 | return ret; | ||
147 | } | ||
148 | |||
149 | return 0; | ||
150 | } | ||
151 | |||
152 | static int bmg160_convert_freq_to_bit(int val) | ||
153 | { | ||
154 | int i; | ||
155 | |||
156 | for (i = 0; i < ARRAY_SIZE(bmg160_samp_freq_table); ++i) { | ||
157 | if (bmg160_samp_freq_table[i].val == val) | ||
158 | return bmg160_samp_freq_table[i].bw_bits; | ||
159 | } | ||
160 | |||
161 | return -EINVAL; | ||
162 | } | ||
163 | |||
164 | static int bmg160_set_bw(struct bmg160_data *data, int val) | ||
165 | { | ||
166 | int ret; | ||
167 | int bw_bits; | ||
168 | |||
169 | bw_bits = bmg160_convert_freq_to_bit(val); | ||
170 | if (bw_bits < 0) | ||
171 | return bw_bits; | ||
172 | |||
173 | ret = i2c_smbus_write_byte_data(data->client, BMG160_REG_PMU_BW, | ||
174 | bw_bits); | ||
175 | if (ret < 0) { | ||
176 | dev_err(&data->client->dev, "Error writing reg_pmu_bw\n"); | ||
177 | return ret; | ||
178 | } | ||
179 | |||
180 | data->bw_bits = bw_bits; | ||
181 | |||
182 | return 0; | ||
183 | } | ||
184 | |||
185 | static int bmg160_chip_init(struct bmg160_data *data) | ||
186 | { | ||
187 | int ret; | ||
188 | |||
189 | ret = i2c_smbus_read_byte_data(data->client, BMG160_REG_CHIP_ID); | ||
190 | if (ret < 0) { | ||
191 | dev_err(&data->client->dev, "Error reading reg_chip_id\n"); | ||
192 | return ret; | ||
193 | } | ||
194 | |||
195 | dev_dbg(&data->client->dev, "Chip Id %x\n", ret); | ||
196 | if (ret != BMG160_CHIP_ID_VAL) { | ||
197 | dev_err(&data->client->dev, "invalid chip %x\n", ret); | ||
198 | return -ENODEV; | ||
199 | } | ||
200 | |||
201 | ret = bmg160_set_mode(data, BMG160_MODE_NORMAL); | ||
202 | if (ret < 0) | ||
203 | return ret; | ||
204 | |||
205 | /* Wait upto 500 ms to be ready after changing mode */ | ||
206 | usleep_range(500, 1000); | ||
207 | |||
208 | /* Set Bandwidth */ | ||
209 | ret = bmg160_set_bw(data, BMG160_DEF_BW); | ||
210 | if (ret < 0) | ||
211 | return ret; | ||
212 | |||
213 | /* Set Default Range */ | ||
214 | ret = i2c_smbus_write_byte_data(data->client, | ||
215 | BMG160_REG_RANGE, | ||
216 | BMG160_RANGE_500DPS); | ||
217 | if (ret < 0) { | ||
218 | dev_err(&data->client->dev, "Error writing reg_range\n"); | ||
219 | return ret; | ||
220 | } | ||
221 | data->dps_range = BMG160_RANGE_500DPS; | ||
222 | |||
223 | ret = i2c_smbus_read_byte_data(data->client, BMG160_REG_SLOPE_THRES); | ||
224 | if (ret < 0) { | ||
225 | dev_err(&data->client->dev, "Error reading reg_slope_thres\n"); | ||
226 | return ret; | ||
227 | } | ||
228 | data->slope_thres = ret; | ||
229 | |||
230 | /* Set default interrupt mode */ | ||
231 | ret = i2c_smbus_read_byte_data(data->client, BMG160_REG_INT_EN_1); | ||
232 | if (ret < 0) { | ||
233 | dev_err(&data->client->dev, "Error reading reg_int_en_1\n"); | ||
234 | return ret; | ||
235 | } | ||
236 | ret &= ~BMG160_INT1_BIT_OD; | ||
237 | ret = i2c_smbus_write_byte_data(data->client, | ||
238 | BMG160_REG_INT_EN_1, ret); | ||
239 | if (ret < 0) { | ||
240 | dev_err(&data->client->dev, "Error writing reg_int_en_1\n"); | ||
241 | return ret; | ||
242 | } | ||
243 | |||
244 | ret = i2c_smbus_write_byte_data(data->client, | ||
245 | BMG160_REG_INT_RST_LATCH, | ||
246 | BMG160_INT_MODE_LATCH_INT | | ||
247 | BMG160_INT_MODE_LATCH_RESET); | ||
248 | if (ret < 0) { | ||
249 | dev_err(&data->client->dev, | ||
250 | "Error writing reg_motion_intr\n"); | ||
251 | return ret; | ||
252 | } | ||
253 | |||
254 | return 0; | ||
255 | } | ||
256 | |||
257 | static int bmg160_set_power_state(struct bmg160_data *data, bool on) | ||
258 | { | ||
259 | #ifdef CONFIG_PM | ||
260 | int ret; | ||
261 | |||
262 | if (on) | ||
263 | ret = pm_runtime_get_sync(&data->client->dev); | ||
264 | else { | ||
265 | pm_runtime_mark_last_busy(&data->client->dev); | ||
266 | ret = pm_runtime_put_autosuspend(&data->client->dev); | ||
267 | } | ||
268 | |||
269 | if (ret < 0) { | ||
270 | dev_err(&data->client->dev, | ||
271 | "Failed: bmg160_set_power_state for %d\n", on); | ||
272 | if (on) | ||
273 | pm_runtime_put_noidle(&data->client->dev); | ||
274 | |||
275 | return ret; | ||
276 | } | ||
277 | #endif | ||
278 | |||
279 | return 0; | ||
280 | } | ||
281 | |||
282 | static int bmg160_setup_any_motion_interrupt(struct bmg160_data *data, | ||
283 | bool status) | ||
284 | { | ||
285 | int ret; | ||
286 | |||
287 | /* Enable/Disable INT_MAP0 mapping */ | ||
288 | ret = i2c_smbus_read_byte_data(data->client, BMG160_REG_INT_MAP_0); | ||
289 | if (ret < 0) { | ||
290 | dev_err(&data->client->dev, "Error reading reg_int_map0\n"); | ||
291 | return ret; | ||
292 | } | ||
293 | if (status) | ||
294 | ret |= BMG160_INT_MAP_0_BIT_ANY; | ||
295 | else | ||
296 | ret &= ~BMG160_INT_MAP_0_BIT_ANY; | ||
297 | |||
298 | ret = i2c_smbus_write_byte_data(data->client, | ||
299 | BMG160_REG_INT_MAP_0, | ||
300 | ret); | ||
301 | if (ret < 0) { | ||
302 | dev_err(&data->client->dev, "Error writing reg_int_map0\n"); | ||
303 | return ret; | ||
304 | } | ||
305 | |||
306 | /* Enable/Disable slope interrupts */ | ||
307 | if (status) { | ||
308 | /* Update slope thres */ | ||
309 | ret = i2c_smbus_write_byte_data(data->client, | ||
310 | BMG160_REG_SLOPE_THRES, | ||
311 | data->slope_thres); | ||
312 | if (ret < 0) { | ||
313 | dev_err(&data->client->dev, | ||
314 | "Error writing reg_slope_thres\n"); | ||
315 | return ret; | ||
316 | } | ||
317 | |||
318 | ret = i2c_smbus_write_byte_data(data->client, | ||
319 | BMG160_REG_MOTION_INTR, | ||
320 | BMG160_INT_MOTION_X | | ||
321 | BMG160_INT_MOTION_Y | | ||
322 | BMG160_INT_MOTION_Z); | ||
323 | if (ret < 0) { | ||
324 | dev_err(&data->client->dev, | ||
325 | "Error writing reg_motion_intr\n"); | ||
326 | return ret; | ||
327 | } | ||
328 | |||
329 | /* | ||
330 | * New data interrupt is always non-latched, | ||
331 | * which will have higher priority, so no need | ||
332 | * to set latched mode, we will be flooded anyway with INTR | ||
333 | */ | ||
334 | if (!data->dready_trigger_on) { | ||
335 | ret = i2c_smbus_write_byte_data(data->client, | ||
336 | BMG160_REG_INT_RST_LATCH, | ||
337 | BMG160_INT_MODE_LATCH_INT | | ||
338 | BMG160_INT_MODE_LATCH_RESET); | ||
339 | if (ret < 0) { | ||
340 | dev_err(&data->client->dev, | ||
341 | "Error writing reg_rst_latch\n"); | ||
342 | return ret; | ||
343 | } | ||
344 | } | ||
345 | |||
346 | ret = i2c_smbus_write_byte_data(data->client, | ||
347 | BMG160_REG_INT_EN_0, | ||
348 | BMG160_DATA_ENABLE_INT); | ||
349 | |||
350 | } else | ||
351 | ret = i2c_smbus_write_byte_data(data->client, | ||
352 | BMG160_REG_INT_EN_0, | ||
353 | 0); | ||
354 | |||
355 | if (ret < 0) { | ||
356 | dev_err(&data->client->dev, "Error writing reg_int_en0\n"); | ||
357 | return ret; | ||
358 | } | ||
359 | |||
360 | return 0; | ||
361 | } | ||
362 | |||
363 | static int bmg160_setup_new_data_interrupt(struct bmg160_data *data, | ||
364 | bool status) | ||
365 | { | ||
366 | int ret; | ||
367 | |||
368 | /* Enable/Disable INT_MAP1 mapping */ | ||
369 | ret = i2c_smbus_read_byte_data(data->client, BMG160_REG_INT_MAP_1); | ||
370 | if (ret < 0) { | ||
371 | dev_err(&data->client->dev, "Error reading reg_int_map1\n"); | ||
372 | return ret; | ||
373 | } | ||
374 | |||
375 | if (status) | ||
376 | ret |= BMG160_INT_MAP_1_BIT_NEW_DATA; | ||
377 | else | ||
378 | ret &= ~BMG160_INT_MAP_1_BIT_NEW_DATA; | ||
379 | |||
380 | ret = i2c_smbus_write_byte_data(data->client, | ||
381 | BMG160_REG_INT_MAP_1, | ||
382 | ret); | ||
383 | if (ret < 0) { | ||
384 | dev_err(&data->client->dev, "Error writing reg_int_map1\n"); | ||
385 | return ret; | ||
386 | } | ||
387 | |||
388 | if (status) { | ||
389 | ret = i2c_smbus_write_byte_data(data->client, | ||
390 | BMG160_REG_INT_RST_LATCH, | ||
391 | BMG160_INT_MODE_NON_LATCH_INT | | ||
392 | BMG160_INT_MODE_LATCH_RESET); | ||
393 | if (ret < 0) { | ||
394 | dev_err(&data->client->dev, | ||
395 | "Error writing reg_rst_latch\n"); | ||
396 | return ret; | ||
397 | } | ||
398 | |||
399 | ret = i2c_smbus_write_byte_data(data->client, | ||
400 | BMG160_REG_INT_EN_0, | ||
401 | BMG160_DATA_ENABLE_INT); | ||
402 | |||
403 | } else { | ||
404 | /* Restore interrupt mode */ | ||
405 | ret = i2c_smbus_write_byte_data(data->client, | ||
406 | BMG160_REG_INT_RST_LATCH, | ||
407 | BMG160_INT_MODE_LATCH_INT | | ||
408 | BMG160_INT_MODE_LATCH_RESET); | ||
409 | if (ret < 0) { | ||
410 | dev_err(&data->client->dev, | ||
411 | "Error writing reg_rst_latch\n"); | ||
412 | return ret; | ||
413 | } | ||
414 | |||
415 | ret = i2c_smbus_write_byte_data(data->client, | ||
416 | BMG160_REG_INT_EN_0, | ||
417 | 0); | ||
418 | } | ||
419 | |||
420 | if (ret < 0) { | ||
421 | dev_err(&data->client->dev, "Error writing reg_int_en0\n"); | ||
422 | return ret; | ||
423 | } | ||
424 | |||
425 | return 0; | ||
426 | } | ||
427 | |||
428 | static int bmg160_get_bw(struct bmg160_data *data, int *val) | ||
429 | { | ||
430 | int i; | ||
431 | |||
432 | for (i = 0; i < ARRAY_SIZE(bmg160_samp_freq_table); ++i) { | ||
433 | if (bmg160_samp_freq_table[i].bw_bits == data->bw_bits) { | ||
434 | *val = bmg160_samp_freq_table[i].val; | ||
435 | return IIO_VAL_INT; | ||
436 | } | ||
437 | } | ||
438 | |||
439 | return -EINVAL; | ||
440 | } | ||
441 | |||
442 | static int bmg160_set_scale(struct bmg160_data *data, int val) | ||
443 | { | ||
444 | int ret, i; | ||
445 | |||
446 | for (i = 0; i < ARRAY_SIZE(bmg160_scale_table); ++i) { | ||
447 | if (bmg160_scale_table[i].scale == val) { | ||
448 | ret = i2c_smbus_write_byte_data( | ||
449 | data->client, | ||
450 | BMG160_REG_RANGE, | ||
451 | bmg160_scale_table[i].dps_range); | ||
452 | if (ret < 0) { | ||
453 | dev_err(&data->client->dev, | ||
454 | "Error writing reg_range\n"); | ||
455 | return ret; | ||
456 | } | ||
457 | data->dps_range = bmg160_scale_table[i].dps_range; | ||
458 | return 0; | ||
459 | } | ||
460 | } | ||
461 | |||
462 | return -EINVAL; | ||
463 | } | ||
464 | |||
465 | static int bmg160_get_temp(struct bmg160_data *data, int *val) | ||
466 | { | ||
467 | int ret; | ||
468 | |||
469 | mutex_lock(&data->mutex); | ||
470 | ret = bmg160_set_power_state(data, true); | ||
471 | if (ret < 0) { | ||
472 | mutex_unlock(&data->mutex); | ||
473 | return ret; | ||
474 | } | ||
475 | |||
476 | ret = i2c_smbus_read_byte_data(data->client, BMG160_REG_TEMP); | ||
477 | if (ret < 0) { | ||
478 | dev_err(&data->client->dev, "Error reading reg_temp\n"); | ||
479 | bmg160_set_power_state(data, false); | ||
480 | mutex_unlock(&data->mutex); | ||
481 | return ret; | ||
482 | } | ||
483 | |||
484 | *val = sign_extend32(ret, 7); | ||
485 | ret = bmg160_set_power_state(data, false); | ||
486 | mutex_unlock(&data->mutex); | ||
487 | if (ret < 0) | ||
488 | return ret; | ||
489 | |||
490 | return IIO_VAL_INT; | ||
491 | } | ||
492 | |||
493 | static int bmg160_get_axis(struct bmg160_data *data, int axis, int *val) | ||
494 | { | ||
495 | int ret; | ||
496 | |||
497 | mutex_lock(&data->mutex); | ||
498 | ret = bmg160_set_power_state(data, true); | ||
499 | if (ret < 0) { | ||
500 | mutex_unlock(&data->mutex); | ||
501 | return ret; | ||
502 | } | ||
503 | |||
504 | ret = i2c_smbus_read_word_data(data->client, BMG160_AXIS_TO_REG(axis)); | ||
505 | if (ret < 0) { | ||
506 | dev_err(&data->client->dev, "Error reading axis %d\n", axis); | ||
507 | bmg160_set_power_state(data, false); | ||
508 | mutex_unlock(&data->mutex); | ||
509 | return ret; | ||
510 | } | ||
511 | |||
512 | *val = sign_extend32(ret, 15); | ||
513 | ret = bmg160_set_power_state(data, false); | ||
514 | mutex_unlock(&data->mutex); | ||
515 | if (ret < 0) | ||
516 | return ret; | ||
517 | |||
518 | return IIO_VAL_INT; | ||
519 | } | ||
520 | |||
521 | static int bmg160_read_raw(struct iio_dev *indio_dev, | ||
522 | struct iio_chan_spec const *chan, | ||
523 | int *val, int *val2, long mask) | ||
524 | { | ||
525 | struct bmg160_data *data = iio_priv(indio_dev); | ||
526 | int ret; | ||
527 | |||
528 | switch (mask) { | ||
529 | case IIO_CHAN_INFO_RAW: | ||
530 | switch (chan->type) { | ||
531 | case IIO_TEMP: | ||
532 | return bmg160_get_temp(data, val); | ||
533 | case IIO_ANGL_VEL: | ||
534 | if (iio_buffer_enabled(indio_dev)) | ||
535 | return -EBUSY; | ||
536 | else | ||
537 | return bmg160_get_axis(data, chan->scan_index, | ||
538 | val); | ||
539 | default: | ||
540 | return -EINVAL; | ||
541 | } | ||
542 | case IIO_CHAN_INFO_OFFSET: | ||
543 | if (chan->type == IIO_TEMP) { | ||
544 | *val = BMG160_TEMP_CENTER_VAL; | ||
545 | return IIO_VAL_INT; | ||
546 | } else | ||
547 | return -EINVAL; | ||
548 | case IIO_CHAN_INFO_SCALE: | ||
549 | *val = 0; | ||
550 | switch (chan->type) { | ||
551 | case IIO_TEMP: | ||
552 | *val2 = 500000; | ||
553 | return IIO_VAL_INT_PLUS_MICRO; | ||
554 | case IIO_ANGL_VEL: | ||
555 | { | ||
556 | int i; | ||
557 | |||
558 | for (i = 0; i < ARRAY_SIZE(bmg160_scale_table); ++i) { | ||
559 | if (bmg160_scale_table[i].dps_range == | ||
560 | data->dps_range) { | ||
561 | *val2 = bmg160_scale_table[i].scale; | ||
562 | return IIO_VAL_INT_PLUS_MICRO; | ||
563 | } | ||
564 | } | ||
565 | return -EINVAL; | ||
566 | } | ||
567 | default: | ||
568 | return -EINVAL; | ||
569 | } | ||
570 | case IIO_CHAN_INFO_SAMP_FREQ: | ||
571 | *val2 = 0; | ||
572 | mutex_lock(&data->mutex); | ||
573 | ret = bmg160_get_bw(data, val); | ||
574 | mutex_unlock(&data->mutex); | ||
575 | return ret; | ||
576 | default: | ||
577 | return -EINVAL; | ||
578 | } | ||
579 | } | ||
580 | |||
581 | static int bmg160_write_raw(struct iio_dev *indio_dev, | ||
582 | struct iio_chan_spec const *chan, | ||
583 | int val, int val2, long mask) | ||
584 | { | ||
585 | struct bmg160_data *data = iio_priv(indio_dev); | ||
586 | int ret; | ||
587 | |||
588 | switch (mask) { | ||
589 | case IIO_CHAN_INFO_SAMP_FREQ: | ||
590 | mutex_lock(&data->mutex); | ||
591 | /* | ||
592 | * Section 4.2 of spec | ||
593 | * In suspend mode, the only supported operations are reading | ||
594 | * registers as well as writing to the (0x14) softreset | ||
595 | * register. Since we will be in suspend mode by default, change | ||
596 | * mode to power on for other writes. | ||
597 | */ | ||
598 | ret = bmg160_set_power_state(data, true); | ||
599 | if (ret < 0) { | ||
600 | mutex_unlock(&data->mutex); | ||
601 | return ret; | ||
602 | } | ||
603 | ret = bmg160_set_bw(data, val); | ||
604 | if (ret < 0) { | ||
605 | bmg160_set_power_state(data, false); | ||
606 | mutex_unlock(&data->mutex); | ||
607 | return ret; | ||
608 | } | ||
609 | ret = bmg160_set_power_state(data, false); | ||
610 | mutex_unlock(&data->mutex); | ||
611 | return ret; | ||
612 | case IIO_CHAN_INFO_SCALE: | ||
613 | if (val) | ||
614 | return -EINVAL; | ||
615 | |||
616 | mutex_lock(&data->mutex); | ||
617 | /* Refer to comments above for the suspend mode ops */ | ||
618 | ret = bmg160_set_power_state(data, true); | ||
619 | if (ret < 0) { | ||
620 | mutex_unlock(&data->mutex); | ||
621 | return ret; | ||
622 | } | ||
623 | ret = bmg160_set_scale(data, val2); | ||
624 | if (ret < 0) { | ||
625 | bmg160_set_power_state(data, false); | ||
626 | mutex_unlock(&data->mutex); | ||
627 | return ret; | ||
628 | } | ||
629 | ret = bmg160_set_power_state(data, false); | ||
630 | mutex_unlock(&data->mutex); | ||
631 | return ret; | ||
632 | default: | ||
633 | return -EINVAL; | ||
634 | } | ||
635 | |||
636 | return -EINVAL; | ||
637 | } | ||
638 | |||
639 | static int bmg160_read_event(struct iio_dev *indio_dev, | ||
640 | const struct iio_chan_spec *chan, | ||
641 | enum iio_event_type type, | ||
642 | enum iio_event_direction dir, | ||
643 | enum iio_event_info info, | ||
644 | int *val, int *val2) | ||
645 | { | ||
646 | struct bmg160_data *data = iio_priv(indio_dev); | ||
647 | |||
648 | *val2 = 0; | ||
649 | switch (info) { | ||
650 | case IIO_EV_INFO_VALUE: | ||
651 | *val = data->slope_thres & BMG160_SLOPE_THRES_MASK; | ||
652 | break; | ||
653 | default: | ||
654 | return -EINVAL; | ||
655 | } | ||
656 | |||
657 | return IIO_VAL_INT; | ||
658 | } | ||
659 | |||
660 | static int bmg160_write_event(struct iio_dev *indio_dev, | ||
661 | const struct iio_chan_spec *chan, | ||
662 | enum iio_event_type type, | ||
663 | enum iio_event_direction dir, | ||
664 | enum iio_event_info info, | ||
665 | int val, int val2) | ||
666 | { | ||
667 | struct bmg160_data *data = iio_priv(indio_dev); | ||
668 | |||
669 | switch (info) { | ||
670 | case IIO_EV_INFO_VALUE: | ||
671 | if (data->ev_enable_state) | ||
672 | return -EBUSY; | ||
673 | data->slope_thres &= ~BMG160_SLOPE_THRES_MASK; | ||
674 | data->slope_thres |= (val & BMG160_SLOPE_THRES_MASK); | ||
675 | break; | ||
676 | default: | ||
677 | return -EINVAL; | ||
678 | } | ||
679 | |||
680 | return 0; | ||
681 | } | ||
682 | |||
683 | static int bmg160_read_event_config(struct iio_dev *indio_dev, | ||
684 | const struct iio_chan_spec *chan, | ||
685 | enum iio_event_type type, | ||
686 | enum iio_event_direction dir) | ||
687 | { | ||
688 | |||
689 | struct bmg160_data *data = iio_priv(indio_dev); | ||
690 | |||
691 | return data->ev_enable_state; | ||
692 | } | ||
693 | |||
694 | static int bmg160_write_event_config(struct iio_dev *indio_dev, | ||
695 | const struct iio_chan_spec *chan, | ||
696 | enum iio_event_type type, | ||
697 | enum iio_event_direction dir, | ||
698 | int state) | ||
699 | { | ||
700 | struct bmg160_data *data = iio_priv(indio_dev); | ||
701 | int ret; | ||
702 | |||
703 | if (state && data->ev_enable_state) | ||
704 | return 0; | ||
705 | |||
706 | mutex_lock(&data->mutex); | ||
707 | |||
708 | if (!state && data->motion_trigger_on) { | ||
709 | data->ev_enable_state = 0; | ||
710 | mutex_unlock(&data->mutex); | ||
711 | return 0; | ||
712 | } | ||
713 | /* | ||
714 | * We will expect the enable and disable to do operation in | ||
715 | * in reverse order. This will happen here anyway as our | ||
716 | * resume operation uses sync mode runtime pm calls, the | ||
717 | * suspend operation will be delayed by autosuspend delay | ||
718 | * So the disable operation will still happen in reverse of | ||
719 | * enable operation. When runtime pm is disabled the mode | ||
720 | * is always on so sequence doesn't matter | ||
721 | */ | ||
722 | ret = bmg160_set_power_state(data, state); | ||
723 | if (ret < 0) { | ||
724 | mutex_unlock(&data->mutex); | ||
725 | return ret; | ||
726 | } | ||
727 | |||
728 | ret = bmg160_setup_any_motion_interrupt(data, state); | ||
729 | if (ret < 0) { | ||
730 | bmg160_set_power_state(data, false); | ||
731 | mutex_unlock(&data->mutex); | ||
732 | return ret; | ||
733 | } | ||
734 | |||
735 | data->ev_enable_state = state; | ||
736 | mutex_unlock(&data->mutex); | ||
737 | |||
738 | return 0; | ||
739 | } | ||
740 | |||
741 | static int bmg160_validate_trigger(struct iio_dev *indio_dev, | ||
742 | struct iio_trigger *trig) | ||
743 | { | ||
744 | struct bmg160_data *data = iio_priv(indio_dev); | ||
745 | |||
746 | if (data->dready_trig != trig && data->motion_trig != trig) | ||
747 | return -EINVAL; | ||
748 | |||
749 | return 0; | ||
750 | } | ||
751 | |||
752 | static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("100 200 400 1000 2000"); | ||
753 | |||
754 | static IIO_CONST_ATTR(in_anglvel_scale_available, | ||
755 | "0.001065 0.000532 0.000266 0.000133 0.000066"); | ||
756 | |||
757 | static struct attribute *bmg160_attributes[] = { | ||
758 | &iio_const_attr_sampling_frequency_available.dev_attr.attr, | ||
759 | &iio_const_attr_in_anglvel_scale_available.dev_attr.attr, | ||
760 | NULL, | ||
761 | }; | ||
762 | |||
763 | static const struct attribute_group bmg160_attrs_group = { | ||
764 | .attrs = bmg160_attributes, | ||
765 | }; | ||
766 | |||
767 | static const struct iio_event_spec bmg160_event = { | ||
768 | .type = IIO_EV_TYPE_ROC, | ||
769 | .dir = IIO_EV_DIR_EITHER, | ||
770 | .mask_shared_by_type = BIT(IIO_EV_INFO_VALUE) | | ||
771 | BIT(IIO_EV_INFO_ENABLE) | ||
772 | }; | ||
773 | |||
774 | #define BMG160_CHANNEL(_axis) { \ | ||
775 | .type = IIO_ANGL_VEL, \ | ||
776 | .modified = 1, \ | ||
777 | .channel2 = IIO_MOD_##_axis, \ | ||
778 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ | ||
779 | .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ | ||
780 | BIT(IIO_CHAN_INFO_SAMP_FREQ), \ | ||
781 | .scan_index = AXIS_##_axis, \ | ||
782 | .scan_type = { \ | ||
783 | .sign = 's', \ | ||
784 | .realbits = 16, \ | ||
785 | .storagebits = 16, \ | ||
786 | }, \ | ||
787 | .event_spec = &bmg160_event, \ | ||
788 | .num_event_specs = 1 \ | ||
789 | } | ||
790 | |||
791 | static const struct iio_chan_spec bmg160_channels[] = { | ||
792 | { | ||
793 | .type = IIO_TEMP, | ||
794 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | | ||
795 | BIT(IIO_CHAN_INFO_SCALE) | | ||
796 | BIT(IIO_CHAN_INFO_OFFSET), | ||
797 | .scan_index = -1, | ||
798 | }, | ||
799 | BMG160_CHANNEL(X), | ||
800 | BMG160_CHANNEL(Y), | ||
801 | BMG160_CHANNEL(Z), | ||
802 | IIO_CHAN_SOFT_TIMESTAMP(3), | ||
803 | }; | ||
804 | |||
805 | static const struct iio_info bmg160_info = { | ||
806 | .attrs = &bmg160_attrs_group, | ||
807 | .read_raw = bmg160_read_raw, | ||
808 | .write_raw = bmg160_write_raw, | ||
809 | .read_event_value = bmg160_read_event, | ||
810 | .write_event_value = bmg160_write_event, | ||
811 | .write_event_config = bmg160_write_event_config, | ||
812 | .read_event_config = bmg160_read_event_config, | ||
813 | .validate_trigger = bmg160_validate_trigger, | ||
814 | .driver_module = THIS_MODULE, | ||
815 | }; | ||
816 | |||
817 | static irqreturn_t bmg160_trigger_handler(int irq, void *p) | ||
818 | { | ||
819 | struct iio_poll_func *pf = p; | ||
820 | struct iio_dev *indio_dev = pf->indio_dev; | ||
821 | struct bmg160_data *data = iio_priv(indio_dev); | ||
822 | int bit, ret, i = 0; | ||
823 | |||
824 | mutex_lock(&data->mutex); | ||
825 | for_each_set_bit(bit, indio_dev->buffer->scan_mask, | ||
826 | indio_dev->masklength) { | ||
827 | ret = i2c_smbus_read_word_data(data->client, | ||
828 | BMG160_AXIS_TO_REG(bit)); | ||
829 | if (ret < 0) { | ||
830 | mutex_unlock(&data->mutex); | ||
831 | goto err; | ||
832 | } | ||
833 | data->buffer[i++] = ret; | ||
834 | } | ||
835 | mutex_unlock(&data->mutex); | ||
836 | |||
837 | iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, | ||
838 | data->timestamp); | ||
839 | err: | ||
840 | iio_trigger_notify_done(indio_dev->trig); | ||
841 | |||
842 | return IRQ_HANDLED; | ||
843 | } | ||
844 | |||
845 | static int bmg160_trig_try_reen(struct iio_trigger *trig) | ||
846 | { | ||
847 | struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig); | ||
848 | struct bmg160_data *data = iio_priv(indio_dev); | ||
849 | int ret; | ||
850 | |||
851 | /* new data interrupts don't need ack */ | ||
852 | if (data->dready_trigger_on) | ||
853 | return 0; | ||
854 | |||
855 | /* Set latched mode interrupt and clear any latched interrupt */ | ||
856 | ret = i2c_smbus_write_byte_data(data->client, | ||
857 | BMG160_REG_INT_RST_LATCH, | ||
858 | BMG160_INT_MODE_LATCH_INT | | ||
859 | BMG160_INT_MODE_LATCH_RESET); | ||
860 | if (ret < 0) { | ||
861 | dev_err(&data->client->dev, "Error writing reg_rst_latch\n"); | ||
862 | return ret; | ||
863 | } | ||
864 | |||
865 | return 0; | ||
866 | } | ||
867 | |||
868 | static int bmg160_data_rdy_trigger_set_state(struct iio_trigger *trig, | ||
869 | bool state) | ||
870 | { | ||
871 | struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig); | ||
872 | struct bmg160_data *data = iio_priv(indio_dev); | ||
873 | int ret; | ||
874 | |||
875 | mutex_lock(&data->mutex); | ||
876 | |||
877 | if (!state && data->ev_enable_state && data->motion_trigger_on) { | ||
878 | data->motion_trigger_on = false; | ||
879 | mutex_unlock(&data->mutex); | ||
880 | return 0; | ||
881 | } | ||
882 | |||
883 | /* | ||
884 | * Refer to comment in bmg160_write_event_config for | ||
885 | * enable/disable operation order | ||
886 | */ | ||
887 | ret = bmg160_set_power_state(data, state); | ||
888 | if (ret < 0) { | ||
889 | mutex_unlock(&data->mutex); | ||
890 | return ret; | ||
891 | } | ||
892 | if (data->motion_trig == trig) | ||
893 | ret = bmg160_setup_any_motion_interrupt(data, state); | ||
894 | else | ||
895 | ret = bmg160_setup_new_data_interrupt(data, state); | ||
896 | if (ret < 0) { | ||
897 | bmg160_set_power_state(data, false); | ||
898 | mutex_unlock(&data->mutex); | ||
899 | return ret; | ||
900 | } | ||
901 | if (data->motion_trig == trig) | ||
902 | data->motion_trigger_on = state; | ||
903 | else | ||
904 | data->dready_trigger_on = state; | ||
905 | |||
906 | mutex_unlock(&data->mutex); | ||
907 | |||
908 | return 0; | ||
909 | } | ||
910 | |||
911 | static const struct iio_trigger_ops bmg160_trigger_ops = { | ||
912 | .set_trigger_state = bmg160_data_rdy_trigger_set_state, | ||
913 | .try_reenable = bmg160_trig_try_reen, | ||
914 | .owner = THIS_MODULE, | ||
915 | }; | ||
916 | |||
917 | static irqreturn_t bmg160_event_handler(int irq, void *private) | ||
918 | { | ||
919 | struct iio_dev *indio_dev = private; | ||
920 | struct bmg160_data *data = iio_priv(indio_dev); | ||
921 | int ret; | ||
922 | int dir; | ||
923 | |||
924 | ret = i2c_smbus_read_byte_data(data->client, BMG160_REG_INT_STATUS_2); | ||
925 | if (ret < 0) { | ||
926 | dev_err(&data->client->dev, "Error reading reg_int_status2\n"); | ||
927 | goto ack_intr_status; | ||
928 | } | ||
929 | |||
930 | if (ret & 0x08) | ||
931 | dir = IIO_EV_DIR_RISING; | ||
932 | else | ||
933 | dir = IIO_EV_DIR_FALLING; | ||
934 | |||
935 | if (ret & BMG160_ANY_MOTION_BIT_X) | ||
936 | iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ANGL_VEL, | ||
937 | 0, | ||
938 | IIO_MOD_X, | ||
939 | IIO_EV_TYPE_ROC, | ||
940 | dir), | ||
941 | data->timestamp); | ||
942 | if (ret & BMG160_ANY_MOTION_BIT_Y) | ||
943 | iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ANGL_VEL, | ||
944 | 0, | ||
945 | IIO_MOD_Y, | ||
946 | IIO_EV_TYPE_ROC, | ||
947 | dir), | ||
948 | data->timestamp); | ||
949 | if (ret & BMG160_ANY_MOTION_BIT_Z) | ||
950 | iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ANGL_VEL, | ||
951 | 0, | ||
952 | IIO_MOD_Z, | ||
953 | IIO_EV_TYPE_ROC, | ||
954 | dir), | ||
955 | data->timestamp); | ||
956 | |||
957 | ack_intr_status: | ||
958 | if (!data->dready_trigger_on) { | ||
959 | ret = i2c_smbus_write_byte_data(data->client, | ||
960 | BMG160_REG_INT_RST_LATCH, | ||
961 | BMG160_INT_MODE_LATCH_INT | | ||
962 | BMG160_INT_MODE_LATCH_RESET); | ||
963 | if (ret < 0) | ||
964 | dev_err(&data->client->dev, | ||
965 | "Error writing reg_rst_latch\n"); | ||
966 | } | ||
967 | |||
968 | return IRQ_HANDLED; | ||
969 | } | ||
970 | |||
971 | static irqreturn_t bmg160_data_rdy_trig_poll(int irq, void *private) | ||
972 | { | ||
973 | struct iio_dev *indio_dev = private; | ||
974 | struct bmg160_data *data = iio_priv(indio_dev); | ||
975 | |||
976 | data->timestamp = iio_get_time_ns(); | ||
977 | |||
978 | if (data->dready_trigger_on) | ||
979 | iio_trigger_poll(data->dready_trig); | ||
980 | else if (data->motion_trigger_on) | ||
981 | iio_trigger_poll(data->motion_trig); | ||
982 | |||
983 | if (data->ev_enable_state) | ||
984 | return IRQ_WAKE_THREAD; | ||
985 | else | ||
986 | return IRQ_HANDLED; | ||
987 | |||
988 | } | ||
989 | |||
990 | static int bmg160_gpio_probe(struct i2c_client *client, | ||
991 | struct bmg160_data *data) | ||
992 | |||
993 | { | ||
994 | struct device *dev; | ||
995 | struct gpio_desc *gpio; | ||
996 | int ret; | ||
997 | |||
998 | if (!client) | ||
999 | return -EINVAL; | ||
1000 | |||
1001 | dev = &client->dev; | ||
1002 | |||
1003 | /* data ready gpio interrupt pin */ | ||
1004 | gpio = devm_gpiod_get_index(dev, BMG160_GPIO_NAME, 0); | ||
1005 | if (IS_ERR(gpio)) { | ||
1006 | dev_err(dev, "acpi gpio get index failed\n"); | ||
1007 | return PTR_ERR(gpio); | ||
1008 | } | ||
1009 | |||
1010 | ret = gpiod_direction_input(gpio); | ||
1011 | if (ret) | ||
1012 | return ret; | ||
1013 | |||
1014 | ret = gpiod_to_irq(gpio); | ||
1015 | |||
1016 | dev_dbg(dev, "GPIO resource, no:%d irq:%d\n", desc_to_gpio(gpio), ret); | ||
1017 | |||
1018 | return ret; | ||
1019 | } | ||
1020 | |||
1021 | static const char *bmg160_match_acpi_device(struct device *dev) | ||
1022 | { | ||
1023 | const struct acpi_device_id *id; | ||
1024 | |||
1025 | id = acpi_match_device(dev->driver->acpi_match_table, dev); | ||
1026 | if (!id) | ||
1027 | return NULL; | ||
1028 | |||
1029 | return dev_name(dev); | ||
1030 | } | ||
1031 | |||
1032 | static int bmg160_probe(struct i2c_client *client, | ||
1033 | const struct i2c_device_id *id) | ||
1034 | { | ||
1035 | struct bmg160_data *data; | ||
1036 | struct iio_dev *indio_dev; | ||
1037 | int ret; | ||
1038 | const char *name = NULL; | ||
1039 | |||
1040 | indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); | ||
1041 | if (!indio_dev) | ||
1042 | return -ENOMEM; | ||
1043 | |||
1044 | data = iio_priv(indio_dev); | ||
1045 | i2c_set_clientdata(client, indio_dev); | ||
1046 | data->client = client; | ||
1047 | |||
1048 | ret = bmg160_chip_init(data); | ||
1049 | if (ret < 0) | ||
1050 | return ret; | ||
1051 | |||
1052 | mutex_init(&data->mutex); | ||
1053 | |||
1054 | if (id) | ||
1055 | name = id->name; | ||
1056 | |||
1057 | if (ACPI_HANDLE(&client->dev)) | ||
1058 | name = bmg160_match_acpi_device(&client->dev); | ||
1059 | |||
1060 | indio_dev->dev.parent = &client->dev; | ||
1061 | indio_dev->channels = bmg160_channels; | ||
1062 | indio_dev->num_channels = ARRAY_SIZE(bmg160_channels); | ||
1063 | indio_dev->name = name; | ||
1064 | indio_dev->modes = INDIO_DIRECT_MODE; | ||
1065 | indio_dev->info = &bmg160_info; | ||
1066 | |||
1067 | if (client->irq <= 0) | ||
1068 | client->irq = bmg160_gpio_probe(client, data); | ||
1069 | |||
1070 | if (client->irq > 0) { | ||
1071 | ret = devm_request_threaded_irq(&client->dev, | ||
1072 | client->irq, | ||
1073 | bmg160_data_rdy_trig_poll, | ||
1074 | bmg160_event_handler, | ||
1075 | IRQF_TRIGGER_RISING, | ||
1076 | BMG160_IRQ_NAME, | ||
1077 | indio_dev); | ||
1078 | if (ret) | ||
1079 | return ret; | ||
1080 | |||
1081 | data->dready_trig = devm_iio_trigger_alloc(&client->dev, | ||
1082 | "%s-dev%d", | ||
1083 | indio_dev->name, | ||
1084 | indio_dev->id); | ||
1085 | if (!data->dready_trig) | ||
1086 | return -ENOMEM; | ||
1087 | |||
1088 | data->motion_trig = devm_iio_trigger_alloc(&client->dev, | ||
1089 | "%s-any-motion-dev%d", | ||
1090 | indio_dev->name, | ||
1091 | indio_dev->id); | ||
1092 | if (!data->motion_trig) | ||
1093 | return -ENOMEM; | ||
1094 | |||
1095 | data->dready_trig->dev.parent = &client->dev; | ||
1096 | data->dready_trig->ops = &bmg160_trigger_ops; | ||
1097 | iio_trigger_set_drvdata(data->dready_trig, indio_dev); | ||
1098 | ret = iio_trigger_register(data->dready_trig); | ||
1099 | if (ret) | ||
1100 | return ret; | ||
1101 | |||
1102 | data->motion_trig->dev.parent = &client->dev; | ||
1103 | data->motion_trig->ops = &bmg160_trigger_ops; | ||
1104 | iio_trigger_set_drvdata(data->motion_trig, indio_dev); | ||
1105 | ret = iio_trigger_register(data->motion_trig); | ||
1106 | if (ret) { | ||
1107 | data->motion_trig = NULL; | ||
1108 | goto err_trigger_unregister; | ||
1109 | } | ||
1110 | |||
1111 | ret = iio_triggered_buffer_setup(indio_dev, | ||
1112 | NULL, | ||
1113 | bmg160_trigger_handler, | ||
1114 | NULL); | ||
1115 | if (ret < 0) { | ||
1116 | dev_err(&client->dev, | ||
1117 | "iio triggered buffer setup failed\n"); | ||
1118 | goto err_trigger_unregister; | ||
1119 | } | ||
1120 | } | ||
1121 | |||
1122 | ret = iio_device_register(indio_dev); | ||
1123 | if (ret < 0) { | ||
1124 | dev_err(&client->dev, "unable to register iio device\n"); | ||
1125 | goto err_buffer_cleanup; | ||
1126 | } | ||
1127 | |||
1128 | ret = pm_runtime_set_active(&client->dev); | ||
1129 | if (ret) | ||
1130 | goto err_iio_unregister; | ||
1131 | |||
1132 | pm_runtime_enable(&client->dev); | ||
1133 | pm_runtime_set_autosuspend_delay(&client->dev, | ||
1134 | BMG160_AUTO_SUSPEND_DELAY_MS); | ||
1135 | pm_runtime_use_autosuspend(&client->dev); | ||
1136 | |||
1137 | return 0; | ||
1138 | |||
1139 | err_iio_unregister: | ||
1140 | iio_device_unregister(indio_dev); | ||
1141 | err_buffer_cleanup: | ||
1142 | if (data->dready_trig) | ||
1143 | iio_triggered_buffer_cleanup(indio_dev); | ||
1144 | err_trigger_unregister: | ||
1145 | if (data->dready_trig) | ||
1146 | iio_trigger_unregister(data->dready_trig); | ||
1147 | if (data->motion_trig) | ||
1148 | iio_trigger_unregister(data->motion_trig); | ||
1149 | |||
1150 | return ret; | ||
1151 | } | ||
1152 | |||
1153 | static int bmg160_remove(struct i2c_client *client) | ||
1154 | { | ||
1155 | struct iio_dev *indio_dev = i2c_get_clientdata(client); | ||
1156 | struct bmg160_data *data = iio_priv(indio_dev); | ||
1157 | |||
1158 | pm_runtime_disable(&client->dev); | ||
1159 | pm_runtime_set_suspended(&client->dev); | ||
1160 | pm_runtime_put_noidle(&client->dev); | ||
1161 | |||
1162 | iio_device_unregister(indio_dev); | ||
1163 | |||
1164 | if (data->dready_trig) { | ||
1165 | iio_triggered_buffer_cleanup(indio_dev); | ||
1166 | iio_trigger_unregister(data->dready_trig); | ||
1167 | iio_trigger_unregister(data->motion_trig); | ||
1168 | } | ||
1169 | |||
1170 | mutex_lock(&data->mutex); | ||
1171 | bmg160_set_mode(data, BMG160_MODE_DEEP_SUSPEND); | ||
1172 | mutex_unlock(&data->mutex); | ||
1173 | |||
1174 | return 0; | ||
1175 | } | ||
1176 | |||
1177 | #ifdef CONFIG_PM_SLEEP | ||
1178 | static int bmg160_suspend(struct device *dev) | ||
1179 | { | ||
1180 | struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); | ||
1181 | struct bmg160_data *data = iio_priv(indio_dev); | ||
1182 | |||
1183 | mutex_lock(&data->mutex); | ||
1184 | bmg160_set_mode(data, BMG160_MODE_SUSPEND); | ||
1185 | mutex_unlock(&data->mutex); | ||
1186 | |||
1187 | return 0; | ||
1188 | } | ||
1189 | |||
1190 | static int bmg160_resume(struct device *dev) | ||
1191 | { | ||
1192 | struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); | ||
1193 | struct bmg160_data *data = iio_priv(indio_dev); | ||
1194 | |||
1195 | mutex_lock(&data->mutex); | ||
1196 | if (data->dready_trigger_on || data->motion_trigger_on || | ||
1197 | data->ev_enable_state) | ||
1198 | bmg160_set_mode(data, BMG160_MODE_NORMAL); | ||
1199 | mutex_unlock(&data->mutex); | ||
1200 | |||
1201 | return 0; | ||
1202 | } | ||
1203 | #endif | ||
1204 | |||
1205 | #ifdef CONFIG_PM | ||
1206 | static int bmg160_runtime_suspend(struct device *dev) | ||
1207 | { | ||
1208 | struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); | ||
1209 | struct bmg160_data *data = iio_priv(indio_dev); | ||
1210 | int ret; | ||
1211 | |||
1212 | ret = bmg160_set_mode(data, BMG160_MODE_SUSPEND); | ||
1213 | if (ret < 0) { | ||
1214 | dev_err(&data->client->dev, "set mode failed\n"); | ||
1215 | return -EAGAIN; | ||
1216 | } | ||
1217 | |||
1218 | return 0; | ||
1219 | } | ||
1220 | |||
1221 | static int bmg160_runtime_resume(struct device *dev) | ||
1222 | { | ||
1223 | struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); | ||
1224 | struct bmg160_data *data = iio_priv(indio_dev); | ||
1225 | int ret; | ||
1226 | |||
1227 | ret = bmg160_set_mode(data, BMG160_MODE_NORMAL); | ||
1228 | if (ret < 0) | ||
1229 | return ret; | ||
1230 | |||
1231 | msleep_interruptible(BMG160_MAX_STARTUP_TIME_MS); | ||
1232 | |||
1233 | return 0; | ||
1234 | } | ||
1235 | #endif | ||
1236 | |||
1237 | static const struct dev_pm_ops bmg160_pm_ops = { | ||
1238 | SET_SYSTEM_SLEEP_PM_OPS(bmg160_suspend, bmg160_resume) | ||
1239 | SET_RUNTIME_PM_OPS(bmg160_runtime_suspend, | ||
1240 | bmg160_runtime_resume, NULL) | ||
1241 | }; | ||
1242 | |||
1243 | static const struct acpi_device_id bmg160_acpi_match[] = { | ||
1244 | {"BMG0160", 0}, | ||
1245 | {"BMI055B", 0}, | ||
1246 | {}, | ||
1247 | }; | ||
1248 | |||
1249 | MODULE_DEVICE_TABLE(acpi, bmg160_acpi_match); | ||
1250 | |||
1251 | static const struct i2c_device_id bmg160_id[] = { | ||
1252 | {"bmg160", 0}, | ||
1253 | {"bmi055_gyro", 0}, | ||
1254 | {} | ||
1255 | }; | ||
1256 | |||
1257 | MODULE_DEVICE_TABLE(i2c, bmg160_id); | ||
1258 | |||
1259 | static struct i2c_driver bmg160_driver = { | ||
1260 | .driver = { | ||
1261 | .name = BMG160_DRV_NAME, | ||
1262 | .acpi_match_table = ACPI_PTR(bmg160_acpi_match), | ||
1263 | .pm = &bmg160_pm_ops, | ||
1264 | }, | ||
1265 | .probe = bmg160_probe, | ||
1266 | .remove = bmg160_remove, | ||
1267 | .id_table = bmg160_id, | ||
1268 | }; | ||
1269 | module_i2c_driver(bmg160_driver); | ||
1270 | |||
1271 | MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>"); | ||
1272 | MODULE_LICENSE("GPL v2"); | ||
1273 | MODULE_DESCRIPTION("BMG160 Gyro driver"); | ||
diff --git a/drivers/iio/gyro/hid-sensor-gyro-3d.c b/drivers/iio/gyro/hid-sensor-gyro-3d.c index fa034a3dad78..a3ea1e8785d7 100644 --- a/drivers/iio/gyro/hid-sensor-gyro-3d.c +++ b/drivers/iio/gyro/hid-sensor-gyro-3d.c | |||
@@ -416,7 +416,6 @@ static struct platform_driver hid_gyro_3d_platform_driver = { | |||
416 | .id_table = hid_gyro_3d_ids, | 416 | .id_table = hid_gyro_3d_ids, |
417 | .driver = { | 417 | .driver = { |
418 | .name = KBUILD_MODNAME, | 418 | .name = KBUILD_MODNAME, |
419 | .owner = THIS_MODULE, | ||
420 | }, | 419 | }, |
421 | .probe = hid_gyro_3d_probe, | 420 | .probe = hid_gyro_3d_probe, |
422 | .remove = hid_gyro_3d_remove, | 421 | .remove = hid_gyro_3d_remove, |
diff --git a/drivers/iio/gyro/st_gyro.h b/drivers/iio/gyro/st_gyro.h index c197360c450b..5353d6328c54 100644 --- a/drivers/iio/gyro/st_gyro.h +++ b/drivers/iio/gyro/st_gyro.h | |||
@@ -30,8 +30,7 @@ static const struct st_sensors_platform_data gyro_pdata = { | |||
30 | .drdy_int_pin = 2, | 30 | .drdy_int_pin = 2, |
31 | }; | 31 | }; |
32 | 32 | ||
33 | int st_gyro_common_probe(struct iio_dev *indio_dev, | 33 | int st_gyro_common_probe(struct iio_dev *indio_dev); |
34 | struct st_sensors_platform_data *pdata); | ||
35 | void st_gyro_common_remove(struct iio_dev *indio_dev); | 34 | void st_gyro_common_remove(struct iio_dev *indio_dev); |
36 | 35 | ||
37 | #ifdef CONFIG_IIO_BUFFER | 36 | #ifdef CONFIG_IIO_BUFFER |
diff --git a/drivers/iio/gyro/st_gyro_core.c b/drivers/iio/gyro/st_gyro_core.c index f156fc6c5c6c..f07a2336f7dc 100644 --- a/drivers/iio/gyro/st_gyro_core.c +++ b/drivers/iio/gyro/st_gyro_core.c | |||
@@ -103,7 +103,7 @@ static const struct iio_chan_spec st_gyro_16bit_channels[] = { | |||
103 | IIO_CHAN_SOFT_TIMESTAMP(3) | 103 | IIO_CHAN_SOFT_TIMESTAMP(3) |
104 | }; | 104 | }; |
105 | 105 | ||
106 | static const struct st_sensors st_gyro_sensors[] = { | 106 | static const struct st_sensor_settings st_gyro_sensors_settings[] = { |
107 | { | 107 | { |
108 | .wai = ST_GYRO_1_WAI_EXP, | 108 | .wai = ST_GYRO_1_WAI_EXP, |
109 | .sensors_supported = { | 109 | .sensors_supported = { |
@@ -309,8 +309,7 @@ static const struct iio_trigger_ops st_gyro_trigger_ops = { | |||
309 | #define ST_GYRO_TRIGGER_OPS NULL | 309 | #define ST_GYRO_TRIGGER_OPS NULL |
310 | #endif | 310 | #endif |
311 | 311 | ||
312 | int st_gyro_common_probe(struct iio_dev *indio_dev, | 312 | int st_gyro_common_probe(struct iio_dev *indio_dev) |
313 | struct st_sensors_platform_data *pdata) | ||
314 | { | 313 | { |
315 | struct st_sensor_data *gdata = iio_priv(indio_dev); | 314 | struct st_sensor_data *gdata = iio_priv(indio_dev); |
316 | int irq = gdata->get_irq_data_ready(indio_dev); | 315 | int irq = gdata->get_irq_data_ready(indio_dev); |
@@ -322,20 +321,22 @@ int st_gyro_common_probe(struct iio_dev *indio_dev, | |||
322 | st_sensors_power_enable(indio_dev); | 321 | st_sensors_power_enable(indio_dev); |
323 | 322 | ||
324 | err = st_sensors_check_device_support(indio_dev, | 323 | err = st_sensors_check_device_support(indio_dev, |
325 | ARRAY_SIZE(st_gyro_sensors), st_gyro_sensors); | 324 | ARRAY_SIZE(st_gyro_sensors_settings), |
325 | st_gyro_sensors_settings); | ||
326 | if (err < 0) | 326 | if (err < 0) |
327 | return err; | 327 | return err; |
328 | 328 | ||
329 | gdata->num_data_channels = ST_GYRO_NUMBER_DATA_CHANNELS; | 329 | gdata->num_data_channels = ST_GYRO_NUMBER_DATA_CHANNELS; |
330 | gdata->multiread_bit = gdata->sensor->multi_read_bit; | 330 | gdata->multiread_bit = gdata->sensor_settings->multi_read_bit; |
331 | indio_dev->channels = gdata->sensor->ch; | 331 | indio_dev->channels = gdata->sensor_settings->ch; |
332 | indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS; | 332 | indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS; |
333 | 333 | ||
334 | gdata->current_fullscale = (struct st_sensor_fullscale_avl *) | 334 | gdata->current_fullscale = (struct st_sensor_fullscale_avl *) |
335 | &gdata->sensor->fs.fs_avl[0]; | 335 | &gdata->sensor_settings->fs.fs_avl[0]; |
336 | gdata->odr = gdata->sensor->odr.odr_avl[0].hz; | 336 | gdata->odr = gdata->sensor_settings->odr.odr_avl[0].hz; |
337 | 337 | ||
338 | err = st_sensors_init_sensor(indio_dev, pdata); | 338 | err = st_sensors_init_sensor(indio_dev, |
339 | (struct st_sensors_platform_data *)&gyro_pdata); | ||
339 | if (err < 0) | 340 | if (err < 0) |
340 | return err; | 341 | return err; |
341 | 342 | ||
diff --git a/drivers/iio/gyro/st_gyro_i2c.c b/drivers/iio/gyro/st_gyro_i2c.c index 8fa0ad2ef4ef..64480b16c689 100644 --- a/drivers/iio/gyro/st_gyro_i2c.c +++ b/drivers/iio/gyro/st_gyro_i2c.c | |||
@@ -67,13 +67,11 @@ static int st_gyro_i2c_probe(struct i2c_client *client, | |||
67 | return -ENOMEM; | 67 | return -ENOMEM; |
68 | 68 | ||
69 | gdata = iio_priv(indio_dev); | 69 | gdata = iio_priv(indio_dev); |
70 | gdata->dev = &client->dev; | ||
71 | st_sensors_of_i2c_probe(client, st_gyro_of_match); | 70 | st_sensors_of_i2c_probe(client, st_gyro_of_match); |
72 | 71 | ||
73 | st_sensors_i2c_configure(indio_dev, client, gdata); | 72 | st_sensors_i2c_configure(indio_dev, client, gdata); |
74 | 73 | ||
75 | err = st_gyro_common_probe(indio_dev, | 74 | err = st_gyro_common_probe(indio_dev); |
76 | (struct st_sensors_platform_data *)&gyro_pdata); | ||
77 | if (err < 0) | 75 | if (err < 0) |
78 | return err; | 76 | return err; |
79 | 77 | ||
diff --git a/drivers/iio/gyro/st_gyro_spi.c b/drivers/iio/gyro/st_gyro_spi.c index b4ad3be26687..e59bead6bc3c 100644 --- a/drivers/iio/gyro/st_gyro_spi.c +++ b/drivers/iio/gyro/st_gyro_spi.c | |||
@@ -29,12 +29,10 @@ static int st_gyro_spi_probe(struct spi_device *spi) | |||
29 | return -ENOMEM; | 29 | return -ENOMEM; |
30 | 30 | ||
31 | gdata = iio_priv(indio_dev); | 31 | gdata = iio_priv(indio_dev); |
32 | gdata->dev = &spi->dev; | ||
33 | 32 | ||
34 | st_sensors_spi_configure(indio_dev, spi, gdata); | 33 | st_sensors_spi_configure(indio_dev, spi, gdata); |
35 | 34 | ||
36 | err = st_gyro_common_probe(indio_dev, | 35 | err = st_gyro_common_probe(indio_dev); |
37 | (struct st_sensors_platform_data *)&gyro_pdata); | ||
38 | if (err < 0) | 36 | if (err < 0) |
39 | return err; | 37 | return err; |
40 | 38 | ||
diff --git a/drivers/iio/humidity/Kconfig b/drivers/iio/humidity/Kconfig index e116bd8dd0e4..4813b793b9f7 100644 --- a/drivers/iio/humidity/Kconfig +++ b/drivers/iio/humidity/Kconfig | |||
@@ -22,4 +22,14 @@ config SI7005 | |||
22 | To compile this driver as a module, choose M here: the module | 22 | To compile this driver as a module, choose M here: the module |
23 | will be called si7005. | 23 | will be called si7005. |
24 | 24 | ||
25 | config SI7020 | ||
26 | tristate "Si7013/20/21 Relative Humidity and Temperature Sensors" | ||
27 | depends on I2C | ||
28 | help | ||
29 | Say yes here to build support for the Silicon Labs Si7013/20/21 | ||
30 | Relative Humidity and Temperature Sensors. | ||
31 | |||
32 | To compile this driver as a module, choose M here: the module | ||
33 | will be called si7020. | ||
34 | |||
25 | endmenu | 35 | endmenu |
diff --git a/drivers/iio/humidity/Makefile b/drivers/iio/humidity/Makefile index e3f3d942e646..86e2d26e9f4d 100644 --- a/drivers/iio/humidity/Makefile +++ b/drivers/iio/humidity/Makefile | |||
@@ -4,3 +4,4 @@ | |||
4 | 4 | ||
5 | obj-$(CONFIG_DHT11) += dht11.o | 5 | obj-$(CONFIG_DHT11) += dht11.o |
6 | obj-$(CONFIG_SI7005) += si7005.o | 6 | obj-$(CONFIG_SI7005) += si7005.o |
7 | obj-$(CONFIG_SI7020) += si7020.o | ||
diff --git a/drivers/iio/humidity/dht11.c b/drivers/iio/humidity/dht11.c index d8771f546bf2..623c145d8a97 100644 --- a/drivers/iio/humidity/dht11.c +++ b/drivers/iio/humidity/dht11.c | |||
@@ -281,7 +281,6 @@ static int dht11_probe(struct platform_device *pdev) | |||
281 | static struct platform_driver dht11_driver = { | 281 | static struct platform_driver dht11_driver = { |
282 | .driver = { | 282 | .driver = { |
283 | .name = DRIVER_NAME, | 283 | .name = DRIVER_NAME, |
284 | .owner = THIS_MODULE, | ||
285 | .of_match_table = dht11_dt_ids, | 284 | .of_match_table = dht11_dt_ids, |
286 | }, | 285 | }, |
287 | .probe = dht11_probe, | 286 | .probe = dht11_probe, |
diff --git a/drivers/iio/humidity/si7020.c b/drivers/iio/humidity/si7020.c new file mode 100644 index 000000000000..b54164677b89 --- /dev/null +++ b/drivers/iio/humidity/si7020.c | |||
@@ -0,0 +1,161 @@ | |||
1 | /* | ||
2 | * si7020.c - Silicon Labs Si7013/20/21 Relative Humidity and Temp Sensors | ||
3 | * Copyright (c) 2013,2014 Uplogix, Inc. | ||
4 | * David Barksdale <dbarksdale@uplogix.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms and conditions of the GNU General Public License, | ||
8 | * version 2, as published by the Free Software Foundation. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | */ | ||
15 | |||
16 | /* | ||
17 | * The Silicon Labs Si7013/20/21 Relative Humidity and Temperature Sensors | ||
18 | * are i2c devices which have an identical programming interface for | ||
19 | * measuring relative humidity and temperature. The Si7013 has an additional | ||
20 | * temperature input which this driver does not support. | ||
21 | * | ||
22 | * Data Sheets: | ||
23 | * Si7013: http://www.silabs.com/Support%20Documents/TechnicalDocs/Si7013.pdf | ||
24 | * Si7020: http://www.silabs.com/Support%20Documents/TechnicalDocs/Si7020.pdf | ||
25 | * Si7021: http://www.silabs.com/Support%20Documents/TechnicalDocs/Si7021.pdf | ||
26 | */ | ||
27 | |||
28 | #include <linux/delay.h> | ||
29 | #include <linux/i2c.h> | ||
30 | #include <linux/module.h> | ||
31 | #include <linux/slab.h> | ||
32 | #include <linux/sysfs.h> | ||
33 | |||
34 | #include <linux/iio/iio.h> | ||
35 | #include <linux/iio/sysfs.h> | ||
36 | |||
37 | /* Measure Relative Humidity, Hold Master Mode */ | ||
38 | #define SI7020CMD_RH_HOLD 0xE5 | ||
39 | /* Measure Temperature, Hold Master Mode */ | ||
40 | #define SI7020CMD_TEMP_HOLD 0xE3 | ||
41 | /* Software Reset */ | ||
42 | #define SI7020CMD_RESET 0xFE | ||
43 | |||
44 | static int si7020_read_raw(struct iio_dev *indio_dev, | ||
45 | struct iio_chan_spec const *chan, int *val, | ||
46 | int *val2, long mask) | ||
47 | { | ||
48 | struct i2c_client *client = iio_priv(indio_dev); | ||
49 | int ret; | ||
50 | |||
51 | switch (mask) { | ||
52 | case IIO_CHAN_INFO_RAW: | ||
53 | ret = i2c_smbus_read_word_data(client, | ||
54 | chan->type == IIO_TEMP ? | ||
55 | SI7020CMD_TEMP_HOLD : | ||
56 | SI7020CMD_RH_HOLD); | ||
57 | if (ret < 0) | ||
58 | return ret; | ||
59 | *val = ret >> 2; | ||
60 | if (chan->type == IIO_HUMIDITYRELATIVE) | ||
61 | *val &= GENMASK(11, 0); | ||
62 | return IIO_VAL_INT; | ||
63 | case IIO_CHAN_INFO_SCALE: | ||
64 | if (chan->type == IIO_TEMP) | ||
65 | *val = 175720; /* = 175.72 * 1000 */ | ||
66 | else | ||
67 | *val = 125 * 1000; | ||
68 | *val2 = 65536 >> 2; | ||
69 | return IIO_VAL_FRACTIONAL; | ||
70 | case IIO_CHAN_INFO_OFFSET: | ||
71 | /* | ||
72 | * Since iio_convert_raw_to_processed_unlocked assumes offset | ||
73 | * is an integer we have to round these values and lose | ||
74 | * accuracy. | ||
75 | * Relative humidity will be 0.0032959% too high and | ||
76 | * temperature will be 0.00277344 degrees too high. | ||
77 | * This is no big deal because it's within the accuracy of the | ||
78 | * sensor. | ||
79 | */ | ||
80 | if (chan->type == IIO_TEMP) | ||
81 | *val = -4368; /* = -46.85 * (65536 >> 2) / 175.72 */ | ||
82 | else | ||
83 | *val = -786; /* = -6 * (65536 >> 2) / 125 */ | ||
84 | return IIO_VAL_INT; | ||
85 | default: | ||
86 | break; | ||
87 | } | ||
88 | |||
89 | return -EINVAL; | ||
90 | } | ||
91 | |||
92 | static const struct iio_chan_spec si7020_channels[] = { | ||
93 | { | ||
94 | .type = IIO_HUMIDITYRELATIVE, | ||
95 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | | ||
96 | BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_OFFSET), | ||
97 | }, | ||
98 | { | ||
99 | .type = IIO_TEMP, | ||
100 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | | ||
101 | BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_OFFSET), | ||
102 | } | ||
103 | }; | ||
104 | |||
105 | static const struct iio_info si7020_info = { | ||
106 | .read_raw = si7020_read_raw, | ||
107 | .driver_module = THIS_MODULE, | ||
108 | }; | ||
109 | |||
110 | static int si7020_probe(struct i2c_client *client, | ||
111 | const struct i2c_device_id *id) | ||
112 | { | ||
113 | struct iio_dev *indio_dev; | ||
114 | struct i2c_client **data; | ||
115 | int ret; | ||
116 | |||
117 | if (!i2c_check_functionality(client->adapter, | ||
118 | I2C_FUNC_SMBUS_WRITE_BYTE | | ||
119 | I2C_FUNC_SMBUS_READ_WORD_DATA)) | ||
120 | return -ENODEV; | ||
121 | |||
122 | /* Reset device, loads default settings. */ | ||
123 | ret = i2c_smbus_write_byte(client, SI7020CMD_RESET); | ||
124 | if (ret < 0) | ||
125 | return ret; | ||
126 | /* Wait the maximum power-up time after software reset. */ | ||
127 | msleep(15); | ||
128 | |||
129 | indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*client)); | ||
130 | if (!indio_dev) | ||
131 | return -ENOMEM; | ||
132 | |||
133 | data = iio_priv(indio_dev); | ||
134 | *data = client; | ||
135 | |||
136 | indio_dev->dev.parent = &client->dev; | ||
137 | indio_dev->name = dev_name(&client->dev); | ||
138 | indio_dev->modes = INDIO_DIRECT_MODE; | ||
139 | indio_dev->info = &si7020_info; | ||
140 | indio_dev->channels = si7020_channels; | ||
141 | indio_dev->num_channels = ARRAY_SIZE(si7020_channels); | ||
142 | |||
143 | return devm_iio_device_register(&client->dev, indio_dev); | ||
144 | } | ||
145 | |||
146 | static const struct i2c_device_id si7020_id[] = { | ||
147 | { "si7020", 0 }, | ||
148 | { } | ||
149 | }; | ||
150 | MODULE_DEVICE_TABLE(i2c, si7020_id); | ||
151 | |||
152 | static struct i2c_driver si7020_driver = { | ||
153 | .driver.name = "si7020", | ||
154 | .probe = si7020_probe, | ||
155 | .id_table = si7020_id, | ||
156 | }; | ||
157 | |||
158 | module_i2c_driver(si7020_driver); | ||
159 | MODULE_DESCRIPTION("Silicon Labs Si7013/20/21 Relative Humidity and Temperature Sensors"); | ||
160 | MODULE_AUTHOR("David Barksdale <dbarksdale@uplogix.com>"); | ||
161 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c index 0c6517c94a9d..b75519deac1a 100644 --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | |||
@@ -673,8 +673,7 @@ static int inv_mpu_probe(struct i2c_client *client, | |||
673 | 673 | ||
674 | st = iio_priv(indio_dev); | 674 | st = iio_priv(indio_dev); |
675 | st->client = client; | 675 | st->client = client; |
676 | pdata = (struct inv_mpu6050_platform_data | 676 | pdata = dev_get_platdata(&client->dev); |
677 | *)dev_get_platdata(&client->dev); | ||
678 | if (pdata) | 677 | if (pdata) |
679 | st->plat_data = *pdata; | 678 | st->plat_data = *pdata; |
680 | /* power is turned on inside check chip type*/ | 679 | /* power is turned on inside check chip type*/ |
diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c index 0472ee268271..f971f79103ec 100644 --- a/drivers/iio/industrialio-buffer.c +++ b/drivers/iio/industrialio-buffer.c | |||
@@ -942,13 +942,34 @@ int iio_push_to_buffers(struct iio_dev *indio_dev, const void *data) | |||
942 | } | 942 | } |
943 | EXPORT_SYMBOL_GPL(iio_push_to_buffers); | 943 | EXPORT_SYMBOL_GPL(iio_push_to_buffers); |
944 | 944 | ||
945 | static int iio_buffer_add_demux(struct iio_buffer *buffer, | ||
946 | struct iio_demux_table **p, unsigned int in_loc, unsigned int out_loc, | ||
947 | unsigned int length) | ||
948 | { | ||
949 | |||
950 | if (*p && (*p)->from + (*p)->length == in_loc && | ||
951 | (*p)->to + (*p)->length == out_loc) { | ||
952 | (*p)->length += length; | ||
953 | } else { | ||
954 | *p = kmalloc(sizeof(**p), GFP_KERNEL); | ||
955 | if (*p == NULL) | ||
956 | return -ENOMEM; | ||
957 | (*p)->from = in_loc; | ||
958 | (*p)->to = out_loc; | ||
959 | (*p)->length = length; | ||
960 | list_add_tail(&(*p)->l, &buffer->demux_list); | ||
961 | } | ||
962 | |||
963 | return 0; | ||
964 | } | ||
965 | |||
945 | static int iio_buffer_update_demux(struct iio_dev *indio_dev, | 966 | static int iio_buffer_update_demux(struct iio_dev *indio_dev, |
946 | struct iio_buffer *buffer) | 967 | struct iio_buffer *buffer) |
947 | { | 968 | { |
948 | const struct iio_chan_spec *ch; | 969 | const struct iio_chan_spec *ch; |
949 | int ret, in_ind = -1, out_ind, length; | 970 | int ret, in_ind = -1, out_ind, length; |
950 | unsigned in_loc = 0, out_loc = 0; | 971 | unsigned in_loc = 0, out_loc = 0; |
951 | struct iio_demux_table *p; | 972 | struct iio_demux_table *p = NULL; |
952 | 973 | ||
953 | /* Clear out any old demux */ | 974 | /* Clear out any old demux */ |
954 | iio_buffer_demux_free(buffer); | 975 | iio_buffer_demux_free(buffer); |
@@ -979,14 +1000,7 @@ static int iio_buffer_update_demux(struct iio_dev *indio_dev, | |||
979 | else | 1000 | else |
980 | length = ch->scan_type.storagebits / 8; | 1001 | length = ch->scan_type.storagebits / 8; |
981 | /* Make sure we are aligned */ | 1002 | /* Make sure we are aligned */ |
982 | in_loc += length; | 1003 | in_loc = roundup(in_loc, length) + length; |
983 | if (in_loc % length) | ||
984 | in_loc += length - in_loc % length; | ||
985 | } | ||
986 | p = kmalloc(sizeof(*p), GFP_KERNEL); | ||
987 | if (p == NULL) { | ||
988 | ret = -ENOMEM; | ||
989 | goto error_clear_mux_table; | ||
990 | } | 1004 | } |
991 | ch = iio_find_channel_from_si(indio_dev, in_ind); | 1005 | ch = iio_find_channel_from_si(indio_dev, in_ind); |
992 | if (ch->scan_type.repeat > 1) | 1006 | if (ch->scan_type.repeat > 1) |
@@ -994,24 +1008,16 @@ static int iio_buffer_update_demux(struct iio_dev *indio_dev, | |||
994 | ch->scan_type.repeat; | 1008 | ch->scan_type.repeat; |
995 | else | 1009 | else |
996 | length = ch->scan_type.storagebits / 8; | 1010 | length = ch->scan_type.storagebits / 8; |
997 | if (out_loc % length) | 1011 | out_loc = roundup(out_loc, length); |
998 | out_loc += length - out_loc % length; | 1012 | in_loc = roundup(in_loc, length); |
999 | if (in_loc % length) | 1013 | ret = iio_buffer_add_demux(buffer, &p, in_loc, out_loc, length); |
1000 | in_loc += length - in_loc % length; | 1014 | if (ret) |
1001 | p->from = in_loc; | 1015 | goto error_clear_mux_table; |
1002 | p->to = out_loc; | ||
1003 | p->length = length; | ||
1004 | list_add_tail(&p->l, &buffer->demux_list); | ||
1005 | out_loc += length; | 1016 | out_loc += length; |
1006 | in_loc += length; | 1017 | in_loc += length; |
1007 | } | 1018 | } |
1008 | /* Relies on scan_timestamp being last */ | 1019 | /* Relies on scan_timestamp being last */ |
1009 | if (buffer->scan_timestamp) { | 1020 | if (buffer->scan_timestamp) { |
1010 | p = kmalloc(sizeof(*p), GFP_KERNEL); | ||
1011 | if (p == NULL) { | ||
1012 | ret = -ENOMEM; | ||
1013 | goto error_clear_mux_table; | ||
1014 | } | ||
1015 | ch = iio_find_channel_from_si(indio_dev, | 1021 | ch = iio_find_channel_from_si(indio_dev, |
1016 | indio_dev->scan_index_timestamp); | 1022 | indio_dev->scan_index_timestamp); |
1017 | if (ch->scan_type.repeat > 1) | 1023 | if (ch->scan_type.repeat > 1) |
@@ -1019,14 +1025,11 @@ static int iio_buffer_update_demux(struct iio_dev *indio_dev, | |||
1019 | ch->scan_type.repeat; | 1025 | ch->scan_type.repeat; |
1020 | else | 1026 | else |
1021 | length = ch->scan_type.storagebits / 8; | 1027 | length = ch->scan_type.storagebits / 8; |
1022 | if (out_loc % length) | 1028 | out_loc = roundup(out_loc, length); |
1023 | out_loc += length - out_loc % length; | 1029 | in_loc = roundup(in_loc, length); |
1024 | if (in_loc % length) | 1030 | ret = iio_buffer_add_demux(buffer, &p, in_loc, out_loc, length); |
1025 | in_loc += length - in_loc % length; | 1031 | if (ret) |
1026 | p->from = in_loc; | 1032 | goto error_clear_mux_table; |
1027 | p->to = out_loc; | ||
1028 | p->length = length; | ||
1029 | list_add_tail(&p->l, &buffer->demux_list); | ||
1030 | out_loc += length; | 1033 | out_loc += length; |
1031 | in_loc += length; | 1034 | in_loc += length; |
1032 | } | 1035 | } |
diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c index f0846108d006..866fe904cba2 100644 --- a/drivers/iio/inkern.c +++ b/drivers/iio/inkern.c | |||
@@ -100,6 +100,28 @@ static int iio_dev_node_match(struct device *dev, void *data) | |||
100 | return dev->of_node == data && dev->type == &iio_device_type; | 100 | return dev->of_node == data && dev->type == &iio_device_type; |
101 | } | 101 | } |
102 | 102 | ||
103 | /** | ||
104 | * __of_iio_simple_xlate - translate iiospec to the IIO channel index | ||
105 | * @indio_dev: pointer to the iio_dev structure | ||
106 | * @iiospec: IIO specifier as found in the device tree | ||
107 | * | ||
108 | * This is simple translation function, suitable for the most 1:1 mapped | ||
109 | * channels in IIO chips. This function performs only one sanity check: | ||
110 | * whether IIO index is less than num_channels (that is specified in the | ||
111 | * iio_dev). | ||
112 | */ | ||
113 | static int __of_iio_simple_xlate(struct iio_dev *indio_dev, | ||
114 | const struct of_phandle_args *iiospec) | ||
115 | { | ||
116 | if (!iiospec->args_count) | ||
117 | return 0; | ||
118 | |||
119 | if (iiospec->args[0] >= indio_dev->num_channels) | ||
120 | return -EINVAL; | ||
121 | |||
122 | return iiospec->args[0]; | ||
123 | } | ||
124 | |||
103 | static int __of_iio_channel_get(struct iio_channel *channel, | 125 | static int __of_iio_channel_get(struct iio_channel *channel, |
104 | struct device_node *np, int index) | 126 | struct device_node *np, int index) |
105 | { | 127 | { |
@@ -122,18 +144,19 @@ static int __of_iio_channel_get(struct iio_channel *channel, | |||
122 | 144 | ||
123 | indio_dev = dev_to_iio_dev(idev); | 145 | indio_dev = dev_to_iio_dev(idev); |
124 | channel->indio_dev = indio_dev; | 146 | channel->indio_dev = indio_dev; |
125 | index = iiospec.args_count ? iiospec.args[0] : 0; | 147 | if (indio_dev->info->of_xlate) |
126 | if (index >= indio_dev->num_channels) { | 148 | index = indio_dev->info->of_xlate(indio_dev, &iiospec); |
127 | err = -EINVAL; | 149 | else |
150 | index = __of_iio_simple_xlate(indio_dev, &iiospec); | ||
151 | if (index < 0) | ||
128 | goto err_put; | 152 | goto err_put; |
129 | } | ||
130 | channel->channel = &indio_dev->channels[index]; | 153 | channel->channel = &indio_dev->channels[index]; |
131 | 154 | ||
132 | return 0; | 155 | return 0; |
133 | 156 | ||
134 | err_put: | 157 | err_put: |
135 | iio_device_put(indio_dev); | 158 | iio_device_put(indio_dev); |
136 | return err; | 159 | return index; |
137 | } | 160 | } |
138 | 161 | ||
139 | static struct iio_channel *of_iio_channel_get(struct device_node *np, int index) | 162 | static struct iio_channel *of_iio_channel_get(struct device_node *np, int index) |
diff --git a/drivers/iio/light/Kconfig b/drivers/iio/light/Kconfig index bf05ca5b0a57..5bea821adcae 100644 --- a/drivers/iio/light/Kconfig +++ b/drivers/iio/light/Kconfig | |||
@@ -17,6 +17,16 @@ config ADJD_S311 | |||
17 | This driver can also be built as a module. If so, the module | 17 | This driver can also be built as a module. If so, the module |
18 | will be called adjd_s311. | 18 | will be called adjd_s311. |
19 | 19 | ||
20 | config AL3320A | ||
21 | tristate "AL3320A ambient light sensor" | ||
22 | depends on I2C | ||
23 | help | ||
24 | Say Y here if you want to build a driver for the Dyna Image AL3320A | ||
25 | ambient light sensor. | ||
26 | |||
27 | To compile this driver as a module, choose M here: the | ||
28 | module will be called al3320a. | ||
29 | |||
20 | config APDS9300 | 30 | config APDS9300 |
21 | tristate "APDS9300 ambient light sensor" | 31 | tristate "APDS9300 ambient light sensor" |
22 | depends on I2C | 32 | depends on I2C |
diff --git a/drivers/iio/light/Makefile b/drivers/iio/light/Makefile index 8b8c09f9c1f8..47877a36cc12 100644 --- a/drivers/iio/light/Makefile +++ b/drivers/iio/light/Makefile | |||
@@ -4,6 +4,7 @@ | |||
4 | 4 | ||
5 | # When adding new entries keep the list in alphabetical order | 5 | # When adding new entries keep the list in alphabetical order |
6 | obj-$(CONFIG_ADJD_S311) += adjd_s311.o | 6 | obj-$(CONFIG_ADJD_S311) += adjd_s311.o |
7 | obj-$(CONFIG_AL3320A) += al3320a.o | ||
7 | obj-$(CONFIG_APDS9300) += apds9300.o | 8 | obj-$(CONFIG_APDS9300) += apds9300.o |
8 | obj-$(CONFIG_CM32181) += cm32181.o | 9 | obj-$(CONFIG_CM32181) += cm32181.o |
9 | obj-$(CONFIG_CM36651) += cm36651.o | 10 | obj-$(CONFIG_CM36651) += cm36651.o |
diff --git a/drivers/iio/light/al3320a.c b/drivers/iio/light/al3320a.c new file mode 100644 index 000000000000..6aac6513fd41 --- /dev/null +++ b/drivers/iio/light/al3320a.c | |||
@@ -0,0 +1,232 @@ | |||
1 | /* | ||
2 | * AL3320A - Dyna Image Ambient Light Sensor | ||
3 | * | ||
4 | * Copyright (c) 2014, Intel Corporation. | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of version 2 of | ||
7 | * the GNU General Public License. See the file COPYING in the main | ||
8 | * directory of this archive for more details. | ||
9 | * | ||
10 | * IIO driver for AL3320A (7-bit I2C slave address 0x1C). | ||
11 | * | ||
12 | * TODO: interrupt support, thresholds | ||
13 | * | ||
14 | */ | ||
15 | |||
16 | #include <linux/module.h> | ||
17 | #include <linux/init.h> | ||
18 | #include <linux/i2c.h> | ||
19 | |||
20 | #include <linux/iio/iio.h> | ||
21 | #include <linux/iio/sysfs.h> | ||
22 | |||
23 | #define AL3320A_DRV_NAME "al3320a" | ||
24 | |||
25 | #define AL3320A_REG_CONFIG 0x00 | ||
26 | #define AL3320A_REG_STATUS 0x01 | ||
27 | #define AL3320A_REG_INT 0x02 | ||
28 | #define AL3320A_REG_WAIT 0x06 | ||
29 | #define AL3320A_REG_CONFIG_RANGE 0x07 | ||
30 | #define AL3320A_REG_PERSIST 0x08 | ||
31 | #define AL3320A_REG_MEAN_TIME 0x09 | ||
32 | #define AL3320A_REG_ADUMMY 0x0A | ||
33 | #define AL3320A_REG_DATA_LOW 0x22 | ||
34 | |||
35 | #define AL3320A_REG_LOW_THRESH_LOW 0x30 | ||
36 | #define AL3320A_REG_LOW_THRESH_HIGH 0x31 | ||
37 | #define AL3320A_REG_HIGH_THRESH_LOW 0x32 | ||
38 | #define AL3320A_REG_HIGH_THRESH_HIGH 0x33 | ||
39 | |||
40 | #define AL3320A_CONFIG_DISABLE 0x00 | ||
41 | #define AL3320A_CONFIG_ENABLE 0x01 | ||
42 | |||
43 | #define AL3320A_GAIN_SHIFT 1 | ||
44 | #define AL3320A_GAIN_MASK (BIT(2) | BIT(1)) | ||
45 | |||
46 | /* chip params default values */ | ||
47 | #define AL3320A_DEFAULT_MEAN_TIME 4 | ||
48 | #define AL3320A_DEFAULT_WAIT_TIME 0 /* no waiting */ | ||
49 | |||
50 | #define AL3320A_SCALE_AVAILABLE "0.512 0.128 0.032 0.01" | ||
51 | |||
52 | enum al3320a_range { | ||
53 | AL3320A_RANGE_1, /* 33.28 Klx */ | ||
54 | AL3320A_RANGE_2, /* 8.32 Klx */ | ||
55 | AL3320A_RANGE_3, /* 2.08 Klx */ | ||
56 | AL3320A_RANGE_4 /* 0.65 Klx */ | ||
57 | }; | ||
58 | |||
59 | static const int al3320a_scales[][2] = { | ||
60 | {0, 512000}, {0, 128000}, {0, 32000}, {0, 10000} | ||
61 | }; | ||
62 | |||
63 | struct al3320a_data { | ||
64 | struct i2c_client *client; | ||
65 | }; | ||
66 | |||
67 | static const struct iio_chan_spec al3320a_channels[] = { | ||
68 | { | ||
69 | .type = IIO_LIGHT, | ||
70 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | | ||
71 | BIT(IIO_CHAN_INFO_SCALE), | ||
72 | } | ||
73 | }; | ||
74 | |||
75 | static IIO_CONST_ATTR(in_illuminance_scale_available, AL3320A_SCALE_AVAILABLE); | ||
76 | |||
77 | static struct attribute *al3320a_attributes[] = { | ||
78 | &iio_const_attr_in_illuminance_scale_available.dev_attr.attr, | ||
79 | NULL, | ||
80 | }; | ||
81 | |||
82 | static const struct attribute_group al3320a_attribute_group = { | ||
83 | .attrs = al3320a_attributes, | ||
84 | }; | ||
85 | |||
86 | static int al3320a_init(struct al3320a_data *data) | ||
87 | { | ||
88 | int ret; | ||
89 | |||
90 | /* power on */ | ||
91 | ret = i2c_smbus_write_byte_data(data->client, AL3320A_REG_CONFIG, | ||
92 | AL3320A_CONFIG_ENABLE); | ||
93 | if (ret < 0) | ||
94 | return ret; | ||
95 | |||
96 | ret = i2c_smbus_write_byte_data(data->client, AL3320A_REG_CONFIG_RANGE, | ||
97 | AL3320A_RANGE_3 << AL3320A_GAIN_SHIFT); | ||
98 | if (ret < 0) | ||
99 | return ret; | ||
100 | |||
101 | ret = i2c_smbus_write_byte_data(data->client, AL3320A_REG_MEAN_TIME, | ||
102 | AL3320A_DEFAULT_MEAN_TIME); | ||
103 | if (ret < 0) | ||
104 | return ret; | ||
105 | |||
106 | ret = i2c_smbus_write_byte_data(data->client, AL3320A_REG_WAIT, | ||
107 | AL3320A_DEFAULT_WAIT_TIME); | ||
108 | if (ret < 0) | ||
109 | return ret; | ||
110 | |||
111 | return 0; | ||
112 | } | ||
113 | |||
114 | static int al3320a_read_raw(struct iio_dev *indio_dev, | ||
115 | struct iio_chan_spec const *chan, int *val, | ||
116 | int *val2, long mask) | ||
117 | { | ||
118 | struct al3320a_data *data = iio_priv(indio_dev); | ||
119 | int ret; | ||
120 | |||
121 | switch (mask) { | ||
122 | case IIO_CHAN_INFO_RAW: | ||
123 | /* | ||
124 | * ALS ADC value is stored in two adjacent registers: | ||
125 | * - low byte of output is stored at AL3320A_REG_DATA_LOW | ||
126 | * - high byte of output is stored at AL3320A_REG_DATA_LOW + 1 | ||
127 | */ | ||
128 | ret = i2c_smbus_read_word_data(data->client, | ||
129 | AL3320A_REG_DATA_LOW); | ||
130 | if (ret < 0) | ||
131 | return ret; | ||
132 | *val = ret; | ||
133 | return IIO_VAL_INT; | ||
134 | case IIO_CHAN_INFO_SCALE: | ||
135 | ret = i2c_smbus_read_byte_data(data->client, | ||
136 | AL3320A_REG_CONFIG_RANGE); | ||
137 | if (ret < 0) | ||
138 | return ret; | ||
139 | |||
140 | ret = (ret & AL3320A_GAIN_MASK) >> AL3320A_GAIN_SHIFT; | ||
141 | *val = al3320a_scales[ret][0]; | ||
142 | *val2 = al3320a_scales[ret][1]; | ||
143 | |||
144 | return IIO_VAL_INT_PLUS_MICRO; | ||
145 | } | ||
146 | return -EINVAL; | ||
147 | } | ||
148 | |||
149 | static int al3320a_write_raw(struct iio_dev *indio_dev, | ||
150 | struct iio_chan_spec const *chan, int val, | ||
151 | int val2, long mask) | ||
152 | { | ||
153 | struct al3320a_data *data = iio_priv(indio_dev); | ||
154 | int i; | ||
155 | |||
156 | switch (mask) { | ||
157 | case IIO_CHAN_INFO_SCALE: | ||
158 | for (i = 0; i < ARRAY_SIZE(al3320a_scales); i++) { | ||
159 | if (val == al3320a_scales[i][0] && | ||
160 | val2 == al3320a_scales[i][1]) | ||
161 | return i2c_smbus_write_byte_data(data->client, | ||
162 | AL3320A_REG_CONFIG_RANGE, | ||
163 | i << AL3320A_GAIN_SHIFT); | ||
164 | } | ||
165 | break; | ||
166 | } | ||
167 | return -EINVAL; | ||
168 | } | ||
169 | |||
170 | static const struct iio_info al3320a_info = { | ||
171 | .driver_module = THIS_MODULE, | ||
172 | .read_raw = al3320a_read_raw, | ||
173 | .write_raw = al3320a_write_raw, | ||
174 | .attrs = &al3320a_attribute_group, | ||
175 | }; | ||
176 | |||
177 | static int al3320a_probe(struct i2c_client *client, | ||
178 | const struct i2c_device_id *id) | ||
179 | { | ||
180 | struct al3320a_data *data; | ||
181 | struct iio_dev *indio_dev; | ||
182 | int ret; | ||
183 | |||
184 | indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); | ||
185 | if (!indio_dev) | ||
186 | return -ENOMEM; | ||
187 | |||
188 | data = iio_priv(indio_dev); | ||
189 | i2c_set_clientdata(client, indio_dev); | ||
190 | data->client = client; | ||
191 | |||
192 | indio_dev->dev.parent = &client->dev; | ||
193 | indio_dev->info = &al3320a_info; | ||
194 | indio_dev->name = AL3320A_DRV_NAME; | ||
195 | indio_dev->channels = al3320a_channels; | ||
196 | indio_dev->num_channels = ARRAY_SIZE(al3320a_channels); | ||
197 | indio_dev->modes = INDIO_DIRECT_MODE; | ||
198 | |||
199 | ret = al3320a_init(data); | ||
200 | if (ret < 0) { | ||
201 | dev_err(&client->dev, "al3320a chip init failed\n"); | ||
202 | return ret; | ||
203 | } | ||
204 | return devm_iio_device_register(&client->dev, indio_dev); | ||
205 | } | ||
206 | |||
207 | static int al3320a_remove(struct i2c_client *client) | ||
208 | { | ||
209 | return i2c_smbus_write_byte_data(client, AL3320A_REG_CONFIG, | ||
210 | AL3320A_CONFIG_DISABLE); | ||
211 | } | ||
212 | |||
213 | static const struct i2c_device_id al3320a_id[] = { | ||
214 | {"al3320a", 0}, | ||
215 | {} | ||
216 | }; | ||
217 | MODULE_DEVICE_TABLE(i2c, al3320a_id); | ||
218 | |||
219 | static struct i2c_driver al3320a_driver = { | ||
220 | .driver = { | ||
221 | .name = AL3320A_DRV_NAME, | ||
222 | }, | ||
223 | .probe = al3320a_probe, | ||
224 | .remove = al3320a_remove, | ||
225 | .id_table = al3320a_id, | ||
226 | }; | ||
227 | |||
228 | module_i2c_driver(al3320a_driver); | ||
229 | |||
230 | MODULE_AUTHOR("Daniel Baluta <daniel.baluta@intel.com>"); | ||
231 | MODULE_DESCRIPTION("AL3320A Ambient Light Sensor driver"); | ||
232 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/iio/light/hid-sensor-als.c b/drivers/iio/light/hid-sensor-als.c index 96e71e103ea7..a5283d75c096 100644 --- a/drivers/iio/light/hid-sensor-als.c +++ b/drivers/iio/light/hid-sensor-als.c | |||
@@ -381,7 +381,6 @@ static struct platform_driver hid_als_platform_driver = { | |||
381 | .id_table = hid_als_ids, | 381 | .id_table = hid_als_ids, |
382 | .driver = { | 382 | .driver = { |
383 | .name = KBUILD_MODNAME, | 383 | .name = KBUILD_MODNAME, |
384 | .owner = THIS_MODULE, | ||
385 | }, | 384 | }, |
386 | .probe = hid_als_probe, | 385 | .probe = hid_als_probe, |
387 | .remove = hid_als_remove, | 386 | .remove = hid_als_remove, |
diff --git a/drivers/iio/light/hid-sensor-prox.c b/drivers/iio/light/hid-sensor-prox.c index 412bae86d6ae..f5a514698fd8 100644 --- a/drivers/iio/light/hid-sensor-prox.c +++ b/drivers/iio/light/hid-sensor-prox.c | |||
@@ -373,7 +373,6 @@ static struct platform_driver hid_prox_platform_driver = { | |||
373 | .id_table = hid_prox_ids, | 373 | .id_table = hid_prox_ids, |
374 | .driver = { | 374 | .driver = { |
375 | .name = KBUILD_MODNAME, | 375 | .name = KBUILD_MODNAME, |
376 | .owner = THIS_MODULE, | ||
377 | }, | 376 | }, |
378 | .probe = hid_prox_probe, | 377 | .probe = hid_prox_probe, |
379 | .remove = hid_prox_remove, | 378 | .remove = hid_prox_remove, |
diff --git a/drivers/iio/light/lm3533-als.c b/drivers/iio/light/lm3533-als.c index c1aadc6b865a..ae3c71bdd6c6 100644 --- a/drivers/iio/light/lm3533-als.c +++ b/drivers/iio/light/lm3533-als.c | |||
@@ -915,7 +915,6 @@ static int lm3533_als_remove(struct platform_device *pdev) | |||
915 | static struct platform_driver lm3533_als_driver = { | 915 | static struct platform_driver lm3533_als_driver = { |
916 | .driver = { | 916 | .driver = { |
917 | .name = "lm3533-als", | 917 | .name = "lm3533-als", |
918 | .owner = THIS_MODULE, | ||
919 | }, | 918 | }, |
920 | .probe = lm3533_als_probe, | 919 | .probe = lm3533_als_probe, |
921 | .remove = lm3533_als_remove, | 920 | .remove = lm3533_als_remove, |
diff --git a/drivers/iio/light/tsl4531.c b/drivers/iio/light/tsl4531.c index a15006efa137..0763b8632573 100644 --- a/drivers/iio/light/tsl4531.c +++ b/drivers/iio/light/tsl4531.c | |||
@@ -230,9 +230,12 @@ static int tsl4531_resume(struct device *dev) | |||
230 | return i2c_smbus_write_byte_data(to_i2c_client(dev), TSL4531_CONTROL, | 230 | return i2c_smbus_write_byte_data(to_i2c_client(dev), TSL4531_CONTROL, |
231 | TSL4531_MODE_NORMAL); | 231 | TSL4531_MODE_NORMAL); |
232 | } | 232 | } |
233 | #endif | ||
234 | 233 | ||
235 | static SIMPLE_DEV_PM_OPS(tsl4531_pm_ops, tsl4531_suspend, tsl4531_resume); | 234 | static SIMPLE_DEV_PM_OPS(tsl4531_pm_ops, tsl4531_suspend, tsl4531_resume); |
235 | #define TSL4531_PM_OPS (&tsl4531_pm_ops) | ||
236 | #else | ||
237 | #define TSL4531_PM_OPS NULL | ||
238 | #endif | ||
236 | 239 | ||
237 | static const struct i2c_device_id tsl4531_id[] = { | 240 | static const struct i2c_device_id tsl4531_id[] = { |
238 | { "tsl4531", 0 }, | 241 | { "tsl4531", 0 }, |
@@ -243,7 +246,7 @@ MODULE_DEVICE_TABLE(i2c, tsl4531_id); | |||
243 | static struct i2c_driver tsl4531_driver = { | 246 | static struct i2c_driver tsl4531_driver = { |
244 | .driver = { | 247 | .driver = { |
245 | .name = TSL4531_DRV_NAME, | 248 | .name = TSL4531_DRV_NAME, |
246 | .pm = &tsl4531_pm_ops, | 249 | .pm = TSL4531_PM_OPS, |
247 | .owner = THIS_MODULE, | 250 | .owner = THIS_MODULE, |
248 | }, | 251 | }, |
249 | .probe = tsl4531_probe, | 252 | .probe = tsl4531_probe, |
diff --git a/drivers/iio/magnetometer/ak8975.c b/drivers/iio/magnetometer/ak8975.c index a2357921d761..bf5ef077e791 100644 --- a/drivers/iio/magnetometer/ak8975.c +++ b/drivers/iio/magnetometer/ak8975.c | |||
@@ -477,8 +477,8 @@ static const struct acpi_device_id ak_acpi_match[] = { | |||
477 | }; | 477 | }; |
478 | MODULE_DEVICE_TABLE(acpi, ak_acpi_match); | 478 | MODULE_DEVICE_TABLE(acpi, ak_acpi_match); |
479 | 479 | ||
480 | static char *ak8975_match_acpi_device(struct device *dev, | 480 | static const char *ak8975_match_acpi_device(struct device *dev, |
481 | enum asahi_compass_chipset *chipset) | 481 | enum asahi_compass_chipset *chipset) |
482 | { | 482 | { |
483 | const struct acpi_device_id *id; | 483 | const struct acpi_device_id *id; |
484 | 484 | ||
@@ -487,7 +487,7 @@ static char *ak8975_match_acpi_device(struct device *dev, | |||
487 | return NULL; | 487 | return NULL; |
488 | *chipset = (int)id->driver_data; | 488 | *chipset = (int)id->driver_data; |
489 | 489 | ||
490 | return (char *)dev_name(dev); | 490 | return dev_name(dev); |
491 | } | 491 | } |
492 | 492 | ||
493 | static int ak8975_probe(struct i2c_client *client, | 493 | static int ak8975_probe(struct i2c_client *client, |
@@ -497,7 +497,7 @@ static int ak8975_probe(struct i2c_client *client, | |||
497 | struct iio_dev *indio_dev; | 497 | struct iio_dev *indio_dev; |
498 | int eoc_gpio; | 498 | int eoc_gpio; |
499 | int err; | 499 | int err; |
500 | char *name = NULL; | 500 | const char *name = NULL; |
501 | 501 | ||
502 | /* Grab and set up the supplied GPIO. */ | 502 | /* Grab and set up the supplied GPIO. */ |
503 | if (client->dev.platform_data) | 503 | if (client->dev.platform_data) |
@@ -539,7 +539,7 @@ static int ak8975_probe(struct i2c_client *client, | |||
539 | if (id) { | 539 | if (id) { |
540 | data->chipset = | 540 | data->chipset = |
541 | (enum asahi_compass_chipset)(id->driver_data); | 541 | (enum asahi_compass_chipset)(id->driver_data); |
542 | name = (char *) id->name; | 542 | name = id->name; |
543 | } else if (ACPI_HANDLE(&client->dev)) | 543 | } else if (ACPI_HANDLE(&client->dev)) |
544 | name = ak8975_match_acpi_device(&client->dev, &data->chipset); | 544 | name = ak8975_match_acpi_device(&client->dev, &data->chipset); |
545 | else | 545 | else |
diff --git a/drivers/iio/magnetometer/hid-sensor-magn-3d.c b/drivers/iio/magnetometer/hid-sensor-magn-3d.c index 3ec777a8f64e..6294575d2777 100644 --- a/drivers/iio/magnetometer/hid-sensor-magn-3d.c +++ b/drivers/iio/magnetometer/hid-sensor-magn-3d.c | |||
@@ -246,8 +246,7 @@ static const struct iio_info magn_3d_info = { | |||
246 | }; | 246 | }; |
247 | 247 | ||
248 | /* Function to push data to buffer */ | 248 | /* Function to push data to buffer */ |
249 | static void hid_sensor_push_data(struct iio_dev *indio_dev, const void *data, | 249 | static void hid_sensor_push_data(struct iio_dev *indio_dev, const void *data) |
250 | int len) | ||
251 | { | 250 | { |
252 | dev_dbg(&indio_dev->dev, "hid_sensor_push_data\n"); | 251 | dev_dbg(&indio_dev->dev, "hid_sensor_push_data\n"); |
253 | iio_push_to_buffers(indio_dev, data); | 252 | iio_push_to_buffers(indio_dev, data); |
@@ -263,9 +262,7 @@ static int magn_3d_proc_event(struct hid_sensor_hub_device *hsdev, | |||
263 | 262 | ||
264 | dev_dbg(&indio_dev->dev, "magn_3d_proc_event\n"); | 263 | dev_dbg(&indio_dev->dev, "magn_3d_proc_event\n"); |
265 | if (atomic_read(&magn_state->common_attributes.data_ready)) | 264 | if (atomic_read(&magn_state->common_attributes.data_ready)) |
266 | hid_sensor_push_data(indio_dev, | 265 | hid_sensor_push_data(indio_dev, magn_state->iio_vals); |
267 | magn_state->iio_vals, | ||
268 | sizeof(magn_state->iio_vals)); | ||
269 | 266 | ||
270 | return 0; | 267 | return 0; |
271 | } | 268 | } |
@@ -533,7 +530,6 @@ static struct platform_driver hid_magn_3d_platform_driver = { | |||
533 | .id_table = hid_magn_3d_ids, | 530 | .id_table = hid_magn_3d_ids, |
534 | .driver = { | 531 | .driver = { |
535 | .name = KBUILD_MODNAME, | 532 | .name = KBUILD_MODNAME, |
536 | .owner = THIS_MODULE, | ||
537 | }, | 533 | }, |
538 | .probe = hid_magn_3d_probe, | 534 | .probe = hid_magn_3d_probe, |
539 | .remove = hid_magn_3d_remove, | 535 | .remove = hid_magn_3d_remove, |
diff --git a/drivers/iio/magnetometer/st_magn.h b/drivers/iio/magnetometer/st_magn.h index 694e33e0fb72..7e81d00ef0c3 100644 --- a/drivers/iio/magnetometer/st_magn.h +++ b/drivers/iio/magnetometer/st_magn.h | |||
@@ -18,8 +18,7 @@ | |||
18 | #define LSM303DLM_MAGN_DEV_NAME "lsm303dlm_magn" | 18 | #define LSM303DLM_MAGN_DEV_NAME "lsm303dlm_magn" |
19 | #define LIS3MDL_MAGN_DEV_NAME "lis3mdl" | 19 | #define LIS3MDL_MAGN_DEV_NAME "lis3mdl" |
20 | 20 | ||
21 | int st_magn_common_probe(struct iio_dev *indio_dev, | 21 | int st_magn_common_probe(struct iio_dev *indio_dev); |
22 | struct st_sensors_platform_data *pdata); | ||
23 | void st_magn_common_remove(struct iio_dev *indio_dev); | 22 | void st_magn_common_remove(struct iio_dev *indio_dev); |
24 | 23 | ||
25 | #ifdef CONFIG_IIO_BUFFER | 24 | #ifdef CONFIG_IIO_BUFFER |
diff --git a/drivers/iio/magnetometer/st_magn_core.c b/drivers/iio/magnetometer/st_magn_core.c index 68cae86dbd29..8ade473f99fe 100644 --- a/drivers/iio/magnetometer/st_magn_core.c +++ b/drivers/iio/magnetometer/st_magn_core.c | |||
@@ -149,7 +149,7 @@ static const struct iio_chan_spec st_magn_2_16bit_channels[] = { | |||
149 | IIO_CHAN_SOFT_TIMESTAMP(3) | 149 | IIO_CHAN_SOFT_TIMESTAMP(3) |
150 | }; | 150 | }; |
151 | 151 | ||
152 | static const struct st_sensors st_magn_sensors[] = { | 152 | static const struct st_sensor_settings st_magn_sensors_settings[] = { |
153 | { | 153 | { |
154 | .wai = ST_MAGN_1_WAI_EXP, | 154 | .wai = ST_MAGN_1_WAI_EXP, |
155 | .sensors_supported = { | 155 | .sensors_supported = { |
@@ -361,8 +361,7 @@ static const struct iio_info magn_info = { | |||
361 | .write_raw = &st_magn_write_raw, | 361 | .write_raw = &st_magn_write_raw, |
362 | }; | 362 | }; |
363 | 363 | ||
364 | int st_magn_common_probe(struct iio_dev *indio_dev, | 364 | int st_magn_common_probe(struct iio_dev *indio_dev) |
365 | struct st_sensors_platform_data *pdata) | ||
366 | { | 365 | { |
367 | struct st_sensor_data *mdata = iio_priv(indio_dev); | 366 | struct st_sensor_data *mdata = iio_priv(indio_dev); |
368 | int irq = mdata->get_irq_data_ready(indio_dev); | 367 | int irq = mdata->get_irq_data_ready(indio_dev); |
@@ -374,20 +373,21 @@ int st_magn_common_probe(struct iio_dev *indio_dev, | |||
374 | st_sensors_power_enable(indio_dev); | 373 | st_sensors_power_enable(indio_dev); |
375 | 374 | ||
376 | err = st_sensors_check_device_support(indio_dev, | 375 | err = st_sensors_check_device_support(indio_dev, |
377 | ARRAY_SIZE(st_magn_sensors), st_magn_sensors); | 376 | ARRAY_SIZE(st_magn_sensors_settings), |
377 | st_magn_sensors_settings); | ||
378 | if (err < 0) | 378 | if (err < 0) |
379 | return err; | 379 | return err; |
380 | 380 | ||
381 | mdata->num_data_channels = ST_MAGN_NUMBER_DATA_CHANNELS; | 381 | mdata->num_data_channels = ST_MAGN_NUMBER_DATA_CHANNELS; |
382 | mdata->multiread_bit = mdata->sensor->multi_read_bit; | 382 | mdata->multiread_bit = mdata->sensor_settings->multi_read_bit; |
383 | indio_dev->channels = mdata->sensor->ch; | 383 | indio_dev->channels = mdata->sensor_settings->ch; |
384 | indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS; | 384 | indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS; |
385 | 385 | ||
386 | mdata->current_fullscale = (struct st_sensor_fullscale_avl *) | 386 | mdata->current_fullscale = (struct st_sensor_fullscale_avl *) |
387 | &mdata->sensor->fs.fs_avl[0]; | 387 | &mdata->sensor_settings->fs.fs_avl[0]; |
388 | mdata->odr = mdata->sensor->odr.odr_avl[0].hz; | 388 | mdata->odr = mdata->sensor_settings->odr.odr_avl[0].hz; |
389 | 389 | ||
390 | err = st_sensors_init_sensor(indio_dev, pdata); | 390 | err = st_sensors_init_sensor(indio_dev, NULL); |
391 | if (err < 0) | 391 | if (err < 0) |
392 | return err; | 392 | return err; |
393 | 393 | ||
diff --git a/drivers/iio/magnetometer/st_magn_i2c.c b/drivers/iio/magnetometer/st_magn_i2c.c index 689250058442..92e5c15452a3 100644 --- a/drivers/iio/magnetometer/st_magn_i2c.c +++ b/drivers/iio/magnetometer/st_magn_i2c.c | |||
@@ -51,12 +51,11 @@ static int st_magn_i2c_probe(struct i2c_client *client, | |||
51 | return -ENOMEM; | 51 | return -ENOMEM; |
52 | 52 | ||
53 | mdata = iio_priv(indio_dev); | 53 | mdata = iio_priv(indio_dev); |
54 | mdata->dev = &client->dev; | ||
55 | st_sensors_of_i2c_probe(client, st_magn_of_match); | 54 | st_sensors_of_i2c_probe(client, st_magn_of_match); |
56 | 55 | ||
57 | st_sensors_i2c_configure(indio_dev, client, mdata); | 56 | st_sensors_i2c_configure(indio_dev, client, mdata); |
58 | 57 | ||
59 | err = st_magn_common_probe(indio_dev, NULL); | 58 | err = st_magn_common_probe(indio_dev); |
60 | if (err < 0) | 59 | if (err < 0) |
61 | return err; | 60 | return err; |
62 | 61 | ||
diff --git a/drivers/iio/magnetometer/st_magn_spi.c b/drivers/iio/magnetometer/st_magn_spi.c index a6143ea51dfc..7adacf160146 100644 --- a/drivers/iio/magnetometer/st_magn_spi.c +++ b/drivers/iio/magnetometer/st_magn_spi.c | |||
@@ -29,11 +29,10 @@ static int st_magn_spi_probe(struct spi_device *spi) | |||
29 | return -ENOMEM; | 29 | return -ENOMEM; |
30 | 30 | ||
31 | mdata = iio_priv(indio_dev); | 31 | mdata = iio_priv(indio_dev); |
32 | mdata->dev = &spi->dev; | ||
33 | 32 | ||
34 | st_sensors_spi_configure(indio_dev, spi, mdata); | 33 | st_sensors_spi_configure(indio_dev, spi, mdata); |
35 | 34 | ||
36 | err = st_magn_common_probe(indio_dev, NULL); | 35 | err = st_magn_common_probe(indio_dev); |
37 | if (err < 0) | 36 | if (err < 0) |
38 | return err; | 37 | return err; |
39 | 38 | ||
diff --git a/drivers/iio/orientation/hid-sensor-incl-3d.c b/drivers/iio/orientation/hid-sensor-incl-3d.c index 2478f6c2ef25..1ff181bbbcef 100644 --- a/drivers/iio/orientation/hid-sensor-incl-3d.c +++ b/drivers/iio/orientation/hid-sensor-incl-3d.c | |||
@@ -437,7 +437,6 @@ static struct platform_driver hid_incl_3d_platform_driver = { | |||
437 | .id_table = hid_incl_3d_ids, | 437 | .id_table = hid_incl_3d_ids, |
438 | .driver = { | 438 | .driver = { |
439 | .name = KBUILD_MODNAME, | 439 | .name = KBUILD_MODNAME, |
440 | .owner = THIS_MODULE, | ||
441 | }, | 440 | }, |
442 | .probe = hid_incl_3d_probe, | 441 | .probe = hid_incl_3d_probe, |
443 | .remove = hid_incl_3d_remove, | 442 | .remove = hid_incl_3d_remove, |
diff --git a/drivers/iio/orientation/hid-sensor-rotation.c b/drivers/iio/orientation/hid-sensor-rotation.c index dccf848e8b0f..4afb6c79ccbc 100644 --- a/drivers/iio/orientation/hid-sensor-rotation.c +++ b/drivers/iio/orientation/hid-sensor-rotation.c | |||
@@ -334,7 +334,6 @@ static struct platform_driver hid_dev_rot_platform_driver = { | |||
334 | .id_table = hid_dev_rot_ids, | 334 | .id_table = hid_dev_rot_ids, |
335 | .driver = { | 335 | .driver = { |
336 | .name = KBUILD_MODNAME, | 336 | .name = KBUILD_MODNAME, |
337 | .owner = THIS_MODULE, | ||
338 | }, | 337 | }, |
339 | .probe = hid_dev_rot_probe, | 338 | .probe = hid_dev_rot_probe, |
340 | .remove = hid_dev_rot_remove, | 339 | .remove = hid_dev_rot_remove, |
diff --git a/drivers/iio/pressure/Kconfig b/drivers/iio/pressure/Kconfig index 15afbc919521..a3be53792072 100644 --- a/drivers/iio/pressure/Kconfig +++ b/drivers/iio/pressure/Kconfig | |||
@@ -5,6 +5,17 @@ | |||
5 | 5 | ||
6 | menu "Pressure sensors" | 6 | menu "Pressure sensors" |
7 | 7 | ||
8 | config BMP280 | ||
9 | tristate "Bosch Sensortec BMP280 pressure sensor driver" | ||
10 | depends on I2C | ||
11 | select REGMAP_I2C | ||
12 | help | ||
13 | Say yes here to build support for Bosch Sensortec BMP280 | ||
14 | pressure and temperature sensor. | ||
15 | |||
16 | To compile this driver as a module, choose M here: the module | ||
17 | will be called bmp280. | ||
18 | |||
8 | config HID_SENSOR_PRESS | 19 | config HID_SENSOR_PRESS |
9 | depends on HID_SENSOR_HUB | 20 | depends on HID_SENSOR_HUB |
10 | select IIO_BUFFER | 21 | select IIO_BUFFER |
diff --git a/drivers/iio/pressure/Makefile b/drivers/iio/pressure/Makefile index 90a37e85cf21..88011f2ae00e 100644 --- a/drivers/iio/pressure/Makefile +++ b/drivers/iio/pressure/Makefile | |||
@@ -3,6 +3,7 @@ | |||
3 | # | 3 | # |
4 | 4 | ||
5 | # When adding new entries keep the list in alphabetical order | 5 | # When adding new entries keep the list in alphabetical order |
6 | obj-$(CONFIG_BMP280) += bmp280.o | ||
6 | obj-$(CONFIG_HID_SENSOR_PRESS) += hid-sensor-press.o | 7 | obj-$(CONFIG_HID_SENSOR_PRESS) += hid-sensor-press.o |
7 | obj-$(CONFIG_MPL115) += mpl115.o | 8 | obj-$(CONFIG_MPL115) += mpl115.o |
8 | obj-$(CONFIG_MPL3115) += mpl3115.o | 9 | obj-$(CONFIG_MPL3115) += mpl3115.o |
diff --git a/drivers/iio/pressure/bmp280.c b/drivers/iio/pressure/bmp280.c new file mode 100644 index 000000000000..75038dacfff1 --- /dev/null +++ b/drivers/iio/pressure/bmp280.c | |||
@@ -0,0 +1,455 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2014 Intel Corporation | ||
3 | * | ||
4 | * Driver for Bosch Sensortec BMP280 digital pressure sensor. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | */ | ||
11 | |||
12 | #define pr_fmt(fmt) "bmp280: " fmt | ||
13 | |||
14 | #include <linux/module.h> | ||
15 | #include <linux/i2c.h> | ||
16 | #include <linux/acpi.h> | ||
17 | #include <linux/regmap.h> | ||
18 | #include <linux/iio/iio.h> | ||
19 | #include <linux/iio/sysfs.h> | ||
20 | |||
21 | #define BMP280_REG_TEMP_XLSB 0xFC | ||
22 | #define BMP280_REG_TEMP_LSB 0xFB | ||
23 | #define BMP280_REG_TEMP_MSB 0xFA | ||
24 | #define BMP280_REG_PRESS_XLSB 0xF9 | ||
25 | #define BMP280_REG_PRESS_LSB 0xF8 | ||
26 | #define BMP280_REG_PRESS_MSB 0xF7 | ||
27 | |||
28 | #define BMP280_REG_CONFIG 0xF5 | ||
29 | #define BMP280_REG_CTRL_MEAS 0xF4 | ||
30 | #define BMP280_REG_STATUS 0xF3 | ||
31 | #define BMP280_REG_RESET 0xE0 | ||
32 | #define BMP280_REG_ID 0xD0 | ||
33 | |||
34 | #define BMP280_REG_COMP_TEMP_START 0x88 | ||
35 | #define BMP280_COMP_TEMP_REG_COUNT 6 | ||
36 | |||
37 | #define BMP280_REG_COMP_PRESS_START 0x8E | ||
38 | #define BMP280_COMP_PRESS_REG_COUNT 18 | ||
39 | |||
40 | #define BMP280_FILTER_MASK (BIT(4) | BIT(3) | BIT(2)) | ||
41 | #define BMP280_FILTER_OFF 0 | ||
42 | #define BMP280_FILTER_2X BIT(2) | ||
43 | #define BMP280_FILTER_4X BIT(3) | ||
44 | #define BMP280_FILTER_8X (BIT(3) | BIT(2)) | ||
45 | #define BMP280_FILTER_16X BIT(4) | ||
46 | |||
47 | #define BMP280_OSRS_TEMP_MASK (BIT(7) | BIT(6) | BIT(5)) | ||
48 | #define BMP280_OSRS_TEMP_SKIP 0 | ||
49 | #define BMP280_OSRS_TEMP_1X BIT(5) | ||
50 | #define BMP280_OSRS_TEMP_2X BIT(6) | ||
51 | #define BMP280_OSRS_TEMP_4X (BIT(6) | BIT(5)) | ||
52 | #define BMP280_OSRS_TEMP_8X BIT(7) | ||
53 | #define BMP280_OSRS_TEMP_16X (BIT(7) | BIT(5)) | ||
54 | |||
55 | #define BMP280_OSRS_PRESS_MASK (BIT(4) | BIT(3) | BIT(2)) | ||
56 | #define BMP280_OSRS_PRESS_SKIP 0 | ||
57 | #define BMP280_OSRS_PRESS_1X BIT(2) | ||
58 | #define BMP280_OSRS_PRESS_2X BIT(3) | ||
59 | #define BMP280_OSRS_PRESS_4X (BIT(3) | BIT(2)) | ||
60 | #define BMP280_OSRS_PRESS_8X BIT(4) | ||
61 | #define BMP280_OSRS_PRESS_16X (BIT(4) | BIT(2)) | ||
62 | |||
63 | #define BMP280_MODE_MASK (BIT(1) | BIT(0)) | ||
64 | #define BMP280_MODE_SLEEP 0 | ||
65 | #define BMP280_MODE_FORCED BIT(0) | ||
66 | #define BMP280_MODE_NORMAL (BIT(1) | BIT(0)) | ||
67 | |||
68 | #define BMP280_CHIP_ID 0x58 | ||
69 | #define BMP280_SOFT_RESET_VAL 0xB6 | ||
70 | |||
71 | struct bmp280_data { | ||
72 | struct i2c_client *client; | ||
73 | struct mutex lock; | ||
74 | struct regmap *regmap; | ||
75 | |||
76 | /* | ||
77 | * Carryover value from temperature conversion, used in pressure | ||
78 | * calculation. | ||
79 | */ | ||
80 | s32 t_fine; | ||
81 | }; | ||
82 | |||
83 | /* Compensation parameters. */ | ||
84 | struct bmp280_comp_temp { | ||
85 | u16 dig_t1; | ||
86 | s16 dig_t2, dig_t3; | ||
87 | }; | ||
88 | |||
89 | struct bmp280_comp_press { | ||
90 | u16 dig_p1; | ||
91 | s16 dig_p2, dig_p3, dig_p4, dig_p5, dig_p6, dig_p7, dig_p8, dig_p9; | ||
92 | }; | ||
93 | |||
94 | static const struct iio_chan_spec bmp280_channels[] = { | ||
95 | { | ||
96 | .type = IIO_PRESSURE, | ||
97 | .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), | ||
98 | }, | ||
99 | { | ||
100 | .type = IIO_TEMP, | ||
101 | .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), | ||
102 | }, | ||
103 | }; | ||
104 | |||
105 | static bool bmp280_is_writeable_reg(struct device *dev, unsigned int reg) | ||
106 | { | ||
107 | switch (reg) { | ||
108 | case BMP280_REG_CONFIG: | ||
109 | case BMP280_REG_CTRL_MEAS: | ||
110 | case BMP280_REG_RESET: | ||
111 | return true; | ||
112 | default: | ||
113 | return false; | ||
114 | }; | ||
115 | } | ||
116 | |||
117 | static bool bmp280_is_volatile_reg(struct device *dev, unsigned int reg) | ||
118 | { | ||
119 | switch (reg) { | ||
120 | case BMP280_REG_TEMP_XLSB: | ||
121 | case BMP280_REG_TEMP_LSB: | ||
122 | case BMP280_REG_TEMP_MSB: | ||
123 | case BMP280_REG_PRESS_XLSB: | ||
124 | case BMP280_REG_PRESS_LSB: | ||
125 | case BMP280_REG_PRESS_MSB: | ||
126 | case BMP280_REG_STATUS: | ||
127 | return true; | ||
128 | default: | ||
129 | return false; | ||
130 | } | ||
131 | } | ||
132 | |||
133 | static const struct regmap_config bmp280_regmap_config = { | ||
134 | .reg_bits = 8, | ||
135 | .val_bits = 8, | ||
136 | |||
137 | .max_register = BMP280_REG_TEMP_XLSB, | ||
138 | .cache_type = REGCACHE_RBTREE, | ||
139 | |||
140 | .writeable_reg = bmp280_is_writeable_reg, | ||
141 | .volatile_reg = bmp280_is_volatile_reg, | ||
142 | }; | ||
143 | |||
144 | static int bmp280_read_compensation_temp(struct bmp280_data *data, | ||
145 | struct bmp280_comp_temp *comp) | ||
146 | { | ||
147 | int ret; | ||
148 | __le16 buf[BMP280_COMP_TEMP_REG_COUNT / 2]; | ||
149 | |||
150 | ret = regmap_bulk_read(data->regmap, BMP280_REG_COMP_TEMP_START, | ||
151 | buf, BMP280_COMP_TEMP_REG_COUNT); | ||
152 | if (ret < 0) { | ||
153 | dev_err(&data->client->dev, | ||
154 | "failed to read temperature calibration parameters\n"); | ||
155 | return ret; | ||
156 | } | ||
157 | |||
158 | comp->dig_t1 = (u16) le16_to_cpu(buf[0]); | ||
159 | comp->dig_t2 = (s16) le16_to_cpu(buf[1]); | ||
160 | comp->dig_t3 = (s16) le16_to_cpu(buf[2]); | ||
161 | |||
162 | return 0; | ||
163 | } | ||
164 | |||
165 | static int bmp280_read_compensation_press(struct bmp280_data *data, | ||
166 | struct bmp280_comp_press *comp) | ||
167 | { | ||
168 | int ret; | ||
169 | __le16 buf[BMP280_COMP_PRESS_REG_COUNT / 2]; | ||
170 | |||
171 | ret = regmap_bulk_read(data->regmap, BMP280_REG_COMP_PRESS_START, | ||
172 | buf, BMP280_COMP_PRESS_REG_COUNT); | ||
173 | if (ret < 0) { | ||
174 | dev_err(&data->client->dev, | ||
175 | "failed to read pressure calibration parameters\n"); | ||
176 | return ret; | ||
177 | } | ||
178 | |||
179 | comp->dig_p1 = (u16) le16_to_cpu(buf[0]); | ||
180 | comp->dig_p2 = (s16) le16_to_cpu(buf[1]); | ||
181 | comp->dig_p3 = (s16) le16_to_cpu(buf[2]); | ||
182 | comp->dig_p4 = (s16) le16_to_cpu(buf[3]); | ||
183 | comp->dig_p5 = (s16) le16_to_cpu(buf[4]); | ||
184 | comp->dig_p6 = (s16) le16_to_cpu(buf[5]); | ||
185 | comp->dig_p7 = (s16) le16_to_cpu(buf[6]); | ||
186 | comp->dig_p8 = (s16) le16_to_cpu(buf[7]); | ||
187 | comp->dig_p9 = (s16) le16_to_cpu(buf[8]); | ||
188 | |||
189 | return 0; | ||
190 | } | ||
191 | |||
192 | /* | ||
193 | * Returns temperature in DegC, resolution is 0.01 DegC. Output value of | ||
194 | * "5123" equals 51.23 DegC. t_fine carries fine temperature as global | ||
195 | * value. | ||
196 | * | ||
197 | * Taken from datasheet, Section 3.11.3, "Compensation formula". | ||
198 | */ | ||
199 | static s32 bmp280_compensate_temp(struct bmp280_data *data, | ||
200 | struct bmp280_comp_temp *comp, | ||
201 | s32 adc_temp) | ||
202 | { | ||
203 | s32 var1, var2, t; | ||
204 | |||
205 | var1 = (((adc_temp >> 3) - ((s32) comp->dig_t1 << 1)) * | ||
206 | ((s32) comp->dig_t2)) >> 11; | ||
207 | var2 = (((((adc_temp >> 4) - ((s32) comp->dig_t1)) * | ||
208 | ((adc_temp >> 4) - ((s32) comp->dig_t1))) >> 12) * | ||
209 | ((s32) comp->dig_t3)) >> 14; | ||
210 | |||
211 | data->t_fine = var1 + var2; | ||
212 | t = (data->t_fine * 5 + 128) >> 8; | ||
213 | |||
214 | return t; | ||
215 | } | ||
216 | |||
217 | /* | ||
218 | * Returns pressure in Pa as unsigned 32 bit integer in Q24.8 format (24 | ||
219 | * integer bits and 8 fractional bits). Output value of "24674867" | ||
220 | * represents 24674867/256 = 96386.2 Pa = 963.862 hPa | ||
221 | * | ||
222 | * Taken from datasheet, Section 3.11.3, "Compensation formula". | ||
223 | */ | ||
224 | static u32 bmp280_compensate_press(struct bmp280_data *data, | ||
225 | struct bmp280_comp_press *comp, | ||
226 | s32 adc_press) | ||
227 | { | ||
228 | s64 var1, var2, p; | ||
229 | |||
230 | var1 = ((s64) data->t_fine) - 128000; | ||
231 | var2 = var1 * var1 * (s64) comp->dig_p6; | ||
232 | var2 = var2 + ((var1 * (s64) comp->dig_p5) << 17); | ||
233 | var2 = var2 + (((s64) comp->dig_p4) << 35); | ||
234 | var1 = ((var1 * var1 * (s64) comp->dig_p3) >> 8) + | ||
235 | ((var1 * (s64) comp->dig_p2) << 12); | ||
236 | var1 = (((((s64) 1) << 47) + var1)) * ((s64) comp->dig_p1) >> 33; | ||
237 | |||
238 | if (var1 == 0) | ||
239 | return 0; | ||
240 | |||
241 | p = ((((s64) 1048576 - adc_press) << 31) - var2) * 3125; | ||
242 | p = div64_s64(p, var1); | ||
243 | var1 = (((s64) comp->dig_p9) * (p >> 13) * (p >> 13)) >> 25; | ||
244 | var2 = (((s64) comp->dig_p8) * p) >> 19; | ||
245 | p = ((p + var1 + var2) >> 8) + (((s64) comp->dig_p7) << 4); | ||
246 | |||
247 | return (u32) p; | ||
248 | } | ||
249 | |||
250 | static int bmp280_read_temp(struct bmp280_data *data, | ||
251 | int *val) | ||
252 | { | ||
253 | int ret; | ||
254 | __be32 tmp = 0; | ||
255 | s32 adc_temp, comp_temp; | ||
256 | struct bmp280_comp_temp comp; | ||
257 | |||
258 | ret = bmp280_read_compensation_temp(data, &comp); | ||
259 | if (ret < 0) | ||
260 | return ret; | ||
261 | |||
262 | ret = regmap_bulk_read(data->regmap, BMP280_REG_TEMP_MSB, | ||
263 | (u8 *) &tmp, 3); | ||
264 | if (ret < 0) { | ||
265 | dev_err(&data->client->dev, "failed to read temperature\n"); | ||
266 | return ret; | ||
267 | } | ||
268 | |||
269 | adc_temp = be32_to_cpu(tmp) >> 12; | ||
270 | comp_temp = bmp280_compensate_temp(data, &comp, adc_temp); | ||
271 | |||
272 | /* | ||
273 | * val might be NULL if we're called by the read_press routine, | ||
274 | * who only cares about the carry over t_fine value. | ||
275 | */ | ||
276 | if (val) { | ||
277 | *val = comp_temp * 10; | ||
278 | return IIO_VAL_INT; | ||
279 | } | ||
280 | |||
281 | return 0; | ||
282 | } | ||
283 | |||
284 | static int bmp280_read_press(struct bmp280_data *data, | ||
285 | int *val, int *val2) | ||
286 | { | ||
287 | int ret; | ||
288 | __be32 tmp = 0; | ||
289 | s32 adc_press; | ||
290 | u32 comp_press; | ||
291 | struct bmp280_comp_press comp; | ||
292 | |||
293 | ret = bmp280_read_compensation_press(data, &comp); | ||
294 | if (ret < 0) | ||
295 | return ret; | ||
296 | |||
297 | /* Read and compensate temperature so we get a reading of t_fine. */ | ||
298 | ret = bmp280_read_temp(data, NULL); | ||
299 | if (ret < 0) | ||
300 | return ret; | ||
301 | |||
302 | ret = regmap_bulk_read(data->regmap, BMP280_REG_PRESS_MSB, | ||
303 | (u8 *) &tmp, 3); | ||
304 | if (ret < 0) { | ||
305 | dev_err(&data->client->dev, "failed to read pressure\n"); | ||
306 | return ret; | ||
307 | } | ||
308 | |||
309 | adc_press = be32_to_cpu(tmp) >> 12; | ||
310 | comp_press = bmp280_compensate_press(data, &comp, adc_press); | ||
311 | |||
312 | *val = comp_press; | ||
313 | *val2 = 256000; | ||
314 | |||
315 | return IIO_VAL_FRACTIONAL; | ||
316 | } | ||
317 | |||
318 | static int bmp280_read_raw(struct iio_dev *indio_dev, | ||
319 | struct iio_chan_spec const *chan, | ||
320 | int *val, int *val2, long mask) | ||
321 | { | ||
322 | int ret; | ||
323 | struct bmp280_data *data = iio_priv(indio_dev); | ||
324 | |||
325 | mutex_lock(&data->lock); | ||
326 | |||
327 | switch (mask) { | ||
328 | case IIO_CHAN_INFO_PROCESSED: | ||
329 | switch (chan->type) { | ||
330 | case IIO_PRESSURE: | ||
331 | ret = bmp280_read_press(data, val, val2); | ||
332 | break; | ||
333 | case IIO_TEMP: | ||
334 | ret = bmp280_read_temp(data, val); | ||
335 | break; | ||
336 | default: | ||
337 | ret = -EINVAL; | ||
338 | break; | ||
339 | } | ||
340 | break; | ||
341 | default: | ||
342 | ret = -EINVAL; | ||
343 | break; | ||
344 | } | ||
345 | |||
346 | mutex_unlock(&data->lock); | ||
347 | |||
348 | return ret; | ||
349 | } | ||
350 | |||
351 | static const struct iio_info bmp280_info = { | ||
352 | .driver_module = THIS_MODULE, | ||
353 | .read_raw = &bmp280_read_raw, | ||
354 | }; | ||
355 | |||
356 | static int bmp280_chip_init(struct bmp280_data *data) | ||
357 | { | ||
358 | int ret; | ||
359 | |||
360 | ret = regmap_update_bits(data->regmap, BMP280_REG_CTRL_MEAS, | ||
361 | BMP280_OSRS_TEMP_MASK | | ||
362 | BMP280_OSRS_PRESS_MASK | | ||
363 | BMP280_MODE_MASK, | ||
364 | BMP280_OSRS_TEMP_2X | | ||
365 | BMP280_OSRS_PRESS_16X | | ||
366 | BMP280_MODE_NORMAL); | ||
367 | if (ret < 0) { | ||
368 | dev_err(&data->client->dev, | ||
369 | "failed to write config register\n"); | ||
370 | return ret; | ||
371 | } | ||
372 | |||
373 | ret = regmap_update_bits(data->regmap, BMP280_REG_CONFIG, | ||
374 | BMP280_FILTER_MASK, | ||
375 | BMP280_FILTER_4X); | ||
376 | if (ret < 0) { | ||
377 | dev_err(&data->client->dev, | ||
378 | "failed to write config register\n"); | ||
379 | return ret; | ||
380 | } | ||
381 | |||
382 | return ret; | ||
383 | } | ||
384 | |||
385 | static int bmp280_probe(struct i2c_client *client, | ||
386 | const struct i2c_device_id *id) | ||
387 | { | ||
388 | int ret; | ||
389 | struct iio_dev *indio_dev; | ||
390 | struct bmp280_data *data; | ||
391 | unsigned int chip_id; | ||
392 | |||
393 | indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); | ||
394 | if (!indio_dev) | ||
395 | return -ENOMEM; | ||
396 | |||
397 | i2c_set_clientdata(client, indio_dev); | ||
398 | data = iio_priv(indio_dev); | ||
399 | mutex_init(&data->lock); | ||
400 | data->client = client; | ||
401 | |||
402 | indio_dev->dev.parent = &client->dev; | ||
403 | indio_dev->name = id->name; | ||
404 | indio_dev->channels = bmp280_channels; | ||
405 | indio_dev->num_channels = ARRAY_SIZE(bmp280_channels); | ||
406 | indio_dev->info = &bmp280_info; | ||
407 | indio_dev->modes = INDIO_DIRECT_MODE; | ||
408 | |||
409 | data->regmap = devm_regmap_init_i2c(client, &bmp280_regmap_config); | ||
410 | if (IS_ERR(data->regmap)) { | ||
411 | dev_err(&client->dev, "failed to allocate register map\n"); | ||
412 | return PTR_ERR(data->regmap); | ||
413 | } | ||
414 | |||
415 | ret = regmap_read(data->regmap, BMP280_REG_ID, &chip_id); | ||
416 | if (ret < 0) | ||
417 | return ret; | ||
418 | if (chip_id != BMP280_CHIP_ID) { | ||
419 | dev_err(&client->dev, "bad chip id. expected %x got %x\n", | ||
420 | BMP280_CHIP_ID, chip_id); | ||
421 | return -EINVAL; | ||
422 | } | ||
423 | |||
424 | ret = bmp280_chip_init(data); | ||
425 | if (ret < 0) | ||
426 | return ret; | ||
427 | |||
428 | return devm_iio_device_register(&client->dev, indio_dev); | ||
429 | } | ||
430 | |||
431 | static const struct acpi_device_id bmp280_acpi_match[] = { | ||
432 | {"BMP0280", 0}, | ||
433 | { }, | ||
434 | }; | ||
435 | MODULE_DEVICE_TABLE(acpi, bmp280_acpi_match); | ||
436 | |||
437 | static const struct i2c_device_id bmp280_id[] = { | ||
438 | {"bmp280", 0}, | ||
439 | { }, | ||
440 | }; | ||
441 | MODULE_DEVICE_TABLE(i2c, bmp280_id); | ||
442 | |||
443 | static struct i2c_driver bmp280_driver = { | ||
444 | .driver = { | ||
445 | .name = "bmp280", | ||
446 | .acpi_match_table = ACPI_PTR(bmp280_acpi_match), | ||
447 | }, | ||
448 | .probe = bmp280_probe, | ||
449 | .id_table = bmp280_id, | ||
450 | }; | ||
451 | module_i2c_driver(bmp280_driver); | ||
452 | |||
453 | MODULE_AUTHOR("Vlad Dogaru <vlad.dogaru@intel.com>"); | ||
454 | MODULE_DESCRIPTION("Driver for Bosch Sensortec BMP280 pressure and temperature sensor"); | ||
455 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/iio/pressure/hid-sensor-press.c b/drivers/iio/pressure/hid-sensor-press.c index 2c0d2a4fed8c..764928682df2 100644 --- a/drivers/iio/pressure/hid-sensor-press.c +++ b/drivers/iio/pressure/hid-sensor-press.c | |||
@@ -382,7 +382,6 @@ static struct platform_driver hid_press_platform_driver = { | |||
382 | .id_table = hid_press_ids, | 382 | .id_table = hid_press_ids, |
383 | .driver = { | 383 | .driver = { |
384 | .name = KBUILD_MODNAME, | 384 | .name = KBUILD_MODNAME, |
385 | .owner = THIS_MODULE, | ||
386 | }, | 385 | }, |
387 | .probe = hid_press_probe, | 386 | .probe = hid_press_probe, |
388 | .remove = hid_press_remove, | 387 | .remove = hid_press_remove, |
diff --git a/drivers/iio/pressure/st_pressure.h b/drivers/iio/pressure/st_pressure.h index 242943c0c4e4..f5f41490060b 100644 --- a/drivers/iio/pressure/st_pressure.h +++ b/drivers/iio/pressure/st_pressure.h | |||
@@ -26,8 +26,7 @@ static const struct st_sensors_platform_data default_press_pdata = { | |||
26 | .drdy_int_pin = 1, | 26 | .drdy_int_pin = 1, |
27 | }; | 27 | }; |
28 | 28 | ||
29 | int st_press_common_probe(struct iio_dev *indio_dev, | 29 | int st_press_common_probe(struct iio_dev *indio_dev); |
30 | struct st_sensors_platform_data *pdata); | ||
31 | void st_press_common_remove(struct iio_dev *indio_dev); | 30 | void st_press_common_remove(struct iio_dev *indio_dev); |
32 | 31 | ||
33 | #ifdef CONFIG_IIO_BUFFER | 32 | #ifdef CONFIG_IIO_BUFFER |
diff --git a/drivers/iio/pressure/st_pressure_buffer.c b/drivers/iio/pressure/st_pressure_buffer.c index b37b1c9ac932..2ff53f222352 100644 --- a/drivers/iio/pressure/st_pressure_buffer.c +++ b/drivers/iio/pressure/st_pressure_buffer.c | |||
@@ -38,10 +38,10 @@ static int st_press_buffer_preenable(struct iio_dev *indio_dev) | |||
38 | static int st_press_buffer_postenable(struct iio_dev *indio_dev) | 38 | static int st_press_buffer_postenable(struct iio_dev *indio_dev) |
39 | { | 39 | { |
40 | int err; | 40 | int err; |
41 | struct st_sensor_data *pdata = iio_priv(indio_dev); | 41 | struct st_sensor_data *press_data = iio_priv(indio_dev); |
42 | 42 | ||
43 | pdata->buffer_data = kmalloc(indio_dev->scan_bytes, GFP_KERNEL); | 43 | press_data->buffer_data = kmalloc(indio_dev->scan_bytes, GFP_KERNEL); |
44 | if (pdata->buffer_data == NULL) { | 44 | if (press_data->buffer_data == NULL) { |
45 | err = -ENOMEM; | 45 | err = -ENOMEM; |
46 | goto allocate_memory_error; | 46 | goto allocate_memory_error; |
47 | } | 47 | } |
@@ -53,7 +53,7 @@ static int st_press_buffer_postenable(struct iio_dev *indio_dev) | |||
53 | return err; | 53 | return err; |
54 | 54 | ||
55 | st_press_buffer_postenable_error: | 55 | st_press_buffer_postenable_error: |
56 | kfree(pdata->buffer_data); | 56 | kfree(press_data->buffer_data); |
57 | allocate_memory_error: | 57 | allocate_memory_error: |
58 | return err; | 58 | return err; |
59 | } | 59 | } |
@@ -61,7 +61,7 @@ allocate_memory_error: | |||
61 | static int st_press_buffer_predisable(struct iio_dev *indio_dev) | 61 | static int st_press_buffer_predisable(struct iio_dev *indio_dev) |
62 | { | 62 | { |
63 | int err; | 63 | int err; |
64 | struct st_sensor_data *pdata = iio_priv(indio_dev); | 64 | struct st_sensor_data *press_data = iio_priv(indio_dev); |
65 | 65 | ||
66 | err = iio_triggered_buffer_predisable(indio_dev); | 66 | err = iio_triggered_buffer_predisable(indio_dev); |
67 | if (err < 0) | 67 | if (err < 0) |
@@ -70,7 +70,7 @@ static int st_press_buffer_predisable(struct iio_dev *indio_dev) | |||
70 | err = st_sensors_set_enable(indio_dev, false); | 70 | err = st_sensors_set_enable(indio_dev, false); |
71 | 71 | ||
72 | st_press_buffer_predisable_error: | 72 | st_press_buffer_predisable_error: |
73 | kfree(pdata->buffer_data); | 73 | kfree(press_data->buffer_data); |
74 | return err; | 74 | return err; |
75 | } | 75 | } |
76 | 76 | ||
diff --git a/drivers/iio/pressure/st_pressure_core.c b/drivers/iio/pressure/st_pressure_core.c index 473d914ef470..97baf40d424b 100644 --- a/drivers/iio/pressure/st_pressure_core.c +++ b/drivers/iio/pressure/st_pressure_core.c | |||
@@ -175,7 +175,7 @@ static const struct iio_chan_spec st_press_lps001wp_channels[] = { | |||
175 | IIO_CHAN_SOFT_TIMESTAMP(1) | 175 | IIO_CHAN_SOFT_TIMESTAMP(1) |
176 | }; | 176 | }; |
177 | 177 | ||
178 | static const struct st_sensors st_press_sensors[] = { | 178 | static const struct st_sensor_settings st_press_sensors_settings[] = { |
179 | { | 179 | { |
180 | .wai = ST_PRESS_LPS331AP_WAI_EXP, | 180 | .wai = ST_PRESS_LPS331AP_WAI_EXP, |
181 | .sensors_supported = { | 181 | .sensors_supported = { |
@@ -333,7 +333,7 @@ static int st_press_read_raw(struct iio_dev *indio_dev, | |||
333 | int *val2, long mask) | 333 | int *val2, long mask) |
334 | { | 334 | { |
335 | int err; | 335 | int err; |
336 | struct st_sensor_data *pdata = iio_priv(indio_dev); | 336 | struct st_sensor_data *press_data = iio_priv(indio_dev); |
337 | 337 | ||
338 | switch (mask) { | 338 | switch (mask) { |
339 | case IIO_CHAN_INFO_RAW: | 339 | case IIO_CHAN_INFO_RAW: |
@@ -347,10 +347,10 @@ static int st_press_read_raw(struct iio_dev *indio_dev, | |||
347 | 347 | ||
348 | switch (ch->type) { | 348 | switch (ch->type) { |
349 | case IIO_PRESSURE: | 349 | case IIO_PRESSURE: |
350 | *val2 = pdata->current_fullscale->gain; | 350 | *val2 = press_data->current_fullscale->gain; |
351 | break; | 351 | break; |
352 | case IIO_TEMP: | 352 | case IIO_TEMP: |
353 | *val2 = pdata->current_fullscale->gain2; | 353 | *val2 = press_data->current_fullscale->gain2; |
354 | break; | 354 | break; |
355 | default: | 355 | default: |
356 | err = -EINVAL; | 356 | err = -EINVAL; |
@@ -371,7 +371,7 @@ static int st_press_read_raw(struct iio_dev *indio_dev, | |||
371 | 371 | ||
372 | return IIO_VAL_FRACTIONAL; | 372 | return IIO_VAL_FRACTIONAL; |
373 | case IIO_CHAN_INFO_SAMP_FREQ: | 373 | case IIO_CHAN_INFO_SAMP_FREQ: |
374 | *val = pdata->odr; | 374 | *val = press_data->odr; |
375 | return IIO_VAL_INT; | 375 | return IIO_VAL_INT; |
376 | default: | 376 | default: |
377 | return -EINVAL; | 377 | return -EINVAL; |
@@ -409,11 +409,10 @@ static const struct iio_trigger_ops st_press_trigger_ops = { | |||
409 | #define ST_PRESS_TRIGGER_OPS NULL | 409 | #define ST_PRESS_TRIGGER_OPS NULL |
410 | #endif | 410 | #endif |
411 | 411 | ||
412 | int st_press_common_probe(struct iio_dev *indio_dev, | 412 | int st_press_common_probe(struct iio_dev *indio_dev) |
413 | struct st_sensors_platform_data *plat_data) | ||
414 | { | 413 | { |
415 | struct st_sensor_data *pdata = iio_priv(indio_dev); | 414 | struct st_sensor_data *press_data = iio_priv(indio_dev); |
416 | int irq = pdata->get_irq_data_ready(indio_dev); | 415 | int irq = press_data->get_irq_data_ready(indio_dev); |
417 | int err; | 416 | int err; |
418 | 417 | ||
419 | indio_dev->modes = INDIO_DIRECT_MODE; | 418 | indio_dev->modes = INDIO_DIRECT_MODE; |
@@ -422,28 +421,30 @@ int st_press_common_probe(struct iio_dev *indio_dev, | |||
422 | st_sensors_power_enable(indio_dev); | 421 | st_sensors_power_enable(indio_dev); |
423 | 422 | ||
424 | err = st_sensors_check_device_support(indio_dev, | 423 | err = st_sensors_check_device_support(indio_dev, |
425 | ARRAY_SIZE(st_press_sensors), | 424 | ARRAY_SIZE(st_press_sensors_settings), |
426 | st_press_sensors); | 425 | st_press_sensors_settings); |
427 | if (err < 0) | 426 | if (err < 0) |
428 | return err; | 427 | return err; |
429 | 428 | ||
430 | pdata->num_data_channels = ST_PRESS_NUMBER_DATA_CHANNELS; | 429 | press_data->num_data_channels = ST_PRESS_NUMBER_DATA_CHANNELS; |
431 | pdata->multiread_bit = pdata->sensor->multi_read_bit; | 430 | press_data->multiread_bit = press_data->sensor_settings->multi_read_bit; |
432 | indio_dev->channels = pdata->sensor->ch; | 431 | indio_dev->channels = press_data->sensor_settings->ch; |
433 | indio_dev->num_channels = pdata->sensor->num_ch; | 432 | indio_dev->num_channels = press_data->sensor_settings->num_ch; |
434 | 433 | ||
435 | if (pdata->sensor->fs.addr != 0) | 434 | if (press_data->sensor_settings->fs.addr != 0) |
436 | pdata->current_fullscale = (struct st_sensor_fullscale_avl *) | 435 | press_data->current_fullscale = |
437 | &pdata->sensor->fs.fs_avl[0]; | 436 | (struct st_sensor_fullscale_avl *) |
437 | &press_data->sensor_settings->fs.fs_avl[0]; | ||
438 | 438 | ||
439 | pdata->odr = pdata->sensor->odr.odr_avl[0].hz; | 439 | press_data->odr = press_data->sensor_settings->odr.odr_avl[0].hz; |
440 | 440 | ||
441 | /* Some devices don't support a data ready pin. */ | 441 | /* Some devices don't support a data ready pin. */ |
442 | if (!plat_data && pdata->sensor->drdy_irq.addr) | 442 | if (!press_data->dev->platform_data && |
443 | plat_data = | 443 | press_data->sensor_settings->drdy_irq.addr) |
444 | press_data->dev->platform_data = | ||
444 | (struct st_sensors_platform_data *)&default_press_pdata; | 445 | (struct st_sensors_platform_data *)&default_press_pdata; |
445 | 446 | ||
446 | err = st_sensors_init_sensor(indio_dev, plat_data); | 447 | err = st_sensors_init_sensor(indio_dev, press_data->dev->platform_data); |
447 | if (err < 0) | 448 | if (err < 0) |
448 | return err; | 449 | return err; |
449 | 450 | ||
@@ -479,12 +480,12 @@ EXPORT_SYMBOL(st_press_common_probe); | |||
479 | 480 | ||
480 | void st_press_common_remove(struct iio_dev *indio_dev) | 481 | void st_press_common_remove(struct iio_dev *indio_dev) |
481 | { | 482 | { |
482 | struct st_sensor_data *pdata = iio_priv(indio_dev); | 483 | struct st_sensor_data *press_data = iio_priv(indio_dev); |
483 | 484 | ||
484 | st_sensors_power_disable(indio_dev); | 485 | st_sensors_power_disable(indio_dev); |
485 | 486 | ||
486 | iio_device_unregister(indio_dev); | 487 | iio_device_unregister(indio_dev); |
487 | if (pdata->get_irq_data_ready(indio_dev) > 0) | 488 | if (press_data->get_irq_data_ready(indio_dev) > 0) |
488 | st_sensors_deallocate_trigger(indio_dev); | 489 | st_sensors_deallocate_trigger(indio_dev); |
489 | 490 | ||
490 | st_press_deallocate_ring(indio_dev); | 491 | st_press_deallocate_ring(indio_dev); |
diff --git a/drivers/iio/pressure/st_pressure_i2c.c b/drivers/iio/pressure/st_pressure_i2c.c index acaf165260bb..137788bba4a3 100644 --- a/drivers/iio/pressure/st_pressure_i2c.c +++ b/drivers/iio/pressure/st_pressure_i2c.c | |||
@@ -43,20 +43,19 @@ static int st_press_i2c_probe(struct i2c_client *client, | |||
43 | const struct i2c_device_id *id) | 43 | const struct i2c_device_id *id) |
44 | { | 44 | { |
45 | struct iio_dev *indio_dev; | 45 | struct iio_dev *indio_dev; |
46 | struct st_sensor_data *pdata; | 46 | struct st_sensor_data *press_data; |
47 | int err; | 47 | int err; |
48 | 48 | ||
49 | indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*pdata)); | 49 | indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*press_data)); |
50 | if (!indio_dev) | 50 | if (!indio_dev) |
51 | return -ENOMEM; | 51 | return -ENOMEM; |
52 | 52 | ||
53 | pdata = iio_priv(indio_dev); | 53 | press_data = iio_priv(indio_dev); |
54 | pdata->dev = &client->dev; | ||
55 | st_sensors_of_i2c_probe(client, st_press_of_match); | 54 | st_sensors_of_i2c_probe(client, st_press_of_match); |
56 | 55 | ||
57 | st_sensors_i2c_configure(indio_dev, client, pdata); | 56 | st_sensors_i2c_configure(indio_dev, client, press_data); |
58 | 57 | ||
59 | err = st_press_common_probe(indio_dev, client->dev.platform_data); | 58 | err = st_press_common_probe(indio_dev); |
60 | if (err < 0) | 59 | if (err < 0) |
61 | return err; | 60 | return err; |
62 | 61 | ||
diff --git a/drivers/iio/pressure/st_pressure_spi.c b/drivers/iio/pressure/st_pressure_spi.c index f45d430ec529..1ffa6d4d349c 100644 --- a/drivers/iio/pressure/st_pressure_spi.c +++ b/drivers/iio/pressure/st_pressure_spi.c | |||
@@ -21,19 +21,18 @@ | |||
21 | static int st_press_spi_probe(struct spi_device *spi) | 21 | static int st_press_spi_probe(struct spi_device *spi) |
22 | { | 22 | { |
23 | struct iio_dev *indio_dev; | 23 | struct iio_dev *indio_dev; |
24 | struct st_sensor_data *pdata; | 24 | struct st_sensor_data *press_data; |
25 | int err; | 25 | int err; |
26 | 26 | ||
27 | indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*pdata)); | 27 | indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*press_data)); |
28 | if (indio_dev == NULL) | 28 | if (indio_dev == NULL) |
29 | return -ENOMEM; | 29 | return -ENOMEM; |
30 | 30 | ||
31 | pdata = iio_priv(indio_dev); | 31 | press_data = iio_priv(indio_dev); |
32 | pdata->dev = &spi->dev; | ||
33 | 32 | ||
34 | st_sensors_spi_configure(indio_dev, spi, pdata); | 33 | st_sensors_spi_configure(indio_dev, spi, press_data); |
35 | 34 | ||
36 | err = st_press_common_probe(indio_dev, spi->dev.platform_data); | 35 | err = st_press_common_probe(indio_dev); |
37 | if (err < 0) | 36 | if (err < 0) |
38 | return err; | 37 | return err; |
39 | 38 | ||
diff --git a/drivers/iio/proximity/as3935.c b/drivers/iio/proximity/as3935.c index 5e780ef206f3..466aa4314667 100644 --- a/drivers/iio/proximity/as3935.c +++ b/drivers/iio/proximity/as3935.c | |||
@@ -95,7 +95,7 @@ static int as3935_read(struct as3935_state *st, unsigned int reg, int *val) | |||
95 | *val = ret; | 95 | *val = ret; |
96 | 96 | ||
97 | return 0; | 97 | return 0; |
98 | }; | 98 | } |
99 | 99 | ||
100 | static int as3935_write(struct as3935_state *st, | 100 | static int as3935_write(struct as3935_state *st, |
101 | unsigned int reg, | 101 | unsigned int reg, |
@@ -107,7 +107,7 @@ static int as3935_write(struct as3935_state *st, | |||
107 | buf[1] = val; | 107 | buf[1] = val; |
108 | 108 | ||
109 | return spi_write(st->spi, buf, 2); | 109 | return spi_write(st->spi, buf, 2); |
110 | }; | 110 | } |
111 | 111 | ||
112 | static ssize_t as3935_sensor_sensitivity_show(struct device *dev, | 112 | static ssize_t as3935_sensor_sensitivity_show(struct device *dev, |
113 | struct device_attribute *attr, | 113 | struct device_attribute *attr, |
@@ -122,7 +122,7 @@ static ssize_t as3935_sensor_sensitivity_show(struct device *dev, | |||
122 | val = (val & AS3935_AFE_MASK) >> 1; | 122 | val = (val & AS3935_AFE_MASK) >> 1; |
123 | 123 | ||
124 | return sprintf(buf, "%d\n", val); | 124 | return sprintf(buf, "%d\n", val); |
125 | }; | 125 | } |
126 | 126 | ||
127 | static ssize_t as3935_sensor_sensitivity_store(struct device *dev, | 127 | static ssize_t as3935_sensor_sensitivity_store(struct device *dev, |
128 | struct device_attribute *attr, | 128 | struct device_attribute *attr, |
@@ -142,7 +142,7 @@ static ssize_t as3935_sensor_sensitivity_store(struct device *dev, | |||
142 | as3935_write(st, AS3935_AFE_GAIN, val << 1); | 142 | as3935_write(st, AS3935_AFE_GAIN, val << 1); |
143 | 143 | ||
144 | return len; | 144 | return len; |
145 | }; | 145 | } |
146 | 146 | ||
147 | static IIO_DEVICE_ATTR(sensor_sensitivity, S_IRUGO | S_IWUSR, | 147 | static IIO_DEVICE_ATTR(sensor_sensitivity, S_IRUGO | S_IWUSR, |
148 | as3935_sensor_sensitivity_show, as3935_sensor_sensitivity_store, 0); | 148 | as3935_sensor_sensitivity_show, as3935_sensor_sensitivity_store, 0); |
@@ -214,7 +214,7 @@ err_read: | |||
214 | iio_trigger_notify_done(indio_dev->trig); | 214 | iio_trigger_notify_done(indio_dev->trig); |
215 | 215 | ||
216 | return IRQ_HANDLED; | 216 | return IRQ_HANDLED; |
217 | }; | 217 | } |
218 | 218 | ||
219 | static const struct iio_trigger_ops iio_interrupt_trigger_ops = { | 219 | static const struct iio_trigger_ops iio_interrupt_trigger_ops = { |
220 | .owner = THIS_MODULE, | 220 | .owner = THIS_MODULE, |
@@ -238,7 +238,7 @@ static void as3935_event_work(struct work_struct *work) | |||
238 | dev_warn(&st->spi->dev, "noise level is too high"); | 238 | dev_warn(&st->spi->dev, "noise level is too high"); |
239 | break; | 239 | break; |
240 | } | 240 | } |
241 | }; | 241 | } |
242 | 242 | ||
243 | static irqreturn_t as3935_interrupt_handler(int irq, void *private) | 243 | static irqreturn_t as3935_interrupt_handler(int irq, void *private) |
244 | { | 244 | { |
@@ -330,7 +330,7 @@ static int as3935_probe(struct spi_device *spi) | |||
330 | return -EINVAL; | 330 | return -EINVAL; |
331 | } | 331 | } |
332 | 332 | ||
333 | indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(st)); | 333 | indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); |
334 | if (!indio_dev) | 334 | if (!indio_dev) |
335 | return -ENOMEM; | 335 | return -ENOMEM; |
336 | 336 | ||
@@ -417,7 +417,7 @@ unregister_trigger: | |||
417 | iio_trigger_unregister(st->trig); | 417 | iio_trigger_unregister(st->trig); |
418 | 418 | ||
419 | return ret; | 419 | return ret; |
420 | }; | 420 | } |
421 | 421 | ||
422 | static int as3935_remove(struct spi_device *spi) | 422 | static int as3935_remove(struct spi_device *spi) |
423 | { | 423 | { |
@@ -429,7 +429,7 @@ static int as3935_remove(struct spi_device *spi) | |||
429 | iio_trigger_unregister(st->trig); | 429 | iio_trigger_unregister(st->trig); |
430 | 430 | ||
431 | return 0; | 431 | return 0; |
432 | }; | 432 | } |
433 | 433 | ||
434 | static const struct spi_device_id as3935_id[] = { | 434 | static const struct spi_device_id as3935_id[] = { |
435 | {"as3935", 0}, | 435 | {"as3935", 0}, |
diff --git a/drivers/iio/trigger/iio-trig-interrupt.c b/drivers/iio/trigger/iio-trig-interrupt.c index 7a149a7822bc..572bc6f02ca8 100644 --- a/drivers/iio/trigger/iio-trig-interrupt.c +++ b/drivers/iio/trigger/iio-trig-interrupt.c | |||
@@ -109,7 +109,6 @@ static struct platform_driver iio_interrupt_trigger_driver = { | |||
109 | .remove = iio_interrupt_trigger_remove, | 109 | .remove = iio_interrupt_trigger_remove, |
110 | .driver = { | 110 | .driver = { |
111 | .name = "iio_interrupt_trigger", | 111 | .name = "iio_interrupt_trigger", |
112 | .owner = THIS_MODULE, | ||
113 | }, | 112 | }, |
114 | }; | 113 | }; |
115 | 114 | ||