From: Marek Vasut <marex@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v2 2/5] sunxi: add USB EHCI driver
Date: Thu, 17 Jul 2014 10:41:44 +0200 [thread overview]
Message-ID: <201407171041.44163.marex@denx.de> (raw)
In-Reply-To: <d499be72b6c319dfde9025e4d3d0ec1ede51d1fc.1405460093.git.rbyshko@gmail.com>
On Tuesday, July 15, 2014 at 11:56:49 PM, Roman Byshko wrote:
Please start writing commit messages for the patches.
[...]
> diff --git a/drivers/usb/host/ehci-sunxi.c b/drivers/usb/host/ehci-sunxi.c
> new file mode 100644
> index 0000000..8e2baa9
> --- /dev/null
> +++ b/drivers/usb/host/ehci-sunxi.c
> @@ -0,0 +1,212 @@
> +/*
> + * Copyright (C) 2014 Roman Byshko
> + *
> + * Roman Byshko <rbyshko@gmail.com>
> + *
> + * Based on code from
> + * Allwinner Technology Co., Ltd. <www.allwinnertech.com>
> + *
> + * SPDX-License-Identifier: GPL-2.0+
> + */
> +
> +#include <asm/arch/clock.h>
> +#include <asm/arch/clock.h>
> +#include <asm/arch/cpu.h>
> +#include <asm/arch/gpio.h>
> +#include <asm/io.h>
> +#include <common.h>
> +#include "ehci.h"
> +
> +#define BIT(x) (1 << (x))
Please remove this code obfuscation, just use (1 << n) in the definitions below.
> +#define SUNXI_USB1_IO_BASE 0x01c14000
> +#define SUNXI_USB2_IO_BASE 0x01c1c000
Please implement an get_io_base() or such function, since these addresses are
likely to change eventually.
> +#define SUNXI_USB_PMU_IRQ_ENABLE 0x800
> +#define SUNXI_USB_CSR 0x01c13404
> +#define SUNXI_USB_PASSBY_EN 1
> +
> +#define SUNXI_EHCI_AHB_ICHR8_EN BIT(10)
> +#define SUNXI_EHCI_AHB_INCR4_BURST_EN BIT(9)
> +#define SUNXI_EHCI_AHB_INCRX_ALIGN_EN BIT(8)
> +#define SUNXI_EHCI_ULPI_BYPASS_EN BIT(0)
> +
> +static struct sunxi_ehci_hcd {
> + void *ehci_base;
> + struct usb_hcd *hcd;
> + int usb_rst_mask;
> + int ahb_clk_mask;
> + int gpio_vbus;
> + void *csr;
> + int irq;
> + int id;
> +} sunxi_echi_hcd[CONFIG_USB_MAX_CONTROLLER_COUNT] = {
No need to use this [CONFIG...] , just use [] and the compiler will calculate
the size.
> + [0] = {
No need for such explicit enumeration.
> + .ehci_base = (void *) SUNXI_USB1_IO_BASE,
> + .usb_rst_mask = CCM_USB_CTRL_PHY1_RST,
> + .ahb_clk_mask = BIT(AHB_GATE_OFFSET_USB_EHCI0),
> + .gpio_vbus = CONFIG_SUNXI_USB_VBUS0_GPIO,
> + .csr = (void*) SUNXI_USB_CSR,
> + .irq = 39,
> + .id = 1,
> + },
> +#if (CONFIG_USB_MAX_CONTROLLER_COUNT > 1)
> + [1] = {
> + .ehci_base = (void *) SUNXI_USB2_IO_BASE,
> + .usb_rst_mask = CCM_USB_CTRL_PHY2_RST,
> + .ahb_clk_mask = BIT(AHB_GATE_OFFSET_USB_EHCI1),
> + .gpio_vbus = CONFIG_SUNXI_USB_VBUS1_GPIO,
> + .csr = (void*) SUNXI_USB_CSR,
> + .irq = 40,
> + .id = 2,
> + }
> +#endif
> +};
> +
> +static int sunxi_gpio_output(u32 pin, u32 val)
> +{
> + u32 bank = GPIO_BANK(pin);
> + u32 num = GPIO_NUM(pin);
> + struct sunxi_gpio *pio =
> + &((struct sunxi_gpio_reg *)SUNXI_PIO_BASE)->gpio_bank[bank];
Is this still an USB driver or is this now a GPIO driver ?
> + if (val)
> + setbits_le32(&pio->dat, 0x1 << num);
> + else
> + clrbits_le32(&pio->dat, 0x1 << num);
> +
> + return 0;
> +}
[...]
> +static void sunxi_ehci_enable(struct sunxi_ehci_hcd *sunxi_ehci)
> +{
> + struct sunxi_ccm_reg *ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
> +
> + setbits_le32(&ccm->usb_clk_cfg, sunxi_ehci->usb_rst_mask);
> + setbits_le32(&ccm->ahb_gate0, sunxi_ehci->ahb_clk_mask);
> +
> + sunxi_usb_phy_init(sunxi_ehci);
> +
> + sunxi_usb_passby(sunxi_ehci, SUNXI_USB_PASSBY_EN);
> +
> + /* this should be used instead of next two lines if
> + * sunxi_gpio.c is merged upstream
> + * gpio_direction_output(sunxi_ehci->gpio_vbus, 1); */
Please fix the comment ( http://www.denx.de/wiki/U-Boot/CodingStyle )
> + sunxi_gpio_set_cfgpin(sunxi_ehci->gpio_vbus, SUNXI_GPIO_OUTPUT);
> + sunxi_gpio_output(sunxi_ehci->gpio_vbus, 1);
> +}
> +
> +static void sunxi_ehci_disable(struct sunxi_ehci_hcd *sunxi_ehci)
> +{
> + struct sunxi_ccm_reg *ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
> +
> + /* this should be used instead of next two lines if
> + * sunxi_gpio.c is merged upstream
> + * gpio_direction_output(sunxi_ehci->gpio_vbus, 0); */
DTTO.
> + sunxi_gpio_set_cfgpin(sunxi_ehci->gpio_vbus, SUNXI_GPIO_OUTPUT);
> + sunxi_gpio_output(sunxi_ehci->gpio_vbus, 0);
> +
> + sunxi_usb_passby(sunxi_ehci, !SUNXI_USB_PASSBY_EN);
> +
> + clrbits_le32(&ccm->ahb_gate0, sunxi_ehci->ahb_clk_mask);
> + clrbits_le32(&ccm->usb_clk_cfg, sunxi_ehci->usb_rst_mask);
> +}
> +
> +int ehci_hcd_init(int index, enum usb_init_type init, struct ehci_hccr
> **hccr, + struct ehci_hcor **hcor)
> +{
> + struct sunxi_ccm_reg *ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
> + struct sunxi_ehci_hcd *sunxi_ehci = &sunxi_echi_hcd[index];
> +
> + /* enable common PHY only once */
> + if (index == 0)
> + setbits_le32(&ccm->usb_clk_cfg, CCM_USB_CTRL_PHYGATE);
This would fail if I enabled only controller #1 , which is perfectly legal
operation. Just add a counter here and disable the clock upon last call of
ehci_hcd_stop() .
> + sunxi_ehci_enable(sunxi_ehci);
> +
> + *hccr = sunxi_ehci->ehci_base;
> +
> + *hcor = (struct ehci_hcor *)((uint32_t) *hccr
> + + HC_LENGTH(ehci_readl(&(*hccr)->cr_capbase)));
> +
> + debug("sunxi-ehci: init hccr %x and hcor %x hc_length %d\n",
> + (uint32_t)*hccr, (uint32_t)*hcor,
> + (uint32_t)HC_LENGTH(ehci_readl(&(*hccr)->cr_capbase)));
> +
> + return 0;
> +}
> +
> +int ehci_hcd_stop(int index)
> +{
> + struct sunxi_ccm_reg *ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
> + struct sunxi_ehci_hcd *sunxi_ehci = &sunxi_echi_hcd[index];
> +
> + sunxi_ehci_disable(sunxi_ehci);
> +
> + /* disable common PHY only once, for the last hcd */
> + if (index == CONFIG_USB_MAX_CONTROLLER_COUNT - 1)
> + clrbits_le32(&ccm->usb_clk_cfg, CCM_USB_CTRL_PHYGATE);
> +
> + return 0;
> +}
next prev parent reply other threads:[~2014-07-17 8:41 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-15 21:56 [U-Boot] [PATCH v2 0/5] ARM: Allwinner sun7i (A20) USB Host EHCI support Roman Byshko
2014-07-15 21:56 ` [U-Boot] [PATCH v2 1/5] sunxi: add defines to control USB Host clocks/resets Roman Byshko
2014-07-16 19:26 ` Ian Campbell
2014-07-15 21:56 ` [U-Boot] [PATCH v2 2/5] sunxi: add USB EHCI driver Roman Byshko
2014-07-16 6:58 ` Ian Campbell
2014-07-16 11:04 ` [U-Boot] [linux-sunxi] " Hans de Goede
2014-07-16 11:28 ` [U-Boot] [linux-sunxi] " Priit Laes
2014-07-17 8:41 ` Marek Vasut [this message]
2014-07-18 19:13 ` [U-Boot] " Ian Campbell
2014-07-15 21:56 ` [U-Boot] [PATCH v2 3/5] sunxi: add USB options to configs Roman Byshko
2014-07-16 19:27 ` Ian Campbell
2014-07-17 8:43 ` Marek Vasut
2014-07-15 21:56 ` [U-Boot] [PATCH v2 4/5] sun7i: add USB EHCI configuration Roman Byshko
2014-07-16 19:27 ` Ian Campbell
2014-07-15 21:56 ` [U-Boot] [PATCH v2 5/5] sun7i: cubietruck: enable USB EHCI Roman Byshko
2014-07-16 19:28 ` Ian Campbell
2014-07-15 22:05 ` [U-Boot] [PATCH v2 0/5] ARM: Allwinner sun7i (A20) USB Host EHCI support Roman B.
2014-07-16 8:34 ` Marek Vasut
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=201407171041.44163.marex@denx.de \
--to=marex@denx.de \
--cc=u-boot@lists.denx.de \
/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.