|
|
|
@ -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)); |
|
|
|
|
} |
|
|
|
|