Lines Matching defs:ak8974

173  * struct ak8974 - state container for the AK8974 driver
186 struct ak8974 {
207 static int ak8974_get_u16_val(struct ak8974 *ak8974, u8 reg, u16 *val)
212 ret = regmap_bulk_read(ak8974->map, reg, &bulk, 2);
220 static int ak8974_set_u16_val(struct ak8974 *ak8974, u8 reg, u16 val)
224 return regmap_bulk_write(ak8974->map, reg, &bulk, 2);
227 static int ak8974_set_power(struct ak8974 *ak8974, bool mode)
234 ret = regmap_write(ak8974->map, AK8974_CTRL1, val);
244 static int ak8974_reset(struct ak8974 *ak8974)
249 ret = ak8974_set_power(ak8974, AK8974_PWR_ON);
252 ret = regmap_write(ak8974->map, AK8974_CTRL2, AK8974_CTRL2_RESDEF);
255 ret = regmap_write(ak8974->map, AK8974_CTRL3, AK8974_CTRL3_RESDEF);
258 if (ak8974->variant != AK8974_WHOAMI_VALUE_HSCDTD008A) {
259 ret = regmap_write(ak8974->map, AK8974_INT_CTRL,
264 ret = regmap_write(ak8974->map, HSCDTD008A_CTRL4,
271 return ak8974_set_power(ak8974, AK8974_PWR_OFF);
274 static int ak8974_configure(struct ak8974 *ak8974)
278 ret = regmap_write(ak8974->map, AK8974_CTRL2, AK8974_CTRL2_DRDY_EN |
282 ret = regmap_write(ak8974->map, AK8974_CTRL3, 0);
285 if (ak8974->variant == AK8974_WHOAMI_VALUE_AMI306) {
287 ret = ak8974_set_u16_val(ak8974, AMI306_CTRL4, 0xA07E);
291 if (ak8974->variant == AK8974_WHOAMI_VALUE_HSCDTD008A)
293 ret = regmap_write(ak8974->map, AK8974_INT_CTRL, AK8974_INT_CTRL_POL);
297 return regmap_write(ak8974->map, AK8974_PRESET, 0);
300 static int ak8974_trigmeas(struct ak8974 *ak8974)
308 ret = regmap_read(ak8974->map, AK8974_INT_CLEAR, &clear);
313 if (ak8974->drdy_irq) {
319 if (!ak8974->drdy_active_low)
322 init_completion(&ak8974->drdy_complete);
323 ret = regmap_update_bits(ak8974->map, AK8974_CTRL2,
330 return regmap_update_bits(ak8974->map,
336 static int ak8974_await_drdy(struct ak8974 *ak8974)
342 if (ak8974->drdy_irq) {
343 ret = wait_for_completion_timeout(&ak8974->drdy_complete,
346 dev_err(&ak8974->i2c->dev,
356 ret = regmap_read(ak8974->map, AK8974_STATUS, &val);
363 dev_err(&ak8974->i2c->dev, "timeout waiting for DRDY\n");
367 static int ak8974_getresult(struct ak8974 *ak8974, __le16 *result)
372 ret = ak8974_await_drdy(ak8974);
375 ret = regmap_read(ak8974->map, AK8974_INT_SRC, &src);
381 dev_err(&ak8974->i2c->dev,
386 ret = regmap_bulk_read(ak8974->map, AK8974_DATA_X, result, 6);
395 struct ak8974 *ak8974 = d;
397 if (!ak8974->drdy_irq)
406 struct ak8974 *ak8974 = d;
411 ret = regmap_read(ak8974->map, AK8974_STATUS, &val);
413 dev_err(&ak8974->i2c->dev, "error reading DRDY status\n");
418 complete(&ak8974->drdy_complete);
426 static int ak8974_selftest(struct ak8974 *ak8974)
428 struct device *dev = &ak8974->i2c->dev;
432 ret = regmap_read(ak8974->map, AK8974_SELFTEST, &val);
441 ret = regmap_update_bits(ak8974->map,
452 ret = regmap_read(ak8974->map, AK8974_SELFTEST, &val);
460 ret = regmap_read(ak8974->map, AK8974_SELFTEST, &val);
472 static void ak8974_read_calib_data(struct ak8974 *ak8974, unsigned int reg,
475 int ret = regmap_bulk_read(ak8974->map, reg, tab, tab_size);
478 dev_warn(&ak8974->i2c->dev,
486 static int ak8974_detect(struct ak8974 *ak8974)
494 ret = regmap_read(ak8974->map, AK8974_WHOAMI, &whoami);
505 ret = regmap_read(ak8974->map, AMI305_VER, &fw);
509 ret = ak8974_get_u16_val(ak8974, AMI305_SN, &sn);
513 dev_info(&ak8974->i2c->dev,
518 name = "ak8974";
519 dev_info(&ak8974->i2c->dev, "detected AK8974\n");
523 dev_info(&ak8974->i2c->dev, "detected hscdtd008a\n");
526 dev_err(&ak8974->i2c->dev, "unsupported device (%02x) ",
531 ak8974->name = name;
532 ak8974->variant = whoami;
538 ak8974_read_calib_data(ak8974, AMI306_FINEOUTPUT_X,
540 ak8974_read_calib_data(ak8974, AMI306_OFFZERO_X,
554 dev_info(&ak8974->i2c->dev,
564 static int ak8974_measure_channel(struct ak8974 *ak8974, unsigned long address,
570 pm_runtime_get_sync(&ak8974->i2c->dev);
571 mutex_lock(&ak8974->lock);
577 ret = ak8974_trigmeas(ak8974);
580 ret = ak8974_getresult(ak8974, hw_values);
591 mutex_unlock(&ak8974->lock);
592 pm_runtime_mark_last_busy(&ak8974->i2c->dev);
593 pm_runtime_put_autosuspend(&ak8974->i2c->dev);
603 struct ak8974 *ak8974 = iio_priv(indio_dev);
609 dev_err(&ak8974->i2c->dev, "faulty channel address\n");
612 ret = ak8974_measure_channel(ak8974, chan->address, val);
617 switch (ak8974->variant) {
665 struct ak8974 *ak8974 = iio_priv(indio_dev);
668 pm_runtime_get_sync(&ak8974->i2c->dev);
669 mutex_lock(&ak8974->lock);
671 ret = ak8974_trigmeas(ak8974);
673 dev_err(&ak8974->i2c->dev, "error triggering measure\n");
676 ret = ak8974_getresult(ak8974, ak8974->scan.channels);
678 dev_err(&ak8974->i2c->dev, "error getting measures\n");
682 iio_push_to_buffers_with_timestamp(indio_dev, &ak8974->scan,
686 mutex_unlock(&ak8974->lock);
687 pm_runtime_mark_last_busy(&ak8974->i2c->dev);
688 pm_runtime_put_autosuspend(&ak8974->i2c->dev);
706 struct ak8974 *ak8974 = iio_priv(indio_dev);
708 return &ak8974->orientation;
767 struct ak8974 *ak8974 = iio_priv(indio_dev);
779 return ak8974->variant != AK8974_WHOAMI_VALUE_HSCDTD008A;
786 return ak8974->variant == AK8974_WHOAMI_VALUE_AK8974 ||
787 ak8974->variant == AK8974_WHOAMI_VALUE_HSCDTD008A;
794 return ak8974->variant == AK8974_WHOAMI_VALUE_AMI305 ||
795 ak8974->variant == AK8974_WHOAMI_VALUE_AMI306;
798 return ak8974->variant == AK8974_WHOAMI_VALUE_AMI306;
820 struct ak8974 *ak8974;
826 indio_dev = devm_iio_device_alloc(&i2c->dev, sizeof(*ak8974));
830 ak8974 = iio_priv(indio_dev);
832 ak8974->i2c = i2c;
833 mutex_init(&ak8974->lock);
835 ret = iio_read_mount_matrix(&i2c->dev, &ak8974->orientation);
839 ak8974->regs[0].supply = ak8974_reg_avdd;
840 ak8974->regs[1].supply = ak8974_reg_dvdd;
843 ARRAY_SIZE(ak8974->regs),
844 ak8974->regs);
848 ret = regulator_bulk_enable(ARRAY_SIZE(ak8974->regs), ak8974->regs);
859 ak8974->map = devm_regmap_init_i2c(i2c, &ak8974_regmap_config);
860 if (IS_ERR(ak8974->map)) {
864 return PTR_ERR(ak8974->map);
867 ret = ak8974_set_power(ak8974, AK8974_PWR_ON);
873 ret = ak8974_detect(ak8974);
879 ret = ak8974_selftest(ak8974);
883 ret = ak8974_reset(ak8974);
889 switch (ak8974->variant) {
907 indio_dev->name = ak8974->name;
923 ak8974->drdy_active_low = true;
936 ak8974->name,
937 ak8974);
943 ak8974->drdy_irq = true;
965 ak8974_set_power(ak8974, AK8974_PWR_OFF);
966 regulator_bulk_disable(ARRAY_SIZE(ak8974->regs), ak8974->regs);
974 struct ak8974 *ak8974 = iio_priv(indio_dev);
981 ak8974_set_power(ak8974, AK8974_PWR_OFF);
982 regulator_bulk_disable(ARRAY_SIZE(ak8974->regs), ak8974->regs);
987 struct ak8974 *ak8974 =
990 ak8974_set_power(ak8974, AK8974_PWR_OFF);
991 regulator_bulk_disable(ARRAY_SIZE(ak8974->regs), ak8974->regs);
998 struct ak8974 *ak8974 =
1002 ret = regulator_bulk_enable(ARRAY_SIZE(ak8974->regs), ak8974->regs);
1006 ret = ak8974_set_power(ak8974, AK8974_PWR_ON);
1010 ret = ak8974_configure(ak8974);
1017 ak8974_set_power(ak8974, AK8974_PWR_OFF);
1019 regulator_bulk_disable(ARRAY_SIZE(ak8974->regs), ak8974->regs);
1030 {"ak8974", 0 },
1037 { .compatible = "asahi-kasei,ak8974", },
1045 .name = "ak8974",