[U-Boot] [PATCH 1/2] 85xx/p1_p2_rdb: p1020: add muxed usb2 handling
Kumar Gala
galak at kernel.crashing.org
Tue Jan 26 05:08:53 CET 2010
On Jan 7, 2010, at 2:57 AM, Vivek Mahajan wrote:
> This patch adds the 2nd USB (muxed with eLBC) node
> depending upon enabling the 'usb2' environment variable
> via hwconfig i.e. "setenv hwconfig usb2", so that linux
> has the 2nd USB controller enabled, which will lead to
> the disabling of the eLBC (NAND, NOR etc).
>
> Also the 2nd USB controller has been left disabled in
> the u-boot, otherwise any changes in the environment
> won't be saved. Enabled agent mode support in USB2
> depending upon "setenv hwconfig usb2:dr_mode=peripheral"
>
> Updated copyright year too.
>
> Signed-off-by: Vivek Mahajan <vivek.mahajan at freescale.com>
> ---
> board/freescale/p1_p2_rdb/p1_p2_rdb.c | 23 +++++++-
> cpu/mpc85xx/fdt.c | 105 ++++++++++++++++++++++++++++++++-
> include/asm-ppc/immap_85xx.h | 4 +-
> include/fdt_support.h | 1 +
> 4 files changed, 130 insertions(+), 3 deletions(-)
>
> diff --git a/board/freescale/p1_p2_rdb/p1_p2_rdb.c b/board/freescale/p1_p2_rdb/p1_p2_rdb.c
> index 3af660e..2bb7ba2 100644
> --- a/board/freescale/p1_p2_rdb/p1_p2_rdb.c
> +++ b/board/freescale/p1_p2_rdb/p1_p2_rdb.c
> @@ -1,5 +1,5 @@
> /*
> - * Copyright 2009 Freescale Semiconductor, Inc.
> + * Copyright 2009-10 Freescale Semiconductor, Inc.
> *
> * See file CREDITS for list of people who contributed to this
> * project.
> @@ -21,6 +21,7 @@
> */
>
> #include <common.h>
> +#include <hwconfig.h>
> #include <command.h>
> #include <asm/processor.h>
> #include <asm/mmu.h>
> @@ -41,6 +42,7 @@ DECLARE_GLOBAL_DATA_PTR;
> #define SGMII_PHY_RST_SET 0x00020000
> #define PCIE_RST_SET 0x00010000
> #define RGMII_PHY_RST_SET 0x02000000
> +#define USB2_PORT_OUT_EN 0x01000000
>
> #define USB_RST_CLR 0x04000000
>
> @@ -200,8 +202,11 @@ int board_eth_init(bd_t *bis)
> #if defined(CONFIG_OF_BOARD_SETUP)
> void ft_board_setup(void *blob, bd_t *bd)
> {
> + volatile ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR;
> + volatile ccsr_gpio_t *gpio = (void *)CONFIG_SYS_MPC85xx_GPIO_ADDR;
> phys_addr_t base;
> phys_size_t size;
> + int agent;
>
> ft_cpu_setup(blob, bd);
>
> @@ -209,6 +214,22 @@ void ft_board_setup(void *blob, bd_t *bd)
> size = getenv_bootm_size();
>
> fdt_fixup_memory(blob, (u64)base, (u64)size);
> +
> + if (!hwconfig("usb2"))
> + return;
> +
> + agent = hwconfig_subarg_cmp("usb2", "dr_mode", "peripheral");
> +
> + /*
> + * Add the 2nd usb node and enable it. eLBC will
> + * now be disabled since it is MUXed with USB2
> + */
> +
> + fdt_fixup_add_2nd_usb(blob, agent);
> +
> + setbits_be32(&gpio->gpdir, USB2_PORT_OUT_EN);
> + setbits_be32(&gpio->gpdat, USB2_PORT_OUT_EN);
> + setbits_be32(&gur->pmuxcr, MPC85xx_PMUXCR_ELBC_OFF_USB2_ON);
> }
> #endif
>
> diff --git a/cpu/mpc85xx/fdt.c b/cpu/mpc85xx/fdt.c
> index af0e78e..37d3d15 100644
> --- a/cpu/mpc85xx/fdt.c
> +++ b/cpu/mpc85xx/fdt.c
> @@ -1,5 +1,5 @@
> /*
> - * Copyright 2007-2009 Freescale Semiconductor, Inc.
> + * Copyright 2007-2010 Freescale Semiconductor, Inc.
> *
> * (C) Copyright 2000
> * Wolfgang Denk, DENX Software Engineering, wd at denx.de.
> @@ -397,3 +397,106 @@ void ft_cpu_setup(void *blob, bd_t *bd)
>
> ft_fixup_dpaa_clks(blob);
> }
> +
> +void fdt_fixup_add_2nd_usb(void *blob, int agent)
> +{
Isn't this specific to the p1020 board? Shouldn't we put this in board/freescale/p1_p2_rdb/p1_p2_rdb.c?
> + const char *soc_compat = "fsl,p1020-immr";
> + const char *lbc_compat = "fsl,p1020-elbc";
> + const u32 *addrcell, *sizecell, *ph;
> + int off, lbcoff, len, err;
> + u32 *regbuf = NULL;
> + u32 *irqbuf = NULL;
> +
> + off = fdt_node_offset_by_compatible(blob, -1, soc_compat);
> + if (off < 0) {
> + printf("WARNING: could not find compatible node %s: %s.\n",
> + soc_compat, fdt_strerror(off));
> + return;
> + }
> +
> + lbcoff = fdt_node_offset_by_compatible(blob, -1, lbc_compat);
> + if (lbcoff < 0) {
> + printf("WARNING: could not find compatible node %s: %s.\n",
> + lbc_compat, fdt_strerror(lbcoff));
> + return;
> + }
> +
> + addrcell = fdt_getprop(blob, off, "#address-cells", NULL);
> + sizecell = fdt_getprop(blob, off, "#size-cells", NULL);
> +
> + off = fdt_add_subnode(blob, off, "usb at 23000");
> + if (off < 0) {
> + printf("WARNING: could not add 2nd usb node %s.\n",
> + fdt_strerror(off));
> + return;
> + }
> +
> + err = fdt_setprop_cell(blob, off, "#address-cells", 1);
> + if (err < 0)
> + printf("WARNING: could not set #address-cell property: %s\n",
> + fdt_strerror(err));
> +
> + err = fdt_setprop_cell(blob, off, "#size-cells", 0);
> + if (err < 0)
> + printf("WARNING: could not set #size-cells property: %s\n",
> + fdt_strerror(err));
> +
> + err = fdt_setprop_string(blob, off, "compatible", "fsl-usb2-dr");
> + if (err < 0)
> + printf("WARNING: could not set compatible property: %s\n",
> + fdt_strerror(err));
> +
> + err = fdt_setprop_string(blob, off, "phy_type", "ulpi");
> + if (err < 0)
> + printf("WARNING: could not set phy_type property: %s\n",
> + fdt_strerror(err));
> +
> + if (agent) {
> + err = fdt_setprop_string(blob, off, "dr_mode", "peripheral");
> + if (err < 0)
> + printf("WARNING: could not set dr_mode property: %s\n",
> + fdt_strerror(err));
> + }
> +
> + if (addrcell && *addrcell == 2) {
> + regbuf[0] = 0;
> + regbuf[1] = CONFIG_SYS_MPC85xx_USB2_OFFSET;
> + len = 2;
> + } else {
> + regbuf[0] = CONFIG_SYS_MPC85xx_USB2_OFFSET;
> + len = 1;
> + }
> +
> + if (sizecell && *sizecell == 2) {
> + regbuf[len] = 0;
> + regbuf[len + 1] = 0x1000;
> + len += 2;
> + } else {
> + regbuf[len] = 0x1000;
> + len++;
> + }
> +
> + err = fdt_setprop(blob, off, "reg", regbuf, len * sizeof(u32));
> + if (err < 0)
> + printf("WARNING: could not set <%s> %s\n",
> + "reg", fdt_strerror(err));
> +
> + irqbuf[0] = 0x2e;
> + irqbuf[1] = 0x2;
> +
> + err = fdt_setprop(blob, off, "interrupts", irqbuf, 2 * sizeof(u32));
> + if (err < 0)
> + printf("WARNING: could not set %s %s\n",
> + "interrupts", fdt_strerror(err));
> +
> + ph = fdt_getprop(blob, lbcoff, "interrupt-parent", 0);
> + if (!ph) {
> + printf("WARNING: could not read interrupt-parent property\n");
> + return;
> + }
> +
> + err = fdt_setprop(blob, off, "interrupt-parent", ph, sizeof(u32));
> + if (err < 0)
> + printf("WARNING: could not set %s %s\n",
> + "interrupt-parent", fdt_strerror(err));
> +}
> diff --git a/include/asm-ppc/immap_85xx.h b/include/asm-ppc/immap_85xx.h
> index 957ad76..b48e21c 100644
> --- a/include/asm-ppc/immap_85xx.h
> +++ b/include/asm-ppc/immap_85xx.h
> @@ -1,7 +1,7 @@
> /*
> * MPC85xx Internal Memory Map
> *
> - * Copyright 2007-2009 Freescale Semiconductor, Inc.
> + * Copyright 2007-2010 Freescale Semiconductor, Inc.
> *
> * Copyright(c) 2002,2003 Motorola Inc.
> * Xianghua Xiao (x.xiao at motorola.com)
> @also@ -1880,6 +1880,7 @@ typedef struct ccsr_gur {
> #define MPC85xx_PMUXCR_SD_DATA 0x80000000
> #define MPC85xx_PMUXCR_SDHC_CD 0x40000000
> #define MPC85xx_PMUXCR_SDHC_WP 0x20000000
> +#define MPC85xx_PMUXCR_ELBC_OFF_USB2_ON 0x01000000
> u8 res6[12];
> u32 devdisr; /* Device disable control */
> #define MPC85xx_DEVDISR_PCI1 0x80000000
> @@ -2032,6 +2033,7 @@ enum {
> #define CONFIG_SYS_MPC85xx_L2_OFFSET 0x20000
> #define CONFIG_SYS_MPC85xx_DMA_OFFSET 0x21000
> #define CONFIG_SYS_MPC85xx_USB_OFFSET 0x22000
> +#define CONFIG_SYS_MPC85xx_USB2_OFFSET 0x23000
> #ifdef CONFIG_TSECV2
> #define CONFIG_SYS_TSEC1_OFFSET 0xB0000
> #else
> diff --git a/include/fdt_support.h b/include/fdt_support.h
> index 0a9dd0d..e7b005d 100644
> --- a/include/fdt_support.h
> +++ b/include/fdt_support.h
> @@ -74,6 +74,7 @@ int fdt_pci_dma_ranges(void *blob, int phb_off, struct pci_controller *hose);
> void ft_board_setup(void *blob, bd_t *bd);
> void ft_cpu_setup(void *blob, bd_t *bd);
> void ft_pci_setup(void *blob, bd_t *bd);
> +void fdt_fixup_add_2nd_usb(void *blob, int agent);
The prototype doesn't belong here. This should be for code mostly in common/fdt_support.c.
> #endif
>
> void set_working_fdt_addr(void *addr);
> --
> 1.5.6.5
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
More information about the U-Boot
mailing list