Symbol: ak8974
drivers/iio/magnetometer/ak8974.c
1002
ret = ak8974_configure(ak8974);
drivers/iio/magnetometer/ak8974.c
1009
ak8974_set_power(ak8974, AK8974_PWR_OFF);
drivers/iio/magnetometer/ak8974.c
1011
regulator_bulk_disable(ARRAY_SIZE(ak8974->regs), ak8974->regs);
drivers/iio/magnetometer/ak8974.c
207
static int ak8974_get_u16_val(struct ak8974 *ak8974, u8 reg, u16 *val)
drivers/iio/magnetometer/ak8974.c
212
ret = regmap_bulk_read(ak8974->map, reg, &bulk, 2);
drivers/iio/magnetometer/ak8974.c
220
static int ak8974_set_u16_val(struct ak8974 *ak8974, u8 reg, u16 val)
drivers/iio/magnetometer/ak8974.c
224
return regmap_bulk_write(ak8974->map, reg, &bulk, 2);
drivers/iio/magnetometer/ak8974.c
227
static int ak8974_set_power(struct ak8974 *ak8974, bool mode)
drivers/iio/magnetometer/ak8974.c
234
ret = regmap_write(ak8974->map, AK8974_CTRL1, val);
drivers/iio/magnetometer/ak8974.c
244
static int ak8974_reset(struct ak8974 *ak8974)
drivers/iio/magnetometer/ak8974.c
249
ret = ak8974_set_power(ak8974, AK8974_PWR_ON);
drivers/iio/magnetometer/ak8974.c
252
ret = regmap_write(ak8974->map, AK8974_CTRL2, AK8974_CTRL2_RESDEF);
drivers/iio/magnetometer/ak8974.c
255
ret = regmap_write(ak8974->map, AK8974_CTRL3, AK8974_CTRL3_RESDEF);
drivers/iio/magnetometer/ak8974.c
258
if (ak8974->variant != AK8974_WHOAMI_VALUE_HSCDTD008A) {
drivers/iio/magnetometer/ak8974.c
259
ret = regmap_write(ak8974->map, AK8974_INT_CTRL,
drivers/iio/magnetometer/ak8974.c
264
ret = regmap_write(ak8974->map, HSCDTD008A_CTRL4,
drivers/iio/magnetometer/ak8974.c
271
return ak8974_set_power(ak8974, AK8974_PWR_OFF);
drivers/iio/magnetometer/ak8974.c
274
static int ak8974_configure(struct ak8974 *ak8974)
drivers/iio/magnetometer/ak8974.c
278
ret = regmap_write(ak8974->map, AK8974_CTRL2, AK8974_CTRL2_DRDY_EN |
drivers/iio/magnetometer/ak8974.c
282
ret = regmap_write(ak8974->map, AK8974_CTRL3, 0);
drivers/iio/magnetometer/ak8974.c
285
if (ak8974->variant == AK8974_WHOAMI_VALUE_AMI306) {
drivers/iio/magnetometer/ak8974.c
287
ret = ak8974_set_u16_val(ak8974, AMI306_CTRL4, 0xA07E);
drivers/iio/magnetometer/ak8974.c
291
if (ak8974->variant == AK8974_WHOAMI_VALUE_HSCDTD008A)
drivers/iio/magnetometer/ak8974.c
293
ret = regmap_write(ak8974->map, AK8974_INT_CTRL, AK8974_INT_CTRL_POL);
drivers/iio/magnetometer/ak8974.c
297
return regmap_write(ak8974->map, AK8974_PRESET, 0);
drivers/iio/magnetometer/ak8974.c
300
static int ak8974_trigmeas(struct ak8974 *ak8974)
drivers/iio/magnetometer/ak8974.c
308
ret = regmap_read(ak8974->map, AK8974_INT_CLEAR, &clear);
drivers/iio/magnetometer/ak8974.c
313
if (ak8974->drdy_irq) {
drivers/iio/magnetometer/ak8974.c
319
if (!ak8974->drdy_active_low)
drivers/iio/magnetometer/ak8974.c
322
init_completion(&ak8974->drdy_complete);
drivers/iio/magnetometer/ak8974.c
323
ret = regmap_update_bits(ak8974->map, AK8974_CTRL2,
drivers/iio/magnetometer/ak8974.c
330
return regmap_set_bits(ak8974->map, AK8974_CTRL3, AK8974_CTRL3_FORCE);
drivers/iio/magnetometer/ak8974.c
333
static int ak8974_await_drdy(struct ak8974 *ak8974)
drivers/iio/magnetometer/ak8974.c
339
if (ak8974->drdy_irq) {
drivers/iio/magnetometer/ak8974.c
340
ret = wait_for_completion_timeout(&ak8974->drdy_complete,
drivers/iio/magnetometer/ak8974.c
343
dev_err(&ak8974->i2c->dev,
drivers/iio/magnetometer/ak8974.c
353
ret = regmap_read(ak8974->map, AK8974_STATUS, &val);
drivers/iio/magnetometer/ak8974.c
360
dev_err(&ak8974->i2c->dev, "timeout waiting for DRDY\n");
drivers/iio/magnetometer/ak8974.c
364
static int ak8974_getresult(struct ak8974 *ak8974, __le16 *result)
drivers/iio/magnetometer/ak8974.c
369
ret = ak8974_await_drdy(ak8974);
drivers/iio/magnetometer/ak8974.c
372
ret = regmap_read(ak8974->map, AK8974_INT_SRC, &src);
drivers/iio/magnetometer/ak8974.c
378
dev_err(&ak8974->i2c->dev,
drivers/iio/magnetometer/ak8974.c
383
ret = regmap_bulk_read(ak8974->map, AK8974_DATA_X, result, 6);
drivers/iio/magnetometer/ak8974.c
392
struct ak8974 *ak8974 = d;
drivers/iio/magnetometer/ak8974.c
394
if (!ak8974->drdy_irq)
drivers/iio/magnetometer/ak8974.c
403
struct ak8974 *ak8974 = d;
drivers/iio/magnetometer/ak8974.c
408
ret = regmap_read(ak8974->map, AK8974_STATUS, &val);
drivers/iio/magnetometer/ak8974.c
410
dev_err(&ak8974->i2c->dev, "error reading DRDY status\n");
drivers/iio/magnetometer/ak8974.c
415
complete(&ak8974->drdy_complete);
drivers/iio/magnetometer/ak8974.c
423
static int ak8974_selftest(struct ak8974 *ak8974)
drivers/iio/magnetometer/ak8974.c
425
struct device *dev = &ak8974->i2c->dev;
drivers/iio/magnetometer/ak8974.c
429
ret = regmap_read(ak8974->map, AK8974_SELFTEST, &val);
drivers/iio/magnetometer/ak8974.c
438
ret = regmap_set_bits(ak8974->map, AK8974_CTRL3, AK8974_CTRL3_SELFTEST);
drivers/iio/magnetometer/ak8974.c
446
ret = regmap_read(ak8974->map, AK8974_SELFTEST, &val);
drivers/iio/magnetometer/ak8974.c
454
ret = regmap_read(ak8974->map, AK8974_SELFTEST, &val);
drivers/iio/magnetometer/ak8974.c
466
static void ak8974_read_calib_data(struct ak8974 *ak8974, unsigned int reg,
drivers/iio/magnetometer/ak8974.c
469
int ret = regmap_bulk_read(ak8974->map, reg, tab, tab_size);
drivers/iio/magnetometer/ak8974.c
472
dev_warn(&ak8974->i2c->dev,
drivers/iio/magnetometer/ak8974.c
480
static int ak8974_detect(struct ak8974 *ak8974)
drivers/iio/magnetometer/ak8974.c
488
ret = regmap_read(ak8974->map, AK8974_WHOAMI, &whoami);
drivers/iio/magnetometer/ak8974.c
499
ret = regmap_read(ak8974->map, AMI305_VER, &fw);
drivers/iio/magnetometer/ak8974.c
503
ret = ak8974_get_u16_val(ak8974, AMI305_SN, &sn);
drivers/iio/magnetometer/ak8974.c
507
dev_info(&ak8974->i2c->dev,
drivers/iio/magnetometer/ak8974.c
513
dev_info(&ak8974->i2c->dev, "detected AK8974\n");
drivers/iio/magnetometer/ak8974.c
517
dev_info(&ak8974->i2c->dev, "detected hscdtd008a\n");
drivers/iio/magnetometer/ak8974.c
520
dev_err(&ak8974->i2c->dev, "unsupported device (%02x) ",
drivers/iio/magnetometer/ak8974.c
525
ak8974->name = name;
drivers/iio/magnetometer/ak8974.c
526
ak8974->variant = whoami;
drivers/iio/magnetometer/ak8974.c
532
ak8974_read_calib_data(ak8974, AMI306_FINEOUTPUT_X,
drivers/iio/magnetometer/ak8974.c
534
ak8974_read_calib_data(ak8974, AMI306_OFFZERO_X,
drivers/iio/magnetometer/ak8974.c
548
dev_info(&ak8974->i2c->dev,
drivers/iio/magnetometer/ak8974.c
558
static int ak8974_measure_channel(struct ak8974 *ak8974, unsigned long address,
drivers/iio/magnetometer/ak8974.c
564
pm_runtime_get_sync(&ak8974->i2c->dev);
drivers/iio/magnetometer/ak8974.c
565
mutex_lock(&ak8974->lock);
drivers/iio/magnetometer/ak8974.c
571
ret = ak8974_trigmeas(ak8974);
drivers/iio/magnetometer/ak8974.c
574
ret = ak8974_getresult(ak8974, hw_values);
drivers/iio/magnetometer/ak8974.c
585
mutex_unlock(&ak8974->lock);
drivers/iio/magnetometer/ak8974.c
586
pm_runtime_put_autosuspend(&ak8974->i2c->dev);
drivers/iio/magnetometer/ak8974.c
596
struct ak8974 *ak8974 = iio_priv(indio_dev);
drivers/iio/magnetometer/ak8974.c
602
dev_err(&ak8974->i2c->dev, "faulty channel address\n");
drivers/iio/magnetometer/ak8974.c
605
ret = ak8974_measure_channel(ak8974, chan->address, val);
drivers/iio/magnetometer/ak8974.c
610
switch (ak8974->variant) {
drivers/iio/magnetometer/ak8974.c
658
struct ak8974 *ak8974 = iio_priv(indio_dev);
drivers/iio/magnetometer/ak8974.c
661
pm_runtime_get_sync(&ak8974->i2c->dev);
drivers/iio/magnetometer/ak8974.c
662
mutex_lock(&ak8974->lock);
drivers/iio/magnetometer/ak8974.c
664
ret = ak8974_trigmeas(ak8974);
drivers/iio/magnetometer/ak8974.c
666
dev_err(&ak8974->i2c->dev, "error triggering measure\n");
drivers/iio/magnetometer/ak8974.c
669
ret = ak8974_getresult(ak8974, ak8974->scan.channels);
drivers/iio/magnetometer/ak8974.c
671
dev_err(&ak8974->i2c->dev, "error getting measures\n");
drivers/iio/magnetometer/ak8974.c
675
iio_push_to_buffers_with_ts(indio_dev, &ak8974->scan, sizeof(ak8974->scan),
drivers/iio/magnetometer/ak8974.c
679
mutex_unlock(&ak8974->lock);
drivers/iio/magnetometer/ak8974.c
680
pm_runtime_put_autosuspend(&ak8974->i2c->dev);
drivers/iio/magnetometer/ak8974.c
698
struct ak8974 *ak8974 = iio_priv(indio_dev);
drivers/iio/magnetometer/ak8974.c
700
return &ak8974->orientation;
drivers/iio/magnetometer/ak8974.c
759
struct ak8974 *ak8974 = iio_priv(indio_dev);
drivers/iio/magnetometer/ak8974.c
771
return ak8974->variant != AK8974_WHOAMI_VALUE_HSCDTD008A;
drivers/iio/magnetometer/ak8974.c
778
return ak8974->variant == AK8974_WHOAMI_VALUE_AK8974 ||
drivers/iio/magnetometer/ak8974.c
779
ak8974->variant == AK8974_WHOAMI_VALUE_HSCDTD008A;
drivers/iio/magnetometer/ak8974.c
786
return ak8974->variant == AK8974_WHOAMI_VALUE_AMI305 ||
drivers/iio/magnetometer/ak8974.c
787
ak8974->variant == AK8974_WHOAMI_VALUE_AMI306;
drivers/iio/magnetometer/ak8974.c
790
return ak8974->variant == AK8974_WHOAMI_VALUE_AMI306;
drivers/iio/magnetometer/ak8974.c
812
struct ak8974 *ak8974;
drivers/iio/magnetometer/ak8974.c
818
indio_dev = devm_iio_device_alloc(&i2c->dev, sizeof(*ak8974));
drivers/iio/magnetometer/ak8974.c
822
ak8974 = iio_priv(indio_dev);
drivers/iio/magnetometer/ak8974.c
824
ak8974->i2c = i2c;
drivers/iio/magnetometer/ak8974.c
825
mutex_init(&ak8974->lock);
drivers/iio/magnetometer/ak8974.c
827
ret = iio_read_mount_matrix(&i2c->dev, &ak8974->orientation);
drivers/iio/magnetometer/ak8974.c
831
ak8974->regs[0].supply = ak8974_reg_avdd;
drivers/iio/magnetometer/ak8974.c
832
ak8974->regs[1].supply = ak8974_reg_dvdd;
drivers/iio/magnetometer/ak8974.c
835
ARRAY_SIZE(ak8974->regs),
drivers/iio/magnetometer/ak8974.c
836
ak8974->regs);
drivers/iio/magnetometer/ak8974.c
840
ret = regulator_bulk_enable(ARRAY_SIZE(ak8974->regs), ak8974->regs);
drivers/iio/magnetometer/ak8974.c
851
ak8974->map = devm_regmap_init_i2c(i2c, &ak8974_regmap_config);
drivers/iio/magnetometer/ak8974.c
852
if (IS_ERR(ak8974->map)) {
drivers/iio/magnetometer/ak8974.c
856
return PTR_ERR(ak8974->map);
drivers/iio/magnetometer/ak8974.c
859
ret = ak8974_set_power(ak8974, AK8974_PWR_ON);
drivers/iio/magnetometer/ak8974.c
865
ret = ak8974_detect(ak8974);
drivers/iio/magnetometer/ak8974.c
871
ret = ak8974_selftest(ak8974);
drivers/iio/magnetometer/ak8974.c
875
ret = ak8974_reset(ak8974);
drivers/iio/magnetometer/ak8974.c
881
switch (ak8974->variant) {
drivers/iio/magnetometer/ak8974.c
899
indio_dev->name = ak8974->name;
drivers/iio/magnetometer/ak8974.c
915
ak8974->drdy_active_low = true;
drivers/iio/magnetometer/ak8974.c
928
ak8974->name,
drivers/iio/magnetometer/ak8974.c
929
ak8974);
drivers/iio/magnetometer/ak8974.c
935
ak8974->drdy_irq = true;
drivers/iio/magnetometer/ak8974.c
957
ak8974_set_power(ak8974, AK8974_PWR_OFF);
drivers/iio/magnetometer/ak8974.c
958
regulator_bulk_disable(ARRAY_SIZE(ak8974->regs), ak8974->regs);
drivers/iio/magnetometer/ak8974.c
966
struct ak8974 *ak8974 = iio_priv(indio_dev);
drivers/iio/magnetometer/ak8974.c
973
ak8974_set_power(ak8974, AK8974_PWR_OFF);
drivers/iio/magnetometer/ak8974.c
974
regulator_bulk_disable(ARRAY_SIZE(ak8974->regs), ak8974->regs);
drivers/iio/magnetometer/ak8974.c
979
struct ak8974 *ak8974 =
drivers/iio/magnetometer/ak8974.c
982
ak8974_set_power(ak8974, AK8974_PWR_OFF);
drivers/iio/magnetometer/ak8974.c
983
regulator_bulk_disable(ARRAY_SIZE(ak8974->regs), ak8974->regs);
drivers/iio/magnetometer/ak8974.c
990
struct ak8974 *ak8974 =
drivers/iio/magnetometer/ak8974.c
994
ret = regulator_bulk_enable(ARRAY_SIZE(ak8974->regs), ak8974->regs);
drivers/iio/magnetometer/ak8974.c
998
ret = ak8974_set_power(ak8974, AK8974_PWR_ON);