1/* 2 * max77802.c - Regulator driver for the Maxim 77802 3 * 4 * Copyright (C) 2013-2014 Google, Inc 5 * Simon Glass <sjg@chromium.org> 6 * 7 * Copyright (C) 2012 Samsung Electronics 8 * Chiwoong Byun <woong.byun@smasung.com> 9 * Jonghwa Lee <jonghwa3.lee@samsung.com> 10 * 11 * This program is free software; you can redistribute it and/or modify 12 * it under the terms of the GNU General Public License as published by 13 * the Free Software Foundation; either version 2 of the License, or 14 * (at your option) any later version. 15 * 16 * This program is distributed in the hope that it will be useful, 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 * GNU General Public License for more details. 20 * 21 * This driver is based on max8997.c 22 */ 23 24#include <linux/kernel.h> 25#include <linux/bug.h> 26#include <linux/err.h> 27#include <linux/gpio.h> 28#include <linux/slab.h> 29#include <linux/gpio/consumer.h> 30#include <linux/platform_device.h> 31#include <linux/regulator/driver.h> 32#include <linux/regulator/machine.h> 33#include <linux/regulator/of_regulator.h> 34#include <linux/mfd/max77686.h> 35#include <linux/mfd/max77686-private.h> 36 37/* Default ramp delay in case it is not manually set */ 38#define MAX77802_RAMP_DELAY 100000 /* uV/us */ 39 40#define MAX77802_OPMODE_SHIFT_LDO 6 41#define MAX77802_OPMODE_BUCK234_SHIFT 4 42#define MAX77802_OPMODE_MASK 0x3 43 44#define MAX77802_VSEL_MASK 0x3F 45#define MAX77802_DVS_VSEL_MASK 0xFF 46 47#define MAX77802_RAMP_RATE_MASK_2BIT 0xC0 48#define MAX77802_RAMP_RATE_SHIFT_2BIT 6 49#define MAX77802_RAMP_RATE_MASK_4BIT 0xF0 50#define MAX77802_RAMP_RATE_SHIFT_4BIT 4 51 52/* MAX77802 has two register formats: 2-bit and 4-bit */ 53static const unsigned int ramp_table_77802_2bit[] = { 54 12500, 55 25000, 56 50000, 57 100000, 58}; 59 60static unsigned int ramp_table_77802_4bit[] = { 61 1000, 2000, 3030, 4000, 62 5000, 5880, 7140, 8330, 63 9090, 10000, 11110, 12500, 64 16670, 25000, 50000, 100000, 65}; 66 67struct max77802_regulator_prv { 68 unsigned int opmode[MAX77802_REG_MAX]; 69}; 70 71static int max77802_get_opmode_shift(int id) 72{ 73 if (id == MAX77802_BUCK1 || (id >= MAX77802_BUCK5 && 74 id <= MAX77802_BUCK10)) 75 return 0; 76 77 if (id >= MAX77802_BUCK2 && id <= MAX77802_BUCK4) 78 return MAX77802_OPMODE_BUCK234_SHIFT; 79 80 if (id >= MAX77802_LDO1 && id <= MAX77802_LDO35) 81 return MAX77802_OPMODE_SHIFT_LDO; 82 83 return -EINVAL; 84} 85 86/* 87 * Some BUCKS supports Normal[ON/OFF] mode during suspend 88 * 89 * BUCK 1, 6, 2-4, 5, 7-10 (all) 90 * 91 * The other mode (0x02) will make PWRREQ switch between normal 92 * and low power. 93 */ 94static int max77802_buck_set_suspend_disable(struct regulator_dev *rdev) 95{ 96 unsigned int val = MAX77802_OPMODE_STANDBY; 97 struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev); 98 int id = rdev_get_id(rdev); 99 int shift = max77802_get_opmode_shift(id); 100 101 max77802->opmode[id] = val; 102 return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 103 rdev->desc->enable_mask, val << shift); 104} 105 106/* 107 * Some LDOs supports LPM-ON/OFF/Normal-ON mode during suspend state 108 * (Enable Control Logic1 by PWRREQ) 109 * 110 * LDOs 2, 4-19, 22-35. 111 * 112 */ 113static int max77802_ldo_set_suspend_mode_logic1(struct regulator_dev *rdev, 114 unsigned int mode) 115{ 116 struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev); 117 int id = rdev_get_id(rdev); 118 unsigned int val; 119 int shift = max77802_get_opmode_shift(id); 120 121 switch (mode) { 122 case REGULATOR_MODE_IDLE: /* ON in LP Mode */ 123 val = MAX77802_OPMODE_LP; 124 break; 125 case REGULATOR_MODE_NORMAL: /* ON in Normal Mode */ 126 val = MAX77802_OPMODE_NORMAL; 127 break; 128 case REGULATOR_MODE_STANDBY: /* ON/OFF by PWRREQ */ 129 val = MAX77802_OPMODE_STANDBY; 130 break; 131 default: 132 dev_warn(&rdev->dev, "%s: regulator mode: 0x%x not supported\n", 133 rdev->desc->name, mode); 134 return -EINVAL; 135 } 136 137 max77802->opmode[id] = val; 138 return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 139 rdev->desc->enable_mask, val << shift); 140} 141 142/* 143 * Mode 1 (Output[ON/OFF] by PWRREQ) is not supported on some LDOs 144 * (Enable Control Logic2 by PWRREQ) 145 * 146 * LDOs 1, 20, 21, and 3, 147 * 148 */ 149static int max77802_ldo_set_suspend_mode_logic2(struct regulator_dev *rdev, 150 unsigned int mode) 151{ 152 struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev); 153 int id = rdev_get_id(rdev); 154 unsigned int val; 155 int shift = max77802_get_opmode_shift(id); 156 157 switch (mode) { 158 case REGULATOR_MODE_IDLE: /* ON in LP Mode */ 159 val = MAX77802_OPMODE_LP; 160 break; 161 case REGULATOR_MODE_NORMAL: /* ON in Normal Mode */ 162 val = MAX77802_OPMODE_NORMAL; 163 break; 164 default: 165 dev_warn(&rdev->dev, "%s: regulator mode: 0x%x not supported\n", 166 rdev->desc->name, mode); 167 return -EINVAL; 168 } 169 170 max77802->opmode[id] = val; 171 return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 172 rdev->desc->enable_mask, val << shift); 173} 174 175static int max77802_enable(struct regulator_dev *rdev) 176{ 177 struct max77802_regulator_prv *max77802 = rdev_get_drvdata(rdev); 178 int id = rdev_get_id(rdev); 179 int shift = max77802_get_opmode_shift(id); 180 181 return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 182 rdev->desc->enable_mask, 183 max77802->opmode[id] << shift); 184} 185 186static int max77802_find_ramp_value(struct regulator_dev *rdev, 187 const unsigned int limits[], int size, 188 unsigned int ramp_delay) 189{ 190 int i; 191 192 for (i = 0; i < size; i++) { 193 if (ramp_delay <= limits[i]) 194 return i; 195 } 196 197 /* Use maximum value for no ramp control */ 198 dev_warn(&rdev->dev, "%s: ramp_delay: %d not supported, setting 100000\n", 199 rdev->desc->name, ramp_delay); 200 return size - 1; 201} 202 203/* Used for BUCKs 2-4 */ 204static int max77802_set_ramp_delay_2bit(struct regulator_dev *rdev, 205 int ramp_delay) 206{ 207 int id = rdev_get_id(rdev); 208 unsigned int ramp_value; 209 210 if (id > MAX77802_BUCK4) { 211 dev_warn(&rdev->dev, 212 "%s: regulator: ramp delay not supported\n", 213 rdev->desc->name); 214 return -EINVAL; 215 } 216 ramp_value = max77802_find_ramp_value(rdev, ramp_table_77802_2bit, 217 ARRAY_SIZE(ramp_table_77802_2bit), ramp_delay); 218 219 return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 220 MAX77802_RAMP_RATE_MASK_2BIT, 221 ramp_value << MAX77802_RAMP_RATE_SHIFT_2BIT); 222} 223 224/* For BUCK1, 6 */ 225static int max77802_set_ramp_delay_4bit(struct regulator_dev *rdev, 226 int ramp_delay) 227{ 228 unsigned int ramp_value; 229 230 ramp_value = max77802_find_ramp_value(rdev, ramp_table_77802_4bit, 231 ARRAY_SIZE(ramp_table_77802_4bit), ramp_delay); 232 233 return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 234 MAX77802_RAMP_RATE_MASK_4BIT, 235 ramp_value << MAX77802_RAMP_RATE_SHIFT_4BIT); 236} 237 238/* 239 * LDOs 2, 4-19, 22-35 240 */ 241static struct regulator_ops max77802_ldo_ops_logic1 = { 242 .list_voltage = regulator_list_voltage_linear, 243 .map_voltage = regulator_map_voltage_linear, 244 .is_enabled = regulator_is_enabled_regmap, 245 .enable = max77802_enable, 246 .disable = regulator_disable_regmap, 247 .get_voltage_sel = regulator_get_voltage_sel_regmap, 248 .set_voltage_sel = regulator_set_voltage_sel_regmap, 249 .set_voltage_time_sel = regulator_set_voltage_time_sel, 250 .set_suspend_mode = max77802_ldo_set_suspend_mode_logic1, 251}; 252 253/* 254 * LDOs 1, 20, 21, 3 255 */ 256static struct regulator_ops max77802_ldo_ops_logic2 = { 257 .list_voltage = regulator_list_voltage_linear, 258 .map_voltage = regulator_map_voltage_linear, 259 .is_enabled = regulator_is_enabled_regmap, 260 .enable = max77802_enable, 261 .disable = regulator_disable_regmap, 262 .get_voltage_sel = regulator_get_voltage_sel_regmap, 263 .set_voltage_sel = regulator_set_voltage_sel_regmap, 264 .set_voltage_time_sel = regulator_set_voltage_time_sel, 265 .set_suspend_mode = max77802_ldo_set_suspend_mode_logic2, 266}; 267 268/* BUCKS 1, 6 */ 269static struct regulator_ops max77802_buck_16_dvs_ops = { 270 .list_voltage = regulator_list_voltage_linear, 271 .map_voltage = regulator_map_voltage_linear, 272 .is_enabled = regulator_is_enabled_regmap, 273 .enable = max77802_enable, 274 .disable = regulator_disable_regmap, 275 .get_voltage_sel = regulator_get_voltage_sel_regmap, 276 .set_voltage_sel = regulator_set_voltage_sel_regmap, 277 .set_voltage_time_sel = regulator_set_voltage_time_sel, 278 .set_ramp_delay = max77802_set_ramp_delay_4bit, 279 .set_suspend_disable = max77802_buck_set_suspend_disable, 280}; 281 282/* BUCKs 2-4, 5, 7-10 */ 283static struct regulator_ops max77802_buck_dvs_ops = { 284 .list_voltage = regulator_list_voltage_linear, 285 .map_voltage = regulator_map_voltage_linear, 286 .is_enabled = regulator_is_enabled_regmap, 287 .enable = max77802_enable, 288 .disable = regulator_disable_regmap, 289 .get_voltage_sel = regulator_get_voltage_sel_regmap, 290 .set_voltage_sel = regulator_set_voltage_sel_regmap, 291 .set_voltage_time_sel = regulator_set_voltage_time_sel, 292 .set_ramp_delay = max77802_set_ramp_delay_2bit, 293 .set_suspend_disable = max77802_buck_set_suspend_disable, 294}; 295 296/* LDOs 3-7, 9-14, 18-26, 28, 29, 32-34 */ 297#define regulator_77802_desc_p_ldo(num, supply, log) { \ 298 .name = "LDO"#num, \ 299 .id = MAX77802_LDO##num, \ 300 .supply_name = "inl"#supply, \ 301 .ops = &max77802_ldo_ops_logic##log, \ 302 .type = REGULATOR_VOLTAGE, \ 303 .owner = THIS_MODULE, \ 304 .min_uV = 800000, \ 305 .uV_step = 50000, \ 306 .ramp_delay = MAX77802_RAMP_DELAY, \ 307 .n_voltages = 1 << 6, \ 308 .vsel_reg = MAX77802_REG_LDO1CTRL1 + num - 1, \ 309 .vsel_mask = MAX77802_VSEL_MASK, \ 310 .enable_reg = MAX77802_REG_LDO1CTRL1 + num - 1, \ 311 .enable_mask = MAX77802_OPMODE_MASK << MAX77802_OPMODE_SHIFT_LDO, \ 312} 313 314/* LDOs 1, 2, 8, 15, 17, 27, 30, 35 */ 315#define regulator_77802_desc_n_ldo(num, supply, log) { \ 316 .name = "LDO"#num, \ 317 .id = MAX77802_LDO##num, \ 318 .supply_name = "inl"#supply, \ 319 .ops = &max77802_ldo_ops_logic##log, \ 320 .type = REGULATOR_VOLTAGE, \ 321 .owner = THIS_MODULE, \ 322 .min_uV = 800000, \ 323 .uV_step = 25000, \ 324 .ramp_delay = MAX77802_RAMP_DELAY, \ 325 .n_voltages = 1 << 6, \ 326 .vsel_reg = MAX77802_REG_LDO1CTRL1 + num - 1, \ 327 .vsel_mask = MAX77802_VSEL_MASK, \ 328 .enable_reg = MAX77802_REG_LDO1CTRL1 + num - 1, \ 329 .enable_mask = MAX77802_OPMODE_MASK << MAX77802_OPMODE_SHIFT_LDO, \ 330} 331 332/* BUCKs 1, 6 */ 333#define regulator_77802_desc_16_buck(num) { \ 334 .name = "BUCK"#num, \ 335 .id = MAX77802_BUCK##num, \ 336 .supply_name = "inb"#num, \ 337 .ops = &max77802_buck_16_dvs_ops, \ 338 .type = REGULATOR_VOLTAGE, \ 339 .owner = THIS_MODULE, \ 340 .min_uV = 612500, \ 341 .uV_step = 6250, \ 342 .ramp_delay = MAX77802_RAMP_DELAY, \ 343 .n_voltages = 1 << 8, \ 344 .vsel_reg = MAX77802_REG_BUCK ## num ## DVS1, \ 345 .vsel_mask = MAX77802_DVS_VSEL_MASK, \ 346 .enable_reg = MAX77802_REG_BUCK ## num ## CTRL, \ 347 .enable_mask = MAX77802_OPMODE_MASK, \ 348} 349 350/* BUCKS 2-4 */ 351#define regulator_77802_desc_234_buck(num) { \ 352 .name = "BUCK"#num, \ 353 .id = MAX77802_BUCK##num, \ 354 .supply_name = "inb"#num, \ 355 .ops = &max77802_buck_dvs_ops, \ 356 .type = REGULATOR_VOLTAGE, \ 357 .owner = THIS_MODULE, \ 358 .min_uV = 600000, \ 359 .uV_step = 6250, \ 360 .ramp_delay = MAX77802_RAMP_DELAY, \ 361 .n_voltages = 0x91, \ 362 .vsel_reg = MAX77802_REG_BUCK ## num ## DVS1, \ 363 .vsel_mask = MAX77802_DVS_VSEL_MASK, \ 364 .enable_reg = MAX77802_REG_BUCK ## num ## CTRL1, \ 365 .enable_mask = MAX77802_OPMODE_MASK << \ 366 MAX77802_OPMODE_BUCK234_SHIFT, \ 367} 368 369/* BUCK 5 */ 370#define regulator_77802_desc_buck5(num) { \ 371 .name = "BUCK"#num, \ 372 .id = MAX77802_BUCK##num, \ 373 .supply_name = "inb"#num, \ 374 .ops = &max77802_buck_dvs_ops, \ 375 .type = REGULATOR_VOLTAGE, \ 376 .owner = THIS_MODULE, \ 377 .min_uV = 750000, \ 378 .uV_step = 50000, \ 379 .ramp_delay = MAX77802_RAMP_DELAY, \ 380 .n_voltages = 1 << 6, \ 381 .vsel_reg = MAX77802_REG_BUCK5OUT, \ 382 .vsel_mask = MAX77802_VSEL_MASK, \ 383 .enable_reg = MAX77802_REG_BUCK5CTRL, \ 384 .enable_mask = MAX77802_OPMODE_MASK, \ 385} 386 387/* BUCKs 7-10 */ 388#define regulator_77802_desc_buck7_10(num) { \ 389 .name = "BUCK"#num, \ 390 .id = MAX77802_BUCK##num, \ 391 .supply_name = "inb"#num, \ 392 .ops = &max77802_buck_dvs_ops, \ 393 .type = REGULATOR_VOLTAGE, \ 394 .owner = THIS_MODULE, \ 395 .min_uV = 750000, \ 396 .uV_step = 50000, \ 397 .ramp_delay = MAX77802_RAMP_DELAY, \ 398 .n_voltages = 1 << 6, \ 399 .vsel_reg = MAX77802_REG_BUCK7OUT + (num - 7) * 3, \ 400 .vsel_mask = MAX77802_VSEL_MASK, \ 401 .enable_reg = MAX77802_REG_BUCK7CTRL + (num - 7) * 3, \ 402 .enable_mask = MAX77802_OPMODE_MASK, \ 403} 404 405static struct regulator_desc regulators[] = { 406 regulator_77802_desc_16_buck(1), 407 regulator_77802_desc_234_buck(2), 408 regulator_77802_desc_234_buck(3), 409 regulator_77802_desc_234_buck(4), 410 regulator_77802_desc_buck5(5), 411 regulator_77802_desc_16_buck(6), 412 regulator_77802_desc_buck7_10(7), 413 regulator_77802_desc_buck7_10(8), 414 regulator_77802_desc_buck7_10(9), 415 regulator_77802_desc_buck7_10(10), 416 regulator_77802_desc_n_ldo(1, 10, 2), 417 regulator_77802_desc_n_ldo(2, 10, 1), 418 regulator_77802_desc_p_ldo(3, 3, 2), 419 regulator_77802_desc_p_ldo(4, 6, 1), 420 regulator_77802_desc_p_ldo(5, 3, 1), 421 regulator_77802_desc_p_ldo(6, 3, 1), 422 regulator_77802_desc_p_ldo(7, 3, 1), 423 regulator_77802_desc_n_ldo(8, 1, 1), 424 regulator_77802_desc_p_ldo(9, 5, 1), 425 regulator_77802_desc_p_ldo(10, 4, 1), 426 regulator_77802_desc_p_ldo(11, 4, 1), 427 regulator_77802_desc_p_ldo(12, 9, 1), 428 regulator_77802_desc_p_ldo(13, 4, 1), 429 regulator_77802_desc_p_ldo(14, 4, 1), 430 regulator_77802_desc_n_ldo(15, 1, 1), 431 regulator_77802_desc_n_ldo(17, 2, 1), 432 regulator_77802_desc_p_ldo(18, 7, 1), 433 regulator_77802_desc_p_ldo(19, 5, 1), 434 regulator_77802_desc_p_ldo(20, 7, 2), 435 regulator_77802_desc_p_ldo(21, 6, 2), 436 regulator_77802_desc_p_ldo(23, 9, 1), 437 regulator_77802_desc_p_ldo(24, 6, 1), 438 regulator_77802_desc_p_ldo(25, 9, 1), 439 regulator_77802_desc_p_ldo(26, 9, 1), 440 regulator_77802_desc_n_ldo(27, 2, 1), 441 regulator_77802_desc_p_ldo(28, 7, 1), 442 regulator_77802_desc_p_ldo(29, 7, 1), 443 regulator_77802_desc_n_ldo(30, 2, 1), 444 regulator_77802_desc_p_ldo(32, 9, 1), 445 regulator_77802_desc_p_ldo(33, 6, 1), 446 regulator_77802_desc_p_ldo(34, 9, 1), 447 regulator_77802_desc_n_ldo(35, 2, 1), 448}; 449 450#ifdef CONFIG_OF 451static int max77802_pmic_dt_parse_pdata(struct platform_device *pdev, 452 struct max77686_platform_data *pdata) 453{ 454 struct max77686_dev *iodev = dev_get_drvdata(pdev->dev.parent); 455 struct device_node *pmic_np, *regulators_np; 456 struct max77686_regulator_data *rdata; 457 struct of_regulator_match rmatch = { }; 458 unsigned int i; 459 460 pmic_np = iodev->dev->of_node; 461 regulators_np = of_get_child_by_name(pmic_np, "regulators"); 462 if (!regulators_np) { 463 dev_err(&pdev->dev, "could not find regulators sub-node\n"); 464 return -EINVAL; 465 } 466 467 pdata->num_regulators = ARRAY_SIZE(regulators); 468 rdata = devm_kzalloc(&pdev->dev, sizeof(*rdata) * 469 pdata->num_regulators, GFP_KERNEL); 470 if (!rdata) { 471 of_node_put(regulators_np); 472 return -ENOMEM; 473 } 474 475 for (i = 0; i < pdata->num_regulators; i++) { 476 rmatch.name = regulators[i].name; 477 rmatch.init_data = NULL; 478 rmatch.of_node = NULL; 479 if (of_regulator_match(&pdev->dev, regulators_np, &rmatch, 480 1) != 1) { 481 dev_warn(&pdev->dev, "No matching regulator for '%s'\n", 482 rmatch.name); 483 continue; 484 } 485 rdata[i].initdata = rmatch.init_data; 486 rdata[i].of_node = rmatch.of_node; 487 rdata[i].id = regulators[i].id; 488 } 489 490 pdata->regulators = rdata; 491 of_node_put(regulators_np); 492 493 return 0; 494} 495#else 496static int max77802_pmic_dt_parse_pdata(struct platform_device *pdev, 497 struct max77686_platform_data *pdata) 498{ 499 return 0; 500} 501#endif /* CONFIG_OF */ 502 503static int max77802_pmic_probe(struct platform_device *pdev) 504{ 505 struct max77686_dev *iodev = dev_get_drvdata(pdev->dev.parent); 506 struct max77686_platform_data *pdata = dev_get_platdata(iodev->dev); 507 struct max77802_regulator_prv *max77802; 508 int i, ret = 0, val; 509 struct regulator_config config = { }; 510 511 /* This is allocated by the MFD driver */ 512 if (!pdata) { 513 dev_err(&pdev->dev, "no platform data found for regulator\n"); 514 return -ENODEV; 515 } 516 517 max77802 = devm_kzalloc(&pdev->dev, 518 sizeof(struct max77802_regulator_prv), 519 GFP_KERNEL); 520 if (!max77802) 521 return -ENOMEM; 522 523 if (iodev->dev->of_node) { 524 ret = max77802_pmic_dt_parse_pdata(pdev, pdata); 525 if (ret) 526 return ret; 527 } 528 529 config.dev = iodev->dev; 530 config.regmap = iodev->regmap; 531 config.driver_data = max77802; 532 platform_set_drvdata(pdev, max77802); 533 534 for (i = 0; i < MAX77802_REG_MAX; i++) { 535 struct regulator_dev *rdev; 536 int id = pdata->regulators[i].id; 537 int shift = max77802_get_opmode_shift(id); 538 539 config.init_data = pdata->regulators[i].initdata; 540 config.of_node = pdata->regulators[i].of_node; 541 542 ret = regmap_read(iodev->regmap, regulators[i].enable_reg, &val); 543 val = val >> shift & MAX77802_OPMODE_MASK; 544 545 /* 546 * If the regulator is disabled and the system warm rebooted, 547 * the hardware reports OFF as the regulator operating mode. 548 * Default to operating mode NORMAL in that case. 549 */ 550 if (val == MAX77802_OPMODE_OFF) 551 max77802->opmode[id] = MAX77802_OPMODE_NORMAL; 552 else 553 max77802->opmode[id] = val; 554 555 rdev = devm_regulator_register(&pdev->dev, 556 ®ulators[i], &config); 557 if (IS_ERR(rdev)) { 558 dev_err(&pdev->dev, 559 "regulator init failed for %d\n", i); 560 return PTR_ERR(rdev); 561 } 562 } 563 564 return 0; 565} 566 567static const struct platform_device_id max77802_pmic_id[] = { 568 {"max77802-pmic", 0}, 569 { }, 570}; 571MODULE_DEVICE_TABLE(platform, max77802_pmic_id); 572 573static struct platform_driver max77802_pmic_driver = { 574 .driver = { 575 .name = "max77802-pmic", 576 .owner = THIS_MODULE, 577 }, 578 .probe = max77802_pmic_probe, 579 .id_table = max77802_pmic_id, 580}; 581 582module_platform_driver(max77802_pmic_driver); 583 584MODULE_DESCRIPTION("MAXIM 77802 Regulator Driver"); 585MODULE_AUTHOR("Simon Glass <sjg@chromium.org>"); 586MODULE_LICENSE("GPL"); 587