linux/drivers/regulator/ab8500-ext.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (C) ST-Ericsson SA 2010
   4 *
   5 * Authors: Bengt Jonsson <bengt.g.jonsson@stericsson.com>
   6 *
   7 * This file is based on drivers/regulator/ab8500.c
   8 *
   9 * AB8500 external regulators
  10 *
  11 * ab8500-ext supports the following regulators:
  12 * - VextSupply3
  13 */
  14#include <linux/init.h>
  15#include <linux/kernel.h>
  16#include <linux/err.h>
  17#include <linux/module.h>
  18#include <linux/of.h>
  19#include <linux/platform_device.h>
  20#include <linux/regulator/driver.h>
  21#include <linux/regulator/machine.h>
  22#include <linux/regulator/of_regulator.h>
  23#include <linux/mfd/abx500.h>
  24#include <linux/mfd/abx500/ab8500.h>
  25#include <linux/regulator/ab8500.h>
  26
  27static struct regulator_consumer_supply ab8500_vaux1_consumers[] = {
  28        /* Main display, u8500 R3 uib */
  29        REGULATOR_SUPPLY("vddi", "mcde_disp_sony_acx424akp.0"),
  30        /* Main display, u8500 uib and ST uib */
  31        REGULATOR_SUPPLY("vdd1", "samsung_s6d16d0.0"),
  32        /* Secondary display, ST uib */
  33        REGULATOR_SUPPLY("vdd1", "samsung_s6d16d0.1"),
  34        /* SFH7741 proximity sensor */
  35        REGULATOR_SUPPLY("vcc", "gpio-keys.0"),
  36        /* BH1780GLS ambient light sensor */
  37        REGULATOR_SUPPLY("vcc", "2-0029"),
  38        /* lsm303dlh accelerometer */
  39        REGULATOR_SUPPLY("vdd", "2-0018"),
  40        /* lsm303dlhc accelerometer */
  41        REGULATOR_SUPPLY("vdd", "2-0019"),
  42        /* lsm303dlh magnetometer */
  43        REGULATOR_SUPPLY("vdd", "2-001e"),
  44        /* Rohm BU21013 Touchscreen devices */
  45        REGULATOR_SUPPLY("avdd", "3-005c"),
  46        REGULATOR_SUPPLY("avdd", "3-005d"),
  47        /* Synaptics RMI4 Touchscreen device */
  48        REGULATOR_SUPPLY("vdd", "3-004b"),
  49        /* L3G4200D Gyroscope device */
  50        REGULATOR_SUPPLY("vdd", "2-0068"),
  51        /* Ambient light sensor device */
  52        REGULATOR_SUPPLY("vdd", "3-0029"),
  53        /* Pressure sensor device */
  54        REGULATOR_SUPPLY("vdd", "2-005c"),
  55        /* Cypress TrueTouch Touchscreen device */
  56        REGULATOR_SUPPLY("vcpin", "spi8.0"),
  57        /* Camera device */
  58        REGULATOR_SUPPLY("vaux12v5", "mmio_camera"),
  59};
  60
  61static struct regulator_consumer_supply ab8500_vaux2_consumers[] = {
  62        /* On-board eMMC power */
  63        REGULATOR_SUPPLY("vmmc", "sdi4"),
  64        /* AB8500 audio codec */
  65        REGULATOR_SUPPLY("vcc-N2158", "ab8500-codec.0"),
  66        /* AB8500 accessory detect 1 */
  67        REGULATOR_SUPPLY("vcc-N2158", "ab8500-acc-det.0"),
  68        /* AB8500 Tv-out device */
  69        REGULATOR_SUPPLY("vcc-N2158", "mcde_tv_ab8500.4"),
  70        /* AV8100 HDMI device */
  71        REGULATOR_SUPPLY("vcc-N2158", "av8100_hdmi.3"),
  72};
  73
  74static struct regulator_consumer_supply ab8500_vaux3_consumers[] = {
  75        REGULATOR_SUPPLY("v-SD-STM", "stm"),
  76        /* External MMC slot power */
  77        REGULATOR_SUPPLY("vmmc", "sdi0"),
  78};
  79
  80static struct regulator_consumer_supply ab8500_vtvout_consumers[] = {
  81        /* TV-out DENC supply */
  82        REGULATOR_SUPPLY("vtvout", "ab8500-denc.0"),
  83        /* Internal general-purpose ADC */
  84        REGULATOR_SUPPLY("vddadc", "ab8500-gpadc.0"),
  85        /* ADC for charger */
  86        REGULATOR_SUPPLY("vddadc", "ab8500-charger.0"),
  87        /* AB8500 Tv-out device */
  88        REGULATOR_SUPPLY("vtvout", "mcde_tv_ab8500.4"),
  89};
  90
  91static struct regulator_consumer_supply ab8500_vaud_consumers[] = {
  92        /* AB8500 audio-codec main supply */
  93        REGULATOR_SUPPLY("vaud", "ab8500-codec.0"),
  94};
  95
  96static struct regulator_consumer_supply ab8500_vamic1_consumers[] = {
  97        /* AB8500 audio-codec Mic1 supply */
  98        REGULATOR_SUPPLY("vamic1", "ab8500-codec.0"),
  99};
 100
 101static struct regulator_consumer_supply ab8500_vamic2_consumers[] = {
 102        /* AB8500 audio-codec Mic2 supply */
 103        REGULATOR_SUPPLY("vamic2", "ab8500-codec.0"),
 104};
 105
 106static struct regulator_consumer_supply ab8500_vdmic_consumers[] = {
 107        /* AB8500 audio-codec DMic supply */
 108        REGULATOR_SUPPLY("vdmic", "ab8500-codec.0"),
 109};
 110
 111static struct regulator_consumer_supply ab8500_vintcore_consumers[] = {
 112        /* SoC core supply, no device */
 113        REGULATOR_SUPPLY("v-intcore", NULL),
 114        /* USB Transceiver */
 115        REGULATOR_SUPPLY("vddulpivio18", "ab8500-usb.0"),
 116        /* Handled by abx500 clk driver */
 117        REGULATOR_SUPPLY("v-intcore", "abx500-clk.0"),
 118};
 119
 120static struct regulator_consumer_supply ab8500_vana_consumers[] = {
 121        /* DB8500 DSI */
 122        REGULATOR_SUPPLY("vdddsi1v2", "mcde"),
 123        REGULATOR_SUPPLY("vdddsi1v2", "b2r2_core"),
 124        REGULATOR_SUPPLY("vdddsi1v2", "b2r2_1_core"),
 125        REGULATOR_SUPPLY("vdddsi1v2", "dsilink.0"),
 126        REGULATOR_SUPPLY("vdddsi1v2", "dsilink.1"),
 127        REGULATOR_SUPPLY("vdddsi1v2", "dsilink.2"),
 128        /* DB8500 CSI */
 129        REGULATOR_SUPPLY("vddcsi1v2", "mmio_camera"),
 130};
 131
 132/* ab8500 regulator register initialization */
 133static struct ab8500_regulator_reg_init ab8500_reg_init[] = {
 134        /*
 135         * VanaRequestCtrl          = HP/LP depending on VxRequest
 136         * VextSupply1RequestCtrl   = HP/LP depending on VxRequest
 137         */
 138        INIT_REGULATOR_REGISTER(AB8500_REGUREQUESTCTRL2,       0xf0, 0x00),
 139        /*
 140         * VextSupply2RequestCtrl   = HP/LP depending on VxRequest
 141         * VextSupply3RequestCtrl   = HP/LP depending on VxRequest
 142         * Vaux1RequestCtrl         = HP/LP depending on VxRequest
 143         * Vaux2RequestCtrl         = HP/LP depending on VxRequest
 144         */
 145        INIT_REGULATOR_REGISTER(AB8500_REGUREQUESTCTRL3,       0xff, 0x00),
 146        /*
 147         * Vaux3RequestCtrl         = HP/LP depending on VxRequest
 148         * SwHPReq                  = Control through SWValid disabled
 149         */
 150        INIT_REGULATOR_REGISTER(AB8500_REGUREQUESTCTRL4,       0x07, 0x00),
 151        /*
 152         * VanaSysClkReq1HPValid    = disabled
 153         * Vaux1SysClkReq1HPValid   = disabled
 154         * Vaux2SysClkReq1HPValid   = disabled
 155         * Vaux3SysClkReq1HPValid   = disabled
 156         */
 157        INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQ1HPVALID1, 0xe8, 0x00),
 158        /*
 159         * VextSupply1SysClkReq1HPValid = disabled
 160         * VextSupply2SysClkReq1HPValid = disabled
 161         * VextSupply3SysClkReq1HPValid = SysClkReq1 controlled
 162         */
 163        INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQ1HPVALID2, 0x70, 0x40),
 164        /*
 165         * VanaHwHPReq1Valid        = disabled
 166         * Vaux1HwHPreq1Valid       = disabled
 167         * Vaux2HwHPReq1Valid       = disabled
 168         * Vaux3HwHPReqValid        = disabled
 169         */
 170        INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ1VALID1,     0xe8, 0x00),
 171        /*
 172         * VextSupply1HwHPReq1Valid = disabled
 173         * VextSupply2HwHPReq1Valid = disabled
 174         * VextSupply3HwHPReq1Valid = disabled
 175         */
 176        INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ1VALID2,     0x07, 0x00),
 177        /*
 178         * VanaHwHPReq2Valid        = disabled
 179         * Vaux1HwHPReq2Valid       = disabled
 180         * Vaux2HwHPReq2Valid       = disabled
 181         * Vaux3HwHPReq2Valid       = disabled
 182         */
 183        INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ2VALID1,     0xe8, 0x00),
 184        /*
 185         * VextSupply1HwHPReq2Valid = disabled
 186         * VextSupply2HwHPReq2Valid = disabled
 187         * VextSupply3HwHPReq2Valid = HWReq2 controlled
 188         */
 189        INIT_REGULATOR_REGISTER(AB8500_REGUHWHPREQ2VALID2,     0x07, 0x04),
 190        /*
 191         * VanaSwHPReqValid         = disabled
 192         * Vaux1SwHPReqValid        = disabled
 193         */
 194        INIT_REGULATOR_REGISTER(AB8500_REGUSWHPREQVALID1,      0xa0, 0x00),
 195        /*
 196         * Vaux2SwHPReqValid        = disabled
 197         * Vaux3SwHPReqValid        = disabled
 198         * VextSupply1SwHPReqValid  = disabled
 199         * VextSupply2SwHPReqValid  = disabled
 200         * VextSupply3SwHPReqValid  = disabled
 201         */
 202        INIT_REGULATOR_REGISTER(AB8500_REGUSWHPREQVALID2,      0x1f, 0x00),
 203        /*
 204         * SysClkReq2Valid1         = SysClkReq2 controlled
 205         * SysClkReq3Valid1         = disabled
 206         * SysClkReq4Valid1         = SysClkReq4 controlled
 207         * SysClkReq5Valid1         = disabled
 208         * SysClkReq6Valid1         = SysClkReq6 controlled
 209         * SysClkReq7Valid1         = disabled
 210         * SysClkReq8Valid1         = disabled
 211         */
 212        INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQVALID1,    0xfe, 0x2a),
 213        /*
 214         * SysClkReq2Valid2         = disabled
 215         * SysClkReq3Valid2         = disabled
 216         * SysClkReq4Valid2         = disabled
 217         * SysClkReq5Valid2         = disabled
 218         * SysClkReq6Valid2         = SysClkReq6 controlled
 219         * SysClkReq7Valid2         = disabled
 220         * SysClkReq8Valid2         = disabled
 221         */
 222        INIT_REGULATOR_REGISTER(AB8500_REGUSYSCLKREQVALID2,    0xfe, 0x20),
 223        /*
 224         * VTVoutEna                = disabled
 225         * Vintcore12Ena            = disabled
 226         * Vintcore12Sel            = 1.25 V
 227         * Vintcore12LP             = inactive (HP)
 228         * VTVoutLP                 = inactive (HP)
 229         */
 230        INIT_REGULATOR_REGISTER(AB8500_REGUMISC1,              0xfe, 0x10),
 231        /*
 232         * VaudioEna                = disabled
 233         * VdmicEna                 = disabled
 234         * Vamic1Ena                = disabled
 235         * Vamic2Ena                = disabled
 236         */
 237        INIT_REGULATOR_REGISTER(AB8500_VAUDIOSUPPLY,           0x1e, 0x00),
 238        /*
 239         * Vamic1_dzout             = high-Z when Vamic1 is disabled
 240         * Vamic2_dzout             = high-Z when Vamic2 is disabled
 241         */
 242        INIT_REGULATOR_REGISTER(AB8500_REGUCTRL1VAMIC,         0x03, 0x00),
 243        /*
 244         * VPll                     = Hw controlled (NOTE! PRCMU bits)
 245         * VanaRegu                 = force off
 246         */
 247        INIT_REGULATOR_REGISTER(AB8500_VPLLVANAREGU,           0x0f, 0x02),
 248        /*
 249         * VrefDDREna               = disabled
 250         * VrefDDRSleepMode         = inactive (no pulldown)
 251         */
 252        INIT_REGULATOR_REGISTER(AB8500_VREFDDR,                0x03, 0x00),
 253        /*
 254         * VextSupply1Regu          = force LP
 255         * VextSupply2Regu          = force OFF
 256         * VextSupply3Regu          = force HP (-> STBB2=LP and TPS=LP)
 257         * ExtSupply2Bypass         = ExtSupply12LPn ball is 0 when Ena is 0
 258         * ExtSupply3Bypass         = ExtSupply3LPn ball is 0 when Ena is 0
 259         */
 260        INIT_REGULATOR_REGISTER(AB8500_EXTSUPPLYREGU,          0xff, 0x13),
 261        /*
 262         * Vaux1Regu                = force HP
 263         * Vaux2Regu                = force off
 264         */
 265        INIT_REGULATOR_REGISTER(AB8500_VAUX12REGU,             0x0f, 0x01),
 266        /*
 267         * Vaux3Regu                = force off
 268         */
 269        INIT_REGULATOR_REGISTER(AB8500_VRF1VAUX3REGU,          0x03, 0x00),
 270        /*
 271         * Vaux1Sel                 = 2.8 V
 272         */
 273        INIT_REGULATOR_REGISTER(AB8500_VAUX1SEL,               0x0f, 0x0C),
 274        /*
 275         * Vaux2Sel                 = 2.9 V
 276         */
 277        INIT_REGULATOR_REGISTER(AB8500_VAUX2SEL,               0x0f, 0x0d),
 278        /*
 279         * Vaux3Sel                 = 2.91 V
 280         */
 281        INIT_REGULATOR_REGISTER(AB8500_VRF1VAUX3SEL,           0x07, 0x07),
 282        /*
 283         * VextSupply12LP           = disabled (no LP)
 284         */
 285        INIT_REGULATOR_REGISTER(AB8500_REGUCTRL2SPARE,         0x01, 0x00),
 286        /*
 287         * Vaux1Disch               = short discharge time
 288         * Vaux2Disch               = short discharge time
 289         * Vaux3Disch               = short discharge time
 290         * Vintcore12Disch          = short discharge time
 291         * VTVoutDisch              = short discharge time
 292         * VaudioDisch              = short discharge time
 293         */
 294        INIT_REGULATOR_REGISTER(AB8500_REGUCTRLDISCH,          0xfc, 0x00),
 295        /*
 296         * VanaDisch                = short discharge time
 297         * VdmicPullDownEna         = pulldown disabled when Vdmic is disabled
 298         * VdmicDisch               = short discharge time
 299         */
 300        INIT_REGULATOR_REGISTER(AB8500_REGUCTRLDISCH2,         0x16, 0x00),
 301};
 302
 303/* AB8500 regulators */
 304static struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = {
 305        /* supplies to the display/camera */
 306        [AB8500_LDO_AUX1] = {
 307                .supply_regulator = "ab8500-ext-supply3",
 308                .constraints = {
 309                        .name = "V-DISPLAY",
 310                        .min_uV = 2800000,
 311                        .max_uV = 3300000,
 312                        .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
 313                                          REGULATOR_CHANGE_STATUS,
 314                        .boot_on = 1, /* display is on at boot */
 315                },
 316                .num_consumer_supplies = ARRAY_SIZE(ab8500_vaux1_consumers),
 317                .consumer_supplies = ab8500_vaux1_consumers,
 318        },
 319        /* supplies to the on-board eMMC */
 320        [AB8500_LDO_AUX2] = {
 321                .supply_regulator = "ab8500-ext-supply3",
 322                .constraints = {
 323                        .name = "V-eMMC1",
 324                        .min_uV = 1100000,
 325                        .max_uV = 3300000,
 326                        .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
 327                                          REGULATOR_CHANGE_STATUS |
 328                                          REGULATOR_CHANGE_MODE,
 329                        .valid_modes_mask = REGULATOR_MODE_NORMAL |
 330                                            REGULATOR_MODE_IDLE,
 331                },
 332                .num_consumer_supplies = ARRAY_SIZE(ab8500_vaux2_consumers),
 333                .consumer_supplies = ab8500_vaux2_consumers,
 334        },
 335        /* supply for VAUX3, supplies to SDcard slots */
 336        [AB8500_LDO_AUX3] = {
 337                .supply_regulator = "ab8500-ext-supply3",
 338                .constraints = {
 339                        .name = "V-MMC-SD",
 340                        .min_uV = 1100000,
 341                        .max_uV = 3300000,
 342                        .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
 343                                          REGULATOR_CHANGE_STATUS |
 344                                          REGULATOR_CHANGE_MODE,
 345                        .valid_modes_mask = REGULATOR_MODE_NORMAL |
 346                                            REGULATOR_MODE_IDLE,
 347                },
 348                .num_consumer_supplies = ARRAY_SIZE(ab8500_vaux3_consumers),
 349                .consumer_supplies = ab8500_vaux3_consumers,
 350        },
 351        /* supply for tvout, gpadc, TVOUT LDO */
 352        [AB8500_LDO_TVOUT] = {
 353                .constraints = {
 354                        .name = "V-TVOUT",
 355                        .valid_ops_mask = REGULATOR_CHANGE_STATUS,
 356                },
 357                .num_consumer_supplies = ARRAY_SIZE(ab8500_vtvout_consumers),
 358                .consumer_supplies = ab8500_vtvout_consumers,
 359        },
 360        /* supply for ab8500-vaudio, VAUDIO LDO */
 361        [AB8500_LDO_AUDIO] = {
 362                .constraints = {
 363                        .name = "V-AUD",
 364                        .valid_ops_mask = REGULATOR_CHANGE_STATUS,
 365                },
 366                .num_consumer_supplies = ARRAY_SIZE(ab8500_vaud_consumers),
 367                .consumer_supplies = ab8500_vaud_consumers,
 368        },
 369        /* supply for v-anamic1 VAMic1-LDO */
 370        [AB8500_LDO_ANAMIC1] = {
 371                .constraints = {
 372                        .name = "V-AMIC1",
 373                        .valid_ops_mask = REGULATOR_CHANGE_STATUS,
 374                },
 375                .num_consumer_supplies = ARRAY_SIZE(ab8500_vamic1_consumers),
 376                .consumer_supplies = ab8500_vamic1_consumers,
 377        },
 378        /* supply for v-amic2, VAMIC2 LDO, reuse constants for AMIC1 */
 379        [AB8500_LDO_ANAMIC2] = {
 380                .constraints = {
 381                        .name = "V-AMIC2",
 382                        .valid_ops_mask = REGULATOR_CHANGE_STATUS,
 383                },
 384                .num_consumer_supplies = ARRAY_SIZE(ab8500_vamic2_consumers),
 385                .consumer_supplies = ab8500_vamic2_consumers,
 386        },
 387        /* supply for v-dmic, VDMIC LDO */
 388        [AB8500_LDO_DMIC] = {
 389                .constraints = {
 390                        .name = "V-DMIC",
 391                        .valid_ops_mask = REGULATOR_CHANGE_STATUS,
 392                },
 393                .num_consumer_supplies = ARRAY_SIZE(ab8500_vdmic_consumers),
 394                .consumer_supplies = ab8500_vdmic_consumers,
 395        },
 396        /* supply for v-intcore12, VINTCORE12 LDO */
 397        [AB8500_LDO_INTCORE] = {
 398                .constraints = {
 399                        .name = "V-INTCORE",
 400                        .min_uV = 1250000,
 401                        .max_uV = 1350000,
 402                        .input_uV = 1800000,
 403                        .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
 404                                          REGULATOR_CHANGE_STATUS |
 405                                          REGULATOR_CHANGE_MODE |
 406                                          REGULATOR_CHANGE_DRMS,
 407                        .valid_modes_mask = REGULATOR_MODE_NORMAL |
 408                                            REGULATOR_MODE_IDLE,
 409                },
 410                .num_consumer_supplies = ARRAY_SIZE(ab8500_vintcore_consumers),
 411                .consumer_supplies = ab8500_vintcore_consumers,
 412        },
 413        /* supply for U8500 CSI-DSI, VANA LDO */
 414        [AB8500_LDO_ANA] = {
 415                .constraints = {
 416                        .name = "V-CSI-DSI",
 417                        .valid_ops_mask = REGULATOR_CHANGE_STATUS,
 418                },
 419                .num_consumer_supplies = ARRAY_SIZE(ab8500_vana_consumers),
 420                .consumer_supplies = ab8500_vana_consumers,
 421        },
 422};
 423
 424/* supply for VextSupply3 */
 425static struct regulator_consumer_supply ab8500_ext_supply3_consumers[] = {
 426        /* SIM supply for 3 V SIM cards */
 427        REGULATOR_SUPPLY("vinvsim", "sim-detect.0"),
 428};
 429
 430/*
 431 * AB8500 external regulators
 432 */
 433static struct regulator_init_data ab8500_ext_regulators[] = {
 434        /* fixed Vbat supplies VSMPS1_EXT_1V8 */
 435        [AB8500_EXT_SUPPLY1] = {
 436                .constraints = {
 437                        .name = "ab8500-ext-supply1",
 438                        .min_uV = 1800000,
 439                        .max_uV = 1800000,
 440                        .initial_mode = REGULATOR_MODE_IDLE,
 441                        .boot_on = 1,
 442                        .always_on = 1,
 443                },
 444        },
 445        /* fixed Vbat supplies VSMPS2_EXT_1V36 and VSMPS5_EXT_1V15 */
 446        [AB8500_EXT_SUPPLY2] = {
 447                .constraints = {
 448                        .name = "ab8500-ext-supply2",
 449                        .min_uV = 1360000,
 450                        .max_uV = 1360000,
 451                },
 452        },
 453        /* fixed Vbat supplies VSMPS3_EXT_3V4 and VSMPS4_EXT_3V4 */
 454        [AB8500_EXT_SUPPLY3] = {
 455                .constraints = {
 456                        .name = "ab8500-ext-supply3",
 457                        .min_uV = 3400000,
 458                        .max_uV = 3400000,
 459                        .valid_ops_mask = REGULATOR_CHANGE_STATUS,
 460                        .boot_on = 1,
 461                },
 462                .num_consumer_supplies =
 463                        ARRAY_SIZE(ab8500_ext_supply3_consumers),
 464                .consumer_supplies = ab8500_ext_supply3_consumers,
 465        },
 466};
 467
 468static struct ab8500_regulator_platform_data ab8500_regulator_plat_data = {
 469        .reg_init               = ab8500_reg_init,
 470        .num_reg_init           = ARRAY_SIZE(ab8500_reg_init),
 471        .regulator              = ab8500_regulators,
 472        .num_regulator          = ARRAY_SIZE(ab8500_regulators),
 473        .ext_regulator          = ab8500_ext_regulators,
 474        .num_ext_regulator      = ARRAY_SIZE(ab8500_ext_regulators),
 475};
 476
 477/**
 478 * struct ab8500_ext_regulator_info - ab8500 regulator information
 479 * @dev: device pointer
 480 * @desc: regulator description
 481 * @cfg: regulator configuration (extension of regulator FW configuration)
 482 * @update_bank: bank to control on/off
 483 * @update_reg: register to control on/off
 484 * @update_mask: mask to enable/disable and set mode of regulator
 485 * @update_val: bits holding the regulator current mode
 486 * @update_val_hp: bits to set EN pin active (LPn pin deactive)
 487 *                 normally this means high power mode
 488 * @update_val_lp: bits to set EN pin active and LPn pin active
 489 *                 normally this means low power mode
 490 * @update_val_hw: bits to set regulator pins in HW control
 491 *                 SysClkReq pins and logic will choose mode
 492 */
 493struct ab8500_ext_regulator_info {
 494        struct device *dev;
 495        struct regulator_desc desc;
 496        struct ab8500_ext_regulator_cfg *cfg;
 497        u8 update_bank;
 498        u8 update_reg;
 499        u8 update_mask;
 500        u8 update_val;
 501        u8 update_val_hp;
 502        u8 update_val_lp;
 503        u8 update_val_hw;
 504};
 505
 506static int ab8500_ext_regulator_enable(struct regulator_dev *rdev)
 507{
 508        int ret;
 509        struct ab8500_ext_regulator_info *info = rdev_get_drvdata(rdev);
 510        u8 regval;
 511
 512        if (info == NULL) {
 513                dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
 514                return -EINVAL;
 515        }
 516
 517        /*
 518         * To satisfy both HW high power request and SW request, the regulator
 519         * must be on in high power.
 520         */
 521        if (info->cfg && info->cfg->hwreq)
 522                regval = info->update_val_hp;
 523        else
 524                regval = info->update_val;
 525
 526        ret = abx500_mask_and_set_register_interruptible(info->dev,
 527                info->update_bank, info->update_reg,
 528                info->update_mask, regval);
 529        if (ret < 0) {
 530                dev_err(rdev_get_dev(rdev),
 531                        "couldn't set enable bits for regulator\n");
 532                return ret;
 533        }
 534
 535        dev_dbg(rdev_get_dev(rdev),
 536                "%s-enable (bank, reg, mask, value): 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
 537                info->desc.name, info->update_bank, info->update_reg,
 538                info->update_mask, regval);
 539
 540        return 0;
 541}
 542
 543static int ab8500_ext_regulator_disable(struct regulator_dev *rdev)
 544{
 545        int ret;
 546        struct ab8500_ext_regulator_info *info = rdev_get_drvdata(rdev);
 547        u8 regval;
 548
 549        if (info == NULL) {
 550                dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
 551                return -EINVAL;
 552        }
 553
 554        /*
 555         * Set the regulator in HW request mode if configured
 556         */
 557        if (info->cfg && info->cfg->hwreq)
 558                regval = info->update_val_hw;
 559        else
 560                regval = 0;
 561
 562        ret = abx500_mask_and_set_register_interruptible(info->dev,
 563                info->update_bank, info->update_reg,
 564                info->update_mask, regval);
 565        if (ret < 0) {
 566                dev_err(rdev_get_dev(rdev),
 567                        "couldn't set disable bits for regulator\n");
 568                return ret;
 569        }
 570
 571        dev_dbg(rdev_get_dev(rdev), "%s-disable (bank, reg, mask, value):"
 572                " 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
 573                info->desc.name, info->update_bank, info->update_reg,
 574                info->update_mask, regval);
 575
 576        return 0;
 577}
 578
 579static int ab8500_ext_regulator_is_enabled(struct regulator_dev *rdev)
 580{
 581        int ret;
 582        struct ab8500_ext_regulator_info *info = rdev_get_drvdata(rdev);
 583        u8 regval;
 584
 585        if (info == NULL) {
 586                dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
 587                return -EINVAL;
 588        }
 589
 590        ret = abx500_get_register_interruptible(info->dev,
 591                info->update_bank, info->update_reg, &regval);
 592        if (ret < 0) {
 593                dev_err(rdev_get_dev(rdev),
 594                        "couldn't read 0x%x register\n", info->update_reg);
 595                return ret;
 596        }
 597
 598        dev_dbg(rdev_get_dev(rdev), "%s-is_enabled (bank, reg, mask, value):"
 599                " 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
 600                info->desc.name, info->update_bank, info->update_reg,
 601                info->update_mask, regval);
 602
 603        if (((regval & info->update_mask) == info->update_val_lp) ||
 604            ((regval & info->update_mask) == info->update_val_hp))
 605                return 1;
 606        else
 607                return 0;
 608}
 609
 610static int ab8500_ext_regulator_set_mode(struct regulator_dev *rdev,
 611                                         unsigned int mode)
 612{
 613        int ret = 0;
 614        struct ab8500_ext_regulator_info *info = rdev_get_drvdata(rdev);
 615        u8 regval;
 616
 617        if (info == NULL) {
 618                dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
 619                return -EINVAL;
 620        }
 621
 622        switch (mode) {
 623        case REGULATOR_MODE_NORMAL:
 624                regval = info->update_val_hp;
 625                break;
 626        case REGULATOR_MODE_IDLE:
 627                regval = info->update_val_lp;
 628                break;
 629
 630        default:
 631                return -EINVAL;
 632        }
 633
 634        /* If regulator is enabled and info->cfg->hwreq is set, the regulator
 635           must be on in high power, so we don't need to write the register with
 636           the same value.
 637         */
 638        if (ab8500_ext_regulator_is_enabled(rdev) &&
 639            !(info->cfg && info->cfg->hwreq)) {
 640                ret = abx500_mask_and_set_register_interruptible(info->dev,
 641                                        info->update_bank, info->update_reg,
 642                                        info->update_mask, regval);
 643                if (ret < 0) {
 644                        dev_err(rdev_get_dev(rdev),
 645                                "Could not set regulator mode.\n");
 646                        return ret;
 647                }
 648
 649                dev_dbg(rdev_get_dev(rdev),
 650                        "%s-set_mode (bank, reg, mask, value): "
 651                        "0x%x, 0x%x, 0x%x, 0x%x\n",
 652                        info->desc.name, info->update_bank, info->update_reg,
 653                        info->update_mask, regval);
 654        }
 655
 656        info->update_val = regval;
 657
 658        return 0;
 659}
 660
 661static unsigned int ab8500_ext_regulator_get_mode(struct regulator_dev *rdev)
 662{
 663        struct ab8500_ext_regulator_info *info = rdev_get_drvdata(rdev);
 664        int ret;
 665
 666        if (info == NULL) {
 667                dev_err(rdev_get_dev(rdev), "regulator info null pointer\n");
 668                return -EINVAL;
 669        }
 670
 671        if (info->update_val == info->update_val_hp)
 672                ret = REGULATOR_MODE_NORMAL;
 673        else if (info->update_val == info->update_val_lp)
 674                ret = REGULATOR_MODE_IDLE;
 675        else
 676                ret = -EINVAL;
 677
 678        return ret;
 679}
 680
 681static int ab8500_ext_set_voltage(struct regulator_dev *rdev, int min_uV,
 682                                  int max_uV, unsigned *selector)
 683{
 684        struct regulation_constraints *regu_constraints = rdev->constraints;
 685
 686        if (!regu_constraints) {
 687                dev_err(rdev_get_dev(rdev), "No regulator constraints\n");
 688                return -EINVAL;
 689        }
 690
 691        if (regu_constraints->min_uV == min_uV &&
 692            regu_constraints->max_uV == max_uV)
 693                return 0;
 694
 695        dev_err(rdev_get_dev(rdev),
 696                "Requested min %duV max %duV != constrained min %duV max %duV\n",
 697                min_uV, max_uV,
 698                regu_constraints->min_uV, regu_constraints->max_uV);
 699
 700        return -EINVAL;
 701}
 702
 703static int ab8500_ext_list_voltage(struct regulator_dev *rdev,
 704                                   unsigned selector)
 705{
 706        struct regulation_constraints *regu_constraints = rdev->constraints;
 707
 708        if (regu_constraints == NULL) {
 709                dev_err(rdev_get_dev(rdev), "regulator constraints null pointer\n");
 710                return -EINVAL;
 711        }
 712        /* return the uV for the fixed regulators */
 713        if (regu_constraints->min_uV && regu_constraints->max_uV) {
 714                if (regu_constraints->min_uV == regu_constraints->max_uV)
 715                        return regu_constraints->min_uV;
 716        }
 717        return -EINVAL;
 718}
 719
 720static const struct regulator_ops ab8500_ext_regulator_ops = {
 721        .enable                 = ab8500_ext_regulator_enable,
 722        .disable                = ab8500_ext_regulator_disable,
 723        .is_enabled             = ab8500_ext_regulator_is_enabled,
 724        .set_mode               = ab8500_ext_regulator_set_mode,
 725        .get_mode               = ab8500_ext_regulator_get_mode,
 726        .set_voltage            = ab8500_ext_set_voltage,
 727        .list_voltage           = ab8500_ext_list_voltage,
 728};
 729
 730static struct ab8500_ext_regulator_info
 731                ab8500_ext_regulator_info[AB8500_NUM_EXT_REGULATORS] = {
 732        [AB8500_EXT_SUPPLY1] = {
 733                .desc = {
 734                        .name           = "VEXTSUPPLY1",
 735                        .of_match       = of_match_ptr("ab8500_ext1"),
 736                        .ops            = &ab8500_ext_regulator_ops,
 737                        .type           = REGULATOR_VOLTAGE,
 738                        .id             = AB8500_EXT_SUPPLY1,
 739                        .owner          = THIS_MODULE,
 740                        .n_voltages     = 1,
 741                },
 742                .update_bank            = 0x04,
 743                .update_reg             = 0x08,
 744                .update_mask            = 0x03,
 745                .update_val             = 0x01,
 746                .update_val_hp          = 0x01,
 747                .update_val_lp          = 0x03,
 748                .update_val_hw          = 0x02,
 749        },
 750        [AB8500_EXT_SUPPLY2] = {
 751                .desc = {
 752                        .name           = "VEXTSUPPLY2",
 753                        .of_match       = of_match_ptr("ab8500_ext2"),
 754                        .ops            = &ab8500_ext_regulator_ops,
 755                        .type           = REGULATOR_VOLTAGE,
 756                        .id             = AB8500_EXT_SUPPLY2,
 757                        .owner          = THIS_MODULE,
 758                        .n_voltages     = 1,
 759                },
 760                .update_bank            = 0x04,
 761                .update_reg             = 0x08,
 762                .update_mask            = 0x0c,
 763                .update_val             = 0x04,
 764                .update_val_hp          = 0x04,
 765                .update_val_lp          = 0x0c,
 766                .update_val_hw          = 0x08,
 767        },
 768        [AB8500_EXT_SUPPLY3] = {
 769                .desc = {
 770                        .name           = "VEXTSUPPLY3",
 771                        .of_match       = of_match_ptr("ab8500_ext3"),
 772                        .ops            = &ab8500_ext_regulator_ops,
 773                        .type           = REGULATOR_VOLTAGE,
 774                        .id             = AB8500_EXT_SUPPLY3,
 775                        .owner          = THIS_MODULE,
 776                        .n_voltages     = 1,
 777                },
 778                .update_bank            = 0x04,
 779                .update_reg             = 0x08,
 780                .update_mask            = 0x30,
 781                .update_val             = 0x10,
 782                .update_val_hp          = 0x10,
 783                .update_val_lp          = 0x30,
 784                .update_val_hw          = 0x20,
 785        },
 786};
 787
 788static int ab8500_ext_regulator_probe(struct platform_device *pdev)
 789{
 790        struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);
 791        struct ab8500_regulator_platform_data *pdata = &ab8500_regulator_plat_data;
 792        struct regulator_config config = { };
 793        struct regulator_dev *rdev;
 794        int i;
 795
 796        if (!ab8500) {
 797                dev_err(&pdev->dev, "null mfd parent\n");
 798                return -EINVAL;
 799        }
 800
 801        /* make sure the platform data has the correct size */
 802        if (pdata->num_ext_regulator != ARRAY_SIZE(ab8500_ext_regulator_info)) {
 803                dev_err(&pdev->dev, "Configuration error: size mismatch.\n");
 804                return -EINVAL;
 805        }
 806
 807        /* check for AB8500 2.x */
 808        if (is_ab8500_2p0_or_earlier(ab8500)) {
 809                struct ab8500_ext_regulator_info *info;
 810
 811                /* VextSupply3LPn is inverted on AB8500 2.x */
 812                info = &ab8500_ext_regulator_info[AB8500_EXT_SUPPLY3];
 813                info->update_val = 0x30;
 814                info->update_val_hp = 0x30;
 815                info->update_val_lp = 0x10;
 816        }
 817
 818        /* register all regulators */
 819        for (i = 0; i < ARRAY_SIZE(ab8500_ext_regulator_info); i++) {
 820                struct ab8500_ext_regulator_info *info = NULL;
 821
 822                /* assign per-regulator data */
 823                info = &ab8500_ext_regulator_info[i];
 824                info->dev = &pdev->dev;
 825                info->cfg = (struct ab8500_ext_regulator_cfg *)
 826                        pdata->ext_regulator[i].driver_data;
 827
 828                config.dev = &pdev->dev;
 829                config.driver_data = info;
 830                config.init_data = &pdata->ext_regulator[i];
 831
 832                /* register regulator with framework */
 833                rdev = devm_regulator_register(&pdev->dev, &info->desc,
 834                                               &config);
 835                if (IS_ERR(rdev)) {
 836                        dev_err(&pdev->dev, "failed to register regulator %s\n",
 837                                        info->desc.name);
 838                        return PTR_ERR(rdev);
 839                }
 840
 841                dev_dbg(&pdev->dev, "%s-probed\n", info->desc.name);
 842        }
 843
 844        return 0;
 845}
 846
 847static struct platform_driver ab8500_ext_regulator_driver = {
 848        .probe = ab8500_ext_regulator_probe,
 849        .driver         = {
 850                .name   = "ab8500-ext-regulator",
 851        },
 852};
 853
 854static int __init ab8500_ext_regulator_init(void)
 855{
 856        int ret;
 857
 858        ret = platform_driver_register(&ab8500_ext_regulator_driver);
 859        if (ret)
 860                pr_err("Failed to register ab8500 ext regulator: %d\n", ret);
 861
 862        return ret;
 863}
 864subsys_initcall(ab8500_ext_regulator_init);
 865
 866static void __exit ab8500_ext_regulator_exit(void)
 867{
 868        platform_driver_unregister(&ab8500_ext_regulator_driver);
 869}
 870module_exit(ab8500_ext_regulator_exit);
 871
 872MODULE_LICENSE("GPL v2");
 873MODULE_AUTHOR("Bengt Jonsson <bengt.g.jonsson@stericsson.com>");
 874MODULE_DESCRIPTION("AB8500 external regulator driver");
 875MODULE_ALIAS("platform:ab8500-ext-regulator");
 876