Commit 089ffd0aedb76f1408c651090b3bbfeb1449d582

Authored by Jagan Teki
1 parent e236ff0a51

phy: sun4i-usb: Use CLK and RESET support

Now clock and reset drivers are available for respective
SoC's so use clk and reset ops on phy driver.

Signed-off-by: Jagan Teki <jagan@amarulasolutions.com>
Acked-by: Maxime Ripard <maxime.ripard@bootlin.com>
Reviewed-by: Marek Vasut <marex@denx.de>

Showing 1 changed file with 57 additions and 20 deletions Side-by-side Diff

drivers/phy/allwinner/phy-sun4i-usb.c
... ... @@ -11,10 +11,12 @@
11 11 */
12 12  
13 13 #include <common.h>
  14 +#include <clk.h>
14 15 #include <dm.h>
15 16 #include <dm/device.h>
16 17 #include <generic-phy.h>
17 18 #include <phy-sun4i-usb.h>
  19 +#include <reset.h>
18 20 #include <asm/gpio.h>
19 21 #include <asm/io.h>
20 22 #include <asm/arch/clock.h>
... ... @@ -80,6 +82,7 @@
80 82 enum sun4i_usb_phy_type type;
81 83 u32 disc_thresh;
82 84 u8 phyctl_offset;
  85 + bool dedicated_clocks;
83 86 bool enable_pmu_unk1;
84 87 bool phy0_dual_route;
85 88 };
86 89  
87 90  
88 91  
... ... @@ -88,30 +91,21 @@
88 91 const char *gpio_vbus;
89 92 const char *gpio_vbus_det;
90 93 const char *gpio_id_det;
91   - int rst_mask;
92 94 } phy_info[] = {
93 95 {
94 96 .gpio_vbus = CONFIG_USB0_VBUS_PIN,
95 97 .gpio_vbus_det = CONFIG_USB0_VBUS_DET,
96 98 .gpio_id_det = CONFIG_USB0_ID_DET,
97   - .rst_mask = (CCM_USB_CTRL_PHY0_RST | CCM_USB_CTRL_PHY0_CLK),
98 99 },
99 100 {
100 101 .gpio_vbus = CONFIG_USB1_VBUS_PIN,
101 102 .gpio_vbus_det = NULL,
102 103 .gpio_id_det = NULL,
103   - .rst_mask = (CCM_USB_CTRL_PHY1_RST | CCM_USB_CTRL_PHY1_CLK),
104 104 },
105 105 {
106 106 .gpio_vbus = CONFIG_USB2_VBUS_PIN,
107 107 .gpio_vbus_det = NULL,
108 108 .gpio_id_det = NULL,
109   -#ifdef CONFIG_MACH_SUN8I_A83T
110   - .rst_mask = (CCM_USB_CTRL_HSIC_RST | CCM_USB_CTRL_HSIC_CLK |
111   - CCM_USB_CTRL_12M_CLK),
112   -#else
113   - .rst_mask = (CCM_USB_CTRL_PHY2_RST | CCM_USB_CTRL_PHY2_CLK),
114   -#endif
115 109 },
116 110 {
117 111 .gpio_vbus = CONFIG_USB3_VBUS_PIN,
118 112  
... ... @@ -126,13 +120,13 @@
126 120 int gpio_vbus;
127 121 int gpio_vbus_det;
128 122 int gpio_id_det;
129   - int rst_mask;
  123 + struct clk clocks;
  124 + struct reset_ctl resets;
130 125 int id;
131 126 };
132 127  
133 128 struct sun4i_usb_phy_data {
134 129 void __iomem *base;
135   - struct sunxi_ccm_reg *ccm;
136 130 const struct sun4i_usb_phy_cfg *cfg;
137 131 struct sun4i_usb_phy_plat *usb_phy;
138 132 };
139 133  
140 134  
... ... @@ -266,9 +260,20 @@
266 260 struct sun4i_usb_phy_data *data = dev_get_priv(phy->dev);
267 261 struct sun4i_usb_phy_plat *usb_phy = &data->usb_phy[phy->id];
268 262 u32 val;
  263 + int ret;
269 264  
270   - setbits_le32(&data->ccm->usb_clk_cfg, usb_phy->rst_mask);
  265 + ret = clk_enable(&usb_phy->clocks);
  266 + if (ret) {
  267 + dev_err(dev, "failed to enable usb_%ldphy clock\n", phy->id);
  268 + return ret;
  269 + }
271 270  
  271 + ret = reset_deassert(&usb_phy->resets);
  272 + if (ret) {
  273 + dev_err(dev, "failed to deassert usb_%ldreset reset\n", phy->id);
  274 + return ret;
  275 + }
  276 +
272 277 if (data->cfg->type == sun8i_a83t_phy) {
273 278 if (phy->id == 0) {
274 279 val = readl(data->base + data->cfg->phyctl_offset);
... ... @@ -308,6 +313,7 @@
308 313 {
309 314 struct sun4i_usb_phy_data *data = dev_get_priv(phy->dev);
310 315 struct sun4i_usb_phy_plat *usb_phy = &data->usb_phy[phy->id];
  316 + int ret;
311 317  
312 318 if (phy->id == 0) {
313 319 if (data->cfg->type == sun8i_a83t_phy) {
314 320  
... ... @@ -320,8 +326,18 @@
320 326  
321 327 sun4i_usb_phy_passby(phy, false);
322 328  
323   - clrbits_le32(&data->ccm->usb_clk_cfg, usb_phy->rst_mask);
  329 + ret = clk_disable(&usb_phy->clocks);
  330 + if (ret) {
  331 + dev_err(dev, "failed to disable usb_%ldphy clock\n", phy->id);
  332 + return ret;
  333 + }
324 334  
  335 + ret = reset_assert(&usb_phy->resets);
  336 + if (ret) {
  337 + dev_err(dev, "failed to assert usb_%ldreset reset\n", phy->id);
  338 + return ret;
  339 + }
  340 +
325 341 return 0;
326 342 }
327 343  
... ... @@ -407,10 +423,6 @@
407 423 if (IS_ERR(data->base))
408 424 return PTR_ERR(data->base);
409 425  
410   - data->ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
411   - if (IS_ERR(data->ccm))
412   - return PTR_ERR(data->ccm);
413   -
414 426 data->usb_phy = plat;
415 427 for (i = 0; i < data->cfg->num_phys; i++) {
416 428 struct sun4i_usb_phy_plat *phy = &plat[i];
... ... @@ -448,6 +460,24 @@
448 460 sunxi_gpio_set_pull(phy->gpio_id_det, SUNXI_GPIO_PULL_UP);
449 461 }
450 462  
  463 + if (data->cfg->dedicated_clocks)
  464 + snprintf(name, sizeof(name), "usb%d_phy", i);
  465 + else
  466 + strlcpy(name, "usb_phy", sizeof(name));
  467 +
  468 + ret = clk_get_by_name(dev, name, &phy->clocks);
  469 + if (ret) {
  470 + dev_err(dev, "failed to get usb%d_phy clock phandle\n", i);
  471 + return ret;
  472 + }
  473 +
  474 + snprintf(name, sizeof(name), "usb%d_reset", i);
  475 + ret = reset_get_by_name(dev, name, &phy->resets);
  476 + if (ret) {
  477 + dev_err(dev, "failed to get usb%d_reset reset phandle\n", i);
  478 + return ret;
  479 + }
  480 +
451 481 if (i || data->cfg->phy0_dual_route) {
452 482 snprintf(name, sizeof(name), "pmu%d", i);
453 483 phy->pmu = (void __iomem *)devfdt_get_addr_name(dev, name);
... ... @@ -456,9 +486,6 @@
456 486 }
457 487  
458 488 phy->id = i;
459   - phy->rst_mask = info->rst_mask;
460   - if ((data->cfg->type == sun8i_h3_phy) && (phy->id == 3))
461   - phy->rst_mask = (BIT(3) | BIT(11));
462 489 };
463 490  
464 491 debug("Allwinner Sun4I USB PHY driver loaded\n");
... ... @@ -470,6 +497,7 @@
470 497 .type = sun4i_a10_phy,
471 498 .disc_thresh = 3,
472 499 .phyctl_offset = REG_PHYCTL_A10,
  500 + .dedicated_clocks = false,
473 501 .enable_pmu_unk1 = false,
474 502 };
475 503  
... ... @@ -478,6 +506,7 @@
478 506 .type = sun4i_a10_phy,
479 507 .disc_thresh = 2,
480 508 .phyctl_offset = REG_PHYCTL_A10,
  509 + .dedicated_clocks = false,
481 510 .enable_pmu_unk1 = false,
482 511 };
483 512  
... ... @@ -486,6 +515,7 @@
486 515 .type = sun6i_a31_phy,
487 516 .disc_thresh = 3,
488 517 .phyctl_offset = REG_PHYCTL_A10,
  518 + .dedicated_clocks = true,
489 519 .enable_pmu_unk1 = false,
490 520 };
491 521  
... ... @@ -494,6 +524,7 @@
494 524 .type = sun4i_a10_phy,
495 525 .disc_thresh = 2,
496 526 .phyctl_offset = REG_PHYCTL_A10,
  527 + .dedicated_clocks = false,
497 528 .enable_pmu_unk1 = false,
498 529 };
499 530  
... ... @@ -502,6 +533,7 @@
502 533 .type = sun4i_a10_phy,
503 534 .disc_thresh = 3,
504 535 .phyctl_offset = REG_PHYCTL_A10,
  536 + .dedicated_clocks = true,
505 537 .enable_pmu_unk1 = false,
506 538 };
507 539  
... ... @@ -510,6 +542,7 @@
510 542 .type = sun8i_a33_phy,
511 543 .disc_thresh = 3,
512 544 .phyctl_offset = REG_PHYCTL_A33,
  545 + .dedicated_clocks = true,
513 546 .enable_pmu_unk1 = false,
514 547 };
515 548  
... ... @@ -517,6 +550,7 @@
517 550 .num_phys = 3,
518 551 .type = sun8i_a83t_phy,
519 552 .phyctl_offset = REG_PHYCTL_A33,
  553 + .dedicated_clocks = true,
520 554 };
521 555  
522 556 static const struct sun4i_usb_phy_cfg sun8i_h3_cfg = {
... ... @@ -524,6 +558,7 @@
524 558 .type = sun8i_h3_phy,
525 559 .disc_thresh = 3,
526 560 .phyctl_offset = REG_PHYCTL_A33,
  561 + .dedicated_clocks = true,
527 562 .enable_pmu_unk1 = true,
528 563 .phy0_dual_route = true,
529 564 };
... ... @@ -533,6 +568,7 @@
533 568 .type = sun8i_v3s_phy,
534 569 .disc_thresh = 3,
535 570 .phyctl_offset = REG_PHYCTL_A33,
  571 + .dedicated_clocks = true,
536 572 .enable_pmu_unk1 = true,
537 573 .phy0_dual_route = true,
538 574 };
... ... @@ -542,6 +578,7 @@
542 578 .type = sun50i_a64_phy,
543 579 .disc_thresh = 3,
544 580 .phyctl_offset = REG_PHYCTL_A33,
  581 + .dedicated_clocks = true,
545 582 .enable_pmu_unk1 = true,
546 583 .phy0_dual_route = true,
547 584 };