All of lore.kernel.org
 help / color / mirror / Atom feed
From: Wolfram Sang <w.sang-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
To: Stefan Roese <sr-ynQEQJNshbs@public.gmane.org>
Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	spear-devel-nkJGhpqTU55BDgjK7y7TUQ@public.gmane.org,
	Viresh Kumar <viresh.kumar-qxv4g6HH51o@public.gmane.org>
Subject: Re: [PATCH v2] i2c: designware: Add support for 16bit register access
Date: Wed, 18 Apr 2012 13:24:26 +0200	[thread overview]
Message-ID: <20120418112426.GD21955@pengutronix.de> (raw)
In-Reply-To: <1334734399-1003-1-git-send-email-sr-ynQEQJNshbs@public.gmane.org>

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

On Wed, Apr 18, 2012 at 09:33:19AM +0200, Stefan Roese wrote:
> The STM SPEAr platform can only access the i2c controller register
> via 16bit read/write functions. This patch adds support to
> automatically detect this 16bit access mode.
> 
> Signed-off-by: Stefan Roese <sr-ynQEQJNshbs@public.gmane.org>

Thanks for the update, looks mostly good.

> Cc: Wolfram Sang <w.sang-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
> Cc: Viresh Kumar <viresh.kumar-qxv4g6HH51o@public.gmane.org>
> ---
> v2:
> - Removed parenthesis for single-statement block
> - Moved "swab" and "access_16bit" into "accessor_flags"
> 
>  drivers/i2c/busses/i2c-designware-core.c |   27 ++++++++++++++++++++++-----
>  drivers/i2c/busses/i2c-designware-core.h |    5 ++++-
>  2 files changed, 26 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c
> index df87992..b3c5cfa 100644
> --- a/drivers/i2c/busses/i2c-designware-core.c
> +++ b/drivers/i2c/busses/i2c-designware-core.c
> @@ -164,9 +164,15 @@ static char *abort_sources[] = {
>  
>  u32 dw_readl(struct dw_i2c_dev *dev, int offset)
>  {
> -	u32 value = readl(dev->base + offset);
> +	u32 value;
>  
> -	if (dev->swab)
> +	if (dev->accessor_flags & ACCESS_16BIT)
> +		value = readw(dev->base + offset) |
> +			(readw(dev->base + offset + 2) << 16);
> +	else
> +		value = readl(dev->base + offset);
> +
> +	if (dev->accessor_flags & ACCESS_SWAP)
>  		return swab32(value);
>  	else
>  		return value;
> @@ -174,10 +180,15 @@ u32 dw_readl(struct dw_i2c_dev *dev, int offset)
>  
>  void dw_writel(struct dw_i2c_dev *dev, u32 b, int offset)
>  {
> -	if (dev->swab)
> +	if (dev->accessor_flags & ACCESS_SWAP)
>  		b = swab32(b);
>  
> -	writel(b, dev->base + offset);
> +	if (dev->accessor_flags & ACCESS_16BIT) {
> +		writew((u16)b, dev->base + offset);
> +		writew((u16)(b >> 16), dev->base + offset + 2);
> +	} else {
> +		writel(b, dev->base + offset);
> +	}
>  }
>  
>  static u32
> @@ -254,7 +265,13 @@ int i2c_dw_init(struct dw_i2c_dev *dev)
>  	/* Configure register endianess access */
>  	reg = dw_readl(dev, DW_IC_COMP_TYPE);
>  	if (reg == ___constant_swab32(DW_IC_COMP_TYPE_VALUE)) {
> -		dev->swab = 1;
> +		dev->accessor_flags |= ACCESS_SWAP;
> +		reg = DW_IC_COMP_TYPE_VALUE;

May I ask you to use proper if/elseif/else blocks instead of overwriting
reg? I know you didn't come up with the mechanism, yet it looks too
fragile to be extended IMO.

> +	}
> +
> +	/* Configure register access mode 16bit */
> +	if (reg == (DW_IC_COMP_TYPE_VALUE & 0x0000ffff)) {

Does it make sense to check reg + 2 for the upper part of the signature?

> +		dev->accessor_flags |= ACCESS_16BIT;
>  		reg = DW_IC_COMP_TYPE_VALUE;
>  	}
>  
> diff --git a/drivers/i2c/busses/i2c-designware-core.h b/drivers/i2c/busses/i2c-designware-core.h
> index 02d1a2d..9c1840e 100644
> --- a/drivers/i2c/busses/i2c-designware-core.h
> +++ b/drivers/i2c/busses/i2c-designware-core.h
> @@ -82,7 +82,7 @@ struct dw_i2c_dev {
>  	unsigned int		status;
>  	u32			abort_source;
>  	int			irq;
> -	int			swab;
> +	u32			accessor_flags;
>  	struct i2c_adapter	adapter;
>  	u32			functionality;
>  	u32			master_cfg;
> @@ -90,6 +90,9 @@ struct dw_i2c_dev {
>  	unsigned int		rx_fifo_depth;
>  };
>  
> +#define ACCESS_SWAP		0x00000001
> +#define ACCESS_16BIT		0x00000002
> +
>  extern u32 dw_readl(struct dw_i2c_dev *dev, int offset);
>  extern void dw_writel(struct dw_i2c_dev *dev, u32 b, int offset);
>  extern int i2c_dw_init(struct dw_i2c_dev *dev);
> -- 
> 1.7.10
> 

Thanks,

   Wolfram

-- 
Pengutronix e.K.                           | Wolfram Sang                |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

  parent reply	other threads:[~2012-04-18 11:24 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-04-18  7:33 [PATCH v2] i2c: designware: Add support for 16bit register access Stefan Roese
     [not found] ` <1334734399-1003-1-git-send-email-sr-ynQEQJNshbs@public.gmane.org>
2012-04-18 11:24   ` Wolfram Sang [this message]
     [not found]     ` <20120418112426.GD21955-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2012-04-18 12:58       ` Stefan Roese

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=20120418112426.GD21955@pengutronix.de \
    --to=w.sang-bicnvbalz9megne8c9+irq@public.gmane.org \
    --cc=linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=spear-devel-nkJGhpqTU55BDgjK7y7TUQ@public.gmane.org \
    --cc=sr-ynQEQJNshbs@public.gmane.org \
    --cc=viresh.kumar-qxv4g6HH51o@public.gmane.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.