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
					
				| @ -352,22 +352,31 @@ static int bcm63xx_hsspi_probe(struct platform_device *pdev) | |||||||
| 	if (IS_ERR(clk)) | 	if (IS_ERR(clk)) | ||||||
| 		return PTR_ERR(clk); | 		return PTR_ERR(clk); | ||||||
| 
 | 
 | ||||||
|  | 	ret = clk_prepare_enable(clk); | ||||||
|  | 	if (ret) | ||||||
|  | 		return ret; | ||||||
|  | 
 | ||||||
| 	rate = clk_get_rate(clk); | 	rate = clk_get_rate(clk); | ||||||
| 	if (!rate) { | 	if (!rate) { | ||||||
| 		struct clk *pll_clk = devm_clk_get(dev, "pll"); | 		struct clk *pll_clk = devm_clk_get(dev, "pll"); | ||||||
| 
 | 
 | ||||||
| 		if (IS_ERR(pll_clk)) | 		if (IS_ERR(pll_clk)) { | ||||||
| 			return PTR_ERR(pll_clk); | 			ret = PTR_ERR(pll_clk); | ||||||
|  | 			goto out_disable_clk; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		ret = clk_prepare_enable(pll_clk); | ||||||
|  | 		if (ret) | ||||||
|  | 			goto out_disable_clk; | ||||||
| 
 | 
 | ||||||
| 		rate = clk_get_rate(pll_clk); | 		rate = clk_get_rate(pll_clk); | ||||||
| 		if (!rate) | 		clk_disable_unprepare(pll_clk); | ||||||
| 			return -EINVAL; | 		if (!rate) { | ||||||
|  | 			ret = -EINVAL; | ||||||
|  | 			goto out_disable_clk; | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	ret = clk_prepare_enable(clk); |  | ||||||
| 	if (ret) |  | ||||||
| 		return ret; |  | ||||||
| 
 |  | ||||||
| 	master = spi_alloc_master(&pdev->dev, sizeof(*bs)); | 	master = spi_alloc_master(&pdev->dev, sizeof(*bs)); | ||||||
| 	if (!master) { | 	if (!master) { | ||||||
| 		ret = -ENOMEM; | 		ret = -ENOMEM; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user