1
0
mirror of git://projects.qi-hardware.com/openwrt-xburst.git synced 2025-01-28 10:21:06 +02:00
kaloz 1a29ef8e97 [ubicom32]: move new files out from platform support patch
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19815 3c298f89-4303-0410-b956-a3cf2f4a3e73
2010-02-22 13:54:47 +00:00

133 lines
3.2 KiB
C

/*
* 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);
}