aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/misc/usb3503.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/misc/usb3503.c')
-rw-r--r--drivers/usb/misc/usb3503.c48
1 files changed, 18 insertions, 30 deletions
diff --git a/drivers/usb/misc/usb3503.c b/drivers/usb/misc/usb3503.c
index d5141aa79dd4..72f39a9751b5 100644
--- a/drivers/usb/misc/usb3503.c
+++ b/drivers/usb/misc/usb3503.c
@@ -172,7 +172,6 @@ static int usb3503_probe(struct usb3503 *hub)
172 hub->gpio_reset = pdata->gpio_reset; 172 hub->gpio_reset = pdata->gpio_reset;
173 hub->mode = pdata->initial_mode; 173 hub->mode = pdata->initial_mode;
174 } else if (np) { 174 } else if (np) {
175 struct clk *clk;
176 u32 rate = 0; 175 u32 rate = 0;
177 hub->port_off_mask = 0; 176 hub->port_off_mask = 0;
178 177
@@ -198,34 +197,29 @@ static int usb3503_probe(struct usb3503 *hub)
198 } 197 }
199 } 198 }
200 199
201 clk = devm_clk_get(dev, "refclk"); 200 hub->clk = devm_clk_get_optional(dev, "refclk");
202 if (IS_ERR(clk) && PTR_ERR(clk) != -ENOENT) { 201 if (IS_ERR(hub->clk)) {
203 dev_err(dev, "unable to request refclk (%ld)\n", 202 dev_err(dev, "unable to request refclk (%ld)\n",
204 PTR_ERR(clk)); 203 PTR_ERR(hub->clk));
205 return PTR_ERR(clk); 204 return PTR_ERR(hub->clk);
206 } 205 }
207 206
208 if (!IS_ERR(clk)) { 207 if (rate != 0) {
209 hub->clk = clk; 208 err = clk_set_rate(hub->clk, rate);
210
211 if (rate != 0) {
212 err = clk_set_rate(hub->clk, rate);
213 if (err) {
214 dev_err(dev,
215 "unable to set reference clock rate to %d\n",
216 (int) rate);
217 return err;
218 }
219 }
220
221 err = clk_prepare_enable(hub->clk);
222 if (err) { 209 if (err) {
223 dev_err(dev, 210 dev_err(dev,
224 "unable to enable reference clock\n"); 211 "unable to set reference clock rate to %d\n",
212 (int)rate);
225 return err; 213 return err;
226 } 214 }
227 } 215 }
228 216
217 err = clk_prepare_enable(hub->clk);
218 if (err) {
219 dev_err(dev, "unable to enable reference clock\n");
220 return err;
221 }
222
229 property = of_get_property(np, "disabled-ports", &len); 223 property = of_get_property(np, "disabled-ports", &len);
230 if (property && (len / sizeof(u32)) > 0) { 224 if (property && (len / sizeof(u32)) > 0) {
231 int i; 225 int i;
@@ -324,8 +318,7 @@ static int usb3503_i2c_remove(struct i2c_client *i2c)
324 struct usb3503 *hub; 318 struct usb3503 *hub;
325 319
326 hub = i2c_get_clientdata(i2c); 320 hub = i2c_get_clientdata(i2c);
327 if (hub->clk) 321 clk_disable_unprepare(hub->clk);
328 clk_disable_unprepare(hub->clk);
329 322
330 return 0; 323 return 0;
331} 324}
@@ -348,8 +341,7 @@ static int usb3503_platform_remove(struct platform_device *pdev)
348 struct usb3503 *hub; 341 struct usb3503 *hub;
349 342
350 hub = platform_get_drvdata(pdev); 343 hub = platform_get_drvdata(pdev);
351 if (hub->clk) 344 clk_disable_unprepare(hub->clk);
352 clk_disable_unprepare(hub->clk);
353 345
354 return 0; 346 return 0;
355} 347}
@@ -358,18 +350,14 @@ static int usb3503_platform_remove(struct platform_device *pdev)
358static int usb3503_suspend(struct usb3503 *hub) 350static int usb3503_suspend(struct usb3503 *hub)
359{ 351{
360 usb3503_switch_mode(hub, USB3503_MODE_STANDBY); 352 usb3503_switch_mode(hub, USB3503_MODE_STANDBY);
361 353 clk_disable_unprepare(hub->clk);
362 if (hub->clk)
363 clk_disable_unprepare(hub->clk);
364 354
365 return 0; 355 return 0;
366} 356}
367 357
368static int usb3503_resume(struct usb3503 *hub) 358static int usb3503_resume(struct usb3503 *hub)
369{ 359{
370 if (hub->clk) 360 clk_prepare_enable(hub->clk);
371 clk_prepare_enable(hub->clk);
372
373 usb3503_switch_mode(hub, hub->mode); 361 usb3503_switch_mode(hub, hub->mode);
374 362
375 return 0; 363 return 0;