Re: [PATCH v4 4/5] i2c: qcom-cci: Share the timing table across CCI revisions

Vladimir Zapolskiy <[email protected]>
Newsgroups org.kernel.vger.linux-i2c,org.kernel.vger.linux-arm-msm,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On 8/1/26 23:10, Loic Poulain wrote:
> The hw_params timing values only depend on the CCI clock rate and the
> I2C mode, not on the hardware revision: every per-variant table used
> identical values for a given [rate][mode]. Only the set of supported
> modes differs between revisions.
> 
> Move the timings into a single shared cci_hw_params[rate][mode] table
> and describe each variant's highest supported mode in cci_data with
> max_mode instead of duplicating the timing values. This removes the
> per-variant timing tables without any functional change.
> 
> Suggested-by: Vladimir Zapolskiy <[email protected]>
> Signed-off-by: Loic Poulain <[email protected]>
> ---
>   drivers/i2c/busses/i2c-qcom-cci.c | 181 +++++++++++++++-----------------------
>   1 file changed, 70 insertions(+), 111 deletions(-)
> 
> diff --git a/drivers/i2c/busses/i2c-qcom-cci.c b/drivers/i2c/busses/i2c-qcom-cci.c
> index b6fa37a306758ec33ede6fcc39ce4412b86d9a84..21695c744502f7fb5d333f1272f3771e4d9d5508 100644
> --- a/drivers/i2c/busses/i2c-qcom-cci.c
> +++ b/drivers/i2c/busses/i2c-qcom-cci.c
> @@ -124,7 +124,8 @@ struct cci_data {
>   	unsigned int num_masters;
>   	struct i2c_adapter_quirks quirks;
>   	u16 queue_size[NUM_QUEUES];
> -	struct hw_params params[NUM_CCI_CLK_RATES][NUM_I2C_MODES];
> +	/* Highest I2C mode supported by this variant. */
> +	u8 max_mode;
>   };
>   
>   struct cci {
> @@ -249,13 +250,76 @@ static int cci_clk_rate_idx(unsigned long rate)
>   	return -EINVAL;
>   }
>   
> +static const struct hw_params cci_hw_params[NUM_CCI_CLK_RATES][NUM_I2C_MODES] = {
> +	[CCI_CLK_RATE_19_2MHZ][I2C_MODE_STANDARD] = {
> +		.thigh = 78,
> +		.tlow = 114,
> +		.tsu_sto = 28,
> +		.tsu_sta = 28,
> +		.thd_dat = 10,
> +		.thd_sta = 77,
> +		.tbuf = 118,
> +		.scl_stretch_en = 0,
> +		.trdhld = 6,
> +		.tsp = 1
> +	},
> +	[CCI_CLK_RATE_19_2MHZ][I2C_MODE_FAST] = {
> +		.thigh = 20,
> +		.tlow = 28,
> +		.tsu_sto = 21,
> +		.tsu_sta = 21,
> +		.thd_dat = 13,
> +		.thd_sta = 18,
> +		.tbuf = 32,
> +		.scl_stretch_en = 0,
> +		.trdhld = 6,
> +		.tsp = 3
> +	},
> +	[CCI_CLK_RATE_37_5MHZ][I2C_MODE_STANDARD] = {
> +		.thigh = 201,
> +		.tlow = 174,
> +		.tsu_sto = 204,
> +		.tsu_sta = 231,
> +		.thd_dat = 22,
> +		.thd_sta = 162,
> +		.tbuf = 227,
> +		.scl_stretch_en = 0,
> +		.trdhld = 6,
> +		.tsp = 3
> +	},
> +	[CCI_CLK_RATE_37_5MHZ][I2C_MODE_FAST] = {
> +		.thigh = 38,
> +		.tlow = 56,
> +		.tsu_sto = 40,
> +		.tsu_sta = 40,
> +		.thd_dat = 22,
> +		.thd_sta = 35,
> +		.tbuf = 62,
> +		.scl_stretch_en = 0,
> +		.trdhld = 6,
> +		.tsp = 3
> +	},
> +	[CCI_CLK_RATE_37_5MHZ][I2C_MODE_FAST_PLUS] = {
> +		.thigh = 16,
> +		.tlow = 22,
> +		.tsu_sto = 17,
> +		.tsu_sta = 18,
> +		.thd_dat = 16,
> +		.thd_sta = 15,
> +		.tbuf = 24,
> +		.scl_stretch_en = 0,
> +		.trdhld = 3,
> +		.tsp = 3
> +	},
> +};
> +
>   static const struct hw_params *cci_get_hw_params(struct cci *cci, int mode)
>   {
>   	unsigned long rate = clk_get_rate(cci->cci_clk);
>   	int ri = cci_clk_rate_idx(rate);
>   
> -	if (ri >= 0 && cci->data->params[ri][mode].thigh)
> -		return &cci->data->params[ri][mode];
> +	if (ri >= 0 && mode <= cci->data->max_mode && cci_hw_params[ri][mode].thigh)

This earlier introduced sanity check for non-zero 'cci_hw_params[ri][mode].thigh'
is not needed anymore, right?

> +		return &cci_hw_params[ri][mode];
>   
>   	return NULL;
>   }
> @@ -696,30 +760,7 @@ static const struct cci_data cci_v1_data = {
>   		.max_write_len = 10,
>   		.max_read_len = 12,
>   	},
> -	.params[CCI_CLK_RATE_19_2MHZ][I2C_MODE_STANDARD] = {
> -		.thigh = 78,
> -		.tlow = 114,
> -		.tsu_sto = 28,
> -		.tsu_sta = 28,
> -		.thd_dat = 10,
> -		.thd_sta = 77,
> -		.tbuf = 118,
> -		.scl_stretch_en = 0,
> -		.trdhld = 6,
> -		.tsp = 1
> -	},
> -	.params[CCI_CLK_RATE_19_2MHZ][I2C_MODE_FAST] = {
> -		.thigh = 20,
> -		.tlow = 28,
> -		.tsu_sto = 21,
> -		.tsu_sta = 21,
> -		.thd_dat = 13,
> -		.thd_sta = 18,
> -		.tbuf = 32,
> -		.scl_stretch_en = 0,
> -		.trdhld = 6,
> -		.tsp = 3
> -	},
> +	.max_mode = I2C_MODE_FAST,
>   };
>   
>   static const struct cci_data cci_v1_5_data = {
> @@ -729,30 +770,7 @@ static const struct cci_data cci_v1_5_data = {
>   		.max_write_len = 10,
>   		.max_read_len = 12,
>   	},
> -	.params[CCI_CLK_RATE_19_2MHZ][I2C_MODE_STANDARD] = {
> -		.thigh = 78,
> -		.tlow = 114,
> -		.tsu_sto = 28,
> -		.tsu_sta = 28,
> -		.thd_dat = 10,
> -		.thd_sta = 77,
> -		.tbuf = 118,
> -		.scl_stretch_en = 0,
> -		.trdhld = 6,
> -		.tsp = 1
> -	},
> -	.params[CCI_CLK_RATE_19_2MHZ][I2C_MODE_FAST] = {
> -		.thigh = 20,
> -		.tlow = 28,
> -		.tsu_sto = 21,
> -		.tsu_sta = 21,
> -		.thd_dat = 13,
> -		.thd_sta = 18,
> -		.tbuf = 32,
> -		.scl_stretch_en = 0,
> -		.trdhld = 6,
> -		.tsp = 3
> -	},
> +	.max_mode = I2C_MODE_FAST,
>   };
>   
>   static const struct cci_data cci_v2_data = {
> @@ -762,66 +780,7 @@ static const struct cci_data cci_v2_data = {
>   		.max_write_len = 11,
>   		.max_read_len = 12,
>   	},
> -	.params[CCI_CLK_RATE_19_2MHZ][I2C_MODE_STANDARD] = {
> -		.thigh = 78,
> -		.tlow = 114,
> -		.tsu_sto = 28,
> -		.tsu_sta = 28,
> -		.thd_dat = 10,
> -		.thd_sta = 77,
> -		.tbuf = 118,
> -		.scl_stretch_en = 0,
> -		.trdhld = 6,
> -		.tsp = 1
> -	},
> -	.params[CCI_CLK_RATE_19_2MHZ][I2C_MODE_FAST] = {
> -		.thigh = 20,
> -		.tlow = 28,
> -		.tsu_sto = 21,
> -		.tsu_sta = 21,
> -		.thd_dat = 13,
> -		.thd_sta = 18,
> -		.tbuf = 32,
> -		.scl_stretch_en = 0,
> -		.trdhld = 6,
> -		.tsp = 3
> -	},
> -	.params[CCI_CLK_RATE_37_5MHZ][I2C_MODE_STANDARD] = {
> -		.thigh = 201,
> -		.tlow = 174,
> -		.tsu_sto = 204,
> -		.tsu_sta = 231,
> -		.thd_dat = 22,
> -		.thd_sta = 162,
> -		.tbuf = 227,
> -		.scl_stretch_en = 0,
> -		.trdhld = 6,
> -		.tsp = 3
> -	},
> -	.params[CCI_CLK_RATE_37_5MHZ][I2C_MODE_FAST] = {
> -		.thigh = 38,
> -		.tlow = 56,
> -		.tsu_sto = 40,
> -		.tsu_sta = 40,
> -		.thd_dat = 22,
> -		.thd_sta = 35,
> -		.tbuf = 62,
> -		.scl_stretch_en = 0,
> -		.trdhld = 6,
> -		.tsp = 3
> -	},
> -	.params[CCI_CLK_RATE_37_5MHZ][I2C_MODE_FAST_PLUS] = {
> -		.thigh = 16,
> -		.tlow = 22,
> -		.tsu_sto = 17,
> -		.tsu_sta = 18,
> -		.thd_dat = 16,
> -		.thd_sta = 15,
> -		.tbuf = 24,
> -		.scl_stretch_en = 0,
> -		.trdhld = 3,
> -		.tsp = 3
> -	},
> +	.max_mode = I2C_MODE_FAST_PLUS,
>   };
>   
>   static const struct of_device_id cci_dt_match[] = {
> 

-- 
Best wishes,
Vladimir
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.