ak8974 193 drivers/iio/magnetometer/ak8974.c static int ak8974_get_u16_val(struct ak8974 *ak8974, u8 reg, u16 *val) ak8974 198 drivers/iio/magnetometer/ak8974.c ret = regmap_bulk_read(ak8974->map, reg, &bulk, 2); ak8974 206 drivers/iio/magnetometer/ak8974.c static int ak8974_set_u16_val(struct ak8974 *ak8974, u8 reg, u16 val) ak8974 210 drivers/iio/magnetometer/ak8974.c return regmap_bulk_write(ak8974->map, reg, &bulk, 2); ak8974 213 drivers/iio/magnetometer/ak8974.c static int ak8974_set_power(struct ak8974 *ak8974, bool mode) ak8974 220 drivers/iio/magnetometer/ak8974.c ret = regmap_write(ak8974->map, AK8974_CTRL1, val); ak8974 230 drivers/iio/magnetometer/ak8974.c static int ak8974_reset(struct ak8974 *ak8974) ak8974 235 drivers/iio/magnetometer/ak8974.c ret = ak8974_set_power(ak8974, AK8974_PWR_ON); ak8974 238 drivers/iio/magnetometer/ak8974.c ret = regmap_write(ak8974->map, AK8974_CTRL2, AK8974_CTRL2_RESDEF); ak8974 241 drivers/iio/magnetometer/ak8974.c ret = regmap_write(ak8974->map, AK8974_CTRL3, AK8974_CTRL3_RESDEF); ak8974 244 drivers/iio/magnetometer/ak8974.c ret = regmap_write(ak8974->map, AK8974_INT_CTRL, ak8974 250 drivers/iio/magnetometer/ak8974.c return ak8974_set_power(ak8974, AK8974_PWR_OFF); ak8974 253 drivers/iio/magnetometer/ak8974.c static int ak8974_configure(struct ak8974 *ak8974) ak8974 257 drivers/iio/magnetometer/ak8974.c ret = regmap_write(ak8974->map, AK8974_CTRL2, AK8974_CTRL2_DRDY_EN | ak8974 261 drivers/iio/magnetometer/ak8974.c ret = regmap_write(ak8974->map, AK8974_CTRL3, 0); ak8974 264 drivers/iio/magnetometer/ak8974.c if (ak8974->variant == AK8974_WHOAMI_VALUE_AMI306) { ak8974 266 drivers/iio/magnetometer/ak8974.c ret = ak8974_set_u16_val(ak8974, AMI306_CTRL4, 0xA07E); ak8974 270 drivers/iio/magnetometer/ak8974.c ret = regmap_write(ak8974->map, AK8974_INT_CTRL, AK8974_INT_CTRL_POL); ak8974 274 drivers/iio/magnetometer/ak8974.c return regmap_write(ak8974->map, AK8974_PRESET, 0); ak8974 277 drivers/iio/magnetometer/ak8974.c static int ak8974_trigmeas(struct ak8974 *ak8974) ak8974 285 drivers/iio/magnetometer/ak8974.c ret = regmap_read(ak8974->map, AK8974_INT_CLEAR, &clear); ak8974 290 drivers/iio/magnetometer/ak8974.c if (ak8974->drdy_irq) { ak8974 296 drivers/iio/magnetometer/ak8974.c if (!ak8974->drdy_active_low) ak8974 299 drivers/iio/magnetometer/ak8974.c init_completion(&ak8974->drdy_complete); ak8974 300 drivers/iio/magnetometer/ak8974.c ret = regmap_update_bits(ak8974->map, AK8974_CTRL2, ak8974 307 drivers/iio/magnetometer/ak8974.c return regmap_update_bits(ak8974->map, ak8974 313 drivers/iio/magnetometer/ak8974.c static int ak8974_await_drdy(struct ak8974 *ak8974) ak8974 319 drivers/iio/magnetometer/ak8974.c if (ak8974->drdy_irq) { ak8974 320 drivers/iio/magnetometer/ak8974.c ret = wait_for_completion_timeout(&ak8974->drdy_complete, ak8974 323 drivers/iio/magnetometer/ak8974.c dev_err(&ak8974->i2c->dev, ak8974 333 drivers/iio/magnetometer/ak8974.c ret = regmap_read(ak8974->map, AK8974_STATUS, &val); ak8974 340 drivers/iio/magnetometer/ak8974.c dev_err(&ak8974->i2c->dev, "timeout waiting for DRDY\n"); ak8974 344 drivers/iio/magnetometer/ak8974.c static int ak8974_getresult(struct ak8974 *ak8974, __le16 *result) ak8974 349 drivers/iio/magnetometer/ak8974.c ret = ak8974_await_drdy(ak8974); ak8974 352 drivers/iio/magnetometer/ak8974.c ret = regmap_read(ak8974->map, AK8974_INT_SRC, &src); ak8974 358 drivers/iio/magnetometer/ak8974.c dev_err(&ak8974->i2c->dev, ak8974 363 drivers/iio/magnetometer/ak8974.c ret = regmap_bulk_read(ak8974->map, AK8974_DATA_X, result, 6); ak8974 372 drivers/iio/magnetometer/ak8974.c struct ak8974 *ak8974 = d; ak8974 374 drivers/iio/magnetometer/ak8974.c if (!ak8974->drdy_irq) ak8974 383 drivers/iio/magnetometer/ak8974.c struct ak8974 *ak8974 = d; ak8974 388 drivers/iio/magnetometer/ak8974.c ret = regmap_read(ak8974->map, AK8974_STATUS, &val); ak8974 390 drivers/iio/magnetometer/ak8974.c dev_err(&ak8974->i2c->dev, "error reading DRDY status\n"); ak8974 395 drivers/iio/magnetometer/ak8974.c complete(&ak8974->drdy_complete); ak8974 403 drivers/iio/magnetometer/ak8974.c static int ak8974_selftest(struct ak8974 *ak8974) ak8974 405 drivers/iio/magnetometer/ak8974.c struct device *dev = &ak8974->i2c->dev; ak8974 409 drivers/iio/magnetometer/ak8974.c ret = regmap_read(ak8974->map, AK8974_SELFTEST, &val); ak8974 418 drivers/iio/magnetometer/ak8974.c ret = regmap_update_bits(ak8974->map, ak8974 429 drivers/iio/magnetometer/ak8974.c ret = regmap_read(ak8974->map, AK8974_SELFTEST, &val); ak8974 437 drivers/iio/magnetometer/ak8974.c ret = regmap_read(ak8974->map, AK8974_SELFTEST, &val); ak8974 449 drivers/iio/magnetometer/ak8974.c static void ak8974_read_calib_data(struct ak8974 *ak8974, unsigned int reg, ak8974 452 drivers/iio/magnetometer/ak8974.c int ret = regmap_bulk_read(ak8974->map, reg, tab, tab_size); ak8974 455 drivers/iio/magnetometer/ak8974.c dev_warn(&ak8974->i2c->dev, ak8974 463 drivers/iio/magnetometer/ak8974.c static int ak8974_detect(struct ak8974 *ak8974) ak8974 471 drivers/iio/magnetometer/ak8974.c ret = regmap_read(ak8974->map, AK8974_WHOAMI, &whoami); ak8974 482 drivers/iio/magnetometer/ak8974.c ret = regmap_read(ak8974->map, AMI305_VER, &fw); ak8974 486 drivers/iio/magnetometer/ak8974.c ret = ak8974_get_u16_val(ak8974, AMI305_SN, &sn); ak8974 490 drivers/iio/magnetometer/ak8974.c dev_info(&ak8974->i2c->dev, ak8974 496 drivers/iio/magnetometer/ak8974.c dev_info(&ak8974->i2c->dev, "detected AK8974\n"); ak8974 499 drivers/iio/magnetometer/ak8974.c dev_err(&ak8974->i2c->dev, "unsupported device (%02x) ", ak8974 504 drivers/iio/magnetometer/ak8974.c ak8974->name = name; ak8974 505 drivers/iio/magnetometer/ak8974.c ak8974->variant = whoami; ak8974 511 drivers/iio/magnetometer/ak8974.c ak8974_read_calib_data(ak8974, AMI306_FINEOUTPUT_X, ak8974 513 drivers/iio/magnetometer/ak8974.c ak8974_read_calib_data(ak8974, AMI306_OFFZERO_X, ak8974 527 drivers/iio/magnetometer/ak8974.c dev_info(&ak8974->i2c->dev, ak8974 542 drivers/iio/magnetometer/ak8974.c struct ak8974 *ak8974 = iio_priv(indio_dev); ak8974 546 drivers/iio/magnetometer/ak8974.c pm_runtime_get_sync(&ak8974->i2c->dev); ak8974 547 drivers/iio/magnetometer/ak8974.c mutex_lock(&ak8974->lock); ak8974 552 drivers/iio/magnetometer/ak8974.c dev_err(&ak8974->i2c->dev, "faulty channel address\n"); ak8974 556 drivers/iio/magnetometer/ak8974.c ret = ak8974_trigmeas(ak8974); ak8974 559 drivers/iio/magnetometer/ak8974.c ret = ak8974_getresult(ak8974, hw_values); ak8974 573 drivers/iio/magnetometer/ak8974.c mutex_unlock(&ak8974->lock); ak8974 574 drivers/iio/magnetometer/ak8974.c pm_runtime_mark_last_busy(&ak8974->i2c->dev); ak8974 575 drivers/iio/magnetometer/ak8974.c pm_runtime_put_autosuspend(&ak8974->i2c->dev); ak8974 582 drivers/iio/magnetometer/ak8974.c struct ak8974 *ak8974 = iio_priv(indio_dev); ak8974 586 drivers/iio/magnetometer/ak8974.c pm_runtime_get_sync(&ak8974->i2c->dev); ak8974 587 drivers/iio/magnetometer/ak8974.c mutex_lock(&ak8974->lock); ak8974 589 drivers/iio/magnetometer/ak8974.c ret = ak8974_trigmeas(ak8974); ak8974 591 drivers/iio/magnetometer/ak8974.c dev_err(&ak8974->i2c->dev, "error triggering measure\n"); ak8974 594 drivers/iio/magnetometer/ak8974.c ret = ak8974_getresult(ak8974, hw_values); ak8974 596 drivers/iio/magnetometer/ak8974.c dev_err(&ak8974->i2c->dev, "error getting measures\n"); ak8974 604 drivers/iio/magnetometer/ak8974.c mutex_unlock(&ak8974->lock); ak8974 605 drivers/iio/magnetometer/ak8974.c pm_runtime_mark_last_busy(&ak8974->i2c->dev); ak8974 606 drivers/iio/magnetometer/ak8974.c pm_runtime_put_autosuspend(&ak8974->i2c->dev); ak8974 624 drivers/iio/magnetometer/ak8974.c struct ak8974 *ak8974 = iio_priv(indio_dev); ak8974 626 drivers/iio/magnetometer/ak8974.c return &ak8974->orientation; ak8974 668 drivers/iio/magnetometer/ak8974.c struct ak8974 *ak8974 = iio_priv(indio_dev); ak8974 686 drivers/iio/magnetometer/ak8974.c if (ak8974->variant == AK8974_WHOAMI_VALUE_AK8974) ak8974 695 drivers/iio/magnetometer/ak8974.c return ak8974->variant == AK8974_WHOAMI_VALUE_AMI305 || ak8974 696 drivers/iio/magnetometer/ak8974.c ak8974->variant == AK8974_WHOAMI_VALUE_AMI306; ak8974 699 drivers/iio/magnetometer/ak8974.c return ak8974->variant == AK8974_WHOAMI_VALUE_AMI306; ak8974 722 drivers/iio/magnetometer/ak8974.c struct ak8974 *ak8974; ak8974 728 drivers/iio/magnetometer/ak8974.c indio_dev = devm_iio_device_alloc(&i2c->dev, sizeof(*ak8974)); ak8974 732 drivers/iio/magnetometer/ak8974.c ak8974 = iio_priv(indio_dev); ak8974 734 drivers/iio/magnetometer/ak8974.c ak8974->i2c = i2c; ak8974 735 drivers/iio/magnetometer/ak8974.c mutex_init(&ak8974->lock); ak8974 738 drivers/iio/magnetometer/ak8974.c &ak8974->orientation); ak8974 742 drivers/iio/magnetometer/ak8974.c ak8974->regs[0].supply = ak8974_reg_avdd; ak8974 743 drivers/iio/magnetometer/ak8974.c ak8974->regs[1].supply = ak8974_reg_dvdd; ak8974 746 drivers/iio/magnetometer/ak8974.c ARRAY_SIZE(ak8974->regs), ak8974 747 drivers/iio/magnetometer/ak8974.c ak8974->regs); ak8974 753 drivers/iio/magnetometer/ak8974.c ret = regulator_bulk_enable(ARRAY_SIZE(ak8974->regs), ak8974->regs); ak8974 764 drivers/iio/magnetometer/ak8974.c ak8974->map = devm_regmap_init_i2c(i2c, &ak8974_regmap_config); ak8974 765 drivers/iio/magnetometer/ak8974.c if (IS_ERR(ak8974->map)) { ak8974 767 drivers/iio/magnetometer/ak8974.c return PTR_ERR(ak8974->map); ak8974 770 drivers/iio/magnetometer/ak8974.c ret = ak8974_set_power(ak8974, AK8974_PWR_ON); ak8974 776 drivers/iio/magnetometer/ak8974.c ret = ak8974_detect(ak8974); ak8974 782 drivers/iio/magnetometer/ak8974.c ret = ak8974_selftest(ak8974); ak8974 786 drivers/iio/magnetometer/ak8974.c ret = ak8974_reset(ak8974); ak8974 803 drivers/iio/magnetometer/ak8974.c indio_dev->name = ak8974->name; ak8974 819 drivers/iio/magnetometer/ak8974.c ak8974->drdy_active_low = true; ak8974 832 drivers/iio/magnetometer/ak8974.c ak8974->name, ak8974 833 drivers/iio/magnetometer/ak8974.c ak8974); ak8974 839 drivers/iio/magnetometer/ak8974.c ak8974->drdy_irq = true; ak8974 856 drivers/iio/magnetometer/ak8974.c ak8974_set_power(ak8974, AK8974_PWR_OFF); ak8974 858 drivers/iio/magnetometer/ak8974.c regulator_bulk_disable(ARRAY_SIZE(ak8974->regs), ak8974->regs); ak8974 866 drivers/iio/magnetometer/ak8974.c struct ak8974 *ak8974 = iio_priv(indio_dev); ak8974 873 drivers/iio/magnetometer/ak8974.c ak8974_set_power(ak8974, AK8974_PWR_OFF); ak8974 874 drivers/iio/magnetometer/ak8974.c regulator_bulk_disable(ARRAY_SIZE(ak8974->regs), ak8974->regs); ak8974 881 drivers/iio/magnetometer/ak8974.c struct ak8974 *ak8974 = ak8974 884 drivers/iio/magnetometer/ak8974.c ak8974_set_power(ak8974, AK8974_PWR_OFF); ak8974 885 drivers/iio/magnetometer/ak8974.c regulator_bulk_disable(ARRAY_SIZE(ak8974->regs), ak8974->regs); ak8974 892 drivers/iio/magnetometer/ak8974.c struct ak8974 *ak8974 = ak8974 896 drivers/iio/magnetometer/ak8974.c ret = regulator_bulk_enable(ARRAY_SIZE(ak8974->regs), ak8974->regs); ak8974 900 drivers/iio/magnetometer/ak8974.c ret = ak8974_set_power(ak8974, AK8974_PWR_ON); ak8974 904 drivers/iio/magnetometer/ak8974.c ret = ak8974_configure(ak8974); ak8974 911 drivers/iio/magnetometer/ak8974.c ak8974_set_power(ak8974, AK8974_PWR_OFF); ak8974 913 drivers/iio/magnetometer/ak8974.c regulator_bulk_disable(ARRAY_SIZE(ak8974->regs), ak8974->regs);