Here's a fix backported from kernel to u-boot to handle udc dual-packet mode on s3c2440.
This patch fixes weird behavior of u-boot console on ttyACM. Tested only on s3c2442 (my rx1950 PDA)
From 65b9b3965c67a9b957016b60f7a460765841e500 Mon Sep 17 00:00:00 2001 From: Vasily Khoruzhick <[email protected]> Date: Thu, 3 Jun 2010 09:54:27 +0300 Subject: [PATCH 3/5] Fix dualpacket issue on s3c2440 Signed-off-by: Vasily Khoruzhick <[email protected]> --- drivers/usb/usbdcore_s3c2410.c | 18 +++++++++++++++++- 1 files changed, 17 insertions(+), 1 deletions(-) diff --git a/drivers/usb/usbdcore_s3c2410.c b/drivers/usb/usbdcore_s3c2410.c index 13cd3d6..6a5faf4 100644 --- a/drivers/usb/usbdcore_s3c2410.c +++ b/drivers/usb/usbdcore_s3c2410.c @@ -457,11 +457,13 @@ void udc_irq(void) void s3c2410_udc_irq(void) { struct usb_endpoint_instance *ep0 = udc_device->bus->endpoint_array; - u_int32_t save_idx = inl(S3C2410_UDC_INDEX_REG); + u_int32_t save_idx = inl(S3C2410_UDC_INDEX_REG), idx2; /* read interrupt sources */ u_int32_t usb_status = inl(S3C2410_UDC_USB_INT_REG); u_int32_t usbd_status = inl(S3C2410_UDC_EP_INT_REG); + u_int32_t pwr_reg = inl(S3C2410_UDC_PWR_REG); + u_int32_t ep0csr = inl(S3C2410_UDC_IN_CSR1_REG); //debug("< IRQ usbs=0x%02x, usbds=0x%02x start >", usb_status, usbd_status); @@ -505,6 +507,20 @@ void s3c2410_udc_irq(void) s3c2410_udc_epn(i); } } + + /* what else causes this interrupt? a receive! who is it? */ + if (!usb_status && !usbd_status && !pwr_reg && !ep0csr) { + for (i = 1; i < 5; i++) { + idx2 = inl(S3C2410_UDC_INDEX_REG); + outl(i, S3C2410_UDC_INDEX_REG); + + if (inl(S3C2410_UDC_OUT_CSR1_REG) & 0x1) + s3c2410_udc_epn(i); + + /* restore index */ + outl(idx2, S3C2410_UDC_INDEX_REG); + } + } } S3C2410_UDC_SETIX(save_idx); } -- 1.7.1
signature.asc
Description: This is a digitally signed message part.
