LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
From: Alexander Dahl <ada@thorsis.com>
To: Nicolas Ferre <nicolas.ferre@microchip.com>
Cc: Alan Stern <stern@rowland.harvard.edu>,
	linux-usb@vger.kernel.org,
	Cristian Birsan <Cristian.Birsan@microchip.com>,
	linux-arm-kernel@lists.infradead.org,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Alexandre Belloni <alexandre.belloni@bootlin.com>,
	Ludovic Desroches <ludovic.desroches@microchip.com>,
	linux-kernel@vger.kernel.org
Subject: Re: [RFC PATCH] USB: host: ehci-atmel: Allow enabling HSIC on SAMA5D2
Date: Mon, 06 Sep 2021 09:20:38 +0200	[thread overview]
Message-ID: <2753502.AcZM6cElzO@ada> (raw)
In-Reply-To: <7c3d1248-b708-68f9-a76a-712e345b8218@microchip.com>

Hello Nicolas,

Am Donnerstag, 2. September 2021, 17:33:50 CEST schrieb Nicolas Ferre:
> Hi Alexander,
> 
> On 24/08/2021 at 08:37, Alexander Dahl wrote:
> > Unlike other SoC series featuring the 'atmel,at91sam9g45-ehci' USB EHCI
> > controller, which have embedded USB high-speed transceivers for each
> > port, the third port on the SAMA5D2 series is HSIC only.  That HSIC
> > interface is not enabled after a power-on reset, but can be enabled by
> > setting a flag in a vendor specific EHCI register.
> > 
> > The register offsets added to the new header file were compared with
> > those for the SAM9G45, SAM9X25, SAMA5D3, SAMA5D4, and SAM9X60 series and
> > there are no differences in the offsets or contents of those registers.
> > Which of those additional vendor specific registers are supported,
> > differs by SoC family.  So while the HSIC enable feature is currently
> > only present for SAMA5D2, it probably does not hurt to set it on the
> > other families, hence no additional check for SoC family here.
> > 
> > Tested on a custom board featuring a SAMA5D27C-D5M SiP connected to an
> > USB3503 hub with an upstream HSIC interface.
> > 
> > Link: https://community.atmel.com/forum/sama5d2-using-hsic-under-linux
> > Signed-off-by: Alexander Dahl <ada@thorsis.com>
> 
> Sorry for not having coming back to you earlier, summertime...

I had one week off last week due to a mild infection myself, so we just 
proceed here and now. (-:

> What you are looking for is what Cristian developed in our "vendor tree"
> and that needs to be "Mainlined":
> https://github.com/linux4sam/linux-at91/commit/ca368f544899c14b03df9ce751068
> 4f03acf1bf9

Looks like it does what it should from quick code inspection. One could 
nitpick some things, maybe I add some comments on GitHub.

> It allows us to have a gigabit Ethernet HSIC connected on our sama5d2
> ICP board. It works well for some time.

Good to hear.

> For DT, we rely on the standard "phy_type" property set to "hsic" as
> highlighted in this DT node on the ICP board precisely:
> https://github.com/linux4sam/linux-at91/blob/master/arch/arm/boot/dts/at91-s
> ama5d2_icp.dts#L766
> 
> This way we can use the of_usb_get_phy_mode() standard function:
> https://github.com/linux4sam/linux-at91/blob/master/drivers/usb/phy/of.c#L28

I noticed that phy_type property, but did not follow that approach, because 
that USB block in SAMA5D2 has three ports, where one (A) is shared with a 
device port, two (A and B) have embedded transceivers, and only the third (C) 
has that HSIC interface, but nothing else. So the flag has no effect on port A 
and B anyways, and I would have found it misleading to set phy_type to HSIC 
for the whole USB block.

> All this tells me that I would prefer Cristi's approach. If agreed,
> we'll make sure to make progress on the mainlining part soon.

I don't mind. If that's your preferred approach, I will happily test it. Was 
the series already posted to upstream?

> Hope that it helps. Best regards,
>    Nicolas

Yes, indeed. Thanks for your feedback.

Greets
Alex

> 
> > ---
> > 
> > Notes:
> >      - for introducing new dt binding, would be nice to convert old one
> >      
> >        first, probably needs split up and multiple iteration review?
> >      
> >      - name of that new dt property?
> >      - register definitions put to a separate file, like
> >      
> >        'drivers/usb/host/ehci-fsl.h'
> >      
> >      - unsure where exactly in the probe process that register write
> >      should
> >      
> >        happen, datasheet gives no hint
> >      
> >      - should suspend/resume be considered?
> >   
> >   drivers/usb/host/ehci-atmel.c | 17 +++++++++++++++++
> >   drivers/usb/host/ehci-atmel.h | 19 +++++++++++++++++++
> >   2 files changed, 36 insertions(+)
> >   create mode 100644 drivers/usb/host/ehci-atmel.h
> > 
> > diff --git a/drivers/usb/host/ehci-atmel.c b/drivers/usb/host/ehci-atmel.c
> > index e893467d659c..f8d9e686c082 100644
> > --- a/drivers/usb/host/ehci-atmel.c
> > +++ b/drivers/usb/host/ehci-atmel.c
> > @@ -20,6 +20,7 @@
> > 
> >   #include <linux/usb/hcd.h>
> >   
> >   #include "ehci.h"
> > 
> > +#include "ehci-atmel.h"
> > 
> >   #define DRIVER_DESC "EHCI Atmel driver"
> > 
> > @@ -85,6 +86,7 @@ static void atmel_stop_ehci(struct platform_device
> > *pdev)
> > 
> >   static int ehci_atmel_drv_probe(struct platform_device *pdev)
> >   {
> > 
> > +       struct device_node *np = pdev->dev.of_node;
> > 
> >          struct usb_hcd *hcd;
> >          const struct hc_driver *driver = &ehci_atmel_hc_driver;
> >          struct resource *res;
> > 
> > @@ -149,6 +151,14 @@ static int ehci_atmel_drv_probe(struct
> > platform_device *pdev)> 
> >          atmel_start_ehci(pdev);
> > 
> > +       if (of_property_read_bool(np, "atmel,enable-hsic")) {
> > +               u32 tmp;
> > +
> > +               tmp = ehci_readl(ehci, hcd->regs + AT91_UHPHS_INSNREG08);
> > +               tmp |= AT91_UHPHS_HSIC_EN;
> > +               ehci_writel(ehci, tmp, hcd->regs + AT91_UHPHS_INSNREG08);
> > +       }
> > +
> > 
> >          retval = usb_add_hcd(hcd, irq, IRQF_SHARED);
> >          if (retval)
> >          
> >                  goto fail_add_hcd;
> > 
> > @@ -170,10 +180,17 @@ static int ehci_atmel_drv_probe(struct
> > platform_device *pdev)> 
> >   static int ehci_atmel_drv_remove(struct platform_device *pdev)
> >   {
> >   
> >          struct usb_hcd *hcd = platform_get_drvdata(pdev);
> > 
> > +       struct ehci_hcd *ehci;
> > +       u32 tmp;
> > 
> >          usb_remove_hcd(hcd);
> >          usb_put_hcd(hcd);
> > 
> > +       ehci = hcd_to_ehci(hcd);
> > +       tmp = ehci_readl(ehci, hcd->regs + AT91_UHPHS_INSNREG08);
> > +       tmp &= ~AT91_UHPHS_HSIC_EN;
> > +       ehci_writel(ehci, tmp, hcd->regs + AT91_UHPHS_INSNREG08);
> > +
> > 
> >          atmel_stop_ehci(pdev);
> >          
> >          return 0;
> > 
> > diff --git a/drivers/usb/host/ehci-atmel.h b/drivers/usb/host/ehci-atmel.h
> > new file mode 100644
> > index 000000000000..4c4998c2a6dd
> > --- /dev/null
> > +++ b/drivers/usb/host/ehci-atmel.h
> > @@ -0,0 +1,19 @@
> > +/* SPDX-License-Identifier: GPL-2.0 */
> > +/*
> > + * Vendor specific definitions for EHCI on Atmel/Microchip SoCs.
> > + *
> > + * © 2021 Alexander Dahl <ada@thorsis.com>
> > + */
> > +#ifndef EHCI_ATMEL_H
> > +#define EHCI_ATMEL_H
> > +
> > +/* device specific register offsets, taken from SAMA5D2 datasheet */
> > +
> > +#define AT91_UHPHS_INSNREG06    0xA8        /* AHB Error Status Register
> > */ +
> > +#define AT91_UHPHS_INSNREG07    0xAC        /* AHB Master Error Address
> > Register */ +
> > +#define AT91_UHPHS_INSNREG08    0xB0        /* HSIC Enable/Disable
> > Register */ +#define AT91_UHPHS_HSIC_EN      (1 << 2)    /* HSIC
> > Enable/Disable */ +
> > +#endif /* ECHI_ATMEL_H */
> > 
> > base-commit: e22ce8eb631bdc47a4a4ea7ecf4e4ba499db4f93
> > --
> > 2.30.2


-- 




      reply	other threads:[~2021-09-06  7:20 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-23  9:24 Enable HSIC Host Port on Atmel/Microchip SAMA5D2 Alexander Dahl
2021-08-23 14:00 ` Alan Stern
2021-08-24  6:37   ` [RFC PATCH] USB: host: ehci-atmel: Allow enabling HSIC on SAMA5D2 Alexander Dahl
2021-08-24  6:45     ` Greg Kroah-Hartman
2021-09-02 15:33     ` Nicolas Ferre
2021-09-06  7:20       ` Alexander Dahl [this message]

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=2753502.AcZM6cElzO@ada \
    --to=ada@thorsis.com \
    --cc=Cristian.Birsan@microchip.com \
    --cc=alexandre.belloni@bootlin.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=ludovic.desroches@microchip.com \
    --cc=nicolas.ferre@microchip.com \
    --cc=stern@rowland.harvard.edu \
    --subject='Re: [RFC PATCH] USB: host: ehci-atmel: Allow enabling HSIC on SAMA5D2' \
    /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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).