mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-22 15:11:33 +00:00
usb: dwc2: correctly program hcchar for LS devices
A bit must be set in HCCHAR when communicating with low-speed devices. I have no idea why there's no corresponding bit to distinguish between full-speed and high-speed devices, but no matter; they all work now! Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>
This commit is contained in:
parent
122426d46e
commit
ed9bcbc792
1 changed files with 12 additions and 9 deletions
|
@ -398,15 +398,18 @@ static void dwc_otg_core_init(struct dwc2_core_regs *regs)
|
||||||
* @param hc Information needed to initialize the host channel
|
* @param hc Information needed to initialize the host channel
|
||||||
*/
|
*/
|
||||||
static void dwc_otg_hc_init(struct dwc2_core_regs *regs, uint8_t hc_num,
|
static void dwc_otg_hc_init(struct dwc2_core_regs *regs, uint8_t hc_num,
|
||||||
uint8_t dev_addr, uint8_t ep_num, uint8_t ep_is_in,
|
struct usb_device *dev, uint8_t dev_addr, uint8_t ep_num,
|
||||||
uint8_t ep_type, uint16_t max_packet)
|
uint8_t ep_is_in, uint8_t ep_type, uint16_t max_packet)
|
||||||
{
|
{
|
||||||
struct dwc2_hc_regs *hc_regs = ®s->hc_regs[hc_num];
|
struct dwc2_hc_regs *hc_regs = ®s->hc_regs[hc_num];
|
||||||
const uint32_t hcchar = (dev_addr << DWC2_HCCHAR_DEVADDR_OFFSET) |
|
uint32_t hcchar = (dev_addr << DWC2_HCCHAR_DEVADDR_OFFSET) |
|
||||||
(ep_num << DWC2_HCCHAR_EPNUM_OFFSET) |
|
(ep_num << DWC2_HCCHAR_EPNUM_OFFSET) |
|
||||||
(ep_is_in << DWC2_HCCHAR_EPDIR_OFFSET) |
|
(ep_is_in << DWC2_HCCHAR_EPDIR_OFFSET) |
|
||||||
(ep_type << DWC2_HCCHAR_EPTYPE_OFFSET) |
|
(ep_type << DWC2_HCCHAR_EPTYPE_OFFSET) |
|
||||||
(max_packet << DWC2_HCCHAR_MPS_OFFSET);
|
(max_packet << DWC2_HCCHAR_MPS_OFFSET);
|
||||||
|
|
||||||
|
if (dev->speed == USB_SPEED_LOW)
|
||||||
|
hcchar |= DWC2_HCCHAR_LSPDDEV;
|
||||||
|
|
||||||
/* Clear old interrupt conditions for this host channel. */
|
/* Clear old interrupt conditions for this host channel. */
|
||||||
writel(0x3fff, &hc_regs->hcint);
|
writel(0x3fff, &hc_regs->hcint);
|
||||||
|
@ -766,8 +769,8 @@ int chunk_msg(struct usb_device *dev, unsigned long pipe, int *pid, int in,
|
||||||
|
|
||||||
do {
|
do {
|
||||||
/* Initialize channel */
|
/* Initialize channel */
|
||||||
dwc_otg_hc_init(regs, DWC2_HC_CHANNEL, devnum, ep, in, eptype,
|
dwc_otg_hc_init(regs, DWC2_HC_CHANNEL, dev, devnum, ep, in,
|
||||||
max);
|
eptype, max);
|
||||||
|
|
||||||
xfer_len = len - done;
|
xfer_len = len - done;
|
||||||
if (xfer_len > CONFIG_DWC2_MAX_TRANSFER_SIZE)
|
if (xfer_len > CONFIG_DWC2_MAX_TRANSFER_SIZE)
|
||||||
|
|
Loading…
Add table
Reference in a new issue