summaryrefslogtreecommitdiff
path: root/packages/linux/linux-rp-2.6.23
diff options
context:
space:
mode:
Diffstat (limited to 'packages/linux/linux-rp-2.6.23')
-rw-r--r--packages/linux/linux-rp-2.6.23/tmio-ohci-r9.patch135
1 files changed, 124 insertions, 11 deletions
diff --git a/packages/linux/linux-rp-2.6.23/tmio-ohci-r9.patch b/packages/linux/linux-rp-2.6.23/tmio-ohci-r9.patch
index 034acc7b8e..9b8434a0bc 100644
--- a/packages/linux/linux-rp-2.6.23/tmio-ohci-r9.patch
+++ b/packages/linux/linux-rp-2.6.23/tmio-ohci-r9.patch
@@ -3,8 +3,8 @@ Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com>
Index: linux-2.6.23/drivers/usb/host/ohci-tmio.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.23/drivers/usb/host/ohci-tmio.c 2007-11-13 01:35:13.049455112 +0300
-@@ -0,0 +1,417 @@
++++ linux-2.6.23/drivers/usb/host/ohci-tmio.c 2007-11-14 16:58:47.637707413 +0300
+@@ -0,0 +1,530 @@
+/*
+ * OHCI HCD(Host Controller Driver) for USB.
+ *
@@ -53,6 +53,14 @@ Index: linux-2.6.23/drivers/usb/host/ohci-tmio.c
+
+/*-------------------------------------------------------------------------*/
+
++#define MAX_TMIO_USB_PORTS 2
++static bool default_tmio_ports[MAX_TMIO_USB_PORTS];
++module_param_array(default_tmio_ports, bool, NULL, 0644);
++MODULE_PARM_DESC(default_tmio_ports,
++ "disable specified TC6393 usb ports (default: all enabled)");
++
++/*-------------------------------------------------------------------------*/
++
+/*
+ * USB Host Controller Configuration Register
+ */
@@ -87,8 +95,8 @@ Index: linux-2.6.23/drivers/usb/host/ohci-tmio.c
+struct {
+ unsigned gcken:1; /* D0 */
+ unsigned ckrnen:1; /* D1 */
-+ unsigned uspw1:1; /* D2 USB Port 1 Power Disable */
-+ unsigned uspw2:1; /* D3 USB Port 2 Power Disable */
++ unsigned uspw0:1; /* D2 USB Port 1 Power Disable */
++ unsigned uspw1:1; /* D3 USB Port 2 Power Disable */
+ unsigned x00:4;
+ unsigned pmee:1; /* D8 */
+ unsigned x01:6;
@@ -100,6 +108,7 @@ Index: linux-2.6.23/drivers/usb/host/ohci-tmio.c
+
+struct tmio_hcd {
+ struct tmio_uhccr __iomem *ccr;
++ bool disabled_ports[MAX_TMIO_USB_PORTS];
+};
+
+#define hcd_to_tmio(hcd) ((struct tmio_hcd *)(hcd_to_ohci(hcd) + 1))
@@ -107,6 +116,39 @@ Index: linux-2.6.23/drivers/usb/host/ohci-tmio.c
+
+/*-------------------------------------------------------------------------*/
+
++struct indexed_device_attribute{
++ struct device_attribute dev_attr;
++ int index;
++};
++#define to_indexed_dev_attr(_dev_attr) \
++ container_of(_dev_attr, struct indexed_device_attribute, dev_attr)
++
++#define INDEXED_ATTR(_name, _mode, _show, _store, _index) \
++ { .dev_attr = __ATTR(_name ## _index, _mode, _show, _store), \
++ .index = _index }
++
++#define INDEXED_DEVICE_ATTR(_name, _mode, _show, _store, _index) \
++struct indexed_device_attribute dev_attr_##_name ## _index \
++ = INDEXED_ATTR(_name, _mode, _show, _store, _index)
++
++/*-------------------------------------------------------------------------*/
++
++
++static void tmio_fill_pm(struct tmio_hcd *tmio, union tmio_uhccr_pm *pm)
++{
++ pm->raw = 0;
++
++ pm->pmee = 1;
++ pm->pmes = 1;
++ pm->gcken = 1;
++ pm->ckrnen = 1;
++
++ if (tmio->disabled_ports[0])
++ pm->uspw0 = 1;
++ if (tmio->disabled_ports[1])
++ pm->uspw1 = 1;
++}
++
+static void tmio_stop_hc(struct device *dev)
+{
+ struct tmio_device *tdev = dev_to_tdev(dev);
@@ -117,8 +159,8 @@ Index: linux-2.6.23/drivers/usb/host/ohci-tmio.c
+
+ pm.gcken = 1;
+ pm.ckrnen = 1;
++ pm.uspw0 = 1;
+ pm.uspw1 = 1;
-+ pm.uspw2 = 1;
+
+ iowrite8(0, &ccr->intc);
+ iowrite8(0, &ccr->ilme);
@@ -139,10 +181,7 @@ Index: linux-2.6.23/drivers/usb/host/ohci-tmio.c
+ union tmio_uhccr_pm pm = {0};
+ unsigned long base = hcd->rsrc_start;
+
-+ pm.pmes = 1;
-+ pm.pmee = 1;
-+ pm.ckrnen = 1;
-+ pm.gcken = 1;
++ tmio_fill_pm(tmio, &pm);
+
+ tdev->ops->clock(dev, 1);
+ tdev->ops->function(dev, 1);
@@ -157,6 +196,54 @@ Index: linux-2.6.23/drivers/usb/host/ohci-tmio.c
+ ioread8(&ccr->revid), hcd->rsrc_start, hcd->irq);
+}
+
++static ssize_t tmio_disabled_port_show(struct device *dev,
++ struct device_attribute *attr,
++ char *buf)
++{
++ struct usb_hcd *hcd = dev_get_drvdata(dev);
++ struct tmio_hcd *tmio = hcd_to_tmio(hcd);
++ int index = to_indexed_dev_attr(attr)->index;
++ return snprintf(buf, PAGE_SIZE, "%c",
++ tmio->disabled_ports[index]? 'Y': 'N');
++}
++
++static ssize_t tmio_disabled_port_store(struct device *dev,
++ struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ struct usb_hcd *hcd = dev_get_drvdata(dev);
++ struct tmio_hcd *tmio = hcd_to_tmio(hcd);
++ struct tmio_uhccr __iomem *ccr = tmio->ccr;
++ union tmio_uhccr_pm pm = {0};
++ int index = to_indexed_dev_attr(attr)->index;
++
++ if (!count)
++ return -EINVAL;
++
++ switch (buf[0]) {
++ case 'y': case 'Y': case '1':
++ tmio->disabled_ports[index] = true;
++ break;
++ case 'n': case 'N': case '0':
++ tmio->disabled_ports[index] = false;
++ break;
++ default:
++ return -EINVAL;
++ }
++
++ tmio_fill_pm(tmio, &pm);
++
++ iowrite16(pm.raw, &ccr->pm);
++
++ return 1;
++}
++
++
++static INDEXED_DEVICE_ATTR(disabled_usb_port, S_IRUGO | S_IWUSR,
++ tmio_disabled_port_show, tmio_disabled_port_store, 0);
++static INDEXED_DEVICE_ATTR(disabled_usb_port, S_IRUGO | S_IWUSR,
++ tmio_disabled_port_show, tmio_disabled_port_store, 1);
++
+static int usb_hcd_tmio_probe(const struct hc_driver *driver,
+ struct device *dev)
+{
@@ -195,6 +282,9 @@ Index: linux-2.6.23/drivers/usb/host/ohci-tmio.c
+ hcd->rsrc_len = regs->end - regs->start + 1;
+
+ tmio = hcd_to_tmio(hcd);
++ memcpy(tmio->disabled_ports,
++ default_tmio_ports,
++ sizeof(default_tmio_ports));
+
+ tmio->ccr = ioremap(config->start, config->end - config->start + 1);
+ if (!tmio->ccr) {
@@ -224,11 +314,23 @@ Index: linux-2.6.23/drivers/usb/host/ohci-tmio.c
+ ohci = hcd_to_ohci(hcd);
+ ohci_hcd_init(ohci);
+
++ retval = device_create_file(dev,
++ &dev_attr_disabled_usb_port0.dev_attr);
++ retval |= device_create_file(dev,
++ &dev_attr_disabled_usb_port1.dev_attr);
++
++ if (retval)
++ goto err_create_file;
++
+ retval = usb_add_hcd(hcd, irq->start, IRQF_DISABLED);
+
+ if (retval == 0)
+ return retval;
+
++err_create_file:
++ device_remove_file(dev, &dev_attr_disabled_usb_port1.dev_attr);
++ device_remove_file(dev, &dev_attr_disabled_usb_port0.dev_attr);
++
+ tmio_stop_hc(dev);
+
+ dmabounce_unregister_dev(dev);
@@ -256,6 +358,8 @@ Index: linux-2.6.23/drivers/usb/host/ohci-tmio.c
+ struct tmio_hcd *tmio = hcd_to_tmio(hcd);
+
+ usb_remove_hcd(hcd);
++ device_remove_file(dev, &dev_attr_disabled_usb_port1.dev_attr);
++ device_remove_file(dev, &dev_attr_disabled_usb_port0.dev_attr);
+ tmio_stop_hc(dev);
+ dmabounce_unregister_dev(dev);
+ dma_release_declared_memory(dev);
@@ -343,13 +447,22 @@ Index: linux-2.6.23/drivers/usb/host/ohci-tmio.c
+static int ohci_hcd_tmio_drv_probe(struct device *dev)
+{
+ struct resource *sram = tmio_resource_mem(dev);
++ int retval;
+
+ dev->dma_mask = &dma_mask;
+ dev->coherent_dma_mask = DMA_32BIT_MASK;
+
++ /* FIXME: move dmabounce checkers to tc6393 core? */
+ dmabounce_register_checker(tmio_dmabounce_check, sram);
+
-+ return usb_hcd_tmio_probe(&ohci_tmio_hc_driver, dev);
++ retval = usb_hcd_tmio_probe(&ohci_tmio_hc_driver, dev);
++
++ if (retval == 0)
++ return retval;
++
++ dmabounce_remove_checker(tmio_dmabounce_check, sram);
++
++ return retval;
+}
+
+static int ohci_hcd_tmio_drv_remove(struct device *dev)
@@ -437,7 +550,7 @@ Index: linux-2.6.23/drivers/usb/host/Kconfig
Index: linux-2.6.23/drivers/usb/host/ohci-hcd.c
===================================================================
--- linux-2.6.23.orig/drivers/usb/host/ohci-hcd.c 2007-11-12 13:46:52.894560883 +0300
-+++ linux-2.6.23/drivers/usb/host/ohci-hcd.c 2007-11-13 01:03:53.950798640 +0300
++++ linux-2.6.23/drivers/usb/host/ohci-hcd.c 2007-11-14 16:44:32.788069355 +0300
@@ -915,6 +915,10 @@
#define PLATFORM_DRIVER usb_hcd_pnx4008_driver
#endif