Hi Shimoda-san,
On Mon, May 19, 2014 at 12:08 PM, Yoshihiro Shimoda
<[email protected]> wrote:
> The R-Car H2 and M2 SoCs come with an xHCI controller that requires
> some specific initilization 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.
Thanks for your patch!
> diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
> index 9247ad2..229e968 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.
Does R-Car Gen1 also have xHCI, and is it compatible?
If not, you may want to call this driver USB_XHCI_RCAR2.
> diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
> index 561d07e..3a2da1f 100644
> --- a/drivers/usb/host/xhci-plat.c
> +++ b/drivers/usb/host/xhci-plat.c
> @@ -39,6 +40,12 @@ static int xhci_plat_setup(struct usb_hcd *hcd)
>
> 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,r8a7790-xhci") ||
> + of_device_is_compatible(of_node, "renesas,r8a7790-xhci"))
r8a7791, as Magnus already pointed out.
> + xhci_rcar_start(hcd);
If CONFIG_USB_XHCI_RCAR is not defined, xhci_rcar_start() is a dummy
function, but the of_device_is_compatible() checks will still be compiled in.
Hence perhaps an #ifdef CONFIG_USB_XHCI_RCAR is warranted here,
possibly combined with inclusion of a C-source file, like is done in
drivers/usb/host/ohci-hcd.c? It's up to the USB maintainer to decide this,
though.
> +
> return xhci_run(hcd);
> }
>
> @@ -165,6 +172,15 @@ static int xhci_plat_probe(struct platform_device *pdev)
> goto unmap_registers;
> }
>
> + if (of_device_is_compatible(pdev->dev.of_node,
> + "renesas,r8a7790-xhci") ||
> + of_device_is_compatible(pdev->dev.of_node,
> + "renesas,r8a7791-xhci")) {
> + ret = xhci_rcar_init_quirk(pdev);
Same here.
> + if (ret)
> + goto disable_clk;
> + }
> +
> ret = usb_add_hcd(hcd, irq, IRQF_SHARED);
> if (ret)
> goto disable_clk;
> --- /dev/null
> +++ b/drivers/usb/host/xhci-rcar.c
> +/* USB3.0 Configuraion */
Configuration
> +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) {
> + for (data = 0, j = 3; j >= 0; j--) {
> + if ((j + index) >= fw->size)
> + continue;
> + data |= fw->data[index + j] << (8 * j);
> + }
This is your custom get_unaligned_le32(), to avoid reading beyond the end
of the buffer if its size is not a multiple of 4 bytes?
Is there some way to just use get_unaligned_le32()?
If you want to keep it, I would rewrite it as
for (data = 0, j = 3; j >= 0; j--) {
if ((j + index) < fw->size)
data |= fw->data[index + j] << (8 * j);
}
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torval
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html