Plese, write the short summary as

tpm: Make read{16, 32}() and write32() in tpm_tis_phy_ops optional

On Tue, May 26, 2020 at 05:16:51PM +0300, amirmi...@gmail.com wrote:
> From: Amir Mizinski <amirmi...@gmail.com>
> 
> Only tpm_tis can use memory-mapped I/O, which is truly mapped into
> the kernel's memory space. Therefore, using ioread16/ioread32/iowrite32
> turns into a straightforward pointer dereference.
> Every other driver requires more complicated operations to read more than
> one byte at a time and will just fall back to read_bytes/write_bytes.
> Therefore, move this common code out of tpm_tis_spi and into tpm_tis_core
> so that it is used automatically when low-level drivers do not implement
> the specialized methods.
> 
> Co-developed-by: Alexander Steffen <alexander.stef...@infineon.com>
> Signed-off-by: Alexander Steffen <alexander.stef...@infineon.com>
> Signed-off-by: Amir Mizinski <amirmi...@gmail.com>
> ---
>  drivers/char/tpm/tpm_tis_core.h     | 38 +++++++++++++++++++++++++++++++---
>  drivers/char/tpm/tpm_tis_spi.h      |  4 ----
>  drivers/char/tpm/tpm_tis_spi_cr50.c |  3 ---
>  drivers/char/tpm/tpm_tis_spi_main.c | 41 
> -------------------------------------
>  4 files changed, 35 insertions(+), 51 deletions(-)
> 
> diff --git a/drivers/char/tpm/tpm_tis_core.h b/drivers/char/tpm/tpm_tis_core.h
> index 7337819..d06c65b 100644
> --- a/drivers/char/tpm/tpm_tis_core.h
> +++ b/drivers/char/tpm/tpm_tis_core.h
> @@ -122,13 +122,35 @@ static inline int tpm_tis_read8(struct tpm_tis_data 
> *data, u32 addr, u8 *result)
>  static inline int tpm_tis_read16(struct tpm_tis_data *data, u32 addr,
>                                u16 *result)
>  {
> -     return data->phy_ops->read16(data, addr, result);
> +     __le16 result_le;
> +     int rc;
> +
> +     if (data->phy_ops->read16)
> +             return data->phy_ops->read16(data, addr, result);
> +
> +     rc = data->phy_ops->read_bytes(data, addr, sizeof(u16),
> +                                    (u8 *)&result_le);
> +     if (!rc)
> +             *result = le16_to_cpu(result_le);
> +
> +     return rc;
>  }
>  
>  static inline int tpm_tis_read32(struct tpm_tis_data *data, u32 addr,
>                                u32 *result)
>  {
> -     return data->phy_ops->read32(data, addr, result);
> +     __le32 result_le;
> +     int rc;
> +
> +     if (data->phy_ops->read32)
> +             return data->phy_ops->read32(data, addr, result);
> +
> +     rc = data->phy_ops->read_bytes(data, addr, sizeof(u32),
> +                                    (u8 *)&result_le);
> +     if (!rc)
> +             *result = le32_to_cpu(result_le);
> +
> +     return rc;
>  }
>  
>  static inline int tpm_tis_write_bytes(struct tpm_tis_data *data, u32 addr,
> @@ -145,7 +167,17 @@ static inline int tpm_tis_write8(struct tpm_tis_data 
> *data, u32 addr, u8 value)
>  static inline int tpm_tis_write32(struct tpm_tis_data *data, u32 addr,
>                                 u32 value)
>  {
> -     return data->phy_ops->write32(data, addr, value);
> +     __le32 value_le;
> +     int rc;
> +
> +     if (data->phy_ops->write32)
> +             return data->phy_ops->write32(data, addr, value);
> +
> +     value_le = cpu_to_le32(value);
> +     rc = data->phy_ops->write_bytes(data, addr, sizeof(u32),
> +                                     (u8 *)&value_le);
> +
> +     return rc;
>  }
>  
>  static inline bool is_bsw(void)
> diff --git a/drivers/char/tpm/tpm_tis_spi.h b/drivers/char/tpm/tpm_tis_spi.h
> index bba7397..d0f66f6 100644
> --- a/drivers/char/tpm/tpm_tis_spi.h
> +++ b/drivers/char/tpm/tpm_tis_spi.h
> @@ -31,10 +31,6 @@ extern int tpm_tis_spi_init(struct spi_device *spi, struct 
> tpm_tis_spi_phy *phy,
>  extern int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u16 len,
>                               u8 *in, const u8 *out);
>  
> -extern int tpm_tis_spi_read16(struct tpm_tis_data *data, u32 addr, u16 
> *result);
> -extern int tpm_tis_spi_read32(struct tpm_tis_data *data, u32 addr, u32 
> *result);
> -extern int tpm_tis_spi_write32(struct tpm_tis_data *data, u32 addr, u32 
> value);
> -
>  #ifdef CONFIG_TCG_TIS_SPI_CR50
>  extern int cr50_spi_probe(struct spi_device *spi);
>  #else
> diff --git a/drivers/char/tpm/tpm_tis_spi_cr50.c 
> b/drivers/char/tpm/tpm_tis_spi_cr50.c
> index 37d72e8..f339d20 100644
> --- a/drivers/char/tpm/tpm_tis_spi_cr50.c
> +++ b/drivers/char/tpm/tpm_tis_spi_cr50.c
> @@ -215,9 +215,6 @@ static int tpm_tis_spi_cr50_write_bytes(struct 
> tpm_tis_data *data, u32 addr,
>  static const struct tpm_tis_phy_ops tpm_spi_cr50_phy_ops = {
>       .read_bytes = tpm_tis_spi_cr50_read_bytes,
>       .write_bytes = tpm_tis_spi_cr50_write_bytes,
> -     .read16 = tpm_tis_spi_read16,
> -     .read32 = tpm_tis_spi_read32,
> -     .write32 = tpm_tis_spi_write32,
>  };
>  
>  static void cr50_print_fw_version(struct tpm_tis_data *data)
> diff --git a/drivers/char/tpm/tpm_tis_spi_main.c 
> b/drivers/char/tpm/tpm_tis_spi_main.c
> index d1754fd..95fef9d 100644
> --- a/drivers/char/tpm/tpm_tis_spi_main.c
> +++ b/drivers/char/tpm/tpm_tis_spi_main.c
> @@ -152,44 +152,6 @@ static int tpm_tis_spi_write_bytes(struct tpm_tis_data 
> *data, u32 addr,
>       return tpm_tis_spi_transfer(data, addr, len, NULL, value);
>  }
>  
> -int tpm_tis_spi_read16(struct tpm_tis_data *data, u32 addr, u16 *result)
> -{
> -     __le16 result_le;
> -     int rc;
> -
> -     rc = data->phy_ops->read_bytes(data, addr, sizeof(u16),
> -                                    (u8 *)&result_le);
> -     if (!rc)
> -             *result = le16_to_cpu(result_le);
> -
> -     return rc;
> -}
> -
> -int tpm_tis_spi_read32(struct tpm_tis_data *data, u32 addr, u32 *result)
> -{
> -     __le32 result_le;
> -     int rc;
> -
> -     rc = data->phy_ops->read_bytes(data, addr, sizeof(u32),
> -                                    (u8 *)&result_le);
> -     if (!rc)
> -             *result = le32_to_cpu(result_le);
> -
> -     return rc;
> -}
> -
> -int tpm_tis_spi_write32(struct tpm_tis_data *data, u32 addr, u32 value)
> -{
> -     __le32 value_le;
> -     int rc;
> -
> -     value_le = cpu_to_le32(value);
> -     rc = data->phy_ops->write_bytes(data, addr, sizeof(u32),
> -                                     (u8 *)&value_le);
> -
> -     return rc;
> -}
> -
>  int tpm_tis_spi_init(struct spi_device *spi, struct tpm_tis_spi_phy *phy,
>                    int irq, const struct tpm_tis_phy_ops *phy_ops)
>  {
> @@ -205,9 +167,6 @@ int tpm_tis_spi_init(struct spi_device *spi, struct 
> tpm_tis_spi_phy *phy,
>  static const struct tpm_tis_phy_ops tpm_spi_phy_ops = {
>       .read_bytes = tpm_tis_spi_read_bytes,
>       .write_bytes = tpm_tis_spi_write_bytes,
> -     .read16 = tpm_tis_spi_read16,
> -     .read32 = tpm_tis_spi_read32,
> -     .write32 = tpm_tis_spi_write32,
>  };
>  
>  static int tpm_tis_spi_probe(struct spi_device *dev)
> -- 
> 2.7.4

Other than that looks good.

/Jarkko
> 

Reply via email to