All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mark Brown <broonie@kernel.org>
To: Colin Foster <colin.foster@in-advantage.com>
Cc: linux-kernel@vger.kernel.org,
	"Rafael J. Wysocki" <rafael@kernel.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Subject: Re: [RFC v1 2/2] regmap: allow a defined reg_base to be added to every address
Date: Mon, 14 Mar 2022 08:28:36 +0000	[thread overview]
Message-ID: <Yi78tDT3t7mcGtEn@sirena.org.uk> (raw)
In-Reply-To: <20220313224524.399947-3-colin.foster@in-advantage.com>

[-- Attachment #1: Type: text/plain, Size: 4105 bytes --]

On Sun, Mar 13, 2022 at 03:45:24PM -0700, Colin Foster wrote:

> There's an inconsistency that arises when a register set can be accessed
> internally via MMIO, or externally via SPI. The VSC7514 chip allows both
> modes of operation. When internally accessed, the system utilizes __iomem,
> devm_ioremap_resource, and devm_regmap_init_mmio.

> For SPI it isn't possible to utilize memory-mapped IO. To properly operate,
> the resource base must be added to the register before every operation.

The problem here isn't the mixed buses, the problem is that the hardware
designers have for some unknown reason decided to not use the same
register addresses on the two buses which just seems pointlessly
unhelpful.

> 
> Signed-off-by: Colin Foster <colin.foster@in-advantage.com>
> ---
>  drivers/base/regmap/internal.h | 1 +
>  drivers/base/regmap/regmap.c   | 6 ++++++
>  include/linux/regmap.h         | 3 +++
>  3 files changed, 10 insertions(+)
> 
> diff --git a/drivers/base/regmap/internal.h b/drivers/base/regmap/internal.h
> index 88f710e7ce31..b4df36c7b17d 100644
> --- a/drivers/base/regmap/internal.h
> +++ b/drivers/base/regmap/internal.h
> @@ -63,6 +63,7 @@ struct regmap {
>  	regmap_unlock unlock;
>  	void *lock_arg; /* This is passed to lock/unlock functions */
>  	gfp_t alloc_flags;
> +	unsigned int reg_base;
>  
>  	struct device *dev; /* Device we do I/O on */
>  	void *work_buf;     /* Scratch buffer used to format I/O */
> diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
> index 1c7c6d6361af..5e12f7cb5147 100644
> --- a/drivers/base/regmap/regmap.c
> +++ b/drivers/base/regmap/regmap.c
> @@ -821,6 +821,8 @@ struct regmap *__regmap_init(struct device *dev,
>  	else
>  		map->alloc_flags = GFP_KERNEL;
>  
> +	map->reg_base = config->reg_base;
> +
>  	map->format.reg_bytes = DIV_ROUND_UP(config->reg_bits, 8);
>  	map->format.pad_bytes = config->pad_bits / 8;
>  	map->format.reg_downshift = config->reg_downshift;
> @@ -1736,6 +1738,7 @@ static int _regmap_raw_write_impl(struct regmap *map, unsigned int reg,
>  			return ret;
>  	}
>  
> +	reg += map->reg_base;
>  	reg >>= map->format.reg_downshift;
>  	map->format.format_reg(map->work_buf, reg, map->reg_shift);
>  	regmap_set_work_buf_flag_mask(map, map->format.reg_bytes,
> @@ -1907,6 +1910,7 @@ static int _regmap_bus_formatted_write(void *context, unsigned int reg,
>  			return ret;
>  	}
>  
> +	reg += map->reg_base;
>  	reg >>= map->format.reg_downshift;
>  	map->format.format_write(map, reg, val);
>  
> @@ -2349,6 +2353,7 @@ static int _regmap_raw_multi_reg_write(struct regmap *map,
>  		unsigned int reg = regs[i].reg;
>  		unsigned int val = regs[i].def;
>  		trace_regmap_hw_write_start(map, reg, 1);
> +		reg += map->reg_base;
>  		reg >>= map->format.reg_downshift;
>  		map->format.format_reg(u8, reg, map->reg_shift);
>  		u8 += reg_bytes + pad_bytes;
> @@ -2677,6 +2682,7 @@ static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
>  			return ret;
>  	}
>  
> +	reg += map->reg_base;
>  	reg >>= map->format.reg_downshift;
>  	map->format.format_reg(map->work_buf, reg, map->reg_shift);
>  	regmap_set_work_buf_flag_mask(map, map->format.reg_bytes,
> diff --git a/include/linux/regmap.h b/include/linux/regmap.h
> index 40fb9399add6..de81a94d7b30 100644
> --- a/include/linux/regmap.h
> +++ b/include/linux/regmap.h
> @@ -239,6 +239,8 @@ typedef void (*regmap_unlock)(void *);
>   *              used.
>   * @reg_downshift: The number of bits to downshift the register before
>   *		   performing any operations.
> + * @reg_base: Value to be added to every register address before performing any
> + *	      operation.
>   * @pad_bits: Number of bits of padding between register and value.
>   * @val_bits: Number of bits in a register value, mandatory.
>   *
> @@ -363,6 +365,7 @@ struct regmap_config {
>  	int reg_bits;
>  	int reg_stride;
>  	int reg_downshift;
> +	unsigned int reg_base;
>  	int pad_bits;
>  	int val_bits;
>  
> -- 
> 2.25.1
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

  reply	other threads:[~2022-03-14  8:28 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-13 22:45 [RFC v1 0/2] Add more detailed regmap formatting capabilities Colin Foster
2022-03-13 22:45 ` [RFC v1 1/2] regmap: add configurable downshift for addresses Colin Foster
2022-03-13 22:45 ` [RFC v1 2/2] regmap: allow a defined reg_base to be added to every address Colin Foster
2022-03-14  8:28   ` Mark Brown [this message]
2022-03-14 15:37     ` Colin Foster
2022-03-18 20:57 ` [RFC v1 0/2] Add more detailed regmap formatting capabilities Mark Brown
2022-03-19  0:13   ` Colin Foster

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Yi78tDT3t7mcGtEn@sirena.org.uk \
    --to=broonie@kernel.org \
    --cc=colin.foster@in-advantage.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rafael@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.