[PATCH linux dev-4.13 3/6] fsi/fsi-master-gpio: Sample input data on different clock phase

Christopher Bostic cbostic at linux.vnet.ibm.com
Wed May 9 02:42:50 AEST 2018


Reviewed-by: Christopher Bostic <cbostic at linux.vnet.ibm.com>

On 5/7/18 8:06 PM, Benjamin Herrenschmidt wrote:
> We currently sample the input data right after we toggle the
> clock low, then high. The slave establishes the data on the
> rising edge, so this is not ideal. We should sample it on
> the low phase instead.
>
> This currently works because we have an extra delay, but subsequent
> patches will remove it.
>
> Signed-off-by: Benjamin Herrenschmidt <benh at kernel.crashing.org>
> ---
>   drivers/fsi/fsi-master-gpio.c | 8 +++++---
>   1 file changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/fsi/fsi-master-gpio.c b/drivers/fsi/fsi-master-gpio.c
> index 4295a46780cb..d6508bbad1fb 100644
> --- a/drivers/fsi/fsi-master-gpio.c
> +++ b/drivers/fsi/fsi-master-gpio.c
> @@ -86,12 +86,15 @@ static void clock_toggle(struct fsi_master_gpio *master, int count)
>   	}
>   }
>
> -static int sda_in(struct fsi_master_gpio *master)
> +static int sda_clock_in(struct fsi_master_gpio *master)
>   {
>   	int in;
>
>   	ndelay(FSI_GPIO_STD_DLY);
> +	gpiod_set_value(master->gpio_clk, 0);
>   	in = gpiod_get_value(master->gpio_data);
> +	ndelay(FSI_GPIO_STD_DLY);
> +	gpiod_set_value(master->gpio_clk, 1);
>   	return in ? 1 : 0;
>   }
>
> @@ -126,8 +129,7 @@ static void serial_in(struct fsi_master_gpio *master, struct fsi_gpio_msg *msg,
>   	set_sda_input(master);
>
>   	for (bit = 0; bit < num_bits; bit++) {
> -		clock_toggle(master, 1);
> -		in_bit = sda_in(master);
> +		in_bit = sda_clock_in(master);
>   		msg->msg <<= 1;
>   		msg->msg |= ~in_bit & 0x1;	/* Data is active low */
>   	}



More information about the openbmc mailing list