add support for on-board EHCI controller
Signed-off-by: Florian Fainelli <florian@openwrt.org> SVN-Revision: 34561
This commit is contained in:
parent
5679d5d1e1
commit
a5aed4ec3a
2 changed files with 46 additions and 0 deletions
|
@ -13,6 +13,7 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/platform_data/tulip.h>
|
||||
#include <linux/usb/ehci_pdriver.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/pci.h>
|
||||
|
@ -130,10 +131,38 @@ static struct platform_device adm8668_nor_device = {
|
|||
.dev.platform_data = &nor_flash_data,
|
||||
};
|
||||
|
||||
static struct resource usb_resources[] = {
|
||||
{
|
||||
.start = ADM8668_USB_BASE,
|
||||
.end = ADM8668_USB_BASE + 0x1FFFFF,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.start = INT_LVL_USB,
|
||||
.end = INT_LVL_USB,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct usb_ehci_pdata usb_pdata = {
|
||||
.caps_offset = 0x100,
|
||||
.has_tt = 1,
|
||||
.port_power_off = 1,
|
||||
};
|
||||
|
||||
static struct platform_device adm8668_usb_device = {
|
||||
.name = "ehci-platform",
|
||||
.id = -1,
|
||||
.resource = usb_resources,
|
||||
.num_resources = ARRAY_SIZE(usb_resources),
|
||||
.dev.platform_data = &usb_pdata,
|
||||
};
|
||||
|
||||
static struct platform_device *adm8668_devs[] = {
|
||||
&adm8668_eth0_device,
|
||||
&adm8668_eth1_device,
|
||||
&adm8668_nor_device,
|
||||
&adm8668_usb_device,
|
||||
};
|
||||
|
||||
static void adm8668_fetch_mac(int unit)
|
||||
|
@ -162,6 +191,21 @@ static void adm8668_fetch_mac(int unit)
|
|||
memcpy(pdata->mac, mac, sizeof(pdata->mac));
|
||||
}
|
||||
|
||||
static void adm8668_ehci_workaround(void)
|
||||
{
|
||||
u32 chipid;
|
||||
|
||||
chipid = ADM8668_CONFIG_REG(ADM8668_CR0);
|
||||
ADM8668_CONFIG_REG(ADM8668_CR66) = 0x0C1600D9;
|
||||
|
||||
if (chipid == 0x86880001)
|
||||
return;
|
||||
|
||||
ADM8668_CONFIG_REG(ADM8668_CR66) &= ~(3 << 20);
|
||||
ADM8668_CONFIG_REG(ADM8668_CR66) |= (1 << 20);
|
||||
pr_info("ADM8668: applied USB workaround\n");
|
||||
}
|
||||
|
||||
|
||||
int __devinit adm8668_devs_register(void)
|
||||
{
|
||||
|
@ -173,6 +217,7 @@ int __devinit adm8668_devs_register(void)
|
|||
|
||||
adm8668_fetch_mac(0);
|
||||
adm8668_fetch_mac(1);
|
||||
adm8668_ehci_workaround();
|
||||
|
||||
return platform_add_devices(adm8668_devs, ARRAY_SIZE(adm8668_devs));
|
||||
}
|
||||
|
|
|
@ -64,6 +64,7 @@
|
|||
#define ADM8668_CR0 0x00
|
||||
#define ADM8668_CR1 0x04
|
||||
#define ADM8668_CR3 0x0C
|
||||
#define ADM8668_CR66 0x108
|
||||
|
||||
/** For GPIO control **/
|
||||
#define GPIO_REG 0x5C /* on WLAN */
|
||||
|
|
Loading…
Reference in a new issue