diff options
Diffstat (limited to 'target/linux/ramips/files/arch/mips/ralink/rt305x')
-rw-r--r-- | target/linux/ramips/files/arch/mips/ralink/rt305x/devices.c | 95 |
1 files changed, 49 insertions, 46 deletions
diff --git a/target/linux/ramips/files/arch/mips/ralink/rt305x/devices.c b/target/linux/ramips/files/arch/mips/ralink/rt305x/devices.c index 56eae8a9dc..a8e0604e34 100644 --- a/target/linux/ramips/files/arch/mips/ralink/rt305x/devices.c +++ b/target/linux/ramips/files/arch/mips/ralink/rt305x/devices.c @@ -18,6 +18,8 @@ #include <linux/rt2x00_platform.h> #include <linux/delay.h> #include <linux/dma-mapping.h> +#include <linux/usb/ehci_pdriver.h> +#include <linux/usb/ohci_pdriver.h> #include <asm/addrspace.h> @@ -27,8 +29,6 @@ #include <ramips_eth_platform.h> #include <rt305x_esw_platform.h> -#include <rt3883_ehci_platform.h> -#include <rt3883_ohci_platform.h> static struct resource rt305x_flash0_resources[] = { { @@ -297,60 +297,63 @@ static struct platform_device rt305x_dwc_otg_device = { } }; -static atomic_t rt3352_usb_use_count = ATOMIC_INIT(0); +static atomic_t rt3352_usb_pwr_ref = ATOMIC_INIT(0); -static void rt3352_usb_host_start(void) +static int rt3352_usb_power_on(struct platform_device *pdev) { - u32 t; - if (atomic_inc_return(&rt3352_usb_use_count) != 1) - return; + if (atomic_inc_return(&rt3352_usb_pwr_ref) == 1) { + u32 t; - t = rt305x_sysc_rr(RT3352_SYSC_REG_USB_PS); + t = rt305x_sysc_rr(RT3352_SYSC_REG_USB_PS); - /* enable clock for port0's and port1's phys */ - t = rt305x_sysc_rr(RT3352_SYSC_REG_CLKCFG1); - t = t | RT3352_CLKCFG1_UPHY0_CLK_EN | RT3352_CLKCFG1_UPHY1_CLK_EN; - rt305x_sysc_wr(t, RT3352_SYSC_REG_CLKCFG1); - mdelay(500); + /* enable clock for port0's and port1's phys */ + t = rt305x_sysc_rr(RT3352_SYSC_REG_CLKCFG1); + t |= RT3352_CLKCFG1_UPHY0_CLK_EN | RT3352_CLKCFG1_UPHY1_CLK_EN; + rt305x_sysc_wr(t, RT3352_SYSC_REG_CLKCFG1); + mdelay(500); - /* pull USBHOST and USBDEV out from reset */ - t = rt305x_sysc_rr(RT3352_SYSC_REG_RSTCTRL); - t &= ~(RT3352_RSTCTRL_UHST | RT3352_RSTCTRL_UDEV); - rt305x_sysc_wr(t, RT3352_SYSC_REG_RSTCTRL); - mdelay(500); + /* pull USBHOST and USBDEV out from reset */ + t = rt305x_sysc_rr(RT3352_SYSC_REG_RSTCTRL); + t &= ~(RT3352_RSTCTRL_UHST | RT3352_RSTCTRL_UDEV); + rt305x_sysc_wr(t, RT3352_SYSC_REG_RSTCTRL); + mdelay(500); - /* enable host mode */ - t = rt305x_sysc_rr(RT3352_SYSC_REG_SYSCFG1); - t |= RT3352_SYSCFG1_USB0_HOST_MODE; - rt305x_sysc_wr(t, RT3352_SYSC_REG_SYSCFG1); + /* enable host mode */ + t = rt305x_sysc_rr(RT3352_SYSC_REG_SYSCFG1); + t |= RT3352_SYSCFG1_USB0_HOST_MODE; + rt305x_sysc_wr(t, RT3352_SYSC_REG_SYSCFG1); + + t = rt305x_sysc_rr(RT3352_SYSC_REG_USB_PS); + } - t = rt305x_sysc_rr(RT3352_SYSC_REG_USB_PS); + return 0; } -static void rt3352_usb_host_stop(void) +static void rt3352_usb_power_off(struct platform_device *pdev) { - u32 t; - if (atomic_dec_return(&rt3352_usb_use_count) != 0) - return; + if (atomic_dec_return(&rt3352_usb_pwr_ref) == 0) { + u32 t; - /* put USBHOST and USBDEV into reset */ - t = rt305x_sysc_rr(RT3352_SYSC_REG_RSTCTRL); - t |= RT3352_RSTCTRL_UHST | RT3352_RSTCTRL_UDEV; - rt305x_sysc_wr(t, RT3352_SYSC_REG_RSTCTRL); - udelay(10000); - - /* disable clock for port0's and port1's phys*/ - t = rt305x_sysc_rr(RT3352_SYSC_REG_CLKCFG1); - t &= ~(RT3352_CLKCFG1_UPHY0_CLK_EN | RT3352_CLKCFG1_UPHY1_CLK_EN); - rt305x_sysc_wr(t, RT3352_SYSC_REG_CLKCFG1); - udelay(10000); + /* put USBHOST and USBDEV into reset */ + t = rt305x_sysc_rr(RT3352_SYSC_REG_RSTCTRL); + t |= RT3352_RSTCTRL_UHST | RT3352_RSTCTRL_UDEV; + rt305x_sysc_wr(t, RT3352_SYSC_REG_RSTCTRL); + udelay(10000); + + /* disable clock for port0's and port1's phys*/ + t = rt305x_sysc_rr(RT3352_SYSC_REG_CLKCFG1); + t &= ~(RT3352_CLKCFG1_UPHY0_CLK_EN | RT3352_CLKCFG1_UPHY1_CLK_EN); + rt305x_sysc_wr(t, RT3352_SYSC_REG_CLKCFG1); + udelay(10000); + } } -static struct rt3883_ehci_platform_data rt3352_ehci_data = { - .start_hw = rt3352_usb_host_start, - .stop_hw = rt3352_usb_host_stop, +static struct usb_ehci_pdata rt3352_ehci_data = { + .port_power_off = 1, + .power_on = rt3352_usb_power_on, + .power_off = rt3352_usb_power_off, }; static struct resource rt3352_ehci_resources[] = { @@ -367,7 +370,7 @@ static struct resource rt3352_ehci_resources[] = { static u64 rt3352_ehci_dmamask = DMA_BIT_MASK(32); static struct platform_device rt3352_ehci_device = { - .name = "rt3883-ehci", + .name = "ehci-platform", .id = -1, .resource = rt3352_ehci_resources, .num_resources = ARRAY_SIZE(rt3352_ehci_resources), @@ -390,14 +393,14 @@ static struct resource rt3352_ohci_resources[] = { }, }; -static struct rt3883_ohci_platform_data rt3352_ohci_data = { - .start_hw = rt3352_usb_host_start, - .stop_hw = rt3352_usb_host_stop, +static struct usb_ohci_pdata rt3352_ohci_data = { + .power_on = rt3352_usb_power_on, + .power_off = rt3352_usb_power_off, }; static u64 rt3352_ohci_dmamask = DMA_BIT_MASK(32); static struct platform_device rt3352_ohci_device = { - .name = "rt3883-ohci", + .name = "ohci-platform", .id = -1, .resource = rt3352_ohci_resources, .num_resources = ARRAY_SIZE(rt3352_ohci_resources), |