ramips: mtk_eth_soc: allow multiple resets
Use devm_reset_control_array_get_exclusive to register multiple
reset lines in FE driver. This is required to reattach ESW reset to FE
driver again, based on device tree bindings.
While at that, remove unused fe_priv.rst_ppe field, and add error
message if getting the reset fails.
Fixes: 60fadae62b ("ramips: ethernet: ralink: move reset of the esw into the esw instead of fe")
Co-developed-by: Maxim Anisimov <maxim.anisimov.ua@gmail.com>
Signed-off-by: Maxim Anisimov <maxim.anisimov.ua@gmail.com>
[Split out of the bigger commit, provide commit mesage, refactor error
handling]
Signed-off-by: Lech Perczak <lech.perczak@gmail.com>
(cherry picked from commit 3f1be8edee29fe79fc33c88cbd9d647a490410e5)
Signed-off-by: Lech Perczak <lech.perczak@gmail.com>
			
			
This commit is contained in:
		 Lech Perczak
					Lech Perczak
				
			
				
					committed by
					
						 Hauke Mehrtens
						Hauke Mehrtens
					
				
			
			
				
	
			
			
			 Hauke Mehrtens
						Hauke Mehrtens
					
				
			
						parent
						
							3aec71a176
						
					
				
				
					commit
					8ce87267ba
				
			| @@ -143,12 +143,12 @@ void fe_reset(u32 reset_bits) | |||||||
|  |  | ||||||
| void fe_reset_fe(struct fe_priv *priv) | void fe_reset_fe(struct fe_priv *priv) | ||||||
| { | { | ||||||
| 	if (!priv->rst_fe) | 	if (!priv->resets) | ||||||
| 		return; | 		return; | ||||||
|  |  | ||||||
| 	reset_control_assert(priv->rst_fe); | 	reset_control_assert(priv->resets); | ||||||
| 	usleep_range(60, 120); | 	usleep_range(60, 120); | ||||||
| 	reset_control_deassert(priv->rst_fe); | 	reset_control_deassert(priv->resets); | ||||||
| 	usleep_range(60, 120); | 	usleep_range(60, 120); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -1595,9 +1595,11 @@ static int fe_probe(struct platform_device *pdev) | |||||||
|  |  | ||||||
| 	priv = netdev_priv(netdev); | 	priv = netdev_priv(netdev); | ||||||
| 	spin_lock_init(&priv->page_lock); | 	spin_lock_init(&priv->page_lock); | ||||||
| 	priv->rst_fe = devm_reset_control_get(&pdev->dev, "fe"); | 	priv->resets = devm_reset_control_array_get_exclusive(&pdev->dev); | ||||||
| 	if (IS_ERR(priv->rst_fe)) | 	if (IS_ERR(priv->resets)) { | ||||||
| 		priv->rst_fe = NULL; | 		dev_err(&pdev->dev, "Failed to get resets for FE and ESW cores: %pe\n", priv->resets); | ||||||
|  | 		priv->resets = NULL; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	if (soc->init_data) | 	if (soc->init_data) | ||||||
| 		soc->init_data(soc, netdev); | 		soc->init_data(soc, netdev); | ||||||
|   | |||||||
| @@ -497,8 +497,7 @@ struct fe_priv { | |||||||
| 	struct work_struct		pending_work; | 	struct work_struct		pending_work; | ||||||
| 	DECLARE_BITMAP(pending_flags, FE_FLAG_MAX); | 	DECLARE_BITMAP(pending_flags, FE_FLAG_MAX); | ||||||
|  |  | ||||||
| 	struct reset_control		*rst_ppe; | 	struct reset_control		*resets; | ||||||
| 	struct reset_control		*rst_fe; |  | ||||||
| 	struct mtk_foe_entry		*foe_table; | 	struct mtk_foe_entry		*foe_table; | ||||||
| 	dma_addr_t			foe_table_phys; | 	dma_addr_t			foe_table_phys; | ||||||
| 	struct flow_offload __rcu	**foe_flow_table; | 	struct flow_offload __rcu	**foe_flow_table; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user