Symbol: ak8974
drivers/iio/magnetometer/ak8974.c
1001
ret = ak8974_configure(ak8974);
drivers/iio/magnetometer/ak8974.c
1008
ak8974_set_power(ak8974, AK8974_PWR_OFF);
drivers/iio/magnetometer/ak8974.c
1010
regulator_bulk_disable(ARRAY_SIZE(ak8974->regs), ak8974->regs);
drivers/iio/magnetometer/ak8974.c
206
static int ak8974_get_u16_val(struct ak8974 *ak8974, u8 reg, u16 *val)
drivers/iio/magnetometer/ak8974.c
211
ret = regmap_bulk_read(ak8974->map, reg, &bulk, 2);
drivers/iio/magnetometer/ak8974.c
219
static int ak8974_set_u16_val(struct ak8974 *ak8974, u8 reg, u16 val)
drivers/iio/magnetometer/ak8974.c
223
return regmap_bulk_write(ak8974->map, reg, &bulk, 2);
drivers/iio/magnetometer/ak8974.c
226
static int ak8974_set_power(struct ak8974 *ak8974, bool mode)
drivers/iio/magnetometer/ak8974.c
233
ret = regmap_write(ak8974->map, AK8974_CTRL1, val);
drivers/iio/magnetometer/ak8974.c
243
static int ak8974_reset(struct ak8974 *ak8974)
drivers/iio/magnetometer/ak8974.c
248
ret = ak8974_set_power(ak8974, AK8974_PWR_ON);
drivers/iio/magnetometer/ak8974.c
251
ret = regmap_write(ak8974->map, AK8974_CTRL2, AK8974_CTRL2_RESDEF);
drivers/iio/magnetometer/ak8974.c
254
ret = regmap_write(ak8974->map, AK8974_CTRL3, AK8974_CTRL3_RESDEF);
drivers/iio/magnetometer/ak8974.c
257
if (ak8974->variant != AK8974_WHOAMI_VALUE_HSCDTD008A) {
drivers/iio/magnetometer/ak8974.c
258
ret = regmap_write(ak8974->map, AK8974_INT_CTRL,
drivers/iio/magnetometer/ak8974.c
263
ret = regmap_write(ak8974->map, HSCDTD008A_CTRL4,
drivers/iio/magnetometer/ak8974.c
270
return ak8974_set_power(ak8974, AK8974_PWR_OFF);
drivers/iio/magnetometer/ak8974.c
273
static int ak8974_configure(struct ak8974 *ak8974)
drivers/iio/magnetometer/ak8974.c
277
ret = regmap_write(ak8974->map, AK8974_CTRL2, AK8974_CTRL2_DRDY_EN |
drivers/iio/magnetometer/ak8974.c
281
ret = regmap_write(ak8974->map, AK8974_CTRL3, 0);
drivers/iio/magnetometer/ak8974.c
284
if (ak8974->variant == AK8974_WHOAMI_VALUE_AMI306) {
drivers/iio/magnetometer/ak8974.c
286
ret = ak8974_set_u16_val(ak8974, AMI306_CTRL4, 0xA07E);
drivers/iio/magnetometer/ak8974.c
290
if (ak8974->variant == AK8974_WHOAMI_VALUE_HSCDTD008A)
drivers/iio/magnetometer/ak8974.c
292
ret = regmap_write(ak8974->map, AK8974_INT_CTRL, AK8974_INT_CTRL_POL);
drivers/iio/magnetometer/ak8974.c
296
return regmap_write(ak8974->map, AK8974_PRESET, 0);
drivers/iio/magnetometer/ak8974.c
299
static int ak8974_trigmeas(struct ak8974 *ak8974)
drivers/iio/magnetometer/ak8974.c
307
ret = regmap_read(ak8974->map, AK8974_INT_CLEAR, &clear);
drivers/iio/magnetometer/ak8974.c
312
if (ak8974->drdy_irq) {
drivers/iio/magnetometer/ak8974.c
318
if (!ak8974->drdy_active_low)
drivers/iio/magnetometer/ak8974.c
321
init_completion(&ak8974->drdy_complete);
drivers/iio/magnetometer/ak8974.c
322
ret = regmap_update_bits(ak8974->map, AK8974_CTRL2,
drivers/iio/magnetometer/ak8974.c
329
return regmap_set_bits(ak8974->map, AK8974_CTRL3, AK8974_CTRL3_FORCE);
drivers/iio/magnetometer/ak8974.c
332
static int ak8974_await_drdy(struct ak8974 *ak8974)
drivers/iio/magnetometer/ak8974.c
338
if (ak8974->drdy_irq) {
drivers/iio/magnetometer/ak8974.c
339
ret = wait_for_completion_timeout(&ak8974->drdy_complete,
drivers/iio/magnetometer/ak8974.c
342
dev_err(&ak8974->i2c->dev,
drivers/iio/magnetometer/ak8974.c
352
ret = regmap_read(ak8974->map, AK8974_STATUS, &val);
drivers/iio/magnetometer/ak8974.c
359
dev_err(&ak8974->i2c->dev, "timeout waiting for DRDY\n");
drivers/iio/magnetometer/ak8974.c
363
static int ak8974_getresult(struct ak8974 *ak8974, __le16 *result)
drivers/iio/magnetometer/ak8974.c
368
ret = ak8974_await_drdy(ak8974);
drivers/iio/magnetometer/ak8974.c
371
ret = regmap_read(ak8974->map, AK8974_INT_SRC, &src);
drivers/iio/magnetometer/ak8974.c
377
dev_err(&ak8974->i2c->dev,
drivers/iio/magnetometer/ak8974.c
382
ret = regmap_bulk_read(ak8974->map, AK8974_DATA_X, result, 6);
drivers/iio/magnetometer/ak8974.c
391
struct ak8974 *ak8974 = d;
drivers/iio/magnetometer/ak8974.c
393
if (!ak8974->drdy_irq)
drivers/iio/magnetometer/ak8974.c
402
struct ak8974 *ak8974 = d;
drivers/iio/magnetometer/ak8974.c
407
ret = regmap_read(ak8974->map, AK8974_STATUS, &val);
drivers/iio/magnetometer/ak8974.c
409
dev_err(&ak8974->i2c->dev, "error reading DRDY status\n");
drivers/iio/magnetometer/ak8974.c
414
complete(&ak8974->drdy_complete);
drivers/iio/magnetometer/ak8974.c
422
static int ak8974_selftest(struct ak8974 *ak8974)
drivers/iio/magnetometer/ak8974.c
424
struct device *dev = &ak8974->i2c->dev;
drivers/iio/magnetometer/ak8974.c
428
ret = regmap_read(ak8974->map, AK8974_SELFTEST, &val);
drivers/iio/magnetometer/ak8974.c
437
ret = regmap_set_bits(ak8974->map, AK8974_CTRL3, AK8974_CTRL3_SELFTEST);
drivers/iio/magnetometer/ak8974.c
445
ret = regmap_read(ak8974->map, AK8974_SELFTEST, &val);
drivers/iio/magnetometer/ak8974.c
453
ret = regmap_read(ak8974->map, AK8974_SELFTEST, &val);
drivers/iio/magnetometer/ak8974.c
465
static void ak8974_read_calib_data(struct ak8974 *ak8974, unsigned int reg,
drivers/iio/magnetometer/ak8974.c
468
int ret = regmap_bulk_read(ak8974->map, reg, tab, tab_size);
drivers/iio/magnetometer/ak8974.c
471
dev_warn(&ak8974->i2c->dev,
drivers/iio/magnetometer/ak8974.c
479
static int ak8974_detect(struct ak8974 *ak8974)
drivers/iio/magnetometer/ak8974.c
487
ret = regmap_read(ak8974->map, AK8974_WHOAMI, &whoami);
drivers/iio/magnetometer/ak8974.c
498
ret = regmap_read(ak8974->map, AMI305_VER, &fw);
drivers/iio/magnetometer/ak8974.c
502
ret = ak8974_get_u16_val(ak8974, AMI305_SN, &sn);
drivers/iio/magnetometer/ak8974.c
506
dev_info(&ak8974->i2c->dev,
drivers/iio/magnetometer/ak8974.c
512
dev_info(&ak8974->i2c->dev, "detected AK8974\n");
drivers/iio/magnetometer/ak8974.c
516
dev_info(&ak8974->i2c->dev, "detected hscdtd008a\n");
drivers/iio/magnetometer/ak8974.c
519
dev_err(&ak8974->i2c->dev, "unsupported device (%02x) ",
drivers/iio/magnetometer/ak8974.c
524
ak8974->name = name;
drivers/iio/magnetometer/ak8974.c
525
ak8974->variant = whoami;
drivers/iio/magnetometer/ak8974.c
531
ak8974_read_calib_data(ak8974, AMI306_FINEOUTPUT_X,
drivers/iio/magnetometer/ak8974.c
533
ak8974_read_calib_data(ak8974, AMI306_OFFZERO_X,
drivers/iio/magnetometer/ak8974.c
547
dev_info(&ak8974->i2c->dev,
drivers/iio/magnetometer/ak8974.c
557
static int ak8974_measure_channel(struct ak8974 *ak8974, unsigned long address,
drivers/iio/magnetometer/ak8974.c
563
pm_runtime_get_sync(&ak8974->i2c->dev);
drivers/iio/magnetometer/ak8974.c
564
mutex_lock(&ak8974->lock);
drivers/iio/magnetometer/ak8974.c
570
ret = ak8974_trigmeas(ak8974);
drivers/iio/magnetometer/ak8974.c
573
ret = ak8974_getresult(ak8974, hw_values);
drivers/iio/magnetometer/ak8974.c
584
mutex_unlock(&ak8974->lock);
drivers/iio/magnetometer/ak8974.c
585
pm_runtime_put_autosuspend(&ak8974->i2c->dev);
drivers/iio/magnetometer/ak8974.c
595
struct ak8974 *ak8974 = iio_priv(indio_dev);
drivers/iio/magnetometer/ak8974.c
601
dev_err(&ak8974->i2c->dev, "faulty channel address\n");
drivers/iio/magnetometer/ak8974.c
604
ret = ak8974_measure_channel(ak8974, chan->address, val);
drivers/iio/magnetometer/ak8974.c
609
switch (ak8974->variant) {
drivers/iio/magnetometer/ak8974.c
657
struct ak8974 *ak8974 = iio_priv(indio_dev);
drivers/iio/magnetometer/ak8974.c
660
pm_runtime_get_sync(&ak8974->i2c->dev);
drivers/iio/magnetometer/ak8974.c
661
mutex_lock(&ak8974->lock);
drivers/iio/magnetometer/ak8974.c
663
ret = ak8974_trigmeas(ak8974);
drivers/iio/magnetometer/ak8974.c
665
dev_err(&ak8974->i2c->dev, "error triggering measure\n");
drivers/iio/magnetometer/ak8974.c
668
ret = ak8974_getresult(ak8974, ak8974->scan.channels);
drivers/iio/magnetometer/ak8974.c
670
dev_err(&ak8974->i2c->dev, "error getting measures\n");
drivers/iio/magnetometer/ak8974.c
674
iio_push_to_buffers_with_ts(indio_dev, &ak8974->scan, sizeof(ak8974->scan),
drivers/iio/magnetometer/ak8974.c
678
mutex_unlock(&ak8974->lock);
drivers/iio/magnetometer/ak8974.c
679
pm_runtime_put_autosuspend(&ak8974->i2c->dev);
drivers/iio/magnetometer/ak8974.c
697
struct ak8974 *ak8974 = iio_priv(indio_dev);
drivers/iio/magnetometer/ak8974.c
699
return &ak8974->orientation;
drivers/iio/magnetometer/ak8974.c
758
struct ak8974 *ak8974 = iio_priv(indio_dev);
drivers/iio/magnetometer/ak8974.c
770
return ak8974->variant != AK8974_WHOAMI_VALUE_HSCDTD008A;
drivers/iio/magnetometer/ak8974.c
777
return ak8974->variant == AK8974_WHOAMI_VALUE_AK8974 ||
drivers/iio/magnetometer/ak8974.c
778
ak8974->variant == AK8974_WHOAMI_VALUE_HSCDTD008A;
drivers/iio/magnetometer/ak8974.c
785
return ak8974->variant == AK8974_WHOAMI_VALUE_AMI305 ||
drivers/iio/magnetometer/ak8974.c
786
ak8974->variant == AK8974_WHOAMI_VALUE_AMI306;
drivers/iio/magnetometer/ak8974.c
789
return ak8974->variant == AK8974_WHOAMI_VALUE_AMI306;
drivers/iio/magnetometer/ak8974.c
811
struct ak8974 *ak8974;
drivers/iio/magnetometer/ak8974.c
817
indio_dev = devm_iio_device_alloc(&i2c->dev, sizeof(*ak8974));
drivers/iio/magnetometer/ak8974.c
821
ak8974 = iio_priv(indio_dev);
drivers/iio/magnetometer/ak8974.c
823
ak8974->i2c = i2c;
drivers/iio/magnetometer/ak8974.c
824
mutex_init(&ak8974->lock);
drivers/iio/magnetometer/ak8974.c
826
ret = iio_read_mount_matrix(&i2c->dev, &ak8974->orientation);
drivers/iio/magnetometer/ak8974.c
830
ak8974->regs[0].supply = ak8974_reg_avdd;
drivers/iio/magnetometer/ak8974.c
831
ak8974->regs[1].supply = ak8974_reg_dvdd;
drivers/iio/magnetometer/ak8974.c
834
ARRAY_SIZE(ak8974->regs),
drivers/iio/magnetometer/ak8974.c
835
ak8974->regs);
drivers/iio/magnetometer/ak8974.c
839
ret = regulator_bulk_enable(ARRAY_SIZE(ak8974->regs), ak8974->regs);
drivers/iio/magnetometer/ak8974.c
850
ak8974->map = devm_regmap_init_i2c(i2c, &ak8974_regmap_config);
drivers/iio/magnetometer/ak8974.c
851
if (IS_ERR(ak8974->map)) {
drivers/iio/magnetometer/ak8974.c
855
return PTR_ERR(ak8974->map);
drivers/iio/magnetometer/ak8974.c
858
ret = ak8974_set_power(ak8974, AK8974_PWR_ON);
drivers/iio/magnetometer/ak8974.c
864
ret = ak8974_detect(ak8974);
drivers/iio/magnetometer/ak8974.c
870
ret = ak8974_selftest(ak8974);
drivers/iio/magnetometer/ak8974.c
874
ret = ak8974_reset(ak8974);
drivers/iio/magnetometer/ak8974.c
880
switch (ak8974->variant) {
drivers/iio/magnetometer/ak8974.c
898
indio_dev->name = ak8974->name;
drivers/iio/magnetometer/ak8974.c
914
ak8974->drdy_active_low = true;
drivers/iio/magnetometer/ak8974.c
927
ak8974->name,
drivers/iio/magnetometer/ak8974.c
928
ak8974);
drivers/iio/magnetometer/ak8974.c
934
ak8974->drdy_irq = true;
drivers/iio/magnetometer/ak8974.c
956
ak8974_set_power(ak8974, AK8974_PWR_OFF);
drivers/iio/magnetometer/ak8974.c
957
regulator_bulk_disable(ARRAY_SIZE(ak8974->regs), ak8974->regs);
drivers/iio/magnetometer/ak8974.c
965
struct ak8974 *ak8974 = iio_priv(indio_dev);
drivers/iio/magnetometer/ak8974.c
972
ak8974_set_power(ak8974, AK8974_PWR_OFF);
drivers/iio/magnetometer/ak8974.c
973
regulator_bulk_disable(ARRAY_SIZE(ak8974->regs), ak8974->regs);
drivers/iio/magnetometer/ak8974.c
978
struct ak8974 *ak8974 =
drivers/iio/magnetometer/ak8974.c
981
ak8974_set_power(ak8974, AK8974_PWR_OFF);
drivers/iio/magnetometer/ak8974.c
982
regulator_bulk_disable(ARRAY_SIZE(ak8974->regs), ak8974->regs);
drivers/iio/magnetometer/ak8974.c
989
struct ak8974 *ak8974 =
drivers/iio/magnetometer/ak8974.c
993
ret = regulator_bulk_enable(ARRAY_SIZE(ak8974->regs), ak8974->regs);
drivers/iio/magnetometer/ak8974.c
997
ret = ak8974_set_power(ak8974, AK8974_PWR_ON);