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))
 | 
						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;
 | 
				
			||||||
		rate = clk_get_rate(pll_clk);
 | 
					 | 
				
			||||||
		if (!rate)
 | 
					 | 
				
			||||||
			return -EINVAL;
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = clk_prepare_enable(clk);
 | 
							ret = clk_prepare_enable(pll_clk);
 | 
				
			||||||
		if (ret)
 | 
							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));
 | 
						master = spi_alloc_master(&pdev->dev, sizeof(*bs));
 | 
				
			||||||
	if (!master) {
 | 
						if (!master) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue