[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