mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	spi/bcm63xx-hspi: Enable the clock before calling clk_get_rate().
Enable the clock prior to calling clk_get_rate(), because clk_get_rate()
should only be called if the clock is enabled.
Additionally, prepare/enable the pll_clk before calling clk_get_rate()
for the same reason.
Found by Linux Driver Verification project (linuxtesting.org).
Fixes: 142168eba9 ("spi: bcm63xx-hsspi: add bcm63xx HSSPI driver")
Signed-off-by: Stefan Potyra <Stefan.Potyra@elektrobit.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
			
			
This commit is contained in:
		
							parent
							
								
									b6a4b39152
								
							
						
					
					
						commit
						0d7412ed1f
					
				
					 1 changed files with 17 additions and 8 deletions
				
			
		| 
						 | 
				
			
			@ -352,21 +352,30 @@ static int bcm63xx_hsspi_probe(struct platform_device *pdev)
 | 
			
		|||
	if (IS_ERR(clk))
 | 
			
		||||
		return PTR_ERR(clk);
 | 
			
		||||
 | 
			
		||||
	ret = clk_prepare_enable(clk);
 | 
			
		||||
	if (ret)
 | 
			
		||||
		return ret;
 | 
			
		||||
 | 
			
		||||
	rate = clk_get_rate(clk);
 | 
			
		||||
	if (!rate) {
 | 
			
		||||
		struct clk *pll_clk = devm_clk_get(dev, "pll");
 | 
			
		||||
 | 
			
		||||
		if (IS_ERR(pll_clk))
 | 
			
		||||
			return PTR_ERR(pll_clk);
 | 
			
		||||
 | 
			
		||||
		rate = clk_get_rate(pll_clk);
 | 
			
		||||
		if (!rate)
 | 
			
		||||
			return -EINVAL;
 | 
			
		||||
		if (IS_ERR(pll_clk)) {
 | 
			
		||||
			ret = PTR_ERR(pll_clk);
 | 
			
		||||
			goto out_disable_clk;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	ret = clk_prepare_enable(clk);
 | 
			
		||||
		ret = clk_prepare_enable(pll_clk);
 | 
			
		||||
		if (ret)
 | 
			
		||||
		return ret;
 | 
			
		||||
			goto out_disable_clk;
 | 
			
		||||
 | 
			
		||||
		rate = clk_get_rate(pll_clk);
 | 
			
		||||
		clk_disable_unprepare(pll_clk);
 | 
			
		||||
		if (!rate) {
 | 
			
		||||
			ret = -EINVAL;
 | 
			
		||||
			goto out_disable_clk;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	master = spi_alloc_master(&pdev->dev, sizeof(*bs));
 | 
			
		||||
	if (!master) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue