Merge "usb: gadget: composite: Support more than 500mA MaxPower"

This commit is contained in:
qctecmdr 2020-04-17 15:38:17 -07:00 • committed by Gerrit - the friendly Code Review server
commit 5bcf7e3ec6

View file

@ -483,9 +483,13 @@ static u8 encode_bMaxPower(enum usb_device_speed speed,
if (!val)
return 0;
if (speed < USB_SPEED_SUPER)
return DIV_ROUND_UP(val, 2);
return min(val, 500U) / 2;
else
return DIV_ROUND_UP(val, 8);
/*
* USB 3.x supports up to 900mA, but since 900 isn't divisible
* by 8 the integral division will effectively cap to 896mA.
*/
return min(val, 900U) / 8;
}
static int config_buf(struct usb_configuration *config,
@ -897,6 +901,10 @@ static int set_config(struct usb_composite_dev *cdev,
/* when we return, be sure our power usage is valid */
power = c->MaxPower ? c->MaxPower : CONFIG_USB_GADGET_VBUS_DRAW;
if (gadget->speed < USB_SPEED_SUPER)
power = min(power, 500U);
else
power = min(power, 900U);
done:
usb_gadget_vbus_draw(gadget, power);
if (result >= 0 && cdev->delayed_status)
@ -2329,7 +2337,7 @@ void composite_resume(struct usb_gadget *gadget)
{
struct usb_composite_dev *cdev = get_gadget_data(gadget);
struct usb_function *f;
u16 maxpower;
unsigned int maxpower;
/* REVISIT: should we have config level
* suspend/resume callbacks?
@ -2343,10 +2351,14 @@ void composite_resume(struct usb_gadget *gadget)
f->resume(f);
}
maxpower = cdev->config->MaxPower;
maxpower = cdev->config->MaxPower ?
cdev->config->MaxPower : CONFIG_USB_GADGET_VBUS_DRAW;
if (gadget->speed < USB_SPEED_SUPER)
maxpower = min(maxpower, 500U);
else
maxpower = min(maxpower, 900U);
usb_gadget_vbus_draw(gadget, maxpower ?
maxpower : CONFIG_USB_GADGET_VBUS_DRAW);
usb_gadget_vbus_draw(gadget, maxpower);
}
cdev->suspended = 0;