diff options
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.c | 132 |
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); +} |