From: Yoshihiro Shimoda <yoshihiro.shimoda.uh-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org>
To: "balbi-l0cyMroinI0@public.gmane.org"
<balbi-l0cyMroinI0@public.gmane.org>
Cc: "mathias.nyman-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org"
<mathias.nyman-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>,
Greg Kroah-Hartman
<gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org>,
"linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
<linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
SH-Linux <linux-sh-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
Magnus Damm <magnus.damm-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
Geert Uytterhoeven
<geert-Td1EMuHUCqxL1ZNQvxDV9g@public.gmane.org>,
Grant Likely
<grant.likely-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>,
Rob Herring <robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
"devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
<devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
Subject: Re: [PATCH v6 1/1] usb: host: xhci-plat: add support for the R-Car H2 and M2 xHCI controllers
Date: Mon, 16 Jun 2014 21:17:59 +0900 [thread overview]
Message-ID: <539EE077.8000601@renesas.com> (raw)
In-Reply-To: <20140613142525.GE8319-HgARHv6XitL9zxVx7UNMDg@public.gmane.org>
Hi,
(2014/06/13 23:25), Felipe Balbi wrote:
> Hi,
>
> On Fri, Jun 13, 2014 at 09:20:31PM +0900, Yoshihiro Shimoda wrote:
>> The R-Car H2 and M2 SoCs come with an xHCI controller that requires
>> some specific initializations related to the firmware downloading and
>> some specific registers. This patch adds the support for this special
>> configuration as an xHCI quirk executed during probe and start.
>>
>> Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org>
>> ---
>> drivers/usb/host/Kconfig | 8 +++
>> drivers/usb/host/Makefile | 3 +
>> drivers/usb/host/xhci-plat.c | 19 ++++++
>> drivers/usb/host/xhci-rcar.c | 148 ++++++++++++++++++++++++++++++++++++++++++
>> drivers/usb/host/xhci-rcar.h | 27 ++++++++
>> 5 files changed, 205 insertions(+)
>> create mode 100644 drivers/usb/host/xhci-rcar.c
>> create mode 100644 drivers/usb/host/xhci-rcar.h
>>
>> diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
>> index 61b7817..537d9e1 100644
>> --- a/drivers/usb/host/Kconfig
>> +++ b/drivers/usb/host/Kconfig
>> @@ -37,6 +37,14 @@ config USB_XHCI_MVEBU
>> Say 'Y' to enable the support for the xHCI host controller
>> found in Marvell Armada 375/38x ARM SOCs.
>>
>> +config USB_XHCI_RCAR
>> + tristate "xHCI support for Renesas R-Car SoCs"
>> + select USB_XHCI_PLATFORM
>> + depends on ARCH_SHMOBILE || COMPILE_TEST
>> + ---help---
>> + Say 'Y' to enable the support for the xHCI host controller
>> + found in Renesas R-Car ARM SoCs.
>> +
>> endif # USB_XHCI_HCD
>>
>> config USB_EHCI_HCD
>> diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile
>> index af89a90..144c038 100644
>> --- a/drivers/usb/host/Makefile
>> +++ b/drivers/usb/host/Makefile
>> @@ -22,6 +22,9 @@ ifneq ($(CONFIG_USB_XHCI_PLATFORM), )
>> ifneq ($(CONFIG_USB_XHCI_MVEBU), )
>> xhci-hcd-y += xhci-mvebu.o
>> endif
>> +ifneq ($(CONFIG_USB_XHCI_RCAR), )
>> + xhci-hcd-y += xhci-rcar.o
>> +endif
>> endif
>>
>> obj-$(CONFIG_USB_WHCI_HCD) += whci/
>> diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
>> index 29d8adb..b6f2b6b 100644
>> --- a/drivers/usb/host/xhci-plat.c
>> +++ b/drivers/usb/host/xhci-plat.c
>> @@ -20,6 +20,7 @@
>>
>> #include "xhci.h"
>> #include "xhci-mvebu.h"
>> +#include "xhci-rcar.h"
>>
>> static void xhci_plat_quirks(struct device *dev, struct xhci_hcd *xhci)
>> {
>> @@ -34,11 +35,27 @@ static void xhci_plat_quirks(struct device *dev, struct xhci_hcd *xhci)
>> /* called during probe() after chip reset completes */
>> static int xhci_plat_setup(struct usb_hcd *hcd)
>> {
>> + struct device_node *of_node = hcd->self.controller->of_node;
>> + int ret;
>> +
>> + if (of_device_is_compatible(of_node, "renesas,xhci-r8a7790") ||
>> + of_device_is_compatible(of_node, "renesas,xhci-r8a7791")) {
>> + ret = xhci_rcar_init_quirk(hcd);
>> + if (ret)
>> + return ret;
>> + }
>> +
>> return xhci_gen_setup(hcd, xhci_plat_quirks);
>> }
>>
>> static int xhci_plat_start(struct usb_hcd *hcd)
>> {
>> + struct device_node *of_node = hcd->self.controller->of_node;
>> +
>> + if (of_device_is_compatible(of_node, "renesas,xhci-r8a7790") ||
>> + of_device_is_compatible(of_node, "renesas,xhci-r8a7791"))
>> + xhci_rcar_start(hcd);
>> +
>> return xhci_run(hcd);
>> }
>>
>> @@ -270,6 +287,8 @@ static const struct of_device_id usb_xhci_of_match[] = {
>> { .compatible = "xhci-platform" },
>> { .compatible = "marvell,armada-375-xhci"},
>> { .compatible = "marvell,armada-380-xhci"},
>> + { .compatible = "renesas,xhci-r8a7790"},
>> + { .compatible = "renesas,xhci-r8a7791"},
>> { },
>> };
>> MODULE_DEVICE_TABLE(of, usb_xhci_of_match);
>> diff --git a/drivers/usb/host/xhci-rcar.c b/drivers/usb/host/xhci-rcar.c
>> new file mode 100644
>> index 0000000..ff0d1b4
>> --- /dev/null
>> +++ b/drivers/usb/host/xhci-rcar.c
>> @@ -0,0 +1,148 @@
>> +/*
>> + * xHCI host controller driver for R-Car SoCs
>> + *
>> + * Copyright (C) 2014 Renesas Electronics Corporation
>> + *
>> + * This program is free software; you can redistribute it and/or
>> + * modify it under the terms of the GNU General Public License
>> + * version 2 as published by the Free Software Foundation.
>> + */
>> +
>> +#include <linux/firmware.h>
>> +#include <linux/module.h>
>> +#include <linux/platform_device.h>
>> +#include <linux/usb/phy.h>
>> +
>> +#include "xhci.h"
>> +#include "xhci-rcar.h"
>> +
>> +#define FIRMWARE_NAME "r8a779x_usb3_v1.dlmem"
>> +MODULE_FIRMWARE(FIRMWARE_NAME);
>> +
>> +/*** Register Offset ***/
>> +#define RCAR_USB3_INT_ENA 0x224 /* Interrupt Enable */
>> +#define RCAR_USB3_DL_CTRL 0x250 /* FW Download Control & Status */
>> +#define RCAR_USB3_FW_DATA0 0x258 /* FW Data0 */
>> +
>> +#define RCAR_USB3_LCLK 0xa44 /* LCLK Select */
>> +#define RCAR_USB3_CONF1 0xa48 /* USB3.0 Configuration1 */
>> +#define RCAR_USB3_CONF2 0xa5c /* USB3.0 Configuration2 */
>> +#define RCAR_USB3_CONF3 0xaa8 /* USB3.0 Configuration3 */
>> +#define RCAR_USB3_RX_POL 0xab0 /* USB3.0 RX Polarity */
>> +#define RCAR_USB3_TX_POL 0xab8 /* USB3.0 TX Polarity */
>> +
>> +/*** Register Settings ***/
>> +/* Interrupt Enable */
>> +#define RCAR_USB3_INT_XHC_ENA 0x00000001
>> +#define RCAR_USB3_INT_PME_ENA 0x00000002
>> +#define RCAR_USB3_INT_HSE_ENA 0x00000004
>> +#define RCAR_USB3_INT_ENA_VAL (RCAR_USB3_INT_XHC_ENA | \
>> + RCAR_USB3_INT_PME_ENA | RCAR_USB3_INT_HSE_ENA)
>> +
>> +/* FW Download Control & Status */
>> +#define RCAR_USB3_DL_CTRL_ENABLE 0x00000001
>> +#define RCAR_USB3_DL_CTRL_FW_SUCCESS 0x00000010
>> +#define RCAR_USB3_DL_CTRL_FW_SET_DATA0 0x00000100
>> +
>> +/* LCLK Select */
>> +#define RCAR_USB3_LCLK_ENA_VAL 0x01030001
>> +
>> +/* USB3.0 Configuration */
>> +#define RCAR_USB3_CONF1_VAL 0x00030204
>> +#define RCAR_USB3_CONF2_VAL 0x00030300
>> +#define RCAR_USB3_CONF3_VAL 0x13802007
>> +
>> +/* USB3.0 Polarity */
>> +#define RCAR_USB3_RX_POL_VAL BIT(21)
>> +#define RCAR_USB3_TX_POL_VAL BIT(4)
>> +
>> +void xhci_rcar_start(struct usb_hcd *hcd)
>> +{
>> + u32 temp;
>> +
>> + if (hcd->regs != NULL) {
>> + /* Interrupt Enable */
>> + temp = readl(hcd->regs + RCAR_USB3_INT_ENA);
>> + temp |= RCAR_USB3_INT_ENA_VAL;
>> + writel(temp, hcd->regs + RCAR_USB3_INT_ENA);
>> + /* LCLK Select */
>> + writel(RCAR_USB3_LCLK_ENA_VAL, hcd->regs + RCAR_USB3_LCLK);
>> + /* USB3.0 Configuration */
>> + writel(RCAR_USB3_CONF1_VAL, hcd->regs + RCAR_USB3_CONF1);
>> + writel(RCAR_USB3_CONF2_VAL, hcd->regs + RCAR_USB3_CONF2);
>> + writel(RCAR_USB3_CONF3_VAL, hcd->regs + RCAR_USB3_CONF3);
>> + /* USB3.0 Polarity */
>> + writel(RCAR_USB3_RX_POL_VAL, hcd->regs + RCAR_USB3_RX_POL);
>> + writel(RCAR_USB3_TX_POL_VAL, hcd->regs + RCAR_USB3_TX_POL);
>> + }
>> +}
>> +
>> +static int xhci_rcar_download_firmware(struct device *dev, void __iomem *regs)
>> +{
>> + const struct firmware *fw;
>> + int retval, index, j, time;
>> + int timeout = 10000;
>> + u32 data, val, temp;
>> +
>> + /* request R-Car USB3.0 firmware */
>> + retval = request_firmware(&fw, FIRMWARE_NAME, dev);
>> + if (retval)
>> + return retval;
>> +
>> + /* download R-Car USB3.0 firmware */
>> + temp = readl(regs + RCAR_USB3_DL_CTRL);
>> + temp |= RCAR_USB3_DL_CTRL_ENABLE;
>> + writel(temp, regs + RCAR_USB3_DL_CTRL);
>> +
>> + for (index = 0; index < fw->size; index += 4) {
>> + /* to avoid reading beyond the end of the buffer */
>> + for (data = 0, j = 3; j >= 0; j--) {
>> + if ((j + index) < fw->size)
>> + data |= fw->data[index + j] << (8 * j);
>> + }
>> + writel(data, regs + RCAR_USB3_FW_DATA0);
>> + temp = readl(regs + RCAR_USB3_DL_CTRL);
>> + temp |= RCAR_USB3_DL_CTRL_FW_SET_DATA0;
>> + writel(temp, regs + RCAR_USB3_DL_CTRL);
>> +
>> + for (time = 0; time < timeout; time++) {
>> + val = readl(regs + RCAR_USB3_DL_CTRL);
>> + if ((val & RCAR_USB3_DL_CTRL_FW_SET_DATA0) == 0)
>> + break;
>> + udelay(1);
>> + }
>> + if (time == timeout) {
>> + retval = -ETIMEDOUT;
>> + break;
>> + }
>> + }
>> +
>> + temp = readl(regs + RCAR_USB3_DL_CTRL);
>> + temp &= ~RCAR_USB3_DL_CTRL_ENABLE;
>> + writel(temp, regs + RCAR_USB3_DL_CTRL);
>> +
>> + for (time = 0; time < timeout; time++) {
>> + val = readl(regs + RCAR_USB3_DL_CTRL);
>> + if (val & RCAR_USB3_DL_CTRL_FW_SUCCESS) {
>> + retval = 0;
>> + break;
>> + }
>> + udelay(1);
>> + }
>> + if (time == timeout)
>> + retval = -ETIMEDOUT;
>> +
>> + release_firmware(fw);
>> +
>> + return retval;
>> +}
>> +
>> +/* This function needs to initialize a "phy" of usb before */
>
> initializing a PHY looks like something that the PHY layer should do.
> Why don't you write a PHY driver and teach xhci-core about PHYs ? Then,
> more people would benefit.
Sergei wrote a PHY driver for the controller, but it is not merged yet.
http://marc.info/?l=linux-sh&m=140088276126653&w=2
According to the manual, it just said:
"The USB3.0 host controller shall download FW via AXI to operate as a Host".
So, I don't think this is an initializing a PHY.
However, if I don't initialize a "phy" by the driver, I could not read/write
all of the USB 3.0 controller registers. (So, I added the comment.)
Should I move this function to the PHY driver?
Best regards,
Yoshihiro Shimoda
> cheers
>
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2014-06-16 12:17 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-13 12:20 [PATCH v6 1/1] usb: host: xhci-plat: add support for the R-Car H2 and M2 xHCI controllers Yoshihiro Shimoda
2014-06-13 14:25 ` Felipe Balbi
[not found] ` <20140613142525.GE8319-HgARHv6XitL9zxVx7UNMDg@public.gmane.org>
2014-06-13 18:08 ` Ben Dooks
2014-06-16 12:19 ` Yoshihiro Shimoda
2014-06-16 12:17 ` Yoshihiro Shimoda [this message]
2014-06-18 5:15 ` Magnus Damm
2014-06-26 0:18 ` Yoshihiro Shimoda
2014-06-27 15:40 ` Felipe Balbi
2014-06-29 14:33 ` Magnus Damm
2014-06-30 17:16 ` Felipe Balbi
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=539EE077.8000601@renesas.com \
--to=yoshihiro.shimoda.uh-zm6kxycvzfbbdgjk7y7tuq@public.gmane.org \
--cc=balbi-l0cyMroinI0@public.gmane.org \
--cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=geert-Td1EMuHUCqxL1ZNQvxDV9g@public.gmane.org \
--cc=grant.likely-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
--cc=gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org \
--cc=linux-sh-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=magnus.damm-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
--cc=mathias.nyman-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
--cc=robh+dt-DgEjT+Ai2ygdnm+yROfE0A@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 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).