Re: [PATCH v2] pci: ftpci100: Make clocks compulsory

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Jun 21, 2017 at 10:57:30AM +0200, Linus Walleij wrote:
> This fixes a regression on the FTPCI100 PCI driver.
> 
> When the clock controller was augmented to probe clocks
> from the platform device except to the most basic clocks
> pertaining to timers, clocks may return an error pointer
> containing -EPROBE_DEFER.
> 
> This hit the PCI driver which would try to continue
> without the clocks, but the actual clocks appeared later,
> so we did not pick them up properly, and in the end of
> the boot, these clocks get gated off if no users register,
> so the PCI host became numbed off and silently nonworking.
> 
> The clocks for this PCI bus are defined properly for all
> platforms implementing it, so we should make them compulsory
> before new users arrive so we have our resources under
> control.
> 
> This makes the driver bail out of probe with any error
> code from the clock, including -EPROBE_DEFER so that we
> again have a clean boot.
> 
> Fixes: cea186ac1e45 ("pci: ftpci100: Add clock handling")
> Signed-off-by: Linus Walleij <linus.walleij@xxxxxxxxxx>

I folded this into the "pci: ftpci100: Add clock handling" commit,
thanks!

> ---
> ChangeLog v1->v2:
> - Inadvertedly managed to switch PTR_ERR() for ERR_PTR()
>   in the code, and the compile screamed.
> ---
>  drivers/pci/host/pci-ftpci100.c | 28 ++++++++++++----------------
>  1 file changed, 12 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/pci/host/pci-ftpci100.c b/drivers/pci/host/pci-ftpci100.c
> index d3bf153a2ab2..db31ab21884e 100644
> --- a/drivers/pci/host/pci-ftpci100.c
> +++ b/drivers/pci/host/pci-ftpci100.c
> @@ -463,24 +463,20 @@ static int faraday_pci_probe(struct platform_device *pdev)
>  
>  	/* Retrieve and enable optional clocks */
>  	clk = devm_clk_get(dev, "PCLK");
> -	if (IS_ERR(clk)) {
> -		dev_err(dev, "no PCLK available\n");
> -	} else {
> -		ret = clk_prepare_enable(clk);
> -		if (ret) {
> -			dev_err(dev, "could not prepare PCLK\n");
> -			return ret;
> -		}
> +	if (IS_ERR(clk))
> +		return PTR_ERR(clk);
> +	ret = clk_prepare_enable(clk);
> +	if (ret) {
> +		dev_err(dev, "could not prepare PCLK\n");
> +		return ret;
>  	}
>  	p->bus_clk = devm_clk_get(dev, "PCICLK");
> -	if (IS_ERR(p->bus_clk)) {
> -		dev_err(dev, "no PCICLK available\n");
> -	} else {
> -		ret = clk_prepare_enable(p->bus_clk);
> -		if (ret) {
> -			dev_err(dev, "could not prepare PCICLK\n");
> -			return ret;
> -		}
> +	if (IS_ERR(p->bus_clk))
> +		return PTR_ERR(clk);
> +	ret = clk_prepare_enable(p->bus_clk);
> +	if (ret) {
> +		dev_err(dev, "could not prepare PCICLK\n");
> +		return ret;
>  	}
>  
>  	regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> -- 
> 2.9.4
> 



[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux