Re: [PATCH] mfd: twl: fix TWL6032 phy vbus detection

From: Lee Jones
Date: Thu Dec 08 2022 - 07:29:21 EST


On Sat, 19 Nov 2022, Andreas Kemnade wrote:

> TWL6032 has a few charging registers prepended before the charging
> registers the TWL6030 has. To be able to use common register defines
> declare the additional registers as additional module.
> At the moment this affects the access to CHARGERUSB_CTRL1 in
> phy-twl6030-usb. Without this patch, it is accessing the wrong register
> on TWL6032.
> The consequence is that presence of Vbus is not reported.
>
> Cc: Bin Liu <b-liu@xxxxxx>
> Cc: Tony Lindgren <tony@xxxxxxxxxxx>
> Signed-off-by: Andreas Kemnade <andreas@xxxxxxxxxxxx>
> ---
> drivers/mfd/twl-core.c | 8 ++++----
> include/linux/mfd/twl.h | 2 ++
> 2 files changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c
> index f6b4b9d94bbd..5a7ed71d0e30 100644
> --- a/drivers/mfd/twl-core.c
> +++ b/drivers/mfd/twl-core.c
> @@ -111,6 +111,7 @@
> #define TWL6030_BASEADD_GASGAUGE 0x00C0
> #define TWL6030_BASEADD_PIH 0x00D0
> #define TWL6030_BASEADD_CHARGER 0x00E0
> +/* A few regs prepended before the 6030 regs */

This would be better represented if the defines were in order.

The comment is also superfluous.

> #define TWL6032_BASEADD_CHARGER 0x00DA

Are you sure this is prepended i.e. before the other registers?

These looks as though they sit in the middle.

> #define TWL6030_BASEADD_LED 0x00F4
>
> @@ -353,6 +354,9 @@ static struct twl_mapping twl6030_map[] = {
> { 2, TWL6030_BASEADD_ZERO },
> { 1, TWL6030_BASEADD_GPADC_CTRL },
> { 1, TWL6030_BASEADD_GASGAUGE },
> +
> + /* TWL6032 specific charger registers */
> + { 1, TWL6032_BASEADD_CHARGER },
> };
>
> static const struct regmap_config twl6030_regmap_config[3] = {
> @@ -802,10 +806,6 @@ twl_probe(struct i2c_client *client, const struct i2c_device_id *id)
> if ((id->driver_data) & TWL6030_CLASS) {
> twl_priv->twl_id = TWL6030_CLASS_ID;
> twl_priv->twl_map = &twl6030_map[0];
> - /* The charger base address is different in twl6032 */
> - if ((id->driver_data) & TWL6032_SUBCLASS)
> - twl_priv->twl_map[TWL_MODULE_MAIN_CHARGE].base =
> - TWL6032_BASEADD_CHARGER;
> twl_regmap_config = twl6030_regmap_config;
> } else {
> twl_priv->twl_id = TWL4030_CLASS_ID;
> diff --git a/include/linux/mfd/twl.h b/include/linux/mfd/twl.h
> index eaa233038254..6e3d99b7a0ee 100644
> --- a/include/linux/mfd/twl.h
> +++ b/include/linux/mfd/twl.h
> @@ -69,6 +69,8 @@ enum twl6030_module_ids {
> TWL6030_MODULE_GPADC,
> TWL6030_MODULE_GASGAUGE,
>
> + /* A few extra registers before the registers shared with the 6030 */
> + TWL6032_MODULE_CHARGE,
> TWL6030_MODULE_LAST,
> };
>

--
Lee Jones [李琼斯]