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

Merge tag 'tags/bcm2835-drivers-next-2019-03-12' into soc/fixes

This pull request brings in a build fix for arm64 with bcm2835
enabled, and fixes the driver in the presence of -EPROBE_DEFER.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>

+43 -7
+1
arch/arm64/Kconfig.platforms
··· 27 27 bool "Broadcom BCM2835 family" 28 28 select TIMER_OF 29 29 select GPIOLIB 30 + select MFD_CORE 30 31 select PINCTRL 31 32 select PINCTRL_BCM2835 32 33 select ARM_AMBA
+42 -7
drivers/soc/bcm/bcm2835-power.c
··· 150 150 151 151 static int bcm2835_asb_enable(struct bcm2835_power *power, u32 reg) 152 152 { 153 - u64 start = ktime_get_ns(); 153 + u64 start; 154 + 155 + if (!reg) 156 + return 0; 157 + 158 + start = ktime_get_ns(); 154 159 155 160 /* Enable the module's async AXI bridges. */ 156 161 ASB_WRITE(reg, ASB_READ(reg) & ~ASB_REQ_STOP); ··· 170 165 171 166 static int bcm2835_asb_disable(struct bcm2835_power *power, u32 reg) 172 167 { 173 - u64 start = ktime_get_ns(); 168 + u64 start; 169 + 170 + if (!reg) 171 + return 0; 172 + 173 + start = ktime_get_ns(); 174 174 175 175 /* Enable the module's async AXI bridges. */ 176 176 ASB_WRITE(reg, ASB_READ(reg) | ASB_REQ_STOP); ··· 485 475 } 486 476 } 487 477 488 - static void 478 + static int 489 479 bcm2835_init_power_domain(struct bcm2835_power *power, 490 480 int pd_xlate_index, const char *name) 491 481 { ··· 493 483 struct bcm2835_power_domain *dom = &power->domains[pd_xlate_index]; 494 484 495 485 dom->clk = devm_clk_get(dev->parent, name); 486 + if (IS_ERR(dom->clk)) { 487 + int ret = PTR_ERR(dom->clk); 488 + 489 + if (ret == -EPROBE_DEFER) 490 + return ret; 491 + 492 + /* Some domains don't have a clk, so make sure that we 493 + * don't deref an error pointer later. 494 + */ 495 + dom->clk = NULL; 496 + } 496 497 497 498 dom->base.name = name; 498 499 dom->base.power_on = bcm2835_power_pd_power_on; ··· 516 495 pm_genpd_init(&dom->base, NULL, true); 517 496 518 497 power->pd_xlate.domains[pd_xlate_index] = &dom->base; 498 + 499 + return 0; 519 500 } 520 501 521 502 /** bcm2835_reset_reset - Resets a block that has a reset line in the ··· 615 592 { BCM2835_POWER_DOMAIN_IMAGE_PERI, BCM2835_POWER_DOMAIN_CAM0 }, 616 593 { BCM2835_POWER_DOMAIN_IMAGE_PERI, BCM2835_POWER_DOMAIN_CAM1 }, 617 594 }; 618 - int ret, i; 595 + int ret = 0, i; 619 596 u32 id; 620 597 621 598 power = devm_kzalloc(dev, sizeof(*power), GFP_KERNEL); ··· 642 619 643 620 power->pd_xlate.num_domains = ARRAY_SIZE(power_domain_names); 644 621 645 - for (i = 0; i < ARRAY_SIZE(power_domain_names); i++) 646 - bcm2835_init_power_domain(power, i, power_domain_names[i]); 622 + for (i = 0; i < ARRAY_SIZE(power_domain_names); i++) { 623 + ret = bcm2835_init_power_domain(power, i, power_domain_names[i]); 624 + if (ret) 625 + goto fail; 626 + } 647 627 648 628 for (i = 0; i < ARRAY_SIZE(domain_deps); i++) { 649 629 pm_genpd_add_subdomain(&power->domains[domain_deps[i].parent].base, ··· 660 634 661 635 ret = devm_reset_controller_register(dev, &power->reset); 662 636 if (ret) 663 - return ret; 637 + goto fail; 664 638 665 639 of_genpd_add_provider_onecell(dev->parent->of_node, &power->pd_xlate); 666 640 667 641 dev_info(dev, "Broadcom BCM2835 power domains driver"); 668 642 return 0; 643 + 644 + fail: 645 + for (i = 0; i < ARRAY_SIZE(power_domain_names); i++) { 646 + struct generic_pm_domain *dom = &power->domains[i].base; 647 + 648 + if (dom->name) 649 + pm_genpd_remove(dom); 650 + } 651 + return ret; 669 652 } 670 653 671 654 static int bcm2835_power_remove(struct platform_device *pdev)