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);