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

Attachment: signature.asc
Description: This is a digitally signed message part.

Reply via email to