[U-Boot] [PATCH v2] imx: mx6 sabreauto: Add board support for USB EHCI
Stefano Babic
sbabic at denx.de
Thu Oct 30 11:18:24 CET 2014
Hi Ye,
On 13/10/2014 14:38, Ye.Li wrote:
> On mx6 sabreauto board, there are two USB ports:
> 0: OTG
> 1: HOST
> The EHCI driver is enabled for this board, but the IOMUX and VBUS power
> control is not implemented, which cause both USB port failed to work.
> This patch fix the problem by adding the board support codes.
>
> Since the power control uses the GPIO pin from port expander MAX7310,
> the PCA953X driver is enabled for accessing the MAX7310.
>
> The ID pin of OTG Port needs to configure the GPR1 bit 13 for selecting
> its daisy chain. Add a new function "imx_iomux_set_gpr_register" to
> handle GPR register setting.
>
> Signed-off-by: Ye.Li <B37916 at freescale.com>
> ---
> Changes since v1:
> - Modify codes and patch message according with Fabio's comments.
>
> arch/arm/imx-common/iomux-v3.c | 15 ++++
> arch/arm/include/asm/imx-common/iomux-v3.h | 5 ++
> board/freescale/mx6qsabreauto/mx6qsabreauto.c | 90 +++++++++++++++++++++++++
> include/configs/mx6qsabreauto.h | 3 +
> 4 files changed, 113 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/imx-common/iomux-v3.c b/arch/arm/imx-common/iomux-v3.c
> index 22cd11a..e88e6e2 100644
> --- a/arch/arm/imx-common/iomux-v3.c
> +++ b/arch/arm/imx-common/iomux-v3.c
> @@ -77,3 +77,18 @@ void imx_iomux_v3_setup_multiple_pads(iomux_v3_cfg_t const *pad_list,
> p += stride;
> }
> }
> +
> +void imx_iomux_set_gpr_register(int group, int start_bit,
> + int num_bits, int value)
> +{
> + int i = 0;
> + u32 reg;
> + reg = readl(base + group * 4);
> + while (num_bits) {
> + reg &= ~(1<<(start_bit + i));
> + i++;
> + num_bits--;
> + }
> + reg |= (value << start_bit);
> + writel(reg, base + group * 4);
> +}
> diff --git a/arch/arm/include/asm/imx-common/iomux-v3.h b/arch/arm/include/asm/imx-common/iomux-v3.h
> index 70ee86c..4d10e81 100644
> --- a/arch/arm/include/asm/imx-common/iomux-v3.h
> +++ b/arch/arm/include/asm/imx-common/iomux-v3.h
> @@ -180,6 +180,11 @@ typedef u64 iomux_v3_cfg_t;
> void imx_iomux_v3_setup_pad(iomux_v3_cfg_t pad);
> void imx_iomux_v3_setup_multiple_pads(iomux_v3_cfg_t const *pad_list,
> unsigned count);
> +/*
> +* Set bits for general purpose registers
> +*/
> +void imx_iomux_set_gpr_register(int group, int start_bit,
> + int num_bits, int value);
>
> /* macros for declaring and using pinmux array */
> #if defined(CONFIG_MX6QDL)
> diff --git a/board/freescale/mx6qsabreauto/mx6qsabreauto.c b/board/freescale/mx6qsabreauto/mx6qsabreauto.c
> index dd6d2a6..586b1ff 100644
> --- a/board/freescale/mx6qsabreauto/mx6qsabreauto.c
> +++ b/board/freescale/mx6qsabreauto/mx6qsabreauto.c
> @@ -23,6 +23,7 @@
> #include <netdev.h>
> #include <asm/arch/sys_proto.h>
> #include <i2c.h>
> +#include <pca953x.h>
>
> DECLARE_GLOBAL_DATA_PTR;
>
> @@ -112,6 +113,44 @@ static iomux_v3_cfg_t const port_exp[] = {
> MX6_PAD_SD2_DAT0__GPIO1_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL),
> };
>
> +/*Define for building port exp gpio, pin starts from 0*/
> +#define PORTEXP_IO_NR(chip, pin) \
> + ((chip << 5) + pin)
> +
> +/*Get the chip addr from a ioexp gpio*/
> +#define PORTEXP_IO_TO_CHIP(gpio_nr) \
> + (gpio_nr >> 5)
> +
> +/*Get the pin number from a ioexp gpio*/
> +#define PORTEXP_IO_TO_PIN(gpio_nr) \
> + (gpio_nr & 0x1f)
> +
> +static int port_exp_direction_output(unsigned gpio, int value)
> +{
> + int ret;
> +
> + i2c_set_bus_num(2);
> + ret = i2c_probe(PORTEXP_IO_TO_CHIP(gpio))
This is a clear syntax error - ";" is missing.
> + if (ret)
> + return ret;
> +
> + ret = pca953x_set_dir(PORTEXP_IO_TO_CHIP(gpio),
> + (1 << PORTEXP_IO_TO_PIN(gpio)),
> + (PCA953X_DIR_OUT << PORTEXP_IO_TO_PIN(gpio)));
> +
> + if (ret)
> + return ret;
> +
> + ret = pca953x_set_val(PORTEXP_IO_TO_CHIP(gpio),
> + (1 << PORTEXP_IO_TO_PIN(gpio)),
> + (value << PORTEXP_IO_TO_PIN(gpio)));
> +
> + if (ret)
> + return ret;
> +
> + return 0;
> +}
> +
> static void setup_iomux_enet(void)
> {
> imx_iomux_v3_setup_multiple_pads(enet_pads, ARRAY_SIZE(enet_pads));
> @@ -295,3 +334,54 @@ int checkboard(void)
>
> return 0;
> }
> +
> +#ifdef CONFIG_USB_EHCI_MX6
> +#define USB_HOST1_PWR PORTEXP_IO_NR(0x32, 7)
> +#define USB_OTG_PWR PORTEXP_IO_NR(0x34, 1)
> +
> +iomux_v3_cfg_t const usb_otg_pads[] = {
> + MX6_PAD_ENET_RX_ER__USB_OTG_ID | MUX_PAD_CTRL(NO_PAD_CTRL),
> +};
> +
> +int board_ehci_hcd_init(int port)
> +{
> + switch (port) {
> + case 0:
> + imx_iomux_v3_setup_multiple_pads(usb_otg_pads,
> + ARRAY_SIZE(usb_otg_pads));
> +
> + /*set daisy chain for otg_pin_id on 6q. for 6dl, this bit is reserved*/
Line over 80 chars and wrong style for comment.
> + imx_iomux_set_gpr_register(1, 13, 1, 0);
> + break;
> + case 1:
> + break;
> + default:
> + printf("MXC USB port %d not yet supported\n", port);
> + return -EINVAL;
> + }
> + return 0;
> +}
> +
> +int board_ehci_power(int port, int on)
> +{
> + switch (port) {
> + case 0:
> + if (on)
> + port_exp_direction_output(USB_OTG_PWR, 1);
> + else
> + port_exp_direction_output(USB_OTG_PWR, 0);
> + break;
> + case 1:
> + if (on)
> + port_exp_direction_output(USB_HOST1_PWR, 1);
> + else
> + port_exp_direction_output(USB_HOST1_PWR, 0);
> + break;
> + default:
> + printf("MXC USB port %d not yet supported\n", port);
> + return -EINVAL;
> + }
> +
> + return 0;
> +}
> +#endif
> diff --git a/include/configs/mx6qsabreauto.h b/include/configs/mx6qsabreauto.h
> index 0ab3127..235dd6d 100644
> --- a/include/configs/mx6qsabreauto.h
> +++ b/include/configs/mx6qsabreauto.h
> @@ -32,6 +32,9 @@
> #define CONFIG_MXC_USB_PORTSC (PORT_PTS_UTMI | PORT_PTS_PTW)
> #define CONFIG_MXC_USB_FLAGS 0
>
> +#define CONFIG_PCA953X
> +#define CONFIG_SYS_I2C_PCA953X_WIDTH { {0x30, 8}, {0x32, 8}, {0x34, 8} }
> +
> #include "mx6sabre_common.h"
>
> #define CONFIG_SYS_FSL_USDHC_NUM 2
>
Best regards,
Stefano Babic
--
=====================================================================
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================
More information about the U-Boot
mailing list