Lines Matching +full:sens +full:-

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).
61 * #define OTP_CONVERT(REG) ((float)((REG) >=32 ? (32 - (REG)) : (REG)) * 0.006
72 #define MMC35240_OTP_CONVERT_Y(REG) (((REG) >= 32 ? (32 - (REG)) : (REG)) * 6)
75 #define MMC35240_OTP_CONVERT_Z(REG) (((REG) >= 32 ? (32 - (REG)) : (REG)) * 81)
97 int sens[3]; /* sensitivity per X, Y, Z axis */ member
177 return -EINVAL; in mmc35240_get_samp_freq_index()
189 ret = regmap_update_bits(data->regmap, MMC35240_REG_CTRL0, in mmc35240_hw_set()
201 return regmap_update_bits(data->regmap, MMC35240_REG_CTRL0, in mmc35240_hw_set()
212 ret = regmap_read(data->regmap, MMC35240_REG_ID, &reg_id); in mmc35240_init()
214 dev_err(&data->client->dev, "Error reading product id\n"); in mmc35240_init()
218 dev_dbg(&data->client->dev, "MMC35240 chip id %x\n", reg_id); in mmc35240_init()
235 ret = regmap_update_bits(data->regmap, MMC35240_REG_CTRL1, in mmc35240_init()
237 data->res << MMC35240_CTRL1_BW_SHIFT); in mmc35240_init()
241 ret = regmap_bulk_read(data->regmap, MMC35240_OTP_START_ADDR, in mmc35240_init()
250 data->axis_coef[0] = MMC35240_X_COEFF(1); in mmc35240_init()
251 data->axis_coef[1] = MMC35240_Y_COEFF(y_convert); in mmc35240_init()
252 data->axis_coef[2] = MMC35240_Z_COEFF(z_convert); in mmc35240_init()
254 data->axis_scale[0] = 1; in mmc35240_init()
255 data->axis_scale[1] = 1000; in mmc35240_init()
256 data->axis_scale[2] = 10000; in mmc35240_init()
266 ret = regmap_write(data->regmap, MMC35240_REG_CTRL0, in mmc35240_take_measurement()
271 while (tries-- > 0) { in mmc35240_take_measurement()
272 ret = regmap_read(data->regmap, MMC35240_REG_STATUS, in mmc35240_take_measurement()
283 dev_err(&data->client->dev, "data not ready\n"); in mmc35240_take_measurement()
284 return -EIO; in mmc35240_take_measurement()
298 return regmap_bulk_read(data->regmap, MMC35240_REG_XOUT_L, buf, in mmc35240_read_measurement()
303 * mmc35240_raw_to_mgauss - convert raw readings to milli gauss. Also apply
311 * Returns: 0 in case of success, -EINVAL when @index is not valid
317 int sens[3]; in mmc35240_raw_to_mgauss() local
324 sens[AXIS_X] = mmc35240_props_table[data->res].sens[AXIS_X]; in mmc35240_raw_to_mgauss()
325 sens[AXIS_Y] = mmc35240_props_table[data->res].sens[AXIS_Y]; in mmc35240_raw_to_mgauss()
326 sens[AXIS_Z] = mmc35240_props_table[data->res].sens[AXIS_Z]; in mmc35240_raw_to_mgauss()
328 nfo = mmc35240_props_table[data->res].nfo; in mmc35240_raw_to_mgauss()
332 *val = (raw[AXIS_X] - nfo) * 1000 / sens[AXIS_X]; in mmc35240_raw_to_mgauss()
335 *val = (raw[AXIS_Y] - nfo) * 1000 / sens[AXIS_Y] - in mmc35240_raw_to_mgauss()
336 (raw[AXIS_Z] - nfo) * 1000 / sens[AXIS_Z]; in mmc35240_raw_to_mgauss()
339 *val = (raw[AXIS_Y] - nfo) * 1000 / sens[AXIS_Y] + in mmc35240_raw_to_mgauss()
340 (raw[AXIS_Z] - nfo) * 1000 / sens[AXIS_Z]; in mmc35240_raw_to_mgauss()
343 return -EINVAL; in mmc35240_raw_to_mgauss()
346 *val = (*val) * data->axis_coef[index] / data->axis_scale[index]; in mmc35240_raw_to_mgauss()
362 mutex_lock(&data->mutex); in mmc35240_read_raw()
364 mutex_unlock(&data->mutex); in mmc35240_read_raw()
367 ret = mmc35240_raw_to_mgauss(data, chan->address, buf, val); in mmc35240_read_raw()
376 mutex_lock(&data->mutex); in mmc35240_read_raw()
377 ret = regmap_read(data->regmap, MMC35240_REG_CTRL1, &reg); in mmc35240_read_raw()
378 mutex_unlock(&data->mutex); in mmc35240_read_raw()
384 return -EINVAL; in mmc35240_read_raw()
390 return -EINVAL; in mmc35240_read_raw()
405 return -EINVAL; in mmc35240_write_raw()
406 mutex_lock(&data->mutex); in mmc35240_write_raw()
407 ret = regmap_update_bits(data->regmap, MMC35240_REG_CTRL1, in mmc35240_write_raw()
410 mutex_unlock(&data->mutex); in mmc35240_write_raw()
413 return -EINVAL; in mmc35240_write_raw()
492 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); in mmc35240_probe()
494 return -ENOMEM; in mmc35240_probe()
498 dev_err(&client->dev, "regmap initialization failed\n"); in mmc35240_probe()
504 data->client = client; in mmc35240_probe()
505 data->regmap = regmap; in mmc35240_probe()
506 data->res = MMC35240_16_BITS_SLOW; in mmc35240_probe()
508 mutex_init(&data->mutex); in mmc35240_probe()
510 indio_dev->info = &mmc35240_info; in mmc35240_probe()
511 indio_dev->name = MMC35240_DRV_NAME; in mmc35240_probe()
512 indio_dev->channels = mmc35240_channels; in mmc35240_probe()
513 indio_dev->num_channels = ARRAY_SIZE(mmc35240_channels); in mmc35240_probe()
514 indio_dev->modes = INDIO_DIRECT_MODE; in mmc35240_probe()
518 dev_err(&client->dev, "mmc35240 chip init failed\n"); in mmc35240_probe()
521 return devm_iio_device_register(&client->dev, indio_dev); in mmc35240_probe()
530 regcache_cache_only(data->regmap, true); in mmc35240_suspend()
541 regcache_mark_dirty(data->regmap); in mmc35240_resume()
542 ret = regcache_sync_region(data->regmap, MMC35240_REG_CTRL0, in mmc35240_resume()
547 regcache_cache_only(data->regmap, false); in mmc35240_resume()