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 <b37...@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: sba...@denx.de
=====================================================================
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to