Lines Matching +full:y +full:- +full:axis

1 // SPDX-License-Identifier: GPL-2.0-only
3 * MMC35240 - MEMSIC 3-axis Magnetic Sensor
7 * IIO driver for MMC35240 (7-bit I2C slave address 0x30).
60 * #define OTP_CONVERT(REG) ((float)((REG) >=32 ? (32 - (REG)) : (REG)) * 0.006
61 * 1) For X axis, the COEFFICIENT is always 1.
62 * 2) For Y axis, the COEFFICIENT is as below:
65 * 3) For Z axis, the COEFFICIENT is as below:
70 /* scale = 1000 here for Y otp */
71 #define MMC35240_OTP_CONVERT_Y(REG) (((REG) >= 32 ? (32 - (REG)) : (REG)) * 6)
74 #define MMC35240_OTP_CONVERT_Z(REG) (((REG) >= 32 ? (32 - (REG)) : (REG)) * 81)
77 #define MMC35240_Y_COEFF(y) (y + 1000) argument
96 int sens[3]; /* sensitivity per X, Y, Z axis */
154 MMC35240_CHANNEL(Y),
176 return -EINVAL; in mmc35240_get_samp_freq_index()
188 ret = regmap_set_bits(data->regmap, MMC35240_REG_CTRL0, in mmc35240_hw_set()
199 return regmap_set_bits(data->regmap, MMC35240_REG_CTRL0, coil_bit); in mmc35240_hw_set()
209 ret = regmap_read(data->regmap, MMC35240_REG_ID, &reg_id); in mmc35240_init()
211 dev_err(&data->client->dev, "Error reading product id\n"); in mmc35240_init()
215 dev_dbg(&data->client->dev, "MMC35240 chip id %x\n", reg_id); in mmc35240_init()
219 * a SET/RESET sequence, the axis polarity being naturally in mmc35240_init()
232 ret = regmap_update_bits(data->regmap, MMC35240_REG_CTRL1, in mmc35240_init()
234 data->res << MMC35240_CTRL1_BW_SHIFT); in mmc35240_init()
238 ret = regmap_bulk_read(data->regmap, MMC35240_OTP_START_ADDR, in mmc35240_init()
247 data->axis_coef[0] = MMC35240_X_COEFF(1); in mmc35240_init()
248 data->axis_coef[1] = MMC35240_Y_COEFF(y_convert); in mmc35240_init()
249 data->axis_coef[2] = MMC35240_Z_COEFF(z_convert); in mmc35240_init()
251 data->axis_scale[0] = 1; in mmc35240_init()
252 data->axis_scale[1] = 1000; in mmc35240_init()
253 data->axis_scale[2] = 10000; in mmc35240_init()
263 ret = regmap_write(data->regmap, MMC35240_REG_CTRL0, in mmc35240_take_measurement()
268 while (tries-- > 0) { in mmc35240_take_measurement()
269 ret = regmap_read(data->regmap, MMC35240_REG_STATUS, in mmc35240_take_measurement()
280 dev_err(&data->client->dev, "data not ready\n"); in mmc35240_take_measurement()
281 return -EIO; in mmc35240_take_measurement()
295 return regmap_bulk_read(data->regmap, MMC35240_REG_XOUT_L, buf, in mmc35240_read_measurement()
300 * mmc35240_raw_to_mgauss - convert raw readings to milli gauss. Also apply
304 * @index: axis index for which we want the conversion
308 * Returns: 0 in case of success, -EINVAL when @index is not valid
321 sens[AXIS_X] = mmc35240_props_table[data->res].sens[AXIS_X]; in mmc35240_raw_to_mgauss()
322 sens[AXIS_Y] = mmc35240_props_table[data->res].sens[AXIS_Y]; in mmc35240_raw_to_mgauss()
323 sens[AXIS_Z] = mmc35240_props_table[data->res].sens[AXIS_Z]; in mmc35240_raw_to_mgauss()
325 nfo = mmc35240_props_table[data->res].nfo; in mmc35240_raw_to_mgauss()
329 *val = (raw[AXIS_X] - nfo) * 1000 / sens[AXIS_X]; in mmc35240_raw_to_mgauss()
332 *val = (raw[AXIS_Y] - nfo) * 1000 / sens[AXIS_Y] - in mmc35240_raw_to_mgauss()
333 (raw[AXIS_Z] - nfo) * 1000 / sens[AXIS_Z]; in mmc35240_raw_to_mgauss()
336 *val = (raw[AXIS_Y] - nfo) * 1000 / sens[AXIS_Y] + in mmc35240_raw_to_mgauss()
337 (raw[AXIS_Z] - nfo) * 1000 / sens[AXIS_Z]; in mmc35240_raw_to_mgauss()
340 return -EINVAL; in mmc35240_raw_to_mgauss()
343 *val = (*val) * data->axis_coef[index] / data->axis_scale[index]; in mmc35240_raw_to_mgauss()
359 mutex_lock(&data->mutex); in mmc35240_read_raw()
361 mutex_unlock(&data->mutex); in mmc35240_read_raw()
364 ret = mmc35240_raw_to_mgauss(data, chan->address, buf, val); in mmc35240_read_raw()
373 mutex_lock(&data->mutex); in mmc35240_read_raw()
374 ret = regmap_read(data->regmap, MMC35240_REG_CTRL1, &reg); in mmc35240_read_raw()
375 mutex_unlock(&data->mutex); in mmc35240_read_raw()
381 return -EINVAL; in mmc35240_read_raw()
387 return -EINVAL; in mmc35240_read_raw()
402 return -EINVAL; in mmc35240_write_raw()
403 mutex_lock(&data->mutex); in mmc35240_write_raw()
404 ret = regmap_update_bits(data->regmap, MMC35240_REG_CTRL1, in mmc35240_write_raw()
407 mutex_unlock(&data->mutex); in mmc35240_write_raw()
410 return -EINVAL; in mmc35240_write_raw()
488 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); in mmc35240_probe()
490 return -ENOMEM; in mmc35240_probe()
494 dev_err(&client->dev, "regmap initialization failed\n"); in mmc35240_probe()
500 data->client = client; in mmc35240_probe()
501 data->regmap = regmap; in mmc35240_probe()
502 data->res = MMC35240_16_BITS_SLOW; in mmc35240_probe()
504 mutex_init(&data->mutex); in mmc35240_probe()
506 indio_dev->info = &mmc35240_info; in mmc35240_probe()
507 indio_dev->name = MMC35240_DRV_NAME; in mmc35240_probe()
508 indio_dev->channels = mmc35240_channels; in mmc35240_probe()
509 indio_dev->num_channels = ARRAY_SIZE(mmc35240_channels); in mmc35240_probe()
510 indio_dev->modes = INDIO_DIRECT_MODE; in mmc35240_probe()
514 dev_err(&client->dev, "mmc35240 chip init failed\n"); in mmc35240_probe()
517 return devm_iio_device_register(&client->dev, indio_dev); in mmc35240_probe()
525 regcache_cache_only(data->regmap, true); in mmc35240_suspend()
536 regcache_mark_dirty(data->regmap); in mmc35240_resume()
537 ret = regcache_sync_region(data->regmap, MMC35240_REG_CTRL0, in mmc35240_resume()
542 regcache_cache_only(data->regmap, false); in mmc35240_resume()