mbox series

[v5,0/5] Add support for HiSilicon I2C controller

Message ID 1617113966-40498-1-git-send-email-yangyicong@hisilicon.com
Headers show
Series Add support for HiSilicon I2C controller | expand

Message

Yicong Yang March 30, 2021, 2:19 p.m. UTC
Add driver and MAINTAINERS for HiSilicon I2C controller on Kunpeng SoC. Also
provide the devm_*() variants for adding the I2C adapters. Add a public
api to provide I2C frequency mode strings and convert designware driver
to use it.

Change since v4:
- and Andy's review-by
- attach Andy's patch of switch designware driver to use i2c_freq_mode_string()
Link: https://lore.kernel.org/linux-i2c/1617109549-4013-1-git-send-email-yangyicong@hisilicon.com/
Link: https://lore.kernel.org/linux-i2c/20210330134633.29889-1-andriy.shevchenko@linux.intel.com/

Change since v3:
- split the bus mode string api to I2C as suggested by Andy
- simplify the devm variants and change the export format
- address the comments of the HiSilicon I2C driver from Andy and Dmitry, thanks!
Link: https://lore.kernel.org/linux-i2c/1616411413-7177-1-git-send-email-yangyicong@hisilicon.com/

Change since v2:
- handle -EPROBE_DEFER case when get irq number by platform_get_irq()
Link: https://lore.kernel.org/linux-i2c/1615296137-14558-1-git-send-email-yangyicong@hisilicon.com/

Change since v1:
- fix compile test error on 32bit arch, reported by intel lkp robot:
  64 bit division without using kernel wrapper in probe function.
Link:https://lore.kernel.org/linux-i2c/1615016946-55670-1-git-send-email-yangyicong@hisilicon.com/

Andy Shevchenko (1):
  i2c: designware: Switch over to i2c_freq_mode_string()

Yicong Yang (4):
  i2c: core: add managed function for adding i2c adapters
  i2c: core: add api to provide frequency mode strings
  i2c: add support for HiSilicon I2C controller
  MAINTAINERS: Add maintainer for HiSilicon I2C driver

 MAINTAINERS                                |   7 +
 drivers/i2c/busses/Kconfig                 |  10 +
 drivers/i2c/busses/Makefile                |   1 +
 drivers/i2c/busses/i2c-designware-master.c |  20 +-
 drivers/i2c/busses/i2c-hisi.c              | 506 +++++++++++++++++++++++++++++
 drivers/i2c/i2c-core-base.c                |  26 ++
 include/linux/i2c.h                        |  21 ++
 7 files changed, 575 insertions(+), 16 deletions(-)
 create mode 100644 drivers/i2c/busses/i2c-hisi.c

Comments

Dmitry Osipenko March 30, 2021, 4:28 p.m. UTC | #1
30.03.2021 17:19, Yicong Yang пишет:
> Some I2C controller drivers will only unregister the I2C
> adapter in their .remove() callback, which can be done
> by simply using a managed variant to add the I2C adapter.
> 
> So add the managed functions for adding the I2C adapter.
> 
> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
> ---
>  drivers/i2c/i2c-core-base.c | 26 ++++++++++++++++++++++++++
>  include/linux/i2c.h         |  1 +
>  2 files changed, 27 insertions(+)
> 
> diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
> index 63ebf72..de9402c 100644
> --- a/drivers/i2c/i2c-core-base.c
> +++ b/drivers/i2c/i2c-core-base.c
> @@ -1703,6 +1703,32 @@ void i2c_del_adapter(struct i2c_adapter *adap)
>  }
>  EXPORT_SYMBOL(i2c_del_adapter);
>  
> +static void devm_i2c_del_adapter(void *adapter)
> +{
> +	i2c_del_adapter(adapter);
> +}
> +
> +/**
> + * devm_i2c_add_adapter - device-managed variant of i2c_add_adapter()
> + * @dev: managing device for adding this I2C adapter
> + * @adapter: the adapter to add
> + * Context: can sleep
> + *
> + * Add adapter with dynamic bus number, same with i2c_add_adapter()
> + * but the adapter will be auto deleted on driver detach.
> + */
> +int devm_i2c_add_adapter(struct device *dev, struct i2c_adapter *adapter)
> +{
> +	int ret;
> +
> +	ret = i2c_add_adapter(adapter);
> +	if (ret)
> +		return ret;
> +
> +	return devm_add_action_or_reset(dev, devm_i2c_del_adapter, adapter);
> +}
> +EXPORT_SYMBOL_GPL(devm_i2c_add_adapter);
> +
>  static void i2c_parse_timing(struct device *dev, char *prop_name, u32 *cur_val_p,
>  			    u32 def_val, bool use_def)
>  {
> diff --git a/include/linux/i2c.h b/include/linux/i2c.h
> index 5662265..10bd0b0 100644
> --- a/include/linux/i2c.h
> +++ b/include/linux/i2c.h
> @@ -844,6 +844,7 @@ static inline void i2c_mark_adapter_resumed(struct i2c_adapter *adap)
>   */
>  #if IS_ENABLED(CONFIG_I2C)
>  int i2c_add_adapter(struct i2c_adapter *adap);
> +int devm_i2c_add_adapter(struct device *dev, struct i2c_adapter *adapter);
>  void i2c_del_adapter(struct i2c_adapter *adap);
>  int i2c_add_numbered_adapter(struct i2c_adapter *adap);
>  
> 

Reviewed-by: Dmitry Osipenko <digetx@gmail.com>
Jarkko Nikula March 31, 2021, 8:35 a.m. UTC | #2
Hi

On 3/30/21 5:19 PM, Yicong Yang wrote:
> Some I2C drivers like Designware and HiSilicon will print the

> bus frequency mode information, so add a public one that everyone

> can make use of.

> 

> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

> Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>

> ---

>   include/linux/i2c.h | 20 ++++++++++++++++++++

>   1 file changed, 20 insertions(+)

> 

> diff --git a/include/linux/i2c.h b/include/linux/i2c.h

> index 10bd0b0..6837e64 100644

> --- a/include/linux/i2c.h

> +++ b/include/linux/i2c.h

> @@ -47,6 +47,26 @@ typedef int (*i2c_slave_cb_t)(struct i2c_client *client,

>   #define I2C_MAX_HIGH_SPEED_MODE_FREQ	3400000

>   #define I2C_MAX_ULTRA_FAST_MODE_FREQ	5000000

>   

> +static inline const char *i2c_freq_mode_string(u32 bus_freq_hz)

> +{

> +	switch (bus_freq_hz) {

> +	case I2C_MAX_STANDARD_MODE_FREQ:

> +		return "Standard Mode(100KHz)";

> +	case I2C_MAX_FAST_MODE_FREQ:

> +		return "Fast Mode(400KHz)";

> +	case I2C_MAX_FAST_MODE_PLUS_FREQ:

> +		return "Fast Mode Plus(1.0MHz)";

> +	case I2C_MAX_TURBO_MODE_FREQ:

> +		return "Turbo Mode(1.4MHz)";

> +	case I2C_MAX_HIGH_SPEED_MODE_FREQ:

> +		return "High Speed Mode(3.4MHz)";

> +	case I2C_MAX_ULTRA_FAST_MODE_FREQ:

> +		return "Ultra Fast Mode(5.0MHz)";

> +	default:

> +		return "Unknown Mode";

> +	}


A few minor nits here:
- KHz -> kHz
- Space between text and opening parenthesis: "Mode(" -> "Mode ("
- Space between number and unit: (1.0MHz) -> (1.0 MHz)

With those changes you may add my

Reviewed-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>

Tested-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
Yicong Yang March 31, 2021, 1:03 p.m. UTC | #3
On 2021/3/31 16:35, Jarkko Nikula wrote:
> Hi

> 

> On 3/30/21 5:19 PM, Yicong Yang wrote:

>> Some I2C drivers like Designware and HiSilicon will print the

>> bus frequency mode information, so add a public one that everyone

>> can make use of.

>>

>> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

>> Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>

>> ---

>>   include/linux/i2c.h | 20 ++++++++++++++++++++

>>   1 file changed, 20 insertions(+)

>>

>> diff --git a/include/linux/i2c.h b/include/linux/i2c.h

>> index 10bd0b0..6837e64 100644

>> --- a/include/linux/i2c.h

>> +++ b/include/linux/i2c.h

>> @@ -47,6 +47,26 @@ typedef int (*i2c_slave_cb_t)(struct i2c_client *client,

>>   #define I2C_MAX_HIGH_SPEED_MODE_FREQ    3400000

>>   #define I2C_MAX_ULTRA_FAST_MODE_FREQ    5000000

>>   +static inline const char *i2c_freq_mode_string(u32 bus_freq_hz)

>> +{

>> +    switch (bus_freq_hz) {

>> +    case I2C_MAX_STANDARD_MODE_FREQ:

>> +        return "Standard Mode(100KHz)";

>> +    case I2C_MAX_FAST_MODE_FREQ:

>> +        return "Fast Mode(400KHz)";

>> +    case I2C_MAX_FAST_MODE_PLUS_FREQ:

>> +        return "Fast Mode Plus(1.0MHz)";

>> +    case I2C_MAX_TURBO_MODE_FREQ:

>> +        return "Turbo Mode(1.4MHz)";

>> +    case I2C_MAX_HIGH_SPEED_MODE_FREQ:

>> +        return "High Speed Mode(3.4MHz)";

>> +    case I2C_MAX_ULTRA_FAST_MODE_FREQ:

>> +        return "Ultra Fast Mode(5.0MHz)";

>> +    default:

>> +        return "Unknown Mode";

>> +    }

> 

> A few minor nits here:

> - KHz -> kHz

> - Space between text and opening parenthesis: "Mode(" -> "Mode ("

> - Space between number and unit: (1.0MHz) -> (1.0 MHz)


will address. thanks!

> 

> With those changes you may add my

> 

> Reviewed-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>

> Tested-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>

> .