1 /* 2 * Copyright (C) 2012-2015 Samsung Electronics 3 * 4 * Rajeshwari Shinde <rajeshwari.s@samsung.com> 5 * Przemyslaw Marczak <p.marczak@samsung.com> 6 * 7 * SPDX-License-Identifier: GPL-2.0+ 8 */ 9 10 #include <common.h> 11 #include <fdtdec.h> 12 #include <errno.h> 13 #include <dm.h> 14 #include <i2c.h> 15 #include <power/pmic.h> 16 #include <power/regulator.h> 17 #include <power/max77686_pmic.h> 18 19 DECLARE_GLOBAL_DATA_PTR; 20 21 #define MODE(_id, _val, _name) { \ 22 .id = _id, \ 23 .register_value = _val, \ 24 .name = _name, \ 25 } 26 27 /* LDO: 1,3,4,5,9,17,18,19,20,21,22,23,24,26,26,27 */ 28 static struct dm_regulator_mode max77686_ldo_mode_standby1[] = { 29 MODE(OPMODE_OFF, MAX77686_LDO_MODE_OFF, "OFF"), 30 MODE(OPMODE_LPM, MAX77686_LDO_MODE_LPM, "LPM"), 31 MODE(OPMODE_STANDBY_LPM, MAX77686_LDO_MODE_STANDBY_LPM, "ON/LPM"), 32 MODE(OPMODE_ON, MAX77686_LDO_MODE_ON, "ON"), 33 }; 34 35 /* LDO: 2,6,7,8,10,11,12,14,15,16 */ 36 static struct dm_regulator_mode max77686_ldo_mode_standby2[] = { 37 MODE(OPMODE_OFF, MAX77686_LDO_MODE_OFF, "OFF"), 38 MODE(OPMODE_STANDBY, MAX77686_LDO_MODE_STANDBY, "ON/OFF"), 39 MODE(OPMODE_STANDBY_LPM, MAX77686_LDO_MODE_STANDBY_LPM, "ON/LPM"), 40 MODE(OPMODE_ON, MAX77686_LDO_MODE_ON, "ON"), 41 }; 42 43 /* Buck: 1 */ 44 static struct dm_regulator_mode max77686_buck_mode_standby[] = { 45 MODE(OPMODE_OFF, MAX77686_BUCK_MODE_OFF, "OFF"), 46 MODE(OPMODE_STANDBY, MAX77686_BUCK_MODE_STANDBY, "ON/OFF"), 47 MODE(OPMODE_ON, MAX77686_BUCK_MODE_ON, "ON"), 48 }; 49 50 /* Buck: 2,3,4 */ 51 static struct dm_regulator_mode max77686_buck_mode_lpm[] = { 52 MODE(OPMODE_OFF, MAX77686_BUCK_MODE_OFF, "OFF"), 53 MODE(OPMODE_STANDBY, MAX77686_BUCK_MODE_STANDBY, "ON/OFF"), 54 MODE(OPMODE_LPM, MAX77686_BUCK_MODE_LPM, "LPM"), 55 MODE(OPMODE_ON, MAX77686_BUCK_MODE_ON, "ON"), 56 }; 57 58 /* Buck: 5,6,7,8,9 */ 59 static struct dm_regulator_mode max77686_buck_mode_onoff[] = { 60 MODE(OPMODE_OFF, MAX77686_BUCK_MODE_OFF, "OFF"), 61 MODE(OPMODE_ON, MAX77686_BUCK_MODE_ON, "ON"), 62 }; 63 64 static const char max77686_buck_ctrl[] = { 65 0xff, 0x10, 0x12, 0x1c, 0x26, 0x30, 0x32, 0x34, 0x36, 0x38 66 }; 67 68 static const char max77686_buck_out[] = { 69 0xff, 0x11, 0x14, 0x1e, 0x28, 0x31, 0x33, 0x35, 0x37, 0x39 70 }; 71 72 static int max77686_buck_volt2hex(int buck, int uV) 73 { 74 int hex = 0; 75 int hex_max = 0; 76 77 switch (buck) { 78 case 2: 79 case 3: 80 case 4: 81 /* hex = (uV - 600000) / 12500; */ 82 hex = (uV - MAX77686_BUCK_UV_LMIN) / MAX77686_BUCK_UV_LSTEP; 83 hex_max = MAX77686_BUCK234_VOLT_MAX_HEX; 84 break; 85 default: 86 /* 87 * hex = (uV - 750000) / 50000. We assume that dynamic voltage 88 * scaling via GPIOs is not enabled and don't support that. 89 * If this is enabled then the driver will need to take that 90 * into account and check different registers depending on 91 * the current setting. See the datasheet for details. 92 */ 93 hex = (uV - MAX77686_BUCK_UV_HMIN) / MAX77686_BUCK_UV_HSTEP; 94 hex_max = MAX77686_BUCK_VOLT_MAX_HEX; 95 break; 96 } 97 98 if (hex >= 0 && hex <= hex_max) 99 return hex; 100 101 error("Value: %d uV is wrong for BUCK%d", uV, buck); 102 return -EINVAL; 103 } 104 105 static int max77686_buck_hex2volt(int buck, int hex) 106 { 107 unsigned uV = 0; 108 int hex_max = 0; 109 110 if (hex < 0) 111 goto bad_hex; 112 113 switch (buck) { 114 case 2: 115 case 3: 116 case 4: 117 hex_max = MAX77686_BUCK234_VOLT_MAX_HEX; 118 if (hex > hex_max) 119 goto bad_hex; 120 121 /* uV = hex * 12500 + 600000; */ 122 uV = hex * MAX77686_BUCK_UV_LSTEP + MAX77686_BUCK_UV_LMIN; 123 break; 124 default: 125 hex_max = MAX77686_BUCK_VOLT_MAX_HEX; 126 if (hex > hex_max) 127 goto bad_hex; 128 129 /* uV = hex * 50000 + 750000; */ 130 uV = hex * MAX77686_BUCK_UV_HSTEP + MAX77686_BUCK_UV_HMIN; 131 break; 132 } 133 134 return uV; 135 136 bad_hex: 137 error("Value: %#x is wrong for BUCK%d", hex, buck); 138 return -EINVAL; 139 } 140 141 static int max77686_ldo_volt2hex(int ldo, int uV) 142 { 143 int hex = 0; 144 145 switch (ldo) { 146 case 1: 147 case 2: 148 case 6: 149 case 7: 150 case 8: 151 case 15: 152 hex = (uV - MAX77686_LDO_UV_MIN) / MAX77686_LDO_UV_LSTEP; 153 /* hex = (uV - 800000) / 25000; */ 154 break; 155 default: 156 hex = (uV - MAX77686_LDO_UV_MIN) / MAX77686_LDO_UV_HSTEP; 157 /* hex = (uV - 800000) / 50000; */ 158 } 159 160 if (hex >= 0 && hex <= MAX77686_LDO_VOLT_MAX_HEX) 161 return hex; 162 163 error("Value: %d uV is wrong for LDO%d", uV, ldo); 164 return -EINVAL; 165 } 166 167 static int max77686_ldo_hex2volt(int ldo, int hex) 168 { 169 unsigned int uV = 0; 170 171 if (hex > MAX77686_LDO_VOLT_MAX_HEX) 172 goto bad_hex; 173 174 switch (ldo) { 175 case 1: 176 case 2: 177 case 6: 178 case 7: 179 case 8: 180 case 15: 181 /* uV = hex * 25000 + 800000; */ 182 uV = hex * MAX77686_LDO_UV_LSTEP + MAX77686_LDO_UV_MIN; 183 break; 184 default: 185 /* uV = hex * 50000 + 800000; */ 186 uV = hex * MAX77686_LDO_UV_HSTEP + MAX77686_LDO_UV_MIN; 187 } 188 189 return uV; 190 191 bad_hex: 192 error("Value: %#x is wrong for ldo%d", hex, ldo); 193 return -EINVAL; 194 } 195 196 static int max77686_ldo_hex2mode(int ldo, int hex) 197 { 198 if (hex > MAX77686_LDO_MODE_MASK) 199 return -EINVAL; 200 201 switch (hex) { 202 case MAX77686_LDO_MODE_OFF: 203 return OPMODE_OFF; 204 case MAX77686_LDO_MODE_LPM: /* == MAX77686_LDO_MODE_STANDBY: */ 205 /* The same mode values but different meaning for each ldo */ 206 switch (ldo) { 207 case 2: 208 case 6: 209 case 7: 210 case 8: 211 case 10: 212 case 11: 213 case 12: 214 case 14: 215 case 15: 216 case 16: 217 return OPMODE_STANDBY; 218 default: 219 return OPMODE_LPM; 220 } 221 case MAX77686_LDO_MODE_STANDBY_LPM: 222 return OPMODE_STANDBY_LPM; 223 case MAX77686_LDO_MODE_ON: 224 return OPMODE_ON; 225 default: 226 return -EINVAL; 227 } 228 } 229 230 static int max77686_buck_hex2mode(int buck, int hex) 231 { 232 if (hex > MAX77686_BUCK_MODE_MASK) 233 return -EINVAL; 234 235 switch (hex) { 236 case MAX77686_BUCK_MODE_OFF: 237 return OPMODE_OFF; 238 case MAX77686_BUCK_MODE_ON: 239 return OPMODE_ON; 240 case MAX77686_BUCK_MODE_STANDBY: 241 switch (buck) { 242 case 1: 243 case 2: 244 case 3: 245 case 4: 246 return OPMODE_STANDBY; 247 default: 248 return -EINVAL; 249 } 250 case MAX77686_BUCK_MODE_LPM: 251 switch (buck) { 252 case 2: 253 case 3: 254 case 4: 255 return OPMODE_LPM; 256 default: 257 return -EINVAL; 258 } 259 default: 260 return -EINVAL; 261 } 262 } 263 264 static int max77686_buck_modes(int buck, struct dm_regulator_mode **modesp) 265 { 266 int ret = -EINVAL; 267 268 if (buck < 1 || buck > MAX77686_BUCK_NUM) 269 return ret; 270 271 switch (buck) { 272 case 1: 273 *modesp = max77686_buck_mode_standby; 274 ret = ARRAY_SIZE(max77686_buck_mode_standby); 275 break; 276 case 2: 277 case 3: 278 case 4: 279 *modesp = max77686_buck_mode_lpm; 280 ret = ARRAY_SIZE(max77686_buck_mode_lpm); 281 break; 282 default: 283 *modesp = max77686_buck_mode_onoff; 284 ret = ARRAY_SIZE(max77686_buck_mode_onoff); 285 } 286 287 return ret; 288 } 289 290 static int max77686_ldo_modes(int ldo, struct dm_regulator_mode **modesp, 291 struct udevice *dev) 292 { 293 int ret = -EINVAL; 294 295 if (ldo < 1 || ldo > MAX77686_LDO_NUM) 296 return ret; 297 298 switch (ldo) { 299 case 2: 300 case 6: 301 case 7: 302 case 8: 303 case 10: 304 case 11: 305 case 12: 306 case 14: 307 case 15: 308 case 16: 309 *modesp = max77686_ldo_mode_standby2; 310 ret = ARRAY_SIZE(max77686_ldo_mode_standby2); 311 break; 312 default: 313 *modesp = max77686_ldo_mode_standby1; 314 ret = ARRAY_SIZE(max77686_ldo_mode_standby1); 315 } 316 317 return ret; 318 } 319 320 static int max77686_ldo_val(struct udevice *dev, int op, int *uV) 321 { 322 unsigned int adr; 323 unsigned char val; 324 int hex, ldo, ret; 325 326 if (op == PMIC_OP_GET) 327 *uV = 0; 328 329 ldo = dev->driver_data; 330 if (ldo < 1 || ldo > MAX77686_LDO_NUM) { 331 error("Wrong ldo number: %d", ldo); 332 return -EINVAL; 333 } 334 335 adr = MAX77686_REG_PMIC_LDO1CTRL1 + ldo - 1; 336 337 ret = pmic_read(dev->parent, adr, &val, 1); 338 if (ret) 339 return ret; 340 341 if (op == PMIC_OP_GET) { 342 val &= MAX77686_LDO_VOLT_MASK; 343 ret = max77686_ldo_hex2volt(ldo, val); 344 if (ret < 0) 345 return ret; 346 *uV = ret; 347 return 0; 348 } 349 350 hex = max77686_ldo_volt2hex(ldo, *uV); 351 if (hex < 0) 352 return hex; 353 354 val &= ~MAX77686_LDO_VOLT_MASK; 355 val |= hex; 356 ret = pmic_write(dev->parent, adr, &val, 1); 357 358 return ret; 359 } 360 361 static int max77686_buck_val(struct udevice *dev, int op, int *uV) 362 { 363 unsigned int mask, adr; 364 unsigned char val; 365 int hex, buck, ret; 366 367 buck = dev->driver_data; 368 if (buck < 1 || buck > MAX77686_BUCK_NUM) { 369 error("Wrong buck number: %d", buck); 370 return -EINVAL; 371 } 372 373 if (op == PMIC_OP_GET) 374 *uV = 0; 375 376 /* &buck_out = ctrl + 1 */ 377 adr = max77686_buck_out[buck]; 378 379 /* mask */ 380 switch (buck) { 381 case 2: 382 case 3: 383 case 4: 384 mask = MAX77686_BUCK234_VOLT_MASK; 385 break; 386 default: 387 mask = MAX77686_BUCK_VOLT_MASK; 388 break; 389 } 390 391 ret = pmic_read(dev->parent, adr, &val, 1); 392 if (ret) 393 return ret; 394 395 if (op == PMIC_OP_GET) { 396 val &= mask; 397 ret = max77686_buck_hex2volt(buck, val); 398 if (ret < 0) 399 return ret; 400 *uV = ret; 401 return 0; 402 } 403 404 hex = max77686_buck_volt2hex(buck, *uV); 405 if (hex < 0) 406 return hex; 407 408 val &= ~mask; 409 val |= hex; 410 ret = pmic_write(dev->parent, adr, &val, 1); 411 412 return ret; 413 } 414 415 static int max77686_ldo_mode(struct udevice *dev, int op, int *opmode) 416 { 417 unsigned int adr, mode; 418 unsigned char val; 419 int ldo, ret; 420 421 if (op == PMIC_OP_GET) 422 *opmode = -EINVAL; 423 424 ldo = dev->driver_data; 425 if (ldo < 1 || ldo > MAX77686_LDO_NUM) { 426 error("Wrong ldo number: %d", ldo); 427 return -EINVAL; 428 } 429 430 adr = MAX77686_REG_PMIC_LDO1CTRL1 + ldo - 1; 431 432 ret = pmic_read(dev->parent, adr, &val, 1); 433 if (ret) 434 return ret; 435 436 if (op == PMIC_OP_GET) { 437 val &= MAX77686_LDO_MODE_MASK; 438 ret = max77686_ldo_hex2mode(ldo, val); 439 if (ret < 0) 440 return ret; 441 *opmode = ret; 442 return 0; 443 } 444 445 /* mode */ 446 switch (*opmode) { 447 case OPMODE_OFF: 448 mode = MAX77686_LDO_MODE_OFF; 449 break; 450 case OPMODE_LPM: 451 switch (ldo) { 452 case 2: 453 case 6: 454 case 7: 455 case 8: 456 case 10: 457 case 11: 458 case 12: 459 case 14: 460 case 15: 461 case 16: 462 return -EINVAL; 463 default: 464 mode = MAX77686_LDO_MODE_LPM; 465 } 466 break; 467 case OPMODE_STANDBY: 468 switch (ldo) { 469 case 2: 470 case 6: 471 case 7: 472 case 8: 473 case 10: 474 case 11: 475 case 12: 476 case 14: 477 case 15: 478 case 16: 479 mode = MAX77686_LDO_MODE_STANDBY; 480 break; 481 default: 482 return -EINVAL; 483 } 484 break; 485 case OPMODE_STANDBY_LPM: 486 mode = MAX77686_LDO_MODE_STANDBY_LPM; 487 break; 488 case OPMODE_ON: 489 mode = MAX77686_LDO_MODE_ON; 490 break; 491 default: 492 mode = 0xff; 493 } 494 495 if (mode == 0xff) { 496 error("Wrong mode: %d for ldo%d", *opmode, ldo); 497 return -EINVAL; 498 } 499 500 val &= ~MAX77686_LDO_MODE_MASK; 501 val |= mode; 502 ret = pmic_write(dev->parent, adr, &val, 1); 503 504 return ret; 505 } 506 507 static int max77686_ldo_enable(struct udevice *dev, int op, bool *enable) 508 { 509 int ret, on_off; 510 511 if (op == PMIC_OP_GET) { 512 ret = max77686_ldo_mode(dev, op, &on_off); 513 if (ret) 514 return ret; 515 516 switch (on_off) { 517 case OPMODE_OFF: 518 *enable = false; 519 break; 520 case OPMODE_ON: 521 *enable = true; 522 break; 523 default: 524 return -EINVAL; 525 } 526 } else if (op == PMIC_OP_SET) { 527 if (*enable) 528 on_off = OPMODE_ON; 529 else 530 on_off = OPMODE_OFF; 531 532 ret = max77686_ldo_mode(dev, op, &on_off); 533 if (ret) 534 return ret; 535 } 536 537 return 0; 538 } 539 540 static int max77686_buck_mode(struct udevice *dev, int op, int *opmode) 541 { 542 unsigned int mask, adr, mode, mode_shift; 543 unsigned char val; 544 int buck, ret; 545 546 buck = dev->driver_data; 547 if (buck < 1 || buck > MAX77686_BUCK_NUM) { 548 error("Wrong buck number: %d", buck); 549 return -EINVAL; 550 } 551 552 adr = max77686_buck_ctrl[buck]; 553 554 /* mask */ 555 switch (buck) { 556 case 2: 557 case 3: 558 case 4: 559 mode_shift = MAX77686_BUCK_MODE_SHIFT_2; 560 break; 561 default: 562 mode_shift = MAX77686_BUCK_MODE_SHIFT_1; 563 } 564 565 mask = MAX77686_BUCK_MODE_MASK << mode_shift; 566 567 ret = pmic_read(dev->parent, adr, &val, 1); 568 if (ret) 569 return ret; 570 571 if (op == PMIC_OP_GET) { 572 val &= mask; 573 val >>= mode_shift; 574 ret = max77686_buck_hex2mode(buck, val); 575 if (ret < 0) 576 return ret; 577 *opmode = ret; 578 return 0; 579 } 580 581 /* mode */ 582 switch (*opmode) { 583 case OPMODE_OFF: 584 mode = MAX77686_BUCK_MODE_OFF; 585 break; 586 case OPMODE_STANDBY: 587 switch (buck) { 588 case 1: 589 case 2: 590 case 3: 591 case 4: 592 mode = MAX77686_BUCK_MODE_STANDBY << mode_shift; 593 break; 594 default: 595 mode = 0xff; 596 } 597 break; 598 case OPMODE_LPM: 599 switch (buck) { 600 case 2: 601 case 3: 602 case 4: 603 mode = MAX77686_BUCK_MODE_LPM << mode_shift; 604 break; 605 default: 606 mode = 0xff; 607 } 608 break; 609 case OPMODE_ON: 610 mode = MAX77686_BUCK_MODE_ON << mode_shift; 611 break; 612 default: 613 mode = 0xff; 614 } 615 616 if (mode == 0xff) { 617 error("Wrong mode: %d for buck: %d\n", *opmode, buck); 618 return -EINVAL; 619 } 620 621 val &= ~mask; 622 val |= mode; 623 ret = pmic_write(dev->parent, adr, &val, 1); 624 625 return ret; 626 } 627 628 static int max77686_buck_enable(struct udevice *dev, int op, bool *enable) 629 { 630 int ret, on_off; 631 632 if (op == PMIC_OP_GET) { 633 ret = max77686_buck_mode(dev, op, &on_off); 634 if (ret) 635 return ret; 636 637 switch (on_off) { 638 case OPMODE_OFF: 639 *enable = false; 640 break; 641 case OPMODE_ON: 642 *enable = true; 643 break; 644 default: 645 return -EINVAL; 646 } 647 } else if (op == PMIC_OP_SET) { 648 if (*enable) 649 on_off = OPMODE_ON; 650 else 651 on_off = OPMODE_OFF; 652 653 ret = max77686_buck_mode(dev, op, &on_off); 654 if (ret) 655 return ret; 656 } 657 658 return 0; 659 } 660 661 static int max77686_ldo_probe(struct udevice *dev) 662 { 663 struct dm_regulator_uclass_platdata *uc_pdata; 664 665 uc_pdata = dev_get_uclass_platdata(dev); 666 667 uc_pdata->type = REGULATOR_TYPE_LDO; 668 uc_pdata->mode_count = max77686_ldo_modes(dev->driver_data, 669 &uc_pdata->mode, dev); 670 671 return 0; 672 } 673 674 static int ldo_get_value(struct udevice *dev) 675 { 676 int uV; 677 int ret; 678 679 ret = max77686_ldo_val(dev, PMIC_OP_GET, &uV); 680 if (ret) 681 return ret; 682 683 return uV; 684 } 685 686 static int ldo_set_value(struct udevice *dev, int uV) 687 { 688 return max77686_ldo_val(dev, PMIC_OP_SET, &uV); 689 } 690 691 static bool ldo_get_enable(struct udevice *dev) 692 { 693 bool enable = false; 694 int ret; 695 696 ret = max77686_ldo_enable(dev, PMIC_OP_GET, &enable); 697 if (ret) 698 return ret; 699 700 return enable; 701 } 702 703 static int ldo_set_enable(struct udevice *dev, bool enable) 704 { 705 return max77686_ldo_enable(dev, PMIC_OP_SET, &enable); 706 } 707 708 static int ldo_get_mode(struct udevice *dev) 709 { 710 int mode; 711 int ret; 712 713 ret = max77686_ldo_mode(dev, PMIC_OP_GET, &mode); 714 if (ret) 715 return ret; 716 717 return mode; 718 } 719 720 static int ldo_set_mode(struct udevice *dev, int mode) 721 { 722 return max77686_ldo_mode(dev, PMIC_OP_SET, &mode); 723 } 724 725 static int max77686_buck_probe(struct udevice *dev) 726 { 727 struct dm_regulator_uclass_platdata *uc_pdata; 728 729 uc_pdata = dev_get_uclass_platdata(dev); 730 731 uc_pdata->type = REGULATOR_TYPE_BUCK; 732 uc_pdata->mode_count = max77686_buck_modes(dev->driver_data, 733 &uc_pdata->mode); 734 735 return 0; 736 } 737 738 static int buck_get_value(struct udevice *dev) 739 { 740 int uV; 741 int ret; 742 743 ret = max77686_buck_val(dev, PMIC_OP_GET, &uV); 744 if (ret) 745 return ret; 746 747 return uV; 748 } 749 750 static int buck_set_value(struct udevice *dev, int uV) 751 { 752 return max77686_buck_val(dev, PMIC_OP_SET, &uV); 753 } 754 755 static bool buck_get_enable(struct udevice *dev) 756 { 757 bool enable = false; 758 int ret; 759 760 ret = max77686_buck_enable(dev, PMIC_OP_GET, &enable); 761 if (ret) 762 return ret; 763 764 return enable; 765 } 766 767 static int buck_set_enable(struct udevice *dev, bool enable) 768 { 769 return max77686_buck_enable(dev, PMIC_OP_SET, &enable); 770 } 771 772 static int buck_get_mode(struct udevice *dev) 773 { 774 int mode; 775 int ret; 776 777 ret = max77686_buck_mode(dev, PMIC_OP_GET, &mode); 778 if (ret) 779 return ret; 780 781 return mode; 782 } 783 784 static int buck_set_mode(struct udevice *dev, int mode) 785 { 786 return max77686_buck_mode(dev, PMIC_OP_SET, &mode); 787 } 788 789 static const struct dm_regulator_ops max77686_ldo_ops = { 790 .get_value = ldo_get_value, 791 .set_value = ldo_set_value, 792 .get_enable = ldo_get_enable, 793 .set_enable = ldo_set_enable, 794 .get_mode = ldo_get_mode, 795 .set_mode = ldo_set_mode, 796 }; 797 798 U_BOOT_DRIVER(max77686_ldo) = { 799 .name = MAX77686_LDO_DRIVER, 800 .id = UCLASS_REGULATOR, 801 .ops = &max77686_ldo_ops, 802 .probe = max77686_ldo_probe, 803 }; 804 805 static const struct dm_regulator_ops max77686_buck_ops = { 806 .get_value = buck_get_value, 807 .set_value = buck_set_value, 808 .get_enable = buck_get_enable, 809 .set_enable = buck_set_enable, 810 .get_mode = buck_get_mode, 811 .set_mode = buck_set_mode, 812 }; 813 814 U_BOOT_DRIVER(max77686_buck) = { 815 .name = MAX77686_BUCK_DRIVER, 816 .id = UCLASS_REGULATOR, 817 .ops = &max77686_buck_ops, 818 .probe = max77686_buck_probe, 819 }; 820