RE: [PATCH 3/8] i2c: img-scb: fix LOW and HIGH period values for the SCL clock

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Please ignore this series. Sorry for the inconvenience.

Will send a new patch series after it has been reviewed internally.

Sifan

> -----Original Message-----
> From: Sifan Naeem
> Sent: 10 July 2015 16:12
> To: James Hogan; IMG - IMGWorks Software Upstream Review
> Cc: Sifan Naeem; stable@xxxxxxxxxxxxxxx
> Subject: [PATCH 3/8] i2c: img-scb: fix LOW and HIGH period values for the SCL
> clock
> 
> After determining the minimum value for the High period (TCKH) the
> remainder of the internal clock pulses is set as the Low period (TCKL).
> This causes the i2c clock duty cycle to be much less than 50%.
> 
> The fix suggested here, start with TCKH and TCKL at 50% of the internal clock
> pulses and adjusts the TCKH and TCKL values from there if the minimum
> value for TCKL is not met. This will make sure the i2c clock duty cycle is at 50%
> or close 50% whenever possible.
> 
> Fixes: 27bce457d588 (i2c: img-scb: Add Imagination Technologies I2C SCB
> driver)
> Signed-off-by: Sifan Naeem <sifan.naeem@xxxxxxxxxx>
> Cc: <stable@xxxxxxxxxxxxxxx>
> ---
>  drivers/i2c/busses/i2c-img-scb.c |   37 +++++++++++++++++++++-------------
> ---
>  1 file changed, 21 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/i2c/busses/i2c-img-scb.c b/drivers/i2c/busses/i2c-img-
> scb.c
> index 42114a8..fa643d7 100644
> --- a/drivers/i2c/busses/i2c-img-scb.c
> +++ b/drivers/i2c/busses/i2c-img-scb.c
> @@ -1182,27 +1182,32 @@ static int img_i2c_init(struct img_i2c *i2c)
>  	    ((bitrate_khz * clk_period) / 2))
>  		int_bitrate++;
> 
> -	/* Setup TCKH value */
> -	tckh = timing.tckh / clk_period;
> -	if (timing.tckh % clk_period)
> -		tckh++;
> +	/*
> +	 * Setup clock duty cycle, start with 50% and adjust TCKH and TCKL
> +	 * values from there if they don't meet minimum timing
> requirements
> +	 */
> +	tckh = tckl = int_bitrate / 2;
> +	if (int_bitrate % 2)
> +		tckl++;
> +
> +	/* Adjust TCKH and TCKL values */
> +	data = timing.tckl / clk_period;
> +	if (timing.tckl % clk_period)
> +		data++;
> +
> +	if (tckl < data) {
> +		tckl = data;
> +		tckh = int_bitrate - tckl;
> +	}
> 
>  	if (tckh > 0)
> -		data = tckh - 1;
> -	else
> -		data = 0;
> -
> -	img_i2c_writel(i2c, SCB_TIME_TCKH_REG, data);
> -
> -	/* Setup TCKL value */
> -	tckl = int_bitrate - tckh;
> +		tckh -= 1;
> 
>  	if (tckl > 0)
> -		data = tckl - 1;
> -	else
> -		data = 0;
> +		tckl -= 1;
> 
> -	img_i2c_writel(i2c, SCB_TIME_TCKL_REG, data);
> +	img_i2c_writel(i2c, SCB_TIME_TCKH_REG, tckh);
> +	img_i2c_writel(i2c, SCB_TIME_TCKL_REG, tckl);
> 
>  	/* Setup TSDH value */
>  	tsdh = timing.tsdh / clk_period;
> --
> 1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]