[adm8668] add support for on-board EHCI controller
Signed-off-by: Florian Fainelli <florian@openwrt.org> git-svn-id: svn://svn.openwrt.org/openwrt/trunk@34561 3c298f89-4303-0410-b956-a3cf2f4a3e73master
parent
0e99db6d76
commit
171050a53c
|
@ -13,6 +13,7 @@
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/platform_data/tulip.h>
|
#include <linux/platform_data/tulip.h>
|
||||||
|
#include <linux/usb/ehci_pdriver.h>
|
||||||
#include <linux/mtd/physmap.h>
|
#include <linux/mtd/physmap.h>
|
||||||
#include <linux/mtd/partitions.h>
|
#include <linux/mtd/partitions.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
|
@ -130,10 +131,38 @@ static struct platform_device adm8668_nor_device = {
|
||||||
.dev.platform_data = &nor_flash_data,
|
.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[] = {
|
static struct platform_device *adm8668_devs[] = {
|
||||||
&adm8668_eth0_device,
|
&adm8668_eth0_device,
|
||||||
&adm8668_eth1_device,
|
&adm8668_eth1_device,
|
||||||
&adm8668_nor_device,
|
&adm8668_nor_device,
|
||||||
|
&adm8668_usb_device,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void adm8668_fetch_mac(int unit)
|
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));
|
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)
|
int __devinit adm8668_devs_register(void)
|
||||||
{
|
{
|
||||||
|
@ -173,6 +217,7 @@ int __devinit adm8668_devs_register(void)
|
||||||
|
|
||||||
adm8668_fetch_mac(0);
|
adm8668_fetch_mac(0);
|
||||||
adm8668_fetch_mac(1);
|
adm8668_fetch_mac(1);
|
||||||
|
adm8668_ehci_workaround();
|
||||||
|
|
||||||
return platform_add_devices(adm8668_devs, ARRAY_SIZE(adm8668_devs));
|
return platform_add_devices(adm8668_devs, ARRAY_SIZE(adm8668_devs));
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,6 +64,7 @@
|
||||||
#define ADM8668_CR0 0x00
|
#define ADM8668_CR0 0x00
|
||||||
#define ADM8668_CR1 0x04
|
#define ADM8668_CR1 0x04
|
||||||
#define ADM8668_CR3 0x0C
|
#define ADM8668_CR3 0x0C
|
||||||
|
#define ADM8668_CR66 0x108
|
||||||
|
|
||||||
/** For GPIO control **/
|
/** For GPIO control **/
|
||||||
#define GPIO_REG 0x5C /* on WLAN */
|
#define GPIO_REG 0x5C /* on WLAN */
|
||||||
|
|
Loading…
Reference in New Issue