[PATCH 35/45] usb: ohci-at91: Add DT support

Sam Ravnborg sam at ravnborg.org
Tue Mar 7 08:40:00 PST 2017


On Mon, Mar 06, 2017 at 02:53:46PM -0800, Andrey Smirnov wrote:
> Signed-off-by: Andrey Smirnov <andrew.smirnov at gmail.com>
> ---
>  arch/arm/mach-at91/include/mach/board.h |  6 ++-
>  drivers/usb/host/ohci-at91.c            | 84 ++++++++++++++++++++++++++++++++-
>  2 files changed, 86 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/arm/mach-at91/include/mach/board.h b/arch/arm/mach-at91/include/mach/board.h
> index 491b220..5d76e00 100644
> --- a/arch/arm/mach-at91/include/mach/board.h
> +++ b/arch/arm/mach-at91/include/mach/board.h
> @@ -32,11 +32,13 @@
>  
>  void at91_set_main_clock(unsigned long rate);
>  
> +#define AT91_MAX_USBH_PORTS	3
> +
>   /* USB Host */
>  struct at91_usbh_data {
>  	u8		ports;		/* number of ports on root hub */
> -	int		vbus_pin[2];	/* port power-control pin */
> -	u8	vbus_pin_active_low[2];	/* vbus polarity */
> +	int		vbus_pin[AT91_MAX_USBH_PORTS];	/* port power-control pin */
> +	u8	vbus_pin_active_low[AT91_MAX_USBH_PORTS];	/* vbus polarity */
>  };
>  extern void __init at91_add_device_usbh_ohci(struct at91_usbh_data *data);
>  extern void __init at91_add_device_usbh_ehci(struct at91_usbh_data *data);
> diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c
> index f413616..54fe45f 100644
> --- a/drivers/usb/host/ohci-at91.c
> +++ b/drivers/usb/host/ohci-at91.c
> @@ -23,10 +23,18 @@
>  #include <usb/usb.h>
>  #include <usb/usb_defs.h>
>  #include <errno.h>
> +#include <gpio.h>
> +#include <of_gpio.h>
>  #include <io.h>
>  
> +#include <mach/board.h>
> +
>  #include "ohci.h"
>  
> +#define at91_for_each_port(index)					\
> +	for ((index) = 0; (index) < AT91_MAX_USBH_PORTS; (index)++)
> +
> +
>  struct ohci_at91_priv {
>  	struct device_d *dev;
>  	struct clk *iclk;
> @@ -59,6 +67,53 @@ static void at91_stop_clock(struct ohci_at91_priv *ohci_at91)
>  	clk_disable(ohci_at91->iclk);
>  }
>  
> +static void at91_ohci_probe_dt(struct device_d *dev)
> +{
> +	u32 ports;
> +	int i, ret, gpio;
> +	enum of_gpio_flags flags;
> +	struct at91_usbh_data *pdata;
> +	struct device_node *np = dev->device_node;
> +
> +	pdata = xzalloc(sizeof(*pdata));
> +	dev->platform_data = pdata;
> +
> +	if (!of_property_read_u32(np, "num-ports", &ports))
> +		pdata->ports = ports;
If we fail to read "num-ports" then we will fail in the following when dereferencing pdata->ports
> +
> +	at91_for_each_port(i) {
> +		/*
> +		 * do not configure PIO if not in relation with
> +		 * real USB port on board
> +		 */
> +		if (i >= pdata->ports) {
                         ^ here

> +			pdata->vbus_pin[i] = -EINVAL;
> +			continue;
> +		}



More information about the barebox mailing list