Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

iio: imu: st_lsm6dsx: make event_settings more generic

The st_lsm6dsx_event_settings structure contains fields specific for one
event type (wakeup). In preparation for adding support for more event
types, introduce an event id enum and a generic event source structure, and
replace wakeup-specific data in struct st_lsm6dsx_event_settings with an
array of event source structures.

Signed-off-by: Francesco Lavra <flavra@baylibre.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
Acked-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

Francesco Lavra and committed by
Jonathan Cameron
212234f7 0820dd9f

+106 -60
+14 -6
drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
··· 260 260 u8 pause; 261 261 }; 262 262 263 + enum st_lsm6dsx_event_id { 264 + ST_LSM6DSX_EVENT_WAKEUP, 265 + ST_LSM6DSX_EVENT_MAX 266 + }; 267 + 268 + struct st_lsm6dsx_event_src { 269 + struct st_lsm6dsx_reg value; 270 + struct st_lsm6dsx_reg status; 271 + u8 status_x_mask; 272 + u8 status_y_mask; 273 + u8 status_z_mask; 274 + }; 275 + 263 276 struct st_lsm6dsx_event_settings { 264 277 struct st_lsm6dsx_reg enable_reg; 265 - struct st_lsm6dsx_reg wakeup_reg; 266 - u8 wakeup_src_reg; 267 - u8 wakeup_src_status_mask; 268 - u8 wakeup_src_z_mask; 269 - u8 wakeup_src_y_mask; 270 - u8 wakeup_src_x_mask; 278 + struct st_lsm6dsx_event_src sources[ST_LSM6DSX_EVENT_MAX]; 271 279 }; 272 280 273 281 enum st_lsm6dsx_sensor_id {
+92 -54
drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
··· 379 379 }, 380 380 }, 381 381 .event_settings = { 382 - .wakeup_reg = { 383 - .addr = 0x5B, 384 - .mask = GENMASK(5, 0), 382 + .sources = { 383 + [ST_LSM6DSX_EVENT_WAKEUP] = { 384 + .value = { 385 + .addr = 0x5b, 386 + .mask = GENMASK(5, 0), 387 + }, 388 + .status = { 389 + .addr = 0x1b, 390 + .mask = BIT(3), 391 + }, 392 + .status_z_mask = BIT(0), 393 + .status_y_mask = BIT(1), 394 + .status_x_mask = BIT(2), 395 + }, 385 396 }, 386 - .wakeup_src_reg = 0x1b, 387 - .wakeup_src_status_mask = BIT(3), 388 - .wakeup_src_z_mask = BIT(0), 389 - .wakeup_src_y_mask = BIT(1), 390 - .wakeup_src_x_mask = BIT(2), 391 397 }, 392 398 }, 393 399 { ··· 551 545 }, 552 546 }, 553 547 .event_settings = { 554 - .wakeup_reg = { 555 - .addr = 0x5B, 556 - .mask = GENMASK(5, 0), 548 + .sources = { 549 + [ST_LSM6DSX_EVENT_WAKEUP] = { 550 + .value = { 551 + .addr = 0x5b, 552 + .mask = GENMASK(5, 0), 553 + }, 554 + .status = { 555 + .addr = 0x1b, 556 + .mask = BIT(3), 557 + }, 558 + .status_z_mask = BIT(0), 559 + .status_y_mask = BIT(1), 560 + .status_x_mask = BIT(2), 561 + }, 557 562 }, 558 - .wakeup_src_reg = 0x1b, 559 - .wakeup_src_status_mask = BIT(3), 560 - .wakeup_src_z_mask = BIT(0), 561 - .wakeup_src_y_mask = BIT(1), 562 - .wakeup_src_x_mask = BIT(2), 563 563 }, 564 564 }, 565 565 { ··· 794 782 .addr = 0x58, 795 783 .mask = BIT(7), 796 784 }, 797 - .wakeup_reg = { 798 - .addr = 0x5B, 799 - .mask = GENMASK(5, 0), 785 + .sources = { 786 + [ST_LSM6DSX_EVENT_WAKEUP] = { 787 + .value = { 788 + .addr = 0x5b, 789 + .mask = GENMASK(5, 0), 790 + }, 791 + .status = { 792 + .addr = 0x1b, 793 + .mask = BIT(3), 794 + }, 795 + .status_z_mask = BIT(0), 796 + .status_y_mask = BIT(1), 797 + .status_x_mask = BIT(2), 798 + }, 800 799 }, 801 - .wakeup_src_reg = 0x1b, 802 - .wakeup_src_status_mask = BIT(3), 803 - .wakeup_src_z_mask = BIT(0), 804 - .wakeup_src_y_mask = BIT(1), 805 - .wakeup_src_x_mask = BIT(2), 806 800 }, 807 801 }, 808 802 { ··· 1039 1021 .addr = 0x58, 1040 1022 .mask = BIT(7), 1041 1023 }, 1042 - .wakeup_reg = { 1043 - .addr = 0x5b, 1044 - .mask = GENMASK(5, 0), 1024 + .sources = { 1025 + [ST_LSM6DSX_EVENT_WAKEUP] = { 1026 + .value = { 1027 + .addr = 0x5b, 1028 + .mask = GENMASK(5, 0), 1029 + }, 1030 + .status = { 1031 + .addr = 0x1b, 1032 + .mask = BIT(3), 1033 + }, 1034 + .status_z_mask = BIT(0), 1035 + .status_y_mask = BIT(1), 1036 + .status_x_mask = BIT(2), 1037 + }, 1045 1038 }, 1046 - .wakeup_src_reg = 0x1b, 1047 - .wakeup_src_status_mask = BIT(3), 1048 - .wakeup_src_z_mask = BIT(0), 1049 - .wakeup_src_y_mask = BIT(1), 1050 - .wakeup_src_x_mask = BIT(2), 1051 1039 }, 1052 1040 }, 1053 1041 { ··· 1228 1204 .addr = 0x58, 1229 1205 .mask = BIT(7), 1230 1206 }, 1231 - .wakeup_reg = { 1232 - .addr = 0x5B, 1233 - .mask = GENMASK(5, 0), 1207 + .sources = { 1208 + [ST_LSM6DSX_EVENT_WAKEUP] = { 1209 + .value = { 1210 + .addr = 0x5b, 1211 + .mask = GENMASK(5, 0), 1212 + }, 1213 + .status = { 1214 + .addr = 0x1b, 1215 + .mask = BIT(3), 1216 + }, 1217 + .status_z_mask = BIT(0), 1218 + .status_y_mask = BIT(1), 1219 + .status_x_mask = BIT(2), 1220 + }, 1234 1221 }, 1235 - .wakeup_src_reg = 0x1b, 1236 - .wakeup_src_status_mask = BIT(3), 1237 - .wakeup_src_z_mask = BIT(0), 1238 - .wakeup_src_y_mask = BIT(1), 1239 - .wakeup_src_x_mask = BIT(2), 1240 1222 }, 1241 1223 }, 1242 1224 { ··· 1442 1412 .addr = 0x50, 1443 1413 .mask = BIT(7), 1444 1414 }, 1445 - .wakeup_reg = { 1446 - .addr = 0x5b, 1447 - .mask = GENMASK(5, 0), 1415 + .sources = { 1416 + [ST_LSM6DSX_EVENT_WAKEUP] = { 1417 + .value = { 1418 + .addr = 0x5b, 1419 + .mask = GENMASK(5, 0), 1420 + }, 1421 + .status = { 1422 + .addr = 0x45, 1423 + .mask = BIT(3), 1424 + }, 1425 + .status_z_mask = BIT(0), 1426 + .status_y_mask = BIT(1), 1427 + .status_x_mask = BIT(2), 1428 + }, 1448 1429 }, 1449 - .wakeup_src_reg = 0x45, 1450 - .wakeup_src_status_mask = BIT(3), 1451 - .wakeup_src_z_mask = BIT(0), 1452 - .wakeup_src_y_mask = BIT(1), 1453 - .wakeup_src_x_mask = BIT(2), 1454 1430 }, 1455 1431 }, 1456 1432 { ··· 1968 1932 if (val < 0 || val > 31) 1969 1933 return -EINVAL; 1970 1934 1971 - reg = &hw->settings->event_settings.wakeup_reg; 1935 + reg = &hw->settings->event_settings.sources[ST_LSM6DSX_EVENT_WAKEUP].value; 1972 1936 data = ST_LSM6DSX_SHIFT_VAL(val, reg->mask); 1973 1937 err = st_lsm6dsx_update_bits_locked(hw, reg->addr, 1974 1938 reg->mask, data); ··· 2446 2410 st_lsm6dsx_report_motion_event(struct st_lsm6dsx_hw *hw) 2447 2411 { 2448 2412 const struct st_lsm6dsx_event_settings *event_settings; 2413 + const struct st_lsm6dsx_event_src *src; 2449 2414 int err, data; 2450 2415 s64 timestamp; 2451 2416 ··· 2454 2417 return false; 2455 2418 2456 2419 event_settings = &hw->settings->event_settings; 2457 - err = st_lsm6dsx_read_locked(hw, event_settings->wakeup_src_reg, 2420 + src = &event_settings->sources[ST_LSM6DSX_EVENT_WAKEUP]; 2421 + err = st_lsm6dsx_read_locked(hw, src->status.addr, 2458 2422 &data, sizeof(data)); 2459 2423 if (err < 0) 2460 2424 return false; 2461 2425 2462 2426 timestamp = iio_get_time_ns(hw->iio_devs[ST_LSM6DSX_ID_ACC]); 2463 - if ((data & hw->settings->event_settings.wakeup_src_z_mask) && 2427 + if ((data & src->status_z_mask) && 2464 2428 (hw->enable_event & BIT(IIO_MOD_Z))) 2465 2429 iio_push_event(hw->iio_devs[ST_LSM6DSX_ID_ACC], 2466 2430 IIO_MOD_EVENT_CODE(IIO_ACCEL, ··· 2471 2433 IIO_EV_DIR_EITHER), 2472 2434 timestamp); 2473 2435 2474 - if ((data & hw->settings->event_settings.wakeup_src_y_mask) && 2436 + if ((data & src->status_y_mask) && 2475 2437 (hw->enable_event & BIT(IIO_MOD_Y))) 2476 2438 iio_push_event(hw->iio_devs[ST_LSM6DSX_ID_ACC], 2477 2439 IIO_MOD_EVENT_CODE(IIO_ACCEL, ··· 2481 2443 IIO_EV_DIR_EITHER), 2482 2444 timestamp); 2483 2445 2484 - if ((data & hw->settings->event_settings.wakeup_src_x_mask) && 2446 + if ((data & src->status_x_mask) && 2485 2447 (hw->enable_event & BIT(IIO_MOD_X))) 2486 2448 iio_push_event(hw->iio_devs[ST_LSM6DSX_ID_ACC], 2487 2449 IIO_MOD_EVENT_CODE(IIO_ACCEL, ··· 2491 2453 IIO_EV_DIR_EITHER), 2492 2454 timestamp); 2493 2455 2494 - return data & event_settings->wakeup_src_status_mask; 2456 + return data & src->status.mask; 2495 2457 } 2496 2458 2497 2459 static irqreturn_t st_lsm6dsx_handler_thread(int irq, void *private)