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

iio: accel: kx022a: Support ICs with different G-ranges

The register interface of the ROHM KX134ACR-LBZ accelerometer is almost
identical to the KX132ACR-LBZ. Main difference between these
accelerometers is that the KX134ACR-LBZ supports G-ranges +/- 8, 16,
32 and 64G. All the other sensors supported by the kx022a driver can
measure +/- 2, 4, 8 and 16G.

Prepare supporting the KX134ACR-LBZ with different G-ranges by storing
a pointer to the scale tables in IC specific structure.

Signed-off-by: Matti Vaittinen <mazziesaccount@gmail.com>
Link: https://patch.msgid.link/fc667b1495adf4e3f29ecbb336495c1f18b47e61.1732783834.git.mazziesaccount@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

Matti Vaittinen and committed by
Jonathan Cameron
64eb1c6f 725521e1

+23 -11
+21 -11
drivers/iio/accel/kionix-kx022a.c
··· 413 413 const int **vals, int *type, int *length, 414 414 long mask) 415 415 { 416 + struct kx022a_data *data = iio_priv(indio_dev); 417 + 416 418 switch (mask) { 417 419 case IIO_CHAN_INFO_SAMP_FREQ: 418 420 *vals = (const int *)kx022a_accel_samp_freq_table; ··· 423 421 *type = IIO_VAL_INT_PLUS_MICRO; 424 422 return IIO_AVAIL_LIST; 425 423 case IIO_CHAN_INFO_SCALE: 426 - *vals = (const int *)kx022a_scale_table; 427 - *length = ARRAY_SIZE(kx022a_scale_table) * 428 - ARRAY_SIZE(kx022a_scale_table[0]); 424 + *vals = (const int *)data->chip_info->scale_table; 425 + *length = data->chip_info->scale_table_size; 429 426 *type = IIO_VAL_INT_PLUS_NANO; 430 427 return IIO_AVAIL_LIST; 431 428 default: ··· 440 439 *val2 = kx022a_accel_samp_freq_table[val & KX022A_MASK_ODR][1]; 441 440 } 442 441 443 - static void kx022a_reg2scale(unsigned int val, unsigned int *val1, 444 - unsigned int *val2) 442 + static void kx022a_reg2scale(struct kx022a_data *data, unsigned int val, 443 + unsigned int *val1, unsigned int *val2) 445 444 { 446 445 val &= KX022A_MASK_GSEL; 447 446 val >>= KX022A_GSEL_SHIFT; 448 447 449 - *val1 = kx022a_scale_table[val][0]; 450 - *val2 = kx022a_scale_table[val][1]; 448 + *val1 = data->chip_info->scale_table[val][0]; 449 + *val2 = data->chip_info->scale_table[val][1]; 451 450 } 452 451 453 452 static int __kx022a_turn_on_off(struct kx022a_data *data, bool on) ··· 545 544 kx022a_turn_on_unlock(data); 546 545 break; 547 546 case IIO_CHAN_INFO_SCALE: 548 - n = ARRAY_SIZE(kx022a_scale_table); 547 + n = data->chip_info->scale_table_size / 2; 549 548 550 549 while (n-- > 0) 551 - if (val == kx022a_scale_table[n][0] && 552 - val2 == kx022a_scale_table[n][1]) 550 + if (val == data->chip_info->scale_table[n][0] && 551 + val2 == data->chip_info->scale_table[n][1]) 553 552 break; 554 553 if (n < 0) { 555 554 ret = -EINVAL; ··· 644 643 if (ret < 0) 645 644 return ret; 646 645 647 - kx022a_reg2scale(regval, val, val2); 646 + kx022a_reg2scale(data, regval, val, val2); 648 647 649 648 return IIO_VAL_INT_PLUS_NANO; 650 649 } ··· 1149 1148 .regmap_config = &kx022a_regmap_config, 1150 1149 .channels = kx022a_channels, 1151 1150 .num_channels = ARRAY_SIZE(kx022a_channels), 1151 + .scale_table = kx022a_scale_table, 1152 + .scale_table_size = ARRAY_SIZE(kx022a_scale_table) * 1153 + ARRAY_SIZE(kx022a_scale_table[0]), 1152 1154 .fifo_length = KX022A_FIFO_LENGTH, 1153 1155 .who = KX022A_REG_WHO, 1154 1156 .id = KX022A_ID, ··· 1177 1173 .regmap_config = &kx132_regmap_config, 1178 1174 .channels = kx132_channels, 1179 1175 .num_channels = ARRAY_SIZE(kx132_channels), 1176 + .scale_table = kx022a_scale_table, 1177 + .scale_table_size = ARRAY_SIZE(kx022a_scale_table) * 1178 + ARRAY_SIZE(kx022a_scale_table[0]), 1180 1179 .fifo_length = KX132_FIFO_LENGTH, 1181 1180 .who = KX132_REG_WHO, 1182 1181 .id = KX132_ID, ··· 1213 1206 .regmap_config = &kx022a_regmap_config, 1214 1207 .channels = kx022a_channels, 1215 1208 .num_channels = ARRAY_SIZE(kx022a_channels), 1209 + .scale_table = kx022a_scale_table, 1210 + .scale_table_size = ARRAY_SIZE(kx022a_scale_table) * 1211 + ARRAY_SIZE(kx022a_scale_table[0]), 1216 1212 .fifo_length = KX022A_FIFO_LENGTH, 1217 1213 .who = KX022A_REG_WHO, 1218 1214 .id = KX132ACR_LBZ_ID,
+2
drivers/iio/accel/kionix-kx022a.h
··· 161 161 struct kx022a_chip_info { 162 162 const char *name; 163 163 const struct regmap_config *regmap_config; 164 + const int (*scale_table)[2]; 165 + const int scale_table_size; 164 166 const struct iio_chan_spec *channels; 165 167 unsigned int num_channels; 166 168 unsigned int fifo_length;