r1665 - trunk/src/target/kernel/patches
laforge at sita.openmoko.org
laforge at sita.openmoko.org
Thu Apr 5 23:36:45 CEST 2007
Author: laforge
Date: 2007-04-05 23:36:44 +0200 (Thu, 05 Apr 2007)
New Revision: 1665
Added:
trunk/src/target/kernel/patches/s3c2410-usb-switch.patch
Log:
add (inactive) patch for usb host/device switching
Added: trunk/src/target/kernel/patches/s3c2410-usb-switch.patch
===================================================================
--- trunk/src/target/kernel/patches/s3c2410-usb-switch.patch 2007-04-05 21:07:47 UTC (rev 1664)
+++ trunk/src/target/kernel/patches/s3c2410-usb-switch.patch 2007-04-05 21:36:44 UTC (rev 1665)
@@ -0,0 +1,113 @@
+Support switching of USB mode between host and device port
+
+Index: linux-2.6.20.4/arch/arm/mach-s3c2410/usb-modeswitch.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.20.4/arch/arm/mach-s3c2410/usb-modeswitch.c 2007-04-01 12:36:49.000000000 +0200
+@@ -0,0 +1,33 @@
++/*
++ * linux/arch/arm/mach-s3c2410/usb-modeswitch.c
++ *
++ * S3C2410 USB Host/Device switch
++ *
++ * Copyright (C) 2007 by OpenMoko, Inc.
++ * Author: Harald Welte <laforge at openmoko.org>
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ *
++ */
++
++void s3c2410_usb_enable_host(int on)
++{
++ s3c2410_modify_misccr(S3C2410_MISCCR_HSBHOST,
++ on ? S3C2410_MISCCR_USBHOST : 0);
++}
++
++
+Index: linux-2.6.20.4/drivers/usb/host/ohci-s3c2410.c
+===================================================================
+--- linux-2.6.20.4.orig/drivers/usb/host/ohci-s3c2410.c 2007-04-01 12:33:01.000000000 +0200
++++ linux-2.6.20.4/drivers/usb/host/ohci-s3c2410.c 2007-04-01 12:36:49.000000000 +0200
+@@ -24,6 +24,7 @@
+
+ #include <asm/hardware.h>
+ #include <asm/arch/usb-control.h>
++#include <asm/arch/regs-gpio.h>
+
+ #define valid_port(idx) ((idx) == 1 || (idx) == 2)
+
+@@ -308,6 +309,36 @@
+ local_irq_restore(flags);
+ }
+
++/* switching of USB pads */
++static ssize_t show_usb_mode(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ if (__raw_readl(S3C24XX_MISCCR) & S3C2410_MISCCR_USBHOST)
++ return sprintf(buf, "host");
++
++ return sprintf(buf, "device");
++}
++
++static ssize_t set_usb_mode(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ if (!strcmp(buf, "host")) {
++ s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST,
++ S3C2410_MISCCR_USBHOST);
++ /* FIXME:
++ * - call machine-specific disable-pullup function i
++ * - enable +Vbus (if hardware supports it)
++ */
++ } else if (!strcmp(buf, "device")) {
++ s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST, 0);
++ } else
++ return -EINVAL;
++
++ return count;
++}
++
++static DEVICE_ATTR(usb_mode, S_IRUGO | S_IWUSR, show_usb_mode, set_usb_mode);
++
+ /* may be called without controller electrically present */
+ /* may be called with controller, bus, and devices active */
+
+@@ -325,6 +356,7 @@
+ static void
+ usb_hcd_s3c2410_remove (struct usb_hcd *hcd, struct platform_device *dev)
+ {
++ device_remove_file(&dev->dev, &dev_attr_usb_mode);
+ usb_remove_hcd(hcd);
+ s3c2410_stop_hc(dev);
+ iounmap(hcd->regs);
+@@ -392,8 +424,15 @@
+ if (retval != 0)
+ goto err_ioremap;
+
++ retval = device_create_file(&dev->dev, &dev_attr_usb_mode);
++ if (retval != 0)
++ goto err_hcd;
++
+ return 0;
+
++ err_hcd:
++ usb_remove_hcd(hcd);
++
+ err_ioremap:
+ s3c2410_stop_hc(dev);
+ iounmap(hcd->regs);
More information about the commitlog
mailing list