1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * mma8452.c - Support for following Freescale / NXP 3-axis accelerometers: 4 * 5 * device name digital output 7-bit I2C slave address (pin selectable) 6 * --------------------------------------------------------------------- 7 * MMA8451Q 14 bit 0x1c / 0x1d 8 * MMA8452Q 12 bit 0x1c / 0x1d 9 * MMA8453Q 10 bit 0x1c / 0x1d 10 * MMA8652FC 12 bit 0x1d 11 * MMA8653FC 10 bit 0x1d 12 * FXLS8471Q 14 bit 0x1e / 0x1d / 0x1c / 0x1f 13 * 14 * Copyright 2015 Martin Kepplinger <martink@posteo.de> 15 * Copyright 2014 Peter Meerwald <pmeerw@pmeerw.net> 16 * 17 * 18 * TODO: orientation events 19 */ 20 21 #include <linux/module.h> 22 #include <linux/i2c.h> 23 #include <linux/iio/iio.h> 24 #include <linux/iio/sysfs.h> 25 #include <linux/iio/buffer.h> 26 #include <linux/iio/trigger.h> 27 #include <linux/iio/trigger_consumer.h> 28 #include <linux/iio/triggered_buffer.h> 29 #include <linux/iio/events.h> 30 #include <linux/delay.h> 31 #include <linux/of_device.h> 32 #include <linux/of_irq.h> 33 #include <linux/pm_runtime.h> 34 35 #define MMA8452_STATUS 0x00 36 #define MMA8452_STATUS_DRDY (BIT(2) | BIT(1) | BIT(0)) 37 #define MMA8452_OUT_X 0x01 /* MSB first */ 38 #define MMA8452_OUT_Y 0x03 39 #define MMA8452_OUT_Z 0x05 40 #define MMA8452_INT_SRC 0x0c 41 #define MMA8452_WHO_AM_I 0x0d 42 #define MMA8452_DATA_CFG 0x0e 43 #define MMA8452_DATA_CFG_FS_MASK GENMASK(1, 0) 44 #define MMA8452_DATA_CFG_FS_2G 0 45 #define MMA8452_DATA_CFG_FS_4G 1 46 #define MMA8452_DATA_CFG_FS_8G 2 47 #define MMA8452_DATA_CFG_HPF_MASK BIT(4) 48 #define MMA8452_HP_FILTER_CUTOFF 0x0f 49 #define MMA8452_HP_FILTER_CUTOFF_SEL_MASK GENMASK(1, 0) 50 #define MMA8452_FF_MT_CFG 0x15 51 #define MMA8452_FF_MT_CFG_OAE BIT(6) 52 #define MMA8452_FF_MT_CFG_ELE BIT(7) 53 #define MMA8452_FF_MT_SRC 0x16 54 #define MMA8452_FF_MT_SRC_XHE BIT(1) 55 #define MMA8452_FF_MT_SRC_YHE BIT(3) 56 #define MMA8452_FF_MT_SRC_ZHE BIT(5) 57 #define MMA8452_FF_MT_THS 0x17 58 #define MMA8452_FF_MT_THS_MASK 0x7f 59 #define MMA8452_FF_MT_COUNT 0x18 60 #define MMA8452_FF_MT_CHAN_SHIFT 3 61 #define MMA8452_TRANSIENT_CFG 0x1d 62 #define MMA8452_TRANSIENT_CFG_CHAN(chan) BIT(chan + 1) 63 #define MMA8452_TRANSIENT_CFG_HPF_BYP BIT(0) 64 #define MMA8452_TRANSIENT_CFG_ELE BIT(4) 65 #define MMA8452_TRANSIENT_SRC 0x1e 66 #define MMA8452_TRANSIENT_SRC_XTRANSE BIT(1) 67 #define MMA8452_TRANSIENT_SRC_YTRANSE BIT(3) 68 #define MMA8452_TRANSIENT_SRC_ZTRANSE BIT(5) 69 #define MMA8452_TRANSIENT_THS 0x1f 70 #define MMA8452_TRANSIENT_THS_MASK GENMASK(6, 0) 71 #define MMA8452_TRANSIENT_COUNT 0x20 72 #define MMA8452_TRANSIENT_CHAN_SHIFT 1 73 #define MMA8452_CTRL_REG1 0x2a 74 #define MMA8452_CTRL_ACTIVE BIT(0) 75 #define MMA8452_CTRL_DR_MASK GENMASK(5, 3) 76 #define MMA8452_CTRL_DR_SHIFT 3 77 #define MMA8452_CTRL_DR_DEFAULT 0x4 /* 50 Hz sample frequency */ 78 #define MMA8452_CTRL_REG2 0x2b 79 #define MMA8452_CTRL_REG2_RST BIT(6) 80 #define MMA8452_CTRL_REG2_MODS_SHIFT 3 81 #define MMA8452_CTRL_REG2_MODS_MASK 0x1b 82 #define MMA8452_CTRL_REG4 0x2d 83 #define MMA8452_CTRL_REG5 0x2e 84 #define MMA8452_OFF_X 0x2f 85 #define MMA8452_OFF_Y 0x30 86 #define MMA8452_OFF_Z 0x31 87 88 #define MMA8452_MAX_REG 0x31 89 90 #define MMA8452_INT_DRDY BIT(0) 91 #define MMA8452_INT_FF_MT BIT(2) 92 #define MMA8452_INT_TRANS BIT(5) 93 94 #define MMA8451_DEVICE_ID 0x1a 95 #define MMA8452_DEVICE_ID 0x2a 96 #define MMA8453_DEVICE_ID 0x3a 97 #define MMA8652_DEVICE_ID 0x4a 98 #define MMA8653_DEVICE_ID 0x5a 99 #define FXLS8471_DEVICE_ID 0x6a 100 101 #define MMA8452_AUTO_SUSPEND_DELAY_MS 2000 102 103 struct mma8452_data { 104 struct i2c_client *client; 105 struct mutex lock; 106 u8 ctrl_reg1; 107 u8 data_cfg; 108 const struct mma_chip_info *chip_info; 109 int sleep_val; 110 }; 111 112 /** 113 * struct mma8452_event_regs - chip specific data related to events 114 * @ev_cfg: event config register address 115 * @ev_cfg_ele: latch bit in event config register 116 * @ev_cfg_chan_shift: number of the bit to enable events in X 117 * direction; in event config register 118 * @ev_src: event source register address 119 * @ev_ths: event threshold register address 120 * @ev_ths_mask: mask for the threshold value 121 * @ev_count: event count (period) register address 122 * 123 * Since not all chips supported by the driver support comparing high pass 124 * filtered data for events (interrupts), different interrupt sources are 125 * used for different chips and the relevant registers are included here. 126 */ 127 struct mma8452_event_regs { 128 u8 ev_cfg; 129 u8 ev_cfg_ele; 130 u8 ev_cfg_chan_shift; 131 u8 ev_src; 132 u8 ev_ths; 133 u8 ev_ths_mask; 134 u8 ev_count; 135 }; 136 137 static const struct mma8452_event_regs ff_mt_ev_regs = { 138 .ev_cfg = MMA8452_FF_MT_CFG, 139 .ev_cfg_ele = MMA8452_FF_MT_CFG_ELE, 140 .ev_cfg_chan_shift = MMA8452_FF_MT_CHAN_SHIFT, 141 .ev_src = MMA8452_FF_MT_SRC, 142 .ev_ths = MMA8452_FF_MT_THS, 143 .ev_ths_mask = MMA8452_FF_MT_THS_MASK, 144 .ev_count = MMA8452_FF_MT_COUNT 145 }; 146 147 static const struct mma8452_event_regs trans_ev_regs = { 148 .ev_cfg = MMA8452_TRANSIENT_CFG, 149 .ev_cfg_ele = MMA8452_TRANSIENT_CFG_ELE, 150 .ev_cfg_chan_shift = MMA8452_TRANSIENT_CHAN_SHIFT, 151 .ev_src = MMA8452_TRANSIENT_SRC, 152 .ev_ths = MMA8452_TRANSIENT_THS, 153 .ev_ths_mask = MMA8452_TRANSIENT_THS_MASK, 154 .ev_count = MMA8452_TRANSIENT_COUNT, 155 }; 156 157 /** 158 * struct mma_chip_info - chip specific data 159 * @chip_id: WHO_AM_I register's value 160 * @channels: struct iio_chan_spec matching the device's 161 * capabilities 162 * @num_channels: number of channels 163 * @mma_scales: scale factors for converting register values 164 * to m/s^2; 3 modes: 2g, 4g, 8g; 2 integers 165 * per mode: m/s^2 and micro m/s^2 166 * @all_events: all events supported by this chip 167 * @enabled_events: event flags enabled and handled by this driver 168 */ 169 struct mma_chip_info { 170 u8 chip_id; 171 const struct iio_chan_spec *channels; 172 int num_channels; 173 const int mma_scales[3][2]; 174 int all_events; 175 int enabled_events; 176 }; 177 178 enum { 179 idx_x, 180 idx_y, 181 idx_z, 182 idx_ts, 183 }; 184 185 static int mma8452_drdy(struct mma8452_data *data) 186 { 187 int tries = 150; 188 189 while (tries-- > 0) { 190 int ret = i2c_smbus_read_byte_data(data->client, 191 MMA8452_STATUS); 192 if (ret < 0) 193 return ret; 194 if ((ret & MMA8452_STATUS_DRDY) == MMA8452_STATUS_DRDY) 195 return 0; 196 197 if (data->sleep_val <= 20) 198 usleep_range(data->sleep_val * 250, 199 data->sleep_val * 500); 200 else 201 msleep(20); 202 } 203 204 dev_err(&data->client->dev, "data not ready\n"); 205 206 return -EIO; 207 } 208 209 static int mma8452_set_runtime_pm_state(struct i2c_client *client, bool on) 210 { 211 #ifdef CONFIG_PM 212 int ret; 213 214 if (on) { 215 ret = pm_runtime_get_sync(&client->dev); 216 } else { 217 pm_runtime_mark_last_busy(&client->dev); 218 ret = pm_runtime_put_autosuspend(&client->dev); 219 } 220 221 if (ret < 0) { 222 dev_err(&client->dev, 223 "failed to change power state to %d\n", on); 224 if (on) 225 pm_runtime_put_noidle(&client->dev); 226 227 return ret; 228 } 229 #endif 230 231 return 0; 232 } 233 234 static int mma8452_read(struct mma8452_data *data, __be16 buf[3]) 235 { 236 int ret = mma8452_drdy(data); 237 238 if (ret < 0) 239 return ret; 240 241 ret = mma8452_set_runtime_pm_state(data->client, true); 242 if (ret) 243 return ret; 244 245 ret = i2c_smbus_read_i2c_block_data(data->client, MMA8452_OUT_X, 246 3 * sizeof(__be16), (u8 *)buf); 247 248 ret = mma8452_set_runtime_pm_state(data->client, false); 249 250 return ret; 251 } 252 253 static ssize_t mma8452_show_int_plus_micros(char *buf, const int (*vals)[2], 254 int n) 255 { 256 size_t len = 0; 257 258 while (n-- > 0) 259 len += scnprintf(buf + len, PAGE_SIZE - len, "%d.%06d ", 260 vals[n][0], vals[n][1]); 261 262 /* replace trailing space by newline */ 263 buf[len - 1] = '\n'; 264 265 return len; 266 } 267 268 static int mma8452_get_int_plus_micros_index(const int (*vals)[2], int n, 269 int val, int val2) 270 { 271 while (n-- > 0) 272 if (val == vals[n][0] && val2 == vals[n][1]) 273 return n; 274 275 return -EINVAL; 276 } 277 278 static unsigned int mma8452_get_odr_index(struct mma8452_data *data) 279 { 280 return (data->ctrl_reg1 & MMA8452_CTRL_DR_MASK) >> 281 MMA8452_CTRL_DR_SHIFT; 282 } 283 284 static const int mma8452_samp_freq[8][2] = { 285 {800, 0}, {400, 0}, {200, 0}, {100, 0}, {50, 0}, {12, 500000}, 286 {6, 250000}, {1, 560000} 287 }; 288 289 /* Datasheet table: step time "Relationship with the ODR" (sample frequency) */ 290 static const unsigned int mma8452_time_step_us[4][8] = { 291 { 1250, 2500, 5000, 10000, 20000, 20000, 20000, 20000 }, /* normal */ 292 { 1250, 2500, 5000, 10000, 20000, 80000, 80000, 80000 }, /* l p l n */ 293 { 1250, 2500, 2500, 2500, 2500, 2500, 2500, 2500 }, /* high res*/ 294 { 1250, 2500, 5000, 10000, 20000, 80000, 160000, 160000 } /* l p */ 295 }; 296 297 /* Datasheet table "High-Pass Filter Cutoff Options" */ 298 static const int mma8452_hp_filter_cutoff[4][8][4][2] = { 299 { /* normal */ 300 { {16, 0}, {8, 0}, {4, 0}, {2, 0} }, /* 800 Hz sample */ 301 { {16, 0}, {8, 0}, {4, 0}, {2, 0} }, /* 400 Hz sample */ 302 { {8, 0}, {4, 0}, {2, 0}, {1, 0} }, /* 200 Hz sample */ 303 { {4, 0}, {2, 0}, {1, 0}, {0, 500000} }, /* 100 Hz sample */ 304 { {2, 0}, {1, 0}, {0, 500000}, {0, 250000} }, /* 50 Hz sample */ 305 { {2, 0}, {1, 0}, {0, 500000}, {0, 250000} }, /* 12.5 Hz sample */ 306 { {2, 0}, {1, 0}, {0, 500000}, {0, 250000} }, /* 6.25 Hz sample */ 307 { {2, 0}, {1, 0}, {0, 500000}, {0, 250000} } /* 1.56 Hz sample */ 308 }, 309 { /* low noise low power */ 310 { {16, 0}, {8, 0}, {4, 0}, {2, 0} }, 311 { {16, 0}, {8, 0}, {4, 0}, {2, 0} }, 312 { {8, 0}, {4, 0}, {2, 0}, {1, 0} }, 313 { {4, 0}, {2, 0}, {1, 0}, {0, 500000} }, 314 { {2, 0}, {1, 0}, {0, 500000}, {0, 250000} }, 315 { {0, 500000}, {0, 250000}, {0, 125000}, {0, 063000} }, 316 { {0, 500000}, {0, 250000}, {0, 125000}, {0, 063000} }, 317 { {0, 500000}, {0, 250000}, {0, 125000}, {0, 063000} } 318 }, 319 { /* high resolution */ 320 { {16, 0}, {8, 0}, {4, 0}, {2, 0} }, 321 { {16, 0}, {8, 0}, {4, 0}, {2, 0} }, 322 { {16, 0}, {8, 0}, {4, 0}, {2, 0} }, 323 { {16, 0}, {8, 0}, {4, 0}, {2, 0} }, 324 { {16, 0}, {8, 0}, {4, 0}, {2, 0} }, 325 { {16, 0}, {8, 0}, {4, 0}, {2, 0} }, 326 { {16, 0}, {8, 0}, {4, 0}, {2, 0} }, 327 { {16, 0}, {8, 0}, {4, 0}, {2, 0} } 328 }, 329 { /* low power */ 330 { {16, 0}, {8, 0}, {4, 0}, {2, 0} }, 331 { {8, 0}, {4, 0}, {2, 0}, {1, 0} }, 332 { {4, 0}, {2, 0}, {1, 0}, {0, 500000} }, 333 { {2, 0}, {1, 0}, {0, 500000}, {0, 250000} }, 334 { {1, 0}, {0, 500000}, {0, 250000}, {0, 125000} }, 335 { {0, 250000}, {0, 125000}, {0, 063000}, {0, 031000} }, 336 { {0, 250000}, {0, 125000}, {0, 063000}, {0, 031000} }, 337 { {0, 250000}, {0, 125000}, {0, 063000}, {0, 031000} } 338 } 339 }; 340 341 /* Datasheet table "MODS Oversampling modes averaging values at each ODR" */ 342 static const u16 mma8452_os_ratio[4][8] = { 343 /* 800 Hz, 400 Hz, ... , 1.56 Hz */ 344 { 2, 4, 4, 4, 4, 16, 32, 128 }, /* normal */ 345 { 2, 4, 4, 4, 4, 4, 8, 32 }, /* low power low noise */ 346 { 2, 4, 8, 16, 32, 128, 256, 1024 }, /* high resolution */ 347 { 2, 2, 2, 2, 2, 2, 4, 16 } /* low power */ 348 }; 349 350 static int mma8452_get_power_mode(struct mma8452_data *data) 351 { 352 int reg; 353 354 reg = i2c_smbus_read_byte_data(data->client, 355 MMA8452_CTRL_REG2); 356 if (reg < 0) 357 return reg; 358 359 return ((reg & MMA8452_CTRL_REG2_MODS_MASK) >> 360 MMA8452_CTRL_REG2_MODS_SHIFT); 361 } 362 363 static ssize_t mma8452_show_samp_freq_avail(struct device *dev, 364 struct device_attribute *attr, 365 char *buf) 366 { 367 return mma8452_show_int_plus_micros(buf, mma8452_samp_freq, 368 ARRAY_SIZE(mma8452_samp_freq)); 369 } 370 371 static ssize_t mma8452_show_scale_avail(struct device *dev, 372 struct device_attribute *attr, 373 char *buf) 374 { 375 struct mma8452_data *data = iio_priv(i2c_get_clientdata( 376 to_i2c_client(dev))); 377 378 return mma8452_show_int_plus_micros(buf, data->chip_info->mma_scales, 379 ARRAY_SIZE(data->chip_info->mma_scales)); 380 } 381 382 static ssize_t mma8452_show_hp_cutoff_avail(struct device *dev, 383 struct device_attribute *attr, 384 char *buf) 385 { 386 struct iio_dev *indio_dev = dev_to_iio_dev(dev); 387 struct mma8452_data *data = iio_priv(indio_dev); 388 int i, j; 389 390 i = mma8452_get_odr_index(data); 391 j = mma8452_get_power_mode(data); 392 if (j < 0) 393 return j; 394 395 return mma8452_show_int_plus_micros(buf, mma8452_hp_filter_cutoff[j][i], 396 ARRAY_SIZE(mma8452_hp_filter_cutoff[0][0])); 397 } 398 399 static ssize_t mma8452_show_os_ratio_avail(struct device *dev, 400 struct device_attribute *attr, 401 char *buf) 402 { 403 struct iio_dev *indio_dev = dev_to_iio_dev(dev); 404 struct mma8452_data *data = iio_priv(indio_dev); 405 int i = mma8452_get_odr_index(data); 406 int j; 407 u16 val = 0; 408 size_t len = 0; 409 410 for (j = 0; j < ARRAY_SIZE(mma8452_os_ratio); j++) { 411 if (val == mma8452_os_ratio[j][i]) 412 continue; 413 414 val = mma8452_os_ratio[j][i]; 415 416 len += scnprintf(buf + len, PAGE_SIZE - len, "%d ", val); 417 } 418 buf[len - 1] = '\n'; 419 420 return len; 421 } 422 423 static IIO_DEV_ATTR_SAMP_FREQ_AVAIL(mma8452_show_samp_freq_avail); 424 static IIO_DEVICE_ATTR(in_accel_scale_available, 0444, 425 mma8452_show_scale_avail, NULL, 0); 426 static IIO_DEVICE_ATTR(in_accel_filter_high_pass_3db_frequency_available, 427 0444, mma8452_show_hp_cutoff_avail, NULL, 0); 428 static IIO_DEVICE_ATTR(in_accel_oversampling_ratio_available, 0444, 429 mma8452_show_os_ratio_avail, NULL, 0); 430 431 static int mma8452_get_samp_freq_index(struct mma8452_data *data, 432 int val, int val2) 433 { 434 return mma8452_get_int_plus_micros_index(mma8452_samp_freq, 435 ARRAY_SIZE(mma8452_samp_freq), 436 val, val2); 437 } 438 439 static int mma8452_get_scale_index(struct mma8452_data *data, int val, int val2) 440 { 441 return mma8452_get_int_plus_micros_index(data->chip_info->mma_scales, 442 ARRAY_SIZE(data->chip_info->mma_scales), val, val2); 443 } 444 445 static int mma8452_get_hp_filter_index(struct mma8452_data *data, 446 int val, int val2) 447 { 448 int i, j; 449 450 i = mma8452_get_odr_index(data); 451 j = mma8452_get_power_mode(data); 452 if (j < 0) 453 return j; 454 455 return mma8452_get_int_plus_micros_index(mma8452_hp_filter_cutoff[j][i], 456 ARRAY_SIZE(mma8452_hp_filter_cutoff[0][0]), val, val2); 457 } 458 459 static int mma8452_read_hp_filter(struct mma8452_data *data, int *hz, int *uHz) 460 { 461 int j, i, ret; 462 463 ret = i2c_smbus_read_byte_data(data->client, MMA8452_HP_FILTER_CUTOFF); 464 if (ret < 0) 465 return ret; 466 467 i = mma8452_get_odr_index(data); 468 j = mma8452_get_power_mode(data); 469 if (j < 0) 470 return j; 471 472 ret &= MMA8452_HP_FILTER_CUTOFF_SEL_MASK; 473 *hz = mma8452_hp_filter_cutoff[j][i][ret][0]; 474 *uHz = mma8452_hp_filter_cutoff[j][i][ret][1]; 475 476 return 0; 477 } 478 479 static int mma8452_read_raw(struct iio_dev *indio_dev, 480 struct iio_chan_spec const *chan, 481 int *val, int *val2, long mask) 482 { 483 struct mma8452_data *data = iio_priv(indio_dev); 484 __be16 buffer[3]; 485 int i, ret; 486 487 switch (mask) { 488 case IIO_CHAN_INFO_RAW: 489 ret = iio_device_claim_direct_mode(indio_dev); 490 if (ret) 491 return ret; 492 493 mutex_lock(&data->lock); 494 ret = mma8452_read(data, buffer); 495 mutex_unlock(&data->lock); 496 iio_device_release_direct_mode(indio_dev); 497 if (ret < 0) 498 return ret; 499 500 *val = sign_extend32(be16_to_cpu( 501 buffer[chan->scan_index]) >> chan->scan_type.shift, 502 chan->scan_type.realbits - 1); 503 504 return IIO_VAL_INT; 505 case IIO_CHAN_INFO_SCALE: 506 i = data->data_cfg & MMA8452_DATA_CFG_FS_MASK; 507 *val = data->chip_info->mma_scales[i][0]; 508 *val2 = data->chip_info->mma_scales[i][1]; 509 510 return IIO_VAL_INT_PLUS_MICRO; 511 case IIO_CHAN_INFO_SAMP_FREQ: 512 i = mma8452_get_odr_index(data); 513 *val = mma8452_samp_freq[i][0]; 514 *val2 = mma8452_samp_freq[i][1]; 515 516 return IIO_VAL_INT_PLUS_MICRO; 517 case IIO_CHAN_INFO_CALIBBIAS: 518 ret = i2c_smbus_read_byte_data(data->client, 519 MMA8452_OFF_X + 520 chan->scan_index); 521 if (ret < 0) 522 return ret; 523 524 *val = sign_extend32(ret, 7); 525 526 return IIO_VAL_INT; 527 case IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY: 528 if (data->data_cfg & MMA8452_DATA_CFG_HPF_MASK) { 529 ret = mma8452_read_hp_filter(data, val, val2); 530 if (ret < 0) 531 return ret; 532 } else { 533 *val = 0; 534 *val2 = 0; 535 } 536 537 return IIO_VAL_INT_PLUS_MICRO; 538 case IIO_CHAN_INFO_OVERSAMPLING_RATIO: 539 ret = mma8452_get_power_mode(data); 540 if (ret < 0) 541 return ret; 542 543 i = mma8452_get_odr_index(data); 544 545 *val = mma8452_os_ratio[ret][i]; 546 return IIO_VAL_INT; 547 } 548 549 return -EINVAL; 550 } 551 552 static int mma8452_calculate_sleep(struct mma8452_data *data) 553 { 554 int ret, i = mma8452_get_odr_index(data); 555 556 if (mma8452_samp_freq[i][0] > 0) 557 ret = 1000 / mma8452_samp_freq[i][0]; 558 else 559 ret = 1000; 560 561 return ret == 0 ? 1 : ret; 562 } 563 564 static int mma8452_standby(struct mma8452_data *data) 565 { 566 return i2c_smbus_write_byte_data(data->client, MMA8452_CTRL_REG1, 567 data->ctrl_reg1 & ~MMA8452_CTRL_ACTIVE); 568 } 569 570 static int mma8452_active(struct mma8452_data *data) 571 { 572 return i2c_smbus_write_byte_data(data->client, MMA8452_CTRL_REG1, 573 data->ctrl_reg1); 574 } 575 576 /* returns >0 if active, 0 if in standby and <0 on error */ 577 static int mma8452_is_active(struct mma8452_data *data) 578 { 579 int reg; 580 581 reg = i2c_smbus_read_byte_data(data->client, MMA8452_CTRL_REG1); 582 if (reg < 0) 583 return reg; 584 585 return reg & MMA8452_CTRL_ACTIVE; 586 } 587 588 static int mma8452_change_config(struct mma8452_data *data, u8 reg, u8 val) 589 { 590 int ret; 591 int is_active; 592 593 mutex_lock(&data->lock); 594 595 is_active = mma8452_is_active(data); 596 if (is_active < 0) { 597 ret = is_active; 598 goto fail; 599 } 600 601 /* config can only be changed when in standby */ 602 if (is_active > 0) { 603 ret = mma8452_standby(data); 604 if (ret < 0) 605 goto fail; 606 } 607 608 ret = i2c_smbus_write_byte_data(data->client, reg, val); 609 if (ret < 0) 610 goto fail; 611 612 if (is_active > 0) { 613 ret = mma8452_active(data); 614 if (ret < 0) 615 goto fail; 616 } 617 618 ret = 0; 619 fail: 620 mutex_unlock(&data->lock); 621 622 return ret; 623 } 624 625 static int mma8452_set_power_mode(struct mma8452_data *data, u8 mode) 626 { 627 int reg; 628 629 reg = i2c_smbus_read_byte_data(data->client, 630 MMA8452_CTRL_REG2); 631 if (reg < 0) 632 return reg; 633 634 reg &= ~MMA8452_CTRL_REG2_MODS_MASK; 635 reg |= mode << MMA8452_CTRL_REG2_MODS_SHIFT; 636 637 return mma8452_change_config(data, MMA8452_CTRL_REG2, reg); 638 } 639 640 /* returns >0 if in freefall mode, 0 if not or <0 if an error occurred */ 641 static int mma8452_freefall_mode_enabled(struct mma8452_data *data) 642 { 643 int val; 644 645 val = i2c_smbus_read_byte_data(data->client, MMA8452_FF_MT_CFG); 646 if (val < 0) 647 return val; 648 649 return !(val & MMA8452_FF_MT_CFG_OAE); 650 } 651 652 static int mma8452_set_freefall_mode(struct mma8452_data *data, bool state) 653 { 654 int val; 655 656 if ((state && mma8452_freefall_mode_enabled(data)) || 657 (!state && !(mma8452_freefall_mode_enabled(data)))) 658 return 0; 659 660 val = i2c_smbus_read_byte_data(data->client, MMA8452_FF_MT_CFG); 661 if (val < 0) 662 return val; 663 664 if (state) { 665 val |= BIT(idx_x + MMA8452_FF_MT_CHAN_SHIFT); 666 val |= BIT(idx_y + MMA8452_FF_MT_CHAN_SHIFT); 667 val |= BIT(idx_z + MMA8452_FF_MT_CHAN_SHIFT); 668 val &= ~MMA8452_FF_MT_CFG_OAE; 669 } else { 670 val &= ~BIT(idx_x + MMA8452_FF_MT_CHAN_SHIFT); 671 val &= ~BIT(idx_y + MMA8452_FF_MT_CHAN_SHIFT); 672 val &= ~BIT(idx_z + MMA8452_FF_MT_CHAN_SHIFT); 673 val |= MMA8452_FF_MT_CFG_OAE; 674 } 675 676 return mma8452_change_config(data, MMA8452_FF_MT_CFG, val); 677 } 678 679 static int mma8452_set_hp_filter_frequency(struct mma8452_data *data, 680 int val, int val2) 681 { 682 int i, reg; 683 684 i = mma8452_get_hp_filter_index(data, val, val2); 685 if (i < 0) 686 return i; 687 688 reg = i2c_smbus_read_byte_data(data->client, 689 MMA8452_HP_FILTER_CUTOFF); 690 if (reg < 0) 691 return reg; 692 693 reg &= ~MMA8452_HP_FILTER_CUTOFF_SEL_MASK; 694 reg |= i; 695 696 return mma8452_change_config(data, MMA8452_HP_FILTER_CUTOFF, reg); 697 } 698 699 static int mma8452_write_raw(struct iio_dev *indio_dev, 700 struct iio_chan_spec const *chan, 701 int val, int val2, long mask) 702 { 703 struct mma8452_data *data = iio_priv(indio_dev); 704 int i, ret; 705 706 ret = iio_device_claim_direct_mode(indio_dev); 707 if (ret) 708 return ret; 709 710 switch (mask) { 711 case IIO_CHAN_INFO_SAMP_FREQ: 712 i = mma8452_get_samp_freq_index(data, val, val2); 713 if (i < 0) { 714 ret = i; 715 break; 716 } 717 data->ctrl_reg1 &= ~MMA8452_CTRL_DR_MASK; 718 data->ctrl_reg1 |= i << MMA8452_CTRL_DR_SHIFT; 719 720 data->sleep_val = mma8452_calculate_sleep(data); 721 722 ret = mma8452_change_config(data, MMA8452_CTRL_REG1, 723 data->ctrl_reg1); 724 break; 725 case IIO_CHAN_INFO_SCALE: 726 i = mma8452_get_scale_index(data, val, val2); 727 if (i < 0) { 728 ret = i; 729 break; 730 } 731 732 data->data_cfg &= ~MMA8452_DATA_CFG_FS_MASK; 733 data->data_cfg |= i; 734 735 ret = mma8452_change_config(data, MMA8452_DATA_CFG, 736 data->data_cfg); 737 break; 738 case IIO_CHAN_INFO_CALIBBIAS: 739 if (val < -128 || val > 127) { 740 ret = -EINVAL; 741 break; 742 } 743 744 ret = mma8452_change_config(data, 745 MMA8452_OFF_X + chan->scan_index, 746 val); 747 break; 748 749 case IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY: 750 if (val == 0 && val2 == 0) { 751 data->data_cfg &= ~MMA8452_DATA_CFG_HPF_MASK; 752 } else { 753 data->data_cfg |= MMA8452_DATA_CFG_HPF_MASK; 754 ret = mma8452_set_hp_filter_frequency(data, val, val2); 755 if (ret < 0) 756 break; 757 } 758 759 ret = mma8452_change_config(data, MMA8452_DATA_CFG, 760 data->data_cfg); 761 break; 762 763 case IIO_CHAN_INFO_OVERSAMPLING_RATIO: 764 ret = mma8452_get_odr_index(data); 765 766 for (i = 0; i < ARRAY_SIZE(mma8452_os_ratio); i++) { 767 if (mma8452_os_ratio[i][ret] == val) { 768 ret = mma8452_set_power_mode(data, i); 769 break; 770 } 771 } 772 break; 773 default: 774 ret = -EINVAL; 775 break; 776 } 777 778 iio_device_release_direct_mode(indio_dev); 779 return ret; 780 } 781 782 static int mma8452_get_event_regs(struct mma8452_data *data, 783 const struct iio_chan_spec *chan, enum iio_event_direction dir, 784 const struct mma8452_event_regs **ev_reg) 785 { 786 if (!chan) 787 return -EINVAL; 788 789 switch (chan->type) { 790 case IIO_ACCEL: 791 switch (dir) { 792 case IIO_EV_DIR_RISING: 793 if ((data->chip_info->all_events 794 & MMA8452_INT_TRANS) && 795 (data->chip_info->enabled_events 796 & MMA8452_INT_TRANS)) 797 *ev_reg = &trans_ev_regs; 798 else 799 *ev_reg = &ff_mt_ev_regs; 800 return 0; 801 case IIO_EV_DIR_FALLING: 802 *ev_reg = &ff_mt_ev_regs; 803 return 0; 804 default: 805 return -EINVAL; 806 } 807 default: 808 return -EINVAL; 809 } 810 } 811 812 static int mma8452_read_event_value(struct iio_dev *indio_dev, 813 const struct iio_chan_spec *chan, 814 enum iio_event_type type, 815 enum iio_event_direction dir, 816 enum iio_event_info info, 817 int *val, int *val2) 818 { 819 struct mma8452_data *data = iio_priv(indio_dev); 820 int ret, us, power_mode; 821 const struct mma8452_event_regs *ev_regs; 822 823 ret = mma8452_get_event_regs(data, chan, dir, &ev_regs); 824 if (ret) 825 return ret; 826 827 switch (info) { 828 case IIO_EV_INFO_VALUE: 829 ret = i2c_smbus_read_byte_data(data->client, ev_regs->ev_ths); 830 if (ret < 0) 831 return ret; 832 833 *val = ret & ev_regs->ev_ths_mask; 834 835 return IIO_VAL_INT; 836 837 case IIO_EV_INFO_PERIOD: 838 ret = i2c_smbus_read_byte_data(data->client, ev_regs->ev_count); 839 if (ret < 0) 840 return ret; 841 842 power_mode = mma8452_get_power_mode(data); 843 if (power_mode < 0) 844 return power_mode; 845 846 us = ret * mma8452_time_step_us[power_mode][ 847 mma8452_get_odr_index(data)]; 848 *val = us / USEC_PER_SEC; 849 *val2 = us % USEC_PER_SEC; 850 851 return IIO_VAL_INT_PLUS_MICRO; 852 853 case IIO_EV_INFO_HIGH_PASS_FILTER_3DB: 854 ret = i2c_smbus_read_byte_data(data->client, 855 MMA8452_TRANSIENT_CFG); 856 if (ret < 0) 857 return ret; 858 859 if (ret & MMA8452_TRANSIENT_CFG_HPF_BYP) { 860 *val = 0; 861 *val2 = 0; 862 } else { 863 ret = mma8452_read_hp_filter(data, val, val2); 864 if (ret < 0) 865 return ret; 866 } 867 868 return IIO_VAL_INT_PLUS_MICRO; 869 870 default: 871 return -EINVAL; 872 } 873 } 874 875 static int mma8452_write_event_value(struct iio_dev *indio_dev, 876 const struct iio_chan_spec *chan, 877 enum iio_event_type type, 878 enum iio_event_direction dir, 879 enum iio_event_info info, 880 int val, int val2) 881 { 882 struct mma8452_data *data = iio_priv(indio_dev); 883 int ret, reg, steps; 884 const struct mma8452_event_regs *ev_regs; 885 886 ret = mma8452_get_event_regs(data, chan, dir, &ev_regs); 887 if (ret) 888 return ret; 889 890 switch (info) { 891 case IIO_EV_INFO_VALUE: 892 if (val < 0 || val > ev_regs->ev_ths_mask) 893 return -EINVAL; 894 895 return mma8452_change_config(data, ev_regs->ev_ths, val); 896 897 case IIO_EV_INFO_PERIOD: 898 ret = mma8452_get_power_mode(data); 899 if (ret < 0) 900 return ret; 901 902 steps = (val * USEC_PER_SEC + val2) / 903 mma8452_time_step_us[ret][ 904 mma8452_get_odr_index(data)]; 905 906 if (steps < 0 || steps > 0xff) 907 return -EINVAL; 908 909 return mma8452_change_config(data, ev_regs->ev_count, steps); 910 911 case IIO_EV_INFO_HIGH_PASS_FILTER_3DB: 912 reg = i2c_smbus_read_byte_data(data->client, 913 MMA8452_TRANSIENT_CFG); 914 if (reg < 0) 915 return reg; 916 917 if (val == 0 && val2 == 0) { 918 reg |= MMA8452_TRANSIENT_CFG_HPF_BYP; 919 } else { 920 reg &= ~MMA8452_TRANSIENT_CFG_HPF_BYP; 921 ret = mma8452_set_hp_filter_frequency(data, val, val2); 922 if (ret < 0) 923 return ret; 924 } 925 926 return mma8452_change_config(data, MMA8452_TRANSIENT_CFG, reg); 927 928 default: 929 return -EINVAL; 930 } 931 } 932 933 static int mma8452_read_event_config(struct iio_dev *indio_dev, 934 const struct iio_chan_spec *chan, 935 enum iio_event_type type, 936 enum iio_event_direction dir) 937 { 938 struct mma8452_data *data = iio_priv(indio_dev); 939 int ret; 940 const struct mma8452_event_regs *ev_regs; 941 942 ret = mma8452_get_event_regs(data, chan, dir, &ev_regs); 943 if (ret) 944 return ret; 945 946 switch (dir) { 947 case IIO_EV_DIR_FALLING: 948 return mma8452_freefall_mode_enabled(data); 949 case IIO_EV_DIR_RISING: 950 ret = i2c_smbus_read_byte_data(data->client, 951 ev_regs->ev_cfg); 952 if (ret < 0) 953 return ret; 954 955 return !!(ret & BIT(chan->scan_index + 956 ev_regs->ev_cfg_chan_shift)); 957 default: 958 return -EINVAL; 959 } 960 } 961 962 static int mma8452_write_event_config(struct iio_dev *indio_dev, 963 const struct iio_chan_spec *chan, 964 enum iio_event_type type, 965 enum iio_event_direction dir, 966 int state) 967 { 968 struct mma8452_data *data = iio_priv(indio_dev); 969 int val, ret; 970 const struct mma8452_event_regs *ev_regs; 971 972 ret = mma8452_get_event_regs(data, chan, dir, &ev_regs); 973 if (ret) 974 return ret; 975 976 ret = mma8452_set_runtime_pm_state(data->client, state); 977 if (ret) 978 return ret; 979 980 switch (dir) { 981 case IIO_EV_DIR_FALLING: 982 return mma8452_set_freefall_mode(data, state); 983 case IIO_EV_DIR_RISING: 984 val = i2c_smbus_read_byte_data(data->client, ev_regs->ev_cfg); 985 if (val < 0) 986 return val; 987 988 if (state) { 989 if (mma8452_freefall_mode_enabled(data)) { 990 val &= ~BIT(idx_x + ev_regs->ev_cfg_chan_shift); 991 val &= ~BIT(idx_y + ev_regs->ev_cfg_chan_shift); 992 val &= ~BIT(idx_z + ev_regs->ev_cfg_chan_shift); 993 val |= MMA8452_FF_MT_CFG_OAE; 994 } 995 val |= BIT(chan->scan_index + 996 ev_regs->ev_cfg_chan_shift); 997 } else { 998 if (mma8452_freefall_mode_enabled(data)) 999 return 0; 1000 1001 val &= ~BIT(chan->scan_index + 1002 ev_regs->ev_cfg_chan_shift); 1003 } 1004 1005 val |= ev_regs->ev_cfg_ele; 1006 1007 return mma8452_change_config(data, ev_regs->ev_cfg, val); 1008 default: 1009 return -EINVAL; 1010 } 1011 } 1012 1013 static void mma8452_transient_interrupt(struct iio_dev *indio_dev) 1014 { 1015 struct mma8452_data *data = iio_priv(indio_dev); 1016 s64 ts = iio_get_time_ns(indio_dev); 1017 int src; 1018 1019 src = i2c_smbus_read_byte_data(data->client, MMA8452_TRANSIENT_SRC); 1020 if (src < 0) 1021 return; 1022 1023 if (src & MMA8452_TRANSIENT_SRC_XTRANSE) 1024 iio_push_event(indio_dev, 1025 IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_X, 1026 IIO_EV_TYPE_MAG, 1027 IIO_EV_DIR_RISING), 1028 ts); 1029 1030 if (src & MMA8452_TRANSIENT_SRC_YTRANSE) 1031 iio_push_event(indio_dev, 1032 IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_Y, 1033 IIO_EV_TYPE_MAG, 1034 IIO_EV_DIR_RISING), 1035 ts); 1036 1037 if (src & MMA8452_TRANSIENT_SRC_ZTRANSE) 1038 iio_push_event(indio_dev, 1039 IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_Z, 1040 IIO_EV_TYPE_MAG, 1041 IIO_EV_DIR_RISING), 1042 ts); 1043 } 1044 1045 static irqreturn_t mma8452_interrupt(int irq, void *p) 1046 { 1047 struct iio_dev *indio_dev = p; 1048 struct mma8452_data *data = iio_priv(indio_dev); 1049 int ret = IRQ_NONE; 1050 int src; 1051 1052 src = i2c_smbus_read_byte_data(data->client, MMA8452_INT_SRC); 1053 if (src < 0) 1054 return IRQ_NONE; 1055 1056 if (!(src & (data->chip_info->enabled_events | MMA8452_INT_DRDY))) 1057 return IRQ_NONE; 1058 1059 if (src & MMA8452_INT_DRDY) { 1060 iio_trigger_poll_chained(indio_dev->trig); 1061 ret = IRQ_HANDLED; 1062 } 1063 1064 if (src & MMA8452_INT_FF_MT) { 1065 if (mma8452_freefall_mode_enabled(data)) { 1066 s64 ts = iio_get_time_ns(indio_dev); 1067 1068 iio_push_event(indio_dev, 1069 IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, 1070 IIO_MOD_X_AND_Y_AND_Z, 1071 IIO_EV_TYPE_MAG, 1072 IIO_EV_DIR_FALLING), 1073 ts); 1074 } 1075 ret = IRQ_HANDLED; 1076 } 1077 1078 if (src & MMA8452_INT_TRANS) { 1079 mma8452_transient_interrupt(indio_dev); 1080 ret = IRQ_HANDLED; 1081 } 1082 1083 return ret; 1084 } 1085 1086 static irqreturn_t mma8452_trigger_handler(int irq, void *p) 1087 { 1088 struct iio_poll_func *pf = p; 1089 struct iio_dev *indio_dev = pf->indio_dev; 1090 struct mma8452_data *data = iio_priv(indio_dev); 1091 u8 buffer[16]; /* 3 16-bit channels + padding + ts */ 1092 int ret; 1093 1094 ret = mma8452_read(data, (__be16 *)buffer); 1095 if (ret < 0) 1096 goto done; 1097 1098 iio_push_to_buffers_with_timestamp(indio_dev, buffer, 1099 iio_get_time_ns(indio_dev)); 1100 1101 done: 1102 iio_trigger_notify_done(indio_dev->trig); 1103 1104 return IRQ_HANDLED; 1105 } 1106 1107 static int mma8452_reg_access_dbg(struct iio_dev *indio_dev, 1108 unsigned int reg, unsigned int writeval, 1109 unsigned int *readval) 1110 { 1111 int ret; 1112 struct mma8452_data *data = iio_priv(indio_dev); 1113 1114 if (reg > MMA8452_MAX_REG) 1115 return -EINVAL; 1116 1117 if (!readval) 1118 return mma8452_change_config(data, reg, writeval); 1119 1120 ret = i2c_smbus_read_byte_data(data->client, reg); 1121 if (ret < 0) 1122 return ret; 1123 1124 *readval = ret; 1125 1126 return 0; 1127 } 1128 1129 static const struct iio_event_spec mma8452_freefall_event[] = { 1130 { 1131 .type = IIO_EV_TYPE_MAG, 1132 .dir = IIO_EV_DIR_FALLING, 1133 .mask_separate = BIT(IIO_EV_INFO_ENABLE), 1134 .mask_shared_by_type = BIT(IIO_EV_INFO_VALUE) | 1135 BIT(IIO_EV_INFO_PERIOD) | 1136 BIT(IIO_EV_INFO_HIGH_PASS_FILTER_3DB) 1137 }, 1138 }; 1139 1140 static const struct iio_event_spec mma8652_freefall_event[] = { 1141 { 1142 .type = IIO_EV_TYPE_MAG, 1143 .dir = IIO_EV_DIR_FALLING, 1144 .mask_separate = BIT(IIO_EV_INFO_ENABLE), 1145 .mask_shared_by_type = BIT(IIO_EV_INFO_VALUE) | 1146 BIT(IIO_EV_INFO_PERIOD) 1147 }, 1148 }; 1149 1150 static const struct iio_event_spec mma8452_transient_event[] = { 1151 { 1152 .type = IIO_EV_TYPE_MAG, 1153 .dir = IIO_EV_DIR_RISING, 1154 .mask_separate = BIT(IIO_EV_INFO_ENABLE), 1155 .mask_shared_by_type = BIT(IIO_EV_INFO_VALUE) | 1156 BIT(IIO_EV_INFO_PERIOD) | 1157 BIT(IIO_EV_INFO_HIGH_PASS_FILTER_3DB) 1158 }, 1159 }; 1160 1161 static const struct iio_event_spec mma8452_motion_event[] = { 1162 { 1163 .type = IIO_EV_TYPE_MAG, 1164 .dir = IIO_EV_DIR_RISING, 1165 .mask_separate = BIT(IIO_EV_INFO_ENABLE), 1166 .mask_shared_by_type = BIT(IIO_EV_INFO_VALUE) | 1167 BIT(IIO_EV_INFO_PERIOD) 1168 }, 1169 }; 1170 1171 /* 1172 * Threshold is configured in fixed 8G/127 steps regardless of 1173 * currently selected scale for measurement. 1174 */ 1175 static IIO_CONST_ATTR_NAMED(accel_transient_scale, in_accel_scale, "0.617742"); 1176 1177 static struct attribute *mma8452_event_attributes[] = { 1178 &iio_const_attr_accel_transient_scale.dev_attr.attr, 1179 NULL, 1180 }; 1181 1182 static struct attribute_group mma8452_event_attribute_group = { 1183 .attrs = mma8452_event_attributes, 1184 }; 1185 1186 #define MMA8452_FREEFALL_CHANNEL(modifier) { \ 1187 .type = IIO_ACCEL, \ 1188 .modified = 1, \ 1189 .channel2 = modifier, \ 1190 .scan_index = -1, \ 1191 .event_spec = mma8452_freefall_event, \ 1192 .num_event_specs = ARRAY_SIZE(mma8452_freefall_event), \ 1193 } 1194 1195 #define MMA8652_FREEFALL_CHANNEL(modifier) { \ 1196 .type = IIO_ACCEL, \ 1197 .modified = 1, \ 1198 .channel2 = modifier, \ 1199 .scan_index = -1, \ 1200 .event_spec = mma8652_freefall_event, \ 1201 .num_event_specs = ARRAY_SIZE(mma8652_freefall_event), \ 1202 } 1203 1204 #define MMA8452_CHANNEL(axis, idx, bits) { \ 1205 .type = IIO_ACCEL, \ 1206 .modified = 1, \ 1207 .channel2 = IIO_MOD_##axis, \ 1208 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ 1209 BIT(IIO_CHAN_INFO_CALIBBIAS), \ 1210 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SAMP_FREQ) | \ 1211 BIT(IIO_CHAN_INFO_SCALE) | \ 1212 BIT(IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY) | \ 1213 BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), \ 1214 .scan_index = idx, \ 1215 .scan_type = { \ 1216 .sign = 's', \ 1217 .realbits = (bits), \ 1218 .storagebits = 16, \ 1219 .shift = 16 - (bits), \ 1220 .endianness = IIO_BE, \ 1221 }, \ 1222 .event_spec = mma8452_transient_event, \ 1223 .num_event_specs = ARRAY_SIZE(mma8452_transient_event), \ 1224 } 1225 1226 #define MMA8652_CHANNEL(axis, idx, bits) { \ 1227 .type = IIO_ACCEL, \ 1228 .modified = 1, \ 1229 .channel2 = IIO_MOD_##axis, \ 1230 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ 1231 BIT(IIO_CHAN_INFO_CALIBBIAS), \ 1232 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SAMP_FREQ) | \ 1233 BIT(IIO_CHAN_INFO_SCALE) | \ 1234 BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), \ 1235 .scan_index = idx, \ 1236 .scan_type = { \ 1237 .sign = 's', \ 1238 .realbits = (bits), \ 1239 .storagebits = 16, \ 1240 .shift = 16 - (bits), \ 1241 .endianness = IIO_BE, \ 1242 }, \ 1243 .event_spec = mma8452_motion_event, \ 1244 .num_event_specs = ARRAY_SIZE(mma8452_motion_event), \ 1245 } 1246 1247 static const struct iio_chan_spec mma8451_channels[] = { 1248 MMA8452_CHANNEL(X, idx_x, 14), 1249 MMA8452_CHANNEL(Y, idx_y, 14), 1250 MMA8452_CHANNEL(Z, idx_z, 14), 1251 IIO_CHAN_SOFT_TIMESTAMP(idx_ts), 1252 MMA8452_FREEFALL_CHANNEL(IIO_MOD_X_AND_Y_AND_Z), 1253 }; 1254 1255 static const struct iio_chan_spec mma8452_channels[] = { 1256 MMA8452_CHANNEL(X, idx_x, 12), 1257 MMA8452_CHANNEL(Y, idx_y, 12), 1258 MMA8452_CHANNEL(Z, idx_z, 12), 1259 IIO_CHAN_SOFT_TIMESTAMP(idx_ts), 1260 MMA8452_FREEFALL_CHANNEL(IIO_MOD_X_AND_Y_AND_Z), 1261 }; 1262 1263 static const struct iio_chan_spec mma8453_channels[] = { 1264 MMA8452_CHANNEL(X, idx_x, 10), 1265 MMA8452_CHANNEL(Y, idx_y, 10), 1266 MMA8452_CHANNEL(Z, idx_z, 10), 1267 IIO_CHAN_SOFT_TIMESTAMP(idx_ts), 1268 MMA8452_FREEFALL_CHANNEL(IIO_MOD_X_AND_Y_AND_Z), 1269 }; 1270 1271 static const struct iio_chan_spec mma8652_channels[] = { 1272 MMA8652_CHANNEL(X, idx_x, 12), 1273 MMA8652_CHANNEL(Y, idx_y, 12), 1274 MMA8652_CHANNEL(Z, idx_z, 12), 1275 IIO_CHAN_SOFT_TIMESTAMP(idx_ts), 1276 MMA8652_FREEFALL_CHANNEL(IIO_MOD_X_AND_Y_AND_Z), 1277 }; 1278 1279 static const struct iio_chan_spec mma8653_channels[] = { 1280 MMA8652_CHANNEL(X, idx_x, 10), 1281 MMA8652_CHANNEL(Y, idx_y, 10), 1282 MMA8652_CHANNEL(Z, idx_z, 10), 1283 IIO_CHAN_SOFT_TIMESTAMP(idx_ts), 1284 MMA8652_FREEFALL_CHANNEL(IIO_MOD_X_AND_Y_AND_Z), 1285 }; 1286 1287 enum { 1288 mma8451, 1289 mma8452, 1290 mma8453, 1291 mma8652, 1292 mma8653, 1293 fxls8471, 1294 }; 1295 1296 static const struct mma_chip_info mma_chip_info_table[] = { 1297 [mma8451] = { 1298 .chip_id = MMA8451_DEVICE_ID, 1299 .channels = mma8451_channels, 1300 .num_channels = ARRAY_SIZE(mma8451_channels), 1301 /* 1302 * Hardware has fullscale of -2G, -4G, -8G corresponding to 1303 * raw value -8192 for 14 bit, -2048 for 12 bit or -512 for 10 1304 * bit. 1305 * The userspace interface uses m/s^2 and we declare micro units 1306 * So scale factor for 12 bit here is given by: 1307 * g * N * 1000000 / 2048 for N = 2, 4, 8 and g=9.80665 1308 */ 1309 .mma_scales = { {0, 2394}, {0, 4788}, {0, 9577} }, 1310 /* 1311 * Although we enable the interrupt sources once and for 1312 * all here the event detection itself is not enabled until 1313 * userspace asks for it by mma8452_write_event_config() 1314 */ 1315 .all_events = MMA8452_INT_DRDY | 1316 MMA8452_INT_TRANS | 1317 MMA8452_INT_FF_MT, 1318 .enabled_events = MMA8452_INT_TRANS | 1319 MMA8452_INT_FF_MT, 1320 }, 1321 [mma8452] = { 1322 .chip_id = MMA8452_DEVICE_ID, 1323 .channels = mma8452_channels, 1324 .num_channels = ARRAY_SIZE(mma8452_channels), 1325 .mma_scales = { {0, 9577}, {0, 19154}, {0, 38307} }, 1326 /* 1327 * Although we enable the interrupt sources once and for 1328 * all here the event detection itself is not enabled until 1329 * userspace asks for it by mma8452_write_event_config() 1330 */ 1331 .all_events = MMA8452_INT_DRDY | 1332 MMA8452_INT_TRANS | 1333 MMA8452_INT_FF_MT, 1334 .enabled_events = MMA8452_INT_TRANS | 1335 MMA8452_INT_FF_MT, 1336 }, 1337 [mma8453] = { 1338 .chip_id = MMA8453_DEVICE_ID, 1339 .channels = mma8453_channels, 1340 .num_channels = ARRAY_SIZE(mma8453_channels), 1341 .mma_scales = { {0, 38307}, {0, 76614}, {0, 153228} }, 1342 /* 1343 * Although we enable the interrupt sources once and for 1344 * all here the event detection itself is not enabled until 1345 * userspace asks for it by mma8452_write_event_config() 1346 */ 1347 .all_events = MMA8452_INT_DRDY | 1348 MMA8452_INT_TRANS | 1349 MMA8452_INT_FF_MT, 1350 .enabled_events = MMA8452_INT_TRANS | 1351 MMA8452_INT_FF_MT, 1352 }, 1353 [mma8652] = { 1354 .chip_id = MMA8652_DEVICE_ID, 1355 .channels = mma8652_channels, 1356 .num_channels = ARRAY_SIZE(mma8652_channels), 1357 .mma_scales = { {0, 9577}, {0, 19154}, {0, 38307} }, 1358 .all_events = MMA8452_INT_DRDY | 1359 MMA8452_INT_FF_MT, 1360 .enabled_events = MMA8452_INT_FF_MT, 1361 }, 1362 [mma8653] = { 1363 .chip_id = MMA8653_DEVICE_ID, 1364 .channels = mma8653_channels, 1365 .num_channels = ARRAY_SIZE(mma8653_channels), 1366 .mma_scales = { {0, 38307}, {0, 76614}, {0, 153228} }, 1367 /* 1368 * Although we enable the interrupt sources once and for 1369 * all here the event detection itself is not enabled until 1370 * userspace asks for it by mma8452_write_event_config() 1371 */ 1372 .all_events = MMA8452_INT_DRDY | 1373 MMA8452_INT_FF_MT, 1374 .enabled_events = MMA8452_INT_FF_MT, 1375 }, 1376 [fxls8471] = { 1377 .chip_id = FXLS8471_DEVICE_ID, 1378 .channels = mma8451_channels, 1379 .num_channels = ARRAY_SIZE(mma8451_channels), 1380 .mma_scales = { {0, 2394}, {0, 4788}, {0, 9577} }, 1381 /* 1382 * Although we enable the interrupt sources once and for 1383 * all here the event detection itself is not enabled until 1384 * userspace asks for it by mma8452_write_event_config() 1385 */ 1386 .all_events = MMA8452_INT_DRDY | 1387 MMA8452_INT_TRANS | 1388 MMA8452_INT_FF_MT, 1389 .enabled_events = MMA8452_INT_TRANS | 1390 MMA8452_INT_FF_MT, 1391 }, 1392 }; 1393 1394 static struct attribute *mma8452_attributes[] = { 1395 &iio_dev_attr_sampling_frequency_available.dev_attr.attr, 1396 &iio_dev_attr_in_accel_scale_available.dev_attr.attr, 1397 &iio_dev_attr_in_accel_filter_high_pass_3db_frequency_available.dev_attr.attr, 1398 &iio_dev_attr_in_accel_oversampling_ratio_available.dev_attr.attr, 1399 NULL 1400 }; 1401 1402 static const struct attribute_group mma8452_group = { 1403 .attrs = mma8452_attributes, 1404 }; 1405 1406 static const struct iio_info mma8452_info = { 1407 .attrs = &mma8452_group, 1408 .read_raw = &mma8452_read_raw, 1409 .write_raw = &mma8452_write_raw, 1410 .event_attrs = &mma8452_event_attribute_group, 1411 .read_event_value = &mma8452_read_event_value, 1412 .write_event_value = &mma8452_write_event_value, 1413 .read_event_config = &mma8452_read_event_config, 1414 .write_event_config = &mma8452_write_event_config, 1415 .debugfs_reg_access = &mma8452_reg_access_dbg, 1416 }; 1417 1418 static const unsigned long mma8452_scan_masks[] = {0x7, 0}; 1419 1420 static int mma8452_data_rdy_trigger_set_state(struct iio_trigger *trig, 1421 bool state) 1422 { 1423 struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig); 1424 struct mma8452_data *data = iio_priv(indio_dev); 1425 int reg, ret; 1426 1427 ret = mma8452_set_runtime_pm_state(data->client, state); 1428 if (ret) 1429 return ret; 1430 1431 reg = i2c_smbus_read_byte_data(data->client, MMA8452_CTRL_REG4); 1432 if (reg < 0) 1433 return reg; 1434 1435 if (state) 1436 reg |= MMA8452_INT_DRDY; 1437 else 1438 reg &= ~MMA8452_INT_DRDY; 1439 1440 return mma8452_change_config(data, MMA8452_CTRL_REG4, reg); 1441 } 1442 1443 static const struct iio_trigger_ops mma8452_trigger_ops = { 1444 .set_trigger_state = mma8452_data_rdy_trigger_set_state, 1445 .validate_device = iio_trigger_validate_own_device, 1446 }; 1447 1448 static int mma8452_trigger_setup(struct iio_dev *indio_dev) 1449 { 1450 struct mma8452_data *data = iio_priv(indio_dev); 1451 struct iio_trigger *trig; 1452 int ret; 1453 1454 trig = devm_iio_trigger_alloc(&data->client->dev, "%s-dev%d", 1455 indio_dev->name, 1456 indio_dev->id); 1457 if (!trig) 1458 return -ENOMEM; 1459 1460 trig->dev.parent = &data->client->dev; 1461 trig->ops = &mma8452_trigger_ops; 1462 iio_trigger_set_drvdata(trig, indio_dev); 1463 1464 ret = iio_trigger_register(trig); 1465 if (ret) 1466 return ret; 1467 1468 indio_dev->trig = trig; 1469 1470 return 0; 1471 } 1472 1473 static void mma8452_trigger_cleanup(struct iio_dev *indio_dev) 1474 { 1475 if (indio_dev->trig) 1476 iio_trigger_unregister(indio_dev->trig); 1477 } 1478 1479 static int mma8452_reset(struct i2c_client *client) 1480 { 1481 int i; 1482 int ret; 1483 1484 ret = i2c_smbus_write_byte_data(client, MMA8452_CTRL_REG2, 1485 MMA8452_CTRL_REG2_RST); 1486 if (ret < 0) 1487 return ret; 1488 1489 for (i = 0; i < 10; i++) { 1490 usleep_range(100, 200); 1491 ret = i2c_smbus_read_byte_data(client, MMA8452_CTRL_REG2); 1492 if (ret == -EIO) 1493 continue; /* I2C comm reset */ 1494 if (ret < 0) 1495 return ret; 1496 if (!(ret & MMA8452_CTRL_REG2_RST)) 1497 return 0; 1498 } 1499 1500 return -ETIMEDOUT; 1501 } 1502 1503 static const struct of_device_id mma8452_dt_ids[] = { 1504 { .compatible = "fsl,mma8451", .data = &mma_chip_info_table[mma8451] }, 1505 { .compatible = "fsl,mma8452", .data = &mma_chip_info_table[mma8452] }, 1506 { .compatible = "fsl,mma8453", .data = &mma_chip_info_table[mma8453] }, 1507 { .compatible = "fsl,mma8652", .data = &mma_chip_info_table[mma8652] }, 1508 { .compatible = "fsl,mma8653", .data = &mma_chip_info_table[mma8653] }, 1509 { .compatible = "fsl,fxls8471", .data = &mma_chip_info_table[fxls8471] }, 1510 { } 1511 }; 1512 MODULE_DEVICE_TABLE(of, mma8452_dt_ids); 1513 1514 static int mma8452_probe(struct i2c_client *client, 1515 const struct i2c_device_id *id) 1516 { 1517 struct mma8452_data *data; 1518 struct iio_dev *indio_dev; 1519 int ret; 1520 const struct of_device_id *match; 1521 1522 match = of_match_device(mma8452_dt_ids, &client->dev); 1523 if (!match) { 1524 dev_err(&client->dev, "unknown device model\n"); 1525 return -ENODEV; 1526 } 1527 1528 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); 1529 if (!indio_dev) 1530 return -ENOMEM; 1531 1532 data = iio_priv(indio_dev); 1533 data->client = client; 1534 mutex_init(&data->lock); 1535 data->chip_info = match->data; 1536 1537 ret = i2c_smbus_read_byte_data(client, MMA8452_WHO_AM_I); 1538 if (ret < 0) 1539 return ret; 1540 1541 switch (ret) { 1542 case MMA8451_DEVICE_ID: 1543 case MMA8452_DEVICE_ID: 1544 case MMA8453_DEVICE_ID: 1545 case MMA8652_DEVICE_ID: 1546 case MMA8653_DEVICE_ID: 1547 case FXLS8471_DEVICE_ID: 1548 if (ret == data->chip_info->chip_id) 1549 break; 1550 default: 1551 return -ENODEV; 1552 } 1553 1554 dev_info(&client->dev, "registering %s accelerometer; ID 0x%x\n", 1555 match->compatible, data->chip_info->chip_id); 1556 1557 i2c_set_clientdata(client, indio_dev); 1558 indio_dev->info = &mma8452_info; 1559 indio_dev->name = id->name; 1560 indio_dev->dev.parent = &client->dev; 1561 indio_dev->modes = INDIO_DIRECT_MODE; 1562 indio_dev->channels = data->chip_info->channels; 1563 indio_dev->num_channels = data->chip_info->num_channels; 1564 indio_dev->available_scan_masks = mma8452_scan_masks; 1565 1566 ret = mma8452_reset(client); 1567 if (ret < 0) 1568 return ret; 1569 1570 data->data_cfg = MMA8452_DATA_CFG_FS_2G; 1571 ret = i2c_smbus_write_byte_data(client, MMA8452_DATA_CFG, 1572 data->data_cfg); 1573 if (ret < 0) 1574 return ret; 1575 1576 /* 1577 * By default set transient threshold to max to avoid events if 1578 * enabling without configuring threshold. 1579 */ 1580 ret = i2c_smbus_write_byte_data(client, MMA8452_TRANSIENT_THS, 1581 MMA8452_TRANSIENT_THS_MASK); 1582 if (ret < 0) 1583 return ret; 1584 1585 if (client->irq) { 1586 int irq2; 1587 1588 irq2 = of_irq_get_byname(client->dev.of_node, "INT2"); 1589 1590 if (irq2 == client->irq) { 1591 dev_dbg(&client->dev, "using interrupt line INT2\n"); 1592 } else { 1593 ret = i2c_smbus_write_byte_data(client, 1594 MMA8452_CTRL_REG5, 1595 data->chip_info->all_events); 1596 if (ret < 0) 1597 return ret; 1598 1599 dev_dbg(&client->dev, "using interrupt line INT1\n"); 1600 } 1601 1602 ret = i2c_smbus_write_byte_data(client, 1603 MMA8452_CTRL_REG4, 1604 data->chip_info->enabled_events); 1605 if (ret < 0) 1606 return ret; 1607 1608 ret = mma8452_trigger_setup(indio_dev); 1609 if (ret < 0) 1610 return ret; 1611 } 1612 1613 data->ctrl_reg1 = MMA8452_CTRL_ACTIVE | 1614 (MMA8452_CTRL_DR_DEFAULT << MMA8452_CTRL_DR_SHIFT); 1615 1616 data->sleep_val = mma8452_calculate_sleep(data); 1617 1618 ret = i2c_smbus_write_byte_data(client, MMA8452_CTRL_REG1, 1619 data->ctrl_reg1); 1620 if (ret < 0) 1621 goto trigger_cleanup; 1622 1623 ret = iio_triggered_buffer_setup(indio_dev, NULL, 1624 mma8452_trigger_handler, NULL); 1625 if (ret < 0) 1626 goto trigger_cleanup; 1627 1628 if (client->irq) { 1629 ret = devm_request_threaded_irq(&client->dev, 1630 client->irq, 1631 NULL, mma8452_interrupt, 1632 IRQF_TRIGGER_LOW | IRQF_ONESHOT, 1633 client->name, indio_dev); 1634 if (ret) 1635 goto buffer_cleanup; 1636 } 1637 1638 ret = pm_runtime_set_active(&client->dev); 1639 if (ret < 0) 1640 goto buffer_cleanup; 1641 1642 pm_runtime_enable(&client->dev); 1643 pm_runtime_set_autosuspend_delay(&client->dev, 1644 MMA8452_AUTO_SUSPEND_DELAY_MS); 1645 pm_runtime_use_autosuspend(&client->dev); 1646 1647 ret = iio_device_register(indio_dev); 1648 if (ret < 0) 1649 goto buffer_cleanup; 1650 1651 ret = mma8452_set_freefall_mode(data, false); 1652 if (ret < 0) 1653 goto buffer_cleanup; 1654 1655 return 0; 1656 1657 buffer_cleanup: 1658 iio_triggered_buffer_cleanup(indio_dev); 1659 1660 trigger_cleanup: 1661 mma8452_trigger_cleanup(indio_dev); 1662 1663 return ret; 1664 } 1665 1666 static int mma8452_remove(struct i2c_client *client) 1667 { 1668 struct iio_dev *indio_dev = i2c_get_clientdata(client); 1669 1670 iio_device_unregister(indio_dev); 1671 1672 pm_runtime_disable(&client->dev); 1673 pm_runtime_set_suspended(&client->dev); 1674 pm_runtime_put_noidle(&client->dev); 1675 1676 iio_triggered_buffer_cleanup(indio_dev); 1677 mma8452_trigger_cleanup(indio_dev); 1678 mma8452_standby(iio_priv(indio_dev)); 1679 1680 return 0; 1681 } 1682 1683 #ifdef CONFIG_PM 1684 static int mma8452_runtime_suspend(struct device *dev) 1685 { 1686 struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); 1687 struct mma8452_data *data = iio_priv(indio_dev); 1688 int ret; 1689 1690 mutex_lock(&data->lock); 1691 ret = mma8452_standby(data); 1692 mutex_unlock(&data->lock); 1693 if (ret < 0) { 1694 dev_err(&data->client->dev, "powering off device failed\n"); 1695 return -EAGAIN; 1696 } 1697 1698 return 0; 1699 } 1700 1701 static int mma8452_runtime_resume(struct device *dev) 1702 { 1703 struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); 1704 struct mma8452_data *data = iio_priv(indio_dev); 1705 int ret, sleep_val; 1706 1707 ret = mma8452_active(data); 1708 if (ret < 0) 1709 return ret; 1710 1711 ret = mma8452_get_odr_index(data); 1712 sleep_val = 1000 / mma8452_samp_freq[ret][0]; 1713 if (sleep_val < 20) 1714 usleep_range(sleep_val * 1000, 20000); 1715 else 1716 msleep_interruptible(sleep_val); 1717 1718 return 0; 1719 } 1720 #endif 1721 1722 #ifdef CONFIG_PM_SLEEP 1723 static int mma8452_suspend(struct device *dev) 1724 { 1725 return mma8452_standby(iio_priv(i2c_get_clientdata( 1726 to_i2c_client(dev)))); 1727 } 1728 1729 static int mma8452_resume(struct device *dev) 1730 { 1731 return mma8452_active(iio_priv(i2c_get_clientdata( 1732 to_i2c_client(dev)))); 1733 } 1734 #endif 1735 1736 static const struct dev_pm_ops mma8452_pm_ops = { 1737 SET_SYSTEM_SLEEP_PM_OPS(mma8452_suspend, mma8452_resume) 1738 SET_RUNTIME_PM_OPS(mma8452_runtime_suspend, 1739 mma8452_runtime_resume, NULL) 1740 }; 1741 1742 static const struct i2c_device_id mma8452_id[] = { 1743 { "mma8451", mma8451 }, 1744 { "mma8452", mma8452 }, 1745 { "mma8453", mma8453 }, 1746 { "mma8652", mma8652 }, 1747 { "mma8653", mma8653 }, 1748 { "fxls8471", fxls8471 }, 1749 { } 1750 }; 1751 MODULE_DEVICE_TABLE(i2c, mma8452_id); 1752 1753 static struct i2c_driver mma8452_driver = { 1754 .driver = { 1755 .name = "mma8452", 1756 .of_match_table = of_match_ptr(mma8452_dt_ids), 1757 .pm = &mma8452_pm_ops, 1758 }, 1759 .probe = mma8452_probe, 1760 .remove = mma8452_remove, 1761 .id_table = mma8452_id, 1762 }; 1763 module_i2c_driver(mma8452_driver); 1764 1765 MODULE_AUTHOR("Peter Meerwald <pmeerw@pmeerw.net>"); 1766 MODULE_DESCRIPTION("Freescale / NXP MMA8452 accelerometer driver"); 1767 MODULE_LICENSE("GPL"); 1768