From d56d959374735244c991af0a7484aeef06d7057e Mon Sep 17 00:00:00 2001 From: jogo Date: Sun, 19 Jan 2014 13:45:42 +0000 Subject: [PATCH] brcm63xx: prevent usb clock state inconsistency on BCM6318 Return the same clock for usbh and usbd on BCM6318 to prevent the clock getting disabled despite being supposed to be enabled, e.g. by the following sequence: clk_enable(usbh); <- usbh->usage = 1, enabled clk_enable(usbd); <- usbd->usage = 1, enabled (no effect) clk_disable(usbd); <- usbd->usage = 0, -> disabled! Signed-off-by: Jonas Gorski git-svn-id: svn://svn.openwrt.org/openwrt/trunk@39321 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- ...-MIPS-BCM63XX-USB-ENETSW-6318-clocks.patch | 64 ++++++++++--------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/target/linux/brcm63xx/patches-3.10/346-MIPS-BCM63XX-USB-ENETSW-6318-clocks.patch b/target/linux/brcm63xx/patches-3.10/346-MIPS-BCM63XX-USB-ENETSW-6318-clocks.patch index 8876f26cbe..2854006222 100644 --- a/target/linux/brcm63xx/patches-3.10/346-MIPS-BCM63XX-USB-ENETSW-6318-clocks.patch +++ b/target/linux/brcm63xx/patches-3.10/346-MIPS-BCM63XX-USB-ENETSW-6318-clocks.patch @@ -13,38 +13,44 @@ bcm_hwclock_set(CKCTL_6328_ROBOSW_EN, enable); else if (BCMCPU_IS_6362()) bcm_hwclock_set(CKCTL_6362_ROBOSW_EN, enable); -@@ -179,11 +183,22 @@ static struct clk clk_pcm = { - }; - - /* -+ * 6318 USB host & slave clock -+ */ -+static void bcm_6318_usb_clock_set(int enable) -+{ -+ bcm_hwclock_set(CKCTL_6318_USB_EN, enable); -+ bcm_ub_hwclock_set(UB_CKCTL_6318_USB_EN, enable); -+} -+ -+/* - * USB host clock +@@ -183,18 +187,22 @@ static struct clk clk_pcm = { */ static void usbh_set(struct clk *clk, int enable) { - if (BCMCPU_IS_6328()) -+ if (BCMCPU_IS_6318()) -+ bcm_6318_usb_clock_set(enable); -+ else if (BCMCPU_IS_6328()) ++ if (BCMCPU_IS_6318()) { ++ bcm_hwclock_set(CKCTL_6318_USB_EN, enable); ++ bcm_ub_hwclock_set(UB_CKCTL_6318_USB_EN, enable); ++ } else if (BCMCPU_IS_6328()) { bcm_hwclock_set(CKCTL_6328_USBH_EN, enable); - else if (BCMCPU_IS_6348()) +- else if (BCMCPU_IS_6348()) ++ } else if (BCMCPU_IS_6348()) { bcm_hwclock_set(CKCTL_6348_USBH_EN, enable); -@@ -209,7 +224,9 @@ static struct clk clk_usbh = { - */ - static void usbd_set(struct clk *clk, int enable) - { -- if (BCMCPU_IS_6328()) -+ if (BCMCPU_IS_6318()) -+ bcm_6318_usb_clock_set(enable); -+ else if (BCMCPU_IS_6328()) - bcm_hwclock_set(CKCTL_6328_USBD_EN, enable); - else if (BCMCPU_IS_6362()) - bcm_hwclock_set(CKCTL_6362_USBD_EN, enable); +- else if (BCMCPU_IS_6362()) ++ } else if (BCMCPU_IS_6362()) { + bcm_hwclock_set(CKCTL_6362_USBH_EN, enable); +- else if (BCMCPU_IS_6368()) ++ } else if (BCMCPU_IS_6368()) { + bcm_hwclock_set(CKCTL_6368_USBH_EN, enable); +- else if (BCMCPU_IS_63268()) ++ } else if (BCMCPU_IS_63268()) { + bcm_hwclock_set(CKCTL_63268_USBH_EN, enable); +- else ++ } else { + return; ++ } + + if (enable) + msleep(100); +@@ -393,9 +401,9 @@ struct clk *clk_get(struct device *dev, + return &clk_enetsw; + if (!strcmp(id, "ephy")) + return &clk_ephy; +- if (!strcmp(id, "usbh")) ++ if (!strcmp(id, "usbh") || (BCMCPU_IS_6318() && !strcmp(id, "usbd"))) + return &clk_usbh; +- if (!strcmp(id, "usbd")) ++ if (!strcmp(id, "usbd") && !BCMCPU_IS_6318()) + return &clk_usbd; + if (!strcmp(id, "spi")) + return &clk_spi; -- 2.30.2