aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ubicom32/files/arch/ubicom32/mach-common/usb.c
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/ubicom32/files/arch/ubicom32/mach-common/usb.c')
-rw-r--r--target/linux/ubicom32/files/arch/ubicom32/mach-common/usb.c132
1 files changed, 132 insertions, 0 deletions
diff --git a/target/linux/ubicom32/files/arch/ubicom32/mach-common/usb.c b/target/linux/ubicom32/files/arch/ubicom32/mach-common/usb.c
new file mode 100644
index 000000000..e13f64054
--- /dev/null
+++ b/target/linux/ubicom32/files/arch/ubicom32/mach-common/usb.c
@@ -0,0 +1,132 @@
+/*
+ * arch/ubicom32/mach-common/ip5k_usb.c
+ * Ubicom32 architecture usb support.
+ *
+ * (C) Copyright 2009, Ubicom, Inc.
+ * Copyright (C) 2007 MontaVista Software, Inc. <source@mvista.com>
+ * Author: Kevin Hilman
+ *
+ * This file is part of the Ubicom32 Linux Kernel Port.
+ *
+ * The Ubicom32 Linux Kernel Port 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.
+ *
+ * The Ubicom32 Linux Kernel Port 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 the Ubicom32 Linux Kernel Port. If not,
+ * see <http://www.gnu.org/licenses/>.
+ *
+ * Ubicom32 implementation derived from (with many thanks):
+ * arch/m68knommu
+ * arch/blackfin
+ * arch/parisc
+ */
+
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <linux/delay.h>
+#include <linux/platform_device.h>
+#include <linux/dma-mapping.h>
+#include <linux/usb/musb.h>
+#include <asm/devtree.h>
+#include <asm/ip5000.h>
+#include "usb_tio.h"
+
+struct usbtionode *unode = NULL;
+
+static struct resource usb_resources[] = {
+ [0] = {
+ .start = RJ + 0x800,
+ .end = RJ + 0x1000,
+ .flags = IORESOURCE_MEM,
+ },
+ [1] = { /* general IRQ */
+ .start = 1, /* this is a dummy value, the real irq number is passed from kernel_setup_param */
+ .flags = IORESOURCE_IRQ,
+ },
+};
+
+
+static struct musb_hdrc_eps_bits musb_eps[] = {
+ { "ep1_tx", 4, },
+ { "ep1_rx", 4, },
+ { "ep2_tx", 10, },
+ { "ep2_rx", 10, },
+ { "ep3_tx", 9, },
+ { "ep3_rx", 9, },
+ { "ep4_tx", 9, },
+ { "ep4_rx", 9, },
+ { "ep5_tx", 6, },
+ { "ep5_rx", 6, },
+};
+
+static struct musb_hdrc_config musb_config = {
+ .multipoint = true,
+ .dyn_fifo = false,
+ .soft_con = true,
+ .dma = false,
+
+ .num_eps = 6,
+ .dma_channels = 0,
+ .ram_bits = 0,
+ .eps_bits = musb_eps,
+};
+
+static struct musb_hdrc_platform_data usb_data = {
+#ifdef CONFIG_USB_MUSB_OTG
+ .mode = MUSB_OTG,
+#else
+#ifdef CONFIG_USB_MUSB_HDRC_HCD
+ .mode = MUSB_HOST,
+#else
+#ifdef CONFIG_USB_GADGET_MUSB_HDRC
+ .mode = MUSB_PERIPHERAL,
+#endif
+#endif
+#endif
+ .clock = NULL,
+ .set_clock = NULL,
+ .config = &musb_config,
+};
+
+static struct platform_device musb_device = {
+ .name = "musb_hdrc",
+ .id = 0,
+ .dev = {
+ .platform_data = &usb_data,
+ .dma_mask = NULL,
+ .coherent_dma_mask = 0,
+ },
+ .resource = usb_resources,
+ .num_resources = ARRAY_SIZE(usb_resources),
+};
+
+struct usbtio_node *usb_node = NULL;
+void ubi32_usb_init(void)
+{
+ /*
+ * See if the usbtio is in the device tree.
+ */
+ usb_node = (struct usbtio_node *)devtree_find_node("usbtio");
+ if (!usb_node) {
+ printk(KERN_WARNING "usb init failed\n");
+ return;
+ }
+
+ usb_resources[1].start = usb_node->dn.recvirq;
+ if (platform_device_register(&musb_device) < 0) {
+ printk(KERN_ERR "Unable to register HS-USB (MUSB) device\n");
+ return;
+ }
+}
+
+void ubi32_usb_int_clr(void)
+{
+ UBICOM32_IO_PORT(RJ)->int_clr = (1 << 3);
+}