From nobody Mon Feb 9 12:00:49 2026 Received: from mail-ed1-f45.google.com (mail-ed1-f45.google.com [209.85.208.45]) (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 4090B1F2C49; Fri, 31 Jan 2025 18:14:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738347245; cv=none; b=UnYkAf7KQmJLSfZumuynYSEDn0AWRrebfU8A8k3YE+PLzE141HyYg10373M91bvgQOpPadoNTxs3+QYb9jssMqcgGj3ITJMqx5hsx3DDrsuKSb9BWsWUBTcA0o3nplqucjuO+uPop0gH4E2/8xEQ0HGkhgzh9WTU3Y4NjlDC7IE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738347245; c=relaxed/simple; bh=CoYmULwmYQYuYjjK9H0WcMCSNKsdgX0yMKH6SZAsU6A=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=EpZlm64AgpDHASc2Z99N7uNqK43iqzkdS74rlVAIvjwsY0+w88NBhYwBBj3O0H1ZLRulCznAv7lCz/KnNHteFz4BET4JhraKO8ULooXNJZFUbWXkyM0k9Tqs3kLcpw4o64vXPkjz7CQErBG7zSUMh4357ujgkiO2tJVA7C4Vdko= 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=Teh4NQQp; arc=none smtp.client-ip=209.85.208.45 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="Teh4NQQp" Received: by mail-ed1-f45.google.com with SMTP id 4fb4d7f45d1cf-5d96944401dso3796590a12.0; Fri, 31 Jan 2025 10:14:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738347241; x=1738952041; 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=b97cdGbjaVACn1FfHRq1vVRLqfgZGpZI9sersBinJ3I=; b=Teh4NQQpgknjtTMm0tUBgESIOafCItnuWJCAhN8M67t4TaSTTWgpfeIcaGzYbXdq10 3E+KEn4N8V33psXmyenpZoGlBdZUb0neexVSYSsT1eCu7c5pVFimlCCOnobzUdGMfihr vssv9oBFNrXvSpmoe7cLLPkCeebUjv6uAZMD65AnCkzcysFgpBqMalxyTpB5IGRWpx94 k7UaG2ufw71EXzopGppgLMQeocUyebX713lgNZgFLXwsntcgrpmKgub4ZZiU8FrPszfT qQCwc8noPmO/PF8yzwJZO9nojz0UzcuT09Mc32P12EpXXNxDypVVUK3PVKfr+iisH9Wn Mi8A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738347241; x=1738952041; 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=b97cdGbjaVACn1FfHRq1vVRLqfgZGpZI9sersBinJ3I=; b=pYmTqzTGwQvntjANN1yK1D+/zpUjpeZSKm97SCuC0pFlY9Tya+fxAi+Vz3dvLleJf7 LKOdhCXqWS01ovHf61iNdaql3t2xiArVrFIDSEuzvZjr3lFVkjr5ZECXhdx2uFPGh87j 77UW/tBvtgdsvtsbBjqybxcU1qFhz3vuTkwSvB+IHYkffTAI0anuKwZlaGbU2VtAqLly cp+Esis5rRB/3lCPlw0bek8wUtANQPSc1PaWPVRr4QZEnp16o6h/Qu85rnhUa9Vd7FfB +BFVBhvW8821crgeclS2Ks2MfpAbH71k05Hnfzs2oN25ioomVkKWdi30ZNALN3qnmp3G 39zg== X-Forwarded-Encrypted: i=1; AJvYcCWkrRFvPHp++XeW6ajOI6nN3Ziqzf7BIy7e0Lk2KUPtl2T5bp6D3FkCI75+AbXAEj59oY6SyY9KImm1fvNO@vger.kernel.org, AJvYcCXup5JpvLrIE+wOrzFe3CrB90gjzTyEA26N9w/bGh5tExcWcfLd1c6z+g+RO7qpWGGFeIh5mMVEj9sv@vger.kernel.org X-Gm-Message-State: AOJu0Yz/kNROUAyIOydLT0s1j/KJH9yXdujMKonDckcMwZRoLMSQb5Bl mVuhEcbDhfG0bFc1USBWKSDu3x+lKEcSKfy5Du2t6qztZzRb1pAV1be70A== X-Gm-Gg: ASbGncsj6IoileRxrpFElO+pR6x44bZTsrahbPb91wSpOVtitaINsjw6Fg3QCwcxewq 9p62noIjHJ9yEa5nJ3h0mkyOdbfkdx0FaZ1Wmq1PFkydzRbb4gcffrNjYVV3/1kaJLTaeyDYAkY TBcMO/8hgdvRrhMs+q6wUfYvF2b11K+HIJ8Xg8HX8ABiDXdHRxpwJ1XcIpehiEmjKB4GFgyCWGr xIZwD6XAEyyM+xAQFVt6UupGlFXEzlPA5rJf2+yiflDYxRKEjahqJt7VB4q5RUziRkoVGp+4j8u BP7TgTdr2NjmAuiU1uDyX/RTr0zsLio/GanTsQrx/n8bvL1TQA7Nd42BXj6X8g== X-Google-Smtp-Source: AGHT+IE7yO+ugvuUI4et4vPTohWUBiFrXNVFW+PBAcuxMp7dN9Ox+9TaHZ4/QjYU6Y31NsmoXdZG9w== X-Received: by 2002:a05:6402:4304:b0:5db:f5bc:f696 with SMTP id 4fb4d7f45d1cf-5dc5efa8afbmr13584605a12.5.1738347241263; Fri, 31 Jan 2025 10:14:01 -0800 (PST) Received: from hex.my.domain (83.11.225.21.ipv4.supernova.orange.pl. [83.11.225.21]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dc723cff67sm3223744a12.16.2025.01.31.10.14.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 Jan 2025 10:14:00 -0800 (PST) From: Artur Weber Date: Fri, 31 Jan 2025 19:13:53 +0100 Subject: [PATCH v3 5/7] regulator: bcm590xx: Store regulator descriptions in table 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: <20250131-bcm59054-v3-5-bbac52a84787@gmail.com> References: <20250131-bcm59054-v3-0-bbac52a84787@gmail.com> In-Reply-To: <20250131-bcm59054-v3-0-bbac52a84787@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=1738347232; l=15802; i=aweber.kernel@gmail.com; s=20231030; h=from:subject:message-id; bh=CoYmULwmYQYuYjjK9H0WcMCSNKsdgX0yMKH6SZAsU6A=; b=yKbdE7SGYO2UfNXMj1PfNGgB6cnYb9BGJtHD4xzYUKZeEWMBZy3MqCcEACIfHBkLVlHPpfl1/ ya++nymMMhdBMq145a3jR+MieJ/bLi90mHxmt7NWUpa3TBgnsRkh4VN X-Developer-Key: i=aweber.kernel@gmail.com; a=ed25519; pk=RhDBfWbJEHqDibXbhNEBAnc9FMkyznGxX/hwfhL8bv8= Instead of filling in the regulator description programatically, store the data in a struct. This will make it a bit nicer to introduce support for other BCM590xx chips besides the BCM59056. To do this, add a new struct type, bcm590xx_reg_info, to store all of the necessary information. Drop the old IS_LDO, IS_GPLDO... macros in favor of the "type" field in this struct. Adapt the old bcm590xx_reg struct to the new types. Signed-off-by: Artur Weber --- Changes in v3: - Added this commit --- drivers/regulator/bcm590xx-regulator.c | 472 ++++++++++++++++++++++-------= ---- 1 file changed, 316 insertions(+), 156 deletions(-) diff --git a/drivers/regulator/bcm590xx-regulator.c b/drivers/regulator/bcm= 590xx-regulator.c index 9f0cda46b01506080ae5fa709104a8df4d174a8d..6548653a6fb7207a5aa8e006a00= 5553bfb7b1d69 100644 --- a/drivers/regulator/bcm590xx-regulator.c +++ b/drivers/regulator/bcm590xx-regulator.c @@ -20,6 +20,18 @@ =20 /* I2C slave 0 registers */ #define BCM590XX_RFLDOPMCTRL1 0x60 +#define BCM590XX_CAMLDO1PMCTRL1 0x62 +#define BCM590XX_CAMLDO2PMCTRL1 0x64 +#define BCM590XX_SIMLDO1PMCTRL1 0x66 +#define BCM590XX_SIMLDO2PMCTRL1 0x68 +#define BCM590XX_SDLDOPMCTRL1 0x6a +#define BCM590XX_SDXLDOPMCTRL1 0x6c +#define BCM590XX_MMCLDO1PMCTRL1 0x6e +#define BCM590XX_MMCLDO2PMCTRL1 0x70 +#define BCM590XX_AUDLDOPMCTRL1 0x72 +#define BCM590XX_MICLDOPMCTRL1 0x74 +#define BCM590XX_USBLDOPMCTRL1 0x76 +#define BCM590XX_VIBLDOPMCTRL1 0x78 #define BCM590XX_IOSR1PMCTRL1 0x7a #define BCM590XX_IOSR2PMCTRL1 0x7c #define BCM590XX_CSRPMCTRL1 0x7e @@ -28,7 +40,25 @@ #define BCM590XX_MSRPMCTRL1 0x8a #define BCM590XX_VSRPMCTRL1 0x8e #define BCM590XX_RFLDOCTRL 0x96 +#define BCM590XX_CAMLDO1CTRL 0x97 +#define BCM590XX_CAMLDO2CTRL 0x98 +#define BCM590XX_SIMLDO1CTRL 0x99 +#define BCM590XX_SIMLDO2CTRL 0x9a +#define BCM590XX_SDLDOCTRL 0x9b +#define BCM590XX_SDXLDOCTRL 0x9c +#define BCM590XX_MMCLDO1CTRL 0x9d +#define BCM590XX_MMCLDO2CTRL 0x9e +#define BCM590XX_AUDLDOCTRL 0x9f +#define BCM590XX_MICLDOCTRL 0xa0 +#define BCM590XX_USBLDOCTRL 0xa1 +#define BCM590XX_VIBLDOCTRL 0xa2 #define BCM590XX_CSRVOUT1 0xc0 +#define BCM590XX_IOSR1VOUT1 0xc3 +#define BCM590XX_IOSR2VOUT1 0xc6 +#define BCM590XX_MSRVOUT1 0xc9 +#define BCM590XX_SDSR1VOUT1 0xcc +#define BCM590XX_SDSR2VOUT1 0xcf +#define BCM590XX_VSRVOUT1 0xd2 =20 /* I2C slave 1 registers */ #define BCM590XX_GPLDO5PMCTRL1 0x16 @@ -94,11 +124,6 @@ =20 #define BCM590XX_NUM_REGS 27 =20 -#define BCM590XX_REG_IS_LDO(n) (n < BCM590XX_REG_CSR) -#define BCM590XX_REG_IS_GPLDO(n) \ - ((n > BCM590XX_REG_VSR) && (n < BCM590XX_REG_VBUS)) -#define BCM590XX_REG_IS_VBUS(n) (n =3D=3D BCM590XX_REG_VBUS) - /* LDO group A: supported voltages in microvolts */ static const unsigned int ldo_a_table[] =3D { 1200000, 1800000, 2500000, 2700000, 2800000, @@ -111,10 +136,6 @@ static const unsigned int ldo_c_table[] =3D { 2900000, 3000000, 3300000, }; =20 -static const unsigned int ldo_vbus[] =3D { - 5000000, -}; - /* DCDC group CSR: supported voltages in microvolts */ static const struct linear_range dcdc_csr_ranges[] =3D { REGULATOR_LINEAR_RANGE(860000, 2, 50, 10000), @@ -137,115 +158,30 @@ static const struct linear_range dcdc_sdsr1_ranges[]= =3D { REGULATOR_LINEAR_RANGE(900000, 52, 63, 0), }; =20 -struct bcm590xx_info { - const char *name; - const char *vin_name; - u8 n_voltages; - const unsigned int *volt_table; - u8 n_linear_ranges; - const struct linear_range *linear_ranges; +enum bcm590xx_reg_type { + BCM590XX_REG_TYPE_LDO, + BCM590XX_REG_TYPE_GPLDO, + BCM590XX_REG_TYPE_SR, + BCM590XX_REG_TYPE_VBUS }; =20 -#define BCM590XX_REG_TABLE(_name, _table) \ - { \ - .name =3D #_name, \ - .n_voltages =3D ARRAY_SIZE(_table), \ - .volt_table =3D _table, \ - } - -#define BCM590XX_REG_RANGES(_name, _ranges) \ - { \ - .name =3D #_name, \ - .n_voltages =3D 64, \ - .n_linear_ranges =3D ARRAY_SIZE(_ranges), \ - .linear_ranges =3D _ranges, \ - } +enum bcm590xx_reg_regmap { + BCM590XX_REG_REGMAP_PRI, + BCM590XX_REG_REGMAP_SEC, +}; =20 -static struct bcm590xx_info bcm590xx_regs[] =3D { - BCM590XX_REG_TABLE(rfldo, ldo_a_table), - BCM590XX_REG_TABLE(camldo1, ldo_c_table), - BCM590XX_REG_TABLE(camldo2, ldo_c_table), - BCM590XX_REG_TABLE(simldo1, ldo_a_table), - BCM590XX_REG_TABLE(simldo2, ldo_a_table), - BCM590XX_REG_TABLE(sdldo, ldo_c_table), - BCM590XX_REG_TABLE(sdxldo, ldo_a_table), - BCM590XX_REG_TABLE(mmcldo1, ldo_a_table), - BCM590XX_REG_TABLE(mmcldo2, ldo_a_table), - BCM590XX_REG_TABLE(audldo, ldo_a_table), - BCM590XX_REG_TABLE(micldo, ldo_a_table), - BCM590XX_REG_TABLE(usbldo, ldo_a_table), - BCM590XX_REG_TABLE(vibldo, ldo_c_table), - BCM590XX_REG_RANGES(csr, dcdc_csr_ranges), - BCM590XX_REG_RANGES(iosr1, dcdc_iosr1_ranges), - BCM590XX_REG_RANGES(iosr2, dcdc_iosr1_ranges), - BCM590XX_REG_RANGES(msr, dcdc_iosr1_ranges), - BCM590XX_REG_RANGES(sdsr1, dcdc_sdsr1_ranges), - BCM590XX_REG_RANGES(sdsr2, dcdc_iosr1_ranges), - BCM590XX_REG_RANGES(vsr, dcdc_iosr1_ranges), - BCM590XX_REG_TABLE(gpldo1, ldo_a_table), - BCM590XX_REG_TABLE(gpldo2, ldo_a_table), - BCM590XX_REG_TABLE(gpldo3, ldo_a_table), - BCM590XX_REG_TABLE(gpldo4, ldo_a_table), - BCM590XX_REG_TABLE(gpldo5, ldo_a_table), - BCM590XX_REG_TABLE(gpldo6, ldo_a_table), - BCM590XX_REG_TABLE(vbus, ldo_vbus), +struct bcm590xx_reg_info { + enum bcm590xx_reg_type type; + enum bcm590xx_reg_regmap regmap; + const struct regulator_desc desc; }; =20 struct bcm590xx_reg { - struct regulator_desc *desc; struct bcm590xx *mfd; + unsigned int n_regulators; + const struct bcm590xx_reg_info *regs; }; =20 -static int bcm590xx_get_vsel_register(int id) -{ - if (BCM590XX_REG_IS_LDO(id)) - return BCM590XX_RFLDOCTRL + id; - else if (BCM590XX_REG_IS_GPLDO(id)) - return BCM590XX_GPLDO1CTRL + id; - else - return BCM590XX_CSRVOUT1 + (id - BCM590XX_REG_CSR) * 3; -} - -static int bcm590xx_get_enable_register(int id) -{ - int reg =3D 0; - - if (BCM590XX_REG_IS_LDO(id)) - reg =3D BCM590XX_RFLDOPMCTRL1 + id * 2; - else if (BCM590XX_REG_IS_GPLDO(id)) - reg =3D BCM590XX_GPLDO1PMCTRL1 + id * 2; - else - switch (id) { - case BCM590XX_REG_CSR: - reg =3D BCM590XX_CSRPMCTRL1; - break; - case BCM590XX_REG_IOSR1: - reg =3D BCM590XX_IOSR1PMCTRL1; - break; - case BCM590XX_REG_IOSR2: - reg =3D BCM590XX_IOSR2PMCTRL1; - break; - case BCM590XX_REG_MSR: - reg =3D BCM590XX_MSRPMCTRL1; - break; - case BCM590XX_REG_SDSR1: - reg =3D BCM590XX_SDSR1PMCTRL1; - break; - case BCM590XX_REG_SDSR2: - reg =3D BCM590XX_SDSR2PMCTRL1; - break; - case BCM590XX_REG_VSR: - reg =3D BCM590XX_VSRPMCTRL1; - break; - case BCM590XX_REG_VBUS: - reg =3D BCM590XX_OTG_CTRL; - break; - } - - - return reg; -} - static const struct regulator_ops bcm590xx_ops_ldo =3D { .is_enabled =3D regulator_is_enabled_regmap, .enable =3D regulator_enable_regmap, @@ -272,73 +208,297 @@ static const struct regulator_ops bcm590xx_ops_vbus = =3D { .disable =3D regulator_disable_regmap, }; =20 +#define BCM590XX_REG_DESC(_name, _name_lower) \ + .id =3D BCM590XX_REG_##_name, \ + .name =3D #_name_lower, \ + .of_match =3D of_match_ptr(#_name_lower), \ + .regulators_node =3D of_match_ptr("regulators"), \ + .type =3D REGULATOR_VOLTAGE, \ + .owner =3D THIS_MODULE \ + +#define BCM590XX_LDO_DESC(_name, _name_lower, _table) \ + BCM590XX_REG_DESC(_name, _name_lower), \ + .ops =3D &bcm590xx_ops_ldo, \ + .n_voltages =3D ARRAY_SIZE(_table), \ + .volt_table =3D _table, \ + .vsel_reg =3D BCM590XX_##_name##CTRL, \ + .vsel_mask =3D BCM590XX_LDO_VSEL_MASK, \ + .enable_reg =3D BCM590XX_##_name##PMCTRL1, \ + .enable_mask =3D BCM590XX_REG_ENABLE, \ + .enable_is_inverted =3D true + +#define BCM590XX_SR_DESC(_name, _name_lower, _ranges) \ + BCM590XX_REG_DESC(_name, _name_lower), \ + .ops =3D &bcm590xx_ops_dcdc, \ + .n_voltages =3D 64, \ + .linear_ranges =3D _ranges, \ + .n_linear_ranges =3D ARRAY_SIZE(_ranges), \ + .vsel_reg =3D BCM590XX_##_name##VOUT1, \ + .vsel_mask =3D BCM590XX_SR_VSEL_MASK, \ + .enable_reg =3D BCM590XX_##_name##PMCTRL1, \ + .enable_mask =3D BCM590XX_REG_ENABLE, \ + .enable_is_inverted =3D true + +static const struct bcm590xx_reg_info bcm590xx_regs[BCM590XX_NUM_REGS] =3D= { + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REG_REGMAP_PRI, + .desc =3D { + BCM590XX_LDO_DESC(RFLDO, rfldo, ldo_a_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REG_REGMAP_PRI, + .desc =3D { + BCM590XX_LDO_DESC(CAMLDO1, camldo1, ldo_c_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REG_REGMAP_PRI, + .desc =3D { + BCM590XX_LDO_DESC(CAMLDO2, camldo2, ldo_c_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REG_REGMAP_PRI, + .desc =3D { + BCM590XX_LDO_DESC(SIMLDO1, simldo1, ldo_a_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REG_REGMAP_PRI, + .desc =3D { + BCM590XX_LDO_DESC(SIMLDO2, simldo2, ldo_a_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REG_REGMAP_PRI, + .desc =3D { + BCM590XX_LDO_DESC(SDLDO, sdldo, ldo_c_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REG_REGMAP_PRI, + .desc =3D { + BCM590XX_LDO_DESC(SDXLDO, sdxldo, ldo_a_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REG_REGMAP_PRI, + .desc =3D { + BCM590XX_LDO_DESC(MMCLDO1, mmcldo1, ldo_a_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REG_REGMAP_PRI, + .desc =3D { + BCM590XX_LDO_DESC(MMCLDO2, mmcldo2, ldo_a_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REG_REGMAP_PRI, + .desc =3D { + BCM590XX_LDO_DESC(AUDLDO, audldo, ldo_a_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REG_REGMAP_PRI, + .desc =3D { + BCM590XX_LDO_DESC(MICLDO, micldo, ldo_a_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REG_REGMAP_PRI, + .desc =3D { + BCM590XX_LDO_DESC(USBLDO, usbldo, ldo_a_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_LDO, + .regmap =3D BCM590XX_REG_REGMAP_PRI, + .desc =3D { + BCM590XX_LDO_DESC(VIBLDO, vibldo, ldo_c_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_SR, + .regmap =3D BCM590XX_REG_REGMAP_PRI, + .desc =3D { + BCM590XX_SR_DESC(CSR, csr, dcdc_csr_ranges), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_SR, + .regmap =3D BCM590XX_REG_REGMAP_PRI, + .desc =3D { + BCM590XX_SR_DESC(IOSR1, iosr1, dcdc_iosr1_ranges), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_SR, + .regmap =3D BCM590XX_REG_REGMAP_PRI, + .desc =3D { + BCM590XX_SR_DESC(IOSR2, iosr2, dcdc_iosr1_ranges), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_SR, + .regmap =3D BCM590XX_REG_REGMAP_PRI, + .desc =3D { + BCM590XX_SR_DESC(MSR, msr, dcdc_iosr1_ranges), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_SR, + .regmap =3D BCM590XX_REG_REGMAP_PRI, + .desc =3D { + BCM590XX_SR_DESC(SDSR1, sdsr1, dcdc_sdsr1_ranges), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_SR, + .regmap =3D BCM590XX_REG_REGMAP_PRI, + .desc =3D { + BCM590XX_SR_DESC(SDSR2, sdsr2, dcdc_iosr1_ranges), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_SR, + .regmap =3D BCM590XX_REG_REGMAP_PRI, + .desc =3D { + BCM590XX_SR_DESC(VSR, vsr, dcdc_iosr1_ranges), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_GPLDO, + .regmap =3D BCM590XX_REG_REGMAP_SEC, + .desc =3D { + BCM590XX_LDO_DESC(GPLDO1, gpldo1, ldo_a_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_GPLDO, + .regmap =3D BCM590XX_REG_REGMAP_SEC, + .desc =3D { + BCM590XX_LDO_DESC(GPLDO2, gpldo2, ldo_a_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_GPLDO, + .regmap =3D BCM590XX_REG_REGMAP_SEC, + .desc =3D { + BCM590XX_LDO_DESC(GPLDO3, gpldo3, ldo_a_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_GPLDO, + .regmap =3D BCM590XX_REG_REGMAP_SEC, + .desc =3D { + BCM590XX_LDO_DESC(GPLDO4, gpldo4, ldo_a_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_GPLDO, + .regmap =3D BCM590XX_REG_REGMAP_SEC, + .desc =3D { + BCM590XX_LDO_DESC(GPLDO5, gpldo5, ldo_a_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_GPLDO, + .regmap =3D BCM590XX_REG_REGMAP_SEC, + .desc =3D { + BCM590XX_LDO_DESC(GPLDO6, gpldo6, ldo_a_table), + }, + }, + + { + .type =3D BCM590XX_REG_TYPE_VBUS, + .regmap =3D BCM590XX_REG_REGMAP_SEC, + .desc =3D { + BCM590XX_REG_DESC(VBUS, vbus), + .ops =3D &bcm590xx_ops_vbus, + .n_voltages =3D 1, + .fixed_uV =3D 5000000, + .enable_reg =3D BCM590XX_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); struct bcm590xx_reg *pmu; + const struct bcm590xx_reg_info *info; struct regulator_config config =3D { }; - struct bcm590xx_info *info; struct regulator_dev *rdev; - int i; + unsigned int i; =20 pmu =3D devm_kzalloc(&pdev->dev, sizeof(*pmu), GFP_KERNEL); if (!pmu) return -ENOMEM; =20 pmu->mfd =3D bcm590xx; + pmu->n_regulators =3D BCM590XX_NUM_REGS; + pmu->regs =3D bcm590xx_regs; =20 platform_set_drvdata(pdev, pmu); =20 - pmu->desc =3D devm_kcalloc(&pdev->dev, - BCM590XX_NUM_REGS, - sizeof(struct regulator_desc), - GFP_KERNEL); - if (!pmu->desc) - return -ENOMEM; - - info =3D bcm590xx_regs; - - for (i =3D 0; i < BCM590XX_NUM_REGS; i++, info++) { - /* Register the regulators */ - pmu->desc[i].name =3D info->name; - pmu->desc[i].of_match =3D of_match_ptr(info->name); - pmu->desc[i].regulators_node =3D of_match_ptr("regulators"); - pmu->desc[i].supply_name =3D info->vin_name; - pmu->desc[i].id =3D i; - pmu->desc[i].volt_table =3D info->volt_table; - pmu->desc[i].n_voltages =3D info->n_voltages; - pmu->desc[i].linear_ranges =3D info->linear_ranges; - pmu->desc[i].n_linear_ranges =3D info->n_linear_ranges; - - if ((BCM590XX_REG_IS_LDO(i)) || (BCM590XX_REG_IS_GPLDO(i))) { - pmu->desc[i].ops =3D &bcm590xx_ops_ldo; - pmu->desc[i].vsel_mask =3D BCM590XX_LDO_VSEL_MASK; - } else if (BCM590XX_REG_IS_VBUS(i)) - pmu->desc[i].ops =3D &bcm590xx_ops_vbus; - else { - pmu->desc[i].ops =3D &bcm590xx_ops_dcdc; - pmu->desc[i].vsel_mask =3D BCM590XX_SR_VSEL_MASK; - } - - if (BCM590XX_REG_IS_VBUS(i)) - pmu->desc[i].enable_mask =3D BCM590XX_VBUS_ENABLE; - else { - pmu->desc[i].vsel_reg =3D bcm590xx_get_vsel_register(i); - pmu->desc[i].enable_is_inverted =3D true; - pmu->desc[i].enable_mask =3D BCM590XX_REG_ENABLE; - } - pmu->desc[i].enable_reg =3D bcm590xx_get_enable_register(i); - pmu->desc[i].type =3D REGULATOR_VOLTAGE; - pmu->desc[i].owner =3D THIS_MODULE; + /* Register the regulators */ + for (i =3D 0; i < pmu->n_regulators; i++) { + info =3D &pmu->regs[i]; =20 config.dev =3D bcm590xx->dev; config.driver_data =3D pmu; - if (BCM590XX_REG_IS_GPLDO(i) || BCM590XX_REG_IS_VBUS(i)) - config.regmap =3D bcm590xx->regmap_sec; - else + if (info->regmap =3D=3D BCM590XX_REG_REGMAP_PRI) { config.regmap =3D bcm590xx->regmap_pri; + } else if (info->regmap =3D=3D BCM590XX_REG_REGMAP_SEC) { + config.regmap =3D bcm590xx->regmap_sec; + } else { + dev_err(bcm590xx->dev, + "invalid regmap for %s regulator\n", + pdev->name); + return PTR_ERR(rdev); + } =20 - rdev =3D devm_regulator_register(&pdev->dev, &pmu->desc[i], + rdev =3D devm_regulator_register(&pdev->dev, &info->desc, &config); if (IS_ERR(rdev)) { dev_err(bcm590xx->dev, --=20 2.48.1