raimps: mtk_eth_soc: drop rst_esw from ESW driver
The ESW core needs to be reset together with FE core, so after the
relevant reset controller lines are moved under FE, drop rst_esw and all
related code, which would not execute anyway, because rst_esw would be
NULL. While at that, ensure that if reset line for EPHY cannot be
claimed, a proper error message is reported.
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 f393ffcac163926bf9dbbda47c25cc7809952609)
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
						
							0128d860a0
						
					
				
				
					commit
					23506e7789
				
			| @@ -237,7 +237,6 @@ struct rt305x_esw { | |||||||
| 	int			led_frequency; | 	int			led_frequency; | ||||||
| 	struct esw_vlan vlans[RT305X_ESW_NUM_VLANS]; | 	struct esw_vlan vlans[RT305X_ESW_NUM_VLANS]; | ||||||
| 	struct esw_port ports[RT305X_ESW_NUM_PORTS]; | 	struct esw_port ports[RT305X_ESW_NUM_PORTS]; | ||||||
| 	struct reset_control	*rst_esw; |  | ||||||
| 	struct reset_control	*rst_ephy; | 	struct reset_control	*rst_ephy; | ||||||
|  |  | ||||||
| }; | }; | ||||||
| @@ -261,18 +260,6 @@ static inline void esw_rmw_raw(struct rt305x_esw *esw, unsigned reg, | |||||||
| 	__raw_writel(t | val, esw->base + reg); | 	__raw_writel(t | val, esw->base + reg); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void esw_reset(struct rt305x_esw *esw) |  | ||||||
| { |  | ||||||
| 	if (!esw->rst_esw) |  | ||||||
| 		return; |  | ||||||
|  |  | ||||||
| 	reset_control_assert(esw->rst_esw); |  | ||||||
| 	usleep_range(60, 120); |  | ||||||
| 	reset_control_deassert(esw->rst_esw); |  | ||||||
| 	/* the esw takes long to reset otherwise the board hang */ |  | ||||||
| 	msleep(10); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static void esw_reset_ephy(struct rt305x_esw *esw) | static void esw_reset_ephy(struct rt305x_esw *esw) | ||||||
| { | { | ||||||
| 	if (!esw->rst_ephy) | 	if (!esw->rst_ephy) | ||||||
| @@ -466,8 +453,6 @@ static void esw_hw_init(struct rt305x_esw *esw) | |||||||
| 	u8 port_disable = 0; | 	u8 port_disable = 0; | ||||||
| 	u8 port_map = RT305X_ESW_PMAP_LLLLLL; | 	u8 port_map = RT305X_ESW_PMAP_LLLLLL; | ||||||
|  |  | ||||||
| 	esw_reset(esw); |  | ||||||
|  |  | ||||||
| 	/* vodoo from original driver */ | 	/* vodoo from original driver */ | ||||||
| 	esw_w32(esw, 0xC8A07850, RT305X_ESW_REG_FCT0); | 	esw_w32(esw, 0xC8A07850, RT305X_ESW_REG_FCT0); | ||||||
| 	esw_w32(esw, 0x00000000, RT305X_ESW_REG_SGC2); | 	esw_w32(esw, 0x00000000, RT305X_ESW_REG_SGC2); | ||||||
| @@ -1441,12 +1426,11 @@ static int esw_probe(struct platform_device *pdev) | |||||||
| 	if (reg_init) | 	if (reg_init) | ||||||
| 		esw->reg_led_source = be32_to_cpu(*reg_init); | 		esw->reg_led_source = be32_to_cpu(*reg_init); | ||||||
|  |  | ||||||
| 	esw->rst_esw = devm_reset_control_get(&pdev->dev, "esw"); | 	esw->rst_ephy = devm_reset_control_get_exclusive(&pdev->dev, "ephy"); | ||||||
| 	if (IS_ERR(esw->rst_esw)) | 	if (IS_ERR(esw->rst_ephy)) { | ||||||
| 		esw->rst_esw = NULL; | 		dev_err(esw->dev, "failed to get EPHY reset: %pe\n", esw->rst_ephy); | ||||||
| 	esw->rst_ephy = devm_reset_control_get(&pdev->dev, "ephy"); |  | ||||||
| 	if (IS_ERR(esw->rst_ephy)) |  | ||||||
| 		esw->rst_ephy = NULL; | 		esw->rst_ephy = NULL; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	spin_lock_init(&esw->reg_rw_lock); | 	spin_lock_init(&esw->reg_rw_lock); | ||||||
| 	platform_set_drvdata(pdev, esw); | 	platform_set_drvdata(pdev, esw); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user