From nobody Thu Nov 28 02:48:44 2024 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id D93D918C22; Mon, 7 Oct 2024 00:14:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1728260100; cv=none; b=rdysMaCCjfJOvyPKNqIopPtqtOJnTE0vPmaS5WoDtwHauQL5Vp1/SRTllbzTtMdEiTojaoHSgZc6VINu9crhnZdOPitzzSSZL61z8e57sZBSEUB7D/t5kROP5GbAoGoeQ5ITIhCXKm2XdLDy7H3rGj6nFhtZw0YvHDy08kR2mLI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1728260100; c=relaxed/simple; bh=yLzQTkLZ+nr7Onps5le2X5ohuhcu6HMjNYjzkpsIgkY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pCeVWh5SPWTomG+7WWupyxZMtxUrAG90Ra8FVi4O2fe5Oroqxx/GbV8AwwQsNZAYIgTv1RRrya+5VcT6BbtQmlAFb0/5+3n5FsZxI+kFgSRE7TTui7L/Ndj5tCtI/6Qq282OoGH57ZBW7e813GV0U/F7xH3tqURvmBf1gScBaKs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id E6AAEFEC; Sun, 6 Oct 2024 17:15:27 -0700 (PDT) Received: from localhost.localdomain (usa-sjc-mx-foss1.foss.arm.com [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id AE8CE3F640; Sun, 6 Oct 2024 17:14:56 -0700 (PDT) From: Andre Przywara To: Lee Jones , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Chen-Yu Tsai , Liam Girdwood , Mark Brown Cc: devicetree@vger.kernel.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, Martin Botka , Chris Morgan Subject: [PATCH v2 4/5] mfd: axp20x: Add support for AXP323 Date: Mon, 7 Oct 2024 01:14:07 +0100 Message-ID: <20241007001408.27249-5-andre.przywara@arm.com> X-Mailer: git-send-email 2.46.2 In-Reply-To: <20241007001408.27249-1-andre.przywara@arm.com> References: <20241007001408.27249-1-andre.przywara@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The X-Powers AXP323 is a very close sibling of the AXP313A. The only difference seems to be the ability to dual-phase the first two DC/DC converter, which adds another register. Add the required boilerplate to introduce a new PMIC to the AXP MFD driver. Where possible, this just maps into the existing structs defined for the AXP313A, only deviating where needed. Signed-off-by: Andre Przywara Reviewed-by: Chen-Yu Tsai --- drivers/mfd/axp20x-i2c.c | 1 + drivers/mfd/axp20x.c | 26 ++++++++++++++++++++++++++ include/linux/mfd/axp20x.h | 2 ++ 3 files changed, 29 insertions(+) diff --git a/drivers/mfd/axp20x-i2c.c b/drivers/mfd/axp20x-i2c.c index 791a0b4cb64bb..5c93136f977e7 100644 --- a/drivers/mfd/axp20x-i2c.c +++ b/drivers/mfd/axp20x-i2c.c @@ -65,6 +65,7 @@ static const struct of_device_id axp20x_i2c_of_match[] = =3D { { .compatible =3D "x-powers,axp221", .data =3D (void *)AXP221_ID }, { .compatible =3D "x-powers,axp223", .data =3D (void *)AXP223_ID }, { .compatible =3D "x-powers,axp313a", .data =3D (void *)AXP313A_ID }, + { .compatible =3D "x-powers,axp323", .data =3D (void *)AXP323_ID }, { .compatible =3D "x-powers,axp717", .data =3D (void *)AXP717_ID }, { .compatible =3D "x-powers,axp803", .data =3D (void *)AXP803_ID }, { .compatible =3D "x-powers,axp806", .data =3D (void *)AXP806_ID }, diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c index bc08ae4332604..251465a656d09 100644 --- a/drivers/mfd/axp20x.c +++ b/drivers/mfd/axp20x.c @@ -42,6 +42,7 @@ static const char * const axp20x_model_names[] =3D { [AXP223_ID] =3D "AXP223", [AXP288_ID] =3D "AXP288", [AXP313A_ID] =3D "AXP313a", + [AXP323_ID] =3D "AXP323", [AXP717_ID] =3D "AXP717", [AXP803_ID] =3D "AXP803", [AXP806_ID] =3D "AXP806", @@ -193,6 +194,10 @@ static const struct regmap_range axp313a_writeable_ran= ges[] =3D { regmap_reg_range(AXP313A_ON_INDICATE, AXP313A_IRQ_STATE), }; =20 +static const struct regmap_range axp323_writeable_ranges[] =3D { + regmap_reg_range(AXP313A_ON_INDICATE, AXP323_DCDC_MODE_CTRL2), +}; + static const struct regmap_range axp313a_volatile_ranges[] =3D { regmap_reg_range(AXP313A_SHUTDOWN_CTRL, AXP313A_SHUTDOWN_CTRL), regmap_reg_range(AXP313A_IRQ_STATE, AXP313A_IRQ_STATE), @@ -203,6 +208,11 @@ static const struct regmap_access_table axp313a_writea= ble_table =3D { .n_yes_ranges =3D ARRAY_SIZE(axp313a_writeable_ranges), }; =20 +static const struct regmap_access_table axp323_writeable_table =3D { + .yes_ranges =3D axp323_writeable_ranges, + .n_yes_ranges =3D ARRAY_SIZE(axp323_writeable_ranges), +}; + static const struct regmap_access_table axp313a_volatile_table =3D { .yes_ranges =3D axp313a_volatile_ranges, .n_yes_ranges =3D ARRAY_SIZE(axp313a_volatile_ranges), @@ -433,6 +443,15 @@ static const struct regmap_config axp313a_regmap_confi= g =3D { .cache_type =3D REGCACHE_MAPLE, }; =20 +static const struct regmap_config axp323_regmap_config =3D { + .reg_bits =3D 8, + .val_bits =3D 8, + .wr_table =3D &axp323_writeable_table, + .volatile_table =3D &axp313a_volatile_table, + .max_register =3D AXP323_DCDC_MODE_CTRL2, + .cache_type =3D REGCACHE_MAPLE, +}; + static const struct regmap_config axp717_regmap_config =3D { .reg_bits =3D 8, .val_bits =3D 8, @@ -1221,6 +1240,7 @@ static int axp20x_power_off(struct sys_off_data *data) unsigned int shutdown_reg; =20 switch (axp20x->variant) { + case AXP323_ID: case AXP313A_ID: shutdown_reg =3D AXP313A_SHUTDOWN_CTRL; break; @@ -1289,6 +1309,12 @@ int axp20x_match_device(struct axp20x_dev *axp20x) axp20x->regmap_cfg =3D &axp313a_regmap_config; axp20x->regmap_irq_chip =3D &axp313a_regmap_irq_chip; break; + case AXP323_ID: + axp20x->nr_cells =3D ARRAY_SIZE(axp313a_cells); + axp20x->cells =3D axp313a_cells; + axp20x->regmap_cfg =3D &axp323_regmap_config; + axp20x->regmap_irq_chip =3D &axp313a_regmap_irq_chip; + break; case AXP717_ID: axp20x->nr_cells =3D ARRAY_SIZE(axp717_cells); axp20x->cells =3D axp717_cells; diff --git a/include/linux/mfd/axp20x.h b/include/linux/mfd/axp20x.h index 79ecaaaa20703..c3df0e615fbf4 100644 --- a/include/linux/mfd/axp20x.h +++ b/include/linux/mfd/axp20x.h @@ -19,6 +19,7 @@ enum axp20x_variants { AXP223_ID, AXP288_ID, AXP313A_ID, + AXP323_ID, AXP717_ID, AXP803_ID, AXP806_ID, @@ -113,6 +114,7 @@ enum axp20x_variants { #define AXP313A_SHUTDOWN_CTRL 0x1a #define AXP313A_IRQ_EN 0x20 #define AXP313A_IRQ_STATE 0x21 +#define AXP323_DCDC_MODE_CTRL2 0x22 =20 #define AXP717_ON_INDICATE 0x00 #define AXP717_PMU_STATUS_2 0x01 --=20 2.46.2