Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

USB ehci mxc: sanitize clock handling

Every i.MX ehci controller has a ahb and a ipg clock, so request
it on every SoC. Do not make a special case for the usb phy clock
of the i.MX51. Just request it but make it optional.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>

+24 -32
+24 -32
drivers/usb/host/ehci-mxc.c
··· 32 32 #define ULPI_VIEWPORT_OFFSET 0x170 33 33 34 34 struct ehci_mxc_priv { 35 - struct clk *usbclk, *ahbclk, *phy1clk; 35 + struct clk *usbclk, *ahbclk, *phyclk; 36 36 struct usb_hcd *hcd; 37 37 }; 38 38 ··· 166 166 } 167 167 168 168 /* enable clocks */ 169 - priv->usbclk = clk_get(dev, "usb"); 169 + priv->usbclk = clk_get(dev, "ipg"); 170 170 if (IS_ERR(priv->usbclk)) { 171 171 ret = PTR_ERR(priv->usbclk); 172 172 goto err_clk; 173 173 } 174 174 clk_prepare_enable(priv->usbclk); 175 175 176 - if (!cpu_is_mx35() && !cpu_is_mx25()) { 177 - priv->ahbclk = clk_get(dev, "usb_ahb"); 178 - if (IS_ERR(priv->ahbclk)) { 179 - ret = PTR_ERR(priv->ahbclk); 180 - goto err_clk_ahb; 181 - } 182 - clk_prepare_enable(priv->ahbclk); 176 + priv->ahbclk = clk_get(dev, "ahb"); 177 + if (IS_ERR(priv->ahbclk)) { 178 + ret = PTR_ERR(priv->ahbclk); 179 + goto err_clk_ahb; 183 180 } 181 + clk_prepare_enable(priv->ahbclk); 184 182 185 183 /* "dr" device has its own clock on i.MX51 */ 186 - if (cpu_is_mx51() && (pdev->id == 0)) { 187 - priv->phy1clk = clk_get(dev, "usb_phy1"); 188 - if (IS_ERR(priv->phy1clk)) { 189 - ret = PTR_ERR(priv->phy1clk); 190 - goto err_clk_phy; 191 - } 192 - clk_prepare_enable(priv->phy1clk); 193 - } 184 + priv->phyclk = clk_get(dev, "phy"); 185 + if (IS_ERR(priv->phyclk)) 186 + priv->phyclk = NULL; 187 + if (priv->phyclk) 188 + clk_prepare_enable(priv->phyclk); 194 189 195 190 196 191 /* call platform specific init function */ ··· 260 265 if (pdata && pdata->exit) 261 266 pdata->exit(pdev); 262 267 err_init: 263 - if (priv->phy1clk) { 264 - clk_disable_unprepare(priv->phy1clk); 265 - clk_put(priv->phy1clk); 268 + if (priv->phyclk) { 269 + clk_disable_unprepare(priv->phyclk); 270 + clk_put(priv->phyclk); 266 271 } 267 - err_clk_phy: 268 - if (priv->ahbclk) { 269 - clk_disable_unprepare(priv->ahbclk); 270 - clk_put(priv->ahbclk); 271 - } 272 + 273 + clk_disable_unprepare(priv->ahbclk); 274 + clk_put(priv->ahbclk); 272 275 err_clk_ahb: 273 276 clk_disable_unprepare(priv->usbclk); 274 277 clk_put(priv->usbclk); ··· 302 309 303 310 clk_disable_unprepare(priv->usbclk); 304 311 clk_put(priv->usbclk); 305 - if (priv->ahbclk) { 306 - clk_disable_unprepare(priv->ahbclk); 307 - clk_put(priv->ahbclk); 308 - } 309 - if (priv->phy1clk) { 310 - clk_disable_unprepare(priv->phy1clk); 311 - clk_put(priv->phy1clk); 312 + clk_disable_unprepare(priv->ahbclk); 313 + clk_put(priv->ahbclk); 314 + 315 + if (priv->phyclk) { 316 + clk_disable_unprepare(priv->phyclk); 317 + clk_put(priv->phyclk); 312 318 } 313 319 314 320 kfree(priv);