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

iio: st-sensors: add configuration for WhoAmI address

This patch permits to configure the WhoAmI register address
because some device could have not a standard address for
this register.

Signed-off-by: Giuseppe Barba <giuseppe.barba@st.com>
Reviewed-by: Denis Ciocca <denis.ciocca@st.com>
Acked-by: Denis Ciocca <denis.ciocca@st.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>

authored by

Giuseppe Barba and committed by
Jonathan Cameron
bc27381e c176becd

+39 -26
+5
drivers/iio/accel/st_accel_core.c
··· 226 226 static const struct st_sensor_settings st_accel_sensors_settings[] = { 227 227 { 228 228 .wai = ST_ACCEL_1_WAI_EXP, 229 + .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS, 229 230 .sensors_supported = { 230 231 [0] = LIS3DH_ACCEL_DEV_NAME, 231 232 [1] = LSM303DLHC_ACCEL_DEV_NAME, ··· 298 297 }, 299 298 { 300 299 .wai = ST_ACCEL_2_WAI_EXP, 300 + .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS, 301 301 .sensors_supported = { 302 302 [0] = LIS331DLH_ACCEL_DEV_NAME, 303 303 [1] = LSM303DL_ACCEL_DEV_NAME, ··· 361 359 }, 362 360 { 363 361 .wai = ST_ACCEL_3_WAI_EXP, 362 + .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS, 364 363 .sensors_supported = { 365 364 [0] = LSM330_ACCEL_DEV_NAME, 366 365 }, ··· 440 437 }, 441 438 { 442 439 .wai = ST_ACCEL_4_WAI_EXP, 440 + .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS, 443 441 .sensors_supported = { 444 442 [0] = LIS3LV02DL_ACCEL_DEV_NAME, 445 443 }, ··· 498 494 }, 499 495 { 500 496 .wai = ST_ACCEL_5_WAI_EXP, 497 + .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS, 501 498 .sensors_supported = { 502 499 [0] = LIS331DL_ACCEL_DEV_NAME, 503 500 },
+23 -26
drivers/iio/common/st_sensors/st_sensors_core.c
··· 479 479 int num_sensors_list, 480 480 const struct st_sensor_settings *sensor_settings) 481 481 { 482 - u8 wai; 483 482 int i, n, err; 483 + u8 wai; 484 484 struct st_sensor_data *sdata = iio_priv(indio_dev); 485 485 486 + for (i = 0; i < num_sensors_list; i++) { 487 + for (n = 0; n < ST_SENSORS_MAX_4WAI; n++) { 488 + if (strcmp(indio_dev->name, 489 + sensor_settings[i].sensors_supported[n]) == 0) { 490 + break; 491 + } 492 + } 493 + if (n < ST_SENSORS_MAX_4WAI) 494 + break; 495 + } 496 + if (i == num_sensors_list) { 497 + dev_err(&indio_dev->dev, "device name %s not recognized.\n", 498 + indio_dev->name); 499 + return -ENODEV; 500 + } 501 + 486 502 err = sdata->tf->read_byte(&sdata->tb, sdata->dev, 487 - ST_SENSORS_DEFAULT_WAI_ADDRESS, &wai); 503 + sensor_settings[i].wai_addr, &wai); 488 504 if (err < 0) { 489 505 dev_err(&indio_dev->dev, "failed to read Who-Am-I register.\n"); 490 - goto read_wai_error; 506 + return err; 491 507 } 492 508 493 - for (i = 0; i < num_sensors_list; i++) { 494 - if (sensor_settings[i].wai == wai) 495 - break; 496 - } 497 - if (i == num_sensors_list) 498 - goto device_not_supported; 499 - 500 - for (n = 0; n < ARRAY_SIZE(sensor_settings[i].sensors_supported); n++) { 501 - if (strcmp(indio_dev->name, 502 - &sensor_settings[i].sensors_supported[n][0]) == 0) 503 - break; 504 - } 505 - if (n == ARRAY_SIZE(sensor_settings[i].sensors_supported)) { 506 - dev_err(&indio_dev->dev, "device name \"%s\" and WhoAmI (0x%02x) mismatch", 507 - indio_dev->name, wai); 508 - goto sensor_name_mismatch; 509 + if (sensor_settings[i].wai != wai) { 510 + dev_err(&indio_dev->dev, "%s: WhoAmI mismatch (0x%x).\n", 511 + indio_dev->name, wai); 512 + return -EINVAL; 509 513 } 510 514 511 515 sdata->sensor_settings = 512 516 (struct st_sensor_settings *)&sensor_settings[i]; 513 517 514 518 return i; 515 - 516 - device_not_supported: 517 - dev_err(&indio_dev->dev, "device not supported: WhoAmI (0x%x).\n", wai); 518 - sensor_name_mismatch: 519 - err = -ENODEV; 520 - read_wai_error: 521 - return err; 522 519 } 523 520 EXPORT_SYMBOL(st_sensors_check_device_support); 524 521
+3
drivers/iio/gyro/st_gyro_core.c
··· 131 131 static const struct st_sensor_settings st_gyro_sensors_settings[] = { 132 132 { 133 133 .wai = ST_GYRO_1_WAI_EXP, 134 + .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS, 134 135 .sensors_supported = { 135 136 [0] = L3G4200D_GYRO_DEV_NAME, 136 137 [1] = LSM330DL_GYRO_DEV_NAME, ··· 191 190 }, 192 191 { 193 192 .wai = ST_GYRO_2_WAI_EXP, 193 + .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS, 194 194 .sensors_supported = { 195 195 [0] = L3GD20_GYRO_DEV_NAME, 196 196 [1] = LSM330D_GYRO_DEV_NAME, ··· 254 252 }, 255 253 { 256 254 .wai = ST_GYRO_3_WAI_EXP, 255 + .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS, 257 256 .sensors_supported = { 258 257 [0] = L3GD20_GYRO_DEV_NAME, 259 258 },
+3
drivers/iio/magnetometer/st_magn_core.c
··· 192 192 static const struct st_sensor_settings st_magn_sensors_settings[] = { 193 193 { 194 194 .wai = 0, /* This sensor has no valid WhoAmI report 0 */ 195 + .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS, 195 196 .sensors_supported = { 196 197 [0] = LSM303DLH_MAGN_DEV_NAME, 197 198 }, ··· 269 268 }, 270 269 { 271 270 .wai = ST_MAGN_1_WAI_EXP, 271 + .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS, 272 272 .sensors_supported = { 273 273 [0] = LSM303DLHC_MAGN_DEV_NAME, 274 274 [1] = LSM303DLM_MAGN_DEV_NAME, ··· 348 346 }, 349 347 { 350 348 .wai = ST_MAGN_2_WAI_EXP, 349 + .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS, 351 350 .sensors_supported = { 352 351 [0] = LIS3MDL_MAGN_DEV_NAME, 353 352 },
+3
drivers/iio/pressure/st_pressure_core.c
··· 178 178 static const struct st_sensor_settings st_press_sensors_settings[] = { 179 179 { 180 180 .wai = ST_PRESS_LPS331AP_WAI_EXP, 181 + .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS, 181 182 .sensors_supported = { 182 183 [0] = LPS331AP_PRESS_DEV_NAME, 183 184 }, ··· 226 225 }, 227 226 { 228 227 .wai = ST_PRESS_LPS001WP_WAI_EXP, 228 + .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS, 229 229 .sensors_supported = { 230 230 [0] = LPS001WP_PRESS_DEV_NAME, 231 231 }, ··· 262 260 }, 263 261 { 264 262 .wai = ST_PRESS_LPS25H_WAI_EXP, 263 + .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS, 265 264 .sensors_supported = { 266 265 [0] = LPS25H_PRESS_DEV_NAME, 267 266 },
+2
include/linux/iio/common/st_sensors.h
··· 166 166 /** 167 167 * struct st_sensor_settings - ST specific sensor settings 168 168 * @wai: Contents of WhoAmI register. 169 + * @wai_addr: The address of WhoAmI register. 169 170 * @sensors_supported: List of supported sensors by struct itself. 170 171 * @ch: IIO channels for the sensor. 171 172 * @odr: Output data rate register and ODR list available. ··· 180 179 */ 181 180 struct st_sensor_settings { 182 181 u8 wai; 182 + u8 wai_addr; 183 183 char sensors_supported[ST_SENSORS_MAX_4WAI][ST_SENSORS_MAX_NAME]; 184 184 struct iio_chan_spec *ch; 185 185 int num_ch;