PERFORCE change 166001 for review
Sylvestre Gallon
syl at FreeBSD.org
Mon Jul 13 13:12:30 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=166001
Change 166001 by syl at syl_pablo on 2009/07/13 13:11:35
Implement clear_stall.
Update get_hw_ep_profile because this ip does not support isochronous
transfers.
Affected files ...
.. //depot/projects/soc2009/syl_usb/src/sys/dev/usb/controller/s3c24xxdci.c#3 edit
.. //depot/projects/soc2009/syl_usb/src/sys/dev/usb/controller/s3c24xxdci.h#4 edit
Differences ...
==== //depot/projects/soc2009/syl_usb/src/sys/dev/usb/controller/s3c24xxdci.c#3 (text+ko) ====
@@ -73,6 +73,12 @@
#endif
/*
+ * This driver dont support DMA for the mement. DMA seems to not be
+ * implemented on s3c2xxx cpus.
+ */
+
+
+/*
* Here is a list of what the chip supports.
*/
@@ -91,7 +97,6 @@
.support_multi_buffer = 1,
.support_bulk = 1,
.support_interrupt = 1,
- .support_isochronous = 1 ,
.support_in = 1,
.support_out = 1 ,
},
@@ -102,7 +107,6 @@
.support_multi_buffer = 1,
.support_bulk = 1,
.support_interrupt = 1,
- .support_isochronous = 1 ,
.support_in = 1,
.support_out = 1 ,
},
@@ -113,7 +117,6 @@
.support_multi_buffer = 1,
.support_bulk = 1,
.support_interrupt = 1,
- .support_isochronous = 1 ,
.support_in = 1,
.support_out = 1 ,
},
@@ -124,7 +127,6 @@
.support_multi_buffer = 1,
.support_bulk = 1,
.support_interrupt = 1,
- .support_isochronous = 1 ,
.support_in = 1,
.support_out = 1 ,
},
@@ -284,9 +286,96 @@
return ;
}
+static void
+s3c24dci_clear_stall_sub(struct s3c24dci_softc *sc, uint8_t ep_no,
+ uint8_t ep_type, uint8_t ep_dir)
+{
+ const struct usb_hw_ep_profile *pf;
+ uint32_t csr1;
+ uint32_t csr2;
+ uint32_t ittmp;
+
+ if (ep_type == UE_CONTROL) {
+ /* clearing stall is not needed */
+ }
+
+ /* disable ep */
+
+ ittmp = S3C24XX_DCI_READ_4(S3C24_DCI_EP_INT_EN);
+ ittmp &= ~(1<<ep_no);
+ S3C24XX_DCI_WRITE_4(S3C24_DCI_EP_INT_EN, ittmp);
+
+ /* get endpoint profile */
+ s3c24dci_get_hw_ep_profile(NULL, &pf, ep_no);
+
+ /*
+ * Need to update for clear rx flags for single buffer
+ * or eventual ping pong
+ */
+
+
+ /* compute default CSR value */
+
+ S3C24XX_DCI_WRITE_4(S3C24_DCI_INDEX, ep_no);
+ S3C24XX_DCI_WRITE_4(S3C24_DCI_MAXP, S3C24_DCI_MAXP64);
+
+ /* enable endpoint */
+ if (ep_dir & UE_DIR_IN) {
+ csr1 = S3C24_DCI_IN_FIFO_FLUSH|S3C24_DCI_IN_CLR_DATA_TOGGLE;
+ csr2 = S3C24_DCI_IN_MODE_IN;
+
+ S3C24XX_DCI_WRITE_4(S3C24_DCI_INDEX, ep_no);
+ S3C24XX_DCI_WRITE_4(S3C24_DCI_IN_CSR1, csr1);
+ S3C24XX_DCI_WRITE_4(S3C24_DCI_INDEX, ep_no);
+ S3C24XX_DCI_WRITE_4(S3C24_DCI_IN_CSR2, csr2);
+
+ } else {
+ csr1 = S3C24_DCI_OUT_CLR_DATA_TOGGLE;
+ csr2 = 0;
+
+ S3C24XX_DCI_WRITE_4(S3C24_DCI_INDEX, ep_no);
+ S3C24XX_DCI_WRITE_4(S3C24_DCI_OUT_CSR1, csr1);
+ S3C24XX_DCI_WRITE_4(S3C24_DCI_INDEX, ep_no);
+ S3C24XX_DCI_WRITE_4(S3C24_DCI_OUT_CSR2, csr2);
+
+ csr1 = S3C24_DCI_OUT_FIFO_FLUSH | S3C24_DCI_OUT_CLR_DATA_TOGGLE;
+ csr2 = 0;
+
+ S3C24XX_DCI_WRITE_4(S3C24_DCI_INDEX, ep_no);
+ S3C24XX_DCI_WRITE_4(S3C24_DCI_OUT_CSR1, csr1);
+ S3C24XX_DCI_WRITE_4(S3C24_DCI_INDEX, ep_no);
+ S3C24XX_DCI_WRITE_4(S3C24_DCI_OUT_CSR2, csr2);
+ }
+
+ /* enable it on the ep */
+ ittmp = S3C24XX_DCI_READ_4(S3C24_DCI_EP_INT_EN);
+ ittmp |= (1<<ep_no);
+ S3C24XX_DCI_WRITE_4(S3C24_DCI_EP_INT_EN, ittmp);
+}
+
static void
s3c24dci_clear_stall(struct usb_device *udev, struct usb_endpoint *ep)
{
+ struct s3c24dci_softc *sc;
+ struct usb_endpoint_descriptor *ed;
+
+ DPRINTF(5, "endpoint=%p\n", ep);
+
+ /* check mode */
+ if (udev->flags.usb_mode != USB_MODE_DEVICE) {
+ /* not supported */
+ return ;
+ }
+ /* get softc */
+ sc = S3C24_DCI_BUS2SC(udev->bus);
+
+ /* get endpoint descriptors */
+ ed = ep->edesc;
+
+ s3c24dci_clear_stall_sub(sc,
+ (ed->bEndpointAddress & UE_ADDR),
+ (ed->bmAttributes & UE_XFERTYPE),
+ (ed->bEndpointAddress & (UE_DIR_IN | UE_DIR_OUT)));
return ;
}
==== //depot/projects/soc2009/syl_usb/src/sys/dev/usb/controller/s3c24xxdci.h#4 (text+ko) ====
@@ -169,6 +169,12 @@
#define S3C24XX_DCI_EP_MAX 5
+#define S3C24XX_DCI_READ_4(sc, reg) \
+ bus_space_read_4((sc)->sc_io_tag, (sc)->sc_io_hdl, reg)
+
+#define S3C24XX_DCI_WRITE_4(sc, reg, (sc)->sc_io_hdl, reg, data) \
+ bus_space_write_4((sc)->sc_io_tag, (sc)->sc_io_hdl, reg, data)
+
struct s3c24dci_softc {
struct usb_bus sc_bus;
More information about the p4-projects
mailing list