All of lore.kernel.org
 help / color / mirror / Atom feed
From: gregkh@linuxfoundation.org (gregkh at linuxfoundation.org)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 2/5] usb: chipidea: add freescale imx28 special write register method
Date: Tue, 29 Oct 2013 20:09:21 -0700	[thread overview]
Message-ID: <20131030030921.GC12179@kroah.com> (raw)
In-Reply-To: <20131030005341.GA31544@shlinux1.ap.freescale.net>

On Wed, Oct 30, 2013 at 08:53:42AM +0800, Peter Chen wrote:
> On Tue, Oct 29, 2013 at 04:54:47PM -0700, gregkh at linuxfoundation.org wrote:
> > On Mon, Oct 28, 2013 at 11:47:53AM +0100, Marek Vasut wrote:
> > > Dear Hector Palacios,
> > > 
> > > > Dear Peter,
> > > > 
> > > > On 10/25/2013 08:02 AM, Peter Chen wrote:
> > > > > According to Freescale imx28 Errata, "ENGR119653 USB: ARM to USB
> > > > > register error issue", All USB register write operations must
> > > > > use the ARM SWP instruction. So, we implement special hw_write
> > > > > and hw_test_and_clear for imx28.
> > > > > 
> > > > > Discussion for it at below:
> > > > > http://marc.info/?l=linux-usb&m=137996395529294&w=2
> > > > > 
> > > > > Signed-off-by: Peter Chen
> > > > > <peter.chen-KZfg59tc24xl57MIdRCFDg@public.gmane.org> ---
> > > > > Changes for v2:
> > > > > - Rebase to latest usb-next tree
> > > > > 
> > > > >   drivers/usb/chipidea/ci.h    |   23 +++++++++++++++++++++++
> > > > >   drivers/usb/chipidea/core.c  |    2 ++
> > > > >   drivers/usb/chipidea/host.c  |    1 +
> > > > >   include/linux/usb/chipidea.h |    1 +
> > > > >   4 files changed, 27 insertions(+), 0 deletions(-)
> > > > > 
> > > > > diff --git a/drivers/usb/chipidea/ci.h b/drivers/usb/chipidea/ci.h
> > > > > index 1c94fc5..4eb61d0 100644
> > > > > --- a/drivers/usb/chipidea/ci.h
> > > > > +++ b/drivers/usb/chipidea/ci.h
> > > > > @@ -173,6 +173,8 @@ struct ci_hdrc {
> > > > > 
> > > > >   	struct dentry			*debugfs;
> > > > >   	bool				id_event;
> > > > >   	bool				b_sess_valid_event;
> > > > > 
> > > > > +	/* imx28 needs swp instruction for writing */
> > > > > +	bool				imx28_write_fix;
> > > > > 
> > > > >   };
> > > > >   
> > > > >   static inline struct ci_role_driver *ci_role(struct ci_hdrc *ci)
> > > > > 
> > > > > @@ -253,6 +255,13 @@ static inline u32 hw_read(struct ci_hdrc *ci, enum
> > > > > ci_hw_regs reg, u32 mask)
> > > > > 
> > > > >   	return ioread32(ci->hw_bank.regmap[reg]) & mask;
> > > > >   
> > > > >   }
> > > > > 
> > > > > +#ifdef CONFIG_SOC_IMX28
> > > > > +static inline void imx28_ci_writel(u32 val32, volatile u32 *addr)
> > > > > +{
> > > > > +	__asm__ ("swp %0, %0, [%1]" : : "r"(val32), "r"(addr));
> > > > > +}
> > > > > +#endif
> > > > > +
> > > > > 
> > > > >   /**
> > > > >   
> > > > >    * hw_write: writes to a hw register
> > > > >    * @reg:  register index
> > > > > 
> > > > > @@ -266,7 +275,14 @@ static inline void hw_write(struct ci_hdrc *ci, enum
> > > > > ci_hw_regs reg,
> > > > > 
> > > > >   		data = (ioread32(ci->hw_bank.regmap[reg]) & ~mask)
> > > > >   		
> > > > >   			| (data & mask);
> > > > > 
> > > > > +#ifdef CONFIG_SOC_IMX28
> > > > > +	if (ci->imx28_write_fix)
> > > > > +		imx28_ci_writel(data, ci->hw_bank.regmap[reg]);
> > > > > +	else
> > > > > +		iowrite32(data, ci->hw_bank.regmap[reg]);
> > > > > +#else
> > > > > 
> > > > >   	iowrite32(data, ci->hw_bank.regmap[reg]);
> > > > > 
> > > > > +#endif
> > > > > 
> > > > >   }
> > > > >   
> > > > >   /**
> > > > > 
> > > > > @@ -281,7 +297,14 @@ static inline u32 hw_test_and_clear(struct ci_hdrc
> > > > > *ci, enum ci_hw_regs reg,
> > > > > 
> > > > >   {
> > > > >   
> > > > >   	u32 val = ioread32(ci->hw_bank.regmap[reg]) & mask;
> > > > > 
> > > > > +#ifdef CONFIG_SOC_IMX28
> > > > > +	if (ci->imx28_write_fix)
> > > > > +		imx28_ci_writel(val, ci->hw_bank.regmap[reg]);
> > > > > +	else
> > > > > +		iowrite32(val, ci->hw_bank.regmap[reg]);
> > > > > +#else
> > > > > 
> > > > >   	iowrite32(val, ci->hw_bank.regmap[reg]);
> > > > > 
> > > > > +#endif
> > > > > 
> > > > >   	return val;
> > > > >   
> > > > >   }
> > > > 
> > > > Can't we remove the #ifdefs CONFIG_SOC_IMX28 all around?
> > > > The check is done on the new flag ci->imx28_write_fix which exists for all
> > > > platforms, isn't it?.
> > > 
> > > The SWP instruction is specific to ARM, so you'd need to stub-out the 
> > > imx28_ci_writel() with ifdef then.
> > 
> > That's better than the mess of #ifdefs this patch adds, which isn't ok
> > at all :(
> > 
> 
> You mean try to reduce the number of #ifdef?

Of course you should.

  reply	other threads:[~2013-10-30  3:09 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-10-25  6:02 [PATCH v3 1/5] usb: ehci: add freescale imx28 special write register method Peter Chen
2013-10-25  6:02 ` [PATCH v3 2/5] usb: chipidea: " Peter Chen
2013-10-28 10:36   ` Hector Palacios
2013-10-28 10:47     ` Marek Vasut
2013-10-29 23:54       ` gregkh at linuxfoundation.org
2013-10-30  0:53         ` Peter Chen
2013-10-30  3:09           ` gregkh at linuxfoundation.org [this message]
2013-10-25  6:02 ` [PATCH v3 3/5] usb: chipidea: imx: set CI_HDRC_IMX28_WRITE_FIX for imx28 Peter Chen
2013-10-27 16:25   ` Marek Vasut
2013-10-28  2:03     ` Shawn Guo
2013-10-28  7:52       ` Marek Vasut
2013-10-25  6:02 ` [PATCH v3 4/5] usb: doc: chipidea: imx: add compatiable string for imx28 SoC Peter Chen
2013-10-27 16:26   ` Marek Vasut
2013-10-28  2:00     ` Peter Chen
2013-10-25  6:02 ` [PATCH v3 5/5] ARM: dts: imx28: changing usb compatible string as only "fsl, imx28-usb" Peter Chen
2013-10-25  8:23   ` [PATCH v3 5/5] ARM: dts: imx28: changing usb compatible string as only "fsl,imx28-usb" Shawn Guo
2013-10-25  8:14     ` Peter Chen
2013-10-25  8:46       ` Shawn Guo
2013-10-28  1:59         ` Peter Chen
2013-10-28  2:50           ` Shawn Guo
2013-10-28  8:24 ` [PATCH v3 1/5] usb: ehci: add freescale imx28 special write register method Peter Chen

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=20131030030921.GC12179@kroah.com \
    --to=gregkh@linuxfoundation.org \
    --cc=linux-arm-kernel@lists.infradead.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.