From: Igor Grinberg <grinberg@compulab.co.il>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 13/14] ehci-omap: driver for EHCI host on OMAP3
Date: Wed, 02 Nov 2011 11:14:03 +0200 [thread overview]
Message-ID: <4EB109DB.2040803@compulab.co.il> (raw)
In-Reply-To: <1320189368-9763-14-git-send-email-yanok@emcraft.com>
Hi Ilya,
This is great! Thanks.
Couple of comments below
On 11/02/11 01:16, Ilya Yanok wrote:
> Taken from Beagle code. Tested on mcx board (AM3517-based).
>
> Signed-off-by: Ilya Yanok <yanok@emcraft.com>
> ---
>
> Please note that I wasn't able to test this patch on Beagle. Testers
> are welcome! Also we have one strange bug in our setup (mcx board, USB
> storage device, keyboard, mouse and BT stick connected through several
> hubs): while scanning the bus U-Boot fails to detect the keyboard
> (stalled endpoint while first 64-byte descriptor read) and after that
> the keyboard can't be detected even in Linux until power off/on.
>
> Enabling DEBUG in common/usb.c makes this bug go away.
Sounds like kind of timing problem?
Have you tried using a delay in places where debug is used?
>
> board/ti/beagle/beagle.c | 101 -------------------------
> drivers/usb/host/Makefile | 1 +
> drivers/usb/host/ehci-omap.c | 161 ++++++++++++++++++++++++++++++++++++++++
> include/configs/omap3_beagle.h | 3 +
> 4 files changed, 165 insertions(+), 101 deletions(-)
> create mode 100644 drivers/usb/host/ehci-omap.c
>
> diff --git a/board/ti/beagle/beagle.c b/board/ti/beagle/beagle.c
> index 9482c5e..41cc7e8 100644
> --- a/board/ti/beagle/beagle.c
> +++ b/board/ti/beagle/beagle.c
> @@ -40,15 +40,6 @@
> #include <asm/arch/sys_proto.h>
> #include <asm/gpio.h>
> #include <asm/mach-types.h>
> -#ifdef CONFIG_USB_EHCI
> -#include <usb.h>
> -#include <asm/arch/clocks.h>
> -#include <asm/arch/clocks_omap3.h>
> -#include <asm/arch/ehci_omap3.h>
> -/* from drivers/usb/host/ehci-core.h */
> -extern struct ehci_hccr *hccr;
> -extern volatile struct ehci_hcor *hcor;
> -#endif
> #include "beagle.h"
> #include <command.h>
>
> @@ -376,104 +367,12 @@ int board_mmc_init(bd_t *bis)
> #endif
>
> #ifdef CONFIG_USB_EHCI
> -
> -#define GPIO_PHY_RESET 147
> -
> -/* Reset is needed otherwise the kernel-driver will throw an error. */
> -int ehci_hcd_stop(void)
> -{
> - pr_debug("Resetting OMAP3 EHCI\n");
> - gpio_set_value(GPIO_PHY_RESET, 0);
> - writel(OMAP_UHH_SYSCONFIG_SOFTRESET, OMAP3_UHH_BASE + OMAP_UHH_SYSCONFIG);
> - /* disable USB clocks */
> - struct prcm *prcm_base = (struct prcm *)PRCM_BASE;
> - sr32(&prcm_base->iclken_usbhost, 0, 1, 0);
> - sr32(&prcm_base->fclken_usbhost, 0, 2, 0);
> - sr32(&prcm_base->iclken3_core, 2, 1, 0);
> - sr32(&prcm_base->fclken3_core, 2, 1, 0);
> - return 0;
> -}
> -
> /* Call usb_stop() before starting the kernel */
> void show_boot_progress(int val)
> {
> if(val == 15)
> usb_stop();
> }
> -
> -/*
> - * Initialize the OMAP3 EHCI controller and PHY on the BeagleBoard.
> - * Based on "drivers/usb/host/ehci-omap.c" from Linux 2.6.37.
> - * See there for additional Copyrights.
> - */
> -int ehci_hcd_init(void)
> -{
> - pr_debug("Initializing OMAP3 ECHI\n");
> -
> - /* Put the PHY in RESET */
> - gpio_request(GPIO_PHY_RESET, "");
> - gpio_direction_output(GPIO_PHY_RESET, 0);
> - gpio_set_value(GPIO_PHY_RESET, 0);
> -
> - /* Hold the PHY in RESET for enough time till DIR is high */
> - /* Refer: ISSUE1 */
> - udelay(10);
> -
> - struct prcm *prcm_base = (struct prcm *)PRCM_BASE;
> - /* Enable USBHOST_L3_ICLK (USBHOST_MICLK) */
> - sr32(&prcm_base->iclken_usbhost, 0, 1, 1);
> - /*
> - * Enable USBHOST_48M_FCLK (USBHOST_FCLK1)
> - * and USBHOST_120M_FCLK (USBHOST_FCLK2)
> - */
> - sr32(&prcm_base->fclken_usbhost, 0, 2, 3);
> - /* Enable USBTTL_ICLK */
> - sr32(&prcm_base->iclken3_core, 2, 1, 1);
> - /* Enable USBTTL_FCLK */
> - sr32(&prcm_base->fclken3_core, 2, 1, 1);
> - pr_debug("USB clocks enabled\n");
> -
> - /* perform TLL soft reset, and wait until reset is complete */
> - writel(OMAP_USBTLL_SYSCONFIG_SOFTRESET,
> - OMAP3_USBTLL_BASE + OMAP_USBTLL_SYSCONFIG);
> - /* Wait for TLL reset to complete */
> - while (!(readl(OMAP3_USBTLL_BASE + OMAP_USBTLL_SYSSTATUS)
> - & OMAP_USBTLL_SYSSTATUS_RESETDONE));
> - pr_debug("TLL reset done\n");
> -
> - writel(OMAP_USBTLL_SYSCONFIG_ENAWAKEUP |
> - OMAP_USBTLL_SYSCONFIG_SIDLEMODE |
> - OMAP_USBTLL_SYSCONFIG_CACTIVITY,
> - OMAP3_USBTLL_BASE + OMAP_USBTLL_SYSCONFIG);
> -
> - /* Put UHH in NoIdle/NoStandby mode */
> - writel(OMAP_UHH_SYSCONFIG_ENAWAKEUP
> - | OMAP_UHH_SYSCONFIG_SIDLEMODE
> - | OMAP_UHH_SYSCONFIG_CACTIVITY
> - | OMAP_UHH_SYSCONFIG_MIDLEMODE,
> - OMAP3_UHH_BASE + OMAP_UHH_SYSCONFIG);
> -
> - /* setup burst configurations */
> - writel(OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN
> - | OMAP_UHH_HOSTCONFIG_INCR8_BURST_EN
> - | OMAP_UHH_HOSTCONFIG_INCR16_BURST_EN,
> - OMAP3_UHH_BASE + OMAP_UHH_HOSTCONFIG);
> -
> - /*
> - * Refer ISSUE1:
> - * Hold the PHY in RESET for enough time till
> - * PHY is settled and ready
> - */
> - udelay(10);
> - gpio_set_value(GPIO_PHY_RESET, 1);
> -
> - hccr = (struct ehci_hccr *)(OMAP3_EHCI_BASE);
> - hcor = (struct ehci_hcor *)(OMAP3_EHCI_BASE + 0x10);
> -
> - pr_debug("OMAP3 EHCI init done\n");
> - return 0;
> -}
> -
> #endif /* CONFIG_USB_EHCI */
>
> /*
> diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile
> index 51b2494..4e54c14 100644
> --- a/drivers/usb/host/Makefile
> +++ b/drivers/usb/host/Makefile
> @@ -41,6 +41,7 @@ else
> COBJS-$(CONFIG_USB_EHCI_FSL) += ehci-fsl.o
> endif
> COBJS-$(CONFIG_USB_EHCI_MXC) += ehci-mxc.o
> +COBJS-$(CONFIG_USB_EHCI_OMAP) += ehci-omap.o
> COBJS-$(CONFIG_USB_EHCI_PPC4XX) += ehci-ppc4xx.o
> COBJS-$(CONFIG_USB_EHCI_IXP4XX) += ehci-ixp.o
> COBJS-$(CONFIG_USB_EHCI_KIRKWOOD) += ehci-kirkwood.o
> diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c
> new file mode 100644
> index 0000000..2c79a91
> --- /dev/null
> +++ b/drivers/usb/host/ehci-omap.c
> @@ -0,0 +1,161 @@
> +/*
> + * (C) Copyright 2011 Ilya Yanok, Emcraft Systems
> + * (C) Copyright 2004-2008
> + * Texas Instruments, <www.ti.com>
> + *
> + * Derived from Beagle Board code by
> + * Sunil Kumar <sunilsaini05@gmail.com>
> + * Shashi Ranjan <shashiranjanmca05@gmail.com>
> + *
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc.
> + */
> +#include <common.h>
> +#include <usb.h>
> +#include <asm/io.h>
> +#include <asm/gpio.h>
> +#include <asm/arch/clocks.h>
> +#include <asm/arch/clocks_omap3.h>
> +#include <asm/arch/ehci_omap3.h>
> +#include <asm/arch/sys_proto.h>
> +#include "ehci-core.h"
> +
> +inline int __board_usb_init(void)
> +{
> + return 0;
> +}
> +int board_usb_init(void) __attribute__((weak, alias("__board_usb_init")));
> +
> +/* Reset is needed otherwise the kernel-driver will throw an error. */
> +int ehci_hcd_stop(void)
> +{
> + debug("Resetting OMAP3 EHCI\n");
> +#ifdef CONFIG_OMAP_EHCI_PHY1_RESET
> + gpio_set_value(CONFIG_OMAP_EHCI_PHY1_RESET, 0);
> +#endif
> +#ifdef CONFIG_OMAP_EHCI_PHY2_RESET
> + gpio_set_value(CONFIG_OMAP_EHCI_PHY2_RESET, 0);
The CONFIG_OMAP_EHCI_PHYx_RESET name is confusing - it does not say
that it should be a GPIO number.
> +#endif
> + writel(OMAP_UHH_SYSCONFIG_SOFTRESET,
> + OMAP3_UHH_BASE + OMAP_UHH_SYSCONFIG);
> + /* disable USB clocks */
> + struct prcm *prcm_base = (struct prcm *)PRCM_BASE;
> + sr32(&prcm_base->iclken_usbhost, 0, 1, 0);
> + sr32(&prcm_base->fclken_usbhost, 0, 2, 0);
> + sr32(&prcm_base->iclken3_core, 2, 1, 0);
> + sr32(&prcm_base->fclken3_core, 2, 1, 0);
> + return 0;
> +}
> +
> +/*
> + * Initialize the OMAP3 EHCI controller and PHY.
> + * Based on "drivers/usb/host/ehci-omap.c" from Linux 2.6.37.
> + * See there for additional Copyrights.
> + */
> +int ehci_hcd_init(void)
> +{
> + int ret;
> +
> + debug("Initializing OMAP3 EHCI\n");
> +
> + ret = board_usb_init();
> + if (ret < 0)
> + return ret;
> +
> +#if defined(CONFIG_OMAP_EHCI_PHY1_RESET) || \
> + defined(CONFIG_OMAP_EHCI_PHY2_RESET)
> + /* Put the PHY in RESET */
> +#ifdef CONFIG_OMAP_EHCI_PHY1_RESET
> + gpio_request(CONFIG_OMAP_EHCI_PHY1_RESET, "USB PHY1 reset");
> + gpio_direction_output(CONFIG_OMAP_EHCI_PHY1_RESET, 0);
> + gpio_set_value(CONFIG_OMAP_EHCI_PHY1_RESET, 0);
> +#endif
> +#ifdef CONFIG_OMAP_EHCI_PHY2_RESET
> + gpio_request(CONFIG_OMAP_EHCI_PHY2_RESET, "USB PHY2 reset");
> + gpio_direction_output(CONFIG_OMAP_EHCI_PHY2_RESET, 0);
> + gpio_set_value(CONFIG_OMAP_EHCI_PHY2_RESET, 0);
> +#endif
> +
> + /* Hold the PHY in RESET for enough time till DIR is high */
> + /* Refer: ISSUE1 */
> + udelay(10);
> +#endif
The above does not look good...
May be extract the above to an additional function(s) and
add a stub(s) if the relevant config option is not present?
> +
> + struct prcm *prcm_base = (struct prcm *)PRCM_BASE;
> + /* Enable USBHOST_L3_ICLK (USBHOST_MICLK) */
> + sr32(&prcm_base->iclken_usbhost, 0, 1, 1);
> + /*
> + * Enable USBHOST_48M_FCLK (USBHOST_FCLK1)
> + * and USBHOST_120M_FCLK (USBHOST_FCLK2)
> + */
> + sr32(&prcm_base->fclken_usbhost, 0, 2, 3);
> + /* Enable USBTTL_ICLK */
> + sr32(&prcm_base->iclken3_core, 2, 1, 1);
> + /* Enable USBTTL_FCLK */
> + sr32(&prcm_base->fclken3_core, 2, 1, 1);
> + debug("USB clocks enabled\n");
> +
> + /* perform TLL soft reset, and wait until reset is complete */
> + writel(OMAP_USBTLL_SYSCONFIG_SOFTRESET,
> + OMAP3_USBTLL_BASE + OMAP_USBTLL_SYSCONFIG);
> + /* Wait for TLL reset to complete */
> + while (!(readl(OMAP3_USBTLL_BASE + OMAP_USBTLL_SYSSTATUS)
> + & OMAP_USBTLL_SYSSTATUS_RESETDONE))
> + ;
> + debug("TLL reset done\n");
> +
> + writel(OMAP_USBTLL_SYSCONFIG_ENAWAKEUP |
> + OMAP_USBTLL_SYSCONFIG_SIDLEMODE |
> + OMAP_USBTLL_SYSCONFIG_CACTIVITY,
> + OMAP3_USBTLL_BASE + OMAP_USBTLL_SYSCONFIG);
> +
> + /* Put UHH in NoIdle/NoStandby mode */
> + writel(OMAP_UHH_SYSCONFIG_ENAWAKEUP
> + | OMAP_UHH_SYSCONFIG_SIDLEMODE
> + | OMAP_UHH_SYSCONFIG_CACTIVITY
> + | OMAP_UHH_SYSCONFIG_MIDLEMODE,
> + OMAP3_UHH_BASE + OMAP_UHH_SYSCONFIG);
> +
> + /* setup burst configurations */
> + writel(OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN
> + | OMAP_UHH_HOSTCONFIG_INCR8_BURST_EN
> + | OMAP_UHH_HOSTCONFIG_INCR16_BURST_EN,
> + OMAP3_UHH_BASE + OMAP_UHH_HOSTCONFIG);
> +
> +#if defined(CONFIG_OMAP_EHCI_PHY1_RESET) || \
> + defined(CONFIG_OMAP_EHCI_PHY2_RESET)
> + /*
> + * Refer ISSUE1:
> + * Hold the PHY in RESET for enough time till
> + * PHY is settled and ready
> + */
> + udelay(10);
> +#ifdef CONFIG_OMAP_EHCI_PHY1_RESET
> + gpio_set_value(CONFIG_OMAP_EHCI_PHY1_RESET, 1);
> +#endif
> +#ifdef CONFIG_OMAP_EHCI_PHY2_RESET
> + gpio_set_value(CONFIG_OMAP_EHCI_PHY2_RESET, 1);
> +#endif
> +#endif
same here?
> +
> + hccr = (struct ehci_hccr *)(OMAP3_EHCI_BASE);
> + hcor = (struct ehci_hcor *)(OMAP3_EHCI_BASE + 0x10);
> +
> + debug("OMAP3 EHCI init done\n");
> + return 0;
> +}
> diff --git a/include/configs/omap3_beagle.h b/include/configs/omap3_beagle.h
> index ebb572e..bd13a50 100644
> --- a/include/configs/omap3_beagle.h
> +++ b/include/configs/omap3_beagle.h
> @@ -133,6 +133,9 @@
> /* USB EHCI */
> #define CONFIG_CMD_USB
> #define CONFIG_USB_EHCI
> +#define CONFIG_USB_EHCI_OMAP
> +/*#define CONFIG_EHCI_DCACHE*/ /* leave it disabled for now */
> +#define CONFIG_OMAP_EHCI_PHY1_RESET 147
> #define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS 3
> #define CONFIG_USB_HOST_ETHER
> #define CONFIG_USB_ETHER_SMSC95XX
--
Regards,
Igor.
next prev parent reply other threads:[~2011-11-02 9:14 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-11-01 23:15 [U-Boot] [PATCH 00/14] Support for HTKW mcx board Ilya Yanok
2011-11-01 23:15 ` [U-Boot] [PATCH 01/14] davinci_emac: compilation fix, phy is array now Ilya Yanok
2011-11-01 23:15 ` [U-Boot] [PATCH 02/14] davinci_emac: move arch-independent defines to separate header Ilya Yanok
2011-11-01 23:15 ` [U-Boot] [PATCH 03/14] davinci_emac: use internal addresses in buffer descriptors Ilya Yanok
2011-11-01 23:15 ` [U-Boot] [PATCH 04/14] davinci_emac: conditionally compile specific PHY support Ilya Yanok
2011-11-01 23:15 ` [U-Boot] [PATCH 05/14] davinci_emac: fix for running with dcache enabled Ilya Yanok
2011-11-01 23:16 ` [U-Boot] [PATCH 06/14] davinci_emac: hardcode 100Mbps for AM35xx and RMII Ilya Yanok
2011-11-01 23:16 ` [U-Boot] [PATCH 07/14] AM35xx: add EMAC support Ilya Yanok
2011-11-01 23:16 ` [U-Boot] [PATCH 08/14] AM3517: move AM3517 specific mux defines to generic header Ilya Yanok
2011-11-01 23:16 ` [U-Boot] [PATCH 09/14] omap/spl: actually enable the console Ilya Yanok
2011-11-01 23:16 ` [U-Boot] [PATCH 10/14] nand_spl_simple: add support for software ECC Ilya Yanok
2011-11-01 23:16 ` [U-Boot] [PATCH 11/14] omap_gpmc: use SOFTECC in SPL if it's enabled Ilya Yanok
2011-11-01 23:16 ` [U-Boot] [PATCH 12/14] nand_spl_simple: store temp data at CONFIG_SPL_NAND_WORKSPACE Ilya Yanok
2011-11-01 23:16 ` [U-Boot] [PATCH 13/14] ehci-omap: driver for EHCI host on OMAP3 Ilya Yanok
2011-11-02 9:14 ` Igor Grinberg [this message]
2011-11-11 0:44 ` Ilya Yanok
2011-11-01 23:16 ` [U-Boot] [PATCH 14/14] mcx: support for HTKW mcx board Ilya Yanok
2011-11-02 9:22 ` Igor Grinberg
2011-11-02 1:28 ` [U-Boot] [PATCH 00/14] Support " Tom Rini
2011-11-03 0:33 ` Tom Rini
2011-11-07 0:00 ` Ilya Yanok
2011-11-07 0:14 ` Tom Rini
2011-11-11 0:49 ` Ilya Yanok
2011-11-11 2:52 ` Tom Rini
2011-11-11 22:17 ` Ilya Yanok
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=4EB109DB.2040803@compulab.co.il \
--to=grinberg@compulab.co.il \
--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.