Commit dd9bd44f authored by Jakob Hauser's avatar Jakob Hauser Committed by Jonathan Cameron
Browse files

iio: magnetometer: yas530: Add volatile registers to "chip_info"



Add volatile registers to the "chip_info" structure to ease the handling of
different YAS variants.

Signed-off-by: default avatarJakob Hauser <jahau@rocketmail.com>
Reviewed-by: default avatarAndy Shevchenko <andy.shevchenko@gmail.com>
Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/aeba3877933ba9d2c920b459a9037d9186c15a4f.1660337264.git.jahau@rocketmail.com


Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent a70f60e5
Loading
Loading
Loading
Loading
+35 −3
Original line number Diff line number Diff line
@@ -102,6 +102,11 @@ enum chip_ids {
	yas533,
};

static const int yas530_volatile_reg[] = {
	YAS530_ACTUATE_INIT_COIL,
	YAS530_MEASURE,
};

struct yas5xx_calibration {
	/* Linearization calibration x, y1, y2 */
	s32 r[3];
@@ -123,11 +128,15 @@ struct yas5xx;
 * @devid: device ID number
 * @product_name: product name of the YAS variant
 * @version_names: version letters or namings
 * @volatile_reg: device-specific volatile registers
 * @volatile_reg_qty: quantity of device-specific volatile registers
 */
struct yas5xx_chip_info {
	unsigned int devid;
	char *product_name;
	char *version_names[2];
	const int *volatile_reg;
	int volatile_reg_qty;
};

/**
@@ -616,9 +625,26 @@ static const struct iio_info yas5xx_info = {

static bool yas5xx_volatile_reg(struct device *dev, unsigned int reg)
{
	return reg == YAS530_ACTUATE_INIT_COIL ||
		reg == YAS530_MEASURE ||
		(reg >= YAS5XX_MEASURE_DATA && reg < YAS5XX_MEASURE_DATA + 8);
	struct iio_dev *indio_dev = dev_get_drvdata(dev);
	struct yas5xx *yas5xx = iio_priv(indio_dev);
	const struct yas5xx_chip_info *ci = yas5xx->chip_info;
	int reg_qty;
	int i;

	if (reg >= YAS5XX_MEASURE_DATA && reg < YAS5XX_MEASURE_DATA + 8)
		return true;

	/*
	 * YAS versions share different registers on the same address,
	 * need to differentiate.
	 */
	reg_qty = ci->volatile_reg_qty;
	for (i = 0; i < reg_qty; i++) {
		if (reg == ci->volatile_reg[i])
			return true;
	}

	return false;
}

/* TODO: enable regmap cache, using mark dirty and sync at runtime resume */
@@ -923,16 +949,22 @@ static const struct yas5xx_chip_info yas5xx_chip_info_tbl[] = {
		.devid = YAS530_DEVICE_ID,
		.product_name = "YAS530 MS-3E",
		.version_names = { "A", "B" },
		.volatile_reg = yas530_volatile_reg,
		.volatile_reg_qty = ARRAY_SIZE(yas530_volatile_reg),
	},
	[yas532] = {
		.devid = YAS532_DEVICE_ID,
		.product_name = "YAS532 MS-3R",
		.version_names = { "AB", "AC" },
		.volatile_reg = yas530_volatile_reg,
		.volatile_reg_qty = ARRAY_SIZE(yas530_volatile_reg),
	},
	[yas533] = {
		.devid = YAS532_DEVICE_ID,
		.product_name = "YAS533 MS-3F",
		.version_names = { "AB", "AC" },
		.volatile_reg = yas530_volatile_reg,
		.volatile_reg_qty = ARRAY_SIZE(yas530_volatile_reg),
	},
};