mirror of
				https://github.com/Ysurac/openmptcprouter.git
				synced 2025-03-09 15:40:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			59 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 813ba3e427671ba3ff35c825087b03f0ad91cf02 Mon Sep 17 00:00:00 2001
 | |
| From: Robert Marko <robimarko@gmail.com>
 | |
| Date: Mon, 7 Nov 2022 14:28:59 +0100
 | |
| Subject: [PATCH] clk: qcom: reset: support resetting multiple bits
 | |
| 
 | |
| This patch adds the support for giving the complete bitmask
 | |
| in reset structure and reset operation will use this bitmask
 | |
| for all reset operations.
 | |
| 
 | |
| Currently, reset structure only takes a single bit for each reset
 | |
| and then calculates the bitmask by using the BIT() macro.
 | |
| 
 | |
| However, this is not sufficient anymore for newer SoC-s like IPQ8074,
 | |
| IPQ6018 and more, since their networking resets require multiple bits
 | |
| to be asserted in order to properly reset the HW block completely.
 | |
| 
 | |
| So, in order to allow asserting multiple bits add "bitmask" field to
 | |
| qcom_reset_map, and then use that bitmask value if its populated in the
 | |
| driver, if its not populated, then we just default to existing behaviour
 | |
| and calculate the bitmask on the fly.
 | |
| 
 | |
| Signed-off-by: Robert Marko <robimarko@gmail.com>
 | |
| Signed-off-by: Bjorn Andersson <andersson@kernel.org>
 | |
| Link: https://lore.kernel.org/r/20221107132901.489240-1-robimarko@gmail.com
 | |
| ---
 | |
|  drivers/clk/qcom/reset.c | 4 ++--
 | |
|  drivers/clk/qcom/reset.h | 1 +
 | |
|  2 files changed, 3 insertions(+), 2 deletions(-)
 | |
| 
 | |
| --- a/drivers/clk/qcom/reset.c
 | |
| +++ b/drivers/clk/qcom/reset.c
 | |
| @@ -30,7 +30,7 @@ qcom_reset_assert(struct reset_controlle
 | |
|  
 | |
|  	rst = to_qcom_reset_controller(rcdev);
 | |
|  	map = &rst->reset_map[id];
 | |
| -	mask = BIT(map->bit);
 | |
| +	mask = map->bitmask ? map->bitmask : BIT(map->bit);
 | |
|  
 | |
|  	return regmap_update_bits(rst->regmap, map->reg, mask, mask);
 | |
|  }
 | |
| @@ -44,7 +44,7 @@ qcom_reset_deassert(struct reset_control
 | |
|  
 | |
|  	rst = to_qcom_reset_controller(rcdev);
 | |
|  	map = &rst->reset_map[id];
 | |
| -	mask = BIT(map->bit);
 | |
| +	mask = map->bitmask ? map->bitmask : BIT(map->bit);
 | |
|  
 | |
|  	return regmap_update_bits(rst->regmap, map->reg, mask, 0);
 | |
|  }
 | |
| --- a/drivers/clk/qcom/reset.h
 | |
| +++ b/drivers/clk/qcom/reset.h
 | |
| @@ -12,6 +12,7 @@ struct qcom_reset_map {
 | |
|  	unsigned int reg;
 | |
|  	u8 bit;
 | |
|  	u8 udelay;
 | |
| +	u32 bitmask;
 | |
|  };
 | |
|  
 | |
|  struct regmap;
 |