On 08/07/15 05:20, Li Jun wrote: > On Tue, Jul 07, 2015 at 04:25:44PM +0300, Roger Quadros wrote: >> On 29/06/15 10:47, Li Jun wrote: >>> Init and update otg capabilities by DT, set gadget's otg capabilities >>> accordingly. >>> >>> Signed-off-by: Li Jun <jun.li@xxxxxxxxxxxxx> >>> --- >>> drivers/usb/chipidea/core.c | 10 ++++++++++ >>> drivers/usb/chipidea/udc.c | 7 ++++++- >>> include/linux/usb/chipidea.h | 1 + >>> 3 files changed, 17 insertions(+), 1 deletion(-) >>> >>> diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c >>> index 74fea4f..248f571 100644 >>> --- a/drivers/usb/chipidea/core.c >>> +++ b/drivers/usb/chipidea/core.c >>> @@ -588,6 +588,16 @@ static int ci_get_platdata(struct device *dev, >>> of_usb_host_tpl_support(dev->of_node); >>> } >>> >>> + if (platdata->dr_mode == USB_DR_MODE_OTG) { >>> + /* We can support HNP and SRP of OTG 2.0 */ >>> + platdata->ci_otg_caps.otg_rev = 0x0200; >>> + platdata->ci_otg_caps.hnp_support = true; >>> + platdata->ci_otg_caps.srp_support = true; >>> + >>> + /* Update otg capabilities by DT properties */ >>> + of_usb_update_otg_caps(dev->of_node, &platdata->ci_otg_caps); >> >> What if this function fails. e.g. DT contains unsupported OTG version? > Just an error print out, otg-rev will be the initial value(0x0200), it will > work as otg 2.0. > >> I think we should error out in that case. >> > Disable all otg features? or even stop all usb initialization? My preference would be to fail driver initialization but it is upto the chipidea maintainer to decide. This way DT errors can be caught early and fixed. cheers, -roger > > Li Jun >>> + } >>> + >>> if (of_usb_get_maximum_speed(dev->of_node) == USB_SPEED_FULL) >>> platdata->flags |= CI_HDRC_FORCE_FULLSPEED; >> >> cheers, >> -roger >> >>> >>> diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c >>> index 764f668..b7cca3e 100644 >>> --- a/drivers/usb/chipidea/udc.c >>> +++ b/drivers/usb/chipidea/udc.c >>> @@ -1827,6 +1827,7 @@ static irqreturn_t udc_irq(struct ci_hdrc *ci) >>> static int udc_start(struct ci_hdrc *ci) >>> { >>> struct device *dev = ci->dev; >>> + struct usb_otg_caps *otg_caps = &ci->platdata->ci_otg_caps; >>> int retval = 0; >>> >>> spin_lock_init(&ci->lock); >>> @@ -1834,8 +1835,12 @@ static int udc_start(struct ci_hdrc *ci) >>> ci->gadget.ops = &usb_gadget_ops; >>> ci->gadget.speed = USB_SPEED_UNKNOWN; >>> ci->gadget.max_speed = USB_SPEED_HIGH; >>> - ci->gadget.is_otg = ci->is_otg ? 1 : 0; >>> ci->gadget.name = ci->platdata->name; >>> + ci->gadget.otg_caps = otg_caps; >>> + >>> + if (otg_caps->hnp_support || otg_caps->srp_support || >>> + otg_caps->adp_support) >>> + ci->gadget.is_otg = 1; >>> >>> INIT_LIST_HEAD(&ci->gadget.ep_list); >>> >>> diff --git a/include/linux/usb/chipidea.h b/include/linux/usb/chipidea.h >>> index ab94f78..e10cefc 100644 >>> --- a/include/linux/usb/chipidea.h >>> +++ b/include/linux/usb/chipidea.h >>> @@ -34,6 +34,7 @@ struct ci_hdrc_platform_data { >>> #define CI_HDRC_CONTROLLER_STOPPED_EVENT 1 >>> void (*notify_event) (struct ci_hdrc *ci, unsigned event); >>> struct regulator *reg_vbus; >>> + struct usb_otg_caps ci_otg_caps; >>> bool tpl_support; >>> }; >>> >>> -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html