From nobody Wed Dec 17 19:09:33 2025 Received: from mail-ej1-f41.google.com (mail-ej1-f41.google.com [209.85.218.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E9AEF201004; Sun, 16 Mar 2025 18:19:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742149178; cv=none; b=OWngqGInAfDV7HmQD4YqCGPqlk6peB9qL6fOVTcJurS8Lxt+O9EyP7NpoSvCCei8gPcczhWZvRbpRgnVG1/qALsnQx7PyOcDehIsrmjoy2+p8uMm+vcgn3hCoN0ldJeQAqI9sT46a7/VJqe/gCaEOIMNaek+BpT3rWbDfqcf9Tg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742149178; c=relaxed/simple; bh=LP/C5IojHuNw7vhHpiuPpAUrBkJdBS43MpQdBCqEy2s=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=NhL/WEQH8vw1WXyrw7EXgKasZq3K4vHluqM/9gAYgzWkkgEhl+QjmavN5qGIi0g9M5J+sIVsjb0LZHr/+8wZv6SJwn6rkHWyGA9tCaKEcsF0QMtpWYzNAk1h2rMIRcm8quXF5iPKLhGOyNqNBNs6pcwLoyeca5BVtj3tkIO32d0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Qp6JsN8V; arc=none smtp.client-ip=209.85.218.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Qp6JsN8V" Received: by mail-ej1-f41.google.com with SMTP id a640c23a62f3a-aaee2c5ee6eso554042666b.1; Sun, 16 Mar 2025 11:19:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1742149174; x=1742753974; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=amKNxxzUeViOk51zJOZcbxy0m9EKEBmNEdChg+G2/50=; b=Qp6JsN8VNM4Xg3JpuYkDmkO3TIUXkcMESvJD8p+k0JL0dfpz8sXJnriNlNgQ6xbtFS 0wS89qRHOTTxtgLTy9nWA9z9xhhKEGK/jBuTWddVzEVMAB6Z0hwE7E8rYsF8PhvDy3H/ nMdQnW/1q05b6kBqE5grXo0zH0HTQxg9Jkqmfeu6QtFBjfN506GotjYJJJs6CYV/LPAI ZaWQoAMaco0Uo8rzIMSdV2I7VSSXuONs1wfX8efBGecTyRXVP9vx4rTEJFbYv1wzq0Zm eNGuOYnyZ4bSlR/Kg5j8J25VRp7KVZ05Z4NRWWHpNjo7ormWav84nrsGzK5FEWi2MU+o M1qA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742149174; x=1742753974; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=amKNxxzUeViOk51zJOZcbxy0m9EKEBmNEdChg+G2/50=; b=TzhlNRiy2YtnY9cfNQYWiBME+F//pYm7FoVkdJhCpGjL8sFF/u98nPxkWQWFNBkVIY Br4ImJoX8AJ79VlEl2nUju/kMOBxXpkDnchFcqljnqiHrE6KEFNI2tN4lCe0NoVHnj8R TyJxENDZL5ixHo3rTGOxUnZPN+qUjQ3CybHZOWKETl0j49HTYLwcoaGgFYU8DHzr4d3R BOVEpCJ96aU4jMkOvSNz4ZRmawiOGuuFuqR3YvxNODhU3TQsR7BEX1+0shv2b+n55kvp r9HGp/iDOUcPRrZvLP/mhpeWwOLpzwRVIi45DLv0jPuZChmWVj7xK+NmYABFcR0JIaxL ND3g== X-Forwarded-Encrypted: i=1; AJvYcCWireiAUSnnfhYEQG8/jxS9ld1MqJGzXIkMtuPeJAp5k3o4w1beLuuvWBR5B13YqYFGX1w0SxkmGxnV@vger.kernel.org, AJvYcCXtgoIGIX3oY6fVyF+3IAd5R5aOB45+ZkuyqywAX5R4RuXrrEQXy20AQNwHJ/oWin6t7+ce9fmOnXPv86ml@vger.kernel.org X-Gm-Message-State: AOJu0YwTnX2qNGg5nKUkEOyw3UgF7ery0daIwMn/JbdcMhW1gY+xKi7f 6kiTpiZxCzo1ZL98726zJ6FYmfTqKBl6S1/AMzUkPPhJZSLT1k5c85COsA== X-Gm-Gg: ASbGncv7XE84+MAfkQMtc8Th1aQBOukhbPqooDk6XiAzfbPJG8fXiEHMJaw/Bf9UpCX bacXI+ve4YX44nAEbHaZNxklMh9uWCb+BAIvoFMMpZKKm9UJCIeBvo41qv9YzxXCaOA9ee8ugWB NT+hwOCfsuiD8H0B9NK/xMGFAVlyiZTTdTxpmC0buEB5qHiC9IVw1553231IrrX8GBtMxK98d1+ D/EFJ85KDVaGqAloIijeKcN0Ici9tkMkpIK/rEnTr1xQPUsBJooRINavt2+0fTVos6bHgN2K+RT xwZs0t58DrCfhex8rO+rplwsYDFSxqhEL4P1COCk8ieiJ9uPRPsn0SZsRmWu8rGe9Vqr9UtY2Pw GCHOQlmerAgJoBx9zSQ== X-Google-Smtp-Source: AGHT+IGoRJAKltltcbINqhFsAUE2+2go4TuA+ktyXtsviYbQJ4PGOLYMnjgdTcwc1M6oBU/H5rXicg== X-Received: by 2002:a17:907:9712:b0:ac3:f06:d221 with SMTP id a640c23a62f3a-ac3301e1c7fmr1140524266b.3.1742149174052; Sun, 16 Mar 2025 11:19:34 -0700 (PDT) Received: from hex.my.domain (83.11.178.210.ipv4.supernova.orange.pl. [83.11.178.210]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ac314a48b51sm537951266b.149.2025.03.16.11.19.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 16 Mar 2025 11:19:33 -0700 (PDT) From: Artur Weber Date: Sun, 16 Mar 2025 19:18:58 +0100 Subject: [PATCH v7 10/10] regulator: bcm590xx: Add support for BCM59054 regulators Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250316-bcm59054-v7-10-4281126be1b8@gmail.com> References: <20250316-bcm59054-v7-0-4281126be1b8@gmail.com> In-Reply-To: <20250316-bcm59054-v7-0-4281126be1b8@gmail.com> To: Lee Jones , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Liam Girdwood , Mark Brown , Florian Fainelli , Ray Jui , Scott Branden , Broadcom internal kernel review list Cc: Stanislav Jakubek , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, ~postmarketos/upstreaming@lists.sr.ht, Artur Weber X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1742149152; l=17812; i=aweber.kernel@gmail.com; s=20231030; h=from:subject:message-id; bh=LP/C5IojHuNw7vhHpiuPpAUrBkJdBS43MpQdBCqEy2s=; b=WbuhX2cwPuPqfsZkX4CublsQ/s8DTGRSVhp9OiL5gnx4PjXCXfADLruMAVuhInULId4bz1JVB EKHkxK3R80eA+9/BpdgTbcY/Iiag34YWdk8WjLF8M+osMQqlAK8BoBu X-Developer-Key: i=aweber.kernel@gmail.com; a=ed25519; pk=RhDBfWbJEHqDibXbhNEBAnc9FMkyznGxX/hwfhL8bv8= The BCM59056 and BCM59054 are very similar in terms of regulators. Add the register definitions for the BCM59054 and enable support for it in the driver. Signed-off-by: Artur Weber --- Changes in v6: - dev_type -> pmu_id conversion, rev_ana -> rev_analog rename Changes in v5: - Adapt to regmap type enum being moved/value names being renamed - Adapt to rename of bcm590xx_reg_info to bcm590xx_reg_data Changes in v4: - Lock MICLDO at 1.8v to match vendor kernel behavior - Set different voltage table for VSR based on PMU revision - Fix incorrect table being used for LVLDO1 - Add missing newline to "unknown device type" error message Changes in v3: - Adapt to regulator info being moved to tables --- drivers/regulator/bcm590xx-regulator.c | 649 +++++++++++++++++++++++++++++= +++- 1 file changed, 647 insertions(+), 2 deletions(-) diff --git a/drivers/regulator/bcm590xx-regulator.c b/drivers/regulator/bcm= 590xx-regulator.c index f35b2b72e46f70496e16be5244529a5d95d0546d..50414f4cb10958bb33a9fcfa5ed= 5aaecde9d0715 100644 --- a/drivers/regulator/bcm590xx-regulator.c +++ b/drivers/regulator/bcm590xx-regulator.c @@ -52,6 +52,17 @@ static const struct regulator_ops bcm590xx_ops_ldo =3D { .map_voltage =3D regulator_map_voltage_iterate, }; =20 +/* + * LDO ops without voltage selection, used for MICLDO on BCM59054. + * (These are currently the same as VBUS ops, but will be different + * in the future once full PMMODE support is implemented.) + */ +static const struct regulator_ops bcm590xx_ops_ldo_novolt =3D { + .is_enabled =3D regulator_is_enabled_regmap, + .enable =3D regulator_enable_regmap, + .disable =3D regulator_disable_regmap, +}; + static const struct regulator_ops bcm590xx_ops_dcdc =3D { .is_enabled =3D regulator_is_enabled_regmap, .enable =3D regulator_enable_regmap, @@ -106,6 +117,13 @@ static const struct regulator_ops bcm590xx_ops_vbus = =3D { #define BCM59056_SR_DESC(_name, _name_lower, _ranges) \ BCM590XX_SR_DESC(BCM59056, bcm59056, _name, _name_lower, _ranges) =20 +#define BCM59054_REG_DESC(_name, _name_lower) \ + BCM590XX_REG_DESC(BCM59054, _name, _name_lower) +#define BCM59054_LDO_DESC(_name, _name_lower, _table) \ + BCM590XX_LDO_DESC(BCM59054, bcm59054, _name, _name_lower, _table) +#define BCM59054_SR_DESC(_name, _name_lower, _ranges) \ + BCM590XX_SR_DESC(BCM59054, bcm59054, _name, _name_lower, _ranges) + /* BCM59056 data */ =20 /* I2C slave 0 registers */ @@ -466,6 +484,617 @@ static const struct bcm590xx_reg_data bcm59056_regs[B= CM59056_NUM_REGS] =3D { }, }; =20 +/* BCM59054 data */ + +/* I2C slave 0 registers */ +#define BCM59054_RFLDOPMCTRL1 0x60 +#define BCM59054_CAMLDO1PMCTRL1 0x62 +#define BCM59054_CAMLDO2PMCTRL1 0x64 +#define BCM59054_SIMLDO1PMCTRL1 0x66 +#define BCM59054_SIMLDO2PMCTRL1 0x68 +#define BCM59054_SDLDOPMCTRL1 0x6a +#define BCM59054_SDXLDOPMCTRL1 0x6c +#define BCM59054_MMCLDO1PMCTRL1 0x6e +#define BCM59054_MMCLDO2PMCTRL1 0x70 +#define BCM59054_AUDLDOPMCTRL1 0x72 +#define BCM59054_MICLDOPMCTRL1 0x74 +#define BCM59054_USBLDOPMCTRL1 0x76 +#define BCM59054_VIBLDOPMCTRL1 0x78 +#define BCM59054_IOSR1PMCTRL1 0x7a +#define BCM59054_IOSR2PMCTRL1 0x7c +#define BCM59054_CSRPMCTRL1 0x7e +#define BCM59054_SDSR1PMCTRL1 0x82 +#define BCM59054_SDSR2PMCTRL1 0x86 +#define BCM59054_MMSRPMCTRL1 0x8a +#define BCM59054_VSRPMCTRL1 0x8e +#define BCM59054_RFLDOCTRL 0x96 +#define BCM59054_CAMLDO1CTRL 0x97 +#define BCM59054_CAMLDO2CTRL 0x98 +#define BCM59054_SIMLDO1CTRL 0x99 +#define BCM59054_SIMLDO2CTRL 0x9a +#define BCM59054_SDLDOCTRL 0x9b +#define BCM59054_SDXLDOCTRL 0x9c +#define BCM59054_MMCLDO1CTRL 0x9d +#define BCM59054_MMCLDO2CTRL 0x9e +#define BCM59054_AUDLDOCTRL 0x9f +#define BCM59054_MICLDOCTRL 0xa0 +#define BCM59054_USBLDOCTRL 0xa1 +#define BCM59054_VIBLDOCTRL 0xa2 +#define BCM59054_CSRVOUT1 0xc0 +#define BCM59054_IOSR1VOUT1 0xc3 +#define BCM59054_IOSR2VOUT1 0xc6 +#define BCM59054_MMSRVOUT1 0xc9 +#define BCM59054_SDSR1VOUT1 0xcc +#define BCM59054_SDSR2VOUT1 0xcf +#define BCM59054_VSRVOUT1 0xd2 + +/* I2C slave 1 registers */ +#define BCM59054_LVLDO1PMCTRL1 0x16 +#define BCM59054_LVLDO2PMCTRL1 0x18 +#define BCM59054_GPLDO1CTRL 0x1a +#define BCM59054_GPLDO2CTRL 0x1b +#define BCM59054_GPLDO3CTRL 0x1c +#define BCM59054_TCXLDOCTRL 0x1d +#define BCM59054_LVLDO1CTRL 0x1e +#define BCM59054_LVLDO2CTRL 0x1f +#define BCM59054_OTG_CTRL 0x40 +#define BCM59054_GPLDO1PMCTRL1 0x57 +#define BCM59054_GPLDO2PMCTRL1 0x59 +#define BCM59054_GPLDO3PMCTRL1 0x5b +#define BCM59054_TCXLDOPMCTRL1 0x5d + +/* + * RFLDO to VSR regulators are + * accessed via I2C slave 0 + */ + +/* LDO regulator IDs */ +#define BCM59054_REG_RFLDO 0 +#define BCM59054_REG_CAMLDO1 1 +#define BCM59054_REG_CAMLDO2 2 +#define BCM59054_REG_SIMLDO1 3 +#define BCM59054_REG_SIMLDO2 4 +#define BCM59054_REG_SDLDO 5 +#define BCM59054_REG_SDXLDO 6 +#define BCM59054_REG_MMCLDO1 7 +#define BCM59054_REG_MMCLDO2 8 +#define BCM59054_REG_AUDLDO 9 +#define BCM59054_REG_MICLDO 10 +#define BCM59054_REG_USBLDO 11 +#define BCM59054_REG_VIBLDO 12 + +/* DCDC regulator IDs */ +#define BCM59054_REG_CSR 13 +#define BCM59054_REG_IOSR1 14 +#define BCM59054_REG_IOSR2 15 +#define BCM59054_REG_MMSR 16 +#define BCM59054_REG_SDSR1 17 +#define BCM59054_REG_SDSR2 18 +#define BCM59054_REG_VSR 19 + +/* + * GPLDO1 to VBUS regulators are + * accessed via I2C slave 1 + */ + +#define BCM59054_REG_GPLDO1 20 +#define BCM59054_REG_GPLDO2 21 +#define BCM59054_REG_GPLDO3 22 +#define BCM59054_REG_TCXLDO 23 +#define BCM59054_REG_LVLDO1 24 +#define BCM59054_REG_LVLDO2 25 +#define BCM59054_REG_VBUS 26 + +#define BCM59054_NUM_REGS 27 + +/* LDO group 1: supported voltages in microvolts */ +static const unsigned int bcm59054_ldo_1_table[] =3D { + 1200000, 1800000, 2500000, 2700000, 2800000, + 2900000, 3000000, 3300000, +}; + +/* LDO group 2: supported voltages in microvolts */ +static const unsigned int bcm59054_ldo_2_table[] =3D { + 3100000, 1800000, 2500000, 2700000, 2800000, + 2900000, 3000000, 3300000, +}; + +/* LDO group 3: supported voltages in microvolts */ +static const unsigned int bcm59054_ldo_3_table[] =3D { + 1000000, 1107000, 1143000, 1214000, 1250000, + 1464000, 1500000, 1786000, +}; + +/* DCDC group SR: supported voltages in microvolts */ +static const struct linear_range bcm59054_dcdc_sr_ranges[] =3D { + REGULATOR_LINEAR_RANGE(0, 0, 1, 0), + REGULATOR_LINEAR_RANGE(860000, 2, 60, 10000), + REGULATOR_LINEAR_RANGE(1500000, 61, 61, 0), + REGULATOR_LINEAR_RANGE(1800000, 62, 62, 0), + REGULATOR_LINEAR_RANGE(900000, 63, 63, 0), +}; + +/* DCDC group VSR (BCM59054A1): supported voltages in microvolts */ +static const struct linear_range bcm59054_dcdc_vsr_a1_ranges[] =3D { + REGULATOR_LINEAR_RANGE(0, 0, 1, 0), + REGULATOR_LINEAR_RANGE(860000, 2, 59, 10000), + REGULATOR_LINEAR_RANGE(1700000, 60, 60, 0), + REGULATOR_LINEAR_RANGE(1500000, 61, 61, 0), + REGULATOR_LINEAR_RANGE(1800000, 62, 62, 0), + REGULATOR_LINEAR_RANGE(1600000, 63, 63, 0), +}; + +/* DCDC group CSR: supported voltages in microvolts */ +static const struct linear_range bcm59054_dcdc_csr_ranges[] =3D { + REGULATOR_LINEAR_RANGE(700000, 0, 1, 100000), + REGULATOR_LINEAR_RANGE(860000, 2, 60, 10000), + REGULATOR_LINEAR_RANGE(900000, 61, 63, 0), +}; + +static const struct bcm590xx_reg_data bcm59054_regs[BCM59054_NUM_REGS] =3D= { + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_LDO_DESC(RFLDO, rfldo, ldo_1_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_LDO_DESC(CAMLDO1, camldo1, ldo_2_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_LDO_DESC(CAMLDO2, camldo2, ldo_2_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_LDO_DESC(SIMLDO1, simldo1, ldo_1_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_LDO_DESC(SIMLDO2, simldo2, ldo_1_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_LDO_DESC(SDLDO, sdldo, ldo_2_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_LDO_DESC(SDXLDO, sdxldo, ldo_1_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_LDO_DESC(MMCLDO1, mmcldo1, ldo_1_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_LDO_DESC(MMCLDO2, mmcldo2, ldo_1_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_LDO_DESC(AUDLDO, audldo, ldo_1_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_REG_DESC(MICLDO, micldo), + .ops =3D &bcm590xx_ops_ldo_novolt, + /* MICLDO is locked at 1.8V */ + .n_voltages =3D 1, + .fixed_uV =3D 1800000, + .enable_reg =3D BCM59054_MICLDOPMCTRL1, + .enable_mask =3D BCM590XX_REG_ENABLE, + .enable_is_inverted =3D true, + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_LDO_DESC(USBLDO, usbldo, ldo_1_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_LDO_DESC(VIBLDO, vibldo, ldo_2_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_SR, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_SR_DESC(CSR, csr, dcdc_csr_ranges), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_SR, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_SR_DESC(IOSR1, iosr1, dcdc_sr_ranges), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_SR, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_SR_DESC(IOSR2, iosr2, dcdc_sr_ranges), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_SR, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_SR_DESC(MMSR, mmsr, dcdc_sr_ranges), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_SR, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_SR_DESC(SDSR1, sdsr1, dcdc_sr_ranges), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_SR, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_SR_DESC(SDSR2, sdsr2, dcdc_sr_ranges), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_SR, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_SR_DESC(VSR, vsr, dcdc_sr_ranges), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_GPLDO, + .regmap =3D BCM590XX_REGMAP_SEC, + .desc =3D { + BCM59054_LDO_DESC(GPLDO1, gpldo1, ldo_1_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_GPLDO, + .regmap =3D BCM590XX_REGMAP_SEC, + .desc =3D { + BCM59054_LDO_DESC(GPLDO2, gpldo2, ldo_1_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_GPLDO, + .regmap =3D BCM590XX_REGMAP_SEC, + .desc =3D { + BCM59054_LDO_DESC(GPLDO3, gpldo3, ldo_1_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_GPLDO, + .regmap =3D BCM590XX_REGMAP_SEC, + .desc =3D { + BCM59054_LDO_DESC(TCXLDO, tcxldo, ldo_1_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_GPLDO, + .regmap =3D BCM590XX_REGMAP_SEC, + .desc =3D { + BCM59054_LDO_DESC(LVLDO1, lvldo1, ldo_3_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_GPLDO, + .regmap =3D BCM590XX_REGMAP_SEC, + .desc =3D { + BCM59054_LDO_DESC(LVLDO2, lvldo2, ldo_3_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_VBUS, + .regmap =3D BCM590XX_REGMAP_SEC, + .desc =3D { + BCM59054_REG_DESC(VBUS, vbus), + .ops =3D &bcm590xx_ops_vbus, + .n_voltages =3D 1, + .fixed_uV =3D 5000000, + .enable_reg =3D BCM59054_OTG_CTRL, + .enable_mask =3D BCM590XX_VBUS_ENABLE, + }, + }, +}; + +/* + * BCM59054A1 regulators; same as previous revision, but with different + * VSR voltage table. + */ +static const struct bcm590xx_reg_data bcm59054_a1_regs[BCM59054_NUM_REGS] = =3D { + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_LDO_DESC(RFLDO, rfldo, ldo_1_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_LDO_DESC(CAMLDO1, camldo1, ldo_2_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_LDO_DESC(CAMLDO2, camldo2, ldo_2_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_LDO_DESC(SIMLDO1, simldo1, ldo_1_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_LDO_DESC(SIMLDO2, simldo2, ldo_1_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_LDO_DESC(SDLDO, sdldo, ldo_2_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_LDO_DESC(SDXLDO, sdxldo, ldo_1_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_LDO_DESC(MMCLDO1, mmcldo1, ldo_1_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_LDO_DESC(MMCLDO2, mmcldo2, ldo_1_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_LDO_DESC(AUDLDO, audldo, ldo_1_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_REG_DESC(MICLDO, micldo), + .ops =3D &bcm590xx_ops_ldo_novolt, + /* MICLDO is locked at 1.8V */ + .n_voltages =3D 1, + .fixed_uV =3D 1800000, + .enable_reg =3D BCM59054_MICLDOPMCTRL1, + .enable_mask =3D BCM590XX_REG_ENABLE, + .enable_is_inverted =3D true, + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_LDO_DESC(USBLDO, usbldo, ldo_1_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_LDO_DESC(VIBLDO, vibldo, ldo_2_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_SR, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_SR_DESC(CSR, csr, dcdc_csr_ranges), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_SR, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_SR_DESC(IOSR1, iosr1, dcdc_sr_ranges), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_SR, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_SR_DESC(IOSR2, iosr2, dcdc_sr_ranges), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_SR, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_SR_DESC(MMSR, mmsr, dcdc_sr_ranges), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_SR, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_SR_DESC(SDSR1, sdsr1, dcdc_sr_ranges), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_SR, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_SR_DESC(SDSR2, sdsr2, dcdc_sr_ranges), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_SR, + .regmap =3D BCM590XX_REGMAP_PRI, + .desc =3D { + BCM59054_SR_DESC(VSR, vsr, dcdc_vsr_a1_ranges), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_GPLDO, + .regmap =3D BCM590XX_REGMAP_SEC, + .desc =3D { + BCM59054_LDO_DESC(GPLDO1, gpldo1, ldo_1_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_GPLDO, + .regmap =3D BCM590XX_REGMAP_SEC, + .desc =3D { + BCM59054_LDO_DESC(GPLDO2, gpldo2, ldo_1_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_GPLDO, + .regmap =3D BCM590XX_REGMAP_SEC, + .desc =3D { + BCM59054_LDO_DESC(GPLDO3, gpldo3, ldo_1_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_GPLDO, + .regmap =3D BCM590XX_REGMAP_SEC, + .desc =3D { + BCM59054_LDO_DESC(TCXLDO, tcxldo, ldo_1_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_GPLDO, + .regmap =3D BCM590XX_REGMAP_SEC, + .desc =3D { + BCM59054_LDO_DESC(LVLDO1, lvldo1, ldo_3_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_GPLDO, + .regmap =3D BCM590XX_REGMAP_SEC, + .desc =3D { + BCM59054_LDO_DESC(LVLDO2, lvldo2, ldo_3_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_VBUS, + .regmap =3D BCM590XX_REGMAP_SEC, + .desc =3D { + BCM59054_REG_DESC(VBUS, vbus), + .ops =3D &bcm590xx_ops_vbus, + .n_voltages =3D 1, + .fixed_uV =3D 5000000, + .enable_reg =3D BCM59054_OTG_CTRL, + .enable_mask =3D BCM590XX_VBUS_ENABLE, + }, + }, +}; + static int bcm590xx_probe(struct platform_device *pdev) { struct bcm590xx *bcm590xx =3D dev_get_drvdata(pdev->dev.parent); @@ -480,8 +1109,24 @@ static int bcm590xx_probe(struct platform_device *pde= v) return -ENOMEM; =20 pmu->mfd =3D bcm590xx; - pmu->n_regulators =3D BCM59056_NUM_REGS; - pmu->regs =3D bcm59056_regs; + + switch (pmu->mfd->pmu_id) { + case BCM590XX_PMUID_BCM59054: + pmu->n_regulators =3D BCM59054_NUM_REGS; + if (pmu->mfd->rev_analog =3D=3D BCM59054_REV_ANALOG_A1) + pmu->regs =3D bcm59054_a1_regs; + else + pmu->regs =3D bcm59054_regs; + break; + case BCM590XX_PMUID_BCM59056: + pmu->n_regulators =3D BCM59056_NUM_REGS; + pmu->regs =3D bcm59056_regs; + break; + default: + dev_err(bcm590xx->dev, + "unknown device type, could not initialize\n"); + return -EINVAL; + } =20 platform_set_drvdata(pdev, pmu); =20 --=20 2.48.1