Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 93258040 authored by Xiubo Li's avatar Xiubo Li Committed by Mark Brown
Browse files

regmap: mmio: Add support for 1/2/8 bytes wide register address.



Since regmap core and mmio have already support for 1/2/8 bytes wide values,
so adds support for 1/2/8 bytes wide registers address.

Signed-off-by: default avatarXiubo Li <Li.Xiubo@freescale.com>
Signed-off-by: default avatarMark Brown <broonie@linaro.org>
parent 41b0c2c9
Loading
Loading
Loading
Loading
+21 −3
Original line number Diff line number Diff line
@@ -26,18 +26,30 @@

struct regmap_mmio_context {
	void __iomem *regs;
	unsigned reg_bytes;
	unsigned val_bytes;
	unsigned pad_bytes;
	struct clk *clk;
};

static inline void regmap_mmio_regsize_check(size_t reg_size)
{
	BUG_ON(reg_size != 4);
	switch (reg_size) {
	case 1:
	case 2:
	case 4:
#ifdef CONFIG_64BIT
	case 8:
#endif
		break;
	default:
		BUG();
	}
}

static inline void regmap_mmio_count_check(size_t count)
{
	BUG_ON(count < 4);
	BUG_ON(count % 2 != 0);
}

static int regmap_mmio_gather_write(void *context,
@@ -91,9 +103,13 @@ static int regmap_mmio_gather_write(void *context,

static int regmap_mmio_write(void *context, const void *data, size_t count)
{
	struct regmap_mmio_context *ctx = context;
	u32 offset = ctx->reg_bytes + ctx->pad_bytes;

	regmap_mmio_count_check(count);

	return regmap_mmio_gather_write(context, data, 4, data + 4, count - 4);
	return regmap_mmio_gather_write(context, data, ctx->reg_bytes,
					data + offset, count - offset);
}

static int regmap_mmio_read(void *context,
@@ -219,6 +235,8 @@ static struct regmap_mmio_context *regmap_mmio_gen_context(struct device *dev,

	ctx->regs = regs;
	ctx->val_bytes = config->val_bits / 8;
	ctx->reg_bytes = config->reg_bits / 8;
	ctx->pad_bytes = config->pad_bits / 8;
	ctx->clk = ERR_PTR(-ENODEV);

	if (clk_id == NULL)