s2mpa01.c revision f18792714608a670c2762d22f695d77d02fc965e
1f18792714608a670c2762d22f695d77d02fc965eSachin Kamat/* 2f18792714608a670c2762d22f695d77d02fc965eSachin Kamat * Copyright (c) 2013 Samsung Electronics Co., Ltd 3f18792714608a670c2762d22f695d77d02fc965eSachin Kamat * http://www.samsung.com 4f18792714608a670c2762d22f695d77d02fc965eSachin Kamat * 5f18792714608a670c2762d22f695d77d02fc965eSachin Kamat * This program is free software; you can redistribute it and/or modify it 6f18792714608a670c2762d22f695d77d02fc965eSachin Kamat * under the terms of the GNU General Public License as published by the 7f18792714608a670c2762d22f695d77d02fc965eSachin Kamat * Free Software Foundation; either version 2 of the License, or (at your 8f18792714608a670c2762d22f695d77d02fc965eSachin Kamat * option) any later version. 9f18792714608a670c2762d22f695d77d02fc965eSachin Kamat * 10f18792714608a670c2762d22f695d77d02fc965eSachin Kamat */ 11f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 12f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/bug.h> 13f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/err.h> 14f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/gpio.h> 15f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/slab.h> 16f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/module.h> 17f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/of.h> 18f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/regmap.h> 19f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/platform_device.h> 20f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/regulator/driver.h> 21f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/regulator/machine.h> 22f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/regulator/of_regulator.h> 23f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/mfd/samsung/core.h> 24f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#include <linux/mfd/samsung/s2mpa01.h> 25f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 26f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define S2MPA01_REGULATOR_CNT ARRAY_SIZE(regulators) 27f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 28f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstruct s2mpa01_info { 29f18792714608a670c2762d22f695d77d02fc965eSachin Kamat int ramp_delay24; 30f18792714608a670c2762d22f695d77d02fc965eSachin Kamat int ramp_delay3; 31f18792714608a670c2762d22f695d77d02fc965eSachin Kamat int ramp_delay5; 32f18792714608a670c2762d22f695d77d02fc965eSachin Kamat int ramp_delay16; 33f18792714608a670c2762d22f695d77d02fc965eSachin Kamat int ramp_delay7; 34f18792714608a670c2762d22f695d77d02fc965eSachin Kamat int ramp_delay8910; 35f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}; 36f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 37f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstatic int get_ramp_delay(int ramp_delay) 38f18792714608a670c2762d22f695d77d02fc965eSachin Kamat{ 39f18792714608a670c2762d22f695d77d02fc965eSachin Kamat unsigned char cnt = 0; 40f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 41f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_delay /= 6250; 42f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 43f18792714608a670c2762d22f695d77d02fc965eSachin Kamat while (true) { 44f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_delay = ramp_delay >> 1; 45f18792714608a670c2762d22f695d77d02fc965eSachin Kamat if (ramp_delay == 0) 46f18792714608a670c2762d22f695d77d02fc965eSachin Kamat break; 47f18792714608a670c2762d22f695d77d02fc965eSachin Kamat cnt++; 48f18792714608a670c2762d22f695d77d02fc965eSachin Kamat } 49f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 50f18792714608a670c2762d22f695d77d02fc965eSachin Kamat if (cnt > 3) 51f18792714608a670c2762d22f695d77d02fc965eSachin Kamat cnt = 3; 52f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 53f18792714608a670c2762d22f695d77d02fc965eSachin Kamat return cnt; 54f18792714608a670c2762d22f695d77d02fc965eSachin Kamat} 55f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 56f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstatic int s2mpa01_regulator_set_voltage_time_sel(struct regulator_dev *rdev, 57f18792714608a670c2762d22f695d77d02fc965eSachin Kamat unsigned int old_selector, 58f18792714608a670c2762d22f695d77d02fc965eSachin Kamat unsigned int new_selector) 59f18792714608a670c2762d22f695d77d02fc965eSachin Kamat{ 60f18792714608a670c2762d22f695d77d02fc965eSachin Kamat struct s2mpa01_info *s2mpa01 = rdev_get_drvdata(rdev); 61f18792714608a670c2762d22f695d77d02fc965eSachin Kamat unsigned int ramp_delay = 0; 62f18792714608a670c2762d22f695d77d02fc965eSachin Kamat int old_volt, new_volt; 63f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 64f18792714608a670c2762d22f695d77d02fc965eSachin Kamat switch (rdev->desc->id) { 65f18792714608a670c2762d22f695d77d02fc965eSachin Kamat case S2MPA01_BUCK2: 66f18792714608a670c2762d22f695d77d02fc965eSachin Kamat case S2MPA01_BUCK4: 67f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_delay = s2mpa01->ramp_delay24; 68f18792714608a670c2762d22f695d77d02fc965eSachin Kamat break; 69f18792714608a670c2762d22f695d77d02fc965eSachin Kamat case S2MPA01_BUCK3: 70f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_delay = s2mpa01->ramp_delay3; 71f18792714608a670c2762d22f695d77d02fc965eSachin Kamat break; 72f18792714608a670c2762d22f695d77d02fc965eSachin Kamat case S2MPA01_BUCK5: 73f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_delay = s2mpa01->ramp_delay5; 74f18792714608a670c2762d22f695d77d02fc965eSachin Kamat break; 75f18792714608a670c2762d22f695d77d02fc965eSachin Kamat case S2MPA01_BUCK1: 76f18792714608a670c2762d22f695d77d02fc965eSachin Kamat case S2MPA01_BUCK6: 77f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_delay = s2mpa01->ramp_delay16; 78f18792714608a670c2762d22f695d77d02fc965eSachin Kamat break; 79f18792714608a670c2762d22f695d77d02fc965eSachin Kamat case S2MPA01_BUCK7: 80f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_delay = s2mpa01->ramp_delay7; 81f18792714608a670c2762d22f695d77d02fc965eSachin Kamat break; 82f18792714608a670c2762d22f695d77d02fc965eSachin Kamat case S2MPA01_BUCK8: 83f18792714608a670c2762d22f695d77d02fc965eSachin Kamat case S2MPA01_BUCK9: 84f18792714608a670c2762d22f695d77d02fc965eSachin Kamat case S2MPA01_BUCK10: 85f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_delay = s2mpa01->ramp_delay8910; 86f18792714608a670c2762d22f695d77d02fc965eSachin Kamat break; 87f18792714608a670c2762d22f695d77d02fc965eSachin Kamat } 88f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 89f18792714608a670c2762d22f695d77d02fc965eSachin Kamat if (ramp_delay == 0) 90f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_delay = rdev->desc->ramp_delay; 91f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 92f18792714608a670c2762d22f695d77d02fc965eSachin Kamat old_volt = rdev->desc->min_uV + (rdev->desc->uV_step * old_selector); 93f18792714608a670c2762d22f695d77d02fc965eSachin Kamat new_volt = rdev->desc->min_uV + (rdev->desc->uV_step * new_selector); 94f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 95f18792714608a670c2762d22f695d77d02fc965eSachin Kamat return DIV_ROUND_UP(abs(new_volt - old_volt), ramp_delay); 96f18792714608a670c2762d22f695d77d02fc965eSachin Kamat} 97f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 98f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstatic int s2mpa01_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay) 99f18792714608a670c2762d22f695d77d02fc965eSachin Kamat{ 100f18792714608a670c2762d22f695d77d02fc965eSachin Kamat struct s2mpa01_info *s2mpa01 = rdev_get_drvdata(rdev); 101f18792714608a670c2762d22f695d77d02fc965eSachin Kamat unsigned int ramp_val, ramp_shift, ramp_reg = S2MPA01_REG_RAMP2; 102f18792714608a670c2762d22f695d77d02fc965eSachin Kamat unsigned int ramp_enable = 1, enable_shift = 0; 103f18792714608a670c2762d22f695d77d02fc965eSachin Kamat int ret; 104f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 105f18792714608a670c2762d22f695d77d02fc965eSachin Kamat switch (rdev->desc->id) { 106f18792714608a670c2762d22f695d77d02fc965eSachin Kamat case S2MPA01_BUCK1: 107f18792714608a670c2762d22f695d77d02fc965eSachin Kamat enable_shift = S2MPA01_BUCK1_RAMP_EN_SHIFT; 108f18792714608a670c2762d22f695d77d02fc965eSachin Kamat if (!ramp_delay) { 109f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_enable = 0; 110f18792714608a670c2762d22f695d77d02fc965eSachin Kamat break; 111f18792714608a670c2762d22f695d77d02fc965eSachin Kamat } 112f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 113f18792714608a670c2762d22f695d77d02fc965eSachin Kamat if (ramp_delay > s2mpa01->ramp_delay16) 114f18792714608a670c2762d22f695d77d02fc965eSachin Kamat s2mpa01->ramp_delay16 = ramp_delay; 115f18792714608a670c2762d22f695d77d02fc965eSachin Kamat else 116f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_delay = s2mpa01->ramp_delay16; 117f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 118f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_shift = S2MPA01_BUCK16_RAMP_SHIFT; 119f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_reg = S2MPA01_REG_RAMP1; 120f18792714608a670c2762d22f695d77d02fc965eSachin Kamat break; 121f18792714608a670c2762d22f695d77d02fc965eSachin Kamat case S2MPA01_BUCK2: 122f18792714608a670c2762d22f695d77d02fc965eSachin Kamat enable_shift = S2MPA01_BUCK2_RAMP_EN_SHIFT; 123f18792714608a670c2762d22f695d77d02fc965eSachin Kamat if (!ramp_delay) { 124f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_enable = 0; 125f18792714608a670c2762d22f695d77d02fc965eSachin Kamat break; 126f18792714608a670c2762d22f695d77d02fc965eSachin Kamat } 127f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 128f18792714608a670c2762d22f695d77d02fc965eSachin Kamat if (ramp_delay > s2mpa01->ramp_delay24) 129f18792714608a670c2762d22f695d77d02fc965eSachin Kamat s2mpa01->ramp_delay24 = ramp_delay; 130f18792714608a670c2762d22f695d77d02fc965eSachin Kamat else 131f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_delay = s2mpa01->ramp_delay24; 132f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 133f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_shift = S2MPA01_BUCK24_RAMP_SHIFT; 134f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_reg = S2MPA01_REG_RAMP1; 135f18792714608a670c2762d22f695d77d02fc965eSachin Kamat break; 136f18792714608a670c2762d22f695d77d02fc965eSachin Kamat case S2MPA01_BUCK3: 137f18792714608a670c2762d22f695d77d02fc965eSachin Kamat enable_shift = S2MPA01_BUCK3_RAMP_EN_SHIFT; 138f18792714608a670c2762d22f695d77d02fc965eSachin Kamat if (!ramp_delay) { 139f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_enable = 0; 140f18792714608a670c2762d22f695d77d02fc965eSachin Kamat break; 141f18792714608a670c2762d22f695d77d02fc965eSachin Kamat } 142f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 143f18792714608a670c2762d22f695d77d02fc965eSachin Kamat s2mpa01->ramp_delay3 = ramp_delay; 144f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_shift = S2MPA01_BUCK3_RAMP_SHIFT; 145f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_reg = S2MPA01_REG_RAMP1; 146f18792714608a670c2762d22f695d77d02fc965eSachin Kamat break; 147f18792714608a670c2762d22f695d77d02fc965eSachin Kamat case S2MPA01_BUCK4: 148f18792714608a670c2762d22f695d77d02fc965eSachin Kamat enable_shift = S2MPA01_BUCK4_RAMP_EN_SHIFT; 149f18792714608a670c2762d22f695d77d02fc965eSachin Kamat if (!ramp_delay) { 150f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_enable = 0; 151f18792714608a670c2762d22f695d77d02fc965eSachin Kamat break; 152f18792714608a670c2762d22f695d77d02fc965eSachin Kamat } 153f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 154f18792714608a670c2762d22f695d77d02fc965eSachin Kamat if (ramp_delay > s2mpa01->ramp_delay24) 155f18792714608a670c2762d22f695d77d02fc965eSachin Kamat s2mpa01->ramp_delay24 = ramp_delay; 156f18792714608a670c2762d22f695d77d02fc965eSachin Kamat else 157f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_delay = s2mpa01->ramp_delay24; 158f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 159f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_shift = S2MPA01_BUCK24_RAMP_SHIFT; 160f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_reg = S2MPA01_REG_RAMP1; 161f18792714608a670c2762d22f695d77d02fc965eSachin Kamat break; 162f18792714608a670c2762d22f695d77d02fc965eSachin Kamat case S2MPA01_BUCK5: 163f18792714608a670c2762d22f695d77d02fc965eSachin Kamat s2mpa01->ramp_delay5 = ramp_delay; 164f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_shift = S2MPA01_BUCK5_RAMP_SHIFT; 165f18792714608a670c2762d22f695d77d02fc965eSachin Kamat break; 166f18792714608a670c2762d22f695d77d02fc965eSachin Kamat case S2MPA01_BUCK6: 167f18792714608a670c2762d22f695d77d02fc965eSachin Kamat if (ramp_delay > s2mpa01->ramp_delay16) 168f18792714608a670c2762d22f695d77d02fc965eSachin Kamat s2mpa01->ramp_delay16 = ramp_delay; 169f18792714608a670c2762d22f695d77d02fc965eSachin Kamat else 170f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_delay = s2mpa01->ramp_delay16; 171f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 172f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_shift = S2MPA01_BUCK16_RAMP_SHIFT; 173f18792714608a670c2762d22f695d77d02fc965eSachin Kamat break; 174f18792714608a670c2762d22f695d77d02fc965eSachin Kamat case S2MPA01_BUCK7: 175f18792714608a670c2762d22f695d77d02fc965eSachin Kamat s2mpa01->ramp_delay7 = ramp_delay; 176f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_shift = S2MPA01_BUCK7_RAMP_SHIFT; 177f18792714608a670c2762d22f695d77d02fc965eSachin Kamat break; 178f18792714608a670c2762d22f695d77d02fc965eSachin Kamat case S2MPA01_BUCK8: 179f18792714608a670c2762d22f695d77d02fc965eSachin Kamat case S2MPA01_BUCK9: 180f18792714608a670c2762d22f695d77d02fc965eSachin Kamat case S2MPA01_BUCK10: 181f18792714608a670c2762d22f695d77d02fc965eSachin Kamat if (ramp_delay > s2mpa01->ramp_delay8910) 182f18792714608a670c2762d22f695d77d02fc965eSachin Kamat s2mpa01->ramp_delay8910 = ramp_delay; 183f18792714608a670c2762d22f695d77d02fc965eSachin Kamat else 184f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_delay = s2mpa01->ramp_delay8910; 185f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 186f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_shift = S2MPA01_BUCK8910_RAMP_SHIFT; 187f18792714608a670c2762d22f695d77d02fc965eSachin Kamat break; 188f18792714608a670c2762d22f695d77d02fc965eSachin Kamat default: 189f18792714608a670c2762d22f695d77d02fc965eSachin Kamat return 0; 190f18792714608a670c2762d22f695d77d02fc965eSachin Kamat } 191f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 192f18792714608a670c2762d22f695d77d02fc965eSachin Kamat if (!ramp_enable) 193f18792714608a670c2762d22f695d77d02fc965eSachin Kamat goto ramp_disable; 194f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 195f18792714608a670c2762d22f695d77d02fc965eSachin Kamat if (enable_shift) { 196f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ret = regmap_update_bits(rdev->regmap, S2MPA01_REG_RAMP1, 197f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 1 << enable_shift, 1 << enable_shift); 198f18792714608a670c2762d22f695d77d02fc965eSachin Kamat if (ret) { 199f18792714608a670c2762d22f695d77d02fc965eSachin Kamat dev_err(&rdev->dev, "failed to enable ramp rate\n"); 200f18792714608a670c2762d22f695d77d02fc965eSachin Kamat return ret; 201f18792714608a670c2762d22f695d77d02fc965eSachin Kamat } 202f18792714608a670c2762d22f695d77d02fc965eSachin Kamat } 203f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 204f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_val = get_ramp_delay(ramp_delay); 205f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 206f18792714608a670c2762d22f695d77d02fc965eSachin Kamat return regmap_update_bits(rdev->regmap, ramp_reg, 0x3 << ramp_shift, 207f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ramp_val << ramp_shift); 208f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 209f18792714608a670c2762d22f695d77d02fc965eSachin Kamatramp_disable: 210f18792714608a670c2762d22f695d77d02fc965eSachin Kamat return regmap_update_bits(rdev->regmap, S2MPA01_REG_RAMP1, 211f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 1 << enable_shift, 0); 212f18792714608a670c2762d22f695d77d02fc965eSachin Kamat} 213f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 214f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstatic struct regulator_ops s2mpa01_ldo_ops = { 215f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .list_voltage = regulator_list_voltage_linear, 216f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .map_voltage = regulator_map_voltage_linear, 217f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .is_enabled = regulator_is_enabled_regmap, 218f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .enable = regulator_enable_regmap, 219f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .disable = regulator_disable_regmap, 220f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .get_voltage_sel = regulator_get_voltage_sel_regmap, 221f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .set_voltage_sel = regulator_set_voltage_sel_regmap, 222f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .set_voltage_time_sel = regulator_set_voltage_time_sel, 223f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}; 224f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 225f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstatic struct regulator_ops s2mpa01_buck_ops = { 226f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .list_voltage = regulator_list_voltage_linear, 227f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .map_voltage = regulator_map_voltage_linear, 228f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .is_enabled = regulator_is_enabled_regmap, 229f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .enable = regulator_enable_regmap, 230f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .disable = regulator_disable_regmap, 231f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .get_voltage_sel = regulator_get_voltage_sel_regmap, 232f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .set_voltage_sel = regulator_set_voltage_sel_regmap, 233f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .set_voltage_time_sel = s2mpa01_regulator_set_voltage_time_sel, 234f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .set_ramp_delay = s2mpa01_set_ramp_delay, 235f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}; 236f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 237f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define regulator_desc_ldo1(num) { \ 238f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .name = "LDO"#num, \ 239f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .id = S2MPA01_LDO##num, \ 240f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .ops = &s2mpa01_ldo_ops, \ 241f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .type = REGULATOR_VOLTAGE, \ 242f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .owner = THIS_MODULE, \ 243f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .min_uV = S2MPA01_LDO_MIN, \ 244f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .uV_step = S2MPA01_LDO_STEP1, \ 245f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .n_voltages = S2MPA01_LDO_N_VOLTAGES, \ 246f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .vsel_reg = S2MPA01_REG_L1CTRL + num - 1, \ 247f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .vsel_mask = S2MPA01_LDO_VSEL_MASK, \ 248f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .enable_reg = S2MPA01_REG_L1CTRL + num - 1, \ 249f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .enable_mask = S2MPA01_ENABLE_MASK \ 250f18792714608a670c2762d22f695d77d02fc965eSachin Kamat} 251f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define regulator_desc_ldo2(num) { \ 252f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .name = "LDO"#num, \ 253f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .id = S2MPA01_LDO##num, \ 254f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .ops = &s2mpa01_ldo_ops, \ 255f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .type = REGULATOR_VOLTAGE, \ 256f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .owner = THIS_MODULE, \ 257f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .min_uV = S2MPA01_LDO_MIN, \ 258f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .uV_step = S2MPA01_LDO_STEP2, \ 259f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .n_voltages = S2MPA01_LDO_N_VOLTAGES, \ 260f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .vsel_reg = S2MPA01_REG_L1CTRL + num - 1, \ 261f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .vsel_mask = S2MPA01_LDO_VSEL_MASK, \ 262f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .enable_reg = S2MPA01_REG_L1CTRL + num - 1, \ 263f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .enable_mask = S2MPA01_ENABLE_MASK \ 264f18792714608a670c2762d22f695d77d02fc965eSachin Kamat} 265f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 266f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define regulator_desc_buck1_4(num) { \ 267f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .name = "BUCK"#num, \ 268f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .id = S2MPA01_BUCK##num, \ 269f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .ops = &s2mpa01_buck_ops, \ 270f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .type = REGULATOR_VOLTAGE, \ 271f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .owner = THIS_MODULE, \ 272f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .min_uV = S2MPA01_BUCK_MIN1, \ 273f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .uV_step = S2MPA01_BUCK_STEP1, \ 274f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .n_voltages = S2MPA01_BUCK_N_VOLTAGES, \ 275f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .ramp_delay = S2MPA01_RAMP_DELAY, \ 276f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .vsel_reg = S2MPA01_REG_B1CTRL2 + (num - 1) * 2, \ 277f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .vsel_mask = S2MPA01_BUCK_VSEL_MASK, \ 278f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .enable_reg = S2MPA01_REG_B1CTRL1 + (num - 1) * 2, \ 279f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .enable_mask = S2MPA01_ENABLE_MASK \ 280f18792714608a670c2762d22f695d77d02fc965eSachin Kamat} 281f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 282f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define regulator_desc_buck5 { \ 283f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .name = "BUCK5", \ 284f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .id = S2MPA01_BUCK5, \ 285f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .ops = &s2mpa01_buck_ops, \ 286f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .type = REGULATOR_VOLTAGE, \ 287f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .owner = THIS_MODULE, \ 288f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .min_uV = S2MPA01_BUCK_MIN2, \ 289f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .uV_step = S2MPA01_BUCK_STEP1, \ 290f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .n_voltages = S2MPA01_BUCK_N_VOLTAGES, \ 291f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .ramp_delay = S2MPA01_RAMP_DELAY, \ 292f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .vsel_reg = S2MPA01_REG_B5CTRL2, \ 293f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .vsel_mask = S2MPA01_BUCK_VSEL_MASK, \ 294f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .enable_reg = S2MPA01_REG_B5CTRL1, \ 295f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .enable_mask = S2MPA01_ENABLE_MASK \ 296f18792714608a670c2762d22f695d77d02fc965eSachin Kamat} 297f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 298f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define regulator_desc_buck6_7(num) { \ 299f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .name = "BUCK"#num, \ 300f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .id = S2MPA01_BUCK##num, \ 301f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .ops = &s2mpa01_buck_ops, \ 302f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .type = REGULATOR_VOLTAGE, \ 303f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .owner = THIS_MODULE, \ 304f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .min_uV = S2MPA01_BUCK_MIN1, \ 305f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .uV_step = S2MPA01_BUCK_STEP1, \ 306f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .n_voltages = S2MPA01_BUCK_N_VOLTAGES, \ 307f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .ramp_delay = S2MPA01_RAMP_DELAY, \ 308f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .vsel_reg = S2MPA01_REG_B6CTRL2 + (num - 6) * 2, \ 309f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .vsel_mask = S2MPA01_BUCK_VSEL_MASK, \ 310f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .enable_reg = S2MPA01_REG_B6CTRL1 + (num - 6) * 2, \ 311f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .enable_mask = S2MPA01_ENABLE_MASK \ 312f18792714608a670c2762d22f695d77d02fc965eSachin Kamat} 313f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 314f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define regulator_desc_buck8 { \ 315f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .name = "BUCK8", \ 316f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .id = S2MPA01_BUCK8, \ 317f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .ops = &s2mpa01_buck_ops, \ 318f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .type = REGULATOR_VOLTAGE, \ 319f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .owner = THIS_MODULE, \ 320f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .min_uV = S2MPA01_BUCK_MIN2, \ 321f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .uV_step = S2MPA01_BUCK_STEP2, \ 322f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .n_voltages = S2MPA01_BUCK_N_VOLTAGES, \ 323f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .ramp_delay = S2MPA01_RAMP_DELAY, \ 324f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .vsel_reg = S2MPA01_REG_B8CTRL2, \ 325f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .vsel_mask = S2MPA01_BUCK_VSEL_MASK, \ 326f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .enable_reg = S2MPA01_REG_B8CTRL1, \ 327f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .enable_mask = S2MPA01_ENABLE_MASK \ 328f18792714608a670c2762d22f695d77d02fc965eSachin Kamat} 329f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 330f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define regulator_desc_buck9 { \ 331f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .name = "BUCK9", \ 332f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .id = S2MPA01_BUCK9, \ 333f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .ops = &s2mpa01_buck_ops, \ 334f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .type = REGULATOR_VOLTAGE, \ 335f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .owner = THIS_MODULE, \ 336f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .min_uV = S2MPA01_BUCK_MIN4, \ 337f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .uV_step = S2MPA01_BUCK_STEP2, \ 338f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .n_voltages = S2MPA01_BUCK_N_VOLTAGES, \ 339f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .ramp_delay = S2MPA01_RAMP_DELAY, \ 340f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .vsel_reg = S2MPA01_REG_B9CTRL2, \ 341f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .vsel_mask = S2MPA01_BUCK_VSEL_MASK, \ 342f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .enable_reg = S2MPA01_REG_B9CTRL1, \ 343f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .enable_mask = S2MPA01_ENABLE_MASK \ 344f18792714608a670c2762d22f695d77d02fc965eSachin Kamat} 345f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 346f18792714608a670c2762d22f695d77d02fc965eSachin Kamat#define regulator_desc_buck10 { \ 347f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .name = "BUCK10", \ 348f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .id = S2MPA01_BUCK10, \ 349f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .ops = &s2mpa01_buck_ops, \ 350f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .type = REGULATOR_VOLTAGE, \ 351f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .owner = THIS_MODULE, \ 352f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .min_uV = S2MPA01_BUCK_MIN3, \ 353f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .uV_step = S2MPA01_BUCK_STEP2, \ 354f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .n_voltages = S2MPA01_BUCK_N_VOLTAGES, \ 355f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .ramp_delay = S2MPA01_RAMP_DELAY, \ 356f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .vsel_reg = S2MPA01_REG_B10CTRL2, \ 357f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .vsel_mask = S2MPA01_BUCK_VSEL_MASK, \ 358f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .enable_reg = S2MPA01_REG_B10CTRL1, \ 359f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .enable_mask = S2MPA01_ENABLE_MASK \ 360f18792714608a670c2762d22f695d77d02fc965eSachin Kamat} 361f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 362f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstatic struct regulator_desc regulators[] = { 363f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo2(1), 364f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo1(2), 365f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo1(3), 366f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo1(4), 367f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo1(5), 368f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo2(6), 369f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo1(7), 370f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo1(8), 371f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo1(9), 372f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo1(10), 373f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo2(11), 374f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo1(12), 375f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo1(13), 376f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo1(14), 377f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo1(15), 378f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo1(16), 379f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo1(17), 380f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo1(18), 381f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo1(19), 382f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo1(20), 383f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo1(21), 384f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo2(22), 385f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo2(23), 386f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo1(24), 387f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo1(25), 388f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_ldo1(26), 389f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_buck1_4(1), 390f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_buck1_4(2), 391f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_buck1_4(3), 392f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_buck1_4(4), 393f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_buck5, 394f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_buck6_7(6), 395f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_buck6_7(7), 396f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_buck8, 397f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_buck9, 398f18792714608a670c2762d22f695d77d02fc965eSachin Kamat regulator_desc_buck10, 399f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}; 400f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 401f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstatic int s2mpa01_pmic_probe(struct platform_device *pdev) 402f18792714608a670c2762d22f695d77d02fc965eSachin Kamat{ 403f18792714608a670c2762d22f695d77d02fc965eSachin Kamat struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent); 404f18792714608a670c2762d22f695d77d02fc965eSachin Kamat struct sec_platform_data *pdata = dev_get_platdata(iodev->dev); 405f18792714608a670c2762d22f695d77d02fc965eSachin Kamat struct of_regulator_match rdata[S2MPA01_REGULATOR_MAX]; 406f18792714608a670c2762d22f695d77d02fc965eSachin Kamat struct device_node *reg_np = NULL; 407f18792714608a670c2762d22f695d77d02fc965eSachin Kamat struct regulator_config config = { }; 408f18792714608a670c2762d22f695d77d02fc965eSachin Kamat struct s2mpa01_info *s2mpa01; 409f18792714608a670c2762d22f695d77d02fc965eSachin Kamat int i; 410f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 411f18792714608a670c2762d22f695d77d02fc965eSachin Kamat s2mpa01 = devm_kzalloc(&pdev->dev, sizeof(*s2mpa01), GFP_KERNEL); 412f18792714608a670c2762d22f695d77d02fc965eSachin Kamat if (!s2mpa01) 413f18792714608a670c2762d22f695d77d02fc965eSachin Kamat return -ENOMEM; 414f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 415f18792714608a670c2762d22f695d77d02fc965eSachin Kamat for (i = 0; i < S2MPA01_REGULATOR_CNT; i++) 416f18792714608a670c2762d22f695d77d02fc965eSachin Kamat rdata[i].name = regulators[i].name; 417f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 418f18792714608a670c2762d22f695d77d02fc965eSachin Kamat if (iodev->dev->of_node) { 419f18792714608a670c2762d22f695d77d02fc965eSachin Kamat reg_np = of_get_child_by_name(iodev->dev->of_node, 420f18792714608a670c2762d22f695d77d02fc965eSachin Kamat "regulators"); 421f18792714608a670c2762d22f695d77d02fc965eSachin Kamat if (!reg_np) { 422f18792714608a670c2762d22f695d77d02fc965eSachin Kamat dev_err(&pdev->dev, 423f18792714608a670c2762d22f695d77d02fc965eSachin Kamat "could not find regulators sub-node\n"); 424f18792714608a670c2762d22f695d77d02fc965eSachin Kamat return -EINVAL; 425f18792714608a670c2762d22f695d77d02fc965eSachin Kamat } 426f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 427f18792714608a670c2762d22f695d77d02fc965eSachin Kamat of_regulator_match(&pdev->dev, reg_np, rdata, 428f18792714608a670c2762d22f695d77d02fc965eSachin Kamat S2MPA01_REGULATOR_MAX); 429f18792714608a670c2762d22f695d77d02fc965eSachin Kamat of_node_put(reg_np); 430f18792714608a670c2762d22f695d77d02fc965eSachin Kamat } 431f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 432f18792714608a670c2762d22f695d77d02fc965eSachin Kamat platform_set_drvdata(pdev, s2mpa01); 433f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 434f18792714608a670c2762d22f695d77d02fc965eSachin Kamat config.dev = &pdev->dev; 435f18792714608a670c2762d22f695d77d02fc965eSachin Kamat config.regmap = iodev->regmap_pmic; 436f18792714608a670c2762d22f695d77d02fc965eSachin Kamat config.driver_data = s2mpa01; 437f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 438f18792714608a670c2762d22f695d77d02fc965eSachin Kamat for (i = 0; i < S2MPA01_REGULATOR_MAX; i++) { 439f18792714608a670c2762d22f695d77d02fc965eSachin Kamat struct regulator_dev *rdev; 440f18792714608a670c2762d22f695d77d02fc965eSachin Kamat if (pdata) 441f18792714608a670c2762d22f695d77d02fc965eSachin Kamat config.init_data = pdata->regulators[i].initdata; 442f18792714608a670c2762d22f695d77d02fc965eSachin Kamat else 443f18792714608a670c2762d22f695d77d02fc965eSachin Kamat config.init_data = rdata[i].init_data; 444f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 445f18792714608a670c2762d22f695d77d02fc965eSachin Kamat if (reg_np) 446f18792714608a670c2762d22f695d77d02fc965eSachin Kamat config.of_node = rdata[i].of_node; 447f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 448f18792714608a670c2762d22f695d77d02fc965eSachin Kamat rdev = devm_regulator_register(&pdev->dev, 449f18792714608a670c2762d22f695d77d02fc965eSachin Kamat ®ulators[i], &config); 450f18792714608a670c2762d22f695d77d02fc965eSachin Kamat if (IS_ERR(rdev)) { 451f18792714608a670c2762d22f695d77d02fc965eSachin Kamat dev_err(&pdev->dev, "regulator init failed for %d\n", 452f18792714608a670c2762d22f695d77d02fc965eSachin Kamat i); 453f18792714608a670c2762d22f695d77d02fc965eSachin Kamat return PTR_ERR(rdev); 454f18792714608a670c2762d22f695d77d02fc965eSachin Kamat } 455f18792714608a670c2762d22f695d77d02fc965eSachin Kamat } 456f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 457f18792714608a670c2762d22f695d77d02fc965eSachin Kamat return 0; 458f18792714608a670c2762d22f695d77d02fc965eSachin Kamat} 459f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 460f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstatic const struct platform_device_id s2mpa01_pmic_id[] = { 461f18792714608a670c2762d22f695d77d02fc965eSachin Kamat { "s2mpa01-pmic", 0}, 462f18792714608a670c2762d22f695d77d02fc965eSachin Kamat { }, 463f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}; 464f18792714608a670c2762d22f695d77d02fc965eSachin KamatMODULE_DEVICE_TABLE(platform, s2mpa01_pmic_id); 465f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 466f18792714608a670c2762d22f695d77d02fc965eSachin Kamatstatic struct platform_driver s2mpa01_pmic_driver = { 467f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .driver = { 468f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .name = "s2mpa01-pmic", 469f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .owner = THIS_MODULE, 470f18792714608a670c2762d22f695d77d02fc965eSachin Kamat }, 471f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .probe = s2mpa01_pmic_probe, 472f18792714608a670c2762d22f695d77d02fc965eSachin Kamat .id_table = s2mpa01_pmic_id, 473f18792714608a670c2762d22f695d77d02fc965eSachin Kamat}; 474f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 475f18792714608a670c2762d22f695d77d02fc965eSachin Kamatmodule_platform_driver(s2mpa01_pmic_driver); 476f18792714608a670c2762d22f695d77d02fc965eSachin Kamat 477f18792714608a670c2762d22f695d77d02fc965eSachin Kamat/* Module information */ 478f18792714608a670c2762d22f695d77d02fc965eSachin KamatMODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>"); 479f18792714608a670c2762d22f695d77d02fc965eSachin KamatMODULE_AUTHOR("Sachin Kamat <sachin.kamat@samsung.com>"); 480f18792714608a670c2762d22f695d77d02fc965eSachin KamatMODULE_DESCRIPTION("SAMSUNG S2MPA01 Regulator Driver"); 481f18792714608a670c2762d22f695d77d02fc965eSachin KamatMODULE_LICENSE("GPL"); 482