mirror of
				https://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 23:05:48 +00:00 
			
		
		
		
	Introduce initial support for Airoha AN7583 SoC and add all the required patch for basic functionality of the SoC. Airoha AN7583 is based on Airoha EN7581 SoC with some major changes on the PHY handling and Serdes. It can be see as a lower spec of EN7581 with modern and simplified implementations. All the patch are sent upstream and are pending revision. Support for PCIe and USB will come later as soon as DT structure is accepted upstream. Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
		
			
				
	
	
		
			130 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			130 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 1e623852d07759c3c076505193bd7f0bd3486774 Mon Sep 17 00:00:00 2001
 | |
| From: Christian Marangi <ansuelsmth@gmail.com>
 | |
| Date: Fri, 23 May 2025 19:54:53 +0200
 | |
| Subject: [PATCH 3/5] thermal/drivers: airoha: generalize get_thermal_ADC and
 | |
|  set_mux function
 | |
| 
 | |
| In preparation for support of Airoha AN7583, generalize
 | |
| get_thermal_ADC() and set_thermal_mux() with the use of reg_field API.
 | |
| 
 | |
| This is to account the same logic between the current supported SoC and
 | |
| the new one but with different register address.
 | |
| 
 | |
| While at it also further improve some comments and move sleep inside the
 | |
| set_thermal_mux function.
 | |
| 
 | |
| Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
 | |
| ---
 | |
|  drivers/thermal/airoha_thermal.c | 54 +++++++++++++++++++++++++-------
 | |
|  1 file changed, 42 insertions(+), 12 deletions(-)
 | |
| 
 | |
| --- a/drivers/thermal/airoha_thermal.c
 | |
| +++ b/drivers/thermal/airoha_thermal.c
 | |
| @@ -193,9 +193,18 @@
 | |
|  
 | |
|  #define AIROHA_MAX_SAMPLES			6
 | |
|  
 | |
| +enum airoha_thermal_chip_scu_field {
 | |
| +	AIROHA_THERMAL_DOUT_TADC,
 | |
| +	AIROHA_THERMAL_MUX_TADC,
 | |
| +
 | |
| +	/* keep last */
 | |
| +	AIROHA_THERMAL_FIELD_MAX,
 | |
| +};
 | |
| +
 | |
|  struct airoha_thermal_priv {
 | |
|  	struct regmap *map;
 | |
|  	struct regmap *chip_scu;
 | |
| +	struct regmap_field *chip_scu_fields[AIROHA_THERMAL_FIELD_MAX];
 | |
|  	struct resource scu_adc_res;
 | |
|  
 | |
|  	u32 pllrg_protect;
 | |
| @@ -219,22 +228,29 @@ static int airoha_get_thermal_ADC(struct
 | |
|  {
 | |
|  	u32 val;
 | |
|  
 | |
| -	regmap_read(priv->chip_scu, EN7581_DOUT_TADC, &val);
 | |
| -	return FIELD_GET(EN7581_DOUT_TADC_MASK, val);
 | |
| +	regmap_field_read(priv->chip_scu_fields[AIROHA_THERMAL_DOUT_TADC],
 | |
| +			  &val);
 | |
| +	return val;
 | |
|  }
 | |
|  
 | |
| -static void airoha_init_thermal_ADC_mode(struct airoha_thermal_priv *priv)
 | |
| +static void airoha_set_thermal_mux(struct airoha_thermal_priv *priv,
 | |
| +				   int tdac_idx)
 | |
|  {
 | |
| -	u32 adc_mux, pllrg;
 | |
| +	u32 pllrg;
 | |
|  
 | |
|  	/* Save PLLRG current value */
 | |
|  	regmap_read(priv->chip_scu, EN7581_PLLRG_PROTECT, &pllrg);
 | |
|  
 | |
| -	/* Give access to thermal regs */
 | |
| +	/* Give access to Thermal regs */
 | |
|  	regmap_write(priv->chip_scu, EN7581_PLLRG_PROTECT,
 | |
|  		     priv->pllrg_protect);
 | |
| -	adc_mux = FIELD_PREP(EN7581_MUX_TADC, EN7581_SCU_THERMAL_MUX_DIODE1);
 | |
| -	regmap_write(priv->chip_scu, EN7581_PWD_TADC, adc_mux);
 | |
| +
 | |
| +	/* Configure Thermal ADC mux to tdac_idx */
 | |
| +	regmap_field_write(priv->chip_scu_fields[AIROHA_THERMAL_MUX_TADC],
 | |
| +			   tdac_idx);
 | |
| +
 | |
| +	/* Sleep 10 ms for Thermal ADC to enable */
 | |
| +	usleep_range(10 * USEC_PER_MSEC, 11 * USEC_PER_MSEC);
 | |
|  
 | |
|  	/* Restore PLLRG value on exit */
 | |
|  	regmap_write(priv->chip_scu, EN7581_PLLRG_PROTECT, pllrg);
 | |
| @@ -343,10 +359,8 @@ static void en7581_thermal_setup_adc_val
 | |
|  {
 | |
|  	u32 efuse_calib_info, cpu_sensor;
 | |
|  
 | |
| -	/* Setup thermal sensor to ADC mode and setup the mux to DIODE1 */
 | |
| -	airoha_init_thermal_ADC_mode(priv);
 | |
| -	/* sleep 10 ms for ADC to enable */
 | |
| -	usleep_range(10 * USEC_PER_MSEC, 11 * USEC_PER_MSEC);
 | |
| +	/* Setup Thermal Sensor to ADC mode and setup the mux to DIODE1 */
 | |
| +	airoha_set_thermal_mux(priv, EN7581_SCU_THERMAL_MUX_DIODE1);
 | |
|  
 | |
|  	regmap_read(priv->map, EN7581_EFUSE_TEMP_OFFSET_REG, &efuse_calib_info);
 | |
|  	if (efuse_calib_info) {
 | |
| @@ -429,13 +443,18 @@ static const struct regmap_config en7581
 | |
|  	.val_bits		= 32,
 | |
|  };
 | |
|  
 | |
| +static const struct reg_field en7581_chip_scu_fields[AIROHA_THERMAL_FIELD_MAX] = {
 | |
| +	[AIROHA_THERMAL_DOUT_TADC] = REG_FIELD(EN7581_DOUT_TADC, 0, 15),
 | |
| +	[AIROHA_THERMAL_MUX_TADC] = REG_FIELD(EN7581_PWD_TADC, 1, 3),
 | |
| +};
 | |
| +
 | |
|  static int en7581_thermal_probe(struct platform_device *pdev,
 | |
|  				struct airoha_thermal_priv *priv)
 | |
|  {
 | |
|  	struct device_node *chip_scu_np;
 | |
|  	struct device *dev = &pdev->dev;
 | |
|  	void __iomem *base;
 | |
| -	int irq, ret;
 | |
| +	int i, irq, ret;
 | |
|  
 | |
|  	base = devm_platform_ioremap_resource(pdev, 0);
 | |
|  	if (IS_ERR(base))
 | |
| @@ -454,6 +473,17 @@ static int en7581_thermal_probe(struct p
 | |
|  	if (IS_ERR(priv->chip_scu))
 | |
|  		return PTR_ERR(priv->chip_scu);
 | |
|  
 | |
| +	for (i = 0; i < AIROHA_THERMAL_FIELD_MAX; i++) {
 | |
| +		struct regmap_field *field;
 | |
| +
 | |
| +		field = devm_regmap_field_alloc(dev, priv->chip_scu,
 | |
| +						en7581_chip_scu_fields[i]);
 | |
| +		if (IS_ERR(field))
 | |
| +			return PTR_ERR(field);
 | |
| +
 | |
| +		priv->chip_scu_fields[i] = field;
 | |
| +	}
 | |
| +
 | |
|  	of_address_to_resource(chip_scu_np, 0, &priv->scu_adc_res);
 | |
|  	of_node_put(chip_scu_np);
 | |
|  
 |