mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08:00 
			
		
		
		
	stmmac: dwmac-mediatek: fix clock issue
The pm_runtime takes care of the clock handling in current
stmmac drivers, and dwmac-mediatek implement the
mediatek_dwmac_clks_config() as the callback for pm_runtime.
Then, stripping duplicated clocks handling in old init()/exit()
to fix clock issue in suspend/resume test.
As to clocks in probe/remove, vendor need symmetric handling to
ensure clocks balance.
Test pass, including suspend/resume and ko insertion/remove.
Fixes: 3186bdad97 ("stmmac: dwmac-mediatek: add platform level clocks management")
Signed-off-by: Biao Huang <biao.huang@mediatek.com>
Reviewed-by: Matthias Brugger <matthias.bgg@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
			
			
This commit is contained in:
		
							parent
							
								
									782d86fe44
								
							
						
					
					
						commit
						fa4b3ca60e
					
				| @ -576,32 +576,7 @@ static int mediatek_dwmac_init(struct platform_device *pdev, void *priv) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	ret = clk_bulk_prepare_enable(variant->num_clks, plat->clks); | ||||
| 	if (ret) { | ||||
| 		dev_err(plat->dev, "failed to enable clks, err = %d\n", ret); | ||||
| 		return ret; | ||||
| 	} | ||||
| 
 | ||||
| 	ret = clk_prepare_enable(plat->rmii_internal_clk); | ||||
| 	if (ret) { | ||||
| 		dev_err(plat->dev, "failed to enable rmii internal clk, err = %d\n", ret); | ||||
| 		goto err_clk; | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| 
 | ||||
| err_clk: | ||||
| 	clk_bulk_disable_unprepare(variant->num_clks, plat->clks); | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| static void mediatek_dwmac_exit(struct platform_device *pdev, void *priv) | ||||
| { | ||||
| 	struct mediatek_dwmac_plat_data *plat = priv; | ||||
| 	const struct mediatek_dwmac_variant *variant = plat->variant; | ||||
| 
 | ||||
| 	clk_disable_unprepare(plat->rmii_internal_clk); | ||||
| 	clk_bulk_disable_unprepare(variant->num_clks, plat->clks); | ||||
| } | ||||
| 
 | ||||
| static int mediatek_dwmac_clks_config(void *priv, bool enabled) | ||||
| @ -643,7 +618,6 @@ static int mediatek_dwmac_common_data(struct platform_device *pdev, | ||||
| 	plat->addr64 = priv_plat->variant->dma_bit_mask; | ||||
| 	plat->bsp_priv = priv_plat; | ||||
| 	plat->init = mediatek_dwmac_init; | ||||
| 	plat->exit = mediatek_dwmac_exit; | ||||
| 	plat->clks_config = mediatek_dwmac_clks_config; | ||||
| 	if (priv_plat->variant->dwmac_fix_mac_speed) | ||||
| 		plat->fix_mac_speed = priv_plat->variant->dwmac_fix_mac_speed; | ||||
| @ -712,13 +686,32 @@ static int mediatek_dwmac_probe(struct platform_device *pdev) | ||||
| 	mediatek_dwmac_common_data(pdev, plat_dat, priv_plat); | ||||
| 	mediatek_dwmac_init(pdev, priv_plat); | ||||
| 
 | ||||
| 	ret = mediatek_dwmac_clks_config(priv_plat, true); | ||||
| 	if (ret) | ||||
| 		return ret; | ||||
| 
 | ||||
| 	ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); | ||||
| 	if (ret) { | ||||
| 		stmmac_remove_config_dt(pdev, plat_dat); | ||||
| 		return ret; | ||||
| 		goto err_drv_probe; | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| 
 | ||||
| err_drv_probe: | ||||
| 	mediatek_dwmac_clks_config(priv_plat, false); | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| static int mediatek_dwmac_remove(struct platform_device *pdev) | ||||
| { | ||||
| 	struct mediatek_dwmac_plat_data *priv_plat = get_stmmac_bsp_priv(&pdev->dev); | ||||
| 	int ret; | ||||
| 
 | ||||
| 	ret = stmmac_pltfr_remove(pdev); | ||||
| 	mediatek_dwmac_clks_config(priv_plat, false); | ||||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| static const struct of_device_id mediatek_dwmac_match[] = { | ||||
| @ -733,7 +726,7 @@ MODULE_DEVICE_TABLE(of, mediatek_dwmac_match); | ||||
| 
 | ||||
| static struct platform_driver mediatek_dwmac_driver = { | ||||
| 	.probe  = mediatek_dwmac_probe, | ||||
| 	.remove = stmmac_pltfr_remove, | ||||
| 	.remove = mediatek_dwmac_remove, | ||||
| 	.driver = { | ||||
| 		.name           = "dwmac-mediatek", | ||||
| 		.pm		= &stmmac_pltfr_pm_ops, | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Biao Huang
						Biao Huang