Hello Samuel,

On 22.08.21 19:19, Samuel Holland wrote:
> Hi Heiko,
> 
> On 8/22/21 3:38 AM, Heiko Schocher wrote:
>> Hello Samuel,
>>
>> On 22.08.21 01:05, Samuel Holland wrote:
>>> This bus controller is used to communicate with an X-Powers AXP PMIC.
>>> Currently, various drivers access PMIC registers through a platform-
>>> specific non-DM "pmic_bus" interface, which depends on the legacy I2C
>>> framework. In order to convert those drivers to use DM_PMIC, this bus
>>> needs a DM_I2C driver.
>>>
>>> Since the non-DM bus controller driver is still needed in SPL, the quick
>>> solution is to implement the DM_I2C ops using the existing functions.
>>>
>>> The register for switching between I2C/P2WI/RSB mode is the same across
>>> all PMIC variants, so move that to the common header.
>>>
>>> Signed-off-by: Samuel Holland <sam...@sholland.org>
>>> ---
>>>
>>>  arch/arm/mach-sunxi/Kconfig    | 11 ------
>>>  arch/arm/mach-sunxi/pmic_bus.c |  7 ++--
>>>  drivers/i2c/Kconfig            |  8 +++++
>>>  drivers/i2c/Makefile           |  1 +
>>>  drivers/i2c/sun6i_p2wi.c       | 66 ++++++++++++++++++++++++++++++++++
>>
>> I wonder, as this config symbol gets also removed, that there
>> is no remove of driver code?
> 
> I did not remove any config symbol, only moved it to a different file.

Yes, and you add "drivers/i2c/sun6i_p2wi.c", and nowhere code is removed,
which is enabled by this config symbol... was the config symbol not used
before?

Ah, I see, you use code from arch/arm/mach-sunxi/p2wi.c...

Shouldn;t this be moved than to drivers/i2c too? Only i2c driver use
this functions ... or?

(Hope it is not to dummy question...)

> It sounds like you want me to use a new symbol for the DM_I2C driver
> (SYS_I2C_SUN6I_P2WI). So in that case, I would leave the old symbol
> alone, and have SYS_I2C_SUN6I_P2WI select it.

Hmm.. better to move the whole code to dirvers/i2c ?

> 
>>>  include/axp_pmic.h             |  6 ++++
>>>  6 files changed, 84 insertions(+), 15 deletions(-)
>>>  create mode 100644 drivers/i2c/sun6i_p2wi.c
>>>
>>> diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig
>>> index 79c669a4813..37076c2dfb3 100644
>>> --- a/arch/arm/mach-sunxi/Kconfig
>>> +++ b/arch/arm/mach-sunxi/Kconfig
>>> @@ -88,17 +88,6 @@ config DRAM_SUN50I_H616_UNKNOWN_FEATURE
>>>       feature.
>>>  endif
>>>  
>>> -config SUN6I_P2WI
>>> -   bool "Allwinner sun6i internal P2WI controller"
>>> -   help
>>> -     If you say yes to this option, support will be included for the
>>> -     P2WI (Push/Pull 2 Wire Interface) controller embedded in some sunxi
>>> -     SOCs.
>>> -     The P2WI looks like an SMBus controller (which supports only byte
>>> -     accesses), except that it only supports one slave device.
>>> -     This interface is used to connect to specific PMIC devices (like the
>>> -     AXP221).
>>> -
>>>  config SUN6I_PRCM
>>>     bool
>>>     help
>>> diff --git a/arch/arm/mach-sunxi/pmic_bus.c b/arch/arm/mach-sunxi/pmic_bus.c
>>> index 0394ce85644..673a05fdd16 100644
>>> --- a/arch/arm/mach-sunxi/pmic_bus.c
>>> +++ b/arch/arm/mach-sunxi/pmic_bus.c
>>> @@ -8,6 +8,7 @@
>>>   * axp223 uses the rsb bus, these functions abstract this.
>>>   */
>>>  
>>> +#include <axp_pmic.h>
>>>  #include <common.h>
>>>  #include <asm/arch/p2wi.h>
>>>  #include <asm/arch/rsb.h>
>>> @@ -21,8 +22,6 @@
>>>  #define AXP305_I2C_ADDR                    0x36
>>>  
>>>  #define AXP221_CHIP_ADDR           0x68
>>> -#define AXP221_CTRL_ADDR           0x3e
>>> -#define AXP221_INIT_DATA           0x3e
>>>  
>>>  /* AXP818 device and runtime addresses are same as AXP223 */
>>>  #define AXP223_DEVICE_ADDR         0x3a3
>>> @@ -40,8 +39,8 @@ int pmic_bus_init(void)
>>>  #if defined CONFIG_AXP221_POWER || defined CONFIG_AXP809_POWER || defined 
>>> CONFIG_AXP818_POWER
>>>  # ifdef CONFIG_MACH_SUN6I
>>>     p2wi_init();
>>> -   ret = p2wi_change_to_p2wi_mode(AXP221_CHIP_ADDR, AXP221_CTRL_ADDR,
>>> -                                  AXP221_INIT_DATA);
>>> +   ret = p2wi_change_to_p2wi_mode(AXP221_CHIP_ADDR, AXP_PMIC_MODE_REG,
>>> +                                  AXP_PMIC_MODE_P2WI);
>>>  # elif defined CONFIG_MACH_SUN8I_R40
>>>     /* Nothing. R40 uses the AXP221s in I2C mode */
>>>     ret = 0;
>>> diff --git a/drivers/i2c/Kconfig b/drivers/i2c/Kconfig
>>> index 5d27f503bfc..d082676c4b2 100644
>>> --- a/drivers/i2c/Kconfig
>>> +++ b/drivers/i2c/Kconfig
>>> @@ -577,6 +577,14 @@ config SYS_I2C_STM32F7
>>>        _ Optional clock stretching
>>>        _ Software reset
>>>  
>>> +config SUN6I_P2WI
>>
>> Could you please use "SYS_I2C_" ?
>>
>>> +   bool "Allwinner sun6i P2WI controller"
>>> +   depends on ARCH_SUNXI
>>> +   help
>>> +     Support for the P2WI (Push/Pull 2 Wire Interface) controller embedded
>>> +     in the Allwinner A31 and A31s SOCs. This interface is used to connect
>>> +     to specific devices like the X-Powers AXP221 PMIC.
>>> +
>>>  config SYNQUACER
>>>     bool "Socionext SynQuacer I2C controller"
>>>     depends on ARCH_SYNQUACER && DM_I2C
>>> diff --git a/drivers/i2c/Makefile b/drivers/i2c/Makefile
>>> index 3a7ecd9274b..2461f0a2db8 100644
>>> --- a/drivers/i2c/Makefile
>>> +++ b/drivers/i2c/Makefile
>>> @@ -43,6 +43,7 @@ obj-$(CONFIG_SYS_I2C_SANDBOX) += sandbox_i2c.o 
>>> i2c-emul-uclass.o
>>>  obj-$(CONFIG_SYS_I2C_SH) += sh_i2c.o
>>>  obj-$(CONFIG_SYS_I2C_SOFT) += soft_i2c.o
>>>  obj-$(CONFIG_SYS_I2C_STM32F7) += stm32f7_i2c.o
>>> +obj-$(CONFIG_SUN6I_P2WI) += sun6i_p2wi.o
>>
>> please sort alphabetical.
> 
> I was sorting by file name -- this will be fixed by renaming the config
> symbol.

we sort by config symbol.

bye,
Heiko
> 
> Regards,
> Samuel
> 
>>>  obj-$(CONFIG_SYS_I2C_SYNQUACER) += synquacer_i2c.o
>>>  obj-$(CONFIG_SYS_I2C_TEGRA) += tegra_i2c.o
>>>  obj-$(CONFIG_SYS_I2C_UNIPHIER) += i2c-uniphier.o
>>> diff --git a/drivers/i2c/sun6i_p2wi.c b/drivers/i2c/sun6i_p2wi.c
>>> new file mode 100644
>>> index 00000000000..f1e8e5ed107
>>> --- /dev/null
>>> +++ b/drivers/i2c/sun6i_p2wi.c
>>> @@ -0,0 +1,66 @@
>>> +// SPDX-License-Identifier: GPL-2.0+
>>> +
>>> +#include <axp_pmic.h>
>>> +#include <dm.h>
>>> +#include <i2c.h>
>>> +#include <asm/arch/p2wi.h>
>>> +
>>> +#if CONFIG_IS_ENABLED(DM_I2C)
>>> +
>>> +static int sun6i_p2wi_xfer(struct udevice *bus, struct i2c_msg *msg, int 
>>> nmsgs)
>>> +{
>>> +   /* The hardware only supports SMBus-style transfers. */
>>> +   if (nmsgs == 2 && msg[1].flags == I2C_M_RD && msg[1].len == 1)
>>> +           return p2wi_read(msg[0].buf[0], msg[1].buf);
>>> +
>>> +   if (nmsgs == 1 && msg[0].len == 2)
>>> +           return p2wi_write(msg[0].buf[0], msg[0].buf[1]);
>>> +
>>> +   return -EINVAL;
>>> +}
>>> +
>>> +static int sun6i_p2wi_probe_chip(struct udevice *bus, uint chip_addr,
>>> +                            uint chip_flags)
>>> +{
>>> +   return p2wi_change_to_p2wi_mode(chip_addr,
>>> +                                   AXP_PMIC_MODE_REG,
>>> +                                   AXP_PMIC_MODE_P2WI);
>>> +}
>>> +
>>> +static int sun6i_p2wi_probe(struct udevice *bus)
>>> +{
>>> +   p2wi_init();
>>> +
>>> +   return 0;
>>> +}
>>> +
>>> +static int sun6i_p2wi_child_pre_probe(struct udevice *child)
>>> +{
>>> +   struct dm_i2c_chip *chip = dev_get_parent_plat(child);
>>> +
>>> +   /* Ensure each transfer is for a single register. */
>>> +   chip->flags |= DM_I2C_CHIP_RD_ADDRESS | DM_I2C_CHIP_WR_ADDRESS;
>>> +
>>> +   return 0;
>>> +}
>>> +
>>> +static const struct dm_i2c_ops sun6i_p2wi_ops = {
>>> +   .xfer           = sun6i_p2wi_xfer,
>>> +   .probe_chip     = sun6i_p2wi_probe_chip,
>>> +};
>>> +
>>> +static const struct udevice_id sun6i_p2wi_ids[] = {
>>> +   { .compatible = "allwinner,sun6i-a31-p2wi" },
>>> +   { /* sentinel */ }
>>> +};
>>> +
>>> +U_BOOT_DRIVER(sun6i_p2wi) = {
>>> +   .name                   = "sun6i_p2wi",
>>> +   .id                     = UCLASS_I2C,
>>> +   .of_match               = sun6i_p2wi_ids,
>>> +   .probe                  = sun6i_p2wi_probe,
>>> +   .child_pre_probe        = sun6i_p2wi_child_pre_probe,
>>> +   .ops                    = &sun6i_p2wi_ops,
>>> +};
>>> +
>>> +#endif /* CONFIG_IS_ENABLED(DM_I2C) */
>>> diff --git a/include/axp_pmic.h b/include/axp_pmic.h
>>> index 405044c3a32..0db3e143eda 100644
>>> --- a/include/axp_pmic.h
>>> +++ b/include/axp_pmic.h
>>> @@ -6,6 +6,8 @@
>>>   */
>>>  #ifndef _AXP_PMIC_H_
>>>  
>>> +#include <stdbool.h>
>>> +
>>>  #ifdef CONFIG_AXP152_POWER
>>>  #include <axp152.h>
>>>  #endif
>>> @@ -25,6 +27,10 @@
>>>  #include <axp818.h>
>>>  #endif
>>>  
>>> +#define AXP_PMIC_MODE_REG          0x3e
>>> +#define AXP_PMIC_MODE_I2C          0x00
>>> +#define AXP_PMIC_MODE_P2WI         0x3e
>>> +
>>>  int axp_set_dcdc1(unsigned int mvolt);
>>>  int axp_set_dcdc2(unsigned int mvolt);
>>>  int axp_set_dcdc3(unsigned int mvolt);
>>>
>>
>> Beside of the nitpicks:
>> Reviewed-by: Heiko Schocher <h...@denx.de>
>>
>> Thanks!
>>
>> bye,
>> Heiko
>>

-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-52   Fax: +49-8142-66989-80   Email: h...@denx.de

Reply via email to