mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2025-04-21 12:27:27 +03:00
[brcm63xx] fix SPI register switch and prepare for UDC, thanks to Henk Vergonet (#4783)
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@14914 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
@@ -4,6 +4,7 @@ menu "CPU support"
|
||||
config BCM63XX_CPU_6338
|
||||
bool "support 6338 CPU"
|
||||
select USB_ARCH_HAS_OHCI
|
||||
select USB_ARCH_HAS_UDC
|
||||
select USB_OHCI_BIG_ENDIAN_DESC
|
||||
select USB_OHCI_BIG_ENDIAN_MMIO
|
||||
|
||||
@@ -11,6 +12,7 @@ config BCM63XX_CPU_6348
|
||||
bool "support 6348 CPU"
|
||||
select HW_HAS_PCI
|
||||
select USB_ARCH_HAS_OHCI
|
||||
select USB_ARCH_HAS_UDC
|
||||
select USB_OHCI_BIG_ENDIAN_DESC
|
||||
select USB_OHCI_BIG_ENDIAN_MMIO
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ obj-y += dev-uart.o
|
||||
obj-y += dev-pcmcia.o
|
||||
obj-y += dev-usb-ohci.o
|
||||
obj-y += dev-usb-ehci.o
|
||||
obj-y += dev-usb-udc.o
|
||||
obj-y += dev-enet.o
|
||||
obj-y += dev-wdt.o
|
||||
obj-y += dev-spi.o
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include <bcm63xx_dev_pcmcia.h>
|
||||
#include <bcm63xx_dev_usb_ohci.h>
|
||||
#include <bcm63xx_dev_usb_ehci.h>
|
||||
#include <bcm63xx_dev_usb_udc.h>
|
||||
#include <bcm63xx_dev_spi.h>
|
||||
#include <board_bcm963xx.h>
|
||||
|
||||
@@ -163,27 +164,23 @@ static struct board_info __initdata board_FAST2404 = {
|
||||
};
|
||||
|
||||
static struct board_info __initdata board_DV201AMR = {
|
||||
.name = "DV201AMR",
|
||||
.expected_cpu_id = 0x6348,
|
||||
.name = "DV201AMR",
|
||||
.expected_cpu_id = 0x6348,
|
||||
|
||||
.has_enet0 = 1,
|
||||
.has_enet1 = 1,
|
||||
.has_pci = 1,
|
||||
.has_pci = 1,
|
||||
.has_ohci0 = 1,
|
||||
.has_udc0 = 1,
|
||||
|
||||
.has_enet0 = 1,
|
||||
.has_enet1 = 1,
|
||||
.enet0 = {
|
||||
.has_phy = 1,
|
||||
.use_internal_phy = 1,
|
||||
},
|
||||
|
||||
.enet1 = {
|
||||
.force_speed_100 = 1,
|
||||
.force_duplex_full = 1,
|
||||
},
|
||||
|
||||
|
||||
.has_ohci0 = 1,
|
||||
.has_pccard = 1,
|
||||
.has_ehci0 = 1,
|
||||
.enet1 = {
|
||||
.force_speed_100 = 1,
|
||||
.force_duplex_full = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct board_info __initdata board_96348gw_a = {
|
||||
@@ -525,6 +522,8 @@ int __init board_register_devices(void)
|
||||
if (board.has_ehci0)
|
||||
bcm63xx_ehci_register();
|
||||
|
||||
if (board.has_udc0)
|
||||
bcm63xx_udc_register();
|
||||
/* Generate MAC address for WLAN and
|
||||
* register our SPROM */
|
||||
if (!board_get_mac_address(bcm63xx_sprom.il0mac)) {
|
||||
|
||||
@@ -136,6 +136,26 @@ static struct clk clk_usbh = {
|
||||
.set = usbh_set,
|
||||
};
|
||||
|
||||
/*
|
||||
* USB slave clock
|
||||
*/
|
||||
static void usbs_set(struct clk *clk, int enable)
|
||||
{
|
||||
u32 mask;
|
||||
|
||||
switch(bcm63xx_get_cpu_id()) {
|
||||
case BCM6338_CPU_ID: mask = CKCTL_6338_USBS_EN; break;
|
||||
case BCM6348_CPU_ID: mask = CKCTL_6348_USBS_EN; break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
bcm_hwclock_set(mask, enable);
|
||||
}
|
||||
|
||||
static struct clk clk_usbs = {
|
||||
.set = usbs_set,
|
||||
};
|
||||
|
||||
/*
|
||||
* SPI clock
|
||||
*/
|
||||
@@ -202,6 +222,8 @@ struct clk *clk_get(struct device *dev, const char *id)
|
||||
return &clk_ephy;
|
||||
if (!strcmp(id, "usbh"))
|
||||
return &clk_usbh;
|
||||
if (!strcmp(id, "usbs"))
|
||||
return &clk_usbs;
|
||||
if (!strcmp(id, "spi"))
|
||||
return &clk_spi;
|
||||
if (!strcmp(id, "periph"))
|
||||
|
||||
@@ -37,6 +37,7 @@ static const unsigned long bcm96338_regs_base[] = {
|
||||
[RSET_PERF] = BCM_6338_PERF_BASE,
|
||||
[RSET_TIMER] = BCM_6338_TIMER_BASE,
|
||||
[RSET_WDT] = BCM_6338_WDT_BASE,
|
||||
[RSET_UDC0] = BCM_6338_UDC0_BASE,
|
||||
[RSET_UART0] = BCM_6338_UART0_BASE,
|
||||
[RSET_GPIO] = BCM_6338_GPIO_BASE,
|
||||
[RSET_SPI] = BCM_6338_SPI_BASE,
|
||||
@@ -48,6 +49,7 @@ static const int bcm96338_irqs[] = {
|
||||
[IRQ_SPI] = BCM_6338_SPI_IRQ,
|
||||
[IRQ_UART0] = BCM_6338_UART0_IRQ,
|
||||
[IRQ_DSL] = BCM_6338_DSL_IRQ,
|
||||
[IRQ_UDC0] = BCM_6338_UDC0_IRQ,
|
||||
[IRQ_ENET0] = BCM_6338_ENET0_IRQ,
|
||||
[IRQ_ENET_PHY] = BCM_6338_ENET_PHY_IRQ,
|
||||
[IRQ_ENET0_RXDMA] = BCM_6338_ENET0_RXDMA_IRQ,
|
||||
@@ -83,6 +85,7 @@ static const unsigned long bcm96348_regs_base[] = {
|
||||
[RSET_OHCI0] = BCM_6348_OHCI0_BASE,
|
||||
[RSET_OHCI_PRIV] = BCM_6348_OHCI_PRIV_BASE,
|
||||
[RSET_USBH_PRIV] = BCM_6348_USBH_PRIV_BASE,
|
||||
[RSET_UDC0] = BCM_6348_UDC0_BASE,
|
||||
[RSET_MPI] = BCM_6348_MPI_BASE,
|
||||
[RSET_PCMCIA] = BCM_6348_PCMCIA_BASE,
|
||||
[RSET_SDRAM] = BCM_6348_SDRAM_BASE,
|
||||
@@ -99,6 +102,7 @@ static const int bcm96348_irqs[] = {
|
||||
[IRQ_SPI] = BCM_6348_SPI_IRQ,
|
||||
[IRQ_UART0] = BCM_6348_UART0_IRQ,
|
||||
[IRQ_DSL] = BCM_6348_DSL_IRQ,
|
||||
[IRQ_UDC0] = BCM_6348_UDC0_IRQ,
|
||||
[IRQ_ENET0] = BCM_6348_ENET0_IRQ,
|
||||
[IRQ_ENET1] = BCM_6348_ENET1_IRQ,
|
||||
[IRQ_ENET_PHY] = BCM_6348_ENET_PHY_IRQ,
|
||||
|
||||
58
target/linux/brcm63xx/files/arch/mips/bcm63xx/dev-usb-udc.c
Normal file
58
target/linux/brcm63xx/files/arch/mips/bcm63xx/dev-usb-udc.c
Normal file
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Copyright (C) 2009 Henk Vergonet <Henk.Vergonet@gmail.com>
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <bcm63xx_cpu.h>
|
||||
|
||||
static struct resource udc_resources[] = {
|
||||
{
|
||||
.start = -1, /* filled at runtime */
|
||||
.end = -1, /* filled at runtime */
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.start = -1, /* filled at runtime */
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static u64 udc_dmamask = ~(u32)0;
|
||||
|
||||
static struct platform_device bcm63xx_udc_device = {
|
||||
.name = "bcm63xx-udc",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(udc_resources),
|
||||
.resource = udc_resources,
|
||||
.dev = {
|
||||
.dma_mask = &udc_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
},
|
||||
};
|
||||
|
||||
int __init bcm63xx_udc_register(void)
|
||||
{
|
||||
if (!BCMCPU_IS_6338() && !BCMCPU_IS_6348())
|
||||
return 0;
|
||||
|
||||
udc_resources[0].start = bcm63xx_regset_address(RSET_UDC0);
|
||||
udc_resources[0].end = udc_resources[0].start;
|
||||
udc_resources[0].end += RSET_UDC_SIZE - 1;
|
||||
udc_resources[1].start = bcm63xx_get_irq_number(IRQ_UDC0);
|
||||
return platform_device_register(&bcm63xx_udc_device);
|
||||
}
|
||||
Reference in New Issue
Block a user