Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge remote-tracking branch 'regulator/for-5.14' into regulator-next

+6263 -1241
+1
Documentation/devicetree/bindings/mfd/mt6397.txt
··· 21 21 compatible: 22 22 "mediatek,mt6323" for PMIC MT6323 23 23 "mediatek,mt6358" for PMIC MT6358 24 + "mediatek,mt6359" for PMIC MT6359 24 25 "mediatek,mt6397" for PMIC MT6397 25 26 26 27 Optional subnodes:
+88
Documentation/devicetree/bindings/regulator/max8893.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/regulator/max8893.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Regulator driver for MAX8893 PMIC from Maxim Integrated. 8 + 9 + maintainers: 10 + - Sergey Larin <cerg2010cerg2010@mail.ru> 11 + 12 + description: | 13 + The device has 5 LDO regulators and a single BUCK regulator. 14 + Programming is done through I2C bus. 15 + 16 + properties: 17 + compatible: 18 + const: maxim,max8893 19 + 20 + reg: 21 + maxItems: 1 22 + 23 + regulators: 24 + type: object 25 + 26 + patternProperties: 27 + "^(ldo[1-5]|buck)$": 28 + $ref: "regulator.yaml#" 29 + 30 + additionalProperties: false 31 + 32 + additionalProperties: false 33 + 34 + required: 35 + - compatible 36 + - reg 37 + - regulators 38 + 39 + examples: 40 + - | 41 + i2c { 42 + #address-cells = <1>; 43 + #size-cells = <0>; 44 + 45 + pmic@3e { 46 + compatible = "maxim,max8893"; 47 + reg = <0x3e>; 48 + 49 + regulators { 50 + /* Front camera - s5k6aafx, back - m5mo */ 51 + /* Numbers used to indicate the sequence */ 52 + front_1_back_1: buck { 53 + regulator-name = "cam_isp_core_1v2"; 54 + regulator-min-microvolt = <1200000>; 55 + regulator-max-microvolt = <1200000>; 56 + }; 57 + 58 + front_4_back_5: ldo1 { 59 + regulator-name = "vt_io_1v8,cam_isp_1v8"; 60 + regulator-min-microvolt = <1800000>; 61 + regulator-max-microvolt = <1800000>; 62 + }; 63 + 64 + front_3_back_4: ldo2 { 65 + regulator-name = "vt_core_1v5"; 66 + regulator-min-microvolt = <1500000>; 67 + regulator-max-microvolt = <1500000>; 68 + }; 69 + 70 + front_5_back_6: ldo3 { 71 + regulator-name = "vt_cam_1v8,vt_sensor_io_1v8"; 72 + regulator-min-microvolt = <1800000>; 73 + regulator-max-microvolt = <1800000>; 74 + }; 75 + 76 + ldo4 { 77 + /* not used */ 78 + }; 79 + 80 + back_7: ldo5 { 81 + regulator-name = "cam_sensor_io_1v8"; 82 + regulator-min-microvolt = <1800000>; 83 + regulator-max-microvolt = <1800000>; 84 + }; 85 + }; 86 + }; 87 + }; 88 + ...
+385
Documentation/devicetree/bindings/regulator/mt6359-regulator.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/regulator/mt6359-regulator.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: MT6359 Regulator from MediaTek Integrated 8 + 9 + maintainers: 10 + - Hsin-Hsiung Wang <hsin-hsiung.wang@mediatek.com> 11 + 12 + description: | 13 + List of regulators provided by this controller. It is named 14 + according to its regulator type, buck_<name> and ldo_<name>. 15 + MT6359 regulators node should be sub node of the MT6397 MFD node. 16 + 17 + patternProperties: 18 + "^buck_v(s1|gpu11|modem|pu|core|s2|pa|proc2|proc1|core_sshub)$": 19 + type: object 20 + $ref: "regulator.yaml#" 21 + 22 + properties: 23 + regulator-name: 24 + pattern: "^v(s1|gpu11|modem|pu|core|s2|pa|proc2|proc1|core_sshub)$" 25 + 26 + unevaluatedProperties: false 27 + 28 + "^ldo_v(ibr|rf12|usb|camio|efuse|xo22)$": 29 + type: object 30 + $ref: "regulator.yaml#" 31 + 32 + properties: 33 + regulator-name: 34 + pattern: "^v(ibr|rf12|usb|camio|efuse|xo22)$" 35 + 36 + unevaluatedProperties: false 37 + 38 + "^ldo_v(rfck|emc|a12|a09|ufs|bbck)$": 39 + type: object 40 + $ref: "regulator.yaml#" 41 + 42 + properties: 43 + regulator-name: 44 + pattern: "^v(rfck|emc|a12|a09|ufs|bbck)$" 45 + 46 + unevaluatedProperties: false 47 + 48 + "^ldo_vcn(18|13|33_1_bt|13_1_wifi|33_2_bt|33_2_wifi)$": 49 + type: object 50 + $ref: "regulator.yaml#" 51 + 52 + properties: 53 + regulator-name: 54 + pattern: "^vcn(18|13|33_1_bt|13_1_wifi|33_2_bt|33_2_wifi)$" 55 + 56 + unevaluatedProperties: false 57 + 58 + "^ldo_vsram_(proc2|others|md|proc1|others_sshub)$": 59 + type: object 60 + $ref: "regulator.yaml#" 61 + 62 + properties: 63 + regulator-name: 64 + pattern: "^vsram_(proc2|others|md|proc1|others_sshub)$" 65 + 66 + unevaluatedProperties: false 67 + 68 + "^ldo_v(fe|bif|io)28$": 69 + type: object 70 + $ref: "regulator.yaml#" 71 + 72 + properties: 73 + regulator-name: 74 + pattern: "^v(fe|bif|io)28$" 75 + 76 + unevaluatedProperties: false 77 + 78 + "^ldo_v(aud|io|aux|rf|m)18$": 79 + type: object 80 + $ref: "regulator.yaml#" 81 + 82 + properties: 83 + regulator-name: 84 + pattern: "^v(aud|io|aux|rf|m)18$" 85 + 86 + unevaluatedProperties: false 87 + 88 + "^ldo_vsim[12]$": 89 + type: object 90 + $ref: "regulator.yaml#" 91 + 92 + properties: 93 + regulator-name: 94 + pattern: "^vsim[12]$" 95 + 96 + required: 97 + - regulator-name 98 + 99 + unevaluatedProperties: false 100 + 101 + additionalProperties: false 102 + 103 + examples: 104 + - | 105 + pmic { 106 + regulators { 107 + mt6359_vs1_buck_reg: buck_vs1 { 108 + regulator-name = "vs1"; 109 + regulator-min-microvolt = <800000>; 110 + regulator-max-microvolt = <2200000>; 111 + regulator-enable-ramp-delay = <0>; 112 + regulator-always-on; 113 + }; 114 + mt6359_vgpu11_buck_reg: buck_vgpu11 { 115 + regulator-name = "vgpu11"; 116 + regulator-min-microvolt = <400000>; 117 + regulator-max-microvolt = <1193750>; 118 + regulator-ramp-delay = <5000>; 119 + regulator-enable-ramp-delay = <200>; 120 + regulator-allowed-modes = <0 1 2>; 121 + }; 122 + mt6359_vmodem_buck_reg: buck_vmodem { 123 + regulator-name = "vmodem"; 124 + regulator-min-microvolt = <400000>; 125 + regulator-max-microvolt = <1100000>; 126 + regulator-ramp-delay = <10760>; 127 + regulator-enable-ramp-delay = <200>; 128 + }; 129 + mt6359_vpu_buck_reg: buck_vpu { 130 + regulator-name = "vpu"; 131 + regulator-min-microvolt = <400000>; 132 + regulator-max-microvolt = <1193750>; 133 + regulator-ramp-delay = <5000>; 134 + regulator-enable-ramp-delay = <200>; 135 + regulator-allowed-modes = <0 1 2>; 136 + }; 137 + mt6359_vcore_buck_reg: buck_vcore { 138 + regulator-name = "vcore"; 139 + regulator-min-microvolt = <400000>; 140 + regulator-max-microvolt = <1300000>; 141 + regulator-ramp-delay = <5000>; 142 + regulator-enable-ramp-delay = <200>; 143 + regulator-allowed-modes = <0 1 2>; 144 + }; 145 + mt6359_vs2_buck_reg: buck_vs2 { 146 + regulator-name = "vs2"; 147 + regulator-min-microvolt = <800000>; 148 + regulator-max-microvolt = <1600000>; 149 + regulator-enable-ramp-delay = <0>; 150 + regulator-always-on; 151 + }; 152 + mt6359_vpa_buck_reg: buck_vpa { 153 + regulator-name = "vpa"; 154 + regulator-min-microvolt = <500000>; 155 + regulator-max-microvolt = <3650000>; 156 + regulator-enable-ramp-delay = <300>; 157 + }; 158 + mt6359_vproc2_buck_reg: buck_vproc2 { 159 + regulator-name = "vproc2"; 160 + regulator-min-microvolt = <400000>; 161 + regulator-max-microvolt = <1193750>; 162 + regulator-ramp-delay = <7500>; 163 + regulator-enable-ramp-delay = <200>; 164 + regulator-allowed-modes = <0 1 2>; 165 + }; 166 + mt6359_vproc1_buck_reg: buck_vproc1 { 167 + regulator-name = "vproc1"; 168 + regulator-min-microvolt = <400000>; 169 + regulator-max-microvolt = <1193750>; 170 + regulator-ramp-delay = <7500>; 171 + regulator-enable-ramp-delay = <200>; 172 + regulator-allowed-modes = <0 1 2>; 173 + }; 174 + mt6359_vcore_sshub_buck_reg: buck_vcore_sshub { 175 + regulator-name = "vcore_sshub"; 176 + regulator-min-microvolt = <400000>; 177 + regulator-max-microvolt = <1193750>; 178 + }; 179 + mt6359_vgpu11_sshub_buck_reg: buck_vgpu11_sshub { 180 + regulator-name = "vgpu11_sshub"; 181 + regulator-min-microvolt = <400000>; 182 + regulator-max-microvolt = <1193750>; 183 + }; 184 + mt6359_vaud18_ldo_reg: ldo_vaud18 { 185 + regulator-name = "vaud18"; 186 + regulator-min-microvolt = <1800000>; 187 + regulator-max-microvolt = <1800000>; 188 + regulator-enable-ramp-delay = <240>; 189 + }; 190 + mt6359_vsim1_ldo_reg: ldo_vsim1 { 191 + regulator-name = "vsim1"; 192 + regulator-min-microvolt = <1700000>; 193 + regulator-max-microvolt = <3100000>; 194 + }; 195 + mt6359_vibr_ldo_reg: ldo_vibr { 196 + regulator-name = "vibr"; 197 + regulator-min-microvolt = <1200000>; 198 + regulator-max-microvolt = <3300000>; 199 + }; 200 + mt6359_vrf12_ldo_reg: ldo_vrf12 { 201 + regulator-name = "vrf12"; 202 + regulator-min-microvolt = <1100000>; 203 + regulator-max-microvolt = <1300000>; 204 + }; 205 + mt6359_vusb_ldo_reg: ldo_vusb { 206 + regulator-name = "vusb"; 207 + regulator-min-microvolt = <3000000>; 208 + regulator-max-microvolt = <3000000>; 209 + regulator-enable-ramp-delay = <960>; 210 + regulator-always-on; 211 + }; 212 + mt6359_vsram_proc2_ldo_reg: ldo_vsram_proc2 { 213 + regulator-name = "vsram_proc2"; 214 + regulator-min-microvolt = <500000>; 215 + regulator-max-microvolt = <1293750>; 216 + regulator-ramp-delay = <7500>; 217 + regulator-enable-ramp-delay = <240>; 218 + regulator-always-on; 219 + }; 220 + mt6359_vio18_ldo_reg: ldo_vio18 { 221 + regulator-name = "vio18"; 222 + regulator-min-microvolt = <1700000>; 223 + regulator-max-microvolt = <1900000>; 224 + regulator-enable-ramp-delay = <960>; 225 + regulator-always-on; 226 + }; 227 + mt6359_vcamio_ldo_reg: ldo_vcamio { 228 + regulator-name = "vcamio"; 229 + regulator-min-microvolt = <1700000>; 230 + regulator-max-microvolt = <1900000>; 231 + }; 232 + mt6359_vcn18_ldo_reg: ldo_vcn18 { 233 + regulator-name = "vcn18"; 234 + regulator-min-microvolt = <1800000>; 235 + regulator-max-microvolt = <1800000>; 236 + regulator-enable-ramp-delay = <240>; 237 + }; 238 + mt6359_vfe28_ldo_reg: ldo_vfe28 { 239 + regulator-name = "vfe28"; 240 + regulator-min-microvolt = <2800000>; 241 + regulator-max-microvolt = <2800000>; 242 + regulator-enable-ramp-delay = <120>; 243 + }; 244 + mt6359_vcn13_ldo_reg: ldo_vcn13 { 245 + regulator-name = "vcn13"; 246 + regulator-min-microvolt = <900000>; 247 + regulator-max-microvolt = <1300000>; 248 + }; 249 + mt6359_vcn33_1_bt_ldo_reg: ldo_vcn33_1_bt { 250 + regulator-name = "vcn33_1_bt"; 251 + regulator-min-microvolt = <2800000>; 252 + regulator-max-microvolt = <3500000>; 253 + }; 254 + mt6359_vcn33_1_wifi_ldo_reg: ldo_vcn33_1_wifi { 255 + regulator-name = "vcn33_1_wifi"; 256 + regulator-min-microvolt = <2800000>; 257 + regulator-max-microvolt = <3500000>; 258 + }; 259 + mt6359_vaux18_ldo_reg: ldo_vaux18 { 260 + regulator-name = "vaux18"; 261 + regulator-min-microvolt = <1800000>; 262 + regulator-max-microvolt = <1800000>; 263 + regulator-enable-ramp-delay = <240>; 264 + regulator-always-on; 265 + }; 266 + mt6359_vsram_others_ldo_reg: ldo_vsram_others { 267 + regulator-name = "vsram_others"; 268 + regulator-min-microvolt = <500000>; 269 + regulator-max-microvolt = <1293750>; 270 + regulator-ramp-delay = <5000>; 271 + regulator-enable-ramp-delay = <240>; 272 + }; 273 + mt6359_vefuse_ldo_reg: ldo_vefuse { 274 + regulator-name = "vefuse"; 275 + regulator-min-microvolt = <1700000>; 276 + regulator-max-microvolt = <2000000>; 277 + }; 278 + mt6359_vxo22_ldo_reg: ldo_vxo22 { 279 + regulator-name = "vxo22"; 280 + regulator-min-microvolt = <1800000>; 281 + regulator-max-microvolt = <2200000>; 282 + regulator-always-on; 283 + }; 284 + mt6359_vrfck_ldo_reg: ldo_vrfck { 285 + regulator-name = "vrfck"; 286 + regulator-min-microvolt = <1500000>; 287 + regulator-max-microvolt = <1700000>; 288 + }; 289 + mt6359_vrfck_1_ldo_reg: ldo_vrfck_1 { 290 + regulator-name = "vrfck"; 291 + regulator-min-microvolt = <1240000>; 292 + regulator-max-microvolt = <1600000>; 293 + }; 294 + mt6359_vbif28_ldo_reg: ldo_vbif28 { 295 + regulator-name = "vbif28"; 296 + regulator-min-microvolt = <2800000>; 297 + regulator-max-microvolt = <2800000>; 298 + regulator-enable-ramp-delay = <240>; 299 + }; 300 + mt6359_vio28_ldo_reg: ldo_vio28 { 301 + regulator-name = "vio28"; 302 + regulator-min-microvolt = <2800000>; 303 + regulator-max-microvolt = <3300000>; 304 + regulator-always-on; 305 + }; 306 + mt6359_vemc_ldo_reg: ldo_vemc { 307 + regulator-name = "vemc"; 308 + regulator-min-microvolt = <2900000>; 309 + regulator-max-microvolt = <3300000>; 310 + }; 311 + mt6359_vemc_1_ldo_reg: ldo_vemc_1 { 312 + regulator-name = "vemc"; 313 + regulator-min-microvolt = <2500000>; 314 + regulator-max-microvolt = <3300000>; 315 + }; 316 + mt6359_vcn33_2_bt_ldo_reg: ldo_vcn33_2_bt { 317 + regulator-name = "vcn33_2_bt"; 318 + regulator-min-microvolt = <2800000>; 319 + regulator-max-microvolt = <3500000>; 320 + }; 321 + mt6359_vcn33_2_wifi_ldo_reg: ldo_vcn33_2_wifi { 322 + regulator-name = "vcn33_2_wifi"; 323 + regulator-min-microvolt = <2800000>; 324 + regulator-max-microvolt = <3500000>; 325 + }; 326 + mt6359_va12_ldo_reg: ldo_va12 { 327 + regulator-name = "va12"; 328 + regulator-min-microvolt = <1200000>; 329 + regulator-max-microvolt = <1300000>; 330 + regulator-always-on; 331 + }; 332 + mt6359_va09_ldo_reg: ldo_va09 { 333 + regulator-name = "va09"; 334 + regulator-min-microvolt = <800000>; 335 + regulator-max-microvolt = <1200000>; 336 + }; 337 + mt6359_vrf18_ldo_reg: ldo_vrf18 { 338 + regulator-name = "vrf18"; 339 + regulator-min-microvolt = <1700000>; 340 + regulator-max-microvolt = <1810000>; 341 + }; 342 + mt6359_vsram_md_ldo_reg: ldo_vsram_md { 343 + regulator-name = "vsram_md"; 344 + regulator-min-microvolt = <500000>; 345 + regulator-max-microvolt = <1293750>; 346 + regulator-ramp-delay = <10760>; 347 + regulator-enable-ramp-delay = <240>; 348 + }; 349 + mt6359_vufs_ldo_reg: ldo_vufs { 350 + regulator-name = "vufs"; 351 + regulator-min-microvolt = <1700000>; 352 + regulator-max-microvolt = <1900000>; 353 + }; 354 + mt6359_vm18_ldo_reg: ldo_vm18 { 355 + regulator-name = "vm18"; 356 + regulator-min-microvolt = <1700000>; 357 + regulator-max-microvolt = <1900000>; 358 + regulator-always-on; 359 + }; 360 + mt6359_vbbck_ldo_reg: ldo_vbbck { 361 + regulator-name = "vbbck"; 362 + regulator-min-microvolt = <1100000>; 363 + regulator-max-microvolt = <1200000>; 364 + }; 365 + mt6359_vsram_proc1_ldo_reg: ldo_vsram_proc1 { 366 + regulator-name = "vsram_proc1"; 367 + regulator-min-microvolt = <500000>; 368 + regulator-max-microvolt = <1293750>; 369 + regulator-ramp-delay = <7500>; 370 + regulator-enable-ramp-delay = <240>; 371 + regulator-always-on; 372 + }; 373 + mt6359_vsim2_ldo_reg: ldo_vsim2 { 374 + regulator-name = "vsim2"; 375 + regulator-min-microvolt = <1700000>; 376 + regulator-max-microvolt = <3100000>; 377 + }; 378 + mt6359_vsram_others_sshub_ldo: ldo_vsram_others_sshub { 379 + regulator-name = "vsram_others_sshub"; 380 + regulator-min-microvolt = <500000>; 381 + regulator-max-microvolt = <1293750>; 382 + }; 383 + }; 384 + }; 385 + ...
+9 -8
Documentation/devicetree/bindings/regulator/qcom,rpmh-regulator.yaml
··· 33 33 34 34 The names used for regulator nodes must match those supported by a given 35 35 PMIC. Supported regulator node names are 36 + For PM6150, smps1 - smps5, ldo1 - ldo19 37 + For PM6150L, smps1 - smps8, ldo1 - ldo11, bob 38 + For PM7325, smps1 - smps8, ldo1 - ldo19 36 39 For PM8005, smps1 - smps4 37 40 For PM8009, smps1 - smps2, ldo1 - ldo7 38 41 For PM8150, smps1 - smps10, ldo1 - ldo18 ··· 44 41 For PM8350C, smps1 - smps10, ldo1 - ldo13, bob 45 42 For PM8998, smps1 - smps13, ldo1 - ldo28, lvs1 - lvs2 46 43 For PMI8998, bob 47 - For PM6150, smps1 - smps5, ldo1 - ldo19 48 - For PM6150L, smps1 - smps8, ldo1 - ldo11, bob 49 - For PMX55, smps1 - smps7, ldo1 - ldo16 50 - For PM7325, smps1 - smps8, ldo1 - ldo19 51 44 For PMR735A, smps1 - smps3, ldo1 - ldo7 45 + For PMX55, smps1 - smps7, ldo1 - ldo16 52 46 53 47 properties: 54 48 compatible: 55 49 enum: 50 + - qcom,pm6150-rpmh-regulators 51 + - qcom,pm6150l-rpmh-regulators 52 + - qcom,pm7325-rpmh-regulators 56 53 - qcom,pm8005-rpmh-regulators 57 54 - qcom,pm8009-rpmh-regulators 58 55 - qcom,pm8009-1-rpmh-regulators ··· 62 59 - qcom,pm8350c-rpmh-regulators 63 60 - qcom,pm8998-rpmh-regulators 64 61 - qcom,pmi8998-rpmh-regulators 65 - - qcom,pm6150-rpmh-regulators 66 - - qcom,pm6150l-rpmh-regulators 67 - - qcom,pmx55-rpmh-regulators 68 - - qcom,pm7325-rpmh-regulators 62 + - qcom,pmm8155au-rpmh-regulators 69 63 - qcom,pmr735a-rpmh-regulators 64 + - qcom,pmx55-rpmh-regulators 70 65 71 66 qcom,pmic-id: 72 67 description: |
+5
Documentation/devicetree/bindings/regulator/qcom,smd-rpm-regulator.yaml
··· 24 24 25 25 For mp5496, s2 26 26 27 + For pm8226, s1, s2, s3, s4, s5, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, 28 + l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, l25, 29 + l26, l27, l28, lvs1 30 + 27 31 For pm8841, s1, s2, s3, s4, s5, s6, s7, s8 28 32 29 33 For pm8916, s1, s2, s3, s4, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, ··· 72 68 compatible: 73 69 enum: 74 70 - qcom,rpm-mp5496-regulators 71 + - qcom,rpm-pm8226-regulators 75 72 - qcom,rpm-pm8841-regulators 76 73 - qcom,rpm-pm8916-regulators 77 74 - qcom,rpm-pm8941-regulators
+82
Documentation/devicetree/bindings/regulator/regulator.yaml
··· 117 117 description: Enable over current protection. 118 118 type: boolean 119 119 120 + regulator-oc-protection-microamp: 121 + description: Set over current protection limit. This is a limit where 122 + hardware performs emergency shutdown. Zero can be passed to disable 123 + protection and value '1' indicates that protection should be enabled but 124 + limit setting can be omitted. 125 + 126 + regulator-oc-error-microamp: 127 + description: Set over current error limit. This is a limit where part of 128 + the hardware propably is malfunctional and damage prevention is requested. 129 + Zero can be passed to disable error detection and value '1' indicates 130 + that detection should be enabled but limit setting can be omitted. 131 + 132 + regulator-oc-warn-microamp: 133 + description: Set over current warning limit. This is a limit where hardware 134 + is assumed still to be functional but approaching limit where it gets 135 + damaged. Recovery actions should be initiated. Zero can be passed to 136 + disable detection and value '1' indicates that detection should 137 + be enabled but limit setting can be omitted. 138 + 139 + regulator-ov-protection-microvolt: 140 + description: Set over voltage protection limit. This is a limit where 141 + hardware performs emergency shutdown. Zero can be passed to disable 142 + protection and value '1' indicates that protection should be enabled but 143 + limit setting can be omitted. Limit is given as microvolt offset from 144 + voltage set to regulator. 145 + 146 + regulator-ov-error-microvolt: 147 + description: Set over voltage error limit. This is a limit where part of 148 + the hardware propably is malfunctional and damage prevention is requested 149 + Zero can be passed to disable error detection and value '1' indicates 150 + that detection should be enabled but limit setting can be omitted. Limit 151 + is given as microvolt offset from voltage set to regulator. 152 + 153 + regulator-ov-warn-microvolt: 154 + description: Set over voltage warning limit. This is a limit where hardware 155 + is assumed still to be functional but approaching limit where it gets 156 + damaged. Recovery actions should be initiated. Zero can be passed to 157 + disable detection and value '1' indicates that detection should 158 + be enabled but limit setting can be omitted. Limit is given as microvolt 159 + offset from voltage set to regulator. 160 + 161 + regulator-uv-protection-microvolt: 162 + description: Set over under voltage protection limit. This is a limit where 163 + hardware performs emergency shutdown. Zero can be passed to disable 164 + protection and value '1' indicates that protection should be enabled but 165 + limit setting can be omitted. Limit is given as microvolt offset from 166 + voltage set to regulator. 167 + 168 + regulator-uv-error-microvolt: 169 + description: Set under voltage error limit. This is a limit where part of 170 + the hardware propably is malfunctional and damage prevention is requested 171 + Zero can be passed to disable error detection and value '1' indicates 172 + that detection should be enabled but limit setting can be omitted. Limit 173 + is given as microvolt offset from voltage set to regulator. 174 + 175 + regulator-uv-warn-microvolt: 176 + description: Set over under voltage warning limit. This is a limit where 177 + hardware is assumed still to be functional but approaching limit where 178 + it gets damaged. Recovery actions should be initiated. Zero can be passed 179 + to disable detection and value '1' indicates that detection should 180 + be enabled but limit setting can be omitted. Limit is given as microvolt 181 + offset from voltage set to regulator. 182 + 183 + regulator-temp-protection-kelvin: 184 + description: Set over temperature protection limit. This is a limit where 185 + hardware performs emergency shutdown. Zero can be passed to disable 186 + protection and value '1' indicates that protection should be enabled but 187 + limit setting can be omitted. 188 + 189 + regulator-temp-error-kelvin: 190 + description: Set over temperature error limit. This is a limit where part of 191 + the hardware propably is malfunctional and damage prevention is requested 192 + Zero can be passed to disable error detection and value '1' indicates 193 + that detection should be enabled but limit setting can be omitted. 194 + 195 + regulator-temp-warn-kelvin: 196 + description: Set over temperature warning limit. This is a limit where 197 + hardware is assumed still to be functional but approaching limit where it 198 + gets damaged. Recovery actions should be initiated. Zero can be passed to 199 + disable detection and value '1' indicates that detection should 200 + be enabled but limit setting can be omitted. 201 + 120 202 regulator-active-discharge: 121 203 description: | 122 204 tristate, enable/disable active discharge of regulators. The values are:
+61
Documentation/devicetree/bindings/regulator/richtek,rt6160-regulator.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/regulator/richtek,rt6160-regulator.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Richtek RT6160 BuckBoost converter 8 + 9 + maintainers: 10 + - ChiYuan Huang <cy_huang@richtek.com> 11 + 12 + description: | 13 + The RT6160 is a high-efficiency buck-boost converter that can provide 14 + up to 3A output current from 2025mV to 5200mV. And it support the wide 15 + input voltage range from 2200mV to 5500mV. 16 + 17 + Datasheet is available at 18 + https://www.richtek.com/assets/product_file/RT6160A/DS6160A-00.pdf 19 + 20 + allOf: 21 + - $ref: regulator.yaml# 22 + 23 + properties: 24 + compatible: 25 + enum: 26 + - richtek,rt6160 27 + 28 + reg: 29 + maxItems: 1 30 + 31 + enable-gpios: 32 + description: A connection of the 'enable' gpio line. 33 + maxItems: 1 34 + 35 + richtek,vsel-active-low: 36 + description: | 37 + Used to indicate the 'vsel' pin active level. if not specified, use 38 + high active level as the default. 39 + type: boolean 40 + 41 + required: 42 + - compatible 43 + - reg 44 + 45 + unevaluatedProperties: false 46 + 47 + examples: 48 + - | 49 + i2c { 50 + #address-cells = <1>; 51 + #size-cells = <0>; 52 + 53 + rt6160@75 { 54 + compatible = "richtek,rt6160"; 55 + reg = <0x75>; 56 + enable-gpios = <&gpio26 2 0>; 57 + regulator-name = "rt6160-buckboost"; 58 + regulator-min-microvolt = <2025000>; 59 + regulator-max-microvolt = <5200000>; 60 + }; 61 + };
+89
Documentation/devicetree/bindings/regulator/richtek,rt6245-regulator.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/regulator/richtek,rt6245-regulator.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Richtek RT6245 High Current Voltage Regulator 8 + 9 + maintainers: 10 + - ChiYuan Huang <cy_huang@richtek.com> 11 + 12 + description: | 13 + The RT6245 is a high-performance, synchronous step-down converter 14 + that can deliver up to 14A output current with an input supply 15 + voltage range of 4.5V to 17V. 16 + 17 + allOf: 18 + - $ref: regulator.yaml# 19 + 20 + properties: 21 + compatible: 22 + enum: 23 + - richtek,rt6245 24 + 25 + reg: 26 + maxItems: 1 27 + 28 + enable-gpios: 29 + description: | 30 + A connection of the chip 'enable' gpio line. If not provided, 31 + it will be treat as a default-on power. 32 + maxItems: 1 33 + 34 + richtek,oc-level-select: 35 + $ref: "/schemas/types.yaml#/definitions/uint8" 36 + enum: [0, 1, 2, 3] 37 + description: | 38 + Over current level selection. Each respective value means the current 39 + limit 8A, 14A, 12A, 10A. If this property is missing then keep in 40 + in chip default. 41 + 42 + richtek,ot-level-select: 43 + $ref: "/schemas/types.yaml#/definitions/uint8" 44 + enum: [0, 1, 2] 45 + description: | 46 + Over temperature level selection. Each respective value means the degree 47 + 150'c, 130'c, 170'c. If this property is missing then keep in chip 48 + default. 49 + 50 + richtek,pgdly-time-select: 51 + $ref: "/schemas/types.yaml#/definitions/uint8" 52 + enum: [0, 1, 2, 3] 53 + description: | 54 + Power good signal delay time selection. Each respective value means the 55 + delay time 0us, 10us, 20us, 40us. If this property is missing then keep 56 + in chip default. 57 + 58 + 59 + richtek,switch-freq-select: 60 + $ref: "/schemas/types.yaml#/definitions/uint8" 61 + enum: [0, 1, 2] 62 + description: | 63 + Buck switch frequency selection. Each respective value means 400KHz, 64 + 800KHz, 1200KHz. If this property is missing then keep in chip default. 65 + 66 + required: 67 + - compatible 68 + - reg 69 + 70 + unevaluatedProperties: false 71 + 72 + examples: 73 + - | 74 + i2c { 75 + #address-cells = <1>; 76 + #size-cells = <0>; 77 + 78 + rt6245@34 { 79 + compatible = "richtek,rt6245"; 80 + status = "okay"; 81 + reg = <0x34>; 82 + enable-gpios = <&gpio26 2 0>; 83 + 84 + regulator-name = "rt6245-regulator"; 85 + regulator-min-microvolt = <437500>; 86 + regulator-max-microvolt = <1387500>; 87 + regulator-boot-on; 88 + }; 89 + };
+6
Documentation/devicetree/bindings/regulator/rohm,bd9576-regulator.yaml
··· 27 27 Properties for single regulator. 28 28 $ref: "regulator.yaml#" 29 29 30 + properties: 31 + rohm,ocw-fet-ron-micro-ohms: 32 + description: | 33 + External FET's ON-resistance. Required if VoutS1 OCP/OCW is 34 + to be set. 35 + 30 36 required: 31 37 - regulator-name 32 38
+9 -15
Documentation/driver-api/thermal/sysfs-api.rst
··· 740 740 5. thermal_emergency_poweroff 741 741 ============================= 742 742 743 - On an event of critical trip temperature crossing. Thermal framework 744 - allows the system to shutdown gracefully by calling orderly_poweroff(). 745 - In the event of a failure of orderly_poweroff() to shut down the system 746 - we are in danger of keeping the system alive at undesirably high 747 - temperatures. To mitigate this high risk scenario we program a work 748 - queue to fire after a pre-determined number of seconds to start 749 - an emergency shutdown of the device using the kernel_power_off() 750 - function. In case kernel_power_off() fails then finally 751 - emergency_restart() is called in the worst case. 743 + On an event of critical trip temperature crossing the thermal framework 744 + shuts down the system by calling hw_protection_shutdown(). The 745 + hw_protection_shutdown() first attempts to perform an orderly shutdown 746 + but accepts a delay after which it proceeds doing a forced power-off 747 + or as last resort an emergency_restart. 752 748 753 749 The delay should be carefully profiled so as to give adequate time for 754 - orderly_poweroff(). In case of failure of an orderly_poweroff() the 755 - emergency poweroff kicks in after the delay has elapsed and shuts down 756 - the system. 750 + orderly poweroff. 757 751 758 - If set to 0 emergency poweroff will not be supported. So a carefully 759 - profiled non-zero positive value is a must for emergency poweroff to be 760 - triggered. 752 + If the delay is set to 0 emergency poweroff will not be supported. So a 753 + carefully profiled non-zero positive value is a must for emergency 754 + poweroff to be triggered.
+4
MAINTAINERS
··· 19578 19578 F: include/linux/regulator/ 19579 19579 K: regulator_get_optional 19580 19580 19581 + VOLTAGE AND CURRENT REGULATOR IRQ HELPERS 19582 + R: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com> 19583 + F: drivers/regulator/irq_helpers.c 19584 + 19581 19585 VRF 19582 19586 M: David Ahern <dsahern@kernel.org> 19583 19587 L: netdev@vger.kernel.org
+62 -27
drivers/mfd/mt6358-irq.c
··· 5 5 #include <linux/interrupt.h> 6 6 #include <linux/mfd/mt6358/core.h> 7 7 #include <linux/mfd/mt6358/registers.h> 8 + #include <linux/mfd/mt6359/core.h> 9 + #include <linux/mfd/mt6359/registers.h> 8 10 #include <linux/mfd/mt6397/core.h> 9 11 #include <linux/module.h> 10 12 #include <linux/of.h> ··· 15 13 #include <linux/platform_device.h> 16 14 #include <linux/regmap.h> 17 15 18 - static struct irq_top_t mt6358_ints[] = { 16 + #define MTK_PMIC_REG_WIDTH 16 17 + 18 + static const struct irq_top_t mt6358_ints[] = { 19 19 MT6358_TOP_GEN(BUCK), 20 20 MT6358_TOP_GEN(LDO), 21 21 MT6358_TOP_GEN(PSC), ··· 26 22 MT6358_TOP_GEN(HK), 27 23 MT6358_TOP_GEN(AUD), 28 24 MT6358_TOP_GEN(MISC), 25 + }; 26 + 27 + static const struct irq_top_t mt6359_ints[] = { 28 + MT6359_TOP_GEN(BUCK), 29 + MT6359_TOP_GEN(LDO), 30 + MT6359_TOP_GEN(PSC), 31 + MT6359_TOP_GEN(SCK), 32 + MT6359_TOP_GEN(BM), 33 + MT6359_TOP_GEN(HK), 34 + MT6359_TOP_GEN(AUD), 35 + MT6359_TOP_GEN(MISC), 36 + }; 37 + 38 + static struct pmic_irq_data mt6358_irqd = { 39 + .num_top = ARRAY_SIZE(mt6358_ints), 40 + .num_pmic_irqs = MT6358_IRQ_NR, 41 + .top_int_status_reg = MT6358_TOP_INT_STATUS0, 42 + .pmic_ints = mt6358_ints, 43 + }; 44 + 45 + static struct pmic_irq_data mt6359_irqd = { 46 + .num_top = ARRAY_SIZE(mt6359_ints), 47 + .num_pmic_irqs = MT6359_IRQ_NR, 48 + .top_int_status_reg = MT6359_TOP_INT_STATUS0, 49 + .pmic_ints = mt6359_ints, 29 50 }; 30 51 31 52 static void pmic_irq_enable(struct irq_data *data) ··· 91 62 /* Find out the IRQ group */ 92 63 top_gp = 0; 93 64 while ((top_gp + 1) < irqd->num_top && 94 - i >= mt6358_ints[top_gp + 1].hwirq_base) 65 + i >= irqd->pmic_ints[top_gp + 1].hwirq_base) 95 66 top_gp++; 96 67 97 68 /* Find the IRQ registers */ 98 - gp_offset = i - mt6358_ints[top_gp].hwirq_base; 99 - int_regs = gp_offset / MT6358_REG_WIDTH; 100 - shift = gp_offset % MT6358_REG_WIDTH; 101 - en_reg = mt6358_ints[top_gp].en_reg + 102 - (mt6358_ints[top_gp].en_reg_shift * int_regs); 69 + gp_offset = i - irqd->pmic_ints[top_gp].hwirq_base; 70 + int_regs = gp_offset / MTK_PMIC_REG_WIDTH; 71 + shift = gp_offset % MTK_PMIC_REG_WIDTH; 72 + en_reg = irqd->pmic_ints[top_gp].en_reg + 73 + (irqd->pmic_ints[top_gp].en_reg_shift * int_regs); 103 74 104 75 regmap_update_bits(chip->regmap, en_reg, BIT(shift), 105 76 irqd->enable_hwirq[i] << shift); ··· 124 95 unsigned int irq_status, sta_reg, status; 125 96 unsigned int hwirq, virq; 126 97 int i, j, ret; 98 + struct pmic_irq_data *irqd = chip->irq_data; 127 99 128 - for (i = 0; i < mt6358_ints[top_gp].num_int_regs; i++) { 129 - sta_reg = mt6358_ints[top_gp].sta_reg + 130 - mt6358_ints[top_gp].sta_reg_shift * i; 100 + for (i = 0; i < irqd->pmic_ints[top_gp].num_int_regs; i++) { 101 + sta_reg = irqd->pmic_ints[top_gp].sta_reg + 102 + irqd->pmic_ints[top_gp].sta_reg_shift * i; 131 103 132 104 ret = regmap_read(chip->regmap, sta_reg, &irq_status); 133 105 if (ret) { ··· 144 114 do { 145 115 j = __ffs(status); 146 116 147 - hwirq = mt6358_ints[top_gp].hwirq_base + 148 - MT6358_REG_WIDTH * i + j; 117 + hwirq = irqd->pmic_ints[top_gp].hwirq_base + 118 + MTK_PMIC_REG_WIDTH * i + j; 149 119 150 120 virq = irq_find_mapping(chip->irq_domain, hwirq); 151 121 if (virq) ··· 161 131 static irqreturn_t mt6358_irq_handler(int irq, void *data) 162 132 { 163 133 struct mt6397_chip *chip = data; 164 - struct pmic_irq_data *mt6358_irq_data = chip->irq_data; 134 + struct pmic_irq_data *irqd = chip->irq_data; 165 135 unsigned int bit, i, top_irq_status = 0; 166 136 int ret; 167 137 168 138 ret = regmap_read(chip->regmap, 169 - mt6358_irq_data->top_int_status_reg, 139 + irqd->top_int_status_reg, 170 140 &top_irq_status); 171 141 if (ret) { 172 142 dev_err(chip->dev, ··· 174 144 return IRQ_NONE; 175 145 } 176 146 177 - for (i = 0; i < mt6358_irq_data->num_top; i++) { 178 - bit = BIT(mt6358_ints[i].top_offset); 147 + for (i = 0; i < irqd->num_top; i++) { 148 + bit = BIT(irqd->pmic_ints[i].top_offset); 179 149 if (top_irq_status & bit) { 180 150 mt6358_irq_sp_handler(chip, i); 181 151 top_irq_status &= ~bit; ··· 210 180 int i, j, ret; 211 181 struct pmic_irq_data *irqd; 212 182 213 - irqd = devm_kzalloc(chip->dev, sizeof(*irqd), GFP_KERNEL); 214 - if (!irqd) 215 - return -ENOMEM; 183 + switch (chip->chip_id) { 184 + case MT6358_CHIP_ID: 185 + chip->irq_data = &mt6358_irqd; 186 + break; 216 187 217 - chip->irq_data = irqd; 188 + case MT6359_CHIP_ID: 189 + chip->irq_data = &mt6359_irqd; 190 + break; 191 + 192 + default: 193 + dev_err(chip->dev, "unsupported chip: 0x%x\n", chip->chip_id); 194 + return -ENODEV; 195 + } 218 196 219 197 mutex_init(&chip->irqlock); 220 - irqd->top_int_status_reg = MT6358_TOP_INT_STATUS0; 221 - irqd->num_pmic_irqs = MT6358_IRQ_NR; 222 - irqd->num_top = ARRAY_SIZE(mt6358_ints); 223 - 198 + irqd = chip->irq_data; 224 199 irqd->enable_hwirq = devm_kcalloc(chip->dev, 225 200 irqd->num_pmic_irqs, 226 201 sizeof(*irqd->enable_hwirq), ··· 242 207 243 208 /* Disable all interrupts for initializing */ 244 209 for (i = 0; i < irqd->num_top; i++) { 245 - for (j = 0; j < mt6358_ints[i].num_int_regs; j++) 210 + for (j = 0; j < irqd->pmic_ints[i].num_int_regs; j++) 246 211 regmap_write(chip->regmap, 247 - mt6358_ints[i].en_reg + 248 - mt6358_ints[i].en_reg_shift * j, 0); 212 + irqd->pmic_ints[i].en_reg + 213 + irqd->pmic_ints[i].en_reg_shift * j, 0); 249 214 } 250 215 251 216 chip->irq_domain = irq_domain_add_linear(chip->dev->of_node,
+24
drivers/mfd/mt6397-core.c
··· 13 13 #include <linux/mfd/core.h> 14 14 #include <linux/mfd/mt6323/core.h> 15 15 #include <linux/mfd/mt6358/core.h> 16 + #include <linux/mfd/mt6359/core.h> 16 17 #include <linux/mfd/mt6397/core.h> 17 18 #include <linux/mfd/mt6323/registers.h> 18 19 #include <linux/mfd/mt6358/registers.h> 20 + #include <linux/mfd/mt6359/registers.h> 19 21 #include <linux/mfd/mt6397/registers.h> 20 22 21 23 #define MT6323_RTC_BASE 0x8000 ··· 101 99 }, 102 100 }; 103 101 102 + static const struct mfd_cell mt6359_devs[] = { 103 + { .name = "mt6359-regulator", }, 104 + { 105 + .name = "mt6359-rtc", 106 + .num_resources = ARRAY_SIZE(mt6358_rtc_resources), 107 + .resources = mt6358_rtc_resources, 108 + .of_compatible = "mediatek,mt6358-rtc", 109 + }, 110 + { .name = "mt6359-sound", }, 111 + }; 112 + 104 113 static const struct mfd_cell mt6397_devs[] = { 105 114 { 106 115 .name = "mt6397-rtc", ··· 159 146 .cid_shift = 8, 160 147 .cells = mt6358_devs, 161 148 .cell_size = ARRAY_SIZE(mt6358_devs), 149 + .irq_init = mt6358_irq_init, 150 + }; 151 + 152 + static const struct chip_data mt6359_core = { 153 + .cid_addr = MT6359_SWCID, 154 + .cid_shift = 8, 155 + .cells = mt6359_devs, 156 + .cell_size = ARRAY_SIZE(mt6359_devs), 162 157 .irq_init = mt6358_irq_init, 163 158 }; 164 159 ··· 239 218 }, { 240 219 .compatible = "mediatek,mt6358", 241 220 .data = &mt6358_core, 221 + }, { 222 + .compatible = "mediatek,mt6359", 223 + .data = &mt6359_core, 242 224 }, { 243 225 .compatible = "mediatek,mt6397", 244 226 .data = &mt6397_core,
+44 -11
drivers/regulator/Kconfig
··· 193 193 BCM590xx PMUs. This will enable support for the software 194 194 controllable LDO/Switching regulators. 195 195 196 - config REGULATOR_BD70528 197 - tristate "ROHM BD70528 Power Regulator" 198 - depends on MFD_ROHM_BD70528 199 - help 200 - This driver supports voltage regulators on ROHM BD70528 PMIC. 201 - This will enable support for the software controllable buck 202 - and LDO regulators. 203 - 204 - This driver can also be built as a module. If so, the module 205 - will be called bd70528-regulator. 206 - 207 196 config REGULATOR_BD71815 208 197 tristate "ROHM BD71815 Power Regulator" 209 198 depends on MFD_ROHM_BD71828 199 + select REGULATOR_ROHM 210 200 help 211 201 This driver supports voltage regulators on ROHM BD71815 PMIC. 212 202 This will enable support for the software controllable buck ··· 578 588 This driver controls a Maxim 8660/8661 voltage output 579 589 regulator via I2C bus. 580 590 591 + config REGULATOR_MAX8893 592 + tristate "Maxim 8893 voltage regulator" 593 + depends on I2C 594 + select REGMAP_I2C 595 + help 596 + This driver controls a Maxim 8893 voltage output 597 + regulator via I2C bus. 598 + 581 599 config REGULATOR_MAX8907 582 600 tristate "Maxim 8907 voltage regulator" 583 601 depends on MFD_MAX8907 || COMPILE_TEST ··· 774 776 help 775 777 Say y here to select this option to enable the power regulator of 776 778 MediaTek MT6358 PMIC. 779 + This driver supports the control of different power rails of device 780 + through regulator interface. 781 + 782 + config REGULATOR_MT6359 783 + tristate "MediaTek MT6359 PMIC" 784 + depends on MFD_MT6397 785 + help 786 + Say y here to select this option to enable the power regulator of 787 + MediaTek MT6359 PMIC. 777 788 This driver supports the control of different power rails of device 778 789 through regulator interface. 779 790 ··· 1037 1030 RT5033 PMIC. The device supports multiple regulators like 1038 1031 current source, LDO and Buck. 1039 1032 1033 + config REGULATOR_RT6160 1034 + tristate "Richtek RT6160 BuckBoost voltage regulator" 1035 + depends on I2C 1036 + select REGMAP_I2C 1037 + help 1038 + This adds support for voltage regulator in Richtek RT6160. 1039 + This device automatically change voltage output mode from 1040 + Buck or Boost. The mode transistion depend on the input source voltage. 1041 + The wide output range is from 2025mV to 5200mV and can be used on most 1042 + common application scenario. 1043 + 1044 + config REGULATOR_RT6245 1045 + tristate "Richtek RT6245 voltage regulator" 1046 + depends on I2C 1047 + select REGMAP_I2C 1048 + help 1049 + This adds supprot for Richtek RT6245 voltage regulator. 1050 + It can support up to 14A output current and adjustable output voltage 1051 + from 0.4375V to 1.3875V, per step 12.5mV. 1052 + 1040 1053 config REGULATOR_RTMV20 1041 1054 tristate "Richtek RTMV20 Laser Diode Regulator" 1042 1055 depends on I2C ··· 1176 1149 help 1177 1150 This driver supports the internal VMMC regulator in the STw481x 1178 1151 PMIC chips. 1152 + 1153 + config REGULATOR_SY7636A 1154 + tristate "Silergy SY7636A voltage regulator" 1155 + depends on MFD_SY7636A 1156 + help 1157 + This driver supports Silergy SY3686A voltage regulator. 1179 1158 1180 1159 config REGULATOR_SY8106A 1181 1160 tristate "Silergy SY8106A regulator"
+6 -2
drivers/regulator/Makefile
··· 4 4 # 5 5 6 6 7 - obj-$(CONFIG_REGULATOR) += core.o dummy.o fixed-helper.o helpers.o devres.o 7 + obj-$(CONFIG_REGULATOR) += core.o dummy.o fixed-helper.o helpers.o devres.o irq_helpers.o 8 8 obj-$(CONFIG_OF) += of_regulator.o 9 9 obj-$(CONFIG_REGULATOR_FIXED_VOLTAGE) += fixed.o 10 10 obj-$(CONFIG_REGULATOR_VIRTUAL_CONSUMER) += virtual.o ··· 29 29 obj-$(CONFIG_REGULATOR_ATC260X) += atc260x-regulator.o 30 30 obj-$(CONFIG_REGULATOR_AXP20X) += axp20x-regulator.o 31 31 obj-$(CONFIG_REGULATOR_BCM590XX) += bcm590xx-regulator.o 32 - obj-$(CONFIG_REGULATOR_BD70528) += bd70528-regulator.o 33 32 obj-$(CONFIG_REGULATOR_BD71815) += bd71815-regulator.o 34 33 obj-$(CONFIG_REGULATOR_BD71828) += bd71828-regulator.o 35 34 obj-$(CONFIG_REGULATOR_BD718XX) += bd718x7-regulator.o ··· 71 72 obj-$(CONFIG_REGULATOR_MAX77650) += max77650-regulator.o 72 73 obj-$(CONFIG_REGULATOR_MAX8649) += max8649.o 73 74 obj-$(CONFIG_REGULATOR_MAX8660) += max8660.o 75 + obj-$(CONFIG_REGULATOR_MAX8893) += max8893.o 74 76 obj-$(CONFIG_REGULATOR_MAX8907) += max8907-regulator.o 75 77 obj-$(CONFIG_REGULATOR_MAX8925) += max8925-regulator.o 76 78 obj-$(CONFIG_REGULATOR_MAX8952) += max8952.o ··· 94 94 obj-$(CONFIG_REGULATOR_MT6315) += mt6315-regulator.o 95 95 obj-$(CONFIG_REGULATOR_MT6323) += mt6323-regulator.o 96 96 obj-$(CONFIG_REGULATOR_MT6358) += mt6358-regulator.o 97 + obj-$(CONFIG_REGULATOR_MT6359) += mt6359-regulator.o 97 98 obj-$(CONFIG_REGULATOR_MT6360) += mt6360-regulator.o 98 99 obj-$(CONFIG_REGULATOR_MT6380) += mt6380-regulator.o 99 100 obj-$(CONFIG_REGULATOR_MT6397) += mt6397-regulator.o ··· 125 124 obj-$(CONFIG_REGULATOR_RT4801) += rt4801-regulator.o 126 125 obj-$(CONFIG_REGULATOR_RT4831) += rt4831-regulator.o 127 126 obj-$(CONFIG_REGULATOR_RT5033) += rt5033-regulator.o 127 + obj-$(CONFIG_REGULATOR_RT6160) += rt6160-regulator.o 128 + obj-$(CONFIG_REGULATOR_RT6245) += rt6245-regulator.o 128 129 obj-$(CONFIG_REGULATOR_RTMV20) += rtmv20-regulator.o 129 130 obj-$(CONFIG_REGULATOR_S2MPA01) += s2mpa01.o 130 131 obj-$(CONFIG_REGULATOR_S2MPS11) += s2mps11.o ··· 139 136 obj-$(CONFIG_REGULATOR_STM32_PWR) += stm32-pwr.o 140 137 obj-$(CONFIG_REGULATOR_STPMIC1) += stpmic1_regulator.o 141 138 obj-$(CONFIG_REGULATOR_STW481X_VMMC) += stw481x-vmmc.o 139 + obj-$(CONFIG_REGULATOR_SY7636A) += sy7636a-regulator.o 142 140 obj-$(CONFIG_REGULATOR_SY8106A) += sy8106a-regulator.o 143 141 obj-$(CONFIG_REGULATOR_SY8824X) += sy8824x.o 144 142 obj-$(CONFIG_REGULATOR_SY8827N) += sy8827n.o
-283
drivers/regulator/bd70528-regulator.c
··· 1 - // SPDX-License-Identifier: GPL-2.0 2 - // Copyright (C) 2018 ROHM Semiconductors 3 - // bd70528-regulator.c ROHM BD70528MWV regulator driver 4 - 5 - #include <linux/delay.h> 6 - #include <linux/err.h> 7 - #include <linux/interrupt.h> 8 - #include <linux/kernel.h> 9 - #include <linux/mfd/rohm-bd70528.h> 10 - #include <linux/module.h> 11 - #include <linux/of.h> 12 - #include <linux/platform_device.h> 13 - #include <linux/regmap.h> 14 - #include <linux/regulator/driver.h> 15 - #include <linux/regulator/machine.h> 16 - #include <linux/regulator/of_regulator.h> 17 - #include <linux/slab.h> 18 - 19 - #define BUCK_RAMPRATE_250MV 0 20 - #define BUCK_RAMPRATE_125MV 1 21 - #define BUCK_RAMP_MAX 250 22 - 23 - static const struct linear_range bd70528_buck1_volts[] = { 24 - REGULATOR_LINEAR_RANGE(1200000, 0x00, 0x1, 600000), 25 - REGULATOR_LINEAR_RANGE(2750000, 0x2, 0xf, 50000), 26 - }; 27 - static const struct linear_range bd70528_buck2_volts[] = { 28 - REGULATOR_LINEAR_RANGE(1200000, 0x00, 0x1, 300000), 29 - REGULATOR_LINEAR_RANGE(1550000, 0x2, 0xd, 50000), 30 - REGULATOR_LINEAR_RANGE(3000000, 0xe, 0xf, 300000), 31 - }; 32 - static const struct linear_range bd70528_buck3_volts[] = { 33 - REGULATOR_LINEAR_RANGE(800000, 0x00, 0xd, 50000), 34 - REGULATOR_LINEAR_RANGE(1800000, 0xe, 0xf, 0), 35 - }; 36 - 37 - /* All LDOs have same voltage ranges */ 38 - static const struct linear_range bd70528_ldo_volts[] = { 39 - REGULATOR_LINEAR_RANGE(1650000, 0x0, 0x07, 50000), 40 - REGULATOR_LINEAR_RANGE(2100000, 0x8, 0x0f, 100000), 41 - REGULATOR_LINEAR_RANGE(2850000, 0x10, 0x19, 50000), 42 - REGULATOR_LINEAR_RANGE(3300000, 0x19, 0x1f, 0), 43 - }; 44 - 45 - /* Also both LEDs support same voltages */ 46 - static const unsigned int led_volts[] = { 47 - 20000, 30000 48 - }; 49 - 50 - static int bd70528_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay) 51 - { 52 - if (ramp_delay > 0 && ramp_delay <= BUCK_RAMP_MAX) { 53 - unsigned int ramp_value = BUCK_RAMPRATE_250MV; 54 - 55 - if (ramp_delay <= 125) 56 - ramp_value = BUCK_RAMPRATE_125MV; 57 - 58 - return regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg, 59 - BD70528_MASK_BUCK_RAMP, 60 - ramp_value << BD70528_SIFT_BUCK_RAMP); 61 - } 62 - dev_err(&rdev->dev, "%s: ramp_delay: %d not supported\n", 63 - rdev->desc->name, ramp_delay); 64 - return -EINVAL; 65 - } 66 - 67 - static int bd70528_led_set_voltage_sel(struct regulator_dev *rdev, 68 - unsigned int sel) 69 - { 70 - int ret; 71 - 72 - ret = regulator_is_enabled_regmap(rdev); 73 - if (ret < 0) 74 - return ret; 75 - 76 - if (ret == 0) 77 - return regulator_set_voltage_sel_regmap(rdev, sel); 78 - 79 - dev_err(&rdev->dev, 80 - "LED voltage change not allowed when led is enabled\n"); 81 - 82 - return -EBUSY; 83 - } 84 - 85 - static const struct regulator_ops bd70528_buck_ops = { 86 - .enable = regulator_enable_regmap, 87 - .disable = regulator_disable_regmap, 88 - .is_enabled = regulator_is_enabled_regmap, 89 - .list_voltage = regulator_list_voltage_linear_range, 90 - .set_voltage_sel = regulator_set_voltage_sel_regmap, 91 - .get_voltage_sel = regulator_get_voltage_sel_regmap, 92 - .set_voltage_time_sel = regulator_set_voltage_time_sel, 93 - .set_ramp_delay = bd70528_set_ramp_delay, 94 - }; 95 - 96 - static const struct regulator_ops bd70528_ldo_ops = { 97 - .enable = regulator_enable_regmap, 98 - .disable = regulator_disable_regmap, 99 - .is_enabled = regulator_is_enabled_regmap, 100 - .list_voltage = regulator_list_voltage_linear_range, 101 - .set_voltage_sel = regulator_set_voltage_sel_regmap, 102 - .get_voltage_sel = regulator_get_voltage_sel_regmap, 103 - .set_voltage_time_sel = regulator_set_voltage_time_sel, 104 - }; 105 - 106 - static const struct regulator_ops bd70528_led_ops = { 107 - .enable = regulator_enable_regmap, 108 - .disable = regulator_disable_regmap, 109 - .is_enabled = regulator_is_enabled_regmap, 110 - .list_voltage = regulator_list_voltage_table, 111 - .set_voltage_sel = bd70528_led_set_voltage_sel, 112 - .get_voltage_sel = regulator_get_voltage_sel_regmap, 113 - }; 114 - 115 - static const struct regulator_desc bd70528_desc[] = { 116 - { 117 - .name = "buck1", 118 - .of_match = of_match_ptr("BUCK1"), 119 - .regulators_node = of_match_ptr("regulators"), 120 - .id = BD70528_BUCK1, 121 - .ops = &bd70528_buck_ops, 122 - .type = REGULATOR_VOLTAGE, 123 - .linear_ranges = bd70528_buck1_volts, 124 - .n_linear_ranges = ARRAY_SIZE(bd70528_buck1_volts), 125 - .n_voltages = BD70528_BUCK_VOLTS, 126 - .enable_reg = BD70528_REG_BUCK1_EN, 127 - .enable_mask = BD70528_MASK_RUN_EN, 128 - .vsel_reg = BD70528_REG_BUCK1_VOLT, 129 - .vsel_mask = BD70528_MASK_BUCK_VOLT, 130 - .owner = THIS_MODULE, 131 - }, 132 - { 133 - .name = "buck2", 134 - .of_match = of_match_ptr("BUCK2"), 135 - .regulators_node = of_match_ptr("regulators"), 136 - .id = BD70528_BUCK2, 137 - .ops = &bd70528_buck_ops, 138 - .type = REGULATOR_VOLTAGE, 139 - .linear_ranges = bd70528_buck2_volts, 140 - .n_linear_ranges = ARRAY_SIZE(bd70528_buck2_volts), 141 - .n_voltages = BD70528_BUCK_VOLTS, 142 - .enable_reg = BD70528_REG_BUCK2_EN, 143 - .enable_mask = BD70528_MASK_RUN_EN, 144 - .vsel_reg = BD70528_REG_BUCK2_VOLT, 145 - .vsel_mask = BD70528_MASK_BUCK_VOLT, 146 - .owner = THIS_MODULE, 147 - }, 148 - { 149 - .name = "buck3", 150 - .of_match = of_match_ptr("BUCK3"), 151 - .regulators_node = of_match_ptr("regulators"), 152 - .id = BD70528_BUCK3, 153 - .ops = &bd70528_buck_ops, 154 - .type = REGULATOR_VOLTAGE, 155 - .linear_ranges = bd70528_buck3_volts, 156 - .n_linear_ranges = ARRAY_SIZE(bd70528_buck3_volts), 157 - .n_voltages = BD70528_BUCK_VOLTS, 158 - .enable_reg = BD70528_REG_BUCK3_EN, 159 - .enable_mask = BD70528_MASK_RUN_EN, 160 - .vsel_reg = BD70528_REG_BUCK3_VOLT, 161 - .vsel_mask = BD70528_MASK_BUCK_VOLT, 162 - .owner = THIS_MODULE, 163 - }, 164 - { 165 - .name = "ldo1", 166 - .of_match = of_match_ptr("LDO1"), 167 - .regulators_node = of_match_ptr("regulators"), 168 - .id = BD70528_LDO1, 169 - .ops = &bd70528_ldo_ops, 170 - .type = REGULATOR_VOLTAGE, 171 - .linear_ranges = bd70528_ldo_volts, 172 - .n_linear_ranges = ARRAY_SIZE(bd70528_ldo_volts), 173 - .n_voltages = BD70528_LDO_VOLTS, 174 - .enable_reg = BD70528_REG_LDO1_EN, 175 - .enable_mask = BD70528_MASK_RUN_EN, 176 - .vsel_reg = BD70528_REG_LDO1_VOLT, 177 - .vsel_mask = BD70528_MASK_LDO_VOLT, 178 - .owner = THIS_MODULE, 179 - }, 180 - { 181 - .name = "ldo2", 182 - .of_match = of_match_ptr("LDO2"), 183 - .regulators_node = of_match_ptr("regulators"), 184 - .id = BD70528_LDO2, 185 - .ops = &bd70528_ldo_ops, 186 - .type = REGULATOR_VOLTAGE, 187 - .linear_ranges = bd70528_ldo_volts, 188 - .n_linear_ranges = ARRAY_SIZE(bd70528_ldo_volts), 189 - .n_voltages = BD70528_LDO_VOLTS, 190 - .enable_reg = BD70528_REG_LDO2_EN, 191 - .enable_mask = BD70528_MASK_RUN_EN, 192 - .vsel_reg = BD70528_REG_LDO2_VOLT, 193 - .vsel_mask = BD70528_MASK_LDO_VOLT, 194 - .owner = THIS_MODULE, 195 - }, 196 - { 197 - .name = "ldo3", 198 - .of_match = of_match_ptr("LDO3"), 199 - .regulators_node = of_match_ptr("regulators"), 200 - .id = BD70528_LDO3, 201 - .ops = &bd70528_ldo_ops, 202 - .type = REGULATOR_VOLTAGE, 203 - .linear_ranges = bd70528_ldo_volts, 204 - .n_linear_ranges = ARRAY_SIZE(bd70528_ldo_volts), 205 - .n_voltages = BD70528_LDO_VOLTS, 206 - .enable_reg = BD70528_REG_LDO3_EN, 207 - .enable_mask = BD70528_MASK_RUN_EN, 208 - .vsel_reg = BD70528_REG_LDO3_VOLT, 209 - .vsel_mask = BD70528_MASK_LDO_VOLT, 210 - .owner = THIS_MODULE, 211 - }, 212 - { 213 - .name = "ldo_led1", 214 - .of_match = of_match_ptr("LDO_LED1"), 215 - .regulators_node = of_match_ptr("regulators"), 216 - .id = BD70528_LED1, 217 - .ops = &bd70528_led_ops, 218 - .type = REGULATOR_VOLTAGE, 219 - .volt_table = &led_volts[0], 220 - .n_voltages = ARRAY_SIZE(led_volts), 221 - .enable_reg = BD70528_REG_LED_EN, 222 - .enable_mask = BD70528_MASK_LED1_EN, 223 - .vsel_reg = BD70528_REG_LED_VOLT, 224 - .vsel_mask = BD70528_MASK_LED1_VOLT, 225 - .owner = THIS_MODULE, 226 - }, 227 - { 228 - .name = "ldo_led2", 229 - .of_match = of_match_ptr("LDO_LED2"), 230 - .regulators_node = of_match_ptr("regulators"), 231 - .id = BD70528_LED2, 232 - .ops = &bd70528_led_ops, 233 - .type = REGULATOR_VOLTAGE, 234 - .volt_table = &led_volts[0], 235 - .n_voltages = ARRAY_SIZE(led_volts), 236 - .enable_reg = BD70528_REG_LED_EN, 237 - .enable_mask = BD70528_MASK_LED2_EN, 238 - .vsel_reg = BD70528_REG_LED_VOLT, 239 - .vsel_mask = BD70528_MASK_LED2_VOLT, 240 - .owner = THIS_MODULE, 241 - }, 242 - 243 - }; 244 - 245 - static int bd70528_probe(struct platform_device *pdev) 246 - { 247 - int i; 248 - struct regulator_config config = { 249 - .dev = pdev->dev.parent, 250 - }; 251 - 252 - config.regmap = dev_get_regmap(pdev->dev.parent, NULL); 253 - if (!config.regmap) 254 - return -ENODEV; 255 - 256 - for (i = 0; i < ARRAY_SIZE(bd70528_desc); i++) { 257 - struct regulator_dev *rdev; 258 - 259 - rdev = devm_regulator_register(&pdev->dev, &bd70528_desc[i], 260 - &config); 261 - if (IS_ERR(rdev)) { 262 - dev_err(&pdev->dev, 263 - "failed to register %s regulator\n", 264 - bd70528_desc[i].name); 265 - return PTR_ERR(rdev); 266 - } 267 - } 268 - return 0; 269 - } 270 - 271 - static struct platform_driver bd70528_regulator = { 272 - .driver = { 273 - .name = "bd70528-pmic" 274 - }, 275 - .probe = bd70528_probe, 276 - }; 277 - 278 - module_platform_driver(bd70528_regulator); 279 - 280 - MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>"); 281 - MODULE_DESCRIPTION("BD70528 voltage regulator driver"); 282 - MODULE_LICENSE("GPL"); 283 - MODULE_ALIAS("platform:bd70528-pmic");
+21 -39
drivers/regulator/bd71815-regulator.c
··· 13 13 #include <linux/init.h> 14 14 #include <linux/err.h> 15 15 #include <linux/platform_device.h> 16 + #include <linux/of.h> 17 + #include <linux/gpio/consumer.h> 16 18 #include <linux/regulator/driver.h> 17 19 #include <linux/delay.h> 18 20 #include <linux/slab.h> ··· 26 24 struct bd71815_regulator { 27 25 struct regulator_desc desc; 28 26 const struct rohm_dvs_config *dvs; 29 - }; 30 - 31 - struct bd71815_pmic { 32 - struct bd71815_regulator descs[BD71815_REGULATOR_CNT]; 33 - struct regmap *regmap; 34 - struct device *dev; 35 - struct gpio_descs *gps; 36 - struct regulator_dev *rdev[BD71815_REGULATOR_CNT]; 37 27 }; 38 28 39 29 static const int bd7181x_wled_currents[] = { ··· 294 300 295 301 static int bd7181x_buck12_get_voltage_sel(struct regulator_dev *rdev) 296 302 { 297 - struct bd71815_pmic *pmic = rdev_get_drvdata(rdev); 298 303 int rid = rdev_get_id(rdev); 299 304 int ret, regh, regl, val; 300 305 301 306 regh = BD71815_REG_BUCK1_VOLT_H + rid * 0x2; 302 307 regl = BD71815_REG_BUCK1_VOLT_L + rid * 0x2; 303 308 304 - ret = regmap_read(pmic->regmap, regh, &val); 309 + ret = regmap_read(rdev->regmap, regh, &val); 305 310 if (ret) 306 311 return ret; 307 312 ··· 312 319 * by BD71815_BUCK_DVSSEL bit 313 320 */ 314 321 if ((!(val & BD71815_BUCK_STBY_DVS)) && (!(val & BD71815_BUCK_DVSSEL))) 315 - ret = regmap_read(pmic->regmap, regl, &val); 322 + ret = regmap_read(rdev->regmap, regl, &val); 316 323 317 324 if (ret) 318 325 return ret; ··· 326 333 static int bd7181x_buck12_set_voltage_sel(struct regulator_dev *rdev, 327 334 unsigned int sel) 328 335 { 329 - struct bd71815_pmic *pmic = rdev_get_drvdata(rdev); 330 336 int rid = rdev_get_id(rdev); 331 337 int ret, val, reg, regh, regl; 332 338 333 339 regh = BD71815_REG_BUCK1_VOLT_H + rid*0x2; 334 340 regl = BD71815_REG_BUCK1_VOLT_L + rid*0x2; 335 341 336 - ret = regmap_read(pmic->regmap, regh, &val); 342 + ret = regmap_read(rdev->regmap, regh, &val); 337 343 if (ret) 338 344 return ret; 339 345 ··· 342 350 * voltages at runtime is not supported by this driver. 343 351 */ 344 352 if (((val & BD71815_BUCK_STBY_DVS))) { 345 - return regmap_update_bits(pmic->regmap, regh, BD71815_VOLT_MASK, 353 + return regmap_update_bits(rdev->regmap, regh, BD71815_VOLT_MASK, 346 354 sel); 347 355 } 348 356 /* Update new voltage to the register which is not selected now */ ··· 351 359 else 352 360 reg = regh; 353 361 354 - ret = regmap_update_bits(pmic->regmap, reg, BD71815_VOLT_MASK, sel); 362 + ret = regmap_update_bits(rdev->regmap, reg, BD71815_VOLT_MASK, sel); 355 363 if (ret) 356 364 return ret; 357 365 358 366 /* Select the other DVS register to be used */ 359 - return regmap_update_bits(pmic->regmap, regh, BD71815_BUCK_DVSSEL, ~val); 367 + return regmap_update_bits(rdev->regmap, regh, BD71815_BUCK_DVSSEL, 368 + ~val); 360 369 } 361 370 362 371 static const struct regulator_ops bd7181x_ldo_regulator_ops = { ··· 515 522 .dvs = (_dvs), \ 516 523 } 517 524 518 - static struct bd71815_regulator bd71815_regulators[] = { 525 + static const struct bd71815_regulator bd71815_regulators[] = { 519 526 BD71815_BUCK12_REG(buck1, BD71815_BUCK1, BD71815_REG_BUCK1_VOLT_H, 520 527 BD71815_REG_BUCK1_MODE, 800000, 2000000, 25000, 521 528 &buck1_dvs), ··· 561 568 562 569 static int bd7181x_probe(struct platform_device *pdev) 563 570 { 564 - struct bd71815_pmic *pmic; 565 571 struct regulator_config config = {}; 566 572 int i, ret; 567 573 struct gpio_desc *ldo4_en; 574 + struct regmap *regmap; 568 575 569 - pmic = devm_kzalloc(&pdev->dev, sizeof(*pmic), GFP_KERNEL); 570 - if (!pmic) 571 - return -ENOMEM; 572 - 573 - memcpy(pmic->descs, bd71815_regulators, sizeof(pmic->descs)); 574 - 575 - pmic->dev = &pdev->dev; 576 - pmic->regmap = dev_get_regmap(pdev->dev.parent, NULL); 577 - if (!pmic->regmap) { 578 - dev_err(pmic->dev, "No parent regmap\n"); 576 + regmap = dev_get_regmap(pdev->dev.parent, NULL); 577 + if (!regmap) { 578 + dev_err(&pdev->dev, "No parent regmap\n"); 579 579 return -ENODEV; 580 580 } 581 - platform_set_drvdata(pdev, pmic); 582 581 ldo4_en = devm_gpiod_get_from_of_node(&pdev->dev, 583 582 pdev->dev.parent->of_node, 584 583 "rohm,vsel-gpios", 0, ··· 584 599 } 585 600 586 601 /* Disable to go to ship-mode */ 587 - ret = regmap_update_bits(pmic->regmap, BD71815_REG_PWRCTRL, 588 - RESTARTEN, 0); 602 + ret = regmap_update_bits(regmap, BD71815_REG_PWRCTRL, RESTARTEN, 0); 589 603 if (ret) 590 604 return ret; 591 605 592 606 config.dev = pdev->dev.parent; 593 - config.regmap = pmic->regmap; 607 + config.regmap = regmap; 594 608 595 609 for (i = 0; i < BD71815_REGULATOR_CNT; i++) { 596 - struct regulator_desc *desc; 610 + const struct regulator_desc *desc; 597 611 struct regulator_dev *rdev; 598 612 599 - desc = &pmic->descs[i].desc; 613 + desc = &bd71815_regulators[i].desc; 614 + 600 615 if (i == BD71815_LDO4) 601 616 config.ena_gpiod = ldo4_en; 602 - 603 - config.driver_data = pmic; 617 + else 618 + config.ena_gpiod = NULL; 604 619 605 620 rdev = devm_regulator_register(&pdev->dev, desc, &config); 606 621 if (IS_ERR(rdev)) { ··· 609 624 desc->name); 610 625 return PTR_ERR(rdev); 611 626 } 612 - config.ena_gpiod = NULL; 613 - pmic->rdev[i] = rdev; 614 627 } 615 628 return 0; 616 629 } ··· 622 639 static struct platform_driver bd7181x_regulator = { 623 640 .driver = { 624 641 .name = "bd7181x-pmic", 625 - .owner = THIS_MODULE, 626 642 }, 627 643 .probe = bd7181x_probe, 628 644 .id_table = bd7181x_pmic_id,
+948 -140
drivers/regulator/bd9576-regulator.c
··· 2 2 // Copyright (C) 2020 ROHM Semiconductors 3 3 // ROHM BD9576MUF/BD9573MUF regulator driver 4 4 5 - #include <linux/delay.h> 6 5 #include <linux/err.h> 7 6 #include <linux/gpio/consumer.h> 8 7 #include <linux/interrupt.h> 8 + #include <linux/jiffies.h> 9 9 #include <linux/kernel.h> 10 10 #include <linux/mfd/rohm-bd957x.h> 11 11 #include <linux/mfd/rohm-generic.h> ··· 16 16 #include <linux/regulator/machine.h> 17 17 #include <linux/regulator/of_regulator.h> 18 18 #include <linux/slab.h> 19 + #include <linux/spinlock.h> 20 + #include <linux/workqueue.h> 19 21 20 22 #define BD957X_VOUTS1_VOLT 3300000 21 23 #define BD957X_VOUTS4_BASE_VOLT 1030000 22 24 #define BD957X_VOUTS34_NUM_VOLT 32 23 25 24 - static int vout1_volt_table[] = {5000000, 4900000, 4800000, 4700000, 4600000, 25 - 4500000, 4500000, 4500000, 5000000, 5100000, 26 - 5200000, 5300000, 5400000, 5500000, 5500000, 27 - 5500000}; 26 + #define BD9576_THERM_IRQ_MASK_TW BIT(5) 27 + #define BD9576_xVD_IRQ_MASK_VOUTL1 BIT(5) 28 + #define BD9576_UVD_IRQ_MASK_VOUTS1_OCW BIT(6) 29 + #define BD9576_xVD_IRQ_MASK_VOUT1TO4 0x0F 28 30 29 - static int vout2_volt_table[] = {1800000, 1780000, 1760000, 1740000, 1720000, 30 - 1700000, 1680000, 1660000, 1800000, 1820000, 31 - 1840000, 1860000, 1880000, 1900000, 1920000, 32 - 1940000}; 31 + static const unsigned int vout1_volt_table[] = { 32 + 5000000, 4900000, 4800000, 4700000, 4600000, 33 + 4500000, 4500000, 4500000, 5000000, 5100000, 34 + 5200000, 5300000, 5400000, 5500000, 5500000, 35 + 5500000 36 + }; 33 37 34 - static int voutl1_volt_table[] = {2500000, 2540000, 2580000, 2620000, 2660000, 35 - 2700000, 2740000, 2780000, 2500000, 2460000, 36 - 2420000, 2380000, 2340000, 2300000, 2260000, 37 - 2220000}; 38 + static const unsigned int vout2_volt_table[] = { 39 + 1800000, 1780000, 1760000, 1740000, 1720000, 40 + 1700000, 1680000, 1660000, 1800000, 1820000, 41 + 1840000, 1860000, 1880000, 1900000, 1920000, 42 + 1940000 43 + }; 44 + 45 + static const unsigned int voutl1_volt_table[] = { 46 + 2500000, 2540000, 2580000, 2620000, 2660000, 47 + 2700000, 2740000, 2780000, 2500000, 2460000, 48 + 2420000, 2380000, 2340000, 2300000, 2260000, 49 + 2220000 50 + }; 51 + 52 + static const struct linear_range vout1_xvd_ranges[] = { 53 + REGULATOR_LINEAR_RANGE(225000, 0x01, 0x2b, 0), 54 + REGULATOR_LINEAR_RANGE(225000, 0x2c, 0x54, 5000), 55 + REGULATOR_LINEAR_RANGE(425000, 0x55, 0x7f, 0), 56 + }; 57 + 58 + static const struct linear_range vout234_xvd_ranges[] = { 59 + REGULATOR_LINEAR_RANGE(17000, 0x01, 0x0f, 0), 60 + REGULATOR_LINEAR_RANGE(17000, 0x10, 0x6d, 1000), 61 + REGULATOR_LINEAR_RANGE(110000, 0x6e, 0x7f, 0), 62 + }; 63 + 64 + static const struct linear_range voutL1_xvd_ranges[] = { 65 + REGULATOR_LINEAR_RANGE(34000, 0x01, 0x0f, 0), 66 + REGULATOR_LINEAR_RANGE(34000, 0x10, 0x6d, 2000), 67 + REGULATOR_LINEAR_RANGE(220000, 0x6e, 0x7f, 0), 68 + }; 69 + 70 + static struct linear_range voutS1_ocw_ranges_internal[] = { 71 + REGULATOR_LINEAR_RANGE(200000, 0x01, 0x04, 0), 72 + REGULATOR_LINEAR_RANGE(250000, 0x05, 0x18, 50000), 73 + REGULATOR_LINEAR_RANGE(1200000, 0x19, 0x3f, 0), 74 + }; 75 + 76 + static struct linear_range voutS1_ocw_ranges[] = { 77 + REGULATOR_LINEAR_RANGE(50000, 0x01, 0x04, 0), 78 + REGULATOR_LINEAR_RANGE(60000, 0x05, 0x18, 10000), 79 + REGULATOR_LINEAR_RANGE(250000, 0x19, 0x3f, 0), 80 + }; 81 + 82 + static struct linear_range voutS1_ocp_ranges_internal[] = { 83 + REGULATOR_LINEAR_RANGE(300000, 0x01, 0x06, 0), 84 + REGULATOR_LINEAR_RANGE(350000, 0x7, 0x1b, 50000), 85 + REGULATOR_LINEAR_RANGE(1350000, 0x1c, 0x3f, 0), 86 + }; 87 + 88 + static struct linear_range voutS1_ocp_ranges[] = { 89 + REGULATOR_LINEAR_RANGE(70000, 0x01, 0x06, 0), 90 + REGULATOR_LINEAR_RANGE(80000, 0x7, 0x1b, 10000), 91 + REGULATOR_LINEAR_RANGE(280000, 0x1c, 0x3f, 0), 92 + }; 38 93 39 94 struct bd957x_regulator_data { 40 95 struct regulator_desc desc; 41 96 int base_voltage; 97 + struct regulator_dev *rdev; 98 + int ovd_notif; 99 + int uvd_notif; 100 + int temp_notif; 101 + int ovd_err; 102 + int uvd_err; 103 + int temp_err; 104 + const struct linear_range *xvd_ranges; 105 + int num_xvd_ranges; 106 + bool oc_supported; 107 + unsigned int ovd_reg; 108 + unsigned int uvd_reg; 109 + unsigned int xvd_mask; 110 + unsigned int ocp_reg; 111 + unsigned int ocp_mask; 112 + unsigned int ocw_reg; 113 + unsigned int ocw_mask; 114 + unsigned int ocw_rfet; 115 + }; 116 + 117 + #define BD9576_NUM_REGULATORS 6 118 + #define BD9576_NUM_OVD_REGULATORS 5 119 + 120 + struct bd957x_data { 121 + struct bd957x_regulator_data regulator_data[BD9576_NUM_REGULATORS]; 122 + struct regmap *regmap; 123 + struct delayed_work therm_irq_suppress; 124 + struct delayed_work ovd_irq_suppress; 125 + struct delayed_work uvd_irq_suppress; 126 + unsigned int therm_irq; 127 + unsigned int ovd_irq; 128 + unsigned int uvd_irq; 129 + spinlock_t err_lock; 130 + int regulator_global_err; 42 131 }; 43 132 44 133 static int bd957x_vout34_list_voltage(struct regulator_dev *rdev, ··· 161 72 return desc->volt_table[index]; 162 73 } 163 74 164 - static const struct regulator_ops bd957x_vout34_ops = { 75 + static void bd9576_fill_ovd_flags(struct bd957x_regulator_data *data, 76 + bool warn) 77 + { 78 + if (warn) { 79 + data->ovd_notif = REGULATOR_EVENT_OVER_VOLTAGE_WARN; 80 + data->ovd_err = REGULATOR_ERROR_OVER_VOLTAGE_WARN; 81 + } else { 82 + data->ovd_notif = REGULATOR_EVENT_REGULATION_OUT; 83 + data->ovd_err = REGULATOR_ERROR_REGULATION_OUT; 84 + } 85 + } 86 + 87 + static void bd9576_fill_ocp_flags(struct bd957x_regulator_data *data, 88 + bool warn) 89 + { 90 + if (warn) { 91 + data->uvd_notif = REGULATOR_EVENT_OVER_CURRENT_WARN; 92 + data->uvd_err = REGULATOR_ERROR_OVER_CURRENT_WARN; 93 + } else { 94 + data->uvd_notif = REGULATOR_EVENT_OVER_CURRENT; 95 + data->uvd_err = REGULATOR_ERROR_OVER_CURRENT; 96 + } 97 + } 98 + 99 + static void bd9576_fill_uvd_flags(struct bd957x_regulator_data *data, 100 + bool warn) 101 + { 102 + if (warn) { 103 + data->uvd_notif = REGULATOR_EVENT_UNDER_VOLTAGE_WARN; 104 + data->uvd_err = REGULATOR_ERROR_UNDER_VOLTAGE_WARN; 105 + } else { 106 + data->uvd_notif = REGULATOR_EVENT_UNDER_VOLTAGE; 107 + data->uvd_err = REGULATOR_ERROR_UNDER_VOLTAGE; 108 + } 109 + } 110 + 111 + static void bd9576_fill_temp_flags(struct bd957x_regulator_data *data, 112 + bool enable, bool warn) 113 + { 114 + if (!enable) { 115 + data->temp_notif = 0; 116 + data->temp_err = 0; 117 + } else if (warn) { 118 + data->temp_notif = REGULATOR_EVENT_OVER_TEMP_WARN; 119 + data->temp_err = REGULATOR_ERROR_OVER_TEMP_WARN; 120 + } else { 121 + data->temp_notif = REGULATOR_EVENT_OVER_TEMP; 122 + data->temp_err = REGULATOR_ERROR_OVER_TEMP; 123 + } 124 + } 125 + 126 + static int bd9576_set_limit(const struct linear_range *r, int num_ranges, 127 + struct regmap *regmap, int reg, int mask, int lim) 128 + { 129 + int ret; 130 + bool found; 131 + int sel = 0; 132 + 133 + if (lim) { 134 + 135 + ret = linear_range_get_selector_low_array(r, num_ranges, 136 + lim, &sel, &found); 137 + if (ret) 138 + return ret; 139 + 140 + if (!found) 141 + dev_warn(regmap_get_device(regmap), 142 + "limit %d out of range. Setting lower\n", 143 + lim); 144 + } 145 + 146 + return regmap_update_bits(regmap, reg, mask, sel); 147 + } 148 + 149 + static bool check_ocp_flag_mismatch(struct regulator_dev *rdev, int severity, 150 + struct bd957x_regulator_data *r) 151 + { 152 + if ((severity == REGULATOR_SEVERITY_ERR && 153 + r->uvd_notif != REGULATOR_EVENT_OVER_CURRENT) || 154 + (severity == REGULATOR_SEVERITY_WARN && 155 + r->uvd_notif != REGULATOR_EVENT_OVER_CURRENT_WARN)) { 156 + dev_warn(rdev_get_dev(rdev), 157 + "Can't support both OCP WARN and ERR\n"); 158 + /* Do not overwrite ERR config with WARN */ 159 + if (severity == REGULATOR_SEVERITY_WARN) 160 + return true; 161 + 162 + bd9576_fill_ocp_flags(r, 0); 163 + } 164 + 165 + return false; 166 + } 167 + 168 + static bool check_uvd_flag_mismatch(struct regulator_dev *rdev, int severity, 169 + struct bd957x_regulator_data *r) 170 + { 171 + if ((severity == REGULATOR_SEVERITY_ERR && 172 + r->uvd_notif != REGULATOR_EVENT_UNDER_VOLTAGE) || 173 + (severity == REGULATOR_SEVERITY_WARN && 174 + r->uvd_notif != REGULATOR_EVENT_UNDER_VOLTAGE_WARN)) { 175 + dev_warn(rdev_get_dev(rdev), 176 + "Can't support both UVD WARN and ERR\n"); 177 + if (severity == REGULATOR_SEVERITY_WARN) 178 + return true; 179 + 180 + bd9576_fill_uvd_flags(r, 0); 181 + } 182 + 183 + return false; 184 + } 185 + 186 + static bool check_ovd_flag_mismatch(struct regulator_dev *rdev, int severity, 187 + struct bd957x_regulator_data *r) 188 + { 189 + if ((severity == REGULATOR_SEVERITY_ERR && 190 + r->ovd_notif != REGULATOR_EVENT_REGULATION_OUT) || 191 + (severity == REGULATOR_SEVERITY_WARN && 192 + r->ovd_notif != REGULATOR_EVENT_OVER_VOLTAGE_WARN)) { 193 + dev_warn(rdev_get_dev(rdev), 194 + "Can't support both OVD WARN and ERR\n"); 195 + if (severity == REGULATOR_SEVERITY_WARN) 196 + return true; 197 + 198 + bd9576_fill_ovd_flags(r, 0); 199 + } 200 + 201 + return false; 202 + } 203 + 204 + static bool check_temp_flag_mismatch(struct regulator_dev *rdev, int severity, 205 + struct bd957x_regulator_data *r) 206 + { 207 + if ((severity == REGULATOR_SEVERITY_ERR && 208 + r->ovd_notif != REGULATOR_EVENT_OVER_TEMP) || 209 + (severity == REGULATOR_SEVERITY_WARN && 210 + r->ovd_notif != REGULATOR_EVENT_OVER_TEMP_WARN)) { 211 + dev_warn(rdev_get_dev(rdev), 212 + "Can't support both thermal WARN and ERR\n"); 213 + if (severity == REGULATOR_SEVERITY_WARN) 214 + return true; 215 + } 216 + 217 + return false; 218 + } 219 + 220 + static int bd9576_set_ocp(struct regulator_dev *rdev, int lim_uA, int severity, 221 + bool enable) 222 + { 223 + struct bd957x_data *d; 224 + struct bd957x_regulator_data *r; 225 + int reg, mask; 226 + int Vfet, rfet; 227 + const struct linear_range *range; 228 + int num_ranges; 229 + 230 + if ((lim_uA && !enable) || (!lim_uA && enable)) 231 + return -EINVAL; 232 + 233 + r = container_of(rdev->desc, struct bd957x_regulator_data, desc); 234 + if (!r->oc_supported) 235 + return -EINVAL; 236 + 237 + d = rdev_get_drvdata(rdev); 238 + 239 + if (severity == REGULATOR_SEVERITY_PROT) { 240 + reg = r->ocp_reg; 241 + mask = r->ocp_mask; 242 + if (r->ocw_rfet) { 243 + range = voutS1_ocp_ranges; 244 + num_ranges = ARRAY_SIZE(voutS1_ocp_ranges); 245 + rfet = r->ocw_rfet / 1000; 246 + } else { 247 + range = voutS1_ocp_ranges_internal; 248 + num_ranges = ARRAY_SIZE(voutS1_ocp_ranges_internal); 249 + /* Internal values are already micro-amperes */ 250 + rfet = 1000; 251 + } 252 + } else { 253 + reg = r->ocw_reg; 254 + mask = r->ocw_mask; 255 + 256 + if (r->ocw_rfet) { 257 + range = voutS1_ocw_ranges; 258 + num_ranges = ARRAY_SIZE(voutS1_ocw_ranges); 259 + rfet = r->ocw_rfet / 1000; 260 + } else { 261 + range = voutS1_ocw_ranges_internal; 262 + num_ranges = ARRAY_SIZE(voutS1_ocw_ranges_internal); 263 + /* Internal values are already micro-amperes */ 264 + rfet = 1000; 265 + } 266 + 267 + /* We abuse uvd fields for OCW on VoutS1 */ 268 + if (r->uvd_notif) { 269 + /* 270 + * If both warning and error are requested, prioritize 271 + * ERROR configuration 272 + */ 273 + if (check_ocp_flag_mismatch(rdev, severity, r)) 274 + return 0; 275 + } else { 276 + bool warn = severity == REGULATOR_SEVERITY_WARN; 277 + 278 + bd9576_fill_ocp_flags(r, warn); 279 + } 280 + } 281 + 282 + /* 283 + * limits are given in uA, rfet is mOhm 284 + * Divide lim_uA by 1000 to get Vfet in uV. 285 + * (We expect both Rfet and limit uA to be magnitude of hundreds of 286 + * milli Amperes & milli Ohms => we should still have decent accuracy) 287 + */ 288 + Vfet = lim_uA/1000 * rfet; 289 + 290 + return bd9576_set_limit(range, num_ranges, d->regmap, 291 + reg, mask, Vfet); 292 + } 293 + 294 + static int bd9576_set_uvp(struct regulator_dev *rdev, int lim_uV, int severity, 295 + bool enable) 296 + { 297 + struct bd957x_data *d; 298 + struct bd957x_regulator_data *r; 299 + int mask, reg; 300 + 301 + if (severity == REGULATOR_SEVERITY_PROT) { 302 + if (!enable || lim_uV) 303 + return -EINVAL; 304 + return 0; 305 + } 306 + 307 + /* 308 + * BD9576 has enable control as a special value in limit reg. Can't 309 + * set limit but keep feature disabled or enable W/O given limit. 310 + */ 311 + if ((lim_uV && !enable) || (!lim_uV && enable)) 312 + return -EINVAL; 313 + 314 + r = container_of(rdev->desc, struct bd957x_regulator_data, desc); 315 + d = rdev_get_drvdata(rdev); 316 + 317 + mask = r->xvd_mask; 318 + reg = r->uvd_reg; 319 + /* 320 + * Check that there is no mismatch for what the detection IRQs are to 321 + * be used. 322 + */ 323 + if (r->uvd_notif) { 324 + if (check_uvd_flag_mismatch(rdev, severity, r)) 325 + return 0; 326 + } else { 327 + bd9576_fill_uvd_flags(r, severity == REGULATOR_SEVERITY_WARN); 328 + } 329 + 330 + return bd9576_set_limit(r->xvd_ranges, r->num_xvd_ranges, d->regmap, 331 + reg, mask, lim_uV); 332 + } 333 + 334 + static int bd9576_set_ovp(struct regulator_dev *rdev, int lim_uV, int severity, 335 + bool enable) 336 + { 337 + struct bd957x_data *d; 338 + struct bd957x_regulator_data *r; 339 + int mask, reg; 340 + 341 + if (severity == REGULATOR_SEVERITY_PROT) { 342 + if (!enable || lim_uV) 343 + return -EINVAL; 344 + return 0; 345 + } 346 + 347 + /* 348 + * BD9576 has enable control as a special value in limit reg. Can't 349 + * set limit but keep feature disabled or enable W/O given limit. 350 + */ 351 + if ((lim_uV && !enable) || (!lim_uV && enable)) 352 + return -EINVAL; 353 + 354 + r = container_of(rdev->desc, struct bd957x_regulator_data, desc); 355 + d = rdev_get_drvdata(rdev); 356 + 357 + mask = r->xvd_mask; 358 + reg = r->ovd_reg; 359 + /* 360 + * Check that there is no mismatch for what the detection IRQs are to 361 + * be used. 362 + */ 363 + if (r->ovd_notif) { 364 + if (check_ovd_flag_mismatch(rdev, severity, r)) 365 + return 0; 366 + } else { 367 + bd9576_fill_ovd_flags(r, severity == REGULATOR_SEVERITY_WARN); 368 + } 369 + 370 + return bd9576_set_limit(r->xvd_ranges, r->num_xvd_ranges, d->regmap, 371 + reg, mask, lim_uV); 372 + } 373 + 374 + 375 + static int bd9576_set_tw(struct regulator_dev *rdev, int lim, int severity, 376 + bool enable) 377 + { 378 + struct bd957x_data *d; 379 + struct bd957x_regulator_data *r; 380 + int i; 381 + 382 + /* 383 + * BD9576MUF has fixed temperature limits 384 + * The detection can only be enabled/disabled 385 + */ 386 + if (lim) 387 + return -EINVAL; 388 + 389 + /* Protection can't be disabled */ 390 + if (severity == REGULATOR_SEVERITY_PROT) { 391 + if (!enable) 392 + return -EINVAL; 393 + else 394 + return 0; 395 + } 396 + 397 + r = container_of(rdev->desc, struct bd957x_regulator_data, desc); 398 + d = rdev_get_drvdata(rdev); 399 + 400 + /* 401 + * Check that there is no mismatch for what the detection IRQs are to 402 + * be used. 403 + */ 404 + if (r->temp_notif) 405 + if (check_temp_flag_mismatch(rdev, severity, r)) 406 + return 0; 407 + 408 + bd9576_fill_temp_flags(r, enable, severity == REGULATOR_SEVERITY_WARN); 409 + 410 + if (enable) 411 + return regmap_update_bits(d->regmap, BD957X_REG_INT_THERM_MASK, 412 + BD9576_THERM_IRQ_MASK_TW, 0); 413 + 414 + /* 415 + * If any of the regulators is interested in thermal warning we keep IRQ 416 + * enabled. 417 + */ 418 + for (i = 0; i < BD9576_NUM_REGULATORS; i++) 419 + if (d->regulator_data[i].temp_notif) 420 + return 0; 421 + 422 + return regmap_update_bits(d->regmap, BD957X_REG_INT_THERM_MASK, 423 + BD9576_THERM_IRQ_MASK_TW, 424 + BD9576_THERM_IRQ_MASK_TW); 425 + } 426 + 427 + static const struct regulator_ops bd9573_vout34_ops = { 165 428 .is_enabled = regulator_is_enabled_regmap, 166 429 .list_voltage = bd957x_vout34_list_voltage, 167 430 .get_voltage_sel = regulator_get_voltage_sel_regmap, 168 431 }; 169 432 170 - static const struct regulator_ops bd957X_vouts1_regulator_ops = { 433 + static const struct regulator_ops bd9576_vout34_ops = { 434 + .is_enabled = regulator_is_enabled_regmap, 435 + .list_voltage = bd957x_vout34_list_voltage, 436 + .get_voltage_sel = regulator_get_voltage_sel_regmap, 437 + .set_over_voltage_protection = bd9576_set_ovp, 438 + .set_under_voltage_protection = bd9576_set_uvp, 439 + .set_thermal_protection = bd9576_set_tw, 440 + }; 441 + 442 + static const struct regulator_ops bd9573_vouts1_regulator_ops = { 171 443 .is_enabled = regulator_is_enabled_regmap, 172 444 }; 173 445 174 - static const struct regulator_ops bd957x_ops = { 446 + static const struct regulator_ops bd9576_vouts1_regulator_ops = { 447 + .is_enabled = regulator_is_enabled_regmap, 448 + .set_over_current_protection = bd9576_set_ocp, 449 + }; 450 + 451 + static const struct regulator_ops bd9573_ops = { 175 452 .is_enabled = regulator_is_enabled_regmap, 176 453 .list_voltage = bd957x_list_voltage, 177 454 .get_voltage_sel = regulator_get_voltage_sel_regmap, 178 455 }; 179 456 180 - static struct bd957x_regulator_data bd9576_regulators[] = { 181 - { 182 - .desc = { 183 - .name = "VD50", 184 - .of_match = of_match_ptr("regulator-vd50"), 185 - .regulators_node = of_match_ptr("regulators"), 186 - .id = BD957X_VD50, 187 - .type = REGULATOR_VOLTAGE, 188 - .ops = &bd957x_ops, 189 - .volt_table = &vout1_volt_table[0], 190 - .n_voltages = ARRAY_SIZE(vout1_volt_table), 191 - .vsel_reg = BD957X_REG_VOUT1_TUNE, 192 - .vsel_mask = BD957X_MASK_VOUT1_TUNE, 193 - .enable_reg = BD957X_REG_POW_TRIGGER1, 194 - .enable_mask = BD957X_REGULATOR_EN_MASK, 195 - .enable_val = BD957X_REGULATOR_DIS_VAL, 196 - .enable_is_inverted = true, 197 - .owner = THIS_MODULE, 457 + static const struct regulator_ops bd9576_ops = { 458 + .is_enabled = regulator_is_enabled_regmap, 459 + .list_voltage = bd957x_list_voltage, 460 + .get_voltage_sel = regulator_get_voltage_sel_regmap, 461 + .set_over_voltage_protection = bd9576_set_ovp, 462 + .set_under_voltage_protection = bd9576_set_uvp, 463 + .set_thermal_protection = bd9576_set_tw, 464 + }; 465 + 466 + static const struct regulator_ops *bd9573_ops_arr[] = { 467 + [BD957X_VD50] = &bd9573_ops, 468 + [BD957X_VD18] = &bd9573_ops, 469 + [BD957X_VDDDR] = &bd9573_vout34_ops, 470 + [BD957X_VD10] = &bd9573_vout34_ops, 471 + [BD957X_VOUTL1] = &bd9573_ops, 472 + [BD957X_VOUTS1] = &bd9573_vouts1_regulator_ops, 473 + }; 474 + 475 + static const struct regulator_ops *bd9576_ops_arr[] = { 476 + [BD957X_VD50] = &bd9576_ops, 477 + [BD957X_VD18] = &bd9576_ops, 478 + [BD957X_VDDDR] = &bd9576_vout34_ops, 479 + [BD957X_VD10] = &bd9576_vout34_ops, 480 + [BD957X_VOUTL1] = &bd9576_ops, 481 + [BD957X_VOUTS1] = &bd9576_vouts1_regulator_ops, 482 + }; 483 + 484 + static int vouts1_get_fet_res(struct device_node *np, 485 + const struct regulator_desc *desc, 486 + struct regulator_config *cfg) 487 + { 488 + struct bd957x_regulator_data *data; 489 + int ret; 490 + u32 uohms; 491 + 492 + data = container_of(desc, struct bd957x_regulator_data, desc); 493 + 494 + ret = of_property_read_u32(np, "rohm,ocw-fet-ron-micro-ohms", &uohms); 495 + if (ret) { 496 + if (ret != -EINVAL) 497 + return ret; 498 + 499 + return 0; 500 + } 501 + data->ocw_rfet = uohms; 502 + return 0; 503 + } 504 + 505 + static struct bd957x_data bd957x_regulators = { 506 + .regulator_data = { 507 + { 508 + .desc = { 509 + .name = "VD50", 510 + .of_match = of_match_ptr("regulator-vd50"), 511 + .regulators_node = of_match_ptr("regulators"), 512 + .id = BD957X_VD50, 513 + .type = REGULATOR_VOLTAGE, 514 + .volt_table = &vout1_volt_table[0], 515 + .n_voltages = ARRAY_SIZE(vout1_volt_table), 516 + .vsel_reg = BD957X_REG_VOUT1_TUNE, 517 + .vsel_mask = BD957X_MASK_VOUT1_TUNE, 518 + .enable_reg = BD957X_REG_POW_TRIGGER1, 519 + .enable_mask = BD957X_REGULATOR_EN_MASK, 520 + .enable_val = BD957X_REGULATOR_DIS_VAL, 521 + .enable_is_inverted = true, 522 + .owner = THIS_MODULE, 523 + }, 524 + .xvd_ranges = vout1_xvd_ranges, 525 + .num_xvd_ranges = ARRAY_SIZE(vout1_xvd_ranges), 526 + .ovd_reg = BD9576_REG_VOUT1_OVD, 527 + .uvd_reg = BD9576_REG_VOUT1_UVD, 528 + .xvd_mask = BD9576_MASK_XVD, 198 529 }, 199 - }, 200 - { 201 - .desc = { 202 - .name = "VD18", 203 - .of_match = of_match_ptr("regulator-vd18"), 204 - .regulators_node = of_match_ptr("regulators"), 205 - .id = BD957X_VD18, 206 - .type = REGULATOR_VOLTAGE, 207 - .ops = &bd957x_ops, 208 - .volt_table = &vout2_volt_table[0], 209 - .n_voltages = ARRAY_SIZE(vout2_volt_table), 210 - .vsel_reg = BD957X_REG_VOUT2_TUNE, 211 - .vsel_mask = BD957X_MASK_VOUT2_TUNE, 212 - .enable_reg = BD957X_REG_POW_TRIGGER2, 213 - .enable_mask = BD957X_REGULATOR_EN_MASK, 214 - .enable_val = BD957X_REGULATOR_DIS_VAL, 215 - .enable_is_inverted = true, 216 - .owner = THIS_MODULE, 530 + { 531 + .desc = { 532 + .name = "VD18", 533 + .of_match = of_match_ptr("regulator-vd18"), 534 + .regulators_node = of_match_ptr("regulators"), 535 + .id = BD957X_VD18, 536 + .type = REGULATOR_VOLTAGE, 537 + .volt_table = &vout2_volt_table[0], 538 + .n_voltages = ARRAY_SIZE(vout2_volt_table), 539 + .vsel_reg = BD957X_REG_VOUT2_TUNE, 540 + .vsel_mask = BD957X_MASK_VOUT2_TUNE, 541 + .enable_reg = BD957X_REG_POW_TRIGGER2, 542 + .enable_mask = BD957X_REGULATOR_EN_MASK, 543 + .enable_val = BD957X_REGULATOR_DIS_VAL, 544 + .enable_is_inverted = true, 545 + .owner = THIS_MODULE, 546 + }, 547 + .xvd_ranges = vout234_xvd_ranges, 548 + .num_xvd_ranges = ARRAY_SIZE(vout234_xvd_ranges), 549 + .ovd_reg = BD9576_REG_VOUT2_OVD, 550 + .uvd_reg = BD9576_REG_VOUT2_UVD, 551 + .xvd_mask = BD9576_MASK_XVD, 217 552 }, 218 - }, 219 - { 220 - .desc = { 221 - .name = "VDDDR", 222 - .of_match = of_match_ptr("regulator-vdddr"), 223 - .regulators_node = of_match_ptr("regulators"), 224 - .id = BD957X_VDDDR, 225 - .ops = &bd957x_vout34_ops, 226 - .type = REGULATOR_VOLTAGE, 227 - .n_voltages = BD957X_VOUTS34_NUM_VOLT, 228 - .vsel_reg = BD957X_REG_VOUT3_TUNE, 229 - .vsel_mask = BD957X_MASK_VOUT3_TUNE, 230 - .enable_reg = BD957X_REG_POW_TRIGGER3, 231 - .enable_mask = BD957X_REGULATOR_EN_MASK, 232 - .enable_val = BD957X_REGULATOR_DIS_VAL, 233 - .enable_is_inverted = true, 234 - .owner = THIS_MODULE, 553 + { 554 + .desc = { 555 + .name = "VDDDR", 556 + .of_match = of_match_ptr("regulator-vdddr"), 557 + .regulators_node = of_match_ptr("regulators"), 558 + .id = BD957X_VDDDR, 559 + .type = REGULATOR_VOLTAGE, 560 + .n_voltages = BD957X_VOUTS34_NUM_VOLT, 561 + .vsel_reg = BD957X_REG_VOUT3_TUNE, 562 + .vsel_mask = BD957X_MASK_VOUT3_TUNE, 563 + .enable_reg = BD957X_REG_POW_TRIGGER3, 564 + .enable_mask = BD957X_REGULATOR_EN_MASK, 565 + .enable_val = BD957X_REGULATOR_DIS_VAL, 566 + .enable_is_inverted = true, 567 + .owner = THIS_MODULE, 568 + }, 569 + .ovd_reg = BD9576_REG_VOUT3_OVD, 570 + .uvd_reg = BD9576_REG_VOUT3_UVD, 571 + .xvd_mask = BD9576_MASK_XVD, 572 + .xvd_ranges = vout234_xvd_ranges, 573 + .num_xvd_ranges = ARRAY_SIZE(vout234_xvd_ranges), 235 574 }, 236 - }, 237 - { 238 - .desc = { 239 - .name = "VD10", 240 - .of_match = of_match_ptr("regulator-vd10"), 241 - .regulators_node = of_match_ptr("regulators"), 242 - .id = BD957X_VD10, 243 - .ops = &bd957x_vout34_ops, 244 - .type = REGULATOR_VOLTAGE, 245 - .fixed_uV = BD957X_VOUTS4_BASE_VOLT, 246 - .n_voltages = BD957X_VOUTS34_NUM_VOLT, 247 - .vsel_reg = BD957X_REG_VOUT4_TUNE, 248 - .vsel_mask = BD957X_MASK_VOUT4_TUNE, 249 - .enable_reg = BD957X_REG_POW_TRIGGER4, 250 - .enable_mask = BD957X_REGULATOR_EN_MASK, 251 - .enable_val = BD957X_REGULATOR_DIS_VAL, 252 - .enable_is_inverted = true, 253 - .owner = THIS_MODULE, 575 + { 576 + .desc = { 577 + .name = "VD10", 578 + .of_match = of_match_ptr("regulator-vd10"), 579 + .regulators_node = of_match_ptr("regulators"), 580 + .id = BD957X_VD10, 581 + .type = REGULATOR_VOLTAGE, 582 + .fixed_uV = BD957X_VOUTS4_BASE_VOLT, 583 + .n_voltages = BD957X_VOUTS34_NUM_VOLT, 584 + .vsel_reg = BD957X_REG_VOUT4_TUNE, 585 + .vsel_mask = BD957X_MASK_VOUT4_TUNE, 586 + .enable_reg = BD957X_REG_POW_TRIGGER4, 587 + .enable_mask = BD957X_REGULATOR_EN_MASK, 588 + .enable_val = BD957X_REGULATOR_DIS_VAL, 589 + .enable_is_inverted = true, 590 + .owner = THIS_MODULE, 591 + }, 592 + .xvd_ranges = vout234_xvd_ranges, 593 + .num_xvd_ranges = ARRAY_SIZE(vout234_xvd_ranges), 594 + .ovd_reg = BD9576_REG_VOUT4_OVD, 595 + .uvd_reg = BD9576_REG_VOUT4_UVD, 596 + .xvd_mask = BD9576_MASK_XVD, 254 597 }, 255 - }, 256 - { 257 - .desc = { 258 - .name = "VOUTL1", 259 - .of_match = of_match_ptr("regulator-voutl1"), 260 - .regulators_node = of_match_ptr("regulators"), 261 - .id = BD957X_VOUTL1, 262 - .ops = &bd957x_ops, 263 - .type = REGULATOR_VOLTAGE, 264 - .volt_table = &voutl1_volt_table[0], 265 - .n_voltages = ARRAY_SIZE(voutl1_volt_table), 266 - .vsel_reg = BD957X_REG_VOUTL1_TUNE, 267 - .vsel_mask = BD957X_MASK_VOUTL1_TUNE, 268 - .enable_reg = BD957X_REG_POW_TRIGGERL1, 269 - .enable_mask = BD957X_REGULATOR_EN_MASK, 270 - .enable_val = BD957X_REGULATOR_DIS_VAL, 271 - .enable_is_inverted = true, 272 - .owner = THIS_MODULE, 598 + { 599 + .desc = { 600 + .name = "VOUTL1", 601 + .of_match = of_match_ptr("regulator-voutl1"), 602 + .regulators_node = of_match_ptr("regulators"), 603 + .id = BD957X_VOUTL1, 604 + .type = REGULATOR_VOLTAGE, 605 + .volt_table = &voutl1_volt_table[0], 606 + .n_voltages = ARRAY_SIZE(voutl1_volt_table), 607 + .vsel_reg = BD957X_REG_VOUTL1_TUNE, 608 + .vsel_mask = BD957X_MASK_VOUTL1_TUNE, 609 + .enable_reg = BD957X_REG_POW_TRIGGERL1, 610 + .enable_mask = BD957X_REGULATOR_EN_MASK, 611 + .enable_val = BD957X_REGULATOR_DIS_VAL, 612 + .enable_is_inverted = true, 613 + .owner = THIS_MODULE, 614 + }, 615 + .xvd_ranges = voutL1_xvd_ranges, 616 + .num_xvd_ranges = ARRAY_SIZE(voutL1_xvd_ranges), 617 + .ovd_reg = BD9576_REG_VOUTL1_OVD, 618 + .uvd_reg = BD9576_REG_VOUTL1_UVD, 619 + .xvd_mask = BD9576_MASK_XVD, 273 620 }, 274 - }, 275 - { 276 - .desc = { 277 - .name = "VOUTS1", 278 - .of_match = of_match_ptr("regulator-vouts1"), 279 - .regulators_node = of_match_ptr("regulators"), 280 - .id = BD957X_VOUTS1, 281 - .ops = &bd957X_vouts1_regulator_ops, 282 - .type = REGULATOR_VOLTAGE, 283 - .n_voltages = 1, 284 - .fixed_uV = BD957X_VOUTS1_VOLT, 285 - .enable_reg = BD957X_REG_POW_TRIGGERS1, 286 - .enable_mask = BD957X_REGULATOR_EN_MASK, 287 - .enable_val = BD957X_REGULATOR_DIS_VAL, 288 - .enable_is_inverted = true, 289 - .owner = THIS_MODULE, 621 + { 622 + .desc = { 623 + .name = "VOUTS1", 624 + .of_match = of_match_ptr("regulator-vouts1"), 625 + .regulators_node = of_match_ptr("regulators"), 626 + .id = BD957X_VOUTS1, 627 + .type = REGULATOR_VOLTAGE, 628 + .n_voltages = 1, 629 + .fixed_uV = BD957X_VOUTS1_VOLT, 630 + .enable_reg = BD957X_REG_POW_TRIGGERS1, 631 + .enable_mask = BD957X_REGULATOR_EN_MASK, 632 + .enable_val = BD957X_REGULATOR_DIS_VAL, 633 + .enable_is_inverted = true, 634 + .owner = THIS_MODULE, 635 + .of_parse_cb = vouts1_get_fet_res, 636 + }, 637 + .oc_supported = true, 638 + .ocw_reg = BD9576_REG_VOUT1S_OCW, 639 + .ocw_mask = BD9576_MASK_VOUT1S_OCW, 640 + .ocp_reg = BD9576_REG_VOUT1S_OCP, 641 + .ocp_mask = BD9576_MASK_VOUT1S_OCP, 290 642 }, 291 643 }, 292 644 }; 293 645 646 + static int bd9576_renable(struct regulator_irq_data *rid, int reg, int mask) 647 + { 648 + int val, ret; 649 + struct bd957x_data *d = (struct bd957x_data *)rid->data; 650 + 651 + ret = regmap_read(d->regmap, reg, &val); 652 + if (ret) 653 + return REGULATOR_FAILED_RETRY; 654 + 655 + if (rid->opaque && rid->opaque == (val & mask)) { 656 + /* 657 + * It seems we stil have same status. Ack and return 658 + * information that we are still out of limits and core 659 + * should not enable IRQ 660 + */ 661 + regmap_write(d->regmap, reg, mask & val); 662 + return REGULATOR_ERROR_ON; 663 + } 664 + rid->opaque = 0; 665 + /* 666 + * Status was changed. Either prolem was solved or we have new issues. 667 + * Let's re-enable IRQs and be prepared to report problems again 668 + */ 669 + return REGULATOR_ERROR_CLEARED; 670 + } 671 + 672 + static int bd9576_uvd_renable(struct regulator_irq_data *rid) 673 + { 674 + return bd9576_renable(rid, BD957X_REG_INT_UVD_STAT, UVD_IRQ_VALID_MASK); 675 + } 676 + 677 + static int bd9576_ovd_renable(struct regulator_irq_data *rid) 678 + { 679 + return bd9576_renable(rid, BD957X_REG_INT_OVD_STAT, OVD_IRQ_VALID_MASK); 680 + } 681 + 682 + static int bd9576_temp_renable(struct regulator_irq_data *rid) 683 + { 684 + return bd9576_renable(rid, BD957X_REG_INT_THERM_STAT, 685 + BD9576_THERM_IRQ_MASK_TW); 686 + } 687 + 688 + static int bd9576_uvd_handler(int irq, struct regulator_irq_data *rid, 689 + unsigned long *dev_mask) 690 + { 691 + int val, ret, i; 692 + struct bd957x_data *d = (struct bd957x_data *)rid->data; 693 + 694 + ret = regmap_read(d->regmap, BD957X_REG_INT_UVD_STAT, &val); 695 + if (ret) 696 + return REGULATOR_FAILED_RETRY; 697 + 698 + *dev_mask = 0; 699 + 700 + rid->opaque = val & UVD_IRQ_VALID_MASK; 701 + 702 + /* 703 + * Go through the set status bits and report either error or warning 704 + * to the notifier depending on what was flagged in DT 705 + */ 706 + *dev_mask = val & BD9576_xVD_IRQ_MASK_VOUT1TO4; 707 + /* There is 1 bit gap in register after Vout1 .. Vout4 statuses */ 708 + *dev_mask |= ((val & BD9576_xVD_IRQ_MASK_VOUTL1) >> 1); 709 + /* 710 + * We (ab)use the uvd for OCW notification. DT parsing should 711 + * have added correct OCW flag to uvd_notif and uvd_err for S1 712 + */ 713 + *dev_mask |= ((val & BD9576_UVD_IRQ_MASK_VOUTS1_OCW) >> 1); 714 + 715 + for_each_set_bit(i, dev_mask, 6) { 716 + struct bd957x_regulator_data *rdata; 717 + struct regulator_err_state *stat; 718 + 719 + rdata = &d->regulator_data[i]; 720 + stat = &rid->states[i]; 721 + 722 + stat->notifs = rdata->uvd_notif; 723 + stat->errors = rdata->uvd_err; 724 + } 725 + 726 + ret = regmap_write(d->regmap, BD957X_REG_INT_UVD_STAT, 727 + UVD_IRQ_VALID_MASK & val); 728 + 729 + return 0; 730 + } 731 + 732 + static int bd9576_ovd_handler(int irq, struct regulator_irq_data *rid, 733 + unsigned long *dev_mask) 734 + { 735 + int val, ret, i; 736 + struct bd957x_data *d = (struct bd957x_data *)rid->data; 737 + 738 + ret = regmap_read(d->regmap, BD957X_REG_INT_OVD_STAT, &val); 739 + if (ret) 740 + return REGULATOR_FAILED_RETRY; 741 + 742 + rid->opaque = val & OVD_IRQ_VALID_MASK; 743 + *dev_mask = 0; 744 + 745 + if (!(val & OVD_IRQ_VALID_MASK)) 746 + return 0; 747 + 748 + *dev_mask = val & BD9576_xVD_IRQ_MASK_VOUT1TO4; 749 + /* There is 1 bit gap in register after Vout1 .. Vout4 statuses */ 750 + *dev_mask |= ((val & BD9576_xVD_IRQ_MASK_VOUTL1) >> 1); 751 + 752 + for_each_set_bit(i, dev_mask, 5) { 753 + struct bd957x_regulator_data *rdata; 754 + struct regulator_err_state *stat; 755 + 756 + rdata = &d->regulator_data[i]; 757 + stat = &rid->states[i]; 758 + 759 + stat->notifs = rdata->ovd_notif; 760 + stat->errors = rdata->ovd_err; 761 + } 762 + 763 + /* Clear the sub-IRQ status */ 764 + regmap_write(d->regmap, BD957X_REG_INT_OVD_STAT, 765 + OVD_IRQ_VALID_MASK & val); 766 + 767 + return 0; 768 + } 769 + 770 + #define BD9576_DEV_MASK_ALL_REGULATORS 0x3F 771 + 772 + static int bd9576_thermal_handler(int irq, struct regulator_irq_data *rid, 773 + unsigned long *dev_mask) 774 + { 775 + int val, ret, i; 776 + struct bd957x_data *d = (struct bd957x_data *)rid->data; 777 + 778 + ret = regmap_read(d->regmap, BD957X_REG_INT_THERM_STAT, &val); 779 + if (ret) 780 + return REGULATOR_FAILED_RETRY; 781 + 782 + if (!(val & BD9576_THERM_IRQ_MASK_TW)) { 783 + *dev_mask = 0; 784 + return 0; 785 + } 786 + 787 + *dev_mask = BD9576_DEV_MASK_ALL_REGULATORS; 788 + 789 + for (i = 0; i < BD9576_NUM_REGULATORS; i++) { 790 + struct bd957x_regulator_data *rdata; 791 + struct regulator_err_state *stat; 792 + 793 + rdata = &d->regulator_data[i]; 794 + stat = &rid->states[i]; 795 + 796 + stat->notifs = rdata->temp_notif; 797 + stat->errors = rdata->temp_err; 798 + } 799 + 800 + /* Clear the sub-IRQ status */ 801 + regmap_write(d->regmap, BD957X_REG_INT_THERM_STAT, 802 + BD9576_THERM_IRQ_MASK_TW); 803 + 804 + return 0; 805 + } 806 + 294 807 static int bd957x_probe(struct platform_device *pdev) 295 808 { 296 - struct regmap *regmap; 297 - struct regulator_config config = { 0 }; 298 809 int i; 299 - bool vout_mode, ddr_sel; 300 - const struct bd957x_regulator_data *reg_data = &bd9576_regulators[0]; 301 - unsigned int num_reg_data = ARRAY_SIZE(bd9576_regulators); 810 + unsigned int num_reg_data; 811 + bool vout_mode, ddr_sel, may_have_irqs = false; 812 + struct regmap *regmap; 813 + struct bd957x_data *ic_data; 814 + struct regulator_config config = { 0 }; 815 + /* All regulators are related to UVD and thermal IRQs... */ 816 + struct regulator_dev *rdevs[BD9576_NUM_REGULATORS]; 817 + /* ...But VoutS1 is not flagged by OVD IRQ */ 818 + struct regulator_dev *ovd_devs[BD9576_NUM_OVD_REGULATORS]; 819 + static const struct regulator_irq_desc bd9576_notif_uvd = { 820 + .name = "bd9576-uvd", 821 + .irq_off_ms = 1000, 822 + .map_event = bd9576_uvd_handler, 823 + .renable = bd9576_uvd_renable, 824 + .data = &bd957x_regulators, 825 + }; 826 + static const struct regulator_irq_desc bd9576_notif_ovd = { 827 + .name = "bd9576-ovd", 828 + .irq_off_ms = 1000, 829 + .map_event = bd9576_ovd_handler, 830 + .renable = bd9576_ovd_renable, 831 + .data = &bd957x_regulators, 832 + }; 833 + static const struct regulator_irq_desc bd9576_notif_temp = { 834 + .name = "bd9576-temp", 835 + .irq_off_ms = 1000, 836 + .map_event = bd9576_thermal_handler, 837 + .renable = bd9576_temp_renable, 838 + .data = &bd957x_regulators, 839 + }; 302 840 enum rohm_chip_type chip = platform_get_device_id(pdev)->driver_data; 841 + 842 + num_reg_data = ARRAY_SIZE(bd957x_regulators.regulator_data); 843 + 844 + ic_data = &bd957x_regulators; 303 845 304 846 regmap = dev_get_regmap(pdev->dev.parent, NULL); 305 847 if (!regmap) { 306 848 dev_err(&pdev->dev, "No regmap\n"); 307 849 return -EINVAL; 308 850 } 851 + 852 + ic_data->regmap = regmap; 309 853 vout_mode = of_property_read_bool(pdev->dev.parent->of_node, 310 854 "rohm,vout1-en-low"); 311 855 if (vout_mode) { ··· 985 263 * bytes and use bd9576_regulators directly for non-constant configs 986 264 * like DDR voltage selection. 987 265 */ 266 + platform_set_drvdata(pdev, ic_data); 988 267 ddr_sel = of_property_read_bool(pdev->dev.parent->of_node, 989 268 "rohm,ddr-sel-low"); 990 269 if (ddr_sel) 991 - bd9576_regulators[2].desc.fixed_uV = 1350000; 270 + ic_data->regulator_data[2].desc.fixed_uV = 1350000; 992 271 else 993 - bd9576_regulators[2].desc.fixed_uV = 1500000; 272 + ic_data->regulator_data[2].desc.fixed_uV = 1500000; 994 273 995 274 switch (chip) { 996 275 case ROHM_CHIP_TYPE_BD9576: 276 + may_have_irqs = true; 997 277 dev_dbg(&pdev->dev, "Found BD9576MUF\n"); 998 278 break; 999 279 case ROHM_CHIP_TYPE_BD9573: ··· 1006 282 return -EINVAL; 1007 283 } 1008 284 285 + for (i = 0; i < num_reg_data; i++) { 286 + struct regulator_desc *d; 287 + 288 + d = &ic_data->regulator_data[i].desc; 289 + 290 + 291 + if (may_have_irqs) { 292 + if (d->id >= ARRAY_SIZE(bd9576_ops_arr)) 293 + return -EINVAL; 294 + 295 + d->ops = bd9576_ops_arr[d->id]; 296 + } else { 297 + if (d->id >= ARRAY_SIZE(bd9573_ops_arr)) 298 + return -EINVAL; 299 + 300 + d->ops = bd9573_ops_arr[d->id]; 301 + } 302 + } 303 + 1009 304 config.dev = pdev->dev.parent; 1010 305 config.regmap = regmap; 306 + config.driver_data = ic_data; 1011 307 1012 308 for (i = 0; i < num_reg_data; i++) { 1013 309 1014 - const struct regulator_desc *desc; 1015 - struct regulator_dev *rdev; 1016 - const struct bd957x_regulator_data *r; 310 + struct bd957x_regulator_data *r = &ic_data->regulator_data[i]; 311 + const struct regulator_desc *desc = &r->desc; 1017 312 1018 - r = &reg_data[i]; 1019 - desc = &r->desc; 1020 - 1021 - rdev = devm_regulator_register(&pdev->dev, desc, &config); 1022 - if (IS_ERR(rdev)) { 313 + r->rdev = devm_regulator_register(&pdev->dev, desc, 314 + &config); 315 + if (IS_ERR(r->rdev)) { 1023 316 dev_err(&pdev->dev, 1024 317 "failed to register %s regulator\n", 1025 318 desc->name); 1026 - return PTR_ERR(rdev); 319 + return PTR_ERR(r->rdev); 1027 320 } 1028 321 /* 1029 322 * Clear the VOUT1 GPIO setting - rest of the regulators do not 1030 323 * support GPIO control 1031 324 */ 1032 325 config.ena_gpiod = NULL; 1033 - } 1034 326 327 + if (!may_have_irqs) 328 + continue; 329 + 330 + rdevs[i] = r->rdev; 331 + if (i < BD957X_VOUTS1) 332 + ovd_devs[i] = r->rdev; 333 + } 334 + if (may_have_irqs) { 335 + void *ret; 336 + /* 337 + * We can add both the possible error and warning flags here 338 + * because the core uses these only for status clearing and 339 + * if we use warnings - errors are always clear and the other 340 + * way around. We can also add CURRENT flag for all regulators 341 + * because it is never set if it is not supported. Same applies 342 + * to setting UVD for VoutS1 - it is not accidentally cleared 343 + * as it is never set. 344 + */ 345 + int uvd_errs = REGULATOR_ERROR_UNDER_VOLTAGE | 346 + REGULATOR_ERROR_UNDER_VOLTAGE_WARN | 347 + REGULATOR_ERROR_OVER_CURRENT | 348 + REGULATOR_ERROR_OVER_CURRENT_WARN; 349 + int ovd_errs = REGULATOR_ERROR_OVER_VOLTAGE_WARN | 350 + REGULATOR_ERROR_REGULATION_OUT; 351 + int temp_errs = REGULATOR_ERROR_OVER_TEMP | 352 + REGULATOR_ERROR_OVER_TEMP_WARN; 353 + int irq; 354 + 355 + irq = platform_get_irq_byname(pdev, "bd9576-uvd"); 356 + 357 + /* Register notifiers - can fail if IRQ is not given */ 358 + ret = devm_regulator_irq_helper(&pdev->dev, &bd9576_notif_uvd, 359 + irq, 0, uvd_errs, NULL, 360 + &rdevs[0], 361 + BD9576_NUM_REGULATORS); 362 + if (IS_ERR(ret)) { 363 + if (PTR_ERR(ret) == -EPROBE_DEFER) 364 + return -EPROBE_DEFER; 365 + 366 + dev_warn(&pdev->dev, "UVD disabled %pe\n", ret); 367 + } 368 + 369 + irq = platform_get_irq_byname(pdev, "bd9576-ovd"); 370 + 371 + ret = devm_regulator_irq_helper(&pdev->dev, &bd9576_notif_ovd, 372 + irq, 0, ovd_errs, NULL, 373 + &ovd_devs[0], 374 + BD9576_NUM_OVD_REGULATORS); 375 + if (IS_ERR(ret)) { 376 + if (PTR_ERR(ret) == -EPROBE_DEFER) 377 + return -EPROBE_DEFER; 378 + 379 + dev_warn(&pdev->dev, "OVD disabled %pe\n", ret); 380 + } 381 + irq = platform_get_irq_byname(pdev, "bd9576-temp"); 382 + 383 + ret = devm_regulator_irq_helper(&pdev->dev, &bd9576_notif_temp, 384 + irq, 0, temp_errs, NULL, 385 + &rdevs[0], 386 + BD9576_NUM_REGULATORS); 387 + if (IS_ERR(ret)) { 388 + if (PTR_ERR(ret) == -EPROBE_DEFER) 389 + return -EPROBE_DEFER; 390 + 391 + dev_warn(&pdev->dev, "Thermal warning disabled %pe\n", 392 + ret); 393 + } 394 + } 1035 395 return 0; 1036 396 } 1037 397 1038 398 static const struct platform_device_id bd957x_pmic_id[] = { 1039 - { "bd9573-pmic", ROHM_CHIP_TYPE_BD9573 }, 1040 - { "bd9576-pmic", ROHM_CHIP_TYPE_BD9576 }, 399 + { "bd9573-regulator", ROHM_CHIP_TYPE_BD9573 }, 400 + { "bd9576-regulator", ROHM_CHIP_TYPE_BD9576 }, 1041 401 { }, 1042 402 }; 1043 403 MODULE_DEVICE_TABLE(platform, bd957x_pmic_id);
+228 -90
drivers/regulator/core.c
··· 33 33 #include "dummy.h" 34 34 #include "internal.h" 35 35 36 - #define rdev_crit(rdev, fmt, ...) \ 37 - pr_crit("%s: " fmt, rdev_get_name(rdev), ##__VA_ARGS__) 38 - #define rdev_err(rdev, fmt, ...) \ 39 - pr_err("%s: " fmt, rdev_get_name(rdev), ##__VA_ARGS__) 40 - #define rdev_warn(rdev, fmt, ...) \ 41 - pr_warn("%s: " fmt, rdev_get_name(rdev), ##__VA_ARGS__) 42 - #define rdev_info(rdev, fmt, ...) \ 43 - pr_info("%s: " fmt, rdev_get_name(rdev), ##__VA_ARGS__) 44 - #define rdev_dbg(rdev, fmt, ...) \ 45 - pr_debug("%s: " fmt, rdev_get_name(rdev), ##__VA_ARGS__) 46 - 47 36 static DEFINE_WW_CLASS(regulator_ww_class); 48 37 static DEFINE_MUTEX(regulator_nesting_mutex); 49 38 static DEFINE_MUTEX(regulator_list_mutex); ··· 106 117 else 107 118 return ""; 108 119 } 120 + EXPORT_SYMBOL_GPL(rdev_get_name); 109 121 110 122 static bool have_full_constraints(void) 111 123 { ··· 581 591 return rstate; 582 592 } 583 593 584 - static ssize_t regulator_uV_show(struct device *dev, 585 - struct device_attribute *attr, char *buf) 594 + static ssize_t microvolts_show(struct device *dev, 595 + struct device_attribute *attr, char *buf) 586 596 { 587 597 struct regulator_dev *rdev = dev_get_drvdata(dev); 588 598 int uV; ··· 595 605 return uV; 596 606 return sprintf(buf, "%d\n", uV); 597 607 } 598 - static DEVICE_ATTR(microvolts, 0444, regulator_uV_show, NULL); 608 + static DEVICE_ATTR_RO(microvolts); 599 609 600 - static ssize_t regulator_uA_show(struct device *dev, 601 - struct device_attribute *attr, char *buf) 610 + static ssize_t microamps_show(struct device *dev, 611 + struct device_attribute *attr, char *buf) 602 612 { 603 613 struct regulator_dev *rdev = dev_get_drvdata(dev); 604 614 605 615 return sprintf(buf, "%d\n", _regulator_get_current_limit(rdev)); 606 616 } 607 - static DEVICE_ATTR(microamps, 0444, regulator_uA_show, NULL); 617 + static DEVICE_ATTR_RO(microamps); 608 618 609 619 static ssize_t name_show(struct device *dev, struct device_attribute *attr, 610 620 char *buf) ··· 635 645 return sprintf(buf, "%s\n", regulator_opmode_to_str(mode)); 636 646 } 637 647 638 - static ssize_t regulator_opmode_show(struct device *dev, 639 - struct device_attribute *attr, char *buf) 648 + static ssize_t opmode_show(struct device *dev, 649 + struct device_attribute *attr, char *buf) 640 650 { 641 651 struct regulator_dev *rdev = dev_get_drvdata(dev); 642 652 643 653 return regulator_print_opmode(buf, _regulator_get_mode(rdev)); 644 654 } 645 - static DEVICE_ATTR(opmode, 0444, regulator_opmode_show, NULL); 655 + static DEVICE_ATTR_RO(opmode); 646 656 647 657 static ssize_t regulator_print_state(char *buf, int state) 648 658 { ··· 654 664 return sprintf(buf, "unknown\n"); 655 665 } 656 666 657 - static ssize_t regulator_state_show(struct device *dev, 658 - struct device_attribute *attr, char *buf) 667 + static ssize_t state_show(struct device *dev, 668 + struct device_attribute *attr, char *buf) 659 669 { 660 670 struct regulator_dev *rdev = dev_get_drvdata(dev); 661 671 ssize_t ret; ··· 666 676 667 677 return ret; 668 678 } 669 - static DEVICE_ATTR(state, 0444, regulator_state_show, NULL); 679 + static DEVICE_ATTR_RO(state); 670 680 671 - static ssize_t regulator_status_show(struct device *dev, 672 - struct device_attribute *attr, char *buf) 681 + static ssize_t status_show(struct device *dev, 682 + struct device_attribute *attr, char *buf) 673 683 { 674 684 struct regulator_dev *rdev = dev_get_drvdata(dev); 675 685 int status; ··· 713 723 714 724 return sprintf(buf, "%s\n", label); 715 725 } 716 - static DEVICE_ATTR(status, 0444, regulator_status_show, NULL); 726 + static DEVICE_ATTR_RO(status); 717 727 718 - static ssize_t regulator_min_uA_show(struct device *dev, 719 - struct device_attribute *attr, char *buf) 728 + static ssize_t min_microamps_show(struct device *dev, 729 + struct device_attribute *attr, char *buf) 720 730 { 721 731 struct regulator_dev *rdev = dev_get_drvdata(dev); 722 732 ··· 725 735 726 736 return sprintf(buf, "%d\n", rdev->constraints->min_uA); 727 737 } 728 - static DEVICE_ATTR(min_microamps, 0444, regulator_min_uA_show, NULL); 738 + static DEVICE_ATTR_RO(min_microamps); 729 739 730 - static ssize_t regulator_max_uA_show(struct device *dev, 731 - struct device_attribute *attr, char *buf) 740 + static ssize_t max_microamps_show(struct device *dev, 741 + struct device_attribute *attr, char *buf) 732 742 { 733 743 struct regulator_dev *rdev = dev_get_drvdata(dev); 734 744 ··· 737 747 738 748 return sprintf(buf, "%d\n", rdev->constraints->max_uA); 739 749 } 740 - static DEVICE_ATTR(max_microamps, 0444, regulator_max_uA_show, NULL); 750 + static DEVICE_ATTR_RO(max_microamps); 741 751 742 - static ssize_t regulator_min_uV_show(struct device *dev, 743 - struct device_attribute *attr, char *buf) 752 + static ssize_t min_microvolts_show(struct device *dev, 753 + struct device_attribute *attr, char *buf) 744 754 { 745 755 struct regulator_dev *rdev = dev_get_drvdata(dev); 746 756 ··· 749 759 750 760 return sprintf(buf, "%d\n", rdev->constraints->min_uV); 751 761 } 752 - static DEVICE_ATTR(min_microvolts, 0444, regulator_min_uV_show, NULL); 762 + static DEVICE_ATTR_RO(min_microvolts); 753 763 754 - static ssize_t regulator_max_uV_show(struct device *dev, 755 - struct device_attribute *attr, char *buf) 764 + static ssize_t max_microvolts_show(struct device *dev, 765 + struct device_attribute *attr, char *buf) 756 766 { 757 767 struct regulator_dev *rdev = dev_get_drvdata(dev); 758 768 ··· 761 771 762 772 return sprintf(buf, "%d\n", rdev->constraints->max_uV); 763 773 } 764 - static DEVICE_ATTR(max_microvolts, 0444, regulator_max_uV_show, NULL); 774 + static DEVICE_ATTR_RO(max_microvolts); 765 775 766 - static ssize_t regulator_total_uA_show(struct device *dev, 767 - struct device_attribute *attr, char *buf) 776 + static ssize_t requested_microamps_show(struct device *dev, 777 + struct device_attribute *attr, char *buf) 768 778 { 769 779 struct regulator_dev *rdev = dev_get_drvdata(dev); 770 780 struct regulator *regulator; ··· 778 788 regulator_unlock(rdev); 779 789 return sprintf(buf, "%d\n", uA); 780 790 } 781 - static DEVICE_ATTR(requested_microamps, 0444, regulator_total_uA_show, NULL); 791 + static DEVICE_ATTR_RO(requested_microamps); 782 792 783 793 static ssize_t num_users_show(struct device *dev, struct device_attribute *attr, 784 794 char *buf) ··· 803 813 } 804 814 static DEVICE_ATTR_RO(type); 805 815 806 - static ssize_t regulator_suspend_mem_uV_show(struct device *dev, 807 - struct device_attribute *attr, char *buf) 816 + static ssize_t suspend_mem_microvolts_show(struct device *dev, 817 + struct device_attribute *attr, char *buf) 808 818 { 809 819 struct regulator_dev *rdev = dev_get_drvdata(dev); 810 820 811 821 return sprintf(buf, "%d\n", rdev->constraints->state_mem.uV); 812 822 } 813 - static DEVICE_ATTR(suspend_mem_microvolts, 0444, 814 - regulator_suspend_mem_uV_show, NULL); 823 + static DEVICE_ATTR_RO(suspend_mem_microvolts); 815 824 816 - static ssize_t regulator_suspend_disk_uV_show(struct device *dev, 817 - struct device_attribute *attr, char *buf) 825 + static ssize_t suspend_disk_microvolts_show(struct device *dev, 826 + struct device_attribute *attr, char *buf) 818 827 { 819 828 struct regulator_dev *rdev = dev_get_drvdata(dev); 820 829 821 830 return sprintf(buf, "%d\n", rdev->constraints->state_disk.uV); 822 831 } 823 - static DEVICE_ATTR(suspend_disk_microvolts, 0444, 824 - regulator_suspend_disk_uV_show, NULL); 832 + static DEVICE_ATTR_RO(suspend_disk_microvolts); 825 833 826 - static ssize_t regulator_suspend_standby_uV_show(struct device *dev, 827 - struct device_attribute *attr, char *buf) 834 + static ssize_t suspend_standby_microvolts_show(struct device *dev, 835 + struct device_attribute *attr, char *buf) 828 836 { 829 837 struct regulator_dev *rdev = dev_get_drvdata(dev); 830 838 831 839 return sprintf(buf, "%d\n", rdev->constraints->state_standby.uV); 832 840 } 833 - static DEVICE_ATTR(suspend_standby_microvolts, 0444, 834 - regulator_suspend_standby_uV_show, NULL); 841 + static DEVICE_ATTR_RO(suspend_standby_microvolts); 835 842 836 - static ssize_t regulator_suspend_mem_mode_show(struct device *dev, 837 - struct device_attribute *attr, char *buf) 843 + static ssize_t suspend_mem_mode_show(struct device *dev, 844 + struct device_attribute *attr, char *buf) 838 845 { 839 846 struct regulator_dev *rdev = dev_get_drvdata(dev); 840 847 841 848 return regulator_print_opmode(buf, 842 849 rdev->constraints->state_mem.mode); 843 850 } 844 - static DEVICE_ATTR(suspend_mem_mode, 0444, 845 - regulator_suspend_mem_mode_show, NULL); 851 + static DEVICE_ATTR_RO(suspend_mem_mode); 846 852 847 - static ssize_t regulator_suspend_disk_mode_show(struct device *dev, 848 - struct device_attribute *attr, char *buf) 853 + static ssize_t suspend_disk_mode_show(struct device *dev, 854 + struct device_attribute *attr, char *buf) 849 855 { 850 856 struct regulator_dev *rdev = dev_get_drvdata(dev); 851 857 852 858 return regulator_print_opmode(buf, 853 859 rdev->constraints->state_disk.mode); 854 860 } 855 - static DEVICE_ATTR(suspend_disk_mode, 0444, 856 - regulator_suspend_disk_mode_show, NULL); 861 + static DEVICE_ATTR_RO(suspend_disk_mode); 857 862 858 - static ssize_t regulator_suspend_standby_mode_show(struct device *dev, 859 - struct device_attribute *attr, char *buf) 863 + static ssize_t suspend_standby_mode_show(struct device *dev, 864 + struct device_attribute *attr, char *buf) 860 865 { 861 866 struct regulator_dev *rdev = dev_get_drvdata(dev); 862 867 863 868 return regulator_print_opmode(buf, 864 869 rdev->constraints->state_standby.mode); 865 870 } 866 - static DEVICE_ATTR(suspend_standby_mode, 0444, 867 - regulator_suspend_standby_mode_show, NULL); 871 + static DEVICE_ATTR_RO(suspend_standby_mode); 868 872 869 - static ssize_t regulator_suspend_mem_state_show(struct device *dev, 870 - struct device_attribute *attr, char *buf) 873 + static ssize_t suspend_mem_state_show(struct device *dev, 874 + struct device_attribute *attr, char *buf) 871 875 { 872 876 struct regulator_dev *rdev = dev_get_drvdata(dev); 873 877 874 878 return regulator_print_state(buf, 875 879 rdev->constraints->state_mem.enabled); 876 880 } 877 - static DEVICE_ATTR(suspend_mem_state, 0444, 878 - regulator_suspend_mem_state_show, NULL); 881 + static DEVICE_ATTR_RO(suspend_mem_state); 879 882 880 - static ssize_t regulator_suspend_disk_state_show(struct device *dev, 881 - struct device_attribute *attr, char *buf) 883 + static ssize_t suspend_disk_state_show(struct device *dev, 884 + struct device_attribute *attr, char *buf) 882 885 { 883 886 struct regulator_dev *rdev = dev_get_drvdata(dev); 884 887 885 888 return regulator_print_state(buf, 886 889 rdev->constraints->state_disk.enabled); 887 890 } 888 - static DEVICE_ATTR(suspend_disk_state, 0444, 889 - regulator_suspend_disk_state_show, NULL); 891 + static DEVICE_ATTR_RO(suspend_disk_state); 890 892 891 - static ssize_t regulator_suspend_standby_state_show(struct device *dev, 892 - struct device_attribute *attr, char *buf) 893 + static ssize_t suspend_standby_state_show(struct device *dev, 894 + struct device_attribute *attr, char *buf) 893 895 { 894 896 struct regulator_dev *rdev = dev_get_drvdata(dev); 895 897 896 898 return regulator_print_state(buf, 897 899 rdev->constraints->state_standby.enabled); 898 900 } 899 - static DEVICE_ATTR(suspend_standby_state, 0444, 900 - regulator_suspend_standby_state_show, NULL); 901 + static DEVICE_ATTR_RO(suspend_standby_state); 901 902 902 - static ssize_t regulator_bypass_show(struct device *dev, 903 - struct device_attribute *attr, char *buf) 903 + static ssize_t bypass_show(struct device *dev, 904 + struct device_attribute *attr, char *buf) 904 905 { 905 906 struct regulator_dev *rdev = dev_get_drvdata(dev); 906 907 const char *report; ··· 909 928 910 929 return sprintf(buf, "%s\n", report); 911 930 } 912 - static DEVICE_ATTR(bypass, 0444, 913 - regulator_bypass_show, NULL); 931 + static DEVICE_ATTR_RO(bypass); 914 932 915 933 /* Calculate the new optimum regulator operating mode based on the new total 916 934 * consumer load. All locks held by caller ··· 1295 1315 1296 1316 static int _regulator_do_enable(struct regulator_dev *rdev); 1297 1317 1318 + static int notif_set_limit(struct regulator_dev *rdev, 1319 + int (*set)(struct regulator_dev *, int, int, bool), 1320 + int limit, int severity) 1321 + { 1322 + bool enable; 1323 + 1324 + if (limit == REGULATOR_NOTIF_LIMIT_DISABLE) { 1325 + enable = false; 1326 + limit = 0; 1327 + } else { 1328 + enable = true; 1329 + } 1330 + 1331 + if (limit == REGULATOR_NOTIF_LIMIT_ENABLE) 1332 + limit = 0; 1333 + 1334 + return set(rdev, limit, severity, enable); 1335 + } 1336 + 1337 + static int handle_notify_limits(struct regulator_dev *rdev, 1338 + int (*set)(struct regulator_dev *, int, int, bool), 1339 + struct notification_limit *limits) 1340 + { 1341 + int ret = 0; 1342 + 1343 + if (!set) 1344 + return -EOPNOTSUPP; 1345 + 1346 + if (limits->prot) 1347 + ret = notif_set_limit(rdev, set, limits->prot, 1348 + REGULATOR_SEVERITY_PROT); 1349 + if (ret) 1350 + return ret; 1351 + 1352 + if (limits->err) 1353 + ret = notif_set_limit(rdev, set, limits->err, 1354 + REGULATOR_SEVERITY_ERR); 1355 + if (ret) 1356 + return ret; 1357 + 1358 + if (limits->warn) 1359 + ret = notif_set_limit(rdev, set, limits->warn, 1360 + REGULATOR_SEVERITY_WARN); 1361 + 1362 + return ret; 1363 + } 1298 1364 /** 1299 1365 * set_machine_constraints - sets regulator constraints 1300 1366 * @rdev: regulator source ··· 1426 1400 } 1427 1401 } 1428 1402 1403 + /* 1404 + * Existing logic does not warn if over_current_protection is given as 1405 + * a constraint but driver does not support that. I think we should 1406 + * warn about this type of issues as it is possible someone changes 1407 + * PMIC on board to another type - and the another PMIC's driver does 1408 + * not support setting protection. Board composer may happily believe 1409 + * the DT limits are respected - especially if the new PMIC HW also 1410 + * supports protection but the driver does not. I won't change the logic 1411 + * without hearing more experienced opinion on this though. 1412 + * 1413 + * If warning is seen as a good idea then we can merge handling the 1414 + * over-curret protection and detection and get rid of this special 1415 + * handling. 1416 + */ 1429 1417 if (rdev->constraints->over_current_protection 1430 1418 && ops->set_over_current_protection) { 1431 - ret = ops->set_over_current_protection(rdev); 1419 + int lim = rdev->constraints->over_curr_limits.prot; 1420 + 1421 + ret = ops->set_over_current_protection(rdev, lim, 1422 + REGULATOR_SEVERITY_PROT, 1423 + true); 1432 1424 if (ret < 0) { 1433 1425 rdev_err(rdev, "failed to set over current protection: %pe\n", 1434 1426 ERR_PTR(ret)); 1435 1427 return ret; 1436 1428 } 1429 + } 1430 + 1431 + if (rdev->constraints->over_current_detection) 1432 + ret = handle_notify_limits(rdev, 1433 + ops->set_over_current_protection, 1434 + &rdev->constraints->over_curr_limits); 1435 + if (ret) { 1436 + if (ret != -EOPNOTSUPP) { 1437 + rdev_err(rdev, "failed to set over current limits: %pe\n", 1438 + ERR_PTR(ret)); 1439 + return ret; 1440 + } 1441 + rdev_warn(rdev, 1442 + "IC does not support requested over-current limits\n"); 1443 + } 1444 + 1445 + if (rdev->constraints->over_voltage_detection) 1446 + ret = handle_notify_limits(rdev, 1447 + ops->set_over_voltage_protection, 1448 + &rdev->constraints->over_voltage_limits); 1449 + if (ret) { 1450 + if (ret != -EOPNOTSUPP) { 1451 + rdev_err(rdev, "failed to set over voltage limits %pe\n", 1452 + ERR_PTR(ret)); 1453 + return ret; 1454 + } 1455 + rdev_warn(rdev, 1456 + "IC does not support requested over voltage limits\n"); 1457 + } 1458 + 1459 + if (rdev->constraints->under_voltage_detection) 1460 + ret = handle_notify_limits(rdev, 1461 + ops->set_under_voltage_protection, 1462 + &rdev->constraints->under_voltage_limits); 1463 + if (ret) { 1464 + if (ret != -EOPNOTSUPP) { 1465 + rdev_err(rdev, "failed to set under voltage limits %pe\n", 1466 + ERR_PTR(ret)); 1467 + return ret; 1468 + } 1469 + rdev_warn(rdev, 1470 + "IC does not support requested under voltage limits\n"); 1471 + } 1472 + 1473 + if (rdev->constraints->over_temp_detection) 1474 + ret = handle_notify_limits(rdev, 1475 + ops->set_thermal_protection, 1476 + &rdev->constraints->temp_limits); 1477 + if (ret) { 1478 + if (ret != -EOPNOTSUPP) { 1479 + rdev_err(rdev, "failed to set temperature limits %pe\n", 1480 + ERR_PTR(ret)); 1481 + return ret; 1482 + } 1483 + rdev_warn(rdev, 1484 + "IC does not support requested temperature limits\n"); 1437 1485 } 1438 1486 1439 1487 if (rdev->constraints->active_discharge && ops->set_active_discharge) { ··· 4211 4111 } 4212 4112 EXPORT_SYMBOL_GPL(regulator_set_voltage_time_sel); 4213 4113 4114 + int regulator_sync_voltage_rdev(struct regulator_dev *rdev) 4115 + { 4116 + int ret; 4117 + 4118 + regulator_lock(rdev); 4119 + 4120 + if (!rdev->desc->ops->set_voltage && 4121 + !rdev->desc->ops->set_voltage_sel) { 4122 + ret = -EINVAL; 4123 + goto out; 4124 + } 4125 + 4126 + /* balance only, if regulator is coupled */ 4127 + if (rdev->coupling_desc.n_coupled > 1) 4128 + ret = regulator_balance_voltage(rdev, PM_SUSPEND_ON); 4129 + else 4130 + ret = -EOPNOTSUPP; 4131 + 4132 + out: 4133 + regulator_unlock(rdev); 4134 + return ret; 4135 + } 4136 + 4214 4137 /** 4215 4138 * regulator_sync_voltage - re-apply last regulator output voltage 4216 4139 * @regulator: regulator source ··· 4509 4386 } 4510 4387 EXPORT_SYMBOL_GPL(regulator_get_mode); 4511 4388 4389 + static int rdev_get_cached_err_flags(struct regulator_dev *rdev) 4390 + { 4391 + int ret = 0; 4392 + 4393 + if (rdev->use_cached_err) { 4394 + spin_lock(&rdev->err_lock); 4395 + ret = rdev->cached_err; 4396 + spin_unlock(&rdev->err_lock); 4397 + } 4398 + return ret; 4399 + } 4400 + 4512 4401 static int _regulator_get_error_flags(struct regulator_dev *rdev, 4513 4402 unsigned int *flags) 4514 4403 { 4515 - int ret; 4404 + int cached_flags, ret = 0; 4516 4405 4517 4406 regulator_lock(rdev); 4518 4407 4519 - /* sanity check */ 4520 - if (!rdev->desc->ops->get_error_flags) { 4521 - ret = -EINVAL; 4522 - goto out; 4523 - } 4408 + cached_flags = rdev_get_cached_err_flags(rdev); 4524 4409 4525 - ret = rdev->desc->ops->get_error_flags(rdev, flags); 4526 - out: 4410 + if (rdev->desc->ops->get_error_flags) 4411 + ret = rdev->desc->ops->get_error_flags(rdev, flags); 4412 + else if (!rdev->use_cached_err) 4413 + ret = -EINVAL; 4414 + 4415 + *flags |= cached_flags; 4416 + 4527 4417 regulator_unlock(rdev); 4418 + 4528 4419 return ret; 4529 4420 } 4530 4421 ··· 5371 5234 goto rinse; 5372 5235 } 5373 5236 device_initialize(&rdev->dev); 5237 + spin_lock_init(&rdev->err_lock); 5374 5238 5375 5239 /* 5376 5240 * Duplicate the config so the driver could override it after
+2 -1
drivers/regulator/da9052-regulator.c
··· 250 250 case DA9052_ID_BUCK3: 251 251 case DA9052_ID_LDO2: 252 252 case DA9052_ID_LDO3: 253 - ret = (new_sel - old_sel) * info->step_uV / 6250; 253 + ret = DIV_ROUND_UP(abs(new_sel - old_sel) * info->step_uV, 254 + 6250); 254 255 break; 255 256 } 256 257
+52
drivers/regulator/devres.c
··· 481 481 WARN_ON(rc); 482 482 } 483 483 EXPORT_SYMBOL_GPL(devm_regulator_unregister_notifier); 484 + 485 + static void regulator_irq_helper_drop(void *res) 486 + { 487 + regulator_irq_helper_cancel(&res); 488 + } 489 + 490 + /** 491 + * devm_regulator_irq_helper - resource managed registration of IRQ based 492 + * regulator event/error notifier 493 + * 494 + * @dev: device to which lifetime the helper's lifetime is 495 + * bound. 496 + * @d: IRQ helper descriptor. 497 + * @irq: IRQ used to inform events/errors to be notified. 498 + * @irq_flags: Extra IRQ flags to be OR'ed with the default 499 + * IRQF_ONESHOT when requesting the (threaded) irq. 500 + * @common_errs: Errors which can be flagged by this IRQ for all rdevs. 501 + * When IRQ is re-enabled these errors will be cleared 502 + * from all associated regulators 503 + * @per_rdev_errs: Optional error flag array describing errors specific 504 + * for only some of the regulators. These errors will be 505 + * or'ed with common errors. If this is given the array 506 + * should contain rdev_amount flags. Can be set to NULL 507 + * if there is no regulator specific error flags for this 508 + * IRQ. 509 + * @rdev: Array of pointers to regulators associated with this 510 + * IRQ. 511 + * @rdev_amount: Amount of regulators associated with this IRQ. 512 + * 513 + * Return: handle to irq_helper or an ERR_PTR() encoded error code. 514 + */ 515 + void *devm_regulator_irq_helper(struct device *dev, 516 + const struct regulator_irq_desc *d, int irq, 517 + int irq_flags, int common_errs, 518 + int *per_rdev_errs, 519 + struct regulator_dev **rdev, int rdev_amount) 520 + { 521 + void *ptr; 522 + int ret; 523 + 524 + ptr = regulator_irq_helper(dev, d, irq, irq_flags, common_errs, 525 + per_rdev_errs, rdev, rdev_amount); 526 + if (IS_ERR(ptr)) 527 + return ptr; 528 + 529 + ret = devm_add_action_or_reset(dev, regulator_irq_helper_drop, ptr); 530 + if (ret) 531 + return ERR_PTR(ret); 532 + 533 + return ptr; 534 + } 535 + EXPORT_SYMBOL_GPL(devm_regulator_irq_helper);
+55 -61
drivers/regulator/fan53555.c
··· 56 56 #define FAN53555_NVOLTAGES 64 /* Numbers of voltages */ 57 57 #define FAN53526_NVOLTAGES 128 58 58 59 - #define TCS_VSEL_NSEL_MASK 0x7f 60 59 #define TCS_VSEL0_MODE (1 << 7) 61 60 #define TCS_VSEL1_MODE (1 << 6) 62 61 ··· 66 67 FAN53526_VENDOR_FAIRCHILD = 0, 67 68 FAN53555_VENDOR_FAIRCHILD, 68 69 FAN53555_VENDOR_SILERGY, 69 - FAN53555_VENDOR_TCS, 70 + FAN53526_VENDOR_TCS, 70 71 }; 71 72 72 73 enum { ··· 86 87 FAN53555_CHIP_ID_04, 87 88 FAN53555_CHIP_ID_05, 88 89 FAN53555_CHIP_ID_08 = 8, 90 + }; 91 + 92 + enum { 93 + TCS4525_CHIP_ID_12 = 12, 94 + }; 95 + 96 + enum { 97 + TCS4526_CHIP_ID_00 = 0, 89 98 }; 90 99 91 100 /* IC mask revision */ ··· 130 123 /* Slew rate */ 131 124 unsigned int slew_reg; 132 125 unsigned int slew_mask; 133 - unsigned int slew_shift; 126 + const unsigned int *ramp_delay_table; 127 + unsigned int n_ramp_values; 134 128 unsigned int slew_rate; 135 129 }; 136 130 ··· 205 197 return REGULATOR_MODE_NORMAL; 206 198 } 207 199 208 - static const int slew_rates[] = { 200 + static const unsigned int slew_rates[] = { 209 201 64000, 210 202 32000, 211 203 16000, ··· 216 208 500, 217 209 }; 218 210 219 - static const int tcs_slew_rates[] = { 211 + static const unsigned int tcs_slew_rates[] = { 220 212 18700, 221 213 9300, 222 214 4600, 223 215 2300, 224 216 }; 225 - 226 - static int fan53555_set_ramp(struct regulator_dev *rdev, int ramp) 227 - { 228 - struct fan53555_device_info *di = rdev_get_drvdata(rdev); 229 - int regval = -1, i; 230 - const int *slew_rate_t; 231 - int slew_rate_n; 232 - 233 - switch (di->vendor) { 234 - case FAN53526_VENDOR_FAIRCHILD: 235 - case FAN53555_VENDOR_FAIRCHILD: 236 - case FAN53555_VENDOR_SILERGY: 237 - slew_rate_t = slew_rates; 238 - slew_rate_n = ARRAY_SIZE(slew_rates); 239 - break; 240 - case FAN53555_VENDOR_TCS: 241 - slew_rate_t = tcs_slew_rates; 242 - slew_rate_n = ARRAY_SIZE(tcs_slew_rates); 243 - break; 244 - default: 245 - return -EINVAL; 246 - } 247 - 248 - for (i = 0; i < slew_rate_n; i++) { 249 - if (ramp <= slew_rate_t[i]) 250 - regval = i; 251 - else 252 - break; 253 - } 254 - 255 - if (regval < 0) { 256 - dev_err(di->dev, "unsupported ramp value %d\n", ramp); 257 - return -EINVAL; 258 - } 259 - 260 - return regmap_update_bits(rdev->regmap, di->slew_reg, 261 - di->slew_mask, regval << di->slew_shift); 262 - } 263 217 264 218 static const struct regulator_ops fan53555_regulator_ops = { 265 219 .set_voltage_sel = regulator_set_voltage_sel_regmap, ··· 235 265 .is_enabled = regulator_is_enabled_regmap, 236 266 .set_mode = fan53555_set_mode, 237 267 .get_mode = fan53555_get_mode, 238 - .set_ramp_delay = fan53555_set_ramp, 268 + .set_ramp_delay = regulator_set_ramp_delay_regmap, 239 269 .set_suspend_enable = fan53555_set_suspend_enable, 240 270 .set_suspend_disable = fan53555_set_suspend_disable, 241 271 }; ··· 263 293 return -EINVAL; 264 294 } 265 295 296 + di->slew_reg = FAN53555_CONTROL; 297 + di->slew_mask = CTL_SLEW_MASK; 298 + di->ramp_delay_table = slew_rates; 299 + di->n_ramp_values = ARRAY_SIZE(slew_rates); 266 300 di->vsel_count = FAN53526_NVOLTAGES; 267 301 268 302 return 0; ··· 311 337 } 312 338 di->slew_reg = FAN53555_CONTROL; 313 339 di->slew_mask = CTL_SLEW_MASK; 314 - di->slew_shift = CTL_SLEW_SHIFT; 340 + di->ramp_delay_table = slew_rates; 341 + di->n_ramp_values = ARRAY_SIZE(slew_rates); 315 342 di->vsel_count = FAN53555_NVOLTAGES; 316 343 317 344 return 0; ··· 333 358 return -EINVAL; 334 359 } 335 360 di->slew_reg = FAN53555_CONTROL; 336 - di->slew_reg = FAN53555_CONTROL; 337 361 di->slew_mask = CTL_SLEW_MASK; 338 - di->slew_shift = CTL_SLEW_SHIFT; 362 + di->ramp_delay_table = slew_rates; 363 + di->n_ramp_values = ARRAY_SIZE(slew_rates); 339 364 di->vsel_count = FAN53555_NVOLTAGES; 340 365 341 366 return 0; 342 367 } 343 368 344 - static int fan53555_voltages_setup_tcs(struct fan53555_device_info *di) 369 + static int fan53526_voltages_setup_tcs(struct fan53555_device_info *di) 345 370 { 346 - di->slew_reg = TCS4525_TIME; 347 - di->slew_mask = TCS_SLEW_MASK; 348 - di->slew_shift = TCS_SLEW_MASK; 371 + switch (di->chip_id) { 372 + case TCS4525_CHIP_ID_12: 373 + case TCS4526_CHIP_ID_00: 374 + di->slew_reg = TCS4525_TIME; 375 + di->slew_mask = TCS_SLEW_MASK; 376 + di->ramp_delay_table = tcs_slew_rates; 377 + di->n_ramp_values = ARRAY_SIZE(tcs_slew_rates); 349 378 350 - /* Init voltage range and step */ 351 - di->vsel_min = 600000; 352 - di->vsel_step = 6250; 353 - di->vsel_count = FAN53526_NVOLTAGES; 379 + /* Init voltage range and step */ 380 + di->vsel_min = 600000; 381 + di->vsel_step = 6250; 382 + di->vsel_count = FAN53526_NVOLTAGES; 383 + break; 384 + default: 385 + dev_err(di->dev, "Chip ID %d not supported!\n", di->chip_id); 386 + return -EINVAL; 387 + } 354 388 355 389 return 0; 356 390 } ··· 393 409 return -EINVAL; 394 410 } 395 411 break; 396 - case FAN53555_VENDOR_TCS: 412 + case FAN53526_VENDOR_TCS: 397 413 switch (pdata->sleep_vsel_id) { 398 414 case FAN53555_VSEL_ID_0: 399 415 di->sleep_reg = TCS4525_VSEL0; ··· 432 448 di->mode_reg = di->vol_reg; 433 449 di->mode_mask = VSEL_MODE; 434 450 break; 435 - case FAN53555_VENDOR_TCS: 451 + case FAN53526_VENDOR_TCS: 436 452 di->mode_reg = TCS4525_COMMAND; 437 453 438 454 switch (pdata->sleep_vsel_id) { ··· 460 476 case FAN53555_VENDOR_SILERGY: 461 477 ret = fan53555_voltages_setup_silergy(di); 462 478 break; 463 - case FAN53555_VENDOR_TCS: 464 - ret = fan53555_voltages_setup_tcs(di); 479 + case FAN53526_VENDOR_TCS: 480 + ret = fan53526_voltages_setup_tcs(di); 465 481 break; 466 482 default: 467 483 dev_err(di->dev, "vendor %d not supported!\n", di->vendor); ··· 488 504 rdesc->uV_step = di->vsel_step; 489 505 rdesc->vsel_reg = di->vol_reg; 490 506 rdesc->vsel_mask = di->vsel_count - 1; 507 + rdesc->ramp_reg = di->slew_reg; 508 + rdesc->ramp_mask = di->slew_mask; 509 + rdesc->ramp_delay_table = di->ramp_delay_table; 510 + rdesc->n_ramp_values = di->n_ramp_values; 491 511 rdesc->owner = THIS_MODULE; 492 512 493 513 rdev = devm_regulator_register(di->dev, &di->desc, config); ··· 540 552 .data = (void *)FAN53555_VENDOR_SILERGY, 541 553 }, { 542 554 .compatible = "tcs,tcs4525", 543 - .data = (void *)FAN53555_VENDOR_TCS 555 + .data = (void *)FAN53526_VENDOR_TCS 556 + }, { 557 + .compatible = "tcs,tcs4526", 558 + .data = (void *)FAN53526_VENDOR_TCS 544 559 }, 545 560 { } 546 561 }; ··· 651 660 .driver_data = FAN53555_VENDOR_SILERGY 652 661 }, { 653 662 .name = "tcs4525", 654 - .driver_data = FAN53555_VENDOR_TCS 663 + .driver_data = FAN53526_VENDOR_TCS 664 + }, { 665 + .name = "tcs4526", 666 + .driver_data = FAN53526_VENDOR_TCS 655 667 }, 656 668 { }, 657 669 };
+3 -4
drivers/regulator/fan53880.c
··· 79 79 .n_linear_ranges = 2, 80 80 .n_voltages = 0xf8, 81 81 .vsel_reg = FAN53880_BUCKVOUT, 82 - .vsel_mask = 0x7f, 82 + .vsel_mask = 0xff, 83 83 .enable_reg = FAN53880_ENABLE, 84 84 .enable_mask = 0x10, 85 85 .enable_time = 480, ··· 114 114 .max_register = FAN53880_ENABLE_BOOST, 115 115 }; 116 116 117 - static int fan53880_i2c_probe(struct i2c_client *i2c, 118 - const struct i2c_device_id *id) 117 + static int fan53880_i2c_probe(struct i2c_client *i2c) 119 118 { 120 119 struct regulator_config config = { }; 121 120 struct regulator_dev *rdev; ··· 176 177 .name = "fan53880", 177 178 .of_match_table = of_match_ptr(fan53880_dt_ids), 178 179 }, 179 - .probe = fan53880_i2c_probe, 180 + .probe_new = fan53880_i2c_probe, 180 181 .id_table = fan53880_i2c_id, 181 182 }; 182 183 module_i2c_driver(fan53880_regulator_driver);
+2 -1
drivers/regulator/fixed.c
··· 276 276 */ 277 277 cfg.ena_gpiod = gpiod_get_optional(&pdev->dev, NULL, gflags); 278 278 if (IS_ERR(cfg.ena_gpiod)) 279 - return PTR_ERR(cfg.ena_gpiod); 279 + return dev_err_probe(&pdev->dev, PTR_ERR(cfg.ena_gpiod), 280 + "can't get GPIO\n"); 280 281 281 282 cfg.dev = &pdev->dev; 282 283 cfg.init_data = config->init_data;
+4 -4
drivers/regulator/hi6421-regulator.c
··· 386 386 static unsigned int hi6421_regulator_ldo_get_mode(struct regulator_dev *rdev) 387 387 { 388 388 struct hi6421_regulator_info *info = rdev_get_drvdata(rdev); 389 - u32 reg_val; 389 + unsigned int reg_val; 390 390 391 391 regmap_read(rdev->regmap, rdev->desc->enable_reg, &reg_val); 392 392 if (reg_val & info->mode_mask) ··· 398 398 static unsigned int hi6421_regulator_buck_get_mode(struct regulator_dev *rdev) 399 399 { 400 400 struct hi6421_regulator_info *info = rdev_get_drvdata(rdev); 401 - u32 reg_val; 401 + unsigned int reg_val; 402 402 403 403 regmap_read(rdev->regmap, rdev->desc->enable_reg, &reg_val); 404 404 if (reg_val & info->mode_mask) ··· 411 411 unsigned int mode) 412 412 { 413 413 struct hi6421_regulator_info *info = rdev_get_drvdata(rdev); 414 - u32 new_mode; 414 + unsigned int new_mode; 415 415 416 416 switch (mode) { 417 417 case REGULATOR_MODE_NORMAL: ··· 435 435 unsigned int mode) 436 436 { 437 437 struct hi6421_regulator_info *info = rdev_get_drvdata(rdev); 438 - u32 new_mode; 438 + unsigned int new_mode; 439 439 440 440 switch (mode) { 441 441 case REGULATOR_MODE_NORMAL:
+28 -35
drivers/regulator/hi6421v600-regulator.c
··· 16 16 #include <linux/regulator/driver.h> 17 17 #include <linux/spmi.h> 18 18 19 - struct hi6421_spmi_reg_info { 20 - struct regulator_desc desc; 21 - struct hi6421_spmi_pmic *pmic; 22 - u8 eco_mode_mask; 23 - u32 eco_uA; 24 - 19 + struct hi6421_spmi_reg_priv { 25 20 /* Serialize regulator enable logic */ 26 21 struct mutex enable_mutex; 22 + }; 23 + 24 + struct hi6421_spmi_reg_info { 25 + struct regulator_desc desc; 26 + u8 eco_mode_mask; 27 + u32 eco_uA; 27 28 }; 28 29 29 30 static const unsigned int ldo3_voltages[] = { ··· 98 97 99 98 static int hi6421_spmi_regulator_enable(struct regulator_dev *rdev) 100 99 { 101 - struct hi6421_spmi_reg_info *sreg = rdev_get_drvdata(rdev); 102 - struct hi6421_spmi_pmic *pmic = sreg->pmic; 100 + struct hi6421_spmi_reg_priv *priv; 103 101 int ret; 104 102 103 + priv = dev_get_drvdata(rdev->dev.parent); 105 104 /* cannot enable more than one regulator at one time */ 106 - mutex_lock(&sreg->enable_mutex); 105 + mutex_lock(&priv->enable_mutex); 107 106 108 - ret = regmap_update_bits(pmic->regmap, rdev->desc->enable_reg, 107 + ret = regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 109 108 rdev->desc->enable_mask, 110 109 rdev->desc->enable_mask); 111 110 112 111 /* Avoid powering up multiple devices at the same time */ 113 112 usleep_range(rdev->desc->off_on_delay, rdev->desc->off_on_delay + 60); 114 113 115 - mutex_unlock(&sreg->enable_mutex); 114 + mutex_unlock(&priv->enable_mutex); 116 115 117 116 return ret; 118 - } 119 - 120 - static int hi6421_spmi_regulator_disable(struct regulator_dev *rdev) 121 - { 122 - struct hi6421_spmi_reg_info *sreg = rdev_get_drvdata(rdev); 123 - struct hi6421_spmi_pmic *pmic = sreg->pmic; 124 - 125 - return regmap_update_bits(pmic->regmap, rdev->desc->enable_reg, 126 - rdev->desc->enable_mask, 0); 127 117 } 128 118 129 119 static unsigned int hi6421_spmi_regulator_get_mode(struct regulator_dev *rdev) 130 120 { 131 121 struct hi6421_spmi_reg_info *sreg = rdev_get_drvdata(rdev); 132 - struct hi6421_spmi_pmic *pmic = sreg->pmic; 133 - u32 reg_val; 122 + unsigned int reg_val; 134 123 135 - regmap_read(pmic->regmap, rdev->desc->enable_reg, &reg_val); 124 + regmap_read(rdev->regmap, rdev->desc->enable_reg, &reg_val); 136 125 137 126 if (reg_val & sreg->eco_mode_mask) 138 127 return REGULATOR_MODE_IDLE; ··· 134 143 unsigned int mode) 135 144 { 136 145 struct hi6421_spmi_reg_info *sreg = rdev_get_drvdata(rdev); 137 - struct hi6421_spmi_pmic *pmic = sreg->pmic; 138 - u32 val; 146 + unsigned int val; 139 147 140 148 switch (mode) { 141 149 case REGULATOR_MODE_NORMAL: 142 150 val = 0; 143 151 break; 144 152 case REGULATOR_MODE_IDLE: 145 - val = sreg->eco_mode_mask << (ffs(sreg->eco_mode_mask) - 1); 153 + if (!sreg->eco_mode_mask) 154 + return -EINVAL; 155 + 156 + val = sreg->eco_mode_mask; 146 157 break; 147 158 default: 148 159 return -EINVAL; 149 160 } 150 161 151 - return regmap_update_bits(pmic->regmap, rdev->desc->enable_reg, 162 + return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 152 163 sreg->eco_mode_mask, val); 153 164 } 154 165 ··· 170 177 static const struct regulator_ops hi6421_spmi_ldo_rops = { 171 178 .is_enabled = regulator_is_enabled_regmap, 172 179 .enable = hi6421_spmi_regulator_enable, 173 - .disable = hi6421_spmi_regulator_disable, 180 + .disable = regulator_disable_regmap, 174 181 .list_voltage = regulator_list_voltage_table, 175 - .map_voltage = regulator_map_voltage_iterate, 182 + .map_voltage = regulator_map_voltage_ascend, 176 183 .get_voltage_sel = regulator_get_voltage_sel_regmap, 177 184 .set_voltage_sel = regulator_set_voltage_sel_regmap, 178 185 .get_mode = hi6421_spmi_regulator_get_mode, ··· 231 238 { 232 239 struct device *pmic_dev = pdev->dev.parent; 233 240 struct regulator_config config = { }; 234 - struct hi6421_spmi_reg_info *sreg; 241 + struct hi6421_spmi_reg_priv *priv; 235 242 struct hi6421_spmi_reg_info *info; 236 243 struct device *dev = &pdev->dev; 237 244 struct hi6421_spmi_pmic *pmic; ··· 247 254 if (WARN_ON(!pmic)) 248 255 return -ENODEV; 249 256 250 - sreg = devm_kzalloc(dev, sizeof(*sreg), GFP_KERNEL); 251 - if (!sreg) 257 + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); 258 + if (!priv) 252 259 return -ENOMEM; 253 260 254 - sreg->pmic = pmic; 255 - mutex_init(&sreg->enable_mutex); 261 + mutex_init(&priv->enable_mutex); 262 + platform_set_drvdata(pdev, priv); 256 263 257 264 for (i = 0; i < ARRAY_SIZE(regulator_info); i++) { 258 265 info = &regulator_info[i]; 259 266 260 267 config.dev = pdev->dev.parent; 261 - config.driver_data = sreg; 268 + config.driver_data = info; 262 269 config.regmap = pmic->regmap; 263 270 264 271 rdev = devm_regulator_register(dev, &info->desc, &config);
+11
drivers/regulator/internal.h
··· 15 15 16 16 #define REGULATOR_STATES_NUM (PM_SUSPEND_MAX + 1) 17 17 18 + #define rdev_crit(rdev, fmt, ...) \ 19 + pr_crit("%s: " fmt, rdev_get_name(rdev), ##__VA_ARGS__) 20 + #define rdev_err(rdev, fmt, ...) \ 21 + pr_err("%s: " fmt, rdev_get_name(rdev), ##__VA_ARGS__) 22 + #define rdev_warn(rdev, fmt, ...) \ 23 + pr_warn("%s: " fmt, rdev_get_name(rdev), ##__VA_ARGS__) 24 + #define rdev_info(rdev, fmt, ...) \ 25 + pr_info("%s: " fmt, rdev_get_name(rdev), ##__VA_ARGS__) 26 + #define rdev_dbg(rdev, fmt, ...) \ 27 + pr_debug("%s: " fmt, rdev_get_name(rdev), ##__VA_ARGS__) 28 + 18 29 struct regulator_voltage { 19 30 int min_uV; 20 31 int max_uV;
+397
drivers/regulator/irq_helpers.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + // 3 + // Copyright (C) 2021 ROHM Semiconductors 4 + // regulator IRQ based event notification helpers 5 + // 6 + // Logic has been partially adapted from qcom-labibb driver. 7 + // 8 + // Author: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com> 9 + 10 + #include <linux/device.h> 11 + #include <linux/err.h> 12 + #include <linux/interrupt.h> 13 + #include <linux/kernel.h> 14 + #include <linux/reboot.h> 15 + #include <linux/regmap.h> 16 + #include <linux/slab.h> 17 + #include <linux/spinlock.h> 18 + #include <linux/regulator/driver.h> 19 + 20 + #include "internal.h" 21 + 22 + #define REGULATOR_FORCED_SAFETY_SHUTDOWN_WAIT_MS 10000 23 + 24 + struct regulator_irq { 25 + struct regulator_irq_data rdata; 26 + struct regulator_irq_desc desc; 27 + int irq; 28 + int retry_cnt; 29 + struct delayed_work isr_work; 30 + }; 31 + 32 + /* 33 + * Should only be called from threaded handler to prevent potential deadlock 34 + */ 35 + static void rdev_flag_err(struct regulator_dev *rdev, int err) 36 + { 37 + spin_lock(&rdev->err_lock); 38 + rdev->cached_err |= err; 39 + spin_unlock(&rdev->err_lock); 40 + } 41 + 42 + static void rdev_clear_err(struct regulator_dev *rdev, int err) 43 + { 44 + spin_lock(&rdev->err_lock); 45 + rdev->cached_err &= ~err; 46 + spin_unlock(&rdev->err_lock); 47 + } 48 + 49 + static void regulator_notifier_isr_work(struct work_struct *work) 50 + { 51 + struct regulator_irq *h; 52 + struct regulator_irq_desc *d; 53 + struct regulator_irq_data *rid; 54 + int ret = 0; 55 + int tmo, i; 56 + int num_rdevs; 57 + 58 + h = container_of(work, struct regulator_irq, 59 + isr_work.work); 60 + d = &h->desc; 61 + rid = &h->rdata; 62 + num_rdevs = rid->num_states; 63 + 64 + reread: 65 + if (d->fatal_cnt && h->retry_cnt > d->fatal_cnt) { 66 + if (!d->die) 67 + return hw_protection_shutdown("Regulator HW failure? - no IC recovery", 68 + REGULATOR_FORCED_SAFETY_SHUTDOWN_WAIT_MS); 69 + ret = d->die(rid); 70 + /* 71 + * If the 'last resort' IC recovery failed we will have 72 + * nothing else left to do... 73 + */ 74 + if (ret) 75 + return hw_protection_shutdown("Regulator HW failure. IC recovery failed", 76 + REGULATOR_FORCED_SAFETY_SHUTDOWN_WAIT_MS); 77 + 78 + /* 79 + * If h->die() was implemented we assume recovery has been 80 + * attempted (probably regulator was shut down) and we 81 + * just enable IRQ and bail-out. 82 + */ 83 + goto enable_out; 84 + } 85 + if (d->renable) { 86 + ret = d->renable(rid); 87 + 88 + if (ret == REGULATOR_FAILED_RETRY) { 89 + /* Driver could not get current status */ 90 + h->retry_cnt++; 91 + if (!d->reread_ms) 92 + goto reread; 93 + 94 + tmo = d->reread_ms; 95 + goto reschedule; 96 + } 97 + 98 + if (ret) { 99 + /* 100 + * IC status reading succeeded. update error info 101 + * just in case the renable changed it. 102 + */ 103 + for (i = 0; i < num_rdevs; i++) { 104 + struct regulator_err_state *stat; 105 + struct regulator_dev *rdev; 106 + 107 + stat = &rid->states[i]; 108 + rdev = stat->rdev; 109 + rdev_clear_err(rdev, (~stat->errors) & 110 + stat->possible_errs); 111 + } 112 + h->retry_cnt++; 113 + /* 114 + * The IC indicated problem is still ON - no point in 115 + * re-enabling the IRQ. Retry later. 116 + */ 117 + tmo = d->irq_off_ms; 118 + goto reschedule; 119 + } 120 + } 121 + 122 + /* 123 + * Either IC reported problem cleared or no status checker was provided. 124 + * If problems are gone - good. If not - then the IRQ will fire again 125 + * and we'll have a new nice loop. In any case we should clear error 126 + * flags here and re-enable IRQs. 127 + */ 128 + for (i = 0; i < num_rdevs; i++) { 129 + struct regulator_err_state *stat; 130 + struct regulator_dev *rdev; 131 + 132 + stat = &rid->states[i]; 133 + rdev = stat->rdev; 134 + rdev_clear_err(rdev, stat->possible_errs); 135 + } 136 + 137 + /* 138 + * Things have been seemingly successful => zero retry-counter. 139 + */ 140 + h->retry_cnt = 0; 141 + 142 + enable_out: 143 + enable_irq(h->irq); 144 + 145 + return; 146 + 147 + reschedule: 148 + if (!d->high_prio) 149 + mod_delayed_work(system_wq, &h->isr_work, 150 + msecs_to_jiffies(tmo)); 151 + else 152 + mod_delayed_work(system_highpri_wq, &h->isr_work, 153 + msecs_to_jiffies(tmo)); 154 + } 155 + 156 + static irqreturn_t regulator_notifier_isr(int irq, void *data) 157 + { 158 + struct regulator_irq *h = data; 159 + struct regulator_irq_desc *d; 160 + struct regulator_irq_data *rid; 161 + unsigned long rdev_map = 0; 162 + int num_rdevs; 163 + int ret, i; 164 + 165 + d = &h->desc; 166 + rid = &h->rdata; 167 + num_rdevs = rid->num_states; 168 + 169 + if (d->fatal_cnt) 170 + h->retry_cnt++; 171 + 172 + /* 173 + * we spare a few cycles by not clearing statuses prior to this call. 174 + * The IC driver must initialize the status buffers for rdevs 175 + * which it indicates having active events via rdev_map. 176 + * 177 + * Maybe we should just to be on a safer side(?) 178 + */ 179 + ret = d->map_event(irq, rid, &rdev_map); 180 + 181 + /* 182 + * If status reading fails (which is unlikely) we don't ack/disable 183 + * IRQ but just increase fail count and retry when IRQ fires again. 184 + * If retry_count exceeds the given safety limit we call IC specific die 185 + * handler which can try disabling regulator(s). 186 + * 187 + * If no die handler is given we will just bug() as a last resort. 188 + * 189 + * We could try disabling all associated rdevs - but we might shoot 190 + * ourselves in the head and leave the problematic regulator enabled. So 191 + * if IC has no die-handler populated we just assume the regulator 192 + * can't be disabled. 193 + */ 194 + if (unlikely(ret == REGULATOR_FAILED_RETRY)) 195 + goto fail_out; 196 + 197 + h->retry_cnt = 0; 198 + /* 199 + * Let's not disable IRQ if there were no status bits for us. We'd 200 + * better leave spurious IRQ handling to genirq 201 + */ 202 + if (ret || !rdev_map) 203 + return IRQ_NONE; 204 + 205 + /* 206 + * Some events are bogus if the regulator is disabled. Skip such events 207 + * if all relevant regulators are disabled 208 + */ 209 + if (d->skip_off) { 210 + for_each_set_bit(i, &rdev_map, num_rdevs) { 211 + struct regulator_dev *rdev; 212 + const struct regulator_ops *ops; 213 + 214 + rdev = rid->states[i].rdev; 215 + ops = rdev->desc->ops; 216 + 217 + /* 218 + * If any of the flagged regulators is enabled we do 219 + * handle this 220 + */ 221 + if (ops->is_enabled(rdev)) 222 + break; 223 + } 224 + if (i == num_rdevs) 225 + return IRQ_NONE; 226 + } 227 + 228 + /* Disable IRQ if HW keeps line asserted */ 229 + if (d->irq_off_ms) 230 + disable_irq_nosync(irq); 231 + 232 + /* 233 + * IRQ seems to be for us. Let's fire correct notifiers / store error 234 + * flags 235 + */ 236 + for_each_set_bit(i, &rdev_map, num_rdevs) { 237 + struct regulator_err_state *stat; 238 + struct regulator_dev *rdev; 239 + 240 + stat = &rid->states[i]; 241 + rdev = stat->rdev; 242 + 243 + rdev_dbg(rdev, "Sending regulator notification EVT 0x%lx\n", 244 + stat->notifs); 245 + 246 + regulator_notifier_call_chain(rdev, stat->notifs, NULL); 247 + rdev_flag_err(rdev, stat->errors); 248 + } 249 + 250 + if (d->irq_off_ms) { 251 + if (!d->high_prio) 252 + schedule_delayed_work(&h->isr_work, 253 + msecs_to_jiffies(d->irq_off_ms)); 254 + else 255 + mod_delayed_work(system_highpri_wq, 256 + &h->isr_work, 257 + msecs_to_jiffies(d->irq_off_ms)); 258 + } 259 + 260 + return IRQ_HANDLED; 261 + 262 + fail_out: 263 + if (d->fatal_cnt && h->retry_cnt > d->fatal_cnt) { 264 + /* If we have no recovery, just try shut down straight away */ 265 + if (!d->die) { 266 + hw_protection_shutdown("Regulator failure. Retry count exceeded", 267 + REGULATOR_FORCED_SAFETY_SHUTDOWN_WAIT_MS); 268 + } else { 269 + ret = d->die(rid); 270 + /* If die() failed shut down as a last attempt to save the HW */ 271 + if (ret) 272 + hw_protection_shutdown("Regulator failure. Recovery failed", 273 + REGULATOR_FORCED_SAFETY_SHUTDOWN_WAIT_MS); 274 + } 275 + } 276 + 277 + return IRQ_NONE; 278 + } 279 + 280 + static int init_rdev_state(struct device *dev, struct regulator_irq *h, 281 + struct regulator_dev **rdev, int common_err, 282 + int *rdev_err, int rdev_amount) 283 + { 284 + int i; 285 + 286 + h->rdata.states = devm_kzalloc(dev, sizeof(*h->rdata.states) * 287 + rdev_amount, GFP_KERNEL); 288 + if (!h->rdata.states) 289 + return -ENOMEM; 290 + 291 + h->rdata.num_states = rdev_amount; 292 + h->rdata.data = h->desc.data; 293 + 294 + for (i = 0; i < rdev_amount; i++) { 295 + h->rdata.states[i].possible_errs = common_err; 296 + if (rdev_err) 297 + h->rdata.states[i].possible_errs |= *rdev_err++; 298 + h->rdata.states[i].rdev = *rdev++; 299 + } 300 + 301 + return 0; 302 + } 303 + 304 + static void init_rdev_errors(struct regulator_irq *h) 305 + { 306 + int i; 307 + 308 + for (i = 0; i < h->rdata.num_states; i++) 309 + if (h->rdata.states[i].possible_errs) 310 + h->rdata.states[i].rdev->use_cached_err = true; 311 + } 312 + 313 + /** 314 + * regulator_irq_helper - register IRQ based regulator event/error notifier 315 + * 316 + * @dev: device providing the IRQs 317 + * @d: IRQ helper descriptor. 318 + * @irq: IRQ used to inform events/errors to be notified. 319 + * @irq_flags: Extra IRQ flags to be OR'ed with the default 320 + * IRQF_ONESHOT when requesting the (threaded) irq. 321 + * @common_errs: Errors which can be flagged by this IRQ for all rdevs. 322 + * When IRQ is re-enabled these errors will be cleared 323 + * from all associated regulators 324 + * @per_rdev_errs: Optional error flag array describing errors specific 325 + * for only some of the regulators. These errors will be 326 + * or'ed with common errors. If this is given the array 327 + * should contain rdev_amount flags. Can be set to NULL 328 + * if there is no regulator specific error flags for this 329 + * IRQ. 330 + * @rdev: Array of pointers to regulators associated with this 331 + * IRQ. 332 + * @rdev_amount: Amount of regulators associated with this IRQ. 333 + * 334 + * Return: handle to irq_helper or an ERR_PTR() encoded error code. 335 + */ 336 + void *regulator_irq_helper(struct device *dev, 337 + const struct regulator_irq_desc *d, int irq, 338 + int irq_flags, int common_errs, int *per_rdev_errs, 339 + struct regulator_dev **rdev, int rdev_amount) 340 + { 341 + struct regulator_irq *h; 342 + int ret; 343 + 344 + if (!rdev_amount || !d || !d->map_event || !d->name) 345 + return ERR_PTR(-EINVAL); 346 + 347 + h = devm_kzalloc(dev, sizeof(*h), GFP_KERNEL); 348 + if (!h) 349 + return ERR_PTR(-ENOMEM); 350 + 351 + h->irq = irq; 352 + h->desc = *d; 353 + 354 + ret = init_rdev_state(dev, h, rdev, common_errs, per_rdev_errs, 355 + rdev_amount); 356 + if (ret) 357 + return ERR_PTR(ret); 358 + 359 + init_rdev_errors(h); 360 + 361 + if (h->desc.irq_off_ms) 362 + INIT_DELAYED_WORK(&h->isr_work, regulator_notifier_isr_work); 363 + 364 + ret = request_threaded_irq(h->irq, NULL, regulator_notifier_isr, 365 + IRQF_ONESHOT | irq_flags, h->desc.name, h); 366 + if (ret) { 367 + dev_err(dev, "Failed to request IRQ %d\n", irq); 368 + 369 + return ERR_PTR(ret); 370 + } 371 + 372 + return h; 373 + } 374 + EXPORT_SYMBOL_GPL(regulator_irq_helper); 375 + 376 + /** 377 + * regulator_irq_helper_cancel - drop IRQ based regulator event/error notifier 378 + * 379 + * @handle: Pointer to handle returned by a successful call to 380 + * regulator_irq_helper(). Will be NULLed upon return. 381 + * 382 + * The associated IRQ is released and work is cancelled when the function 383 + * returns. 384 + */ 385 + void regulator_irq_helper_cancel(void **handle) 386 + { 387 + if (handle && *handle) { 388 + struct regulator_irq *h = *handle; 389 + 390 + free_irq(h->irq, h); 391 + if (h->desc.irq_off_ms) 392 + cancel_delayed_work_sync(&h->isr_work); 393 + 394 + h = NULL; 395 + } 396 + } 397 + EXPORT_SYMBOL_GPL(regulator_irq_helper_cancel);
+8 -47
drivers/regulator/lp8755.c
··· 136 136 return 0; 137 137 } 138 138 139 - static int lp8755_buck_set_ramp(struct regulator_dev *rdev, int ramp) 140 - { 141 - int ret; 142 - unsigned int regval = 0x00; 143 - enum lp8755_bucks id = rdev_get_id(rdev); 144 - 145 - /* uV/us */ 146 - switch (ramp) { 147 - case 0 ... 230: 148 - regval = 0x07; 149 - break; 150 - case 231 ... 470: 151 - regval = 0x06; 152 - break; 153 - case 471 ... 940: 154 - regval = 0x05; 155 - break; 156 - case 941 ... 1900: 157 - regval = 0x04; 158 - break; 159 - case 1901 ... 3800: 160 - regval = 0x03; 161 - break; 162 - case 3801 ... 7500: 163 - regval = 0x02; 164 - break; 165 - case 7501 ... 15000: 166 - regval = 0x01; 167 - break; 168 - case 15001 ... 30000: 169 - regval = 0x00; 170 - break; 171 - default: 172 - dev_err(&rdev->dev, 173 - "Not supported ramp value %d %s\n", ramp, __func__); 174 - return -EINVAL; 175 - } 176 - 177 - ret = regmap_update_bits(rdev->regmap, 0x07 + id, 0x07, regval); 178 - if (ret < 0) 179 - goto err_i2c; 180 - return ret; 181 - err_i2c: 182 - dev_err(&rdev->dev, "i2c access error %s\n", __func__); 183 - return ret; 184 - } 139 + static const unsigned int lp8755_buck_ramp_table[] = { 140 + 30000, 15000, 7500, 3800, 1900, 940, 470, 230 141 + }; 185 142 186 143 static const struct regulator_ops lp8755_buck_ops = { 187 144 .map_voltage = regulator_map_voltage_linear, ··· 151 194 .enable_time = lp8755_buck_enable_time, 152 195 .set_mode = lp8755_buck_set_mode, 153 196 .get_mode = lp8755_buck_get_mode, 154 - .set_ramp_delay = lp8755_buck_set_ramp, 197 + .set_ramp_delay = regulator_set_ramp_delay_regmap, 155 198 }; 156 199 157 200 #define lp8755_rail(_id) "lp8755_buck"#_id ··· 226 269 .enable_mask = LP8755_BUCK_EN_M,\ 227 270 .vsel_reg = LP8755_REG_BUCK##_id,\ 228 271 .vsel_mask = LP8755_BUCK_VOUT_M,\ 272 + .ramp_reg = (LP8755_BUCK##_id) + 0x7,\ 273 + .ramp_mask = 0x7,\ 274 + .ramp_delay_table = lp8755_buck_ramp_table,\ 275 + .n_ramp_values = ARRAY_SIZE(lp8755_buck_ramp_table),\ 229 276 } 230 277 231 278 static const struct regulator_desc lp8755_regulators[] = {
+38 -35
drivers/regulator/ltc3589.c
··· 54 54 #define LTC3589_VCCR_SW3_GO BIT(4) 55 55 #define LTC3589_VCCR_LDO2_GO BIT(6) 56 56 57 + #define LTC3589_VRRCR_SW1_RAMP_MASK GENMASK(1, 0) 58 + #define LTC3589_VRRCR_SW2_RAMP_MASK GENMASK(3, 2) 59 + #define LTC3589_VRRCR_SW3_RAMP_MASK GENMASK(5, 4) 60 + #define LTC3589_VRRCR_LDO2_RAMP_MASK GENMASK(7, 6) 61 + 57 62 enum ltc3589_variant { 58 63 LTC3589, 59 64 LTC3589_1, ··· 93 88 1200000, 1800000, 2500000, 3200000, 94 89 }; 95 90 96 - static int ltc3589_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay) 97 - { 98 - struct ltc3589 *ltc3589 = rdev_get_drvdata(rdev); 99 - int sel, shift; 100 - 101 - if (unlikely(ramp_delay <= 0)) 102 - return -EINVAL; 103 - 104 - /* VRRCR slew rate offsets are the same as VCCR go bit offsets */ 105 - shift = ffs(rdev->desc->apply_bit) - 1; 106 - 107 - /* The slew rate can be set to 0.88, 1.75, 3.5, or 7 mV/uS */ 108 - for (sel = 0; sel < 4; sel++) { 109 - if ((880 << sel) >= ramp_delay) { 110 - return regmap_update_bits(ltc3589->regmap, 111 - LTC3589_VRRCR, 112 - 0x3 << shift, sel << shift); 113 - } 114 - } 115 - return -EINVAL; 116 - } 91 + static const unsigned int ltc3589_ramp_table[] = { 92 + 880, 1750, 3500, 7000 93 + }; 117 94 118 95 static int ltc3589_set_suspend_voltage(struct regulator_dev *rdev, int uV) 119 96 { ··· 136 149 .list_voltage = regulator_list_voltage_linear, 137 150 .set_voltage_sel = regulator_set_voltage_sel_regmap, 138 151 .get_voltage_sel = regulator_get_voltage_sel_regmap, 139 - .set_ramp_delay = ltc3589_set_ramp_delay, 152 + .set_ramp_delay = regulator_set_ramp_delay_regmap, 140 153 .set_voltage_time_sel = regulator_set_voltage_time_sel, 141 154 .set_suspend_voltage = ltc3589_set_suspend_voltage, 142 155 .set_suspend_mode = ltc3589_set_suspend_mode, ··· 205 218 return 0; 206 219 } 207 220 208 - #define LTC3589_REG(_name, _of_name, _ops, en_bit, dtv1_reg, dtv_mask, go_bit)\ 221 + #define LTC3589_REG(_name, _of_name, _ops, en_bit, dtv1_reg, dtv_mask) \ 209 222 [LTC3589_ ## _name] = { \ 210 223 .name = #_name, \ 211 224 .of_match = of_match_ptr(#_of_name), \ 212 225 .regulators_node = of_match_ptr("regulators"), \ 213 226 .of_parse_cb = ltc3589_of_parse_cb, \ 214 227 .n_voltages = (dtv_mask) + 1, \ 215 - .min_uV = (go_bit) ? 362500 : 0, \ 216 - .uV_step = (go_bit) ? 12500 : 0, \ 217 - .ramp_delay = (go_bit) ? 1750 : 0, \ 218 228 .fixed_uV = (dtv_mask) ? 0 : 800000, \ 219 229 .ops = &ltc3589_ ## _ops ## _regulator_ops, \ 220 230 .type = REGULATOR_VOLTAGE, \ ··· 219 235 .owner = THIS_MODULE, \ 220 236 .vsel_reg = (dtv1_reg), \ 221 237 .vsel_mask = (dtv_mask), \ 222 - .apply_reg = (go_bit) ? LTC3589_VCCR : 0, \ 223 - .apply_bit = (go_bit), \ 224 238 .enable_reg = (en_bit) ? LTC3589_OVEN : 0, \ 225 239 .enable_mask = (en_bit), \ 226 240 } 227 241 228 242 #define LTC3589_LINEAR_REG(_name, _of_name, _dtv1) \ 229 - LTC3589_REG(_name, _of_name, linear, LTC3589_OVEN_ ## _name, \ 230 - LTC3589_ ## _dtv1, 0x1f, \ 231 - LTC3589_VCCR_ ## _name ## _GO) 243 + [LTC3589_ ## _name] = { \ 244 + .name = #_name, \ 245 + .of_match = of_match_ptr(#_of_name), \ 246 + .regulators_node = of_match_ptr("regulators"), \ 247 + .of_parse_cb = ltc3589_of_parse_cb, \ 248 + .n_voltages = 32, \ 249 + .min_uV = 362500, \ 250 + .uV_step = 12500, \ 251 + .ramp_delay = 1750, \ 252 + .ops = &ltc3589_linear_regulator_ops, \ 253 + .type = REGULATOR_VOLTAGE, \ 254 + .id = LTC3589_ ## _name, \ 255 + .owner = THIS_MODULE, \ 256 + .vsel_reg = LTC3589_ ## _dtv1, \ 257 + .vsel_mask = 0x1f, \ 258 + .apply_reg = LTC3589_VCCR, \ 259 + .apply_bit = LTC3589_VCCR_ ## _name ## _GO, \ 260 + .enable_reg = LTC3589_OVEN, \ 261 + .enable_mask = (LTC3589_OVEN_ ## _name), \ 262 + .ramp_reg = LTC3589_VRRCR, \ 263 + .ramp_mask = LTC3589_VRRCR_ ## _name ## _RAMP_MASK, \ 264 + .ramp_delay_table = ltc3589_ramp_table, \ 265 + .n_ramp_values = ARRAY_SIZE(ltc3589_ramp_table), \ 266 + } 267 + 232 268 233 269 #define LTC3589_FIXED_REG(_name, _of_name) \ 234 - LTC3589_REG(_name, _of_name, fixed, LTC3589_OVEN_ ## _name, 0, 0, 0) 270 + LTC3589_REG(_name, _of_name, fixed, LTC3589_OVEN_ ## _name, 0, 0) 235 271 236 272 static const struct regulator_desc ltc3589_regulators[] = { 237 273 LTC3589_LINEAR_REG(SW1, sw1, B1DTV1), 238 274 LTC3589_LINEAR_REG(SW2, sw2, B2DTV1), 239 275 LTC3589_LINEAR_REG(SW3, sw3, B3DTV1), 240 276 LTC3589_FIXED_REG(BB_OUT, bb-out), 241 - LTC3589_REG(LDO1, ldo1, fixed_standby, 0, 0, 0, 0), 277 + LTC3589_REG(LDO1, ldo1, fixed_standby, 0, 0, 0), 242 278 LTC3589_LINEAR_REG(LDO2, ldo2, L2DTV1), 243 279 LTC3589_FIXED_REG(LDO3, ldo3), 244 - LTC3589_REG(LDO4, ldo4, table, LTC3589_OVEN_LDO4, LTC3589_L2DTV2, 245 - 0x60, 0), 280 + LTC3589_REG(LDO4, ldo4, table, LTC3589_OVEN_LDO4, LTC3589_L2DTV2, 0x60), 246 281 }; 247 282 248 283 static bool ltc3589_writeable_reg(struct device *dev, unsigned int reg)
+9 -33
drivers/regulator/max77686-regulator.c
··· 67 67 #define MAX77686_REGULATORS MAX77686_REG_MAX 68 68 #define MAX77686_LDOS 26 69 69 70 - enum max77686_ramp_rate { 71 - RAMP_RATE_13P75MV, 72 - RAMP_RATE_27P5MV, 73 - RAMP_RATE_55MV, 74 - RAMP_RATE_NO_CTRL, /* 100mV/us */ 75 - }; 76 - 77 70 struct max77686_data { 78 71 struct device *dev; 79 72 DECLARE_BITMAP(gpio_enabled, MAX77686_REGULATORS); ··· 213 220 max77686->opmode[id] << shift); 214 221 } 215 222 216 - static int max77686_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay) 217 - { 218 - unsigned int ramp_value = RAMP_RATE_NO_CTRL; 219 - 220 - switch (ramp_delay) { 221 - case 1 ... 13750: 222 - ramp_value = RAMP_RATE_13P75MV; 223 - break; 224 - case 13751 ... 27500: 225 - ramp_value = RAMP_RATE_27P5MV; 226 - break; 227 - case 27501 ... 55000: 228 - ramp_value = RAMP_RATE_55MV; 229 - break; 230 - case 55001 ... 100000: 231 - break; 232 - default: 233 - pr_warn("%s: ramp_delay: %d not supported, setting 100000\n", 234 - rdev->desc->name, ramp_delay); 235 - } 236 - 237 - return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 238 - MAX77686_RAMP_RATE_MASK, ramp_value << 6); 239 - } 240 - 241 223 static int max77686_of_parse_cb(struct device_node *np, 242 224 const struct regulator_desc *desc, 243 225 struct regulator_config *config) ··· 251 283 252 284 return 0; 253 285 } 286 + 287 + static const unsigned int max77686_buck_dvs_ramp_table[] = { 288 + 13750, 27500, 55000, 100000 289 + }; 254 290 255 291 static const struct regulator_ops max77686_ops = { 256 292 .list_voltage = regulator_list_voltage_linear, ··· 302 330 .get_voltage_sel = regulator_get_voltage_sel_regmap, 303 331 .set_voltage_sel = regulator_set_voltage_sel_regmap, 304 332 .set_voltage_time_sel = regulator_set_voltage_time_sel, 305 - .set_ramp_delay = max77686_set_ramp_delay, 333 + .set_ramp_delay = regulator_set_ramp_delay_regmap, 306 334 .set_suspend_disable = max77686_set_suspend_disable, 307 335 }; 308 336 ··· 434 462 .enable_reg = MAX77686_REG_BUCK2CTRL1 + (num - 2) * 10, \ 435 463 .enable_mask = MAX77686_OPMODE_MASK \ 436 464 << MAX77686_OPMODE_BUCK234_SHIFT, \ 465 + .ramp_reg = MAX77686_REG_BUCK2CTRL1 + (num - 2) * 10, \ 466 + .ramp_mask = MAX77686_RAMP_RATE_MASK, \ 467 + .ramp_delay_table = max77686_buck_dvs_ramp_table, \ 468 + .n_ramp_values = ARRAY_SIZE(max77686_buck_dvs_ramp_table), \ 437 469 } 438 470 439 471 static const struct regulator_desc regulators[] = {
+12 -58
drivers/regulator/max77802-regulator.c
··· 43 43 #define MAX77802_OFF_PWRREQ 0x1 44 44 #define MAX77802_LP_PWRREQ 0x2 45 45 46 - /* MAX77802 has two register formats: 2-bit and 4-bit */ 47 - static const unsigned int ramp_table_77802_2bit[] = { 46 + static const unsigned int max77802_buck234_ramp_table[] = { 48 47 12500, 49 48 25000, 50 49 50000, 51 50 100000, 52 51 }; 53 52 54 - static unsigned int ramp_table_77802_4bit[] = { 53 + static const unsigned int max77802_buck16_ramp_table[] = { 55 54 1000, 2000, 3030, 4000, 56 55 5000, 5880, 7140, 8330, 57 56 9090, 10000, 11110, 12500, ··· 220 221 max77802->opmode[id] << shift); 221 222 } 222 223 223 - static int max77802_find_ramp_value(struct regulator_dev *rdev, 224 - const unsigned int limits[], int size, 225 - unsigned int ramp_delay) 226 - { 227 - int i; 228 - 229 - for (i = 0; i < size; i++) { 230 - if (ramp_delay <= limits[i]) 231 - return i; 232 - } 233 - 234 - /* Use maximum value for no ramp control */ 235 - dev_warn(&rdev->dev, "%s: ramp_delay: %d not supported, setting 100000\n", 236 - rdev->desc->name, ramp_delay); 237 - return size - 1; 238 - } 239 - 240 - /* Used for BUCKs 2-4 */ 241 - static int max77802_set_ramp_delay_2bit(struct regulator_dev *rdev, 242 - int ramp_delay) 243 - { 244 - int id = rdev_get_id(rdev); 245 - unsigned int ramp_value; 246 - 247 - if (id > MAX77802_BUCK4) { 248 - dev_warn(&rdev->dev, 249 - "%s: regulator: ramp delay not supported\n", 250 - rdev->desc->name); 251 - return -EINVAL; 252 - } 253 - ramp_value = max77802_find_ramp_value(rdev, ramp_table_77802_2bit, 254 - ARRAY_SIZE(ramp_table_77802_2bit), ramp_delay); 255 - 256 - return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 257 - MAX77802_RAMP_RATE_MASK_2BIT, 258 - ramp_value << MAX77802_RAMP_RATE_SHIFT_2BIT); 259 - } 260 - 261 - /* For BUCK1, 6 */ 262 - static int max77802_set_ramp_delay_4bit(struct regulator_dev *rdev, 263 - int ramp_delay) 264 - { 265 - unsigned int ramp_value; 266 - 267 - ramp_value = max77802_find_ramp_value(rdev, ramp_table_77802_4bit, 268 - ARRAY_SIZE(ramp_table_77802_4bit), ramp_delay); 269 - 270 - return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 271 - MAX77802_RAMP_RATE_MASK_4BIT, 272 - ramp_value << MAX77802_RAMP_RATE_SHIFT_4BIT); 273 - } 274 - 275 224 /* 276 225 * LDOs 2, 4-19, 22-35 277 226 */ ··· 263 316 .get_voltage_sel = regulator_get_voltage_sel_regmap, 264 317 .set_voltage_sel = regulator_set_voltage_sel_regmap, 265 318 .set_voltage_time_sel = regulator_set_voltage_time_sel, 266 - .set_ramp_delay = max77802_set_ramp_delay_4bit, 319 + .set_ramp_delay = regulator_set_ramp_delay_regmap, 267 320 .set_suspend_disable = max77802_set_suspend_disable, 268 321 }; 269 322 ··· 277 330 .get_voltage_sel = regulator_get_voltage_sel_regmap, 278 331 .set_voltage_sel = regulator_set_voltage_sel_regmap, 279 332 .set_voltage_time_sel = regulator_set_voltage_time_sel, 280 - .set_ramp_delay = max77802_set_ramp_delay_2bit, 333 + .set_ramp_delay = regulator_set_ramp_delay_regmap, 281 334 .set_suspend_disable = max77802_set_suspend_disable, 282 335 .set_suspend_mode = max77802_set_suspend_mode, 283 336 }; ··· 292 345 .get_voltage_sel = regulator_get_voltage_sel_regmap, 293 346 .set_voltage_sel = regulator_set_voltage_sel_regmap, 294 347 .set_voltage_time_sel = regulator_set_voltage_time_sel, 295 - .set_ramp_delay = max77802_set_ramp_delay_2bit, 296 348 .set_suspend_disable = max77802_set_suspend_disable, 297 349 }; 298 350 ··· 355 409 .vsel_mask = MAX77802_DVS_VSEL_MASK, \ 356 410 .enable_reg = MAX77802_REG_BUCK ## num ## CTRL, \ 357 411 .enable_mask = MAX77802_OPMODE_MASK, \ 412 + .ramp_reg = MAX77802_REG_BUCK ## num ## CTRL, \ 413 + .ramp_mask = MAX77802_RAMP_RATE_MASK_4BIT, \ 414 + .ramp_delay_table = max77802_buck16_ramp_table, \ 415 + .n_ramp_values = ARRAY_SIZE(max77802_buck16_ramp_table), \ 358 416 .of_map_mode = max77802_map_mode, \ 359 417 } 360 418 ··· 381 431 .enable_reg = MAX77802_REG_BUCK ## num ## CTRL1, \ 382 432 .enable_mask = MAX77802_OPMODE_MASK << \ 383 433 MAX77802_OPMODE_BUCK234_SHIFT, \ 434 + .ramp_reg = MAX77802_REG_BUCK ## num ## CTRL1, \ 435 + .ramp_mask = MAX77802_RAMP_RATE_MASK_2BIT, \ 436 + .ramp_delay_table = max77802_buck234_ramp_table, \ 437 + .n_ramp_values = ARRAY_SIZE(max77802_buck234_ramp_table), \ 384 438 .of_map_mode = max77802_map_mode, \ 385 439 } 386 440
+183
drivers/regulator/max8893.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + #include <linux/module.h> 3 + #include <linux/i2c.h> 4 + #include <linux/of.h> 5 + #include <linux/regmap.h> 6 + #include <linux/regulator/driver.h> 7 + 8 + static const struct regulator_ops max8893_ops = { 9 + .is_enabled = regulator_is_enabled_regmap, 10 + .enable = regulator_enable_regmap, 11 + .disable = regulator_disable_regmap, 12 + .get_voltage_sel = regulator_get_voltage_sel_regmap, 13 + .set_voltage_sel = regulator_set_voltage_sel_regmap, 14 + .list_voltage = regulator_list_voltage_linear, 15 + .map_voltage = regulator_map_voltage_linear, 16 + }; 17 + 18 + static const struct regulator_desc max8893_regulators[] = { 19 + { 20 + .name = "BUCK", 21 + .supply_name = "in-buck", 22 + .of_match = of_match_ptr("buck"), 23 + .regulators_node = of_match_ptr("regulators"), 24 + .n_voltages = 0x11, 25 + .id = 6, 26 + .ops = &max8893_ops, 27 + .type = REGULATOR_VOLTAGE, 28 + .owner = THIS_MODULE, 29 + .min_uV = 800000, 30 + .uV_step = 100000, 31 + .vsel_reg = 0x4, 32 + .vsel_mask = 0x1f, 33 + .enable_reg = 0x0, 34 + .enable_mask = BIT(7), 35 + }, 36 + { 37 + .name = "LDO1", 38 + .supply_name = "in-ldo1", 39 + .of_match = of_match_ptr("ldo1"), 40 + .regulators_node = of_match_ptr("regulators"), 41 + .n_voltages = 0x12, 42 + .id = 1, 43 + .ops = &max8893_ops, 44 + .type = REGULATOR_VOLTAGE, 45 + .owner = THIS_MODULE, 46 + .min_uV = 1600000, 47 + .uV_step = 100000, 48 + .vsel_reg = 0x5, 49 + .vsel_mask = 0x1f, 50 + .enable_reg = 0x0, 51 + .enable_mask = BIT(5), 52 + }, 53 + { 54 + .name = "LDO2", 55 + .supply_name = "in-ldo2", 56 + .of_match = of_match_ptr("ldo2"), 57 + .regulators_node = of_match_ptr("regulators"), 58 + .n_voltages = 0x16, 59 + .id = 2, 60 + .ops = &max8893_ops, 61 + .type = REGULATOR_VOLTAGE, 62 + .owner = THIS_MODULE, 63 + .min_uV = 1200000, 64 + .uV_step = 100000, 65 + .vsel_reg = 0x6, 66 + .vsel_mask = 0x1f, 67 + .enable_reg = 0x0, 68 + .enable_mask = BIT(4), 69 + }, 70 + { 71 + .name = "LDO3", 72 + .supply_name = "in-ldo3", 73 + .of_match = of_match_ptr("ldo3"), 74 + .regulators_node = of_match_ptr("regulators"), 75 + .n_voltages = 0x12, 76 + .id = 3, 77 + .ops = &max8893_ops, 78 + .type = REGULATOR_VOLTAGE, 79 + .owner = THIS_MODULE, 80 + .min_uV = 1600000, 81 + .uV_step = 100000, 82 + .vsel_reg = 0x7, 83 + .vsel_mask = 0x1f, 84 + .enable_reg = 0x0, 85 + .enable_mask = BIT(3), 86 + }, 87 + { 88 + .name = "LDO4", 89 + .supply_name = "in-ldo4", 90 + .of_match = of_match_ptr("ldo4"), 91 + .regulators_node = of_match_ptr("regulators"), 92 + .n_voltages = 0x1a, 93 + .id = 4, 94 + .ops = &max8893_ops, 95 + .type = REGULATOR_VOLTAGE, 96 + .owner = THIS_MODULE, 97 + .min_uV = 800000, 98 + .uV_step = 100000, 99 + .vsel_reg = 0x8, 100 + .vsel_mask = 0x1f, 101 + .enable_reg = 0x0, 102 + .enable_mask = BIT(2), 103 + }, 104 + { 105 + .name = "LDO5", 106 + .supply_name = "in-ldo5", 107 + .of_match = of_match_ptr("ldo5"), 108 + .regulators_node = of_match_ptr("regulators"), 109 + .n_voltages = 0x1a, 110 + .id = 5, 111 + .ops = &max8893_ops, 112 + .type = REGULATOR_VOLTAGE, 113 + .owner = THIS_MODULE, 114 + .min_uV = 800000, 115 + .uV_step = 100000, 116 + .vsel_reg = 0x9, 117 + .vsel_mask = 0x1f, 118 + .enable_reg = 0x0, 119 + .enable_mask = BIT(1), 120 + } 121 + }; 122 + 123 + static const struct regmap_config max8893_regmap = { 124 + .reg_bits = 8, 125 + .val_bits = 8, 126 + }; 127 + 128 + static int max8893_probe_new(struct i2c_client *i2c) 129 + { 130 + int id, ret; 131 + struct regulator_config config = {.dev = &i2c->dev}; 132 + struct regmap *regmap = devm_regmap_init_i2c(i2c, &max8893_regmap); 133 + 134 + if (IS_ERR(regmap)) { 135 + ret = PTR_ERR(regmap); 136 + dev_err(&i2c->dev, "regmap init failed: %d\n", ret); 137 + return ret; 138 + } 139 + 140 + for (id = 0; id < ARRAY_SIZE(max8893_regulators); id++) { 141 + struct regulator_dev *rdev; 142 + rdev = devm_regulator_register(&i2c->dev, 143 + &max8893_regulators[id], 144 + &config); 145 + if (IS_ERR(rdev)) { 146 + ret = PTR_ERR(rdev); 147 + dev_err(&i2c->dev, "failed to register %s: %d\n", 148 + max8893_regulators[id].name, ret); 149 + return ret; 150 + } 151 + } 152 + 153 + return 0; 154 + } 155 + 156 + #ifdef CONFIG_OF 157 + static const struct of_device_id max8893_dt_match[] = { 158 + { .compatible = "maxim,max8893" }, 159 + { /* sentinel */ }, 160 + }; 161 + MODULE_DEVICE_TABLE(of, max8893_dt_match); 162 + #endif 163 + 164 + static const struct i2c_device_id max8893_ids[] = { 165 + { "max8893", 0 }, 166 + { }, 167 + }; 168 + MODULE_DEVICE_TABLE(i2c, max8893_ids); 169 + 170 + static struct i2c_driver max8893_driver = { 171 + .probe_new = max8893_probe_new, 172 + .driver = { 173 + .name = "max8893", 174 + .of_match_table = of_match_ptr(max8893_dt_match), 175 + }, 176 + .id_table = max8893_ids, 177 + }; 178 + 179 + module_i2c_driver(max8893_driver); 180 + 181 + MODULE_DESCRIPTION("Maxim MAX8893 PMIC driver"); 182 + MODULE_AUTHOR("Sergey Larin <cerg2010cerg2010@mail.ru>"); 183 + MODULE_LICENSE("GPL");
+9 -28
drivers/regulator/max8973-regulator.c
··· 265 265 REGULATOR_MODE_FAST : REGULATOR_MODE_NORMAL; 266 266 } 267 267 268 - static int max8973_set_ramp_delay(struct regulator_dev *rdev, 269 - int ramp_delay) 270 - { 271 - struct max8973_chip *max = rdev_get_drvdata(rdev); 272 - unsigned int control; 273 - int ret; 274 - 275 - /* Set ramp delay */ 276 - if (ramp_delay <= 12000) 277 - control = MAX8973_RAMP_12mV_PER_US; 278 - else if (ramp_delay <= 25000) 279 - control = MAX8973_RAMP_25mV_PER_US; 280 - else if (ramp_delay <= 50000) 281 - control = MAX8973_RAMP_50mV_PER_US; 282 - else if (ramp_delay <= 200000) 283 - control = MAX8973_RAMP_200mV_PER_US; 284 - else 285 - return -EINVAL; 286 - 287 - ret = regmap_update_bits(max->regmap, MAX8973_CONTROL1, 288 - MAX8973_RAMP_MASK, control); 289 - if (ret < 0) 290 - dev_err(max->dev, "register %d update failed, %d", 291 - MAX8973_CONTROL1, ret); 292 - return ret; 293 - } 294 - 295 268 static int max8973_set_current_limit(struct regulator_dev *rdev, 296 269 int min_ua, int max_ua) 297 270 { ··· 314 341 return 9000000; 315 342 } 316 343 344 + static const unsigned int max8973_buck_ramp_table[] = { 345 + 12000, 25000, 50000, 200000 346 + }; 347 + 317 348 static const struct regulator_ops max8973_dcdc_ops = { 318 349 .get_voltage_sel = max8973_dcdc_get_voltage_sel, 319 350 .set_voltage_sel = max8973_dcdc_set_voltage_sel, ··· 325 348 .set_mode = max8973_dcdc_set_mode, 326 349 .get_mode = max8973_dcdc_get_mode, 327 350 .set_voltage_time_sel = regulator_set_voltage_time_sel, 328 - .set_ramp_delay = max8973_set_ramp_delay, 351 + .set_ramp_delay = regulator_set_ramp_delay_regmap, 329 352 }; 330 353 331 354 static int max8973_init_dcdc(struct max8973_chip *max, ··· 671 694 max->desc.min_uV = MAX8973_MIN_VOLATGE; 672 695 max->desc.uV_step = MAX8973_VOLATGE_STEP; 673 696 max->desc.n_voltages = MAX8973_BUCK_N_VOLTAGE; 697 + max->desc.ramp_reg = MAX8973_CONTROL1; 698 + max->desc.ramp_mask = MAX8973_RAMP_MASK; 699 + max->desc.ramp_delay_table = max8973_buck_ramp_table; 700 + max->desc.n_ramp_values = ARRAY_SIZE(max8973_buck_ramp_table); 674 701 675 702 max->dvs_gpio = (pdata->dvs_gpio) ? pdata->dvs_gpio : -EINVAL; 676 703 max->enable_external_control = pdata->enable_ext_control;
+28 -51
drivers/regulator/mcp16502.c
··· 90 90 }; 91 91 92 92 /* Ramp delay (uV/us) for buck1, ldo1, ldo2. */ 93 - static const int mcp16502_ramp_b1l12[] = { 6250, 3125, 2083, 1563 }; 93 + static const unsigned int mcp16502_ramp_b1l12[] = { 94 + 6250, 3125, 2083, 1563 95 + }; 94 96 95 97 /* Ramp delay (uV/us) for buck2, buck3, buck4. */ 96 - static const int mcp16502_ramp_b234[] = { 3125, 1563, 1042, 781 }; 98 + static const unsigned int mcp16502_ramp_b234[] = { 99 + 3125, 1563, 1042, 781 100 + }; 97 101 98 102 static unsigned int mcp16502_of_map_mode(unsigned int mode) 99 103 { ··· 107 103 return REGULATOR_MODE_INVALID; 108 104 } 109 105 110 - #define MCP16502_REGULATOR(_name, _id, _ranges, _ops) \ 106 + #define MCP16502_REGULATOR(_name, _id, _ranges, _ops, _ramp_table) \ 111 107 [_id] = { \ 112 108 .name = _name, \ 113 109 .regulators_node = of_match_ptr("regulators"), \ ··· 125 121 .vsel_mask = MCP16502_VSEL, \ 126 122 .enable_reg = (((_id) + 1) << 4), \ 127 123 .enable_mask = MCP16502_EN, \ 124 + .ramp_reg = MCP16502_REG_BASE(_id, CFG), \ 125 + .ramp_mask = MCP16502_DVSR, \ 126 + .ramp_delay_table = _ramp_table, \ 127 + .n_ramp_values = ARRAY_SIZE(_ramp_table), \ 128 128 } 129 129 130 130 enum { ··· 322 314 return ret; 323 315 } 324 316 325 - static int mcp16502_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay) 326 - { 327 - const int *ramp; 328 - int id = rdev_get_id(rdev); 329 - unsigned int i, size; 330 - 331 - switch (id) { 332 - case BUCK1: 333 - case LDO1: 334 - case LDO2: 335 - ramp = mcp16502_ramp_b1l12; 336 - size = ARRAY_SIZE(mcp16502_ramp_b1l12); 337 - break; 338 - 339 - case BUCK2: 340 - case BUCK3: 341 - case BUCK4: 342 - ramp = mcp16502_ramp_b234; 343 - size = ARRAY_SIZE(mcp16502_ramp_b234); 344 - break; 345 - 346 - default: 347 - return -EINVAL; 348 - } 349 - 350 - for (i = 0; i < size; i++) { 351 - if (ramp[i] == ramp_delay) 352 - break; 353 - } 354 - if (i == size) 355 - return -EINVAL; 356 - 357 - return regmap_update_bits(rdev->regmap, MCP16502_REG_BASE(id, CFG), 358 - MCP16502_DVSR, (i << 2)); 359 - } 360 - 361 317 #ifdef CONFIG_SUSPEND 362 318 /* 363 319 * mcp16502_suspend_get_target_reg() - get the reg of the target suspend PMIC ··· 417 445 .is_enabled = regulator_is_enabled_regmap, 418 446 .get_status = mcp16502_get_status, 419 447 .set_voltage_time_sel = mcp16502_set_voltage_time_sel, 420 - .set_ramp_delay = mcp16502_set_ramp_delay, 448 + .set_ramp_delay = regulator_set_ramp_delay_regmap, 421 449 422 450 .set_mode = mcp16502_set_mode, 423 451 .get_mode = mcp16502_get_mode, ··· 443 471 .is_enabled = regulator_is_enabled_regmap, 444 472 .get_status = mcp16502_get_status, 445 473 .set_voltage_time_sel = mcp16502_set_voltage_time_sel, 446 - .set_ramp_delay = mcp16502_set_ramp_delay, 474 + .set_ramp_delay = regulator_set_ramp_delay_regmap, 447 475 448 476 #ifdef CONFIG_SUSPEND 449 477 .set_suspend_voltage = mcp16502_set_suspend_voltage, ··· 467 495 }; 468 496 469 497 static const struct regulator_desc mcp16502_desc[] = { 470 - /* MCP16502_REGULATOR(_name, _id, ranges, regulator_ops) */ 471 - MCP16502_REGULATOR("VDD_IO", BUCK1, b1l12_ranges, mcp16502_buck_ops), 472 - MCP16502_REGULATOR("VDD_DDR", BUCK2, b234_ranges, mcp16502_buck_ops), 473 - MCP16502_REGULATOR("VDD_CORE", BUCK3, b234_ranges, mcp16502_buck_ops), 474 - MCP16502_REGULATOR("VDD_OTHER", BUCK4, b234_ranges, mcp16502_buck_ops), 475 - MCP16502_REGULATOR("LDO1", LDO1, b1l12_ranges, mcp16502_ldo_ops), 476 - MCP16502_REGULATOR("LDO2", LDO2, b1l12_ranges, mcp16502_ldo_ops) 498 + /* MCP16502_REGULATOR(_name, _id, ranges, regulator_ops, ramp_table) */ 499 + MCP16502_REGULATOR("VDD_IO", BUCK1, b1l12_ranges, mcp16502_buck_ops, 500 + mcp16502_ramp_b1l12), 501 + MCP16502_REGULATOR("VDD_DDR", BUCK2, b234_ranges, mcp16502_buck_ops, 502 + mcp16502_ramp_b234), 503 + MCP16502_REGULATOR("VDD_CORE", BUCK3, b234_ranges, mcp16502_buck_ops, 504 + mcp16502_ramp_b234), 505 + MCP16502_REGULATOR("VDD_OTHER", BUCK4, b234_ranges, mcp16502_buck_ops, 506 + mcp16502_ramp_b234), 507 + MCP16502_REGULATOR("LDO1", LDO1, b1l12_ranges, mcp16502_ldo_ops, 508 + mcp16502_ramp_b1l12), 509 + MCP16502_REGULATOR("LDO2", LDO2, b1l12_ranges, mcp16502_ldo_ops, 510 + mcp16502_ramp_b1l12) 477 511 }; 478 512 479 513 static const struct regmap_range mcp16502_ranges[] = { ··· 500 522 .wr_table = &mcp16502_yes_reg_table, 501 523 }; 502 524 503 - static int mcp16502_probe(struct i2c_client *client, 504 - const struct i2c_device_id *id) 525 + static int mcp16502_probe(struct i2c_client *client) 505 526 { 506 527 struct regulator_config config = { }; 507 528 struct regulator_dev *rdev; ··· 583 606 MODULE_DEVICE_TABLE(i2c, mcp16502_i2c_id); 584 607 585 608 static struct i2c_driver mcp16502_drv = { 586 - .probe = mcp16502_probe, 609 + .probe_new = mcp16502_probe, 587 610 .driver = { 588 611 .name = "mcp16502-regulator", 589 612 .of_match_table = of_match_ptr(mcp16502_ids),
+15 -29
drivers/regulator/mp5416.c
··· 67 67 .vsel_mask = MP5416_MASK_VSET, \ 68 68 .enable_reg = MP5416_REG_BUCK ## _id, \ 69 69 .enable_mask = MP5416_REGULATOR_EN, \ 70 + .ramp_reg = MP5416_REG_CTL2, \ 71 + .ramp_mask = MP5416_MASK_DVS_SLEWRATE, \ 72 + .ramp_delay_table = mp5416_buck_ramp_table, \ 73 + .n_ramp_values = ARRAY_SIZE(mp5416_buck_ramp_table), \ 70 74 .active_discharge_on = _dval, \ 71 75 .active_discharge_reg = _dreg, \ 72 76 .active_discharge_mask = _dval, \ ··· 127 123 2200000, 3200000, 4200000, 5200000 128 124 }; 129 125 130 - static int mp5416_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay); 126 + /* 127 + * DVS ramp rate BUCK1 to BUCK4 128 + * 00: 32mV/us 129 + * 01: 16mV/us 130 + * 10: 8mV/us 131 + * 11: 4mV/us 132 + */ 133 + static const unsigned int mp5416_buck_ramp_table[] = { 134 + 32000, 16000, 8000, 4000 135 + }; 131 136 132 137 static const struct regulator_ops mp5416_ldo_ops = { 133 138 .enable = regulator_enable_regmap, ··· 160 147 .set_active_discharge = regulator_set_active_discharge_regmap, 161 148 .get_current_limit = regulator_get_current_limit_regmap, 162 149 .set_current_limit = regulator_set_current_limit_regmap, 163 - .set_ramp_delay = mp5416_set_ramp_delay, 150 + .set_ramp_delay = regulator_set_ramp_delay_regmap, 164 151 }; 165 152 166 153 static struct regulator_desc mp5416_regulators_desc[MP5416_MAX_REGULATORS] = { ··· 173 160 MP5416LDO("ldo3", 3, BIT(2)), 174 161 MP5416LDO("ldo4", 4, BIT(1)), 175 162 }; 176 - 177 - /* 178 - * DVS ramp rate BUCK1 to BUCK4 179 - * 00: 32mV/us 180 - * 01: 16mV/us 181 - * 10: 8mV/us 182 - * 11: 4mV/us 183 - */ 184 - static int mp5416_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay) 185 - { 186 - unsigned int ramp_val; 187 - 188 - if (ramp_delay > 32000 || ramp_delay < 0) 189 - return -EINVAL; 190 - 191 - if (ramp_delay <= 4000) 192 - ramp_val = 3; 193 - else if (ramp_delay <= 8000) 194 - ramp_val = 2; 195 - else if (ramp_delay <= 16000) 196 - ramp_val = 1; 197 - else 198 - ramp_val = 0; 199 - 200 - return regmap_update_bits(rdev->regmap, MP5416_REG_CTL2, 201 - MP5416_MASK_DVS_SLEWRATE, ramp_val << 6); 202 - } 203 163 204 164 static int mp5416_i2c_probe(struct i2c_client *client) 205 165 {
+7 -25
drivers/regulator/mp886x.c
··· 26 26 27 27 struct mp886x_cfg_info { 28 28 const struct regulator_ops *rops; 29 - const int slew_rates[8]; 29 + const unsigned int slew_rates[8]; 30 30 const int switch_freq[4]; 31 31 const u8 fs_reg; 32 32 const u8 fs_shift; ··· 41 41 u32 r[2]; 42 42 unsigned int sel; 43 43 }; 44 - 45 - static int mp886x_set_ramp(struct regulator_dev *rdev, int ramp) 46 - { 47 - struct mp886x_device_info *di = rdev_get_drvdata(rdev); 48 - const struct mp886x_cfg_info *ci = di->ci; 49 - int reg = -1, i; 50 - 51 - for (i = 0; i < ARRAY_SIZE(ci->slew_rates); i++) { 52 - if (ramp <= ci->slew_rates[i]) 53 - reg = i; 54 - else 55 - break; 56 - } 57 - 58 - if (reg < 0) { 59 - dev_err(di->dev, "unsupported ramp value %d\n", ramp); 60 - return -EINVAL; 61 - } 62 - 63 - return regmap_update_bits(rdev->regmap, MP886X_SYSCNTLREG1, 64 - MP886X_SLEW_MASK, reg << MP886X_SLEW_SHIFT); 65 - } 66 44 67 45 static void mp886x_set_switch_freq(struct mp886x_device_info *di, 68 46 struct regmap *regmap, ··· 147 169 .is_enabled = regulator_is_enabled_regmap, 148 170 .set_mode = mp886x_set_mode, 149 171 .get_mode = mp886x_get_mode, 150 - .set_ramp_delay = mp886x_set_ramp, 172 + .set_ramp_delay = regulator_set_ramp_delay_regmap, 151 173 }; 152 174 153 175 static const struct mp886x_cfg_info mp8869_ci = { ··· 226 248 .is_enabled = regulator_is_enabled_regmap, 227 249 .set_mode = mp886x_set_mode, 228 250 .get_mode = mp886x_get_mode, 229 - .set_ramp_delay = mp886x_set_ramp, 251 + .set_ramp_delay = regulator_set_ramp_delay_regmap, 230 252 }; 231 253 232 254 static const struct mp886x_cfg_info mp8867_ci = { ··· 268 290 rdesc->uV_step = 10000; 269 291 rdesc->vsel_reg = MP886X_VSEL; 270 292 rdesc->vsel_mask = 0x3f; 293 + rdesc->ramp_reg = MP886X_SYSCNTLREG1; 294 + rdesc->ramp_mask = MP886X_SLEW_MASK; 295 + rdesc->ramp_delay_table = di->ci->slew_rates; 296 + rdesc->n_ramp_values = ARRAY_SIZE(di->ci->slew_rates); 271 297 rdesc->owner = THIS_MODULE; 272 298 273 299 rdev = devm_regulator_register(di->dev, &di->desc, config);
+11 -10
drivers/regulator/mt6315-regulator.c
··· 84 84 modeset_mask = init->modeset_mask[rdev_get_id(rdev)]; 85 85 ret = regmap_read(rdev->regmap, MT6315_BUCK_TOP_4PHASE_ANA_CON42, &regval); 86 86 if (ret != 0) { 87 - dev_notice(&rdev->dev, "Failed to get mode: %d\n", ret); 87 + dev_err(&rdev->dev, "Failed to get mode: %d\n", ret); 88 88 return ret; 89 89 } 90 90 ··· 93 93 94 94 ret = regmap_read(rdev->regmap, MT6315_BUCK_TOP_CON1, &regval); 95 95 if (ret != 0) { 96 - dev_notice(&rdev->dev, "Failed to get lp mode: %d\n", ret); 96 + dev_err(&rdev->dev, "Failed to get lp mode: %d\n", ret); 97 97 return ret; 98 98 } 99 99 ··· 147 147 break; 148 148 default: 149 149 ret = -EINVAL; 150 - dev_notice(&rdev->dev, "Unsupported mode: %d\n", mode); 150 + dev_err(&rdev->dev, "Unsupported mode: %d\n", mode); 151 151 break; 152 152 } 153 153 154 154 if (ret != 0) { 155 - dev_notice(&rdev->dev, "Failed to set mode: %d\n", ret); 155 + dev_err(&rdev->dev, "Failed to set mode: %d\n", ret); 156 156 return ret; 157 157 } 158 158 ··· 168 168 info = container_of(rdev->desc, struct mt6315_regulator_info, desc); 169 169 ret = regmap_read(rdev->regmap, info->status_reg, &regval); 170 170 if (ret < 0) { 171 - dev_notice(&rdev->dev, "Failed to get enable reg: %d\n", ret); 171 + dev_err(&rdev->dev, "Failed to get enable reg: %d\n", ret); 172 172 return ret; 173 173 } 174 174 ··· 223 223 int i; 224 224 225 225 regmap = devm_regmap_init_spmi_ext(pdev, &mt6315_regmap_config); 226 - if (!regmap) 227 - return -ENODEV; 226 + if (IS_ERR(regmap)) 227 + return PTR_ERR(regmap); 228 228 229 229 chip = devm_kzalloc(dev, sizeof(struct mt6315_chip), GFP_KERNEL); 230 230 if (!chip) ··· 260 260 config.driver_data = init_data; 261 261 rdev = devm_regulator_register(dev, &mt6315_regulators[i].desc, &config); 262 262 if (IS_ERR(rdev)) { 263 - dev_notice(dev, "Failed to register %s\n", mt6315_regulators[i].desc.name); 264 - continue; 263 + dev_err(dev, "Failed to register %s\n", 264 + mt6315_regulators[i].desc.name); 265 + return PTR_ERR(rdev); 265 266 } 266 267 } 267 268 ··· 280 279 ret |= regmap_write(chip->regmap, MT6315_TOP_TMA_KEY, 0); 281 280 ret |= regmap_write(chip->regmap, MT6315_TOP_TMA_KEY_H, 0); 282 281 if (ret < 0) 283 - dev_notice(&pdev->dev, "[%#x] Failed to enable power off sequence. %d\n", 282 + dev_err(&pdev->dev, "[%#x] Failed to enable power off sequence. %d\n", 284 283 pdev->usid, ret); 285 284 } 286 285
+11 -11
drivers/regulator/mt6358-regulator.c
··· 153 153 REGULATOR_LINEAR_RANGE(1000000, 0, 0x7f, 12500), 154 154 }; 155 155 156 - static const u32 vdram2_voltages[] = { 156 + static const unsigned int vdram2_voltages[] = { 157 157 600000, 1800000, 158 158 }; 159 159 160 - static const u32 vsim_voltages[] = { 160 + static const unsigned int vsim_voltages[] = { 161 161 1700000, 1800000, 2700000, 3000000, 3100000, 162 162 }; 163 163 164 - static const u32 vibr_voltages[] = { 164 + static const unsigned int vibr_voltages[] = { 165 165 1200000, 1300000, 1500000, 1800000, 166 166 2000000, 2800000, 3000000, 3300000, 167 167 }; 168 168 169 - static const u32 vusb_voltages[] = { 169 + static const unsigned int vusb_voltages[] = { 170 170 3000000, 3100000, 171 171 }; 172 172 173 - static const u32 vcamd_voltages[] = { 173 + static const unsigned int vcamd_voltages[] = { 174 174 900000, 1000000, 1100000, 1200000, 175 175 1300000, 1500000, 1800000, 176 176 }; 177 177 178 - static const u32 vefuse_voltages[] = { 178 + static const unsigned int vefuse_voltages[] = { 179 179 1700000, 1800000, 1900000, 180 180 }; 181 181 182 - static const u32 vmch_vemc_voltages[] = { 182 + static const unsigned int vmch_vemc_voltages[] = { 183 183 2900000, 3000000, 3300000, 184 184 }; 185 185 186 - static const u32 vcama_voltages[] = { 186 + static const unsigned int vcama_voltages[] = { 187 187 1800000, 2500000, 2700000, 188 188 2800000, 2900000, 3000000, 189 189 }; 190 190 191 - static const u32 vcn33_bt_wifi_voltages[] = { 191 + static const unsigned int vcn33_bt_wifi_voltages[] = { 192 192 3300000, 3400000, 3500000, 193 193 }; 194 194 195 - static const u32 vmc_voltages[] = { 195 + static const unsigned int vmc_voltages[] = { 196 196 1800000, 2900000, 3000000, 3300000, 197 197 }; 198 198 199 - static const u32 vldo28_voltages[] = { 199 + static const unsigned int vldo28_voltages[] = { 200 200 2800000, 3000000, 201 201 }; 202 202
+997
drivers/regulator/mt6359-regulator.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + // 3 + // Copyright (c) 2021 MediaTek Inc. 4 + 5 + #include <linux/platform_device.h> 6 + #include <linux/mfd/mt6359/registers.h> 7 + #include <linux/mfd/mt6359p/registers.h> 8 + #include <linux/mfd/mt6397/core.h> 9 + #include <linux/module.h> 10 + #include <linux/of_device.h> 11 + #include <linux/regmap.h> 12 + #include <linux/regulator/driver.h> 13 + #include <linux/regulator/machine.h> 14 + #include <linux/regulator/mt6359-regulator.h> 15 + #include <linux/regulator/of_regulator.h> 16 + 17 + #define MT6359_BUCK_MODE_AUTO 0 18 + #define MT6359_BUCK_MODE_FORCE_PWM 1 19 + #define MT6359_BUCK_MODE_NORMAL 0 20 + #define MT6359_BUCK_MODE_LP 2 21 + 22 + /* 23 + * MT6359 regulators' information 24 + * 25 + * @desc: standard fields of regulator description. 26 + * @status_reg: for query status of regulators. 27 + * @qi: Mask for query enable signal status of regulators. 28 + * @modeset_reg: for operating AUTO/PWM mode register. 29 + * @modeset_mask: MASK for operating modeset register. 30 + * @modeset_shift: SHIFT for operating modeset register. 31 + */ 32 + struct mt6359_regulator_info { 33 + struct regulator_desc desc; 34 + u32 status_reg; 35 + u32 qi; 36 + u32 modeset_reg; 37 + u32 modeset_mask; 38 + u32 modeset_shift; 39 + u32 lp_mode_reg; 40 + u32 lp_mode_mask; 41 + u32 lp_mode_shift; 42 + }; 43 + 44 + #define MT6359_BUCK(match, _name, min, max, step, \ 45 + _enable_reg, _status_reg, \ 46 + _vsel_reg, _vsel_mask, \ 47 + _lp_mode_reg, _lp_mode_shift, \ 48 + _modeset_reg, _modeset_shift) \ 49 + [MT6359_ID_##_name] = { \ 50 + .desc = { \ 51 + .name = #_name, \ 52 + .of_match = of_match_ptr(match), \ 53 + .regulators_node = of_match_ptr("regulators"), \ 54 + .ops = &mt6359_volt_linear_ops, \ 55 + .type = REGULATOR_VOLTAGE, \ 56 + .id = MT6359_ID_##_name, \ 57 + .owner = THIS_MODULE, \ 58 + .uV_step = (step), \ 59 + .n_voltages = ((max) - (min)) / (step) + 1, \ 60 + .min_uV = (min), \ 61 + .vsel_reg = _vsel_reg, \ 62 + .vsel_mask = _vsel_mask, \ 63 + .enable_reg = _enable_reg, \ 64 + .enable_mask = BIT(0), \ 65 + .of_map_mode = mt6359_map_mode, \ 66 + }, \ 67 + .status_reg = _status_reg, \ 68 + .qi = BIT(0), \ 69 + .lp_mode_reg = _lp_mode_reg, \ 70 + .lp_mode_mask = BIT(_lp_mode_shift), \ 71 + .lp_mode_shift = _lp_mode_shift, \ 72 + .modeset_reg = _modeset_reg, \ 73 + .modeset_mask = BIT(_modeset_shift), \ 74 + .modeset_shift = _modeset_shift \ 75 + } 76 + 77 + #define MT6359_LDO_LINEAR(match, _name, min, max, step, \ 78 + _enable_reg, _status_reg, _vsel_reg, _vsel_mask) \ 79 + [MT6359_ID_##_name] = { \ 80 + .desc = { \ 81 + .name = #_name, \ 82 + .of_match = of_match_ptr(match), \ 83 + .regulators_node = of_match_ptr("regulators"), \ 84 + .ops = &mt6359_volt_linear_ops, \ 85 + .type = REGULATOR_VOLTAGE, \ 86 + .id = MT6359_ID_##_name, \ 87 + .owner = THIS_MODULE, \ 88 + .uV_step = (step), \ 89 + .n_voltages = ((max) - (min)) / (step) + 1, \ 90 + .min_uV = (min), \ 91 + .vsel_reg = _vsel_reg, \ 92 + .vsel_mask = _vsel_mask, \ 93 + .enable_reg = _enable_reg, \ 94 + .enable_mask = BIT(0), \ 95 + }, \ 96 + .status_reg = _status_reg, \ 97 + .qi = BIT(0), \ 98 + } 99 + 100 + #define MT6359_LDO(match, _name, _volt_table, \ 101 + _enable_reg, _enable_mask, _status_reg, \ 102 + _vsel_reg, _vsel_mask, _en_delay) \ 103 + [MT6359_ID_##_name] = { \ 104 + .desc = { \ 105 + .name = #_name, \ 106 + .of_match = of_match_ptr(match), \ 107 + .regulators_node = of_match_ptr("regulators"), \ 108 + .ops = &mt6359_volt_table_ops, \ 109 + .type = REGULATOR_VOLTAGE, \ 110 + .id = MT6359_ID_##_name, \ 111 + .owner = THIS_MODULE, \ 112 + .n_voltages = ARRAY_SIZE(_volt_table), \ 113 + .volt_table = _volt_table, \ 114 + .vsel_reg = _vsel_reg, \ 115 + .vsel_mask = _vsel_mask, \ 116 + .enable_reg = _enable_reg, \ 117 + .enable_mask = BIT(_enable_mask), \ 118 + .enable_time = _en_delay, \ 119 + }, \ 120 + .status_reg = _status_reg, \ 121 + .qi = BIT(0), \ 122 + } 123 + 124 + #define MT6359_REG_FIXED(match, _name, _enable_reg, \ 125 + _status_reg, _fixed_volt) \ 126 + [MT6359_ID_##_name] = { \ 127 + .desc = { \ 128 + .name = #_name, \ 129 + .of_match = of_match_ptr(match), \ 130 + .regulators_node = of_match_ptr("regulators"), \ 131 + .ops = &mt6359_volt_fixed_ops, \ 132 + .type = REGULATOR_VOLTAGE, \ 133 + .id = MT6359_ID_##_name, \ 134 + .owner = THIS_MODULE, \ 135 + .n_voltages = 1, \ 136 + .enable_reg = _enable_reg, \ 137 + .enable_mask = BIT(0), \ 138 + .fixed_uV = (_fixed_volt), \ 139 + }, \ 140 + .status_reg = _status_reg, \ 141 + .qi = BIT(0), \ 142 + } 143 + 144 + #define MT6359P_LDO1(match, _name, _ops, _volt_table, \ 145 + _enable_reg, _enable_mask, _status_reg, \ 146 + _vsel_reg, _vsel_mask) \ 147 + [MT6359_ID_##_name] = { \ 148 + .desc = { \ 149 + .name = #_name, \ 150 + .of_match = of_match_ptr(match), \ 151 + .regulators_node = of_match_ptr("regulators"), \ 152 + .ops = &_ops, \ 153 + .type = REGULATOR_VOLTAGE, \ 154 + .id = MT6359_ID_##_name, \ 155 + .owner = THIS_MODULE, \ 156 + .n_voltages = ARRAY_SIZE(_volt_table), \ 157 + .volt_table = _volt_table, \ 158 + .vsel_reg = _vsel_reg, \ 159 + .vsel_mask = _vsel_mask, \ 160 + .enable_reg = _enable_reg, \ 161 + .enable_mask = BIT(_enable_mask), \ 162 + }, \ 163 + .status_reg = _status_reg, \ 164 + .qi = BIT(0), \ 165 + } 166 + 167 + static const unsigned int vsim1_voltages[] = { 168 + 0, 0, 0, 1700000, 1800000, 0, 0, 0, 2700000, 0, 0, 3000000, 3100000, 169 + }; 170 + 171 + static const unsigned int vibr_voltages[] = { 172 + 1200000, 1300000, 1500000, 0, 1800000, 2000000, 0, 0, 2700000, 2800000, 173 + 0, 3000000, 0, 3300000, 174 + }; 175 + 176 + static const unsigned int vrf12_voltages[] = { 177 + 0, 0, 1100000, 1200000, 1300000, 178 + }; 179 + 180 + static const unsigned int volt18_voltages[] = { 181 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1700000, 1800000, 1900000, 182 + }; 183 + 184 + static const unsigned int vcn13_voltages[] = { 185 + 900000, 1000000, 0, 1200000, 1300000, 186 + }; 187 + 188 + static const unsigned int vcn33_voltages[] = { 189 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2800000, 0, 0, 0, 3300000, 3400000, 3500000, 190 + }; 191 + 192 + static const unsigned int vefuse_voltages[] = { 193 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1700000, 1800000, 1900000, 2000000, 194 + }; 195 + 196 + static const unsigned int vxo22_voltages[] = { 197 + 1800000, 0, 0, 0, 2200000, 198 + }; 199 + 200 + static const unsigned int vrfck_voltages[] = { 201 + 0, 0, 1500000, 0, 0, 0, 0, 1600000, 0, 0, 0, 0, 1700000, 202 + }; 203 + 204 + static const unsigned int vrfck_voltages_1[] = { 205 + 1240000, 1600000, 206 + }; 207 + 208 + static const unsigned int vio28_voltages[] = { 209 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2800000, 2900000, 3000000, 3100000, 3300000, 210 + }; 211 + 212 + static const unsigned int vemc_voltages[] = { 213 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2900000, 3000000, 0, 3300000, 214 + }; 215 + 216 + static const unsigned int vemc_voltages_1[] = { 217 + 0, 0, 0, 0, 0, 0, 0, 0, 2500000, 2800000, 2900000, 3000000, 3100000, 218 + 3300000, 219 + }; 220 + 221 + static const unsigned int va12_voltages[] = { 222 + 0, 0, 0, 0, 0, 0, 1200000, 1300000, 223 + }; 224 + 225 + static const unsigned int va09_voltages[] = { 226 + 0, 0, 800000, 900000, 0, 0, 1200000, 227 + }; 228 + 229 + static const unsigned int vrf18_voltages[] = { 230 + 0, 0, 0, 0, 0, 1700000, 1800000, 1810000, 231 + }; 232 + 233 + static const unsigned int vbbck_voltages[] = { 234 + 0, 0, 0, 0, 1100000, 0, 0, 0, 1150000, 0, 0, 0, 1200000, 235 + }; 236 + 237 + static const unsigned int vsim2_voltages[] = { 238 + 0, 0, 0, 1700000, 1800000, 0, 0, 0, 2700000, 0, 0, 3000000, 3100000, 239 + }; 240 + 241 + static inline unsigned int mt6359_map_mode(unsigned int mode) 242 + { 243 + switch (mode) { 244 + case MT6359_BUCK_MODE_NORMAL: 245 + return REGULATOR_MODE_NORMAL; 246 + case MT6359_BUCK_MODE_FORCE_PWM: 247 + return REGULATOR_MODE_FAST; 248 + case MT6359_BUCK_MODE_LP: 249 + return REGULATOR_MODE_IDLE; 250 + default: 251 + return REGULATOR_MODE_INVALID; 252 + } 253 + } 254 + 255 + static int mt6359_get_status(struct regulator_dev *rdev) 256 + { 257 + int ret; 258 + u32 regval; 259 + struct mt6359_regulator_info *info = rdev_get_drvdata(rdev); 260 + 261 + ret = regmap_read(rdev->regmap, info->status_reg, &regval); 262 + if (ret != 0) { 263 + dev_err(&rdev->dev, "Failed to get enable reg: %d\n", ret); 264 + return ret; 265 + } 266 + 267 + if (regval & info->qi) 268 + return REGULATOR_STATUS_ON; 269 + else 270 + return REGULATOR_STATUS_OFF; 271 + } 272 + 273 + static unsigned int mt6359_regulator_get_mode(struct regulator_dev *rdev) 274 + { 275 + struct mt6359_regulator_info *info = rdev_get_drvdata(rdev); 276 + int ret, regval; 277 + 278 + ret = regmap_read(rdev->regmap, info->modeset_reg, &regval); 279 + if (ret != 0) { 280 + dev_err(&rdev->dev, 281 + "Failed to get mt6359 buck mode: %d\n", ret); 282 + return ret; 283 + } 284 + 285 + if ((regval & info->modeset_mask) >> info->modeset_shift == 286 + MT6359_BUCK_MODE_FORCE_PWM) 287 + return REGULATOR_MODE_FAST; 288 + 289 + ret = regmap_read(rdev->regmap, info->lp_mode_reg, &regval); 290 + if (ret != 0) { 291 + dev_err(&rdev->dev, 292 + "Failed to get mt6359 buck lp mode: %d\n", ret); 293 + return ret; 294 + } 295 + 296 + if (regval & info->lp_mode_mask) 297 + return REGULATOR_MODE_IDLE; 298 + else 299 + return REGULATOR_MODE_NORMAL; 300 + } 301 + 302 + static int mt6359_regulator_set_mode(struct regulator_dev *rdev, 303 + unsigned int mode) 304 + { 305 + struct mt6359_regulator_info *info = rdev_get_drvdata(rdev); 306 + int ret = 0, val; 307 + int curr_mode; 308 + 309 + curr_mode = mt6359_regulator_get_mode(rdev); 310 + switch (mode) { 311 + case REGULATOR_MODE_FAST: 312 + val = MT6359_BUCK_MODE_FORCE_PWM; 313 + val <<= info->modeset_shift; 314 + ret = regmap_update_bits(rdev->regmap, 315 + info->modeset_reg, 316 + info->modeset_mask, 317 + val); 318 + break; 319 + case REGULATOR_MODE_NORMAL: 320 + if (curr_mode == REGULATOR_MODE_FAST) { 321 + val = MT6359_BUCK_MODE_AUTO; 322 + val <<= info->modeset_shift; 323 + ret = regmap_update_bits(rdev->regmap, 324 + info->modeset_reg, 325 + info->modeset_mask, 326 + val); 327 + } else if (curr_mode == REGULATOR_MODE_IDLE) { 328 + val = MT6359_BUCK_MODE_NORMAL; 329 + val <<= info->lp_mode_shift; 330 + ret = regmap_update_bits(rdev->regmap, 331 + info->lp_mode_reg, 332 + info->lp_mode_mask, 333 + val); 334 + udelay(100); 335 + } 336 + break; 337 + case REGULATOR_MODE_IDLE: 338 + val = MT6359_BUCK_MODE_LP >> 1; 339 + val <<= info->lp_mode_shift; 340 + ret = regmap_update_bits(rdev->regmap, 341 + info->lp_mode_reg, 342 + info->lp_mode_mask, 343 + val); 344 + break; 345 + default: 346 + return -EINVAL; 347 + } 348 + 349 + if (ret != 0) { 350 + dev_err(&rdev->dev, 351 + "Failed to set mt6359 buck mode: %d\n", ret); 352 + } 353 + 354 + return ret; 355 + } 356 + 357 + static int mt6359p_vemc_set_voltage_sel(struct regulator_dev *rdev, 358 + u32 sel) 359 + { 360 + struct mt6359_regulator_info *info = rdev_get_drvdata(rdev); 361 + int ret; 362 + u32 val = 0; 363 + 364 + sel <<= ffs(info->desc.vsel_mask) - 1; 365 + ret = regmap_write(rdev->regmap, MT6359P_TMA_KEY_ADDR, TMA_KEY); 366 + if (ret) 367 + return ret; 368 + 369 + ret = regmap_read(rdev->regmap, MT6359P_VM_MODE_ADDR, &val); 370 + if (ret) 371 + return ret; 372 + 373 + switch (val) { 374 + case 0: 375 + /* If HW trapping is 0, use VEMC_VOSEL_0 */ 376 + ret = regmap_update_bits(rdev->regmap, 377 + info->desc.vsel_reg, 378 + info->desc.vsel_mask, sel); 379 + break; 380 + case 1: 381 + /* If HW trapping is 1, use VEMC_VOSEL_1 */ 382 + ret = regmap_update_bits(rdev->regmap, 383 + info->desc.vsel_reg + 0x2, 384 + info->desc.vsel_mask, sel); 385 + break; 386 + default: 387 + return -EINVAL; 388 + } 389 + 390 + if (ret) 391 + return ret; 392 + 393 + ret = regmap_write(rdev->regmap, MT6359P_TMA_KEY_ADDR, 0); 394 + return ret; 395 + } 396 + 397 + static int mt6359p_vemc_get_voltage_sel(struct regulator_dev *rdev) 398 + { 399 + struct mt6359_regulator_info *info = rdev_get_drvdata(rdev); 400 + int ret; 401 + u32 val = 0; 402 + 403 + ret = regmap_read(rdev->regmap, MT6359P_VM_MODE_ADDR, &val); 404 + if (ret) 405 + return ret; 406 + switch (val) { 407 + case 0: 408 + /* If HW trapping is 0, use VEMC_VOSEL_0 */ 409 + ret = regmap_read(rdev->regmap, 410 + info->desc.vsel_reg, &val); 411 + break; 412 + case 1: 413 + /* If HW trapping is 1, use VEMC_VOSEL_1 */ 414 + ret = regmap_read(rdev->regmap, 415 + info->desc.vsel_reg + 0x2, &val); 416 + break; 417 + default: 418 + return -EINVAL; 419 + } 420 + if (ret) 421 + return ret; 422 + 423 + val &= info->desc.vsel_mask; 424 + val >>= ffs(info->desc.vsel_mask) - 1; 425 + 426 + return val; 427 + } 428 + 429 + static const struct regulator_ops mt6359_volt_linear_ops = { 430 + .list_voltage = regulator_list_voltage_linear, 431 + .map_voltage = regulator_map_voltage_linear, 432 + .set_voltage_sel = regulator_set_voltage_sel_regmap, 433 + .get_voltage_sel = regulator_get_voltage_sel_regmap, 434 + .set_voltage_time_sel = regulator_set_voltage_time_sel, 435 + .enable = regulator_enable_regmap, 436 + .disable = regulator_disable_regmap, 437 + .is_enabled = regulator_is_enabled_regmap, 438 + .get_status = mt6359_get_status, 439 + .set_mode = mt6359_regulator_set_mode, 440 + .get_mode = mt6359_regulator_get_mode, 441 + }; 442 + 443 + static const struct regulator_ops mt6359_volt_table_ops = { 444 + .list_voltage = regulator_list_voltage_table, 445 + .map_voltage = regulator_map_voltage_iterate, 446 + .set_voltage_sel = regulator_set_voltage_sel_regmap, 447 + .get_voltage_sel = regulator_get_voltage_sel_regmap, 448 + .set_voltage_time_sel = regulator_set_voltage_time_sel, 449 + .enable = regulator_enable_regmap, 450 + .disable = regulator_disable_regmap, 451 + .is_enabled = regulator_is_enabled_regmap, 452 + .get_status = mt6359_get_status, 453 + }; 454 + 455 + static const struct regulator_ops mt6359_volt_fixed_ops = { 456 + .enable = regulator_enable_regmap, 457 + .disable = regulator_disable_regmap, 458 + .is_enabled = regulator_is_enabled_regmap, 459 + .get_status = mt6359_get_status, 460 + }; 461 + 462 + static const struct regulator_ops mt6359p_vemc_ops = { 463 + .list_voltage = regulator_list_voltage_table, 464 + .map_voltage = regulator_map_voltage_iterate, 465 + .set_voltage_sel = mt6359p_vemc_set_voltage_sel, 466 + .get_voltage_sel = mt6359p_vemc_get_voltage_sel, 467 + .set_voltage_time_sel = regulator_set_voltage_time_sel, 468 + .enable = regulator_enable_regmap, 469 + .disable = regulator_disable_regmap, 470 + .is_enabled = regulator_is_enabled_regmap, 471 + .get_status = mt6359_get_status, 472 + }; 473 + 474 + /* The array is indexed by id(MT6359_ID_XXX) */ 475 + static struct mt6359_regulator_info mt6359_regulators[] = { 476 + MT6359_BUCK("buck_vs1", VS1, 800000, 2200000, 12500, 477 + MT6359_RG_BUCK_VS1_EN_ADDR, 478 + MT6359_DA_VS1_EN_ADDR, MT6359_RG_BUCK_VS1_VOSEL_ADDR, 479 + MT6359_RG_BUCK_VS1_VOSEL_MASK << 480 + MT6359_RG_BUCK_VS1_VOSEL_SHIFT, 481 + MT6359_RG_BUCK_VS1_LP_ADDR, MT6359_RG_BUCK_VS1_LP_SHIFT, 482 + MT6359_RG_VS1_FPWM_ADDR, MT6359_RG_VS1_FPWM_SHIFT), 483 + MT6359_BUCK("buck_vgpu11", VGPU11, 400000, 1193750, 6250, 484 + MT6359_RG_BUCK_VGPU11_EN_ADDR, 485 + MT6359_DA_VGPU11_EN_ADDR, MT6359_RG_BUCK_VGPU11_VOSEL_ADDR, 486 + MT6359_RG_BUCK_VGPU11_VOSEL_MASK << 487 + MT6359_RG_BUCK_VGPU11_VOSEL_SHIFT, 488 + MT6359_RG_BUCK_VGPU11_LP_ADDR, 489 + MT6359_RG_BUCK_VGPU11_LP_SHIFT, 490 + MT6359_RG_VGPU11_FCCM_ADDR, MT6359_RG_VGPU11_FCCM_SHIFT), 491 + MT6359_BUCK("buck_vmodem", VMODEM, 400000, 1100000, 6250, 492 + MT6359_RG_BUCK_VMODEM_EN_ADDR, 493 + MT6359_DA_VMODEM_EN_ADDR, MT6359_RG_BUCK_VMODEM_VOSEL_ADDR, 494 + MT6359_RG_BUCK_VMODEM_VOSEL_MASK << 495 + MT6359_RG_BUCK_VMODEM_VOSEL_SHIFT, 496 + MT6359_RG_BUCK_VMODEM_LP_ADDR, 497 + MT6359_RG_BUCK_VMODEM_LP_SHIFT, 498 + MT6359_RG_VMODEM_FCCM_ADDR, MT6359_RG_VMODEM_FCCM_SHIFT), 499 + MT6359_BUCK("buck_vpu", VPU, 400000, 1193750, 6250, 500 + MT6359_RG_BUCK_VPU_EN_ADDR, 501 + MT6359_DA_VPU_EN_ADDR, MT6359_RG_BUCK_VPU_VOSEL_ADDR, 502 + MT6359_RG_BUCK_VPU_VOSEL_MASK << 503 + MT6359_RG_BUCK_VPU_VOSEL_SHIFT, 504 + MT6359_RG_BUCK_VPU_LP_ADDR, MT6359_RG_BUCK_VPU_LP_SHIFT, 505 + MT6359_RG_VPU_FCCM_ADDR, MT6359_RG_VPU_FCCM_SHIFT), 506 + MT6359_BUCK("buck_vcore", VCORE, 400000, 1193750, 6250, 507 + MT6359_RG_BUCK_VCORE_EN_ADDR, 508 + MT6359_DA_VCORE_EN_ADDR, MT6359_RG_BUCK_VCORE_VOSEL_ADDR, 509 + MT6359_RG_BUCK_VCORE_VOSEL_MASK << 510 + MT6359_RG_BUCK_VCORE_VOSEL_SHIFT, 511 + MT6359_RG_BUCK_VCORE_LP_ADDR, MT6359_RG_BUCK_VCORE_LP_SHIFT, 512 + MT6359_RG_VCORE_FCCM_ADDR, MT6359_RG_VCORE_FCCM_SHIFT), 513 + MT6359_BUCK("buck_vs2", VS2, 800000, 1600000, 12500, 514 + MT6359_RG_BUCK_VS2_EN_ADDR, 515 + MT6359_DA_VS2_EN_ADDR, MT6359_RG_BUCK_VS2_VOSEL_ADDR, 516 + MT6359_RG_BUCK_VS2_VOSEL_MASK << 517 + MT6359_RG_BUCK_VS2_VOSEL_SHIFT, 518 + MT6359_RG_BUCK_VS2_LP_ADDR, MT6359_RG_BUCK_VS2_LP_SHIFT, 519 + MT6359_RG_VS2_FPWM_ADDR, MT6359_RG_VS2_FPWM_SHIFT), 520 + MT6359_BUCK("buck_vpa", VPA, 500000, 3650000, 50000, 521 + MT6359_RG_BUCK_VPA_EN_ADDR, 522 + MT6359_DA_VPA_EN_ADDR, MT6359_RG_BUCK_VPA_VOSEL_ADDR, 523 + MT6359_RG_BUCK_VPA_VOSEL_MASK << 524 + MT6359_RG_BUCK_VPA_VOSEL_SHIFT, 525 + MT6359_RG_BUCK_VPA_LP_ADDR, MT6359_RG_BUCK_VPA_LP_SHIFT, 526 + MT6359_RG_VPA_MODESET_ADDR, MT6359_RG_VPA_MODESET_SHIFT), 527 + MT6359_BUCK("buck_vproc2", VPROC2, 400000, 1193750, 6250, 528 + MT6359_RG_BUCK_VPROC2_EN_ADDR, 529 + MT6359_DA_VPROC2_EN_ADDR, MT6359_RG_BUCK_VPROC2_VOSEL_ADDR, 530 + MT6359_RG_BUCK_VPROC2_VOSEL_MASK << 531 + MT6359_RG_BUCK_VPROC2_VOSEL_SHIFT, 532 + MT6359_RG_BUCK_VPROC2_LP_ADDR, 533 + MT6359_RG_BUCK_VPROC2_LP_SHIFT, 534 + MT6359_RG_VPROC2_FCCM_ADDR, MT6359_RG_VPROC2_FCCM_SHIFT), 535 + MT6359_BUCK("buck_vproc1", VPROC1, 400000, 1193750, 6250, 536 + MT6359_RG_BUCK_VPROC1_EN_ADDR, 537 + MT6359_DA_VPROC1_EN_ADDR, MT6359_RG_BUCK_VPROC1_VOSEL_ADDR, 538 + MT6359_RG_BUCK_VPROC1_VOSEL_MASK << 539 + MT6359_RG_BUCK_VPROC1_VOSEL_SHIFT, 540 + MT6359_RG_BUCK_VPROC1_LP_ADDR, 541 + MT6359_RG_BUCK_VPROC1_LP_SHIFT, 542 + MT6359_RG_VPROC1_FCCM_ADDR, MT6359_RG_VPROC1_FCCM_SHIFT), 543 + MT6359_BUCK("buck_vcore_sshub", VCORE_SSHUB, 400000, 1193750, 6250, 544 + MT6359_RG_BUCK_VCORE_SSHUB_EN_ADDR, 545 + MT6359_DA_VCORE_EN_ADDR, 546 + MT6359_RG_BUCK_VCORE_SSHUB_VOSEL_ADDR, 547 + MT6359_RG_BUCK_VCORE_SSHUB_VOSEL_MASK << 548 + MT6359_RG_BUCK_VCORE_SSHUB_VOSEL_SHIFT, 549 + MT6359_RG_BUCK_VCORE_LP_ADDR, MT6359_RG_BUCK_VCORE_LP_SHIFT, 550 + MT6359_RG_VCORE_FCCM_ADDR, MT6359_RG_VCORE_FCCM_SHIFT), 551 + MT6359_REG_FIXED("ldo_vaud18", VAUD18, MT6359_RG_LDO_VAUD18_EN_ADDR, 552 + MT6359_DA_VAUD18_B_EN_ADDR, 1800000), 553 + MT6359_LDO("ldo_vsim1", VSIM1, vsim1_voltages, 554 + MT6359_RG_LDO_VSIM1_EN_ADDR, MT6359_RG_LDO_VSIM1_EN_SHIFT, 555 + MT6359_DA_VSIM1_B_EN_ADDR, MT6359_RG_VSIM1_VOSEL_ADDR, 556 + MT6359_RG_VSIM1_VOSEL_MASK << MT6359_RG_VSIM1_VOSEL_SHIFT, 557 + 480), 558 + MT6359_LDO("ldo_vibr", VIBR, vibr_voltages, 559 + MT6359_RG_LDO_VIBR_EN_ADDR, MT6359_RG_LDO_VIBR_EN_SHIFT, 560 + MT6359_DA_VIBR_B_EN_ADDR, MT6359_RG_VIBR_VOSEL_ADDR, 561 + MT6359_RG_VIBR_VOSEL_MASK << MT6359_RG_VIBR_VOSEL_SHIFT, 562 + 240), 563 + MT6359_LDO("ldo_vrf12", VRF12, vrf12_voltages, 564 + MT6359_RG_LDO_VRF12_EN_ADDR, MT6359_RG_LDO_VRF12_EN_SHIFT, 565 + MT6359_DA_VRF12_B_EN_ADDR, MT6359_RG_VRF12_VOSEL_ADDR, 566 + MT6359_RG_VRF12_VOSEL_MASK << MT6359_RG_VRF12_VOSEL_SHIFT, 567 + 120), 568 + MT6359_REG_FIXED("ldo_vusb", VUSB, MT6359_RG_LDO_VUSB_EN_0_ADDR, 569 + MT6359_DA_VUSB_B_EN_ADDR, 3000000), 570 + MT6359_LDO_LINEAR("ldo_vsram_proc2", VSRAM_PROC2, 500000, 1293750, 6250, 571 + MT6359_RG_LDO_VSRAM_PROC2_EN_ADDR, 572 + MT6359_DA_VSRAM_PROC2_B_EN_ADDR, 573 + MT6359_RG_LDO_VSRAM_PROC2_VOSEL_ADDR, 574 + MT6359_RG_LDO_VSRAM_PROC2_VOSEL_MASK << 575 + MT6359_RG_LDO_VSRAM_PROC2_VOSEL_SHIFT), 576 + MT6359_LDO("ldo_vio18", VIO18, volt18_voltages, 577 + MT6359_RG_LDO_VIO18_EN_ADDR, MT6359_RG_LDO_VIO18_EN_SHIFT, 578 + MT6359_DA_VIO18_B_EN_ADDR, MT6359_RG_VIO18_VOSEL_ADDR, 579 + MT6359_RG_VIO18_VOSEL_MASK << MT6359_RG_VIO18_VOSEL_SHIFT, 580 + 960), 581 + MT6359_LDO("ldo_vcamio", VCAMIO, volt18_voltages, 582 + MT6359_RG_LDO_VCAMIO_EN_ADDR, MT6359_RG_LDO_VCAMIO_EN_SHIFT, 583 + MT6359_DA_VCAMIO_B_EN_ADDR, MT6359_RG_VCAMIO_VOSEL_ADDR, 584 + MT6359_RG_VCAMIO_VOSEL_MASK << MT6359_RG_VCAMIO_VOSEL_SHIFT, 585 + 1290), 586 + MT6359_REG_FIXED("ldo_vcn18", VCN18, MT6359_RG_LDO_VCN18_EN_ADDR, 587 + MT6359_DA_VCN18_B_EN_ADDR, 1800000), 588 + MT6359_REG_FIXED("ldo_vfe28", VFE28, MT6359_RG_LDO_VFE28_EN_ADDR, 589 + MT6359_DA_VFE28_B_EN_ADDR, 2800000), 590 + MT6359_LDO("ldo_vcn13", VCN13, vcn13_voltages, 591 + MT6359_RG_LDO_VCN13_EN_ADDR, MT6359_RG_LDO_VCN13_EN_SHIFT, 592 + MT6359_DA_VCN13_B_EN_ADDR, MT6359_RG_VCN13_VOSEL_ADDR, 593 + MT6359_RG_VCN13_VOSEL_MASK << MT6359_RG_VCN13_VOSEL_SHIFT, 594 + 240), 595 + MT6359_LDO("ldo_vcn33_1_bt", VCN33_1_BT, vcn33_voltages, 596 + MT6359_RG_LDO_VCN33_1_EN_0_ADDR, 597 + MT6359_RG_LDO_VCN33_1_EN_0_SHIFT, 598 + MT6359_DA_VCN33_1_B_EN_ADDR, MT6359_RG_VCN33_1_VOSEL_ADDR, 599 + MT6359_RG_VCN33_1_VOSEL_MASK << 600 + MT6359_RG_VCN33_1_VOSEL_SHIFT, 240), 601 + MT6359_LDO("ldo_vcn33_1_wifi", VCN33_1_WIFI, vcn33_voltages, 602 + MT6359_RG_LDO_VCN33_1_EN_1_ADDR, 603 + MT6359_RG_LDO_VCN33_1_EN_1_SHIFT, 604 + MT6359_DA_VCN33_1_B_EN_ADDR, MT6359_RG_VCN33_1_VOSEL_ADDR, 605 + MT6359_RG_VCN33_1_VOSEL_MASK << 606 + MT6359_RG_VCN33_1_VOSEL_SHIFT, 240), 607 + MT6359_REG_FIXED("ldo_vaux18", VAUX18, MT6359_RG_LDO_VAUX18_EN_ADDR, 608 + MT6359_DA_VAUX18_B_EN_ADDR, 1800000), 609 + MT6359_LDO_LINEAR("ldo_vsram_others", VSRAM_OTHERS, 500000, 1293750, 610 + 6250, 611 + MT6359_RG_LDO_VSRAM_OTHERS_EN_ADDR, 612 + MT6359_DA_VSRAM_OTHERS_B_EN_ADDR, 613 + MT6359_RG_LDO_VSRAM_OTHERS_VOSEL_ADDR, 614 + MT6359_RG_LDO_VSRAM_OTHERS_VOSEL_MASK << 615 + MT6359_RG_LDO_VSRAM_OTHERS_VOSEL_SHIFT), 616 + MT6359_LDO("ldo_vefuse", VEFUSE, vefuse_voltages, 617 + MT6359_RG_LDO_VEFUSE_EN_ADDR, MT6359_RG_LDO_VEFUSE_EN_SHIFT, 618 + MT6359_DA_VEFUSE_B_EN_ADDR, MT6359_RG_VEFUSE_VOSEL_ADDR, 619 + MT6359_RG_VEFUSE_VOSEL_MASK << MT6359_RG_VEFUSE_VOSEL_SHIFT, 620 + 240), 621 + MT6359_LDO("ldo_vxo22", VXO22, vxo22_voltages, 622 + MT6359_RG_LDO_VXO22_EN_ADDR, MT6359_RG_LDO_VXO22_EN_SHIFT, 623 + MT6359_DA_VXO22_B_EN_ADDR, MT6359_RG_VXO22_VOSEL_ADDR, 624 + MT6359_RG_VXO22_VOSEL_MASK << MT6359_RG_VXO22_VOSEL_SHIFT, 625 + 120), 626 + MT6359_LDO("ldo_vrfck", VRFCK, vrfck_voltages, 627 + MT6359_RG_LDO_VRFCK_EN_ADDR, MT6359_RG_LDO_VRFCK_EN_SHIFT, 628 + MT6359_DA_VRFCK_B_EN_ADDR, MT6359_RG_VRFCK_VOSEL_ADDR, 629 + MT6359_RG_VRFCK_VOSEL_MASK << MT6359_RG_VRFCK_VOSEL_SHIFT, 630 + 480), 631 + MT6359_REG_FIXED("ldo_vbif28", VBIF28, MT6359_RG_LDO_VBIF28_EN_ADDR, 632 + MT6359_DA_VBIF28_B_EN_ADDR, 2800000), 633 + MT6359_LDO("ldo_vio28", VIO28, vio28_voltages, 634 + MT6359_RG_LDO_VIO28_EN_ADDR, MT6359_RG_LDO_VIO28_EN_SHIFT, 635 + MT6359_DA_VIO28_B_EN_ADDR, MT6359_RG_VIO28_VOSEL_ADDR, 636 + MT6359_RG_VIO28_VOSEL_MASK << MT6359_RG_VIO28_VOSEL_SHIFT, 637 + 240), 638 + MT6359_LDO("ldo_vemc", VEMC, vemc_voltages, 639 + MT6359_RG_LDO_VEMC_EN_ADDR, MT6359_RG_LDO_VEMC_EN_SHIFT, 640 + MT6359_DA_VEMC_B_EN_ADDR, MT6359_RG_VEMC_VOSEL_ADDR, 641 + MT6359_RG_VEMC_VOSEL_MASK << MT6359_RG_VEMC_VOSEL_SHIFT, 642 + 240), 643 + MT6359_LDO("ldo_vcn33_2_bt", VCN33_2_BT, vcn33_voltages, 644 + MT6359_RG_LDO_VCN33_2_EN_0_ADDR, 645 + MT6359_RG_LDO_VCN33_2_EN_0_SHIFT, 646 + MT6359_DA_VCN33_2_B_EN_ADDR, MT6359_RG_VCN33_2_VOSEL_ADDR, 647 + MT6359_RG_VCN33_2_VOSEL_MASK << 648 + MT6359_RG_VCN33_2_VOSEL_SHIFT, 240), 649 + MT6359_LDO("ldo_vcn33_2_wifi", VCN33_2_WIFI, vcn33_voltages, 650 + MT6359_RG_LDO_VCN33_2_EN_1_ADDR, 651 + MT6359_RG_LDO_VCN33_2_EN_1_SHIFT, 652 + MT6359_DA_VCN33_2_B_EN_ADDR, MT6359_RG_VCN33_2_VOSEL_ADDR, 653 + MT6359_RG_VCN33_2_VOSEL_MASK << 654 + MT6359_RG_VCN33_2_VOSEL_SHIFT, 240), 655 + MT6359_LDO("ldo_va12", VA12, va12_voltages, 656 + MT6359_RG_LDO_VA12_EN_ADDR, MT6359_RG_LDO_VA12_EN_SHIFT, 657 + MT6359_DA_VA12_B_EN_ADDR, MT6359_RG_VA12_VOSEL_ADDR, 658 + MT6359_RG_VA12_VOSEL_MASK << MT6359_RG_VA12_VOSEL_SHIFT, 659 + 240), 660 + MT6359_LDO("ldo_va09", VA09, va09_voltages, 661 + MT6359_RG_LDO_VA09_EN_ADDR, MT6359_RG_LDO_VA09_EN_SHIFT, 662 + MT6359_DA_VA09_B_EN_ADDR, MT6359_RG_VA09_VOSEL_ADDR, 663 + MT6359_RG_VA09_VOSEL_MASK << MT6359_RG_VA09_VOSEL_SHIFT, 664 + 240), 665 + MT6359_LDO("ldo_vrf18", VRF18, vrf18_voltages, 666 + MT6359_RG_LDO_VRF18_EN_ADDR, MT6359_RG_LDO_VRF18_EN_SHIFT, 667 + MT6359_DA_VRF18_B_EN_ADDR, MT6359_RG_VRF18_VOSEL_ADDR, 668 + MT6359_RG_VRF18_VOSEL_MASK << MT6359_RG_VRF18_VOSEL_SHIFT, 669 + 120), 670 + MT6359_LDO_LINEAR("ldo_vsram_md", VSRAM_MD, 500000, 1100000, 6250, 671 + MT6359_RG_LDO_VSRAM_MD_EN_ADDR, 672 + MT6359_DA_VSRAM_MD_B_EN_ADDR, 673 + MT6359_RG_LDO_VSRAM_MD_VOSEL_ADDR, 674 + MT6359_RG_LDO_VSRAM_MD_VOSEL_MASK << 675 + MT6359_RG_LDO_VSRAM_MD_VOSEL_SHIFT), 676 + MT6359_LDO("ldo_vufs", VUFS, volt18_voltages, 677 + MT6359_RG_LDO_VUFS_EN_ADDR, MT6359_RG_LDO_VUFS_EN_SHIFT, 678 + MT6359_DA_VUFS_B_EN_ADDR, MT6359_RG_VUFS_VOSEL_ADDR, 679 + MT6359_RG_VUFS_VOSEL_MASK << MT6359_RG_VUFS_VOSEL_SHIFT, 680 + 1920), 681 + MT6359_LDO("ldo_vm18", VM18, volt18_voltages, 682 + MT6359_RG_LDO_VM18_EN_ADDR, MT6359_RG_LDO_VM18_EN_SHIFT, 683 + MT6359_DA_VM18_B_EN_ADDR, MT6359_RG_VM18_VOSEL_ADDR, 684 + MT6359_RG_VM18_VOSEL_MASK << MT6359_RG_VM18_VOSEL_SHIFT, 685 + 1920), 686 + MT6359_LDO("ldo_vbbck", VBBCK, vbbck_voltages, 687 + MT6359_RG_LDO_VBBCK_EN_ADDR, MT6359_RG_LDO_VBBCK_EN_SHIFT, 688 + MT6359_DA_VBBCK_B_EN_ADDR, MT6359_RG_VBBCK_VOSEL_ADDR, 689 + MT6359_RG_VBBCK_VOSEL_MASK << MT6359_RG_VBBCK_VOSEL_SHIFT, 690 + 240), 691 + MT6359_LDO_LINEAR("ldo_vsram_proc1", VSRAM_PROC1, 500000, 1293750, 6250, 692 + MT6359_RG_LDO_VSRAM_PROC1_EN_ADDR, 693 + MT6359_DA_VSRAM_PROC1_B_EN_ADDR, 694 + MT6359_RG_LDO_VSRAM_PROC1_VOSEL_ADDR, 695 + MT6359_RG_LDO_VSRAM_PROC1_VOSEL_MASK << 696 + MT6359_RG_LDO_VSRAM_PROC1_VOSEL_SHIFT), 697 + MT6359_LDO("ldo_vsim2", VSIM2, vsim2_voltages, 698 + MT6359_RG_LDO_VSIM2_EN_ADDR, MT6359_RG_LDO_VSIM2_EN_SHIFT, 699 + MT6359_DA_VSIM2_B_EN_ADDR, MT6359_RG_VSIM2_VOSEL_ADDR, 700 + MT6359_RG_VSIM2_VOSEL_MASK << MT6359_RG_VSIM2_VOSEL_SHIFT, 701 + 480), 702 + MT6359_LDO_LINEAR("ldo_vsram_others_sshub", VSRAM_OTHERS_SSHUB, 703 + 500000, 1293750, 6250, 704 + MT6359_RG_LDO_VSRAM_OTHERS_SSHUB_EN_ADDR, 705 + MT6359_DA_VSRAM_OTHERS_B_EN_ADDR, 706 + MT6359_RG_LDO_VSRAM_OTHERS_SSHUB_VOSEL_ADDR, 707 + MT6359_RG_LDO_VSRAM_OTHERS_SSHUB_VOSEL_MASK << 708 + MT6359_RG_LDO_VSRAM_OTHERS_SSHUB_VOSEL_SHIFT), 709 + }; 710 + 711 + static struct mt6359_regulator_info mt6359p_regulators[] = { 712 + MT6359_BUCK("buck_vs1", VS1, 800000, 2200000, 12500, 713 + MT6359_RG_BUCK_VS1_EN_ADDR, 714 + MT6359_DA_VS1_EN_ADDR, MT6359_RG_BUCK_VS1_VOSEL_ADDR, 715 + MT6359_RG_BUCK_VS1_VOSEL_MASK << 716 + MT6359_RG_BUCK_VS1_VOSEL_SHIFT, 717 + MT6359_RG_BUCK_VS1_LP_ADDR, MT6359_RG_BUCK_VS1_LP_SHIFT, 718 + MT6359_RG_VS1_FPWM_ADDR, MT6359_RG_VS1_FPWM_SHIFT), 719 + MT6359_BUCK("buck_vgpu11", VGPU11, 400000, 1193750, 6250, 720 + MT6359_RG_BUCK_VGPU11_EN_ADDR, 721 + MT6359_DA_VGPU11_EN_ADDR, MT6359P_RG_BUCK_VGPU11_VOSEL_ADDR, 722 + MT6359_RG_BUCK_VGPU11_VOSEL_MASK << 723 + MT6359_RG_BUCK_VGPU11_VOSEL_SHIFT, 724 + MT6359_RG_BUCK_VGPU11_LP_ADDR, 725 + MT6359_RG_BUCK_VGPU11_LP_SHIFT, 726 + MT6359_RG_VGPU11_FCCM_ADDR, MT6359_RG_VGPU11_FCCM_SHIFT), 727 + MT6359_BUCK("buck_vmodem", VMODEM, 400000, 1100000, 6250, 728 + MT6359_RG_BUCK_VMODEM_EN_ADDR, 729 + MT6359_DA_VMODEM_EN_ADDR, MT6359_RG_BUCK_VMODEM_VOSEL_ADDR, 730 + MT6359_RG_BUCK_VMODEM_VOSEL_MASK << 731 + MT6359_RG_BUCK_VMODEM_VOSEL_SHIFT, 732 + MT6359_RG_BUCK_VMODEM_LP_ADDR, 733 + MT6359_RG_BUCK_VMODEM_LP_SHIFT, 734 + MT6359_RG_VMODEM_FCCM_ADDR, MT6359_RG_VMODEM_FCCM_SHIFT), 735 + MT6359_BUCK("buck_vpu", VPU, 400000, 1193750, 6250, 736 + MT6359_RG_BUCK_VPU_EN_ADDR, 737 + MT6359_DA_VPU_EN_ADDR, MT6359_RG_BUCK_VPU_VOSEL_ADDR, 738 + MT6359_RG_BUCK_VPU_VOSEL_MASK << 739 + MT6359_RG_BUCK_VPU_VOSEL_SHIFT, 740 + MT6359_RG_BUCK_VPU_LP_ADDR, MT6359_RG_BUCK_VPU_LP_SHIFT, 741 + MT6359_RG_VPU_FCCM_ADDR, MT6359_RG_VPU_FCCM_SHIFT), 742 + MT6359_BUCK("buck_vcore", VCORE, 506250, 1300000, 6250, 743 + MT6359_RG_BUCK_VCORE_EN_ADDR, 744 + MT6359_DA_VCORE_EN_ADDR, MT6359P_RG_BUCK_VCORE_VOSEL_ADDR, 745 + MT6359_RG_BUCK_VCORE_VOSEL_MASK << 746 + MT6359_RG_BUCK_VCORE_VOSEL_SHIFT, 747 + MT6359_RG_BUCK_VCORE_LP_ADDR, MT6359_RG_BUCK_VCORE_LP_SHIFT, 748 + MT6359_RG_VCORE_FCCM_ADDR, MT6359_RG_VCORE_FCCM_SHIFT), 749 + MT6359_BUCK("buck_vs2", VS2, 800000, 1600000, 12500, 750 + MT6359_RG_BUCK_VS2_EN_ADDR, 751 + MT6359_DA_VS2_EN_ADDR, MT6359_RG_BUCK_VS2_VOSEL_ADDR, 752 + MT6359_RG_BUCK_VS2_VOSEL_MASK << 753 + MT6359_RG_BUCK_VS2_VOSEL_SHIFT, 754 + MT6359_RG_BUCK_VS2_LP_ADDR, MT6359_RG_BUCK_VS2_LP_SHIFT, 755 + MT6359_RG_VS2_FPWM_ADDR, MT6359_RG_VS2_FPWM_SHIFT), 756 + MT6359_BUCK("buck_vpa", VPA, 500000, 3650000, 50000, 757 + MT6359_RG_BUCK_VPA_EN_ADDR, 758 + MT6359_DA_VPA_EN_ADDR, MT6359_RG_BUCK_VPA_VOSEL_ADDR, 759 + MT6359_RG_BUCK_VPA_VOSEL_MASK << 760 + MT6359_RG_BUCK_VPA_VOSEL_SHIFT, 761 + MT6359_RG_BUCK_VPA_LP_ADDR, MT6359_RG_BUCK_VPA_LP_SHIFT, 762 + MT6359_RG_VPA_MODESET_ADDR, MT6359_RG_VPA_MODESET_SHIFT), 763 + MT6359_BUCK("buck_vproc2", VPROC2, 400000, 1193750, 6250, 764 + MT6359_RG_BUCK_VPROC2_EN_ADDR, 765 + MT6359_DA_VPROC2_EN_ADDR, MT6359_RG_BUCK_VPROC2_VOSEL_ADDR, 766 + MT6359_RG_BUCK_VPROC2_VOSEL_MASK << 767 + MT6359_RG_BUCK_VPROC2_VOSEL_SHIFT, 768 + MT6359_RG_BUCK_VPROC2_LP_ADDR, 769 + MT6359_RG_BUCK_VPROC2_LP_SHIFT, 770 + MT6359_RG_VPROC2_FCCM_ADDR, MT6359_RG_VPROC2_FCCM_SHIFT), 771 + MT6359_BUCK("buck_vproc1", VPROC1, 400000, 1193750, 6250, 772 + MT6359_RG_BUCK_VPROC1_EN_ADDR, 773 + MT6359_DA_VPROC1_EN_ADDR, MT6359_RG_BUCK_VPROC1_VOSEL_ADDR, 774 + MT6359_RG_BUCK_VPROC1_VOSEL_MASK << 775 + MT6359_RG_BUCK_VPROC1_VOSEL_SHIFT, 776 + MT6359_RG_BUCK_VPROC1_LP_ADDR, 777 + MT6359_RG_BUCK_VPROC1_LP_SHIFT, 778 + MT6359_RG_VPROC1_FCCM_ADDR, MT6359_RG_VPROC1_FCCM_SHIFT), 779 + MT6359_BUCK("buck_vgpu11_sshub", VGPU11_SSHUB, 400000, 1193750, 6250, 780 + MT6359P_RG_BUCK_VGPU11_SSHUB_EN_ADDR, 781 + MT6359_DA_VGPU11_EN_ADDR, 782 + MT6359P_RG_BUCK_VGPU11_SSHUB_VOSEL_ADDR, 783 + MT6359P_RG_BUCK_VGPU11_SSHUB_VOSEL_MASK << 784 + MT6359P_RG_BUCK_VGPU11_SSHUB_VOSEL_SHIFT, 785 + MT6359_RG_BUCK_VGPU11_LP_ADDR, 786 + MT6359_RG_BUCK_VGPU11_LP_SHIFT, 787 + MT6359_RG_VGPU11_FCCM_ADDR, MT6359_RG_VGPU11_FCCM_SHIFT), 788 + MT6359_REG_FIXED("ldo_vaud18", VAUD18, MT6359P_RG_LDO_VAUD18_EN_ADDR, 789 + MT6359P_DA_VAUD18_B_EN_ADDR, 1800000), 790 + MT6359_LDO("ldo_vsim1", VSIM1, vsim1_voltages, 791 + MT6359P_RG_LDO_VSIM1_EN_ADDR, MT6359P_RG_LDO_VSIM1_EN_SHIFT, 792 + MT6359P_DA_VSIM1_B_EN_ADDR, MT6359P_RG_VSIM1_VOSEL_ADDR, 793 + MT6359_RG_VSIM1_VOSEL_MASK << MT6359_RG_VSIM1_VOSEL_SHIFT, 794 + 480), 795 + MT6359_LDO("ldo_vibr", VIBR, vibr_voltages, 796 + MT6359P_RG_LDO_VIBR_EN_ADDR, MT6359P_RG_LDO_VIBR_EN_SHIFT, 797 + MT6359P_DA_VIBR_B_EN_ADDR, MT6359P_RG_VIBR_VOSEL_ADDR, 798 + MT6359_RG_VIBR_VOSEL_MASK << MT6359_RG_VIBR_VOSEL_SHIFT, 799 + 240), 800 + MT6359_LDO("ldo_vrf12", VRF12, vrf12_voltages, 801 + MT6359P_RG_LDO_VRF12_EN_ADDR, MT6359P_RG_LDO_VRF12_EN_SHIFT, 802 + MT6359P_DA_VRF12_B_EN_ADDR, MT6359P_RG_VRF12_VOSEL_ADDR, 803 + MT6359_RG_VRF12_VOSEL_MASK << MT6359_RG_VRF12_VOSEL_SHIFT, 804 + 480), 805 + MT6359_REG_FIXED("ldo_vusb", VUSB, MT6359P_RG_LDO_VUSB_EN_0_ADDR, 806 + MT6359P_DA_VUSB_B_EN_ADDR, 3000000), 807 + MT6359_LDO_LINEAR("ldo_vsram_proc2", VSRAM_PROC2, 500000, 1293750, 6250, 808 + MT6359P_RG_LDO_VSRAM_PROC2_EN_ADDR, 809 + MT6359P_DA_VSRAM_PROC2_B_EN_ADDR, 810 + MT6359P_RG_LDO_VSRAM_PROC2_VOSEL_ADDR, 811 + MT6359_RG_LDO_VSRAM_PROC2_VOSEL_MASK << 812 + MT6359_RG_LDO_VSRAM_PROC2_VOSEL_SHIFT), 813 + MT6359_LDO("ldo_vio18", VIO18, volt18_voltages, 814 + MT6359P_RG_LDO_VIO18_EN_ADDR, MT6359P_RG_LDO_VIO18_EN_SHIFT, 815 + MT6359P_DA_VIO18_B_EN_ADDR, MT6359P_RG_VIO18_VOSEL_ADDR, 816 + MT6359_RG_VIO18_VOSEL_MASK << MT6359_RG_VIO18_VOSEL_SHIFT, 817 + 960), 818 + MT6359_LDO("ldo_vcamio", VCAMIO, volt18_voltages, 819 + MT6359P_RG_LDO_VCAMIO_EN_ADDR, 820 + MT6359P_RG_LDO_VCAMIO_EN_SHIFT, 821 + MT6359P_DA_VCAMIO_B_EN_ADDR, MT6359P_RG_VCAMIO_VOSEL_ADDR, 822 + MT6359_RG_VCAMIO_VOSEL_MASK << MT6359_RG_VCAMIO_VOSEL_SHIFT, 823 + 1290), 824 + MT6359_REG_FIXED("ldo_vcn18", VCN18, MT6359P_RG_LDO_VCN18_EN_ADDR, 825 + MT6359P_DA_VCN18_B_EN_ADDR, 1800000), 826 + MT6359_REG_FIXED("ldo_vfe28", VFE28, MT6359P_RG_LDO_VFE28_EN_ADDR, 827 + MT6359P_DA_VFE28_B_EN_ADDR, 2800000), 828 + MT6359_LDO("ldo_vcn13", VCN13, vcn13_voltages, 829 + MT6359P_RG_LDO_VCN13_EN_ADDR, MT6359P_RG_LDO_VCN13_EN_SHIFT, 830 + MT6359P_DA_VCN13_B_EN_ADDR, MT6359P_RG_VCN13_VOSEL_ADDR, 831 + MT6359_RG_VCN13_VOSEL_MASK << MT6359_RG_VCN13_VOSEL_SHIFT, 832 + 240), 833 + MT6359_LDO("ldo_vcn33_1_bt", VCN33_1_BT, vcn33_voltages, 834 + MT6359P_RG_LDO_VCN33_1_EN_0_ADDR, 835 + MT6359_RG_LDO_VCN33_1_EN_0_SHIFT, 836 + MT6359P_DA_VCN33_1_B_EN_ADDR, MT6359P_RG_VCN33_1_VOSEL_ADDR, 837 + MT6359_RG_VCN33_1_VOSEL_MASK << 838 + MT6359_RG_VCN33_1_VOSEL_SHIFT, 240), 839 + MT6359_LDO("ldo_vcn33_1_wifi", VCN33_1_WIFI, vcn33_voltages, 840 + MT6359P_RG_LDO_VCN33_1_EN_1_ADDR, 841 + MT6359P_RG_LDO_VCN33_1_EN_1_SHIFT, 842 + MT6359P_DA_VCN33_1_B_EN_ADDR, MT6359P_RG_VCN33_1_VOSEL_ADDR, 843 + MT6359_RG_VCN33_1_VOSEL_MASK << 844 + MT6359_RG_VCN33_1_VOSEL_SHIFT, 240), 845 + MT6359_REG_FIXED("ldo_vaux18", VAUX18, MT6359P_RG_LDO_VAUX18_EN_ADDR, 846 + MT6359P_DA_VAUX18_B_EN_ADDR, 1800000), 847 + MT6359_LDO_LINEAR("ldo_vsram_others", VSRAM_OTHERS, 500000, 1293750, 848 + 6250, 849 + MT6359P_RG_LDO_VSRAM_OTHERS_EN_ADDR, 850 + MT6359P_DA_VSRAM_OTHERS_B_EN_ADDR, 851 + MT6359P_RG_LDO_VSRAM_OTHERS_VOSEL_ADDR, 852 + MT6359_RG_LDO_VSRAM_OTHERS_VOSEL_MASK << 853 + MT6359_RG_LDO_VSRAM_OTHERS_VOSEL_SHIFT), 854 + MT6359_LDO("ldo_vefuse", VEFUSE, vefuse_voltages, 855 + MT6359P_RG_LDO_VEFUSE_EN_ADDR, 856 + MT6359P_RG_LDO_VEFUSE_EN_SHIFT, 857 + MT6359P_DA_VEFUSE_B_EN_ADDR, MT6359P_RG_VEFUSE_VOSEL_ADDR, 858 + MT6359_RG_VEFUSE_VOSEL_MASK << MT6359_RG_VEFUSE_VOSEL_SHIFT, 859 + 240), 860 + MT6359_LDO("ldo_vxo22", VXO22, vxo22_voltages, 861 + MT6359P_RG_LDO_VXO22_EN_ADDR, MT6359P_RG_LDO_VXO22_EN_SHIFT, 862 + MT6359P_DA_VXO22_B_EN_ADDR, MT6359P_RG_VXO22_VOSEL_ADDR, 863 + MT6359_RG_VXO22_VOSEL_MASK << MT6359_RG_VXO22_VOSEL_SHIFT, 864 + 480), 865 + MT6359_LDO("ldo_vrfck_1", VRFCK, vrfck_voltages_1, 866 + MT6359P_RG_LDO_VRFCK_EN_ADDR, MT6359P_RG_LDO_VRFCK_EN_SHIFT, 867 + MT6359P_DA_VRFCK_B_EN_ADDR, MT6359P_RG_VRFCK_VOSEL_ADDR, 868 + MT6359_RG_VRFCK_VOSEL_MASK << MT6359_RG_VRFCK_VOSEL_SHIFT, 869 + 480), 870 + MT6359_REG_FIXED("ldo_vbif28", VBIF28, MT6359P_RG_LDO_VBIF28_EN_ADDR, 871 + MT6359P_DA_VBIF28_B_EN_ADDR, 2800000), 872 + MT6359_LDO("ldo_vio28", VIO28, vio28_voltages, 873 + MT6359P_RG_LDO_VIO28_EN_ADDR, MT6359P_RG_LDO_VIO28_EN_SHIFT, 874 + MT6359P_DA_VIO28_B_EN_ADDR, MT6359P_RG_VIO28_VOSEL_ADDR, 875 + MT6359_RG_VIO28_VOSEL_MASK << MT6359_RG_VIO28_VOSEL_SHIFT, 876 + 1920), 877 + MT6359P_LDO1("ldo_vemc_1", VEMC, mt6359p_vemc_ops, vemc_voltages_1, 878 + MT6359P_RG_LDO_VEMC_EN_ADDR, MT6359P_RG_LDO_VEMC_EN_SHIFT, 879 + MT6359P_DA_VEMC_B_EN_ADDR, 880 + MT6359P_RG_LDO_VEMC_VOSEL_0_ADDR, 881 + MT6359P_RG_LDO_VEMC_VOSEL_0_MASK << 882 + MT6359P_RG_LDO_VEMC_VOSEL_0_SHIFT), 883 + MT6359_LDO("ldo_vcn33_2_bt", VCN33_2_BT, vcn33_voltages, 884 + MT6359P_RG_LDO_VCN33_2_EN_0_ADDR, 885 + MT6359P_RG_LDO_VCN33_2_EN_0_SHIFT, 886 + MT6359P_DA_VCN33_2_B_EN_ADDR, MT6359P_RG_VCN33_2_VOSEL_ADDR, 887 + MT6359_RG_VCN33_2_VOSEL_MASK << 888 + MT6359_RG_VCN33_2_VOSEL_SHIFT, 240), 889 + MT6359_LDO("ldo_vcn33_2_wifi", VCN33_2_WIFI, vcn33_voltages, 890 + MT6359P_RG_LDO_VCN33_2_EN_1_ADDR, 891 + MT6359_RG_LDO_VCN33_2_EN_1_SHIFT, 892 + MT6359P_DA_VCN33_2_B_EN_ADDR, MT6359P_RG_VCN33_2_VOSEL_ADDR, 893 + MT6359_RG_VCN33_2_VOSEL_MASK << 894 + MT6359_RG_VCN33_2_VOSEL_SHIFT, 240), 895 + MT6359_LDO("ldo_va12", VA12, va12_voltages, 896 + MT6359P_RG_LDO_VA12_EN_ADDR, MT6359P_RG_LDO_VA12_EN_SHIFT, 897 + MT6359P_DA_VA12_B_EN_ADDR, MT6359P_RG_VA12_VOSEL_ADDR, 898 + MT6359_RG_VA12_VOSEL_MASK << MT6359_RG_VA12_VOSEL_SHIFT, 899 + 960), 900 + MT6359_LDO("ldo_va09", VA09, va09_voltages, 901 + MT6359P_RG_LDO_VA09_EN_ADDR, MT6359P_RG_LDO_VA09_EN_SHIFT, 902 + MT6359P_DA_VA09_B_EN_ADDR, MT6359P_RG_VA09_VOSEL_ADDR, 903 + MT6359_RG_VA09_VOSEL_MASK << MT6359_RG_VA09_VOSEL_SHIFT, 904 + 960), 905 + MT6359_LDO("ldo_vrf18", VRF18, vrf18_voltages, 906 + MT6359P_RG_LDO_VRF18_EN_ADDR, MT6359P_RG_LDO_VRF18_EN_SHIFT, 907 + MT6359P_DA_VRF18_B_EN_ADDR, MT6359P_RG_VRF18_VOSEL_ADDR, 908 + MT6359_RG_VRF18_VOSEL_MASK << MT6359_RG_VRF18_VOSEL_SHIFT, 909 + 240), 910 + MT6359_LDO_LINEAR("ldo_vsram_md", VSRAM_MD, 500000, 1293750, 6250, 911 + MT6359P_RG_LDO_VSRAM_MD_EN_ADDR, 912 + MT6359P_DA_VSRAM_MD_B_EN_ADDR, 913 + MT6359P_RG_LDO_VSRAM_MD_VOSEL_ADDR, 914 + MT6359_RG_LDO_VSRAM_MD_VOSEL_MASK << 915 + MT6359_RG_LDO_VSRAM_MD_VOSEL_SHIFT), 916 + MT6359_LDO("ldo_vufs", VUFS, volt18_voltages, 917 + MT6359P_RG_LDO_VUFS_EN_ADDR, MT6359P_RG_LDO_VUFS_EN_SHIFT, 918 + MT6359P_DA_VUFS_B_EN_ADDR, MT6359P_RG_VUFS_VOSEL_ADDR, 919 + MT6359_RG_VUFS_VOSEL_MASK << MT6359_RG_VUFS_VOSEL_SHIFT, 920 + 1920), 921 + MT6359_LDO("ldo_vm18", VM18, volt18_voltages, 922 + MT6359P_RG_LDO_VM18_EN_ADDR, MT6359P_RG_LDO_VM18_EN_SHIFT, 923 + MT6359P_DA_VM18_B_EN_ADDR, MT6359P_RG_VM18_VOSEL_ADDR, 924 + MT6359_RG_VM18_VOSEL_MASK << MT6359_RG_VM18_VOSEL_SHIFT, 925 + 1920), 926 + MT6359_LDO("ldo_vbbck", VBBCK, vbbck_voltages, 927 + MT6359P_RG_LDO_VBBCK_EN_ADDR, MT6359P_RG_LDO_VBBCK_EN_SHIFT, 928 + MT6359P_DA_VBBCK_B_EN_ADDR, MT6359P_RG_VBBCK_VOSEL_ADDR, 929 + MT6359P_RG_VBBCK_VOSEL_MASK << MT6359P_RG_VBBCK_VOSEL_SHIFT, 930 + 480), 931 + MT6359_LDO_LINEAR("ldo_vsram_proc1", VSRAM_PROC1, 500000, 1293750, 6250, 932 + MT6359P_RG_LDO_VSRAM_PROC1_EN_ADDR, 933 + MT6359P_DA_VSRAM_PROC1_B_EN_ADDR, 934 + MT6359P_RG_LDO_VSRAM_PROC1_VOSEL_ADDR, 935 + MT6359_RG_LDO_VSRAM_PROC1_VOSEL_MASK << 936 + MT6359_RG_LDO_VSRAM_PROC1_VOSEL_SHIFT), 937 + MT6359_LDO("ldo_vsim2", VSIM2, vsim2_voltages, 938 + MT6359P_RG_LDO_VSIM2_EN_ADDR, MT6359P_RG_LDO_VSIM2_EN_SHIFT, 939 + MT6359P_DA_VSIM2_B_EN_ADDR, MT6359P_RG_VSIM2_VOSEL_ADDR, 940 + MT6359_RG_VSIM2_VOSEL_MASK << MT6359_RG_VSIM2_VOSEL_SHIFT, 941 + 480), 942 + MT6359_LDO_LINEAR("ldo_vsram_others_sshub", VSRAM_OTHERS_SSHUB, 943 + 500000, 1293750, 6250, 944 + MT6359P_RG_LDO_VSRAM_OTHERS_SSHUB_EN_ADDR, 945 + MT6359P_DA_VSRAM_OTHERS_B_EN_ADDR, 946 + MT6359P_RG_LDO_VSRAM_OTHERS_SSHUB_VOSEL_ADDR, 947 + MT6359_RG_LDO_VSRAM_OTHERS_SSHUB_VOSEL_MASK << 948 + MT6359_RG_LDO_VSRAM_OTHERS_SSHUB_VOSEL_SHIFT), 949 + }; 950 + 951 + static int mt6359_regulator_probe(struct platform_device *pdev) 952 + { 953 + struct mt6397_chip *mt6397 = dev_get_drvdata(pdev->dev.parent); 954 + struct regulator_config config = {}; 955 + struct regulator_dev *rdev; 956 + struct mt6359_regulator_info *mt6359_info; 957 + int i, hw_ver; 958 + 959 + regmap_read(mt6397->regmap, MT6359P_HWCID, &hw_ver); 960 + if (hw_ver >= MT6359P_CHIP_VER) 961 + mt6359_info = mt6359p_regulators; 962 + else 963 + mt6359_info = mt6359_regulators; 964 + 965 + config.dev = mt6397->dev; 966 + config.regmap = mt6397->regmap; 967 + for (i = 0; i < MT6359_MAX_REGULATOR; i++, mt6359_info++) { 968 + config.driver_data = mt6359_info; 969 + rdev = devm_regulator_register(&pdev->dev, &mt6359_info->desc, &config); 970 + if (IS_ERR(rdev)) { 971 + dev_err(&pdev->dev, "failed to register %s\n", mt6359_info->desc.name); 972 + return PTR_ERR(rdev); 973 + } 974 + } 975 + 976 + return 0; 977 + } 978 + 979 + static const struct platform_device_id mt6359_platform_ids[] = { 980 + {"mt6359-regulator", 0}, 981 + { /* sentinel */ }, 982 + }; 983 + MODULE_DEVICE_TABLE(platform, mt6359_platform_ids); 984 + 985 + static struct platform_driver mt6359_regulator_driver = { 986 + .driver = { 987 + .name = "mt6359-regulator", 988 + }, 989 + .probe = mt6359_regulator_probe, 990 + .id_table = mt6359_platform_ids, 991 + }; 992 + 993 + module_platform_driver(mt6359_regulator_driver); 994 + 995 + MODULE_AUTHOR("Wen Su <wen.su@mediatek.com>"); 996 + MODULE_DESCRIPTION("Regulator Driver for MediaTek MT6359 PMIC"); 997 + MODULE_LICENSE("GPL");
+58
drivers/regulator/of_regulator.c
··· 21 21 [PM_SUSPEND_MAX] = "regulator-state-disk", 22 22 }; 23 23 24 + static void fill_limit(int *limit, int val) 25 + { 26 + if (val) 27 + if (val == 1) 28 + *limit = REGULATOR_NOTIF_LIMIT_ENABLE; 29 + else 30 + *limit = val; 31 + else 32 + *limit = REGULATOR_NOTIF_LIMIT_DISABLE; 33 + } 34 + 35 + static void of_get_regulator_prot_limits(struct device_node *np, 36 + struct regulation_constraints *constraints) 37 + { 38 + u32 pval; 39 + int i; 40 + static const char *const props[] = { 41 + "regulator-oc-%s-microamp", 42 + "regulator-ov-%s-microvolt", 43 + "regulator-temp-%s-kelvin", 44 + "regulator-uv-%s-microvolt", 45 + }; 46 + struct notification_limit *limits[] = { 47 + &constraints->over_curr_limits, 48 + &constraints->over_voltage_limits, 49 + &constraints->temp_limits, 50 + &constraints->under_voltage_limits, 51 + }; 52 + bool set[4] = {0}; 53 + 54 + /* Protection limits: */ 55 + for (i = 0; i < ARRAY_SIZE(props); i++) { 56 + char prop[255]; 57 + bool found; 58 + int j; 59 + static const char *const lvl[] = { 60 + "protection", "error", "warn" 61 + }; 62 + int *l[] = { 63 + &limits[i]->prot, &limits[i]->err, &limits[i]->warn, 64 + }; 65 + 66 + for (j = 0; j < ARRAY_SIZE(lvl); j++) { 67 + snprintf(prop, 255, props[i], lvl[j]); 68 + found = !of_property_read_u32(np, prop, &pval); 69 + if (found) 70 + fill_limit(l[j], pval); 71 + set[i] |= found; 72 + } 73 + } 74 + constraints->over_current_detection = set[0]; 75 + constraints->over_voltage_detection = set[1]; 76 + constraints->over_temp_detection = set[2]; 77 + constraints->under_voltage_detection = set[3]; 78 + } 79 + 24 80 static int of_get_regulation_constraints(struct device *dev, 25 81 struct device_node *np, 26 82 struct regulator_init_data **init_data, ··· 243 187 244 188 constraints->over_current_protection = of_property_read_bool(np, 245 189 "regulator-over-current-protection"); 190 + 191 + of_get_regulator_prot_limits(np, constraints); 246 192 247 193 for (i = 0; i < ARRAY_SIZE(regulator_states); i++) { 248 194 switch (i) {
+24 -27
drivers/regulator/pca9450-regulator.c
··· 65 65 * 10: 25mV/4usec 66 66 * 11: 25mV/8usec 67 67 */ 68 - static int pca9450_dvs_set_ramp_delay(struct regulator_dev *rdev, 69 - int ramp_delay) 70 - { 71 - int id = rdev_get_id(rdev); 72 - unsigned int ramp_value; 73 - 74 - switch (ramp_delay) { 75 - case 1 ... 3125: 76 - ramp_value = BUCK1_RAMP_3P125MV; 77 - break; 78 - case 3126 ... 6250: 79 - ramp_value = BUCK1_RAMP_6P25MV; 80 - break; 81 - case 6251 ... 12500: 82 - ramp_value = BUCK1_RAMP_12P5MV; 83 - break; 84 - case 12501 ... 25000: 85 - ramp_value = BUCK1_RAMP_25MV; 86 - break; 87 - default: 88 - ramp_value = BUCK1_RAMP_25MV; 89 - } 90 - 91 - return regmap_update_bits(rdev->regmap, PCA9450_REG_BUCK1CTRL + id * 3, 92 - BUCK1_RAMP_MASK, ramp_value << 6); 93 - } 68 + static const unsigned int pca9450_dvs_buck_ramp_table[] = { 69 + 25000, 12500, 6250, 3125 70 + }; 94 71 95 72 static const struct regulator_ops pca9450_dvs_buck_regulator_ops = { 96 73 .enable = regulator_enable_regmap, ··· 77 100 .set_voltage_sel = regulator_set_voltage_sel_regmap, 78 101 .get_voltage_sel = regulator_get_voltage_sel_regmap, 79 102 .set_voltage_time_sel = regulator_set_voltage_time_sel, 80 - .set_ramp_delay = pca9450_dvs_set_ramp_delay, 103 + .set_ramp_delay = regulator_set_ramp_delay_regmap, 81 104 }; 82 105 83 106 static const struct regulator_ops pca9450_buck_regulator_ops = { ··· 228 251 .vsel_mask = BUCK1OUT_DVS0_MASK, 229 252 .enable_reg = PCA9450_REG_BUCK1CTRL, 230 253 .enable_mask = BUCK1_ENMODE_MASK, 254 + .ramp_reg = PCA9450_REG_BUCK1CTRL, 255 + .ramp_mask = BUCK1_RAMP_MASK, 256 + .ramp_delay_table = pca9450_dvs_buck_ramp_table, 257 + .n_ramp_values = ARRAY_SIZE(pca9450_dvs_buck_ramp_table), 231 258 .owner = THIS_MODULE, 232 259 .of_parse_cb = pca9450_set_dvs_levels, 233 260 }, ··· 257 276 .vsel_mask = BUCK2OUT_DVS0_MASK, 258 277 .enable_reg = PCA9450_REG_BUCK2CTRL, 259 278 .enable_mask = BUCK1_ENMODE_MASK, 279 + .ramp_reg = PCA9450_REG_BUCK2CTRL, 280 + .ramp_mask = BUCK2_RAMP_MASK, 281 + .ramp_delay_table = pca9450_dvs_buck_ramp_table, 282 + .n_ramp_values = ARRAY_SIZE(pca9450_dvs_buck_ramp_table), 260 283 .owner = THIS_MODULE, 261 284 .of_parse_cb = pca9450_set_dvs_levels, 262 285 }, ··· 286 301 .vsel_mask = BUCK3OUT_DVS0_MASK, 287 302 .enable_reg = PCA9450_REG_BUCK3CTRL, 288 303 .enable_mask = BUCK3_ENMODE_MASK, 304 + .ramp_reg = PCA9450_REG_BUCK3CTRL, 305 + .ramp_mask = BUCK3_RAMP_MASK, 306 + .ramp_delay_table = pca9450_dvs_buck_ramp_table, 307 + .n_ramp_values = ARRAY_SIZE(pca9450_dvs_buck_ramp_table), 289 308 .owner = THIS_MODULE, 290 309 .of_parse_cb = pca9450_set_dvs_levels, 291 310 }, ··· 466 477 .vsel_mask = BUCK1OUT_DVS0_MASK, 467 478 .enable_reg = PCA9450_REG_BUCK1CTRL, 468 479 .enable_mask = BUCK1_ENMODE_MASK, 480 + .ramp_reg = PCA9450_REG_BUCK1CTRL, 481 + .ramp_mask = BUCK1_RAMP_MASK, 482 + .ramp_delay_table = pca9450_dvs_buck_ramp_table, 483 + .n_ramp_values = ARRAY_SIZE(pca9450_dvs_buck_ramp_table), 469 484 .owner = THIS_MODULE, 470 485 .of_parse_cb = pca9450_set_dvs_levels, 471 486 }, ··· 495 502 .vsel_mask = BUCK2OUT_DVS0_MASK, 496 503 .enable_reg = PCA9450_REG_BUCK2CTRL, 497 504 .enable_mask = BUCK1_ENMODE_MASK, 505 + .ramp_reg = PCA9450_REG_BUCK2CTRL, 506 + .ramp_mask = BUCK2_RAMP_MASK, 507 + .ramp_delay_table = pca9450_dvs_buck_ramp_table, 508 + .n_ramp_values = ARRAY_SIZE(pca9450_dvs_buck_ramp_table), 498 509 .owner = THIS_MODULE, 499 510 .of_parse_cb = pca9450_set_dvs_levels, 500 511 },
+9 -1
drivers/regulator/qcom-labibb-regulator.c
··· 307 307 return IRQ_HANDLED; 308 308 } 309 309 310 - static int qcom_labibb_set_ocp(struct regulator_dev *rdev) 310 + static int qcom_labibb_set_ocp(struct regulator_dev *rdev, int lim, 311 + int severity, bool enable) 311 312 { 312 313 struct labibb_regulator *vreg = rdev_get_drvdata(rdev); 313 314 char *ocp_irq_name; 314 315 u32 irq_flags = IRQF_ONESHOT; 315 316 int irq_trig_low, ret; 317 + 318 + /* 319 + * labibb supports only protection - and does not support setting 320 + * limit. Furthermore, we don't support disabling protection. 321 + */ 322 + if (lim || severity != REGULATOR_SEVERITY_PROT || !enable) 323 + return -EINVAL; 316 324 317 325 /* If there is no OCP interrupt, there's nothing to set */ 318 326 if (vreg->ocp_irq <= 0)
+50 -12
drivers/regulator/qcom-rpmh-regulator.c
··· 811 811 RPMH_VREG("ldo28", "ldo%s28", &pmic4_pldo, "vdd-l16-l28"), 812 812 RPMH_VREG("lvs1", "vs%s1", &pmic4_lvs, "vin-lvs-1-2"), 813 813 RPMH_VREG("lvs2", "vs%s2", &pmic4_lvs, "vin-lvs-1-2"), 814 - {}, 814 + {} 815 815 }; 816 816 817 817 static const struct rpmh_vreg_init_data pmi8998_vreg_data[] = { 818 818 RPMH_VREG("bob", "bob%s1", &pmic4_bob, "vdd-bob"), 819 - {}, 819 + {} 820 820 }; 821 821 822 822 static const struct rpmh_vreg_init_data pm8005_vreg_data[] = { ··· 824 824 RPMH_VREG("smps2", "smp%s2", &pmic4_ftsmps426, "vdd-s2"), 825 825 RPMH_VREG("smps3", "smp%s3", &pmic4_ftsmps426, "vdd-s3"), 826 826 RPMH_VREG("smps4", "smp%s4", &pmic4_ftsmps426, "vdd-s4"), 827 - {}, 827 + {} 828 828 }; 829 829 830 830 static const struct rpmh_vreg_init_data pm8150_vreg_data[] = { ··· 856 856 RPMH_VREG("ldo16", "ldo%s16", &pmic5_pldo, "vdd-l13-l16-l17"), 857 857 RPMH_VREG("ldo17", "ldo%s17", &pmic5_pldo, "vdd-l13-l16-l17"), 858 858 RPMH_VREG("ldo18", "ldo%s18", &pmic5_nldo, "vdd-l3-l4-l5-l18"), 859 - {}, 859 + {} 860 860 }; 861 861 862 862 static const struct rpmh_vreg_init_data pm8150l_vreg_data[] = { ··· 880 880 RPMH_VREG("ldo10", "ldo%s10", &pmic5_pldo, "vdd-l9-l10"), 881 881 RPMH_VREG("ldo11", "ldo%s11", &pmic5_pldo, "vdd-l7-l11"), 882 882 RPMH_VREG("bob", "bob%s1", &pmic5_bob, "vdd-bob"), 883 - {}, 883 + {} 884 + }; 885 + 886 + static const struct rpmh_vreg_init_data pmm8155au_vreg_data[] = { 887 + RPMH_VREG("smps1", "smp%s1", &pmic5_ftsmps510, "vdd-s1"), 888 + RPMH_VREG("smps2", "smp%s2", &pmic5_ftsmps510, "vdd-s2"), 889 + RPMH_VREG("smps3", "smp%s3", &pmic5_ftsmps510, "vdd-s3"), 890 + RPMH_VREG("smps4", "smp%s4", &pmic5_hfsmps510, "vdd-s4"), 891 + RPMH_VREG("smps5", "smp%s5", &pmic5_hfsmps510, "vdd-s5"), 892 + RPMH_VREG("smps6", "smp%s6", &pmic5_ftsmps510, "vdd-s6"), 893 + RPMH_VREG("smps7", "smp%s7", &pmic5_ftsmps510, "vdd-s7"), 894 + RPMH_VREG("smps8", "smp%s8", &pmic5_ftsmps510, "vdd-s8"), 895 + RPMH_VREG("smps9", "smp%s9", &pmic5_ftsmps510, "vdd-s9"), 896 + RPMH_VREG("smps10", "smp%s10", &pmic5_ftsmps510, "vdd-s10"), 897 + RPMH_VREG("ldo1", "ldo%s1", &pmic5_nldo, "vdd-l1-l8-l11"), 898 + RPMH_VREG("ldo2", "ldo%s2", &pmic5_pldo, "vdd-l2-l10"), 899 + RPMH_VREG("ldo3", "ldo%s3", &pmic5_nldo, "vdd-l3-l4-l5-l18"), 900 + RPMH_VREG("ldo4", "ldo%s4", &pmic5_nldo, "vdd-l3-l4-l5-l18"), 901 + RPMH_VREG("ldo5", "ldo%s5", &pmic5_nldo, "vdd-l3-l4-l5-l18"), 902 + RPMH_VREG("ldo6", "ldo%s6", &pmic5_nldo, "vdd-l6-l9"), 903 + RPMH_VREG("ldo7", "ldo%s7", &pmic5_pldo_lv, "vdd-l7-l12-l14-l15"), 904 + RPMH_VREG("ldo8", "ldo%s8", &pmic5_nldo, "vdd-l1-l8-l11"), 905 + RPMH_VREG("ldo9", "ldo%s9", &pmic5_nldo, "vdd-l6-l9"), 906 + RPMH_VREG("ldo10", "ldo%s10", &pmic5_pldo, "vdd-l2-l10"), 907 + RPMH_VREG("ldo11", "ldo%s11", &pmic5_nldo, "vdd-l1-l8-l11"), 908 + RPMH_VREG("ldo12", "ldo%s12", &pmic5_pldo_lv, "vdd-l7-l12-l14-l15"), 909 + RPMH_VREG("ldo13", "ldo%s13", &pmic5_pldo, "vdd-l13-l16-l17"), 910 + RPMH_VREG("ldo14", "ldo%s14", &pmic5_pldo_lv, "vdd-l7-l12-l14-l15"), 911 + RPMH_VREG("ldo15", "ldo%s15", &pmic5_pldo_lv, "vdd-l7-l12-l14-l15"), 912 + RPMH_VREG("ldo16", "ldo%s16", &pmic5_pldo, "vdd-l13-l16-l17"), 913 + RPMH_VREG("ldo17", "ldo%s17", &pmic5_pldo, "vdd-l13-l16-l17"), 914 + RPMH_VREG("ldo18", "ldo%s18", &pmic5_nldo, "vdd-l3-l4-l5-l18"), 915 + {} 884 916 }; 885 917 886 918 static const struct rpmh_vreg_init_data pm8350_vreg_data[] = { ··· 938 906 RPMH_VREG("ldo8", "ldo%s8", &pmic5_nldo, "vdd-l8"), 939 907 RPMH_VREG("ldo9", "ldo%s9", &pmic5_nldo, "vdd-l6-l9-l10"), 940 908 RPMH_VREG("ldo10", "ldo%s10", &pmic5_nldo, "vdd-l6-l9-l10"), 941 - {}, 909 + {} 942 910 }; 943 911 944 912 static const struct rpmh_vreg_init_data pm8350c_vreg_data[] = { ··· 966 934 RPMH_VREG("ldo12", "ldo%s12", &pmic5_pldo_lv, "vdd-l1-l12"), 967 935 RPMH_VREG("ldo13", "ldo%s13", &pmic5_pldo, "vdd-l3-l4-l5-l7-l13"), 968 936 RPMH_VREG("bob", "bob%s1", &pmic5_bob, "vdd-bob"), 969 - {}, 937 + {} 970 938 }; 971 939 972 940 static const struct rpmh_vreg_init_data pm8009_vreg_data[] = { ··· 979 947 RPMH_VREG("ldo5", "ldo%s5", &pmic5_pldo, "vdd-l5-l6"), 980 948 RPMH_VREG("ldo6", "ldo%s6", &pmic5_pldo, "vdd-l5-l6"), 981 949 RPMH_VREG("ldo7", "ldo%s7", &pmic5_pldo_lv, "vdd-l7"), 982 - {}, 950 + {} 983 951 }; 984 952 985 953 static const struct rpmh_vreg_init_data pm8009_1_vreg_data[] = { ··· 992 960 RPMH_VREG("ldo5", "ldo%s5", &pmic5_pldo, "vdd-l5-l6"), 993 961 RPMH_VREG("ldo6", "ldo%s6", &pmic5_pldo, "vdd-l5-l6"), 994 962 RPMH_VREG("ldo7", "ldo%s6", &pmic5_pldo_lv, "vdd-l7"), 995 - {}, 963 + {} 996 964 }; 997 965 998 966 static const struct rpmh_vreg_init_data pm6150_vreg_data[] = { ··· 1020 988 RPMH_VREG("ldo17", "ldo%s17", &pmic5_pldo, "vdd-l5-l16-l17-l18-l19"), 1021 989 RPMH_VREG("ldo18", "ldo%s18", &pmic5_pldo, "vdd-l5-l16-l17-l18-l19"), 1022 990 RPMH_VREG("ldo19", "ldo%s19", &pmic5_pldo, "vdd-l5-l16-l17-l18-l19"), 1023 - {}, 991 + {} 1024 992 }; 1025 993 1026 994 static const struct rpmh_vreg_init_data pm6150l_vreg_data[] = { ··· 1044 1012 RPMH_VREG("ldo10", "ldo%s10", &pmic5_pldo, "vdd-l9-l10"), 1045 1013 RPMH_VREG("ldo11", "ldo%s11", &pmic5_pldo, "vdd-l7-l11"), 1046 1014 RPMH_VREG("bob", "bob%s1", &pmic5_bob, "vdd-bob"), 1047 - {}, 1015 + {} 1048 1016 }; 1049 1017 1050 1018 static const struct rpmh_vreg_init_data pmx55_vreg_data[] = { ··· 1071 1039 RPMH_VREG("ldo14", "ldo%s14", &pmic5_nldo, "vdd-l14"), 1072 1040 RPMH_VREG("ldo15", "ldo%s15", &pmic5_nldo, "vdd-l15"), 1073 1041 RPMH_VREG("ldo16", "ldo%s16", &pmic5_pldo, "vdd-l16"), 1074 - {}, 1042 + {} 1075 1043 }; 1076 1044 1077 1045 static const struct rpmh_vreg_init_data pm7325_vreg_data[] = { ··· 1102 1070 RPMH_VREG("ldo17", "ldo%s17", &pmic5_pldo_lv, "vdd-l11-l17-l18-l19"), 1103 1071 RPMH_VREG("ldo18", "ldo%s18", &pmic5_pldo_lv, "vdd-l11-l17-l18-l19"), 1104 1072 RPMH_VREG("ldo19", "ldo%s19", &pmic5_pldo_lv, "vdd-l11-l17-l18-l19"), 1073 + {} 1105 1074 }; 1106 1075 1107 1076 static const struct rpmh_vreg_init_data pmr735a_vreg_data[] = { ··· 1116 1083 RPMH_VREG("ldo5", "ldo%s5", &pmic5_nldo, "vdd-l5-l6"), 1117 1084 RPMH_VREG("ldo6", "ldo%s6", &pmic5_nldo, "vdd-l5-l6"), 1118 1085 RPMH_VREG("ldo7", "ldo%s7", &pmic5_pldo, "vdd-l7-bob"), 1086 + {} 1119 1087 }; 1120 1088 1121 1089 static int rpmh_regulator_probe(struct platform_device *pdev) ··· 1208 1174 { 1209 1175 .compatible = "qcom,pmc8180c-rpmh-regulators", 1210 1176 .data = pm8150l_vreg_data, 1177 + }, 1178 + { 1179 + .compatible = "qcom,pmm8155au-rpmh-regulators", 1180 + .data = pmm8155au_vreg_data, 1211 1181 }, 1212 1182 { 1213 1183 .compatible = "qcom,pmx55-rpmh-regulators",
+84 -1
drivers/regulator/qcom_smd-regulator.c
··· 251 251 .ops = &rpm_switch_ops, 252 252 }; 253 253 254 + static const struct regulator_desc pm8226_hfsmps = { 255 + .linear_ranges = (struct linear_range[]) { 256 + REGULATOR_LINEAR_RANGE(375000, 0, 95, 12500), 257 + REGULATOR_LINEAR_RANGE(1575000, 96, 158, 25000), 258 + }, 259 + .n_linear_ranges = 2, 260 + .n_voltages = 159, 261 + .ops = &rpm_smps_ldo_ops, 262 + }; 263 + 264 + static const struct regulator_desc pm8226_ftsmps = { 265 + .linear_ranges = (struct linear_range[]) { 266 + REGULATOR_LINEAR_RANGE(350000, 0, 184, 5000), 267 + REGULATOR_LINEAR_RANGE(1280000, 185, 261, 10000), 268 + }, 269 + .n_linear_ranges = 2, 270 + .n_voltages = 262, 271 + .ops = &rpm_smps_ldo_ops, 272 + }; 273 + 274 + static const struct regulator_desc pm8226_pldo = { 275 + .linear_ranges = (struct linear_range[]) { 276 + REGULATOR_LINEAR_RANGE(750000, 0, 63, 12500), 277 + REGULATOR_LINEAR_RANGE(1550000, 64, 126, 25000), 278 + REGULATOR_LINEAR_RANGE(3100000, 127, 163, 50000), 279 + }, 280 + .n_linear_ranges = 3, 281 + .n_voltages = 164, 282 + .ops = &rpm_smps_ldo_ops, 283 + }; 284 + 285 + static const struct regulator_desc pm8226_nldo = { 286 + .linear_ranges = (struct linear_range[]) { 287 + REGULATOR_LINEAR_RANGE(750000, 0, 63, 12500), 288 + }, 289 + .n_linear_ranges = 1, 290 + .n_voltages = 64, 291 + .ops = &rpm_smps_ldo_ops, 292 + }; 293 + 294 + static const struct regulator_desc pm8226_switch = { 295 + .ops = &rpm_switch_ops, 296 + }; 297 + 254 298 static const struct regulator_desc pm8x41_hfsmps = { 255 299 .linear_ranges = (struct linear_range[]) { 256 300 REGULATOR_LINEAR_RANGE( 375000, 0, 95, 12500), ··· 449 405 450 406 static const struct regulator_desc pm8953_lnldo = { 451 407 .linear_ranges = (struct linear_range[]) { 452 - REGULATOR_LINEAR_RANGE(1380000, 8, 15, 120000), 453 408 REGULATOR_LINEAR_RANGE(690000, 0, 7, 60000), 409 + REGULATOR_LINEAR_RANGE(1380000, 8, 15, 120000), 454 410 }, 455 411 .n_linear_ranges = 2, 456 412 .n_voltages = 16, ··· 787 743 { "l16", QCOM_SMD_RPM_LDOA, 16, &pm8916_pldo, "vdd_l8_l9_l10_l11_l12_l13_l14_l15_l16_l17_l18"}, 788 744 { "l17", QCOM_SMD_RPM_LDOA, 17, &pm8916_pldo, "vdd_l8_l9_l10_l11_l12_l13_l14_l15_l16_l17_l18"}, 789 745 { "l18", QCOM_SMD_RPM_LDOA, 18, &pm8916_pldo, "vdd_l8_l9_l10_l11_l12_l13_l14_l15_l16_l17_l18"}, 746 + {} 747 + }; 748 + 749 + static const struct rpm_regulator_data rpm_pm8226_regulators[] = { 750 + { "s1", QCOM_SMD_RPM_SMPA, 1, &pm8226_hfsmps, "vdd_s1" }, 751 + { "s2", QCOM_SMD_RPM_SMPA, 2, &pm8226_ftsmps, "vdd_s2" }, 752 + { "s3", QCOM_SMD_RPM_SMPA, 3, &pm8226_hfsmps, "vdd_s3" }, 753 + { "s4", QCOM_SMD_RPM_SMPA, 4, &pm8226_hfsmps, "vdd_s4" }, 754 + { "s5", QCOM_SMD_RPM_SMPA, 5, &pm8226_hfsmps, "vdd_s5" }, 755 + { "l1", QCOM_SMD_RPM_LDOA, 1, &pm8226_nldo, "vdd_l1_l2_l4_l5" }, 756 + { "l2", QCOM_SMD_RPM_LDOA, 2, &pm8226_nldo, "vdd_l1_l2_l4_l5" }, 757 + { "l3", QCOM_SMD_RPM_LDOA, 3, &pm8226_nldo, "vdd_l3_l24_l26" }, 758 + { "l4", QCOM_SMD_RPM_LDOA, 4, &pm8226_nldo, "vdd_l1_l2_l4_l5" }, 759 + { "l5", QCOM_SMD_RPM_LDOA, 5, &pm8226_nldo, "vdd_l1_l2_l4_l5" }, 760 + { "l6", QCOM_SMD_RPM_LDOA, 6, &pm8226_pldo, "vdd_l6_l7_l8_l9_l27" }, 761 + { "l7", QCOM_SMD_RPM_LDOA, 7, &pm8226_pldo, "vdd_l6_l7_l8_l9_l27" }, 762 + { "l8", QCOM_SMD_RPM_LDOA, 8, &pm8226_pldo, "vdd_l6_l7_l8_l9_l27" }, 763 + { "l9", QCOM_SMD_RPM_LDOA, 9, &pm8226_pldo, "vdd_l6_l7_l8_l9_l27" }, 764 + { "l10", QCOM_SMD_RPM_LDOA, 10, &pm8226_pldo, "vdd_l10_l11_l13" }, 765 + { "l11", QCOM_SMD_RPM_LDOA, 11, &pm8226_pldo, "vdd_l10_l11_l13" }, 766 + { "l12", QCOM_SMD_RPM_LDOA, 12, &pm8226_pldo, "vdd_l12_l14" }, 767 + { "l13", QCOM_SMD_RPM_LDOA, 13, &pm8226_pldo, "vdd_l10_l11_l13" }, 768 + { "l14", QCOM_SMD_RPM_LDOA, 14, &pm8226_pldo, "vdd_l12_l14" }, 769 + { "l15", QCOM_SMD_RPM_LDOA, 15, &pm8226_pldo, "vdd_l15_l16_l17_l18" }, 770 + { "l16", QCOM_SMD_RPM_LDOA, 16, &pm8226_pldo, "vdd_l15_l16_l17_l18" }, 771 + { "l17", QCOM_SMD_RPM_LDOA, 17, &pm8226_pldo, "vdd_l15_l16_l17_l18" }, 772 + { "l18", QCOM_SMD_RPM_LDOA, 18, &pm8226_pldo, "vdd_l15_l16_l17_l18" }, 773 + { "l19", QCOM_SMD_RPM_LDOA, 19, &pm8226_pldo, "vdd_l19_l20_l21_l22_l23_l28" }, 774 + { "l20", QCOM_SMD_RPM_LDOA, 20, &pm8226_pldo, "vdd_l19_l20_l21_l22_l23_l28" }, 775 + { "l21", QCOM_SMD_RPM_LDOA, 21, &pm8226_pldo, "vdd_l19_l20_l21_l22_l23_l28" }, 776 + { "l22", QCOM_SMD_RPM_LDOA, 22, &pm8226_pldo, "vdd_l19_l20_l21_l22_l23_l28" }, 777 + { "l23", QCOM_SMD_RPM_LDOA, 23, &pm8226_pldo, "vdd_l19_l20_l21_l22_l23_l28" }, 778 + { "l24", QCOM_SMD_RPM_LDOA, 24, &pm8226_nldo, "vdd_l3_l24_l26" }, 779 + { "l25", QCOM_SMD_RPM_LDOA, 25, &pm8226_pldo, "vdd_l25" }, 780 + { "l26", QCOM_SMD_RPM_LDOA, 26, &pm8226_nldo, "vdd_l3_l24_l26" }, 781 + { "l27", QCOM_SMD_RPM_LDOA, 27, &pm8226_pldo, "vdd_l6_l7_l8_l9_l27" }, 782 + { "l28", QCOM_SMD_RPM_LDOA, 28, &pm8226_pldo, "vdd_l19_l20_l21_l22_l23_l28" }, 783 + { "lvs1", QCOM_SMD_RPM_VSA, 1, &pm8226_switch, "vdd_lvs1" }, 790 784 {} 791 785 }; 792 786 ··· 1174 1092 { .compatible = "qcom,rpm-mp5496-regulators", .data = &rpm_mp5496_regulators }, 1175 1093 { .compatible = "qcom,rpm-pm8841-regulators", .data = &rpm_pm8841_regulators }, 1176 1094 { .compatible = "qcom,rpm-pm8916-regulators", .data = &rpm_pm8916_regulators }, 1095 + { .compatible = "qcom,rpm-pm8226-regulators", .data = &rpm_pm8226_regulators }, 1177 1096 { .compatible = "qcom,rpm-pm8941-regulators", .data = &rpm_pm8941_regulators }, 1178 1097 { .compatible = "qcom,rpm-pm8950-regulators", .data = &rpm_pm8950_regulators }, 1179 1098 { .compatible = "qcom,rpm-pm8953-regulators", .data = &rpm_pm8953_regulators },
+5 -1
drivers/regulator/qcom_spmi-regulator.c
··· 595 595 return regulator_enable_regmap(rdev); 596 596 } 597 597 598 - static int spmi_regulator_vs_ocp(struct regulator_dev *rdev) 598 + static int spmi_regulator_vs_ocp(struct regulator_dev *rdev, int lim_uA, 599 + int severity, bool enable) 599 600 { 600 601 struct spmi_regulator *vreg = rdev_get_drvdata(rdev); 601 602 u8 reg = SPMI_VS_OCP_OVERRIDE; 603 + 604 + if (lim_uA || !enable || severity != REGULATOR_SEVERITY_PROT) 605 + return -EINVAL; 602 606 603 607 return spmi_vreg_write(vreg, SPMI_VS_REG_OCP, &reg, 1); 604 608 }
+12
drivers/regulator/qcom_usb_vbus-regulator.c
··· 16 16 17 17 #define CMD_OTG 0x40 18 18 #define OTG_EN BIT(0) 19 + #define OTG_CURRENT_LIMIT_CFG 0x52 20 + #define OTG_CURRENT_LIMIT_MASK GENMASK(2, 0) 19 21 #define OTG_CFG 0x53 20 22 #define OTG_EN_SRC_CFG BIT(1) 23 + 24 + static const unsigned int curr_table[] = { 25 + 500000, 1000000, 1500000, 2000000, 2500000, 3000000, 26 + }; 21 27 22 28 static const struct regulator_ops qcom_usb_vbus_reg_ops = { 23 29 .enable = regulator_enable_regmap, 24 30 .disable = regulator_disable_regmap, 25 31 .is_enabled = regulator_is_enabled_regmap, 32 + .get_current_limit = regulator_get_current_limit_regmap, 33 + .set_current_limit = regulator_set_current_limit_regmap, 26 34 }; 27 35 28 36 static struct regulator_desc qcom_usb_vbus_rdesc = { ··· 38 30 .ops = &qcom_usb_vbus_reg_ops, 39 31 .owner = THIS_MODULE, 40 32 .type = REGULATOR_VOLTAGE, 33 + .curr_table = curr_table, 34 + .n_current_limits = ARRAY_SIZE(curr_table), 41 35 }; 42 36 43 37 static int qcom_usb_vbus_regulator_probe(struct platform_device *pdev) ··· 71 61 72 62 qcom_usb_vbus_rdesc.enable_reg = base + CMD_OTG; 73 63 qcom_usb_vbus_rdesc.enable_mask = OTG_EN; 64 + qcom_usb_vbus_rdesc.csel_reg = base + OTG_CURRENT_LIMIT_CFG; 65 + qcom_usb_vbus_rdesc.csel_mask = OTG_CURRENT_LIMIT_MASK; 74 66 config.dev = dev; 75 67 config.init_data = init_data; 76 68 config.of_node = dev->of_node;
+51 -65
drivers/regulator/rk808-regulator.c
··· 158 158 struct gpio_desc *dvs_gpio[2]; 159 159 }; 160 160 161 - static const int rk808_buck_config_regs[] = { 162 - RK808_BUCK1_CONFIG_REG, 163 - RK808_BUCK2_CONFIG_REG, 164 - RK808_BUCK3_CONFIG_REG, 165 - RK808_BUCK4_CONFIG_REG, 166 - }; 167 - 168 161 static const struct linear_range rk808_ldo3_voltage_ranges[] = { 169 162 REGULATOR_LINEAR_RANGE(800000, 0, 13, 100000), 170 163 REGULATOR_LINEAR_RANGE(2500000, 15, 15, 0), ··· 206 213 RK817_BUCK1_SEL0, RK817_BUCK1_STP0), 207 214 REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN1, RK817_BUCK1_SEL0 + 1, 208 215 RK817_BUCK3_SEL_CNT, RK817_BUCK1_STP1), 216 + }; 217 + 218 + static const unsigned int rk808_buck1_2_ramp_table[] = { 219 + 2000, 4000, 6000, 10000 220 + }; 221 + 222 + /* RK817 RK809 */ 223 + static const unsigned int rk817_buck1_4_ramp_table[] = { 224 + 3000, 6300, 12500, 25000 209 225 }; 210 226 211 227 static int rk808_buck1_2_get_voltage_sel_regmap(struct regulator_dev *rdev) ··· 340 338 return 0; 341 339 342 340 return regulator_set_voltage_time_sel(rdev, old_selector, new_selector); 343 - } 344 - 345 - static int rk808_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay) 346 - { 347 - unsigned int ramp_value = RK808_RAMP_RATE_10MV_PER_US; 348 - unsigned int reg = rk808_buck_config_regs[rdev_get_id(rdev)]; 349 - 350 - switch (ramp_delay) { 351 - case 1 ... 2000: 352 - ramp_value = RK808_RAMP_RATE_2MV_PER_US; 353 - break; 354 - case 2001 ... 4000: 355 - ramp_value = RK808_RAMP_RATE_4MV_PER_US; 356 - break; 357 - case 4001 ... 6000: 358 - ramp_value = RK808_RAMP_RATE_6MV_PER_US; 359 - break; 360 - case 6001 ... 10000: 361 - break; 362 - default: 363 - pr_warn("%s ramp_delay: %d not supported, setting 10000\n", 364 - rdev->desc->name, ramp_delay); 365 - } 366 - 367 - return regmap_update_bits(rdev->regmap, reg, 368 - RK808_RAMP_RATE_MASK, ramp_value); 369 - } 370 - 371 - /* 372 - * RK817 RK809 373 - */ 374 - static int rk817_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay) 375 - { 376 - unsigned int ramp_value = RK817_RAMP_RATE_25MV_PER_US; 377 - unsigned int reg = RK817_BUCK_CONFIG_REG(rdev_get_id(rdev)); 378 - 379 - switch (ramp_delay) { 380 - case 0 ... 3000: 381 - ramp_value = RK817_RAMP_RATE_3MV_PER_US; 382 - break; 383 - case 3001 ... 6300: 384 - ramp_value = RK817_RAMP_RATE_6_3MV_PER_US; 385 - break; 386 - case 6301 ... 12500: 387 - ramp_value = RK817_RAMP_RATE_12_5MV_PER_US; 388 - break; 389 - case 12501 ... 25000: 390 - break; 391 - default: 392 - dev_warn(&rdev->dev, 393 - "%s ramp_delay: %d not supported, setting 25000\n", 394 - rdev->desc->name, ramp_delay); 395 - } 396 - 397 - return regmap_update_bits(rdev->regmap, reg, 398 - RK817_RAMP_RATE_MASK, ramp_value); 399 341 } 400 342 401 343 static int rk808_set_suspend_voltage(struct regulator_dev *rdev, int uv) ··· 571 625 .enable = regulator_enable_regmap, 572 626 .disable = regulator_disable_regmap, 573 627 .is_enabled = regulator_is_enabled_regmap, 574 - .set_ramp_delay = rk808_set_ramp_delay, 628 + .set_ramp_delay = regulator_set_ramp_delay_regmap, 575 629 .set_suspend_voltage = rk808_set_suspend_voltage, 576 630 .set_suspend_enable = rk808_set_suspend_enable, 577 631 .set_suspend_disable = rk808_set_suspend_disable, ··· 668 722 .set_mode = rk8xx_set_mode, 669 723 .get_mode = rk8xx_get_mode, 670 724 .set_suspend_mode = rk8xx_set_suspend_mode, 671 - .set_ramp_delay = rk817_set_ramp_delay, 725 + .set_ramp_delay = regulator_set_ramp_delay_regmap, 672 726 .set_suspend_voltage = rk808_set_suspend_voltage_range, 673 727 .set_suspend_enable = rk817_set_suspend_enable, 674 728 .set_suspend_disable = rk817_set_suspend_disable, ··· 760 814 .vsel_mask = RK808_BUCK_VSEL_MASK, 761 815 .enable_reg = RK808_DCDC_EN_REG, 762 816 .enable_mask = BIT(0), 817 + .ramp_reg = RK808_BUCK1_CONFIG_REG, 818 + .ramp_mask = RK808_RAMP_RATE_MASK, 819 + .ramp_delay_table = rk808_buck1_2_ramp_table, 820 + .n_ramp_values = ARRAY_SIZE(rk808_buck1_2_ramp_table), 763 821 .owner = THIS_MODULE, 764 822 }, { 765 823 .name = "DCDC_REG2", ··· 780 830 .vsel_mask = RK808_BUCK_VSEL_MASK, 781 831 .enable_reg = RK808_DCDC_EN_REG, 782 832 .enable_mask = BIT(1), 833 + .ramp_reg = RK808_BUCK2_CONFIG_REG, 834 + .ramp_mask = RK808_RAMP_RATE_MASK, 835 + .ramp_delay_table = rk808_buck1_2_ramp_table, 836 + .n_ramp_values = ARRAY_SIZE(rk808_buck1_2_ramp_table), 783 837 .owner = THIS_MODULE, 784 838 }, { 785 839 .name = "DCDC_REG3", ··· 864 910 .enable_mask = ENABLE_MASK(RK817_ID_DCDC1), 865 911 .enable_val = ENABLE_MASK(RK817_ID_DCDC1), 866 912 .disable_val = DISABLE_VAL(RK817_ID_DCDC1), 913 + .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC1), 914 + .ramp_mask = RK817_RAMP_RATE_MASK, 915 + .ramp_delay_table = rk817_buck1_4_ramp_table, 916 + .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table), 867 917 .of_map_mode = rk8xx_regulator_of_map_mode, 868 918 .owner = THIS_MODULE, 869 919 }, { ··· 887 929 .enable_mask = ENABLE_MASK(RK817_ID_DCDC2), 888 930 .enable_val = ENABLE_MASK(RK817_ID_DCDC2), 889 931 .disable_val = DISABLE_VAL(RK817_ID_DCDC2), 932 + .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC2), 933 + .ramp_mask = RK817_RAMP_RATE_MASK, 934 + .ramp_delay_table = rk817_buck1_4_ramp_table, 935 + .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table), 890 936 .of_map_mode = rk8xx_regulator_of_map_mode, 891 937 .owner = THIS_MODULE, 892 938 }, { ··· 910 948 .enable_mask = ENABLE_MASK(RK817_ID_DCDC3), 911 949 .enable_val = ENABLE_MASK(RK817_ID_DCDC3), 912 950 .disable_val = DISABLE_VAL(RK817_ID_DCDC3), 951 + .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC3), 952 + .ramp_mask = RK817_RAMP_RATE_MASK, 953 + .ramp_delay_table = rk817_buck1_4_ramp_table, 954 + .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table), 913 955 .of_map_mode = rk8xx_regulator_of_map_mode, 914 956 .owner = THIS_MODULE, 915 957 }, { ··· 933 967 .enable_mask = ENABLE_MASK(RK817_ID_DCDC4), 934 968 .enable_val = ENABLE_MASK(RK817_ID_DCDC4), 935 969 .disable_val = DISABLE_VAL(RK817_ID_DCDC4), 970 + .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC4), 971 + .ramp_mask = RK817_RAMP_RATE_MASK, 972 + .ramp_delay_table = rk817_buck1_4_ramp_table, 973 + .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table), 936 974 .of_map_mode = rk8xx_regulator_of_map_mode, 937 975 .owner = THIS_MODULE, 938 976 }, ··· 1022 1052 .enable_mask = ENABLE_MASK(RK817_ID_DCDC1), 1023 1053 .enable_val = ENABLE_MASK(RK817_ID_DCDC1), 1024 1054 .disable_val = DISABLE_VAL(RK817_ID_DCDC1), 1055 + .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC1), 1056 + .ramp_mask = RK817_RAMP_RATE_MASK, 1057 + .ramp_delay_table = rk817_buck1_4_ramp_table, 1058 + .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table), 1025 1059 .of_map_mode = rk8xx_regulator_of_map_mode, 1026 1060 .owner = THIS_MODULE, 1027 1061 }, { ··· 1045 1071 .enable_mask = ENABLE_MASK(RK817_ID_DCDC2), 1046 1072 .enable_val = ENABLE_MASK(RK817_ID_DCDC2), 1047 1073 .disable_val = DISABLE_VAL(RK817_ID_DCDC2), 1074 + .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC2), 1075 + .ramp_mask = RK817_RAMP_RATE_MASK, 1076 + .ramp_delay_table = rk817_buck1_4_ramp_table, 1077 + .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table), 1048 1078 .of_map_mode = rk8xx_regulator_of_map_mode, 1049 1079 .owner = THIS_MODULE, 1050 1080 }, { ··· 1068 1090 .enable_mask = ENABLE_MASK(RK817_ID_DCDC3), 1069 1091 .enable_val = ENABLE_MASK(RK817_ID_DCDC3), 1070 1092 .disable_val = DISABLE_VAL(RK817_ID_DCDC3), 1093 + .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC3), 1094 + .ramp_mask = RK817_RAMP_RATE_MASK, 1095 + .ramp_delay_table = rk817_buck1_4_ramp_table, 1096 + .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table), 1071 1097 .of_map_mode = rk8xx_regulator_of_map_mode, 1072 1098 .owner = THIS_MODULE, 1073 1099 }, { ··· 1091 1109 .enable_mask = ENABLE_MASK(RK817_ID_DCDC4), 1092 1110 .enable_val = ENABLE_MASK(RK817_ID_DCDC4), 1093 1111 .disable_val = DISABLE_VAL(RK817_ID_DCDC4), 1112 + .ramp_reg = RK817_BUCK_CONFIG_REG(RK817_ID_DCDC4), 1113 + .ramp_mask = RK817_RAMP_RATE_MASK, 1114 + .ramp_delay_table = rk817_buck1_4_ramp_table, 1115 + .n_ramp_values = ARRAY_SIZE(rk817_buck1_4_ramp_table), 1094 1116 .of_map_mode = rk8xx_regulator_of_map_mode, 1095 1117 .owner = THIS_MODULE, 1096 1118 },
+3
drivers/regulator/rt4831-regulator.c
··· 108 108 .bypass_reg = RT4831_REG_DSVEN, 109 109 .bypass_val_on = DSV_MODE_BYPASS, 110 110 .bypass_val_off = DSV_MODE_NORMAL, 111 + .owner = THIS_MODULE, 111 112 }, 112 113 { 113 114 .name = "DSVP", ··· 126 125 .enable_mask = RT4831_POSEN_MASK, 127 126 .active_discharge_reg = RT4831_REG_DSVEN, 128 127 .active_discharge_mask = RT4831_POSADEN_MASK, 128 + .owner = THIS_MODULE, 129 129 }, 130 130 { 131 131 .name = "DSVN", ··· 144 142 .enable_mask = RT4831_NEGEN_MASK, 145 143 .active_discharge_reg = RT4831_REG_DSVEN, 146 144 .active_discharge_mask = RT4831_NEGADEN_MASK, 145 + .owner = THIS_MODULE, 147 146 } 148 147 }; 149 148
+319
drivers/regulator/rt6160-regulator.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + 3 + #include <linux/delay.h> 4 + #include <linux/gpio/consumer.h> 5 + #include <linux/i2c.h> 6 + #include <linux/kernel.h> 7 + #include <linux/module.h> 8 + #include <linux/property.h> 9 + #include <linux/regmap.h> 10 + #include <linux/regulator/driver.h> 11 + #include <linux/regulator/of_regulator.h> 12 + 13 + #define RT6160_MODE_AUTO 0 14 + #define RT6160_MODE_FPWM 1 15 + 16 + #define RT6160_REG_CNTL 0x01 17 + #define RT6160_REG_STATUS 0x02 18 + #define RT6160_REG_DEVID 0x03 19 + #define RT6160_REG_VSELL 0x04 20 + #define RT6160_REG_VSELH 0x05 21 + #define RT6160_NUM_REGS (RT6160_REG_VSELH + 1) 22 + 23 + #define RT6160_FPWM_MASK BIT(3) 24 + #define RT6160_RAMPRATE_MASK GENMASK(1, 0) 25 + #define RT6160_VID_MASK GENMASK(7, 4) 26 + #define RT6160_VSEL_MASK GENMASK(6, 0) 27 + #define RT6160_HDSTAT_MASK BIT(4) 28 + #define RT6160_UVSTAT_MASK BIT(3) 29 + #define RT6160_OCSTAT_MASK BIT(2) 30 + #define RT6160_TSDSTAT_MASK BIT(1) 31 + #define RT6160_PGSTAT_MASK BIT(0) 32 + 33 + #define RT6160_VENDOR_ID 0xA0 34 + #define RT6160_VOUT_MINUV 2025000 35 + #define RT6160_VOUT_MAXUV 5200000 36 + #define RT6160_VOUT_STPUV 25000 37 + #define RT6160_N_VOUTS ((RT6160_VOUT_MAXUV - RT6160_VOUT_MINUV) / RT6160_VOUT_STPUV + 1) 38 + 39 + #define RT6160_I2CRDY_TIMEUS 100 40 + 41 + struct rt6160_priv { 42 + struct regulator_desc desc; 43 + struct gpio_desc *enable_gpio; 44 + struct regmap *regmap; 45 + bool enable_state; 46 + }; 47 + 48 + static const unsigned int rt6160_ramp_tables[] = { 49 + 1000, 2500, 5000, 10000 50 + }; 51 + 52 + static int rt6160_enable(struct regulator_dev *rdev) 53 + { 54 + struct rt6160_priv *priv = rdev_get_drvdata(rdev); 55 + 56 + if (!priv->enable_gpio) 57 + return 0; 58 + 59 + gpiod_set_value_cansleep(priv->enable_gpio, 1); 60 + priv->enable_state = true; 61 + 62 + usleep_range(RT6160_I2CRDY_TIMEUS, RT6160_I2CRDY_TIMEUS + 100); 63 + 64 + regcache_cache_only(priv->regmap, false); 65 + return regcache_sync(priv->regmap); 66 + } 67 + 68 + static int rt6160_disable(struct regulator_dev *rdev) 69 + { 70 + struct rt6160_priv *priv = rdev_get_drvdata(rdev); 71 + 72 + if (!priv->enable_gpio) 73 + return -EINVAL; 74 + 75 + /* Mark regcache as dirty and cache only before HW disabled */ 76 + regcache_cache_only(priv->regmap, true); 77 + regcache_mark_dirty(priv->regmap); 78 + 79 + priv->enable_state = false; 80 + gpiod_set_value_cansleep(priv->enable_gpio, 0); 81 + 82 + return 0; 83 + } 84 + 85 + static int rt6160_is_enabled(struct regulator_dev *rdev) 86 + { 87 + struct rt6160_priv *priv = rdev_get_drvdata(rdev); 88 + 89 + return priv->enable_state ? 1 : 0; 90 + } 91 + 92 + static int rt6160_set_mode(struct regulator_dev *rdev, unsigned int mode) 93 + { 94 + struct regmap *regmap = rdev_get_regmap(rdev); 95 + unsigned int mode_val; 96 + 97 + switch (mode) { 98 + case REGULATOR_MODE_FAST: 99 + mode_val = RT6160_FPWM_MASK; 100 + break; 101 + case REGULATOR_MODE_NORMAL: 102 + mode_val = 0; 103 + break; 104 + default: 105 + dev_err(&rdev->dev, "mode not supported\n"); 106 + return -EINVAL; 107 + } 108 + 109 + return regmap_update_bits(regmap, RT6160_REG_CNTL, RT6160_FPWM_MASK, mode_val); 110 + } 111 + 112 + static unsigned int rt6160_get_mode(struct regulator_dev *rdev) 113 + { 114 + struct regmap *regmap = rdev_get_regmap(rdev); 115 + unsigned int val; 116 + int ret; 117 + 118 + ret = regmap_read(regmap, RT6160_REG_CNTL, &val); 119 + if (ret) 120 + return ret; 121 + 122 + if (val & RT6160_FPWM_MASK) 123 + return REGULATOR_MODE_FAST; 124 + 125 + return REGULATOR_MODE_NORMAL; 126 + } 127 + 128 + static int rt6160_set_suspend_voltage(struct regulator_dev *rdev, int uV) 129 + { 130 + struct regmap *regmap = rdev_get_regmap(rdev); 131 + unsigned int suspend_vsel_reg; 132 + int vsel; 133 + 134 + vsel = regulator_map_voltage_linear(rdev, uV, uV); 135 + if (vsel < 0) 136 + return vsel; 137 + 138 + if (rdev->desc->vsel_reg == RT6160_REG_VSELL) 139 + suspend_vsel_reg = RT6160_REG_VSELH; 140 + else 141 + suspend_vsel_reg = RT6160_REG_VSELL; 142 + 143 + return regmap_update_bits(regmap, suspend_vsel_reg, 144 + RT6160_VSEL_MASK, vsel); 145 + } 146 + 147 + static int rt6160_get_error_flags(struct regulator_dev *rdev, unsigned int *flags) 148 + { 149 + struct regmap *regmap = rdev_get_regmap(rdev); 150 + unsigned int val, events = 0; 151 + int ret; 152 + 153 + ret = regmap_read(regmap, RT6160_REG_STATUS, &val); 154 + if (ret) 155 + return ret; 156 + 157 + if (val & (RT6160_HDSTAT_MASK | RT6160_TSDSTAT_MASK)) 158 + events |= REGULATOR_ERROR_OVER_TEMP; 159 + 160 + if (val & RT6160_UVSTAT_MASK) 161 + events |= REGULATOR_ERROR_UNDER_VOLTAGE; 162 + 163 + if (val & RT6160_OCSTAT_MASK) 164 + events |= REGULATOR_ERROR_OVER_CURRENT; 165 + 166 + if (val & RT6160_PGSTAT_MASK) 167 + events |= REGULATOR_ERROR_FAIL; 168 + 169 + *flags = events; 170 + return 0; 171 + } 172 + 173 + static const struct regulator_ops rt6160_regulator_ops = { 174 + .list_voltage = regulator_list_voltage_linear, 175 + .set_voltage_sel = regulator_set_voltage_sel_regmap, 176 + .get_voltage_sel = regulator_get_voltage_sel_regmap, 177 + 178 + .enable = rt6160_enable, 179 + .disable = rt6160_disable, 180 + .is_enabled = rt6160_is_enabled, 181 + 182 + .set_mode = rt6160_set_mode, 183 + .get_mode = rt6160_get_mode, 184 + .set_suspend_voltage = rt6160_set_suspend_voltage, 185 + .set_ramp_delay = regulator_set_ramp_delay_regmap, 186 + .get_error_flags = rt6160_get_error_flags, 187 + }; 188 + 189 + static unsigned int rt6160_of_map_mode(unsigned int mode) 190 + { 191 + switch (mode) { 192 + case RT6160_MODE_FPWM: 193 + return REGULATOR_MODE_FAST; 194 + case RT6160_MODE_AUTO: 195 + return REGULATOR_MODE_NORMAL; 196 + } 197 + 198 + return REGULATOR_MODE_INVALID; 199 + } 200 + 201 + static bool rt6160_is_accessible_reg(struct device *dev, unsigned int reg) 202 + { 203 + if (reg >= RT6160_REG_CNTL && reg <= RT6160_REG_VSELH) 204 + return true; 205 + return false; 206 + } 207 + 208 + static bool rt6160_is_volatile_reg(struct device *dev, unsigned int reg) 209 + { 210 + if (reg == RT6160_REG_STATUS) 211 + return true; 212 + return false; 213 + } 214 + 215 + static const struct regmap_config rt6160_regmap_config = { 216 + .reg_bits = 8, 217 + .val_bits = 8, 218 + .max_register = RT6160_REG_VSELH, 219 + .num_reg_defaults_raw = RT6160_NUM_REGS, 220 + .cache_type = REGCACHE_FLAT, 221 + 222 + .writeable_reg = rt6160_is_accessible_reg, 223 + .readable_reg = rt6160_is_accessible_reg, 224 + .volatile_reg = rt6160_is_volatile_reg, 225 + }; 226 + 227 + static int rt6160_probe(struct i2c_client *i2c) 228 + { 229 + struct rt6160_priv *priv; 230 + struct regulator_config regulator_cfg = {}; 231 + struct regulator_dev *rdev; 232 + bool vsel_active_low; 233 + unsigned int devid; 234 + int ret; 235 + 236 + priv = devm_kzalloc(&i2c->dev, sizeof(*priv), GFP_KERNEL); 237 + if (!priv) 238 + return -ENOMEM; 239 + 240 + vsel_active_low = 241 + device_property_present(&i2c->dev, "richtek,vsel-active-low"); 242 + 243 + priv->enable_gpio = devm_gpiod_get_optional(&i2c->dev, "enable", GPIOD_OUT_HIGH); 244 + if (IS_ERR(priv->enable_gpio)) { 245 + dev_err(&i2c->dev, "Failed to get 'enable' gpio\n"); 246 + return PTR_ERR(priv->enable_gpio); 247 + } 248 + priv->enable_state = true; 249 + 250 + usleep_range(RT6160_I2CRDY_TIMEUS, RT6160_I2CRDY_TIMEUS + 100); 251 + 252 + priv->regmap = devm_regmap_init_i2c(i2c, &rt6160_regmap_config); 253 + if (IS_ERR(priv->regmap)) { 254 + ret = PTR_ERR(priv->regmap); 255 + dev_err(&i2c->dev, "Failed to init regmap (%d)\n", ret); 256 + return ret; 257 + } 258 + 259 + ret = regmap_read(priv->regmap, RT6160_REG_DEVID, &devid); 260 + if (ret) 261 + return ret; 262 + 263 + if ((devid & RT6160_VID_MASK) != RT6160_VENDOR_ID) { 264 + dev_err(&i2c->dev, "VID not correct [0x%02x]\n", devid); 265 + return -ENODEV; 266 + } 267 + 268 + priv->desc.name = "rt6160-buckboost"; 269 + priv->desc.type = REGULATOR_VOLTAGE; 270 + priv->desc.owner = THIS_MODULE; 271 + priv->desc.min_uV = RT6160_VOUT_MINUV; 272 + priv->desc.uV_step = RT6160_VOUT_STPUV; 273 + if (vsel_active_low) 274 + priv->desc.vsel_reg = RT6160_REG_VSELL; 275 + else 276 + priv->desc.vsel_reg = RT6160_REG_VSELH; 277 + priv->desc.vsel_mask = RT6160_VSEL_MASK; 278 + priv->desc.n_voltages = RT6160_N_VOUTS; 279 + priv->desc.ramp_reg = RT6160_REG_CNTL; 280 + priv->desc.ramp_mask = RT6160_RAMPRATE_MASK; 281 + priv->desc.ramp_delay_table = rt6160_ramp_tables; 282 + priv->desc.n_ramp_values = ARRAY_SIZE(rt6160_ramp_tables); 283 + priv->desc.of_map_mode = rt6160_of_map_mode; 284 + priv->desc.ops = &rt6160_regulator_ops; 285 + 286 + regulator_cfg.dev = &i2c->dev; 287 + regulator_cfg.of_node = i2c->dev.of_node; 288 + regulator_cfg.regmap = priv->regmap; 289 + regulator_cfg.driver_data = priv; 290 + regulator_cfg.init_data = of_get_regulator_init_data(&i2c->dev, i2c->dev.of_node, 291 + &priv->desc); 292 + 293 + rdev = devm_regulator_register(&i2c->dev, &priv->desc, &regulator_cfg); 294 + if (IS_ERR(rdev)) { 295 + dev_err(&i2c->dev, "Failed to register regulator\n"); 296 + return PTR_ERR(rdev); 297 + } 298 + 299 + return 0; 300 + } 301 + 302 + static const struct of_device_id __maybe_unused rt6160_of_match_table[] = { 303 + { .compatible = "richtek,rt6160", }, 304 + {} 305 + }; 306 + MODULE_DEVICE_TABLE(of, rt6160_of_match_table); 307 + 308 + static struct i2c_driver rt6160_driver = { 309 + .driver = { 310 + .name = "rt6160", 311 + .of_match_table = rt6160_of_match_table, 312 + }, 313 + .probe_new = rt6160_probe, 314 + }; 315 + module_i2c_driver(rt6160_driver); 316 + 317 + MODULE_DESCRIPTION("Richtek RT6160 voltage regulator driver"); 318 + MODULE_AUTHOR("ChiYuan Huang <cy_huang@richtek.com>"); 319 + MODULE_LICENSE("GPL v2");
+254
drivers/regulator/rt6245-regulator.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + 3 + #include <linux/bitops.h> 4 + #include <linux/delay.h> 5 + #include <linux/gpio/consumer.h> 6 + #include <linux/i2c.h> 7 + #include <linux/kernel.h> 8 + #include <linux/module.h> 9 + #include <linux/regmap.h> 10 + #include <linux/regulator/driver.h> 11 + #include <linux/regulator/of_regulator.h> 12 + 13 + #define RT6245_VIRT_OCLIMIT 0x00 14 + #define RT6245_VIRT_OTLEVEL 0x01 15 + #define RT6245_VIRT_PGDLYTIME 0x02 16 + #define RT6245_VIRT_SLEWRATE 0x03 17 + #define RT6245_VIRT_SWFREQ 0x04 18 + #define RT6245_VIRT_VOUT 0x05 19 + 20 + #define RT6245_VOUT_MASK GENMASK(6, 0) 21 + #define RT6245_SLEW_MASK GENMASK(2, 0) 22 + #define RT6245_CHKSUM_MASK BIT(7) 23 + #define RT6245_CODE_MASK GENMASK(6, 0) 24 + 25 + /* HW Enable + Soft start time */ 26 + #define RT6245_ENTIME_IN_US 5000 27 + 28 + #define RT6245_VOUT_MINUV 437500 29 + #define RT6245_VOUT_MAXUV 1387500 30 + #define RT6245_VOUT_STEPUV 12500 31 + #define RT6245_NUM_VOUT ((RT6245_VOUT_MAXUV - RT6245_VOUT_MINUV) / RT6245_VOUT_STEPUV + 1) 32 + 33 + struct rt6245_priv { 34 + struct gpio_desc *enable_gpio; 35 + bool enable_state; 36 + }; 37 + 38 + static int rt6245_enable(struct regulator_dev *rdev) 39 + { 40 + struct rt6245_priv *priv = rdev_get_drvdata(rdev); 41 + struct regmap *regmap = rdev_get_regmap(rdev); 42 + int ret; 43 + 44 + if (!priv->enable_gpio) 45 + return 0; 46 + 47 + gpiod_direction_output(priv->enable_gpio, 1); 48 + usleep_range(RT6245_ENTIME_IN_US, RT6245_ENTIME_IN_US + 1000); 49 + 50 + regcache_cache_only(regmap, false); 51 + ret = regcache_sync(regmap); 52 + if (ret) 53 + return ret; 54 + 55 + priv->enable_state = true; 56 + return 0; 57 + } 58 + 59 + static int rt6245_disable(struct regulator_dev *rdev) 60 + { 61 + struct rt6245_priv *priv = rdev_get_drvdata(rdev); 62 + struct regmap *regmap = rdev_get_regmap(rdev); 63 + 64 + if (!priv->enable_gpio) 65 + return -EINVAL; 66 + 67 + regcache_cache_only(regmap, true); 68 + regcache_mark_dirty(regmap); 69 + 70 + gpiod_direction_output(priv->enable_gpio, 0); 71 + 72 + priv->enable_state = false; 73 + return 0; 74 + } 75 + 76 + static int rt6245_is_enabled(struct regulator_dev *rdev) 77 + { 78 + struct rt6245_priv *priv = rdev_get_drvdata(rdev); 79 + 80 + return priv->enable_state ? 1 : 0; 81 + } 82 + 83 + static const struct regulator_ops rt6245_regulator_ops = { 84 + .list_voltage = regulator_list_voltage_linear, 85 + .set_voltage_sel = regulator_set_voltage_sel_regmap, 86 + .get_voltage_sel = regulator_get_voltage_sel_regmap, 87 + .set_ramp_delay = regulator_set_ramp_delay_regmap, 88 + .enable = rt6245_enable, 89 + .disable = rt6245_disable, 90 + .is_enabled = rt6245_is_enabled, 91 + }; 92 + 93 + /* ramp delay dividend is 12500 uV/uS, and divisor from 1 to 8 */ 94 + static const unsigned int rt6245_ramp_delay_table[] = { 95 + 12500, 6250, 4167, 3125, 2500, 2083, 1786, 1562 96 + }; 97 + 98 + static const struct regulator_desc rt6245_regulator_desc = { 99 + .name = "rt6245-regulator", 100 + .ops = &rt6245_regulator_ops, 101 + .type = REGULATOR_VOLTAGE, 102 + .min_uV = RT6245_VOUT_MINUV, 103 + .uV_step = RT6245_VOUT_STEPUV, 104 + .n_voltages = RT6245_NUM_VOUT, 105 + .ramp_delay_table = rt6245_ramp_delay_table, 106 + .n_ramp_values = ARRAY_SIZE(rt6245_ramp_delay_table), 107 + .owner = THIS_MODULE, 108 + .vsel_reg = RT6245_VIRT_VOUT, 109 + .vsel_mask = RT6245_VOUT_MASK, 110 + .ramp_reg = RT6245_VIRT_SLEWRATE, 111 + .ramp_mask = RT6245_SLEW_MASK, 112 + }; 113 + 114 + static int rt6245_init_device_properties(struct device *dev) 115 + { 116 + const struct { 117 + const char *name; 118 + unsigned int reg; 119 + } rt6245_props[] = { 120 + { "richtek,oc-level-select", RT6245_VIRT_OCLIMIT }, 121 + { "richtek,ot-level-select", RT6245_VIRT_OTLEVEL }, 122 + { "richtek,pgdly-time-select", RT6245_VIRT_PGDLYTIME }, 123 + { "richtek,switch-freq-select", RT6245_VIRT_SWFREQ } 124 + }; 125 + struct regmap *regmap = dev_get_regmap(dev, NULL); 126 + u8 propval; 127 + int i, ret; 128 + 129 + for (i = 0; i < ARRAY_SIZE(rt6245_props); i++) { 130 + ret = device_property_read_u8(dev, rt6245_props[i].name, &propval); 131 + if (ret) 132 + continue; 133 + 134 + ret = regmap_write(regmap, rt6245_props[i].reg, propval); 135 + if (ret) { 136 + dev_err(dev, "Fail to apply [%s:%d]\n", rt6245_props[i].name, propval); 137 + return ret; 138 + } 139 + } 140 + 141 + return 0; 142 + } 143 + 144 + static int rt6245_reg_write(void *context, unsigned int reg, unsigned int val) 145 + { 146 + struct i2c_client *i2c = context; 147 + const u8 func_base[] = { 0x6F, 0x73, 0x78, 0x61, 0x7C, 0 }; 148 + unsigned int code, bit_count; 149 + 150 + code = func_base[reg]; 151 + code += val; 152 + 153 + /* xor checksum for bit 6 to 0 */ 154 + bit_count = hweight8(code & RT6245_CODE_MASK); 155 + if (bit_count % 2) 156 + code |= RT6245_CHKSUM_MASK; 157 + else 158 + code &= ~RT6245_CHKSUM_MASK; 159 + 160 + return i2c_smbus_write_byte(i2c, code); 161 + } 162 + 163 + static const struct reg_default rt6245_reg_defaults[] = { 164 + /* Default over current 14A */ 165 + { RT6245_VIRT_OCLIMIT, 2 }, 166 + /* Default over temperature 150'c */ 167 + { RT6245_VIRT_OTLEVEL, 0 }, 168 + /* Default power good delay time 10us */ 169 + { RT6245_VIRT_PGDLYTIME, 1 }, 170 + /* Default slewrate 12.5mV/uS */ 171 + { RT6245_VIRT_SLEWRATE, 0 }, 172 + /* Default switch frequency 800KHz */ 173 + { RT6245_VIRT_SWFREQ, 1 }, 174 + /* Default voltage 750mV */ 175 + { RT6245_VIRT_VOUT, 0x19 } 176 + }; 177 + 178 + static const struct regmap_config rt6245_regmap_config = { 179 + .reg_bits = 8, 180 + .val_bits = 8, 181 + .max_register = RT6245_VIRT_VOUT, 182 + .cache_type = REGCACHE_FLAT, 183 + .reg_defaults = rt6245_reg_defaults, 184 + .num_reg_defaults = ARRAY_SIZE(rt6245_reg_defaults), 185 + .reg_write = rt6245_reg_write, 186 + }; 187 + 188 + static int rt6245_probe(struct i2c_client *i2c) 189 + { 190 + struct rt6245_priv *priv; 191 + struct regmap *regmap; 192 + struct regulator_config regulator_cfg = {}; 193 + struct regulator_dev *rdev; 194 + int ret; 195 + 196 + priv = devm_kzalloc(&i2c->dev, sizeof(*priv), GFP_KERNEL); 197 + if (!priv) 198 + return -ENOMEM; 199 + 200 + priv->enable_state = true; 201 + 202 + priv->enable_gpio = devm_gpiod_get_optional(&i2c->dev, "enable", GPIOD_OUT_HIGH); 203 + if (IS_ERR(priv->enable_gpio)) { 204 + dev_err(&i2c->dev, "Failed to get 'enable' gpio\n"); 205 + return PTR_ERR(priv->enable_gpio); 206 + } 207 + 208 + usleep_range(RT6245_ENTIME_IN_US, RT6245_ENTIME_IN_US + 1000); 209 + 210 + regmap = devm_regmap_init(&i2c->dev, NULL, i2c, &rt6245_regmap_config); 211 + if (IS_ERR(regmap)) { 212 + dev_err(&i2c->dev, "Failed to initialize the regmap\n"); 213 + return PTR_ERR(regmap); 214 + } 215 + 216 + ret = rt6245_init_device_properties(&i2c->dev); 217 + if (ret) { 218 + dev_err(&i2c->dev, "Failed to initialize device properties\n"); 219 + return ret; 220 + } 221 + 222 + regulator_cfg.dev = &i2c->dev; 223 + regulator_cfg.of_node = i2c->dev.of_node; 224 + regulator_cfg.regmap = regmap; 225 + regulator_cfg.driver_data = priv; 226 + regulator_cfg.init_data = of_get_regulator_init_data(&i2c->dev, i2c->dev.of_node, 227 + &rt6245_regulator_desc); 228 + rdev = devm_regulator_register(&i2c->dev, &rt6245_regulator_desc, &regulator_cfg); 229 + if (IS_ERR(rdev)) { 230 + dev_err(&i2c->dev, "Failed to register regulator\n"); 231 + return PTR_ERR(rdev); 232 + } 233 + 234 + return 0; 235 + } 236 + 237 + static const struct of_device_id __maybe_unused rt6245_of_match_table[] = { 238 + { .compatible = "richtek,rt6245", }, 239 + {} 240 + }; 241 + MODULE_DEVICE_TABLE(of, rt6245_of_match_table); 242 + 243 + static struct i2c_driver rt6245_driver = { 244 + .driver = { 245 + .name = "rt6245", 246 + .of_match_table = rt6245_of_match_table, 247 + }, 248 + .probe_new = rt6245_probe, 249 + }; 250 + module_i2c_driver(rt6245_driver); 251 + 252 + MODULE_AUTHOR("ChiYuan Huang <cy_huang@richtek.com>"); 253 + MODULE_DESCRIPTION("Richtek RT6245 Regulator Driver"); 254 + MODULE_LICENSE("GPL v2");
+18 -2
drivers/regulator/stpmic1_regulator.c
··· 32 32 33 33 static int stpmic1_set_mode(struct regulator_dev *rdev, unsigned int mode); 34 34 static unsigned int stpmic1_get_mode(struct regulator_dev *rdev); 35 - static int stpmic1_set_icc(struct regulator_dev *rdev); 35 + static int stpmic1_set_icc(struct regulator_dev *rdev, int lim, int severity, 36 + bool enable); 36 37 static unsigned int stpmic1_map_mode(unsigned int mode); 37 38 38 39 enum { ··· 492 491 STPMIC1_BUCK_MODE_LP, value); 493 492 } 494 493 495 - static int stpmic1_set_icc(struct regulator_dev *rdev) 494 + static int stpmic1_set_icc(struct regulator_dev *rdev, int lim, int severity, 495 + bool enable) 496 496 { 497 497 struct stpmic1_regulator_cfg *cfg = rdev_get_drvdata(rdev); 498 498 struct regmap *regmap = rdev_get_regmap(rdev); 499 + 500 + /* 501 + * The code seems like one bit in a register controls whether OCP is 502 + * enabled. So we might be able to turn it off here is if that 503 + * was requested. I won't support this because I don't have the HW. 504 + * Feel free to try and implement if you have the HW and need kernel 505 + * to disable this. 506 + * 507 + * Also, I don't know if limit can be configured or if we support 508 + * error/warning instead of protect. So I just keep existing logic 509 + * and assume no. 510 + */ 511 + if (lim || severity != REGULATOR_SEVERITY_PROT || !enable) 512 + return -EINVAL; 499 513 500 514 /* enable switch off in case of over current */ 501 515 return regmap_update_bits(regmap, cfg->icc_reg, cfg->icc_mask,
+128
drivers/regulator/sy7636a-regulator.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + // 3 + // Functions to access SY3686A power management chip voltages 4 + // 5 + // Copyright (C) 2019 reMarkable AS - http://www.remarkable.com/ 6 + // 7 + // Authors: Lars Ivar Miljeteig <lars.ivar.miljeteig@remarkable.com> 8 + // Alistair Francis <alistair@alistair23.me> 9 + 10 + #include <linux/module.h> 11 + #include <linux/platform_device.h> 12 + #include <linux/regmap.h> 13 + #include <linux/gpio/consumer.h> 14 + #include <linux/mfd/sy7636a.h> 15 + 16 + #define SY7636A_POLL_ENABLED_TIME 500 17 + 18 + static int sy7636a_get_vcom_voltage_op(struct regulator_dev *rdev) 19 + { 20 + int ret; 21 + unsigned int val, val_h; 22 + 23 + ret = regmap_read(rdev->regmap, SY7636A_REG_VCOM_ADJUST_CTRL_L, &val); 24 + if (ret) 25 + return ret; 26 + 27 + ret = regmap_read(rdev->regmap, SY7636A_REG_VCOM_ADJUST_CTRL_H, &val_h); 28 + if (ret) 29 + return ret; 30 + 31 + val |= (val_h << VCOM_ADJUST_CTRL_SHIFT); 32 + 33 + return (val & VCOM_ADJUST_CTRL_MASK) * VCOM_ADJUST_CTRL_SCAL; 34 + } 35 + 36 + static int sy7636a_get_status(struct regulator_dev *rdev) 37 + { 38 + struct sy7636a *sy7636a = rdev_get_drvdata(rdev); 39 + int ret = 0; 40 + 41 + ret = gpiod_get_value_cansleep(sy7636a->pgood_gpio); 42 + if (ret < 0) 43 + dev_err(&rdev->dev, "Failed to read pgood gpio: %d\n", ret); 44 + 45 + return ret; 46 + } 47 + 48 + static const struct regulator_ops sy7636a_vcom_volt_ops = { 49 + .get_voltage = sy7636a_get_vcom_voltage_op, 50 + .enable = regulator_enable_regmap, 51 + .disable = regulator_disable_regmap, 52 + .is_enabled = regulator_is_enabled_regmap, 53 + .get_status = sy7636a_get_status, 54 + }; 55 + 56 + static const struct regulator_desc desc = { 57 + .name = "vcom", 58 + .id = 0, 59 + .ops = &sy7636a_vcom_volt_ops, 60 + .type = REGULATOR_VOLTAGE, 61 + .owner = THIS_MODULE, 62 + .enable_reg = SY7636A_REG_OPERATION_MODE_CRL, 63 + .enable_mask = SY7636A_OPERATION_MODE_CRL_ONOFF, 64 + .poll_enabled_time = SY7636A_POLL_ENABLED_TIME, 65 + .regulators_node = of_match_ptr("regulators"), 66 + .of_match = of_match_ptr("vcom"), 67 + }; 68 + 69 + static int sy7636a_regulator_probe(struct platform_device *pdev) 70 + { 71 + struct sy7636a *sy7636a = dev_get_drvdata(pdev->dev.parent); 72 + struct regulator_config config = { }; 73 + struct regulator_dev *rdev; 74 + struct gpio_desc *gdp; 75 + int ret; 76 + 77 + if (!sy7636a) 78 + return -EPROBE_DEFER; 79 + 80 + platform_set_drvdata(pdev, sy7636a); 81 + 82 + gdp = devm_gpiod_get(sy7636a->dev, "epd-pwr-good", GPIOD_IN); 83 + if (IS_ERR(gdp)) { 84 + dev_err(sy7636a->dev, "Power good GPIO fault %ld\n", PTR_ERR(gdp)); 85 + return PTR_ERR(gdp); 86 + } 87 + 88 + sy7636a->pgood_gpio = gdp; 89 + 90 + ret = regmap_write(sy7636a->regmap, SY7636A_REG_POWER_ON_DELAY_TIME, 0x0); 91 + if (ret) { 92 + dev_err(sy7636a->dev, "Failed to initialize regulator: %d\n", ret); 93 + return ret; 94 + } 95 + 96 + config.dev = &pdev->dev; 97 + config.dev->of_node = sy7636a->dev->of_node; 98 + config.driver_data = sy7636a; 99 + config.regmap = sy7636a->regmap; 100 + 101 + rdev = devm_regulator_register(&pdev->dev, &desc, &config); 102 + if (IS_ERR(rdev)) { 103 + dev_err(sy7636a->dev, "Failed to register %s regulator\n", 104 + pdev->name); 105 + return PTR_ERR(rdev); 106 + } 107 + 108 + return 0; 109 + } 110 + 111 + static const struct platform_device_id sy7636a_regulator_id_table[] = { 112 + { "sy7636a-regulator", }, 113 + { } 114 + }; 115 + MODULE_DEVICE_TABLE(platform, sy7636a_regulator_id_table); 116 + 117 + static struct platform_driver sy7636a_regulator_driver = { 118 + .driver = { 119 + .name = "sy7636a-regulator", 120 + }, 121 + .probe = sy7636a_regulator_probe, 122 + .id_table = sy7636a_regulator_id_table, 123 + }; 124 + module_platform_driver(sy7636a_regulator_driver); 125 + 126 + MODULE_AUTHOR("Lars Ivar Miljeteig <lars.ivar.miljeteig@remarkable.com>"); 127 + MODULE_DESCRIPTION("SY7636A voltage regulator driver"); 128 + MODULE_LICENSE("GPL v2");
+1
drivers/regulator/uniphier-regulator.c
··· 201 201 }, 202 202 { /* Sentinel */ }, 203 203 }; 204 + MODULE_DEVICE_TABLE(of, uniphier_regulator_match); 204 205 205 206 static struct platform_driver uniphier_regulator_driver = { 206 207 .probe = uniphier_regulator_probe,
+7 -7
drivers/regulator/userspace-consumer.c
··· 29 29 struct regulator_bulk_data *supplies; 30 30 }; 31 31 32 - static ssize_t reg_show_name(struct device *dev, 33 - struct device_attribute *attr, char *buf) 32 + static ssize_t name_show(struct device *dev, 33 + struct device_attribute *attr, char *buf) 34 34 { 35 35 struct userspace_consumer_data *data = dev_get_drvdata(dev); 36 36 37 37 return sprintf(buf, "%s\n", data->name); 38 38 } 39 39 40 - static ssize_t reg_show_state(struct device *dev, 40 + static ssize_t state_show(struct device *dev, 41 41 struct device_attribute *attr, char *buf) 42 42 { 43 43 struct userspace_consumer_data *data = dev_get_drvdata(dev); ··· 48 48 return sprintf(buf, "disabled\n"); 49 49 } 50 50 51 - static ssize_t reg_set_state(struct device *dev, struct device_attribute *attr, 52 - const char *buf, size_t count) 51 + static ssize_t state_store(struct device *dev, struct device_attribute *attr, 52 + const char *buf, size_t count) 53 53 { 54 54 struct userspace_consumer_data *data = dev_get_drvdata(dev); 55 55 bool enabled; ··· 87 87 return count; 88 88 } 89 89 90 - static DEVICE_ATTR(name, 0444, reg_show_name, NULL); 91 - static DEVICE_ATTR(state, 0644, reg_show_state, reg_set_state); 90 + static DEVICE_ATTR_RO(name); 91 + static DEVICE_ATTR_RW(state); 92 92 93 93 static struct attribute *attributes[] = { 94 94 &dev_attr_name.attr,
+1 -1
drivers/rtc/rtc-mt6397.c
··· 75 75 tm->tm_min = data[RTC_OFFSET_MIN]; 76 76 tm->tm_hour = data[RTC_OFFSET_HOUR]; 77 77 tm->tm_mday = data[RTC_OFFSET_DOM]; 78 - tm->tm_mon = data[RTC_OFFSET_MTH]; 78 + tm->tm_mon = data[RTC_OFFSET_MTH] & RTC_TC_MTH_MASK; 79 79 tm->tm_year = data[RTC_OFFSET_YEAR]; 80 80 81 81 ret = regmap_read(rtc->regmap, rtc->addr_base + RTC_TC_SEC, sec);
+7 -62
drivers/thermal/thermal_core.c
··· 36 36 37 37 static DEFINE_MUTEX(thermal_list_lock); 38 38 static DEFINE_MUTEX(thermal_governor_lock); 39 - static DEFINE_MUTEX(poweroff_lock); 40 39 41 40 static atomic_t in_suspend; 42 - static bool power_off_triggered; 43 41 44 42 static struct thermal_governor *def_governor; 45 43 ··· 325 327 def_governor->throttle(tz, trip); 326 328 } 327 329 328 - /** 329 - * thermal_emergency_poweroff_func - emergency poweroff work after a known delay 330 - * @work: work_struct associated with the emergency poweroff function 331 - * 332 - * This function is called in very critical situations to force 333 - * a kernel poweroff after a configurable timeout value. 334 - */ 335 - static void thermal_emergency_poweroff_func(struct work_struct *work) 336 - { 337 - /* 338 - * We have reached here after the emergency thermal shutdown 339 - * Waiting period has expired. This means orderly_poweroff has 340 - * not been able to shut off the system for some reason. 341 - * Try to shut down the system immediately using kernel_power_off 342 - * if populated 343 - */ 344 - WARN(1, "Attempting kernel_power_off: Temperature too high\n"); 345 - kernel_power_off(); 346 - 347 - /* 348 - * Worst of the worst case trigger emergency restart 349 - */ 350 - WARN(1, "Attempting emergency_restart: Temperature too high\n"); 351 - emergency_restart(); 352 - } 353 - 354 - static DECLARE_DELAYED_WORK(thermal_emergency_poweroff_work, 355 - thermal_emergency_poweroff_func); 356 - 357 - /** 358 - * thermal_emergency_poweroff - Trigger an emergency system poweroff 359 - * 360 - * This may be called from any critical situation to trigger a system shutdown 361 - * after a known period of time. By default this is not scheduled. 362 - */ 363 - static void thermal_emergency_poweroff(void) 364 - { 365 - int poweroff_delay_ms = CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS; 366 - /* 367 - * poweroff_delay_ms must be a carefully profiled positive value. 368 - * Its a must for thermal_emergency_poweroff_work to be scheduled 369 - */ 370 - if (poweroff_delay_ms <= 0) 371 - return; 372 - schedule_delayed_work(&thermal_emergency_poweroff_work, 373 - msecs_to_jiffies(poweroff_delay_ms)); 374 - } 375 - 376 330 void thermal_zone_device_critical(struct thermal_zone_device *tz) 377 331 { 332 + /* 333 + * poweroff_delay_ms must be a carefully profiled positive value. 334 + * Its a must for forced_emergency_poweroff_work to be scheduled. 335 + */ 336 + int poweroff_delay_ms = CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS; 337 + 378 338 dev_emerg(&tz->device, "%s: critical temperature reached, " 379 339 "shutting down\n", tz->type); 380 340 381 - mutex_lock(&poweroff_lock); 382 - if (!power_off_triggered) { 383 - /* 384 - * Queue a backup emergency shutdown in the event of 385 - * orderly_poweroff failure 386 - */ 387 - thermal_emergency_poweroff(); 388 - orderly_poweroff(true); 389 - power_off_triggered = true; 390 - } 391 - mutex_unlock(&poweroff_lock); 341 + hw_protection_shutdown("Temperature too high", poweroff_delay_ms); 392 342 } 393 343 EXPORT_SYMBOL(thermal_zone_device_critical); 394 344 ··· 1484 1538 ida_destroy(&thermal_cdev_ida); 1485 1539 mutex_destroy(&thermal_list_lock); 1486 1540 mutex_destroy(&thermal_governor_lock); 1487 - mutex_destroy(&poweroff_lock); 1488 1541 return result; 1489 1542 } 1490 1543 postcore_initcall(thermal_init);
+3 -5
include/linux/mfd/mt6358/core.h
··· 6 6 #ifndef __MFD_MT6358_CORE_H__ 7 7 #define __MFD_MT6358_CORE_H__ 8 8 9 - #define MT6358_REG_WIDTH 16 10 - 11 9 struct irq_top_t { 12 10 int hwirq_base; 13 11 unsigned int num_int_regs; 14 - unsigned int num_int_bits; 15 12 unsigned int en_reg; 16 13 unsigned int en_reg_shift; 17 14 unsigned int sta_reg; ··· 22 25 unsigned short top_int_status_reg; 23 26 bool *enable_hwirq; 24 27 bool *cache_hwirq; 28 + const struct irq_top_t *pmic_ints; 25 29 }; 26 30 27 31 enum mt6358_irq_top_status_shift { ··· 144 146 { \ 145 147 .hwirq_base = MT6358_IRQ_##sp##_BASE, \ 146 148 .num_int_regs = \ 147 - ((MT6358_IRQ_##sp##_BITS - 1) / MT6358_REG_WIDTH) + 1, \ 148 - .num_int_bits = MT6358_IRQ_##sp##_BITS, \ 149 + ((MT6358_IRQ_##sp##_BITS - 1) / \ 150 + MTK_PMIC_REG_WIDTH) + 1, \ 149 151 .en_reg = MT6358_##sp##_TOP_INT_CON0, \ 150 152 .en_reg_shift = 0x6, \ 151 153 .sta_reg = MT6358_##sp##_TOP_INT_STATUS0, \
+133
include/linux/mfd/mt6359/core.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Copyright (c) 2021 MediaTek Inc. 4 + */ 5 + 6 + #ifndef __MFD_MT6359_CORE_H__ 7 + #define __MFD_MT6359_CORE_H__ 8 + 9 + enum mt6359_irq_top_status_shift { 10 + MT6359_BUCK_TOP = 0, 11 + MT6359_LDO_TOP, 12 + MT6359_PSC_TOP, 13 + MT6359_SCK_TOP, 14 + MT6359_BM_TOP, 15 + MT6359_HK_TOP, 16 + MT6359_AUD_TOP = 7, 17 + MT6359_MISC_TOP, 18 + }; 19 + 20 + enum mt6359_irq_numbers { 21 + MT6359_IRQ_VCORE_OC = 1, 22 + MT6359_IRQ_VGPU11_OC, 23 + MT6359_IRQ_VGPU12_OC, 24 + MT6359_IRQ_VMODEM_OC, 25 + MT6359_IRQ_VPROC1_OC, 26 + MT6359_IRQ_VPROC2_OC, 27 + MT6359_IRQ_VS1_OC, 28 + MT6359_IRQ_VS2_OC, 29 + MT6359_IRQ_VPA_OC = 9, 30 + MT6359_IRQ_VFE28_OC = 16, 31 + MT6359_IRQ_VXO22_OC, 32 + MT6359_IRQ_VRF18_OC, 33 + MT6359_IRQ_VRF12_OC, 34 + MT6359_IRQ_VEFUSE_OC, 35 + MT6359_IRQ_VCN33_1_OC, 36 + MT6359_IRQ_VCN33_2_OC, 37 + MT6359_IRQ_VCN13_OC, 38 + MT6359_IRQ_VCN18_OC, 39 + MT6359_IRQ_VA09_OC, 40 + MT6359_IRQ_VCAMIO_OC, 41 + MT6359_IRQ_VA12_OC, 42 + MT6359_IRQ_VAUX18_OC, 43 + MT6359_IRQ_VAUD18_OC, 44 + MT6359_IRQ_VIO18_OC, 45 + MT6359_IRQ_VSRAM_PROC1_OC, 46 + MT6359_IRQ_VSRAM_PROC2_OC, 47 + MT6359_IRQ_VSRAM_OTHERS_OC, 48 + MT6359_IRQ_VSRAM_MD_OC, 49 + MT6359_IRQ_VEMC_OC, 50 + MT6359_IRQ_VSIM1_OC, 51 + MT6359_IRQ_VSIM2_OC, 52 + MT6359_IRQ_VUSB_OC, 53 + MT6359_IRQ_VRFCK_OC, 54 + MT6359_IRQ_VBBCK_OC, 55 + MT6359_IRQ_VBIF28_OC, 56 + MT6359_IRQ_VIBR_OC, 57 + MT6359_IRQ_VIO28_OC, 58 + MT6359_IRQ_VM18_OC, 59 + MT6359_IRQ_VUFS_OC = 45, 60 + MT6359_IRQ_PWRKEY = 48, 61 + MT6359_IRQ_HOMEKEY, 62 + MT6359_IRQ_PWRKEY_R, 63 + MT6359_IRQ_HOMEKEY_R, 64 + MT6359_IRQ_NI_LBAT_INT, 65 + MT6359_IRQ_CHRDET_EDGE = 53, 66 + MT6359_IRQ_RTC = 64, 67 + MT6359_IRQ_FG_BAT_H = 80, 68 + MT6359_IRQ_FG_BAT_L, 69 + MT6359_IRQ_FG_CUR_H, 70 + MT6359_IRQ_FG_CUR_L, 71 + MT6359_IRQ_FG_ZCV = 84, 72 + MT6359_IRQ_FG_N_CHARGE_L = 87, 73 + MT6359_IRQ_FG_IAVG_H, 74 + MT6359_IRQ_FG_IAVG_L = 89, 75 + MT6359_IRQ_FG_DISCHARGE = 91, 76 + MT6359_IRQ_FG_CHARGE, 77 + MT6359_IRQ_BATON_LV = 96, 78 + MT6359_IRQ_BATON_BAT_IN = 98, 79 + MT6359_IRQ_BATON_BAT_OU, 80 + MT6359_IRQ_BIF = 100, 81 + MT6359_IRQ_BAT_H = 112, 82 + MT6359_IRQ_BAT_L, 83 + MT6359_IRQ_BAT2_H, 84 + MT6359_IRQ_BAT2_L, 85 + MT6359_IRQ_BAT_TEMP_H, 86 + MT6359_IRQ_BAT_TEMP_L, 87 + MT6359_IRQ_THR_H, 88 + MT6359_IRQ_THR_L, 89 + MT6359_IRQ_AUXADC_IMP, 90 + MT6359_IRQ_NAG_C_DLTV = 121, 91 + MT6359_IRQ_AUDIO = 128, 92 + MT6359_IRQ_ACCDET = 133, 93 + MT6359_IRQ_ACCDET_EINT0, 94 + MT6359_IRQ_ACCDET_EINT1, 95 + MT6359_IRQ_SPI_CMD_ALERT = 144, 96 + MT6359_IRQ_NR, 97 + }; 98 + 99 + #define MT6359_IRQ_BUCK_BASE MT6359_IRQ_VCORE_OC 100 + #define MT6359_IRQ_LDO_BASE MT6359_IRQ_VFE28_OC 101 + #define MT6359_IRQ_PSC_BASE MT6359_IRQ_PWRKEY 102 + #define MT6359_IRQ_SCK_BASE MT6359_IRQ_RTC 103 + #define MT6359_IRQ_BM_BASE MT6359_IRQ_FG_BAT_H 104 + #define MT6359_IRQ_HK_BASE MT6359_IRQ_BAT_H 105 + #define MT6359_IRQ_AUD_BASE MT6359_IRQ_AUDIO 106 + #define MT6359_IRQ_MISC_BASE MT6359_IRQ_SPI_CMD_ALERT 107 + 108 + #define MT6359_IRQ_BUCK_BITS (MT6359_IRQ_VPA_OC - MT6359_IRQ_BUCK_BASE + 1) 109 + #define MT6359_IRQ_LDO_BITS (MT6359_IRQ_VUFS_OC - MT6359_IRQ_LDO_BASE + 1) 110 + #define MT6359_IRQ_PSC_BITS \ 111 + (MT6359_IRQ_CHRDET_EDGE - MT6359_IRQ_PSC_BASE + 1) 112 + #define MT6359_IRQ_SCK_BITS (MT6359_IRQ_RTC - MT6359_IRQ_SCK_BASE + 1) 113 + #define MT6359_IRQ_BM_BITS (MT6359_IRQ_BIF - MT6359_IRQ_BM_BASE + 1) 114 + #define MT6359_IRQ_HK_BITS (MT6359_IRQ_NAG_C_DLTV - MT6359_IRQ_HK_BASE + 1) 115 + #define MT6359_IRQ_AUD_BITS \ 116 + (MT6359_IRQ_ACCDET_EINT1 - MT6359_IRQ_AUD_BASE + 1) 117 + #define MT6359_IRQ_MISC_BITS \ 118 + (MT6359_IRQ_SPI_CMD_ALERT - MT6359_IRQ_MISC_BASE + 1) 119 + 120 + #define MT6359_TOP_GEN(sp) \ 121 + { \ 122 + .hwirq_base = MT6359_IRQ_##sp##_BASE, \ 123 + .num_int_regs = \ 124 + ((MT6359_IRQ_##sp##_BITS - 1) / \ 125 + MTK_PMIC_REG_WIDTH) + 1, \ 126 + .en_reg = MT6359_##sp##_TOP_INT_CON0, \ 127 + .en_reg_shift = 0x6, \ 128 + .sta_reg = MT6359_##sp##_TOP_INT_STATUS0, \ 129 + .sta_reg_shift = 0x2, \ 130 + .top_offset = MT6359_##sp##_TOP, \ 131 + } 132 + 133 + #endif /* __MFD_MT6359_CORE_H__ */
+529
include/linux/mfd/mt6359/registers.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Copyright (c) 2021 MediaTek Inc. 4 + */ 5 + 6 + #ifndef __MFD_MT6359_REGISTERS_H__ 7 + #define __MFD_MT6359_REGISTERS_H__ 8 + 9 + /* PMIC Registers */ 10 + #define MT6359_SWCID 0xa 11 + #define MT6359_MISC_TOP_INT_CON0 0x188 12 + #define MT6359_MISC_TOP_INT_STATUS0 0x194 13 + #define MT6359_TOP_INT_STATUS0 0x19e 14 + #define MT6359_SCK_TOP_INT_CON0 0x528 15 + #define MT6359_SCK_TOP_INT_STATUS0 0x534 16 + #define MT6359_EOSC_CALI_CON0 0x53a 17 + #define MT6359_EOSC_CALI_CON1 0x53c 18 + #define MT6359_RTC_MIX_CON0 0x53e 19 + #define MT6359_RTC_MIX_CON1 0x540 20 + #define MT6359_RTC_MIX_CON2 0x542 21 + #define MT6359_RTC_DSN_ID 0x580 22 + #define MT6359_RTC_DSN_REV0 0x582 23 + #define MT6359_RTC_DBI 0x584 24 + #define MT6359_RTC_DXI 0x586 25 + #define MT6359_RTC_BBPU 0x588 26 + #define MT6359_RTC_IRQ_STA 0x58a 27 + #define MT6359_RTC_IRQ_EN 0x58c 28 + #define MT6359_RTC_CII_EN 0x58e 29 + #define MT6359_RTC_AL_MASK 0x590 30 + #define MT6359_RTC_TC_SEC 0x592 31 + #define MT6359_RTC_TC_MIN 0x594 32 + #define MT6359_RTC_TC_HOU 0x596 33 + #define MT6359_RTC_TC_DOM 0x598 34 + #define MT6359_RTC_TC_DOW 0x59a 35 + #define MT6359_RTC_TC_MTH 0x59c 36 + #define MT6359_RTC_TC_YEA 0x59e 37 + #define MT6359_RTC_AL_SEC 0x5a0 38 + #define MT6359_RTC_AL_MIN 0x5a2 39 + #define MT6359_RTC_AL_HOU 0x5a4 40 + #define MT6359_RTC_AL_DOM 0x5a6 41 + #define MT6359_RTC_AL_DOW 0x5a8 42 + #define MT6359_RTC_AL_MTH 0x5aa 43 + #define MT6359_RTC_AL_YEA 0x5ac 44 + #define MT6359_RTC_OSC32CON 0x5ae 45 + #define MT6359_RTC_POWERKEY1 0x5b0 46 + #define MT6359_RTC_POWERKEY2 0x5b2 47 + #define MT6359_RTC_PDN1 0x5b4 48 + #define MT6359_RTC_PDN2 0x5b6 49 + #define MT6359_RTC_SPAR0 0x5b8 50 + #define MT6359_RTC_SPAR1 0x5ba 51 + #define MT6359_RTC_PROT 0x5bc 52 + #define MT6359_RTC_DIFF 0x5be 53 + #define MT6359_RTC_CALI 0x5c0 54 + #define MT6359_RTC_WRTGR 0x5c2 55 + #define MT6359_RTC_CON 0x5c4 56 + #define MT6359_RTC_SEC_CTRL 0x5c6 57 + #define MT6359_RTC_INT_CNT 0x5c8 58 + #define MT6359_RTC_SEC_DAT0 0x5ca 59 + #define MT6359_RTC_SEC_DAT1 0x5cc 60 + #define MT6359_RTC_SEC_DAT2 0x5ce 61 + #define MT6359_RTC_SEC_DSN_ID 0x600 62 + #define MT6359_RTC_SEC_DSN_REV0 0x602 63 + #define MT6359_RTC_SEC_DBI 0x604 64 + #define MT6359_RTC_SEC_DXI 0x606 65 + #define MT6359_RTC_TC_SEC_SEC 0x608 66 + #define MT6359_RTC_TC_MIN_SEC 0x60a 67 + #define MT6359_RTC_TC_HOU_SEC 0x60c 68 + #define MT6359_RTC_TC_DOM_SEC 0x60e 69 + #define MT6359_RTC_TC_DOW_SEC 0x610 70 + #define MT6359_RTC_TC_MTH_SEC 0x612 71 + #define MT6359_RTC_TC_YEA_SEC 0x614 72 + #define MT6359_RTC_SEC_CK_PDN 0x616 73 + #define MT6359_RTC_SEC_WRTGR 0x618 74 + #define MT6359_PSC_TOP_INT_CON0 0x910 75 + #define MT6359_PSC_TOP_INT_STATUS0 0x91c 76 + #define MT6359_BM_TOP_INT_CON0 0xc32 77 + #define MT6359_BM_TOP_INT_CON1 0xc38 78 + #define MT6359_BM_TOP_INT_STATUS0 0xc4a 79 + #define MT6359_BM_TOP_INT_STATUS1 0xc4c 80 + #define MT6359_HK_TOP_INT_CON0 0xf92 81 + #define MT6359_HK_TOP_INT_STATUS0 0xf9e 82 + #define MT6359_BUCK_TOP_INT_CON0 0x1418 83 + #define MT6359_BUCK_TOP_INT_STATUS0 0x1424 84 + #define MT6359_BUCK_VPU_CON0 0x1488 85 + #define MT6359_BUCK_VPU_DBG0 0x14a6 86 + #define MT6359_BUCK_VPU_DBG1 0x14a8 87 + #define MT6359_BUCK_VPU_ELR0 0x14ac 88 + #define MT6359_BUCK_VCORE_CON0 0x1508 89 + #define MT6359_BUCK_VCORE_DBG0 0x1526 90 + #define MT6359_BUCK_VCORE_DBG1 0x1528 91 + #define MT6359_BUCK_VCORE_SSHUB_CON0 0x152a 92 + #define MT6359_BUCK_VCORE_ELR0 0x1534 93 + #define MT6359_BUCK_VGPU11_CON0 0x1588 94 + #define MT6359_BUCK_VGPU11_DBG0 0x15a6 95 + #define MT6359_BUCK_VGPU11_DBG1 0x15a8 96 + #define MT6359_BUCK_VGPU11_ELR0 0x15ac 97 + #define MT6359_BUCK_VMODEM_CON0 0x1688 98 + #define MT6359_BUCK_VMODEM_DBG0 0x16a6 99 + #define MT6359_BUCK_VMODEM_DBG1 0x16a8 100 + #define MT6359_BUCK_VMODEM_ELR0 0x16ae 101 + #define MT6359_BUCK_VPROC1_CON0 0x1708 102 + #define MT6359_BUCK_VPROC1_DBG0 0x1726 103 + #define MT6359_BUCK_VPROC1_DBG1 0x1728 104 + #define MT6359_BUCK_VPROC1_ELR0 0x172e 105 + #define MT6359_BUCK_VPROC2_CON0 0x1788 106 + #define MT6359_BUCK_VPROC2_DBG0 0x17a6 107 + #define MT6359_BUCK_VPROC2_DBG1 0x17a8 108 + #define MT6359_BUCK_VPROC2_ELR0 0x17b2 109 + #define MT6359_BUCK_VS1_CON0 0x1808 110 + #define MT6359_BUCK_VS1_DBG0 0x1826 111 + #define MT6359_BUCK_VS1_DBG1 0x1828 112 + #define MT6359_BUCK_VS1_ELR0 0x1834 113 + #define MT6359_BUCK_VS2_CON0 0x1888 114 + #define MT6359_BUCK_VS2_DBG0 0x18a6 115 + #define MT6359_BUCK_VS2_DBG1 0x18a8 116 + #define MT6359_BUCK_VS2_ELR0 0x18b4 117 + #define MT6359_BUCK_VPA_CON0 0x1908 118 + #define MT6359_BUCK_VPA_CON1 0x190e 119 + #define MT6359_BUCK_VPA_CFG0 0x1910 120 + #define MT6359_BUCK_VPA_CFG1 0x1912 121 + #define MT6359_BUCK_VPA_DBG0 0x1914 122 + #define MT6359_BUCK_VPA_DBG1 0x1916 123 + #define MT6359_VGPUVCORE_ANA_CON2 0x198e 124 + #define MT6359_VGPUVCORE_ANA_CON13 0x19a4 125 + #define MT6359_VPROC1_ANA_CON3 0x19b2 126 + #define MT6359_VPROC2_ANA_CON3 0x1a0e 127 + #define MT6359_VMODEM_ANA_CON3 0x1a1a 128 + #define MT6359_VPU_ANA_CON3 0x1a26 129 + #define MT6359_VS1_ANA_CON0 0x1a2c 130 + #define MT6359_VS2_ANA_CON0 0x1a34 131 + #define MT6359_VPA_ANA_CON0 0x1a3c 132 + #define MT6359_LDO_TOP_INT_CON0 0x1b14 133 + #define MT6359_LDO_TOP_INT_CON1 0x1b1a 134 + #define MT6359_LDO_TOP_INT_STATUS0 0x1b28 135 + #define MT6359_LDO_TOP_INT_STATUS1 0x1b2a 136 + #define MT6359_LDO_VSRAM_PROC1_ELR 0x1b40 137 + #define MT6359_LDO_VSRAM_PROC2_ELR 0x1b42 138 + #define MT6359_LDO_VSRAM_OTHERS_ELR 0x1b44 139 + #define MT6359_LDO_VSRAM_MD_ELR 0x1b46 140 + #define MT6359_LDO_VFE28_CON0 0x1b88 141 + #define MT6359_LDO_VFE28_MON 0x1b8a 142 + #define MT6359_LDO_VXO22_CON0 0x1b98 143 + #define MT6359_LDO_VXO22_MON 0x1b9a 144 + #define MT6359_LDO_VRF18_CON0 0x1ba8 145 + #define MT6359_LDO_VRF18_MON 0x1baa 146 + #define MT6359_LDO_VRF12_CON0 0x1bb8 147 + #define MT6359_LDO_VRF12_MON 0x1bba 148 + #define MT6359_LDO_VEFUSE_CON0 0x1bc8 149 + #define MT6359_LDO_VEFUSE_MON 0x1bca 150 + #define MT6359_LDO_VCN33_1_CON0 0x1bd8 151 + #define MT6359_LDO_VCN33_1_MON 0x1bda 152 + #define MT6359_LDO_VCN33_1_MULTI_SW 0x1be8 153 + #define MT6359_LDO_VCN33_2_CON0 0x1c08 154 + #define MT6359_LDO_VCN33_2_MON 0x1c0a 155 + #define MT6359_LDO_VCN33_2_MULTI_SW 0x1c18 156 + #define MT6359_LDO_VCN13_CON0 0x1c1a 157 + #define MT6359_LDO_VCN13_MON 0x1c1c 158 + #define MT6359_LDO_VCN18_CON0 0x1c2a 159 + #define MT6359_LDO_VCN18_MON 0x1c2c 160 + #define MT6359_LDO_VA09_CON0 0x1c3a 161 + #define MT6359_LDO_VA09_MON 0x1c3c 162 + #define MT6359_LDO_VCAMIO_CON0 0x1c4a 163 + #define MT6359_LDO_VCAMIO_MON 0x1c4c 164 + #define MT6359_LDO_VA12_CON0 0x1c5a 165 + #define MT6359_LDO_VA12_MON 0x1c5c 166 + #define MT6359_LDO_VAUX18_CON0 0x1c88 167 + #define MT6359_LDO_VAUX18_MON 0x1c8a 168 + #define MT6359_LDO_VAUD18_CON0 0x1c98 169 + #define MT6359_LDO_VAUD18_MON 0x1c9a 170 + #define MT6359_LDO_VIO18_CON0 0x1ca8 171 + #define MT6359_LDO_VIO18_MON 0x1caa 172 + #define MT6359_LDO_VEMC_CON0 0x1cb8 173 + #define MT6359_LDO_VEMC_MON 0x1cba 174 + #define MT6359_LDO_VSIM1_CON0 0x1cc8 175 + #define MT6359_LDO_VSIM1_MON 0x1cca 176 + #define MT6359_LDO_VSIM2_CON0 0x1cd8 177 + #define MT6359_LDO_VSIM2_MON 0x1cda 178 + #define MT6359_LDO_VUSB_CON0 0x1d08 179 + #define MT6359_LDO_VUSB_MON 0x1d0a 180 + #define MT6359_LDO_VUSB_MULTI_SW 0x1d18 181 + #define MT6359_LDO_VRFCK_CON0 0x1d1a 182 + #define MT6359_LDO_VRFCK_MON 0x1d1c 183 + #define MT6359_LDO_VBBCK_CON0 0x1d2a 184 + #define MT6359_LDO_VBBCK_MON 0x1d2c 185 + #define MT6359_LDO_VBIF28_CON0 0x1d3a 186 + #define MT6359_LDO_VBIF28_MON 0x1d3c 187 + #define MT6359_LDO_VIBR_CON0 0x1d4a 188 + #define MT6359_LDO_VIBR_MON 0x1d4c 189 + #define MT6359_LDO_VIO28_CON0 0x1d5a 190 + #define MT6359_LDO_VIO28_MON 0x1d5c 191 + #define MT6359_LDO_VM18_CON0 0x1d88 192 + #define MT6359_LDO_VM18_MON 0x1d8a 193 + #define MT6359_LDO_VUFS_CON0 0x1d98 194 + #define MT6359_LDO_VUFS_MON 0x1d9a 195 + #define MT6359_LDO_VSRAM_PROC1_CON0 0x1e88 196 + #define MT6359_LDO_VSRAM_PROC1_MON 0x1e8a 197 + #define MT6359_LDO_VSRAM_PROC1_VOSEL1 0x1e8e 198 + #define MT6359_LDO_VSRAM_PROC2_CON0 0x1ea6 199 + #define MT6359_LDO_VSRAM_PROC2_MON 0x1ea8 200 + #define MT6359_LDO_VSRAM_PROC2_VOSEL1 0x1eac 201 + #define MT6359_LDO_VSRAM_OTHERS_CON0 0x1f08 202 + #define MT6359_LDO_VSRAM_OTHERS_MON 0x1f0a 203 + #define MT6359_LDO_VSRAM_OTHERS_VOSEL1 0x1f0e 204 + #define MT6359_LDO_VSRAM_OTHERS_SSHUB 0x1f26 205 + #define MT6359_LDO_VSRAM_MD_CON0 0x1f2c 206 + #define MT6359_LDO_VSRAM_MD_MON 0x1f2e 207 + #define MT6359_LDO_VSRAM_MD_VOSEL1 0x1f32 208 + #define MT6359_VFE28_ANA_CON0 0x1f88 209 + #define MT6359_VAUX18_ANA_CON0 0x1f8c 210 + #define MT6359_VUSB_ANA_CON0 0x1f90 211 + #define MT6359_VBIF28_ANA_CON0 0x1f94 212 + #define MT6359_VCN33_1_ANA_CON0 0x1f98 213 + #define MT6359_VCN33_2_ANA_CON0 0x1f9c 214 + #define MT6359_VEMC_ANA_CON0 0x1fa0 215 + #define MT6359_VSIM1_ANA_CON0 0x1fa4 216 + #define MT6359_VSIM2_ANA_CON0 0x1fa8 217 + #define MT6359_VIO28_ANA_CON0 0x1fac 218 + #define MT6359_VIBR_ANA_CON0 0x1fb0 219 + #define MT6359_VRF18_ANA_CON0 0x2008 220 + #define MT6359_VEFUSE_ANA_CON0 0x200c 221 + #define MT6359_VCN18_ANA_CON0 0x2010 222 + #define MT6359_VCAMIO_ANA_CON0 0x2014 223 + #define MT6359_VAUD18_ANA_CON0 0x2018 224 + #define MT6359_VIO18_ANA_CON0 0x201c 225 + #define MT6359_VM18_ANA_CON0 0x2020 226 + #define MT6359_VUFS_ANA_CON0 0x2024 227 + #define MT6359_VRF12_ANA_CON0 0x202a 228 + #define MT6359_VCN13_ANA_CON0 0x202e 229 + #define MT6359_VA09_ANA_CON0 0x2032 230 + #define MT6359_VA12_ANA_CON0 0x2036 231 + #define MT6359_VXO22_ANA_CON0 0x2088 232 + #define MT6359_VRFCK_ANA_CON0 0x208c 233 + #define MT6359_VBBCK_ANA_CON0 0x2094 234 + #define MT6359_AUD_TOP_INT_CON0 0x2328 235 + #define MT6359_AUD_TOP_INT_STATUS0 0x2334 236 + 237 + #define MT6359_RG_BUCK_VPU_EN_ADDR MT6359_BUCK_VPU_CON0 238 + #define MT6359_RG_BUCK_VPU_LP_ADDR MT6359_BUCK_VPU_CON0 239 + #define MT6359_RG_BUCK_VPU_LP_SHIFT 1 240 + #define MT6359_DA_VPU_VOSEL_ADDR MT6359_BUCK_VPU_DBG0 241 + #define MT6359_DA_VPU_VOSEL_MASK 0x7F 242 + #define MT6359_DA_VPU_VOSEL_SHIFT 0 243 + #define MT6359_DA_VPU_EN_ADDR MT6359_BUCK_VPU_DBG1 244 + #define MT6359_RG_BUCK_VPU_VOSEL_ADDR MT6359_BUCK_VPU_ELR0 245 + #define MT6359_RG_BUCK_VPU_VOSEL_MASK 0x7F 246 + #define MT6359_RG_BUCK_VPU_VOSEL_SHIFT 0 247 + #define MT6359_RG_BUCK_VCORE_EN_ADDR MT6359_BUCK_VCORE_CON0 248 + #define MT6359_RG_BUCK_VCORE_LP_ADDR MT6359_BUCK_VCORE_CON0 249 + #define MT6359_RG_BUCK_VCORE_LP_SHIFT 1 250 + #define MT6359_DA_VCORE_VOSEL_ADDR MT6359_BUCK_VCORE_DBG0 251 + #define MT6359_DA_VCORE_VOSEL_MASK 0x7F 252 + #define MT6359_DA_VCORE_VOSEL_SHIFT 0 253 + #define MT6359_DA_VCORE_EN_ADDR MT6359_BUCK_VCORE_DBG1 254 + #define MT6359_RG_BUCK_VCORE_SSHUB_EN_ADDR MT6359_BUCK_VCORE_SSHUB_CON0 255 + #define MT6359_RG_BUCK_VCORE_SSHUB_VOSEL_ADDR MT6359_BUCK_VCORE_SSHUB_CON0 256 + #define MT6359_RG_BUCK_VCORE_SSHUB_VOSEL_MASK 0x7F 257 + #define MT6359_RG_BUCK_VCORE_SSHUB_VOSEL_SHIFT 4 258 + #define MT6359_RG_BUCK_VCORE_VOSEL_ADDR MT6359_BUCK_VCORE_ELR0 259 + #define MT6359_RG_BUCK_VCORE_VOSEL_MASK 0x7F 260 + #define MT6359_RG_BUCK_VCORE_VOSEL_SHIFT 0 261 + #define MT6359_RG_BUCK_VGPU11_EN_ADDR MT6359_BUCK_VGPU11_CON0 262 + #define MT6359_RG_BUCK_VGPU11_LP_ADDR MT6359_BUCK_VGPU11_CON0 263 + #define MT6359_RG_BUCK_VGPU11_LP_SHIFT 1 264 + #define MT6359_DA_VGPU11_VOSEL_ADDR MT6359_BUCK_VGPU11_DBG0 265 + #define MT6359_DA_VGPU11_VOSEL_MASK 0x7F 266 + #define MT6359_DA_VGPU11_VOSEL_SHIFT 0 267 + #define MT6359_DA_VGPU11_EN_ADDR MT6359_BUCK_VGPU11_DBG1 268 + #define MT6359_RG_BUCK_VGPU11_VOSEL_ADDR MT6359_BUCK_VGPU11_ELR0 269 + #define MT6359_RG_BUCK_VGPU11_VOSEL_MASK 0x7F 270 + #define MT6359_RG_BUCK_VGPU11_VOSEL_SHIFT 0 271 + #define MT6359_RG_BUCK_VMODEM_EN_ADDR MT6359_BUCK_VMODEM_CON0 272 + #define MT6359_RG_BUCK_VMODEM_LP_ADDR MT6359_BUCK_VMODEM_CON0 273 + #define MT6359_RG_BUCK_VMODEM_LP_SHIFT 1 274 + #define MT6359_DA_VMODEM_VOSEL_ADDR MT6359_BUCK_VMODEM_DBG0 275 + #define MT6359_DA_VMODEM_VOSEL_MASK 0x7F 276 + #define MT6359_DA_VMODEM_VOSEL_SHIFT 0 277 + #define MT6359_DA_VMODEM_EN_ADDR MT6359_BUCK_VMODEM_DBG1 278 + #define MT6359_RG_BUCK_VMODEM_VOSEL_ADDR MT6359_BUCK_VMODEM_ELR0 279 + #define MT6359_RG_BUCK_VMODEM_VOSEL_MASK 0x7F 280 + #define MT6359_RG_BUCK_VMODEM_VOSEL_SHIFT 0 281 + #define MT6359_RG_BUCK_VPROC1_EN_ADDR MT6359_BUCK_VPROC1_CON0 282 + #define MT6359_RG_BUCK_VPROC1_LP_ADDR MT6359_BUCK_VPROC1_CON0 283 + #define MT6359_RG_BUCK_VPROC1_LP_SHIFT 1 284 + #define MT6359_DA_VPROC1_VOSEL_ADDR MT6359_BUCK_VPROC1_DBG0 285 + #define MT6359_DA_VPROC1_VOSEL_MASK 0x7F 286 + #define MT6359_DA_VPROC1_VOSEL_SHIFT 0 287 + #define MT6359_DA_VPROC1_EN_ADDR MT6359_BUCK_VPROC1_DBG1 288 + #define MT6359_RG_BUCK_VPROC1_VOSEL_ADDR MT6359_BUCK_VPROC1_ELR0 289 + #define MT6359_RG_BUCK_VPROC1_VOSEL_MASK 0x7F 290 + #define MT6359_RG_BUCK_VPROC1_VOSEL_SHIFT 0 291 + #define MT6359_RG_BUCK_VPROC2_EN_ADDR MT6359_BUCK_VPROC2_CON0 292 + #define MT6359_RG_BUCK_VPROC2_LP_ADDR MT6359_BUCK_VPROC2_CON0 293 + #define MT6359_RG_BUCK_VPROC2_LP_SHIFT 1 294 + #define MT6359_DA_VPROC2_VOSEL_ADDR MT6359_BUCK_VPROC2_DBG0 295 + #define MT6359_DA_VPROC2_VOSEL_MASK 0x7F 296 + #define MT6359_DA_VPROC2_VOSEL_SHIFT 0 297 + #define MT6359_DA_VPROC2_EN_ADDR MT6359_BUCK_VPROC2_DBG1 298 + #define MT6359_RG_BUCK_VPROC2_VOSEL_ADDR MT6359_BUCK_VPROC2_ELR0 299 + #define MT6359_RG_BUCK_VPROC2_VOSEL_MASK 0x7F 300 + #define MT6359_RG_BUCK_VPROC2_VOSEL_SHIFT 0 301 + #define MT6359_RG_BUCK_VS1_EN_ADDR MT6359_BUCK_VS1_CON0 302 + #define MT6359_RG_BUCK_VS1_LP_ADDR MT6359_BUCK_VS1_CON0 303 + #define MT6359_RG_BUCK_VS1_LP_SHIFT 1 304 + #define MT6359_DA_VS1_VOSEL_ADDR MT6359_BUCK_VS1_DBG0 305 + #define MT6359_DA_VS1_VOSEL_MASK 0x7F 306 + #define MT6359_DA_VS1_VOSEL_SHIFT 0 307 + #define MT6359_DA_VS1_EN_ADDR MT6359_BUCK_VS1_DBG1 308 + #define MT6359_RG_BUCK_VS1_VOSEL_ADDR MT6359_BUCK_VS1_ELR0 309 + #define MT6359_RG_BUCK_VS1_VOSEL_MASK 0x7F 310 + #define MT6359_RG_BUCK_VS1_VOSEL_SHIFT 0 311 + #define MT6359_RG_BUCK_VS2_EN_ADDR MT6359_BUCK_VS2_CON0 312 + #define MT6359_RG_BUCK_VS2_LP_ADDR MT6359_BUCK_VS2_CON0 313 + #define MT6359_RG_BUCK_VS2_LP_SHIFT 1 314 + #define MT6359_DA_VS2_VOSEL_ADDR MT6359_BUCK_VS2_DBG0 315 + #define MT6359_DA_VS2_VOSEL_MASK 0x7F 316 + #define MT6359_DA_VS2_VOSEL_SHIFT 0 317 + #define MT6359_DA_VS2_EN_ADDR MT6359_BUCK_VS2_DBG1 318 + #define MT6359_RG_BUCK_VS2_VOSEL_ADDR MT6359_BUCK_VS2_ELR0 319 + #define MT6359_RG_BUCK_VS2_VOSEL_MASK 0x7F 320 + #define MT6359_RG_BUCK_VS2_VOSEL_SHIFT 0 321 + #define MT6359_RG_BUCK_VPA_EN_ADDR MT6359_BUCK_VPA_CON0 322 + #define MT6359_RG_BUCK_VPA_LP_ADDR MT6359_BUCK_VPA_CON0 323 + #define MT6359_RG_BUCK_VPA_LP_SHIFT 1 324 + #define MT6359_RG_BUCK_VPA_VOSEL_ADDR MT6359_BUCK_VPA_CON1 325 + #define MT6359_RG_BUCK_VPA_VOSEL_MASK 0x3F 326 + #define MT6359_RG_BUCK_VPA_VOSEL_SHIFT 0 327 + #define MT6359_DA_VPA_VOSEL_ADDR MT6359_BUCK_VPA_DBG0 328 + #define MT6359_DA_VPA_VOSEL_MASK 0x3F 329 + #define MT6359_DA_VPA_VOSEL_SHIFT 0 330 + #define MT6359_DA_VPA_EN_ADDR MT6359_BUCK_VPA_DBG1 331 + #define MT6359_RG_VGPU11_FCCM_ADDR MT6359_VGPUVCORE_ANA_CON2 332 + #define MT6359_RG_VGPU11_FCCM_SHIFT 9 333 + #define MT6359_RG_VCORE_FCCM_ADDR MT6359_VGPUVCORE_ANA_CON13 334 + #define MT6359_RG_VCORE_FCCM_SHIFT 5 335 + #define MT6359_RG_VPROC1_FCCM_ADDR MT6359_VPROC1_ANA_CON3 336 + #define MT6359_RG_VPROC1_FCCM_SHIFT 1 337 + #define MT6359_RG_VPROC2_FCCM_ADDR MT6359_VPROC2_ANA_CON3 338 + #define MT6359_RG_VPROC2_FCCM_SHIFT 1 339 + #define MT6359_RG_VMODEM_FCCM_ADDR MT6359_VMODEM_ANA_CON3 340 + #define MT6359_RG_VMODEM_FCCM_SHIFT 1 341 + #define MT6359_RG_VPU_FCCM_ADDR MT6359_VPU_ANA_CON3 342 + #define MT6359_RG_VPU_FCCM_SHIFT 1 343 + #define MT6359_RG_VS1_FPWM_ADDR MT6359_VS1_ANA_CON0 344 + #define MT6359_RG_VS1_FPWM_SHIFT 3 345 + #define MT6359_RG_VS2_FPWM_ADDR MT6359_VS2_ANA_CON0 346 + #define MT6359_RG_VS2_FPWM_SHIFT 3 347 + #define MT6359_RG_VPA_MODESET_ADDR MT6359_VPA_ANA_CON0 348 + #define MT6359_RG_VPA_MODESET_SHIFT 1 349 + #define MT6359_RG_LDO_VSRAM_PROC1_VOSEL_ADDR MT6359_LDO_VSRAM_PROC1_ELR 350 + #define MT6359_RG_LDO_VSRAM_PROC1_VOSEL_MASK 0x7F 351 + #define MT6359_RG_LDO_VSRAM_PROC1_VOSEL_SHIFT 0 352 + #define MT6359_RG_LDO_VSRAM_PROC2_VOSEL_ADDR MT6359_LDO_VSRAM_PROC2_ELR 353 + #define MT6359_RG_LDO_VSRAM_PROC2_VOSEL_MASK 0x7F 354 + #define MT6359_RG_LDO_VSRAM_PROC2_VOSEL_SHIFT 0 355 + #define MT6359_RG_LDO_VSRAM_OTHERS_VOSEL_ADDR MT6359_LDO_VSRAM_OTHERS_ELR 356 + #define MT6359_RG_LDO_VSRAM_OTHERS_VOSEL_MASK 0x7F 357 + #define MT6359_RG_LDO_VSRAM_OTHERS_VOSEL_SHIFT 0 358 + #define MT6359_RG_LDO_VSRAM_MD_VOSEL_ADDR MT6359_LDO_VSRAM_MD_ELR 359 + #define MT6359_RG_LDO_VSRAM_MD_VOSEL_MASK 0x7F 360 + #define MT6359_RG_LDO_VSRAM_MD_VOSEL_SHIFT 0 361 + #define MT6359_RG_LDO_VFE28_EN_ADDR MT6359_LDO_VFE28_CON0 362 + #define MT6359_DA_VFE28_B_EN_ADDR MT6359_LDO_VFE28_MON 363 + #define MT6359_RG_LDO_VXO22_EN_ADDR MT6359_LDO_VXO22_CON0 364 + #define MT6359_RG_LDO_VXO22_EN_SHIFT 0 365 + #define MT6359_DA_VXO22_B_EN_ADDR MT6359_LDO_VXO22_MON 366 + #define MT6359_RG_LDO_VRF18_EN_ADDR MT6359_LDO_VRF18_CON0 367 + #define MT6359_RG_LDO_VRF18_EN_SHIFT 0 368 + #define MT6359_DA_VRF18_B_EN_ADDR MT6359_LDO_VRF18_MON 369 + #define MT6359_RG_LDO_VRF12_EN_ADDR MT6359_LDO_VRF12_CON0 370 + #define MT6359_RG_LDO_VRF12_EN_SHIFT 0 371 + #define MT6359_DA_VRF12_B_EN_ADDR MT6359_LDO_VRF12_MON 372 + #define MT6359_RG_LDO_VEFUSE_EN_ADDR MT6359_LDO_VEFUSE_CON0 373 + #define MT6359_RG_LDO_VEFUSE_EN_SHIFT 0 374 + #define MT6359_DA_VEFUSE_B_EN_ADDR MT6359_LDO_VEFUSE_MON 375 + #define MT6359_RG_LDO_VCN33_1_EN_0_ADDR MT6359_LDO_VCN33_1_CON0 376 + #define MT6359_RG_LDO_VCN33_1_EN_0_MASK 0x1 377 + #define MT6359_RG_LDO_VCN33_1_EN_0_SHIFT 0 378 + #define MT6359_DA_VCN33_1_B_EN_ADDR MT6359_LDO_VCN33_1_MON 379 + #define MT6359_RG_LDO_VCN33_1_EN_1_ADDR MT6359_LDO_VCN33_1_MULTI_SW 380 + #define MT6359_RG_LDO_VCN33_1_EN_1_SHIFT 15 381 + #define MT6359_RG_LDO_VCN33_2_EN_0_ADDR MT6359_LDO_VCN33_2_CON0 382 + #define MT6359_RG_LDO_VCN33_2_EN_0_SHIFT 0 383 + #define MT6359_DA_VCN33_2_B_EN_ADDR MT6359_LDO_VCN33_2_MON 384 + #define MT6359_RG_LDO_VCN33_2_EN_1_ADDR MT6359_LDO_VCN33_2_MULTI_SW 385 + #define MT6359_RG_LDO_VCN33_2_EN_1_MASK 0x1 386 + #define MT6359_RG_LDO_VCN33_2_EN_1_SHIFT 15 387 + #define MT6359_RG_LDO_VCN13_EN_ADDR MT6359_LDO_VCN13_CON0 388 + #define MT6359_RG_LDO_VCN13_EN_SHIFT 0 389 + #define MT6359_DA_VCN13_B_EN_ADDR MT6359_LDO_VCN13_MON 390 + #define MT6359_RG_LDO_VCN18_EN_ADDR MT6359_LDO_VCN18_CON0 391 + #define MT6359_DA_VCN18_B_EN_ADDR MT6359_LDO_VCN18_MON 392 + #define MT6359_RG_LDO_VA09_EN_ADDR MT6359_LDO_VA09_CON0 393 + #define MT6359_RG_LDO_VA09_EN_SHIFT 0 394 + #define MT6359_DA_VA09_B_EN_ADDR MT6359_LDO_VA09_MON 395 + #define MT6359_RG_LDO_VCAMIO_EN_ADDR MT6359_LDO_VCAMIO_CON0 396 + #define MT6359_RG_LDO_VCAMIO_EN_SHIFT 0 397 + #define MT6359_DA_VCAMIO_B_EN_ADDR MT6359_LDO_VCAMIO_MON 398 + #define MT6359_RG_LDO_VA12_EN_ADDR MT6359_LDO_VA12_CON0 399 + #define MT6359_RG_LDO_VA12_EN_SHIFT 0 400 + #define MT6359_DA_VA12_B_EN_ADDR MT6359_LDO_VA12_MON 401 + #define MT6359_RG_LDO_VAUX18_EN_ADDR MT6359_LDO_VAUX18_CON0 402 + #define MT6359_DA_VAUX18_B_EN_ADDR MT6359_LDO_VAUX18_MON 403 + #define MT6359_RG_LDO_VAUD18_EN_ADDR MT6359_LDO_VAUD18_CON0 404 + #define MT6359_DA_VAUD18_B_EN_ADDR MT6359_LDO_VAUD18_MON 405 + #define MT6359_RG_LDO_VIO18_EN_ADDR MT6359_LDO_VIO18_CON0 406 + #define MT6359_RG_LDO_VIO18_EN_SHIFT 0 407 + #define MT6359_DA_VIO18_B_EN_ADDR MT6359_LDO_VIO18_MON 408 + #define MT6359_RG_LDO_VEMC_EN_ADDR MT6359_LDO_VEMC_CON0 409 + #define MT6359_RG_LDO_VEMC_EN_SHIFT 0 410 + #define MT6359_DA_VEMC_B_EN_ADDR MT6359_LDO_VEMC_MON 411 + #define MT6359_RG_LDO_VSIM1_EN_ADDR MT6359_LDO_VSIM1_CON0 412 + #define MT6359_RG_LDO_VSIM1_EN_SHIFT 0 413 + #define MT6359_DA_VSIM1_B_EN_ADDR MT6359_LDO_VSIM1_MON 414 + #define MT6359_RG_LDO_VSIM2_EN_ADDR MT6359_LDO_VSIM2_CON0 415 + #define MT6359_RG_LDO_VSIM2_EN_SHIFT 0 416 + #define MT6359_DA_VSIM2_B_EN_ADDR MT6359_LDO_VSIM2_MON 417 + #define MT6359_RG_LDO_VUSB_EN_0_ADDR MT6359_LDO_VUSB_CON0 418 + #define MT6359_RG_LDO_VUSB_EN_0_MASK 0x1 419 + #define MT6359_RG_LDO_VUSB_EN_0_SHIFT 0 420 + #define MT6359_DA_VUSB_B_EN_ADDR MT6359_LDO_VUSB_MON 421 + #define MT6359_RG_LDO_VUSB_EN_1_ADDR MT6359_LDO_VUSB_MULTI_SW 422 + #define MT6359_RG_LDO_VUSB_EN_1_MASK 0x1 423 + #define MT6359_RG_LDO_VUSB_EN_1_SHIFT 15 424 + #define MT6359_RG_LDO_VRFCK_EN_ADDR MT6359_LDO_VRFCK_CON0 425 + #define MT6359_RG_LDO_VRFCK_EN_SHIFT 0 426 + #define MT6359_DA_VRFCK_B_EN_ADDR MT6359_LDO_VRFCK_MON 427 + #define MT6359_RG_LDO_VBBCK_EN_ADDR MT6359_LDO_VBBCK_CON0 428 + #define MT6359_RG_LDO_VBBCK_EN_SHIFT 0 429 + #define MT6359_DA_VBBCK_B_EN_ADDR MT6359_LDO_VBBCK_MON 430 + #define MT6359_RG_LDO_VBIF28_EN_ADDR MT6359_LDO_VBIF28_CON0 431 + #define MT6359_DA_VBIF28_B_EN_ADDR MT6359_LDO_VBIF28_MON 432 + #define MT6359_RG_LDO_VIBR_EN_ADDR MT6359_LDO_VIBR_CON0 433 + #define MT6359_RG_LDO_VIBR_EN_SHIFT 0 434 + #define MT6359_DA_VIBR_B_EN_ADDR MT6359_LDO_VIBR_MON 435 + #define MT6359_RG_LDO_VIO28_EN_ADDR MT6359_LDO_VIO28_CON0 436 + #define MT6359_RG_LDO_VIO28_EN_SHIFT 0 437 + #define MT6359_DA_VIO28_B_EN_ADDR MT6359_LDO_VIO28_MON 438 + #define MT6359_RG_LDO_VM18_EN_ADDR MT6359_LDO_VM18_CON0 439 + #define MT6359_RG_LDO_VM18_EN_SHIFT 0 440 + #define MT6359_DA_VM18_B_EN_ADDR MT6359_LDO_VM18_MON 441 + #define MT6359_RG_LDO_VUFS_EN_ADDR MT6359_LDO_VUFS_CON0 442 + #define MT6359_RG_LDO_VUFS_EN_SHIFT 0 443 + #define MT6359_DA_VUFS_B_EN_ADDR MT6359_LDO_VUFS_MON 444 + #define MT6359_RG_LDO_VSRAM_PROC1_EN_ADDR MT6359_LDO_VSRAM_PROC1_CON0 445 + #define MT6359_DA_VSRAM_PROC1_B_EN_ADDR MT6359_LDO_VSRAM_PROC1_MON 446 + #define MT6359_DA_VSRAM_PROC1_VOSEL_ADDR MT6359_LDO_VSRAM_PROC1_VOSEL1 447 + #define MT6359_DA_VSRAM_PROC1_VOSEL_MASK 0x7F 448 + #define MT6359_DA_VSRAM_PROC1_VOSEL_SHIFT 8 449 + #define MT6359_RG_LDO_VSRAM_PROC2_EN_ADDR MT6359_LDO_VSRAM_PROC2_CON0 450 + #define MT6359_DA_VSRAM_PROC2_B_EN_ADDR MT6359_LDO_VSRAM_PROC2_MON 451 + #define MT6359_DA_VSRAM_PROC2_VOSEL_ADDR MT6359_LDO_VSRAM_PROC2_VOSEL1 452 + #define MT6359_DA_VSRAM_PROC2_VOSEL_MASK 0x7F 453 + #define MT6359_DA_VSRAM_PROC2_VOSEL_SHIFT 8 454 + #define MT6359_RG_LDO_VSRAM_OTHERS_EN_ADDR MT6359_LDO_VSRAM_OTHERS_CON0 455 + #define MT6359_DA_VSRAM_OTHERS_B_EN_ADDR MT6359_LDO_VSRAM_OTHERS_MON 456 + #define MT6359_DA_VSRAM_OTHERS_VOSEL_ADDR MT6359_LDO_VSRAM_OTHERS_VOSEL1 457 + #define MT6359_DA_VSRAM_OTHERS_VOSEL_MASK 0x7F 458 + #define MT6359_DA_VSRAM_OTHERS_VOSEL_SHIFT 8 459 + #define MT6359_RG_LDO_VSRAM_OTHERS_SSHUB_EN_ADDR MT6359_LDO_VSRAM_OTHERS_SSHUB 460 + #define MT6359_RG_LDO_VSRAM_OTHERS_SSHUB_VOSEL_ADDR MT6359_LDO_VSRAM_OTHERS_SSHUB 461 + #define MT6359_RG_LDO_VSRAM_OTHERS_SSHUB_VOSEL_MASK 0x7F 462 + #define MT6359_RG_LDO_VSRAM_OTHERS_SSHUB_VOSEL_SHIFT 1 463 + #define MT6359_RG_LDO_VSRAM_MD_EN_ADDR MT6359_LDO_VSRAM_MD_CON0 464 + #define MT6359_DA_VSRAM_MD_B_EN_ADDR MT6359_LDO_VSRAM_MD_MON 465 + #define MT6359_DA_VSRAM_MD_VOSEL_ADDR MT6359_LDO_VSRAM_MD_VOSEL1 466 + #define MT6359_DA_VSRAM_MD_VOSEL_MASK 0x7F 467 + #define MT6359_DA_VSRAM_MD_VOSEL_SHIFT 8 468 + #define MT6359_RG_VCN33_1_VOSEL_ADDR MT6359_VCN33_1_ANA_CON0 469 + #define MT6359_RG_VCN33_1_VOSEL_MASK 0xF 470 + #define MT6359_RG_VCN33_1_VOSEL_SHIFT 8 471 + #define MT6359_RG_VCN33_2_VOSEL_ADDR MT6359_VCN33_2_ANA_CON0 472 + #define MT6359_RG_VCN33_2_VOSEL_MASK 0xF 473 + #define MT6359_RG_VCN33_2_VOSEL_SHIFT 8 474 + #define MT6359_RG_VEMC_VOSEL_ADDR MT6359_VEMC_ANA_CON0 475 + #define MT6359_RG_VEMC_VOSEL_MASK 0xF 476 + #define MT6359_RG_VEMC_VOSEL_SHIFT 8 477 + #define MT6359_RG_VSIM1_VOSEL_ADDR MT6359_VSIM1_ANA_CON0 478 + #define MT6359_RG_VSIM1_VOSEL_MASK 0xF 479 + #define MT6359_RG_VSIM1_VOSEL_SHIFT 8 480 + #define MT6359_RG_VSIM2_VOSEL_ADDR MT6359_VSIM2_ANA_CON0 481 + #define MT6359_RG_VSIM2_VOSEL_MASK 0xF 482 + #define MT6359_RG_VSIM2_VOSEL_SHIFT 8 483 + #define MT6359_RG_VIO28_VOSEL_ADDR MT6359_VIO28_ANA_CON0 484 + #define MT6359_RG_VIO28_VOSEL_MASK 0xF 485 + #define MT6359_RG_VIO28_VOSEL_SHIFT 8 486 + #define MT6359_RG_VIBR_VOSEL_ADDR MT6359_VIBR_ANA_CON0 487 + #define MT6359_RG_VIBR_VOSEL_MASK 0xF 488 + #define MT6359_RG_VIBR_VOSEL_SHIFT 8 489 + #define MT6359_RG_VRF18_VOSEL_ADDR MT6359_VRF18_ANA_CON0 490 + #define MT6359_RG_VRF18_VOSEL_MASK 0xF 491 + #define MT6359_RG_VRF18_VOSEL_SHIFT 8 492 + #define MT6359_RG_VEFUSE_VOSEL_ADDR MT6359_VEFUSE_ANA_CON0 493 + #define MT6359_RG_VEFUSE_VOSEL_MASK 0xF 494 + #define MT6359_RG_VEFUSE_VOSEL_SHIFT 8 495 + #define MT6359_RG_VCAMIO_VOSEL_ADDR MT6359_VCAMIO_ANA_CON0 496 + #define MT6359_RG_VCAMIO_VOSEL_MASK 0xF 497 + #define MT6359_RG_VCAMIO_VOSEL_SHIFT 8 498 + #define MT6359_RG_VIO18_VOSEL_ADDR MT6359_VIO18_ANA_CON0 499 + #define MT6359_RG_VIO18_VOSEL_MASK 0xF 500 + #define MT6359_RG_VIO18_VOSEL_SHIFT 8 501 + #define MT6359_RG_VM18_VOSEL_ADDR MT6359_VM18_ANA_CON0 502 + #define MT6359_RG_VM18_VOSEL_MASK 0xF 503 + #define MT6359_RG_VM18_VOSEL_SHIFT 8 504 + #define MT6359_RG_VUFS_VOSEL_ADDR MT6359_VUFS_ANA_CON0 505 + #define MT6359_RG_VUFS_VOSEL_MASK 0xF 506 + #define MT6359_RG_VUFS_VOSEL_SHIFT 8 507 + #define MT6359_RG_VRF12_VOSEL_ADDR MT6359_VRF12_ANA_CON0 508 + #define MT6359_RG_VRF12_VOSEL_MASK 0xF 509 + #define MT6359_RG_VRF12_VOSEL_SHIFT 8 510 + #define MT6359_RG_VCN13_VOSEL_ADDR MT6359_VCN13_ANA_CON0 511 + #define MT6359_RG_VCN13_VOSEL_MASK 0xF 512 + #define MT6359_RG_VCN13_VOSEL_SHIFT 8 513 + #define MT6359_RG_VA09_VOSEL_ADDR MT6359_VA09_ANA_CON0 514 + #define MT6359_RG_VA09_VOSEL_MASK 0xF 515 + #define MT6359_RG_VA09_VOSEL_SHIFT 8 516 + #define MT6359_RG_VA12_VOSEL_ADDR MT6359_VA12_ANA_CON0 517 + #define MT6359_RG_VA12_VOSEL_MASK 0xF 518 + #define MT6359_RG_VA12_VOSEL_SHIFT 8 519 + #define MT6359_RG_VXO22_VOSEL_ADDR MT6359_VXO22_ANA_CON0 520 + #define MT6359_RG_VXO22_VOSEL_MASK 0xF 521 + #define MT6359_RG_VXO22_VOSEL_SHIFT 8 522 + #define MT6359_RG_VRFCK_VOSEL_ADDR MT6359_VRFCK_ANA_CON0 523 + #define MT6359_RG_VRFCK_VOSEL_MASK 0xF 524 + #define MT6359_RG_VRFCK_VOSEL_SHIFT 8 525 + #define MT6359_RG_VBBCK_VOSEL_ADDR MT6359_VBBCK_ANA_CON0 526 + #define MT6359_RG_VBBCK_VOSEL_MASK 0xF 527 + #define MT6359_RG_VBBCK_VOSEL_SHIFT 8 528 + 529 + #endif /* __MFD_MT6359_REGISTERS_H__ */
+249
include/linux/mfd/mt6359p/registers.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Copyright (c) 2021 MediaTek Inc. 4 + */ 5 + 6 + #ifndef __MFD_MT6359P_REGISTERS_H__ 7 + #define __MFD_MT6359P_REGISTERS_H__ 8 + 9 + #define MT6359P_CHIP_VER 0x5930 10 + 11 + /* PMIC Registers */ 12 + #define MT6359P_HWCID 0x8 13 + #define MT6359P_TOP_TRAP 0x50 14 + #define MT6359P_TOP_TMA_KEY 0x3a8 15 + #define MT6359P_BUCK_VCORE_ELR_NUM 0x152a 16 + #define MT6359P_BUCK_VCORE_ELR0 0x152c 17 + #define MT6359P_BUCK_VGPU11_SSHUB_CON0 0x15aa 18 + #define MT6359P_BUCK_VGPU11_ELR0 0x15b4 19 + #define MT6359P_LDO_VSRAM_PROC1_ELR 0x1b44 20 + #define MT6359P_LDO_VSRAM_PROC2_ELR 0x1b46 21 + #define MT6359P_LDO_VSRAM_OTHERS_ELR 0x1b48 22 + #define MT6359P_LDO_VSRAM_MD_ELR 0x1b4a 23 + #define MT6359P_LDO_VEMC_ELR_0 0x1b4c 24 + #define MT6359P_LDO_VFE28_CON0 0x1b88 25 + #define MT6359P_LDO_VFE28_MON 0x1b8c 26 + #define MT6359P_LDO_VXO22_CON0 0x1b9a 27 + #define MT6359P_LDO_VXO22_MON 0x1b9e 28 + #define MT6359P_LDO_VRF18_CON0 0x1bac 29 + #define MT6359P_LDO_VRF18_MON 0x1bb0 30 + #define MT6359P_LDO_VRF12_CON0 0x1bbe 31 + #define MT6359P_LDO_VRF12_MON 0x1bc2 32 + #define MT6359P_LDO_VEFUSE_CON0 0x1bd0 33 + #define MT6359P_LDO_VEFUSE_MON 0x1bd4 34 + #define MT6359P_LDO_VCN33_1_CON0 0x1be2 35 + #define MT6359P_LDO_VCN33_1_MON 0x1be6 36 + #define MT6359P_LDO_VCN33_1_MULTI_SW 0x1bf4 37 + #define MT6359P_LDO_VCN33_2_CON0 0x1c08 38 + #define MT6359P_LDO_VCN33_2_MON 0x1c0c 39 + #define MT6359P_LDO_VCN33_2_MULTI_SW 0x1c1a 40 + #define MT6359P_LDO_VCN13_CON0 0x1c1c 41 + #define MT6359P_LDO_VCN13_MON 0x1c20 42 + #define MT6359P_LDO_VCN18_CON0 0x1c2e 43 + #define MT6359P_LDO_VCN18_MON 0x1c32 44 + #define MT6359P_LDO_VA09_CON0 0x1c40 45 + #define MT6359P_LDO_VA09_MON 0x1c44 46 + #define MT6359P_LDO_VCAMIO_CON0 0x1c52 47 + #define MT6359P_LDO_VCAMIO_MON 0x1c56 48 + #define MT6359P_LDO_VA12_CON0 0x1c64 49 + #define MT6359P_LDO_VA12_MON 0x1c68 50 + #define MT6359P_LDO_VAUX18_CON0 0x1c88 51 + #define MT6359P_LDO_VAUX18_MON 0x1c8c 52 + #define MT6359P_LDO_VAUD18_CON0 0x1c9a 53 + #define MT6359P_LDO_VAUD18_MON 0x1c9e 54 + #define MT6359P_LDO_VIO18_CON0 0x1cac 55 + #define MT6359P_LDO_VIO18_MON 0x1cb0 56 + #define MT6359P_LDO_VEMC_CON0 0x1cbe 57 + #define MT6359P_LDO_VEMC_MON 0x1cc2 58 + #define MT6359P_LDO_VSIM1_CON0 0x1cd0 59 + #define MT6359P_LDO_VSIM1_MON 0x1cd4 60 + #define MT6359P_LDO_VSIM2_CON0 0x1ce2 61 + #define MT6359P_LDO_VSIM2_MON 0x1ce6 62 + #define MT6359P_LDO_VUSB_CON0 0x1d08 63 + #define MT6359P_LDO_VUSB_MON 0x1d0c 64 + #define MT6359P_LDO_VUSB_MULTI_SW 0x1d1a 65 + #define MT6359P_LDO_VRFCK_CON0 0x1d1c 66 + #define MT6359P_LDO_VRFCK_MON 0x1d20 67 + #define MT6359P_LDO_VBBCK_CON0 0x1d2e 68 + #define MT6359P_LDO_VBBCK_MON 0x1d32 69 + #define MT6359P_LDO_VBIF28_CON0 0x1d40 70 + #define MT6359P_LDO_VBIF28_MON 0x1d44 71 + #define MT6359P_LDO_VIBR_CON0 0x1d52 72 + #define MT6359P_LDO_VIBR_MON 0x1d56 73 + #define MT6359P_LDO_VIO28_CON0 0x1d64 74 + #define MT6359P_LDO_VIO28_MON 0x1d68 75 + #define MT6359P_LDO_VM18_CON0 0x1d88 76 + #define MT6359P_LDO_VM18_MON 0x1d8c 77 + #define MT6359P_LDO_VUFS_CON0 0x1d9a 78 + #define MT6359P_LDO_VUFS_MON 0x1d9e 79 + #define MT6359P_LDO_VSRAM_PROC1_CON0 0x1e88 80 + #define MT6359P_LDO_VSRAM_PROC1_MON 0x1e8c 81 + #define MT6359P_LDO_VSRAM_PROC1_VOSEL1 0x1e90 82 + #define MT6359P_LDO_VSRAM_PROC2_CON0 0x1ea8 83 + #define MT6359P_LDO_VSRAM_PROC2_MON 0x1eac 84 + #define MT6359P_LDO_VSRAM_PROC2_VOSEL1 0x1eb0 85 + #define MT6359P_LDO_VSRAM_OTHERS_CON0 0x1f08 86 + #define MT6359P_LDO_VSRAM_OTHERS_MON 0x1f0c 87 + #define MT6359P_LDO_VSRAM_OTHERS_VOSEL1 0x1f10 88 + #define MT6359P_LDO_VSRAM_OTHERS_SSHUB 0x1f28 89 + #define MT6359P_LDO_VSRAM_MD_CON0 0x1f2e 90 + #define MT6359P_LDO_VSRAM_MD_MON 0x1f32 91 + #define MT6359P_LDO_VSRAM_MD_VOSEL1 0x1f36 92 + #define MT6359P_VFE28_ANA_CON0 0x1f88 93 + #define MT6359P_VAUX18_ANA_CON0 0x1f8c 94 + #define MT6359P_VUSB_ANA_CON0 0x1f90 95 + #define MT6359P_VBIF28_ANA_CON0 0x1f94 96 + #define MT6359P_VCN33_1_ANA_CON0 0x1f98 97 + #define MT6359P_VCN33_2_ANA_CON0 0x1f9c 98 + #define MT6359P_VEMC_ANA_CON0 0x1fa0 99 + #define MT6359P_VSIM1_ANA_CON0 0x1fa2 100 + #define MT6359P_VSIM2_ANA_CON0 0x1fa6 101 + #define MT6359P_VIO28_ANA_CON0 0x1faa 102 + #define MT6359P_VIBR_ANA_CON0 0x1fae 103 + #define MT6359P_VFE28_ELR_4 0x1fc0 104 + #define MT6359P_VRF18_ANA_CON0 0x2008 105 + #define MT6359P_VEFUSE_ANA_CON0 0x200c 106 + #define MT6359P_VCN18_ANA_CON0 0x2010 107 + #define MT6359P_VCAMIO_ANA_CON0 0x2014 108 + #define MT6359P_VAUD18_ANA_CON0 0x2018 109 + #define MT6359P_VIO18_ANA_CON0 0x201c 110 + #define MT6359P_VM18_ANA_CON0 0x2020 111 + #define MT6359P_VUFS_ANA_CON0 0x2024 112 + #define MT6359P_VRF12_ANA_CON0 0x202a 113 + #define MT6359P_VCN13_ANA_CON0 0x202e 114 + #define MT6359P_VA09_ANA_CON0 0x2032 115 + #define MT6359P_VRF18_ELR_3 0x204e 116 + #define MT6359P_VXO22_ANA_CON0 0x2088 117 + #define MT6359P_VRFCK_ANA_CON0 0x208c 118 + #define MT6359P_VBBCK_ANA_CON0 0x2096 119 + 120 + #define MT6359P_RG_BUCK_VCORE_VOSEL_ADDR MT6359P_BUCK_VCORE_ELR0 121 + #define MT6359P_RG_BUCK_VGPU11_SSHUB_EN_ADDR MT6359P_BUCK_VGPU11_SSHUB_CON0 122 + #define MT6359P_RG_BUCK_VGPU11_VOSEL_ADDR MT6359P_BUCK_VGPU11_ELR0 123 + #define MT6359P_RG_BUCK_VGPU11_SSHUB_VOSEL_ADDR MT6359P_BUCK_VGPU11_SSHUB_CON0 124 + #define MT6359P_RG_BUCK_VGPU11_SSHUB_VOSEL_MASK 0x7F 125 + #define MT6359P_RG_BUCK_VGPU11_SSHUB_VOSEL_SHIFT 4 126 + #define MT6359P_RG_LDO_VSRAM_PROC1_VOSEL_ADDR MT6359P_LDO_VSRAM_PROC1_ELR 127 + #define MT6359P_RG_LDO_VSRAM_PROC2_VOSEL_ADDR MT6359P_LDO_VSRAM_PROC2_ELR 128 + #define MT6359P_RG_LDO_VSRAM_OTHERS_VOSEL_ADDR MT6359P_LDO_VSRAM_OTHERS_ELR 129 + #define MT6359P_RG_LDO_VSRAM_MD_VOSEL_ADDR MT6359P_LDO_VSRAM_MD_ELR 130 + #define MT6359P_RG_LDO_VEMC_VOSEL_0_ADDR MT6359P_LDO_VEMC_ELR_0 131 + #define MT6359P_RG_LDO_VEMC_VOSEL_0_MASK 0xF 132 + #define MT6359P_RG_LDO_VEMC_VOSEL_0_SHIFT 0 133 + #define MT6359P_RG_LDO_VFE28_EN_ADDR MT6359P_LDO_VFE28_CON0 134 + #define MT6359P_DA_VFE28_B_EN_ADDR MT6359P_LDO_VFE28_MON 135 + #define MT6359P_RG_LDO_VXO22_EN_ADDR MT6359P_LDO_VXO22_CON0 136 + #define MT6359P_RG_LDO_VXO22_EN_SHIFT 0 137 + #define MT6359P_DA_VXO22_B_EN_ADDR MT6359P_LDO_VXO22_MON 138 + #define MT6359P_RG_LDO_VRF18_EN_ADDR MT6359P_LDO_VRF18_CON0 139 + #define MT6359P_RG_LDO_VRF18_EN_SHIFT 0 140 + #define MT6359P_DA_VRF18_B_EN_ADDR MT6359P_LDO_VRF18_MON 141 + #define MT6359P_RG_LDO_VRF12_EN_ADDR MT6359P_LDO_VRF12_CON0 142 + #define MT6359P_RG_LDO_VRF12_EN_SHIFT 0 143 + #define MT6359P_DA_VRF12_B_EN_ADDR MT6359P_LDO_VRF12_MON 144 + #define MT6359P_RG_LDO_VEFUSE_EN_ADDR MT6359P_LDO_VEFUSE_CON0 145 + #define MT6359P_RG_LDO_VEFUSE_EN_SHIFT 0 146 + #define MT6359P_DA_VEFUSE_B_EN_ADDR MT6359P_LDO_VEFUSE_MON 147 + #define MT6359P_RG_LDO_VCN33_1_EN_0_ADDR MT6359P_LDO_VCN33_1_CON0 148 + #define MT6359P_DA_VCN33_1_B_EN_ADDR MT6359P_LDO_VCN33_1_MON 149 + #define MT6359P_RG_LDO_VCN33_1_EN_1_ADDR MT6359P_LDO_VCN33_1_MULTI_SW 150 + #define MT6359P_RG_LDO_VCN33_1_EN_1_SHIFT 15 151 + #define MT6359P_RG_LDO_VCN33_2_EN_0_ADDR MT6359P_LDO_VCN33_2_CON0 152 + #define MT6359P_RG_LDO_VCN33_2_EN_0_SHIFT 0 153 + #define MT6359P_DA_VCN33_2_B_EN_ADDR MT6359P_LDO_VCN33_2_MON 154 + #define MT6359P_RG_LDO_VCN33_2_EN_1_ADDR MT6359P_LDO_VCN33_2_MULTI_SW 155 + #define MT6359P_RG_LDO_VCN13_EN_ADDR MT6359P_LDO_VCN13_CON0 156 + #define MT6359P_RG_LDO_VCN13_EN_SHIFT 0 157 + #define MT6359P_DA_VCN13_B_EN_ADDR MT6359P_LDO_VCN13_MON 158 + #define MT6359P_RG_LDO_VCN18_EN_ADDR MT6359P_LDO_VCN18_CON0 159 + #define MT6359P_DA_VCN18_B_EN_ADDR MT6359P_LDO_VCN18_MON 160 + #define MT6359P_RG_LDO_VA09_EN_ADDR MT6359P_LDO_VA09_CON0 161 + #define MT6359P_RG_LDO_VA09_EN_SHIFT 0 162 + #define MT6359P_DA_VA09_B_EN_ADDR MT6359P_LDO_VA09_MON 163 + #define MT6359P_RG_LDO_VCAMIO_EN_ADDR MT6359P_LDO_VCAMIO_CON0 164 + #define MT6359P_RG_LDO_VCAMIO_EN_SHIFT 0 165 + #define MT6359P_DA_VCAMIO_B_EN_ADDR MT6359P_LDO_VCAMIO_MON 166 + #define MT6359P_RG_LDO_VA12_EN_ADDR MT6359P_LDO_VA12_CON0 167 + #define MT6359P_RG_LDO_VA12_EN_SHIFT 0 168 + #define MT6359P_DA_VA12_B_EN_ADDR MT6359P_LDO_VA12_MON 169 + #define MT6359P_RG_LDO_VAUX18_EN_ADDR MT6359P_LDO_VAUX18_CON0 170 + #define MT6359P_DA_VAUX18_B_EN_ADDR MT6359P_LDO_VAUX18_MON 171 + #define MT6359P_RG_LDO_VAUD18_EN_ADDR MT6359P_LDO_VAUD18_CON0 172 + #define MT6359P_DA_VAUD18_B_EN_ADDR MT6359P_LDO_VAUD18_MON 173 + #define MT6359P_RG_LDO_VIO18_EN_ADDR MT6359P_LDO_VIO18_CON0 174 + #define MT6359P_RG_LDO_VIO18_EN_SHIFT 0 175 + #define MT6359P_DA_VIO18_B_EN_ADDR MT6359P_LDO_VIO18_MON 176 + #define MT6359P_RG_LDO_VEMC_EN_ADDR MT6359P_LDO_VEMC_CON0 177 + #define MT6359P_RG_LDO_VEMC_EN_SHIFT 0 178 + #define MT6359P_DA_VEMC_B_EN_ADDR MT6359P_LDO_VEMC_MON 179 + #define MT6359P_RG_LDO_VSIM1_EN_ADDR MT6359P_LDO_VSIM1_CON0 180 + #define MT6359P_RG_LDO_VSIM1_EN_SHIFT 0 181 + #define MT6359P_DA_VSIM1_B_EN_ADDR MT6359P_LDO_VSIM1_MON 182 + #define MT6359P_RG_LDO_VSIM2_EN_ADDR MT6359P_LDO_VSIM2_CON0 183 + #define MT6359P_RG_LDO_VSIM2_EN_SHIFT 0 184 + #define MT6359P_DA_VSIM2_B_EN_ADDR MT6359P_LDO_VSIM2_MON 185 + #define MT6359P_RG_LDO_VUSB_EN_0_ADDR MT6359P_LDO_VUSB_CON0 186 + #define MT6359P_DA_VUSB_B_EN_ADDR MT6359P_LDO_VUSB_MON 187 + #define MT6359P_RG_LDO_VUSB_EN_1_ADDR MT6359P_LDO_VUSB_MULTI_SW 188 + #define MT6359P_RG_LDO_VRFCK_EN_ADDR MT6359P_LDO_VRFCK_CON0 189 + #define MT6359P_RG_LDO_VRFCK_EN_SHIFT 0 190 + #define MT6359P_DA_VRFCK_B_EN_ADDR MT6359P_LDO_VRFCK_MON 191 + #define MT6359P_RG_LDO_VBBCK_EN_ADDR MT6359P_LDO_VBBCK_CON0 192 + #define MT6359P_RG_LDO_VBBCK_EN_SHIFT 0 193 + #define MT6359P_DA_VBBCK_B_EN_ADDR MT6359P_LDO_VBBCK_MON 194 + #define MT6359P_RG_LDO_VBIF28_EN_ADDR MT6359P_LDO_VBIF28_CON0 195 + #define MT6359P_DA_VBIF28_B_EN_ADDR MT6359P_LDO_VBIF28_MON 196 + #define MT6359P_RG_LDO_VIBR_EN_ADDR MT6359P_LDO_VIBR_CON0 197 + #define MT6359P_RG_LDO_VIBR_EN_SHIFT 0 198 + #define MT6359P_DA_VIBR_B_EN_ADDR MT6359P_LDO_VIBR_MON 199 + #define MT6359P_RG_LDO_VIO28_EN_ADDR MT6359P_LDO_VIO28_CON0 200 + #define MT6359P_RG_LDO_VIO28_EN_SHIFT 0 201 + #define MT6359P_DA_VIO28_B_EN_ADDR MT6359P_LDO_VIO28_MON 202 + #define MT6359P_RG_LDO_VM18_EN_ADDR MT6359P_LDO_VM18_CON0 203 + #define MT6359P_RG_LDO_VM18_EN_SHIFT 0 204 + #define MT6359P_DA_VM18_B_EN_ADDR MT6359P_LDO_VM18_MON 205 + #define MT6359P_RG_LDO_VUFS_EN_ADDR MT6359P_LDO_VUFS_CON0 206 + #define MT6359P_RG_LDO_VUFS_EN_SHIFT 0 207 + #define MT6359P_DA_VUFS_B_EN_ADDR MT6359P_LDO_VUFS_MON 208 + #define MT6359P_RG_LDO_VSRAM_PROC1_EN_ADDR MT6359P_LDO_VSRAM_PROC1_CON0 209 + #define MT6359P_DA_VSRAM_PROC1_B_EN_ADDR MT6359P_LDO_VSRAM_PROC1_MON 210 + #define MT6359P_DA_VSRAM_PROC1_VOSEL_ADDR MT6359P_LDO_VSRAM_PROC1_VOSEL1 211 + #define MT6359P_RG_LDO_VSRAM_PROC2_EN_ADDR MT6359P_LDO_VSRAM_PROC2_CON0 212 + #define MT6359P_DA_VSRAM_PROC2_B_EN_ADDR MT6359P_LDO_VSRAM_PROC2_MON 213 + #define MT6359P_DA_VSRAM_PROC2_VOSEL_ADDR MT6359P_LDO_VSRAM_PROC2_VOSEL1 214 + #define MT6359P_RG_LDO_VSRAM_OTHERS_EN_ADDR MT6359P_LDO_VSRAM_OTHERS_CON0 215 + #define MT6359P_DA_VSRAM_OTHERS_B_EN_ADDR MT6359P_LDO_VSRAM_OTHERS_MON 216 + #define MT6359P_DA_VSRAM_OTHERS_VOSEL_ADDR MT6359P_LDO_VSRAM_OTHERS_VOSEL1 217 + #define MT6359P_RG_LDO_VSRAM_OTHERS_SSHUB_EN_ADDR MT6359P_LDO_VSRAM_OTHERS_SSHUB 218 + #define MT6359P_RG_LDO_VSRAM_OTHERS_SSHUB_VOSEL_ADDR MT6359P_LDO_VSRAM_OTHERS_SSHUB 219 + #define MT6359P_RG_LDO_VSRAM_MD_EN_ADDR MT6359P_LDO_VSRAM_MD_CON0 220 + #define MT6359P_DA_VSRAM_MD_B_EN_ADDR MT6359P_LDO_VSRAM_MD_MON 221 + #define MT6359P_DA_VSRAM_MD_VOSEL_ADDR MT6359P_LDO_VSRAM_MD_VOSEL1 222 + #define MT6359P_RG_VCN33_1_VOSEL_ADDR MT6359P_VCN33_1_ANA_CON0 223 + #define MT6359P_RG_VCN33_2_VOSEL_ADDR MT6359P_VCN33_2_ANA_CON0 224 + #define MT6359P_RG_VEMC_VOSEL_ADDR MT6359P_VEMC_ANA_CON0 225 + #define MT6359P_RG_VSIM1_VOSEL_ADDR MT6359P_VSIM1_ANA_CON0 226 + #define MT6359P_RG_VSIM2_VOSEL_ADDR MT6359P_VSIM2_ANA_CON0 227 + #define MT6359P_RG_VIO28_VOSEL_ADDR MT6359P_VIO28_ANA_CON0 228 + #define MT6359P_RG_VIBR_VOSEL_ADDR MT6359P_VIBR_ANA_CON0 229 + #define MT6359P_RG_VRF18_VOSEL_ADDR MT6359P_VRF18_ANA_CON0 230 + #define MT6359P_RG_VEFUSE_VOSEL_ADDR MT6359P_VEFUSE_ANA_CON0 231 + #define MT6359P_RG_VCAMIO_VOSEL_ADDR MT6359P_VCAMIO_ANA_CON0 232 + #define MT6359P_RG_VIO18_VOSEL_ADDR MT6359P_VIO18_ANA_CON0 233 + #define MT6359P_RG_VM18_VOSEL_ADDR MT6359P_VM18_ANA_CON0 234 + #define MT6359P_RG_VUFS_VOSEL_ADDR MT6359P_VUFS_ANA_CON0 235 + #define MT6359P_RG_VRF12_VOSEL_ADDR MT6359P_VRF12_ANA_CON0 236 + #define MT6359P_RG_VCN13_VOSEL_ADDR MT6359P_VCN13_ANA_CON0 237 + #define MT6359P_RG_VA09_VOSEL_ADDR MT6359P_VRF18_ELR_3 238 + #define MT6359P_RG_VA12_VOSEL_ADDR MT6359P_VFE28_ELR_4 239 + #define MT6359P_RG_VXO22_VOSEL_ADDR MT6359P_VXO22_ANA_CON0 240 + #define MT6359P_RG_VRFCK_VOSEL_ADDR MT6359P_VRFCK_ANA_CON0 241 + #define MT6359P_RG_VBBCK_VOSEL_ADDR MT6359P_VBBCK_ANA_CON0 242 + #define MT6359P_RG_VBBCK_VOSEL_MASK 0xF 243 + #define MT6359P_RG_VBBCK_VOSEL_SHIFT 4 244 + #define MT6359P_VM_MODE_ADDR MT6359P_TOP_TRAP 245 + #define MT6359P_TMA_KEY_ADDR MT6359P_TOP_TMA_KEY 246 + 247 + #define TMA_KEY 0x9CA6 248 + 249 + #endif /* __MFD_MT6359P_REGISTERS_H__ */
+1
include/linux/mfd/mt6397/core.h
··· 13 13 enum chip_id { 14 14 MT6323_CHIP_ID = 0x23, 15 15 MT6358_CHIP_ID = 0x58, 16 + MT6359_CHIP_ID = 0x59, 16 17 MT6391_CHIP_ID = 0x91, 17 18 MT6397_CHIP_ID = 0x97, 18 19 };
+1
include/linux/mfd/mt6397/rtc.h
··· 36 36 #define RTC_AL_MASK_DOW BIT(4) 37 37 38 38 #define RTC_TC_SEC 0x000a 39 + #define RTC_TC_MTH_MASK 0x000f 39 40 /* Min, Hour, Dom... register offset to RTC_TC_SEC */ 40 41 #define RTC_OFFSET_SEC 0 41 42 #define RTC_OFFSET_MIN 1
+1
include/linux/reboot.h
··· 79 79 80 80 extern void orderly_poweroff(bool force); 81 81 extern void orderly_reboot(void); 82 + void hw_protection_shutdown(const char *reason, int ms_until_forced); 82 83 83 84 /* 84 85 * Emergency restart, callable from an interrupt handler.
+14
include/linux/regulator/consumer.h
··· 119 119 #define REGULATOR_EVENT_PRE_DISABLE 0x400 120 120 #define REGULATOR_EVENT_ABORT_DISABLE 0x800 121 121 #define REGULATOR_EVENT_ENABLE 0x1000 122 + /* 123 + * Following notifications should be emitted only if detected condition 124 + * is such that the HW is likely to still be working but consumers should 125 + * take a recovery action to prevent problems esacalating into errors. 126 + */ 127 + #define REGULATOR_EVENT_UNDER_VOLTAGE_WARN 0x2000 128 + #define REGULATOR_EVENT_OVER_CURRENT_WARN 0x4000 129 + #define REGULATOR_EVENT_OVER_VOLTAGE_WARN 0x8000 130 + #define REGULATOR_EVENT_OVER_TEMP_WARN 0x10000 131 + #define REGULATOR_EVENT_WARN_MASK 0x1E000 122 132 123 133 /* 124 134 * Regulator errors that can be queried using regulator_get_error_flags ··· 148 138 #define REGULATOR_ERROR_FAIL BIT(4) 149 139 #define REGULATOR_ERROR_OVER_TEMP BIT(5) 150 140 141 + #define REGULATOR_ERROR_UNDER_VOLTAGE_WARN BIT(6) 142 + #define REGULATOR_ERROR_OVER_CURRENT_WARN BIT(7) 143 + #define REGULATOR_ERROR_OVER_VOLTAGE_WARN BIT(8) 144 + #define REGULATOR_ERROR_OVER_TEMP_WARN BIT(9) 151 145 152 146 /** 153 147 * struct pre_voltage_change_data - Data sent with PRE_VOLTAGE_CHANGE event
-5
include/linux/regulator/coupler.h
··· 52 52 53 53 #ifdef CONFIG_REGULATOR 54 54 int regulator_coupler_register(struct regulator_coupler *coupler); 55 - const char *rdev_get_name(struct regulator_dev *rdev); 56 55 int regulator_check_consumers(struct regulator_dev *rdev, 57 56 int *min_uV, int *max_uV, 58 57 suspend_state_t state); ··· 67 68 static inline int regulator_coupler_register(struct regulator_coupler *coupler) 68 69 { 69 70 return 0; 70 - } 71 - static inline const char *rdev_get_name(struct regulator_dev *rdev) 72 - { 73 - return NULL; 74 71 } 75 72 static inline int regulator_check_consumers(struct regulator_dev *rdev, 76 73 int *min_uV, int *max_uV,
+183 -4
include/linux/regulator/driver.h
··· 40 40 REGULATOR_STATUS_UNDEFINED, 41 41 }; 42 42 43 + enum regulator_detection_severity { 44 + /* Hardware shut down voltage outputs if condition is detected */ 45 + REGULATOR_SEVERITY_PROT, 46 + /* Hardware is probably damaged/inoperable */ 47 + REGULATOR_SEVERITY_ERR, 48 + /* Hardware is still recoverable but recovery action must be taken */ 49 + REGULATOR_SEVERITY_WARN, 50 + }; 51 + 43 52 /* Initialize struct linear_range for regulators */ 44 53 #define REGULATOR_LINEAR_RANGE(_min_uV, _min_sel, _max_sel, _step_uV) \ 45 54 { \ ··· 87 78 * @get_current_limit: Get the configured limit for a current-limited regulator. 88 79 * @set_input_current_limit: Configure an input limit. 89 80 * 90 - * @set_over_current_protection: Support capability of automatically shutting 91 - * down when detecting an over current event. 81 + * @set_over_current_protection: Support enabling of and setting limits for over 82 + * current situation detection. Detection can be configured for three 83 + * levels of severity. 84 + * REGULATOR_SEVERITY_PROT should automatically shut down the regulator(s). 85 + * REGULATOR_SEVERITY_ERR should indicate that over-current situation is 86 + * caused by an unrecoverable error but HW does not perform 87 + * automatic shut down. 88 + * REGULATOR_SEVERITY_WARN should indicate situation where hardware is 89 + * still believed to not be damaged but that a board sepcific 90 + * recovery action is needed. If lim_uA is 0 the limit should not 91 + * be changed but the detection should just be enabled/disabled as 92 + * is requested. 93 + * @set_over_voltage_protection: Support enabling of and setting limits for over 94 + * voltage situation detection. Detection can be configured for same 95 + * severities as over current protection. 96 + * @set_under_voltage_protection: Support enabling of and setting limits for 97 + * under situation detection. 98 + * @set_thermal_protection: Support enabling of and setting limits for over 99 + * temperature situation detection. 92 100 * 93 101 * @set_active_discharge: Set active discharge enable/disable of regulators. 94 102 * ··· 169 143 int (*get_current_limit) (struct regulator_dev *); 170 144 171 145 int (*set_input_current_limit) (struct regulator_dev *, int lim_uA); 172 - int (*set_over_current_protection) (struct regulator_dev *); 173 - int (*set_active_discharge) (struct regulator_dev *, bool enable); 146 + int (*set_over_current_protection)(struct regulator_dev *, int lim_uA, 147 + int severity, bool enable); 148 + int (*set_over_voltage_protection)(struct regulator_dev *, int lim_uV, 149 + int severity, bool enable); 150 + int (*set_under_voltage_protection)(struct regulator_dev *, int lim_uV, 151 + int severity, bool enable); 152 + int (*set_thermal_protection)(struct regulator_dev *, int lim, 153 + int severity, bool enable); 154 + int (*set_active_discharge)(struct regulator_dev *, bool enable); 174 155 175 156 /* enable/disable regulator */ 176 157 int (*enable) (struct regulator_dev *); ··· 446 413 struct gpio_desc *ena_gpiod; 447 414 }; 448 415 416 + /** 417 + * struct regulator_err_state - regulator error/notification status 418 + * 419 + * @rdev: Regulator which status the struct indicates. 420 + * @notifs: Events which have occurred on the regulator. 421 + * @errors: Errors which are active on the regulator. 422 + * @possible_errs: Errors which can be signaled (by given IRQ). 423 + */ 424 + struct regulator_err_state { 425 + struct regulator_dev *rdev; 426 + unsigned long notifs; 427 + unsigned long errors; 428 + int possible_errs; 429 + }; 430 + 431 + /** 432 + * struct regulator_irq_data - regulator error/notification status date 433 + * 434 + * @states: Status structs for each of the associated regulators. 435 + * @num_states: Amount of associated regulators. 436 + * @data: Driver data pointer given at regulator_irq_desc. 437 + * @opaque: Value storage for IC driver. Core does not update this. ICs 438 + * may want to store status register value here at map_event and 439 + * compare contents at 'renable' callback to see if new problems 440 + * have been added to status. If that is the case it may be 441 + * desirable to return REGULATOR_ERROR_CLEARED and not 442 + * REGULATOR_ERROR_ON to allow IRQ fire again and to generate 443 + * notifications also for the new issues. 444 + * 445 + * This structure is passed to 'map_event' and 'renable' callbacks for 446 + * reporting regulator status to core. 447 + */ 448 + struct regulator_irq_data { 449 + struct regulator_err_state *states; 450 + int num_states; 451 + void *data; 452 + long opaque; 453 + }; 454 + 455 + /** 456 + * struct regulator_irq_desc - notification sender for IRQ based events. 457 + * 458 + * @name: The visible name for the IRQ 459 + * @fatal_cnt: If this IRQ is used to signal HW damaging condition it may be 460 + * best to shut-down regulator(s) or reboot the SOC if error 461 + * handling is repeatedly failing. If fatal_cnt is given the IRQ 462 + * handling is aborted if it fails for fatal_cnt times and die() 463 + * callback (if populated) or BUG() is called to try to prevent 464 + * further damage. 465 + * @reread_ms: The time which is waited before attempting to re-read status 466 + * at the worker if IC reading fails. Immediate re-read is done 467 + * if time is not specified. 468 + * @irq_off_ms: The time which IRQ is kept disabled before re-evaluating the 469 + * status for devices which keep IRQ disabled for duration of the 470 + * error. If this is not given the IRQ is left enabled and renable 471 + * is not called. 472 + * @skip_off: If set to true the IRQ handler will attempt to check if any of 473 + * the associated regulators are enabled prior to taking other 474 + * actions. If no regulators are enabled and this is set to true 475 + * a spurious IRQ is assumed and IRQ_NONE is returned. 476 + * @high_prio: Boolean to indicate that high priority WQ should be used. 477 + * @data: Driver private data pointer which will be passed as such to 478 + * the renable, map_event and die callbacks in regulator_irq_data. 479 + * @die: Protection callback. If IC status reading or recovery actions 480 + * fail fatal_cnt times this callback or BUG() is called. This 481 + * callback should implement a final protection attempt like 482 + * disabling the regulator. If protection succeeded this may 483 + * return 0. If anything else is returned the core assumes final 484 + * protection failed and calls BUG() as a last resort. 485 + * @map_event: Driver callback to map IRQ status into regulator devices with 486 + * events / errors. NOTE: callback MUST initialize both the 487 + * errors and notifs for all rdevs which it signals having 488 + * active events as core does not clean the map data. 489 + * REGULATOR_FAILED_RETRY can be returned to indicate that the 490 + * status reading from IC failed. If this is repeated for 491 + * fatal_cnt times the core will call die() callback or BUG() 492 + * as a last resort to protect the HW. 493 + * @renable: Optional callback to check status (if HW supports that) before 494 + * re-enabling IRQ. If implemented this should clear the error 495 + * flags so that errors fetched by regulator_get_error_flags() 496 + * are updated. If callback is not implemented then errors are 497 + * assumed to be cleared and IRQ is re-enabled. 498 + * REGULATOR_FAILED_RETRY can be returned to 499 + * indicate that the status reading from IC failed. If this is 500 + * repeated for 'fatal_cnt' times the core will call die() 501 + * callback or BUG() as a last resort to protect the HW. 502 + * Returning zero indicates that the problem in HW has been solved 503 + * and IRQ will be re-enabled. Returning REGULATOR_ERROR_ON 504 + * indicates the error condition is still active and keeps IRQ 505 + * disabled. Please note that returning REGULATOR_ERROR_ON does 506 + * not retrigger evaluating what events are active or resending 507 + * notifications. If this is needed you probably want to return 508 + * zero and allow IRQ to retrigger causing events to be 509 + * re-evaluated and re-sent. 510 + * 511 + * This structure is used for registering regulator IRQ notification helper. 512 + */ 513 + struct regulator_irq_desc { 514 + const char *name; 515 + int irq_flags; 516 + int fatal_cnt; 517 + int reread_ms; 518 + int irq_off_ms; 519 + bool skip_off; 520 + bool high_prio; 521 + void *data; 522 + 523 + int (*die)(struct regulator_irq_data *rid); 524 + int (*map_event)(int irq, struct regulator_irq_data *rid, 525 + unsigned long *dev_mask); 526 + int (*renable)(struct regulator_irq_data *rid); 527 + }; 528 + 529 + /* 530 + * Return values for regulator IRQ helpers. 531 + */ 532 + enum { 533 + REGULATOR_ERROR_CLEARED, 534 + REGULATOR_FAILED_RETRY, 535 + REGULATOR_ERROR_ON, 536 + }; 537 + 449 538 /* 450 539 * struct coupling_desc 451 540 * ··· 632 477 633 478 /* time when this regulator was disabled last time */ 634 479 ktime_t last_off; 480 + int cached_err; 481 + bool use_cached_err; 482 + spinlock_t err_lock; 635 483 }; 636 484 637 485 struct regulator_dev * ··· 649 491 650 492 int regulator_notifier_call_chain(struct regulator_dev *rdev, 651 493 unsigned long event, void *data); 494 + void *devm_regulator_irq_helper(struct device *dev, 495 + const struct regulator_irq_desc *d, int irq, 496 + int irq_flags, int common_errs, 497 + int *per_rdev_errs, struct regulator_dev **rdev, 498 + int rdev_amount); 499 + void *regulator_irq_helper(struct device *dev, 500 + const struct regulator_irq_desc *d, int irq, 501 + int irq_flags, int common_errs, int *per_rdev_errs, 502 + struct regulator_dev **rdev, int rdev_amount); 503 + void regulator_irq_helper_cancel(void **handle); 652 504 653 505 void *rdev_get_drvdata(struct regulator_dev *rdev); 654 506 struct device *rdev_get_dev(struct regulator_dev *rdev); ··· 708 540 int regulator_get_current_limit_regmap(struct regulator_dev *rdev); 709 541 void *regulator_get_init_drvdata(struct regulator_init_data *reg_init_data); 710 542 int regulator_set_ramp_delay_regmap(struct regulator_dev *rdev, int ramp_delay); 543 + int regulator_sync_voltage_rdev(struct regulator_dev *rdev); 711 544 712 545 /* 713 546 * Helper functions intended to be used by regulator drivers prior registering ··· 719 550 720 551 int regulator_desc_list_voltage_linear(const struct regulator_desc *desc, 721 552 unsigned int selector); 553 + 554 + #ifdef CONFIG_REGULATOR 555 + const char *rdev_get_name(struct regulator_dev *rdev); 556 + #else 557 + static inline const char *rdev_get_name(struct regulator_dev *rdev) 558 + { 559 + return NULL; 560 + } 561 + #endif 562 + 722 563 #endif
+26
include/linux/regulator/machine.h
··· 83 83 bool changeable; 84 84 }; 85 85 86 + #define REGULATOR_NOTIF_LIMIT_DISABLE -1 87 + #define REGULATOR_NOTIF_LIMIT_ENABLE -2 88 + struct notification_limit { 89 + int prot; 90 + int err; 91 + int warn; 92 + }; 93 + 86 94 /** 87 95 * struct regulation_constraints - regulator operating constraints. 88 96 * ··· 108 100 * @ilim_uA: Maximum input current. 109 101 * @system_load: Load that isn't captured by any consumer requests. 110 102 * 103 + * @over_curr_limits: Limits for acting on over current. 104 + * @over_voltage_limits: Limits for acting on over voltage. 105 + * @under_voltage_limits: Limits for acting on under voltage. 106 + * @temp_limits: Limits for acting on over temperature. 107 + 111 108 * @max_spread: Max possible spread between coupled regulators 112 109 * @max_uV_step: Max possible step change in voltage 113 110 * @valid_modes_mask: Mask of modes which may be configured by consumers. ··· 128 115 * @soft_start: Enable soft start so that voltage ramps slowly. 129 116 * @pull_down: Enable pull down when regulator is disabled. 130 117 * @over_current_protection: Auto disable on over current event. 118 + * 119 + * @over_current_detection: Configure over current limits. 120 + * @over_voltage_detection: Configure over voltage limits. 121 + * @under_voltage_detection: Configure under voltage limits. 122 + * @over_temp_detection: Configure over temperature limits. 131 123 * 132 124 * @input_uV: Input voltage for regulator when supplied by another regulator. 133 125 * ··· 190 172 struct regulator_state state_disk; 191 173 struct regulator_state state_mem; 192 174 struct regulator_state state_standby; 175 + struct notification_limit over_curr_limits; 176 + struct notification_limit over_voltage_limits; 177 + struct notification_limit under_voltage_limits; 178 + struct notification_limit temp_limits; 193 179 suspend_state_t initial_state; /* suspend state to set at init */ 194 180 195 181 /* mode to set on startup */ ··· 215 193 unsigned soft_start:1; /* ramp voltage slowly */ 216 194 unsigned pull_down:1; /* pull down resistor when regulator off */ 217 195 unsigned over_current_protection:1; /* auto disable on over current */ 196 + unsigned over_current_detection:1; /* notify on over current */ 197 + unsigned over_voltage_detection:1; /* notify on over voltage */ 198 + unsigned under_voltage_detection:1; /* notify on under voltage */ 199 + unsigned over_temp_detection:1; /* notify on over temperature */ 218 200 }; 219 201 220 202 /**
+59
include/linux/regulator/mt6359-regulator.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Copyright (c) 2021 MediaTek Inc. 4 + */ 5 + 6 + #ifndef __LINUX_REGULATOR_MT6359_H 7 + #define __LINUX_REGULATOR_MT6359_H 8 + 9 + enum { 10 + MT6359_ID_VS1 = 0, 11 + MT6359_ID_VGPU11, 12 + MT6359_ID_VMODEM, 13 + MT6359_ID_VPU, 14 + MT6359_ID_VCORE, 15 + MT6359_ID_VS2, 16 + MT6359_ID_VPA, 17 + MT6359_ID_VPROC2, 18 + MT6359_ID_VPROC1, 19 + MT6359_ID_VCORE_SSHUB, 20 + MT6359_ID_VGPU11_SSHUB = MT6359_ID_VCORE_SSHUB, 21 + MT6359_ID_VAUD18 = 10, 22 + MT6359_ID_VSIM1, 23 + MT6359_ID_VIBR, 24 + MT6359_ID_VRF12, 25 + MT6359_ID_VUSB, 26 + MT6359_ID_VSRAM_PROC2, 27 + MT6359_ID_VIO18, 28 + MT6359_ID_VCAMIO, 29 + MT6359_ID_VCN18, 30 + MT6359_ID_VFE28, 31 + MT6359_ID_VCN13, 32 + MT6359_ID_VCN33_1_BT, 33 + MT6359_ID_VCN33_1_WIFI, 34 + MT6359_ID_VAUX18, 35 + MT6359_ID_VSRAM_OTHERS, 36 + MT6359_ID_VEFUSE, 37 + MT6359_ID_VXO22, 38 + MT6359_ID_VRFCK, 39 + MT6359_ID_VBIF28, 40 + MT6359_ID_VIO28, 41 + MT6359_ID_VEMC, 42 + MT6359_ID_VCN33_2_BT, 43 + MT6359_ID_VCN33_2_WIFI, 44 + MT6359_ID_VA12, 45 + MT6359_ID_VA09, 46 + MT6359_ID_VRF18, 47 + MT6359_ID_VSRAM_MD, 48 + MT6359_ID_VUFS, 49 + MT6359_ID_VM18, 50 + MT6359_ID_VBBCK, 51 + MT6359_ID_VSRAM_PROC1, 52 + MT6359_ID_VSIM2, 53 + MT6359_ID_VSRAM_OTHERS_SSHUB, 54 + MT6359_ID_RG_MAX, 55 + }; 56 + 57 + #define MT6359_MAX_REGULATOR MT6359_ID_RG_MAX 58 + 59 + #endif /* __LINUX_REGULATOR_MT6359_H */
+79
kernel/reboot.c
··· 7 7 8 8 #define pr_fmt(fmt) "reboot: " fmt 9 9 10 + #include <linux/atomic.h> 10 11 #include <linux/ctype.h> 11 12 #include <linux/export.h> 12 13 #include <linux/kexec.h> ··· 518 517 schedule_work(&reboot_work); 519 518 } 520 519 EXPORT_SYMBOL_GPL(orderly_reboot); 520 + 521 + /** 522 + * hw_failure_emergency_poweroff_func - emergency poweroff work after a known delay 523 + * @work: work_struct associated with the emergency poweroff function 524 + * 525 + * This function is called in very critical situations to force 526 + * a kernel poweroff after a configurable timeout value. 527 + */ 528 + static void hw_failure_emergency_poweroff_func(struct work_struct *work) 529 + { 530 + /* 531 + * We have reached here after the emergency shutdown waiting period has 532 + * expired. This means orderly_poweroff has not been able to shut off 533 + * the system for some reason. 534 + * 535 + * Try to shut down the system immediately using kernel_power_off 536 + * if populated 537 + */ 538 + pr_emerg("Hardware protection timed-out. Trying forced poweroff\n"); 539 + kernel_power_off(); 540 + 541 + /* 542 + * Worst of the worst case trigger emergency restart 543 + */ 544 + pr_emerg("Hardware protection shutdown failed. Trying emergency restart\n"); 545 + emergency_restart(); 546 + } 547 + 548 + static DECLARE_DELAYED_WORK(hw_failure_emergency_poweroff_work, 549 + hw_failure_emergency_poweroff_func); 550 + 551 + /** 552 + * hw_failure_emergency_poweroff - Trigger an emergency system poweroff 553 + * 554 + * This may be called from any critical situation to trigger a system shutdown 555 + * after a given period of time. If time is negative this is not scheduled. 556 + */ 557 + static void hw_failure_emergency_poweroff(int poweroff_delay_ms) 558 + { 559 + if (poweroff_delay_ms <= 0) 560 + return; 561 + schedule_delayed_work(&hw_failure_emergency_poweroff_work, 562 + msecs_to_jiffies(poweroff_delay_ms)); 563 + } 564 + 565 + /** 566 + * hw_protection_shutdown - Trigger an emergency system poweroff 567 + * 568 + * @reason: Reason of emergency shutdown to be printed. 569 + * @ms_until_forced: Time to wait for orderly shutdown before tiggering a 570 + * forced shudown. Negative value disables the forced 571 + * shutdown. 572 + * 573 + * Initiate an emergency system shutdown in order to protect hardware from 574 + * further damage. Usage examples include a thermal protection or a voltage or 575 + * current regulator failures. 576 + * NOTE: The request is ignored if protection shutdown is already pending even 577 + * if the previous request has given a large timeout for forced shutdown. 578 + * Can be called from any context. 579 + */ 580 + void hw_protection_shutdown(const char *reason, int ms_until_forced) 581 + { 582 + static atomic_t allow_proceed = ATOMIC_INIT(1); 583 + 584 + pr_emerg("HARDWARE PROTECTION shutdown (%s)\n", reason); 585 + 586 + /* Shutdown should be initiated only once. */ 587 + if (!atomic_dec_and_test(&allow_proceed)) 588 + return; 589 + 590 + /* 591 + * Queue a backup emergency shutdown in the event of 592 + * orderly_poweroff failure 593 + */ 594 + hw_failure_emergency_poweroff(ms_until_forced); 595 + orderly_poweroff(true); 596 + } 597 + EXPORT_SYMBOL_GPL(hw_protection_shutdown); 521 598 522 599 static int __init reboot_setup(char *str) 523 600 {