1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Copyright 2014 Freescale Semiconductor, Inc. 4 */ 5 6 #include <common.h> 7 #include <command.h> 8 #include <i2c.h> 9 #include <asm/io.h> 10 #ifdef CONFIG_FSL_LSCH2 11 #include <asm/arch/immap_lsch2.h> 12 #elif defined(CONFIG_FSL_LSCH3) 13 #include <asm/arch/immap_lsch3.h> 14 #else 15 #include <asm/immap_85xx.h> 16 #endif 17 #include "vid.h" 18 19 int __weak i2c_multiplexer_select_vid_channel(u8 channel) 20 { 21 return 0; 22 } 23 24 /* 25 * Compensate for a board specific voltage drop between regulator and SoC 26 * return a value in mV 27 */ 28 int __weak board_vdd_drop_compensation(void) 29 { 30 return 0; 31 } 32 33 /* 34 * Board specific settings for specific voltage value 35 */ 36 int __weak board_adjust_vdd(int vdd) 37 { 38 return 0; 39 } 40 41 #if defined(CONFIG_VOL_MONITOR_IR36021_SET) || \ 42 defined(CONFIG_VOL_MONITOR_IR36021_READ) 43 /* 44 * Get the i2c address configuration for the IR regulator chip 45 * 46 * There are some variance in the RDB HW regarding the I2C address configuration 47 * for the IR regulator chip, which is likely a problem of external resistor 48 * accuracy. So we just check each address in a hopefully non-intrusive mode 49 * and use the first one that seems to work 50 * 51 * The IR chip can show up under the following addresses: 52 * 0x08 (Verified on T1040RDB-PA,T4240RDB-PB,X-T4240RDB-16GPA) 53 * 0x09 (Verified on T1040RDB-PA) 54 * 0x38 (Verified on T2080QDS, T2081QDS, T4240RDB) 55 */ 56 static int find_ir_chip_on_i2c(void) 57 { 58 int i2caddress; 59 int ret; 60 u8 byte; 61 int i; 62 const int ir_i2c_addr[] = {0x38, 0x08, 0x09}; 63 64 /* Check all the address */ 65 for (i = 0; i < (sizeof(ir_i2c_addr)/sizeof(ir_i2c_addr[0])); i++) { 66 i2caddress = ir_i2c_addr[i]; 67 ret = i2c_read(i2caddress, 68 IR36021_MFR_ID_OFFSET, 1, (void *)&byte, 69 sizeof(byte)); 70 if ((ret >= 0) && (byte == IR36021_MFR_ID)) 71 return i2caddress; 72 } 73 return -1; 74 } 75 #endif 76 77 /* Maximum loop count waiting for new voltage to take effect */ 78 #define MAX_LOOP_WAIT_NEW_VOL 100 79 /* Maximum loop count waiting for the voltage to be stable */ 80 #define MAX_LOOP_WAIT_VOL_STABLE 100 81 /* 82 * read_voltage from sensor on I2C bus 83 * We use average of 4 readings, waiting for WAIT_FOR_ADC before 84 * another reading 85 */ 86 #define NUM_READINGS 4 /* prefer to be power of 2 for efficiency */ 87 88 /* If an INA220 chip is available, we can use it to read back the voltage 89 * as it may have a higher accuracy than the IR chip for the same purpose 90 */ 91 #ifdef CONFIG_VOL_MONITOR_INA220 92 #define WAIT_FOR_ADC 532 /* wait for 532 microseconds for ADC */ 93 #define ADC_MIN_ACCURACY 4 94 #else 95 #define WAIT_FOR_ADC 138 /* wait for 138 microseconds for ADC */ 96 #define ADC_MIN_ACCURACY 4 97 #endif 98 99 #ifdef CONFIG_VOL_MONITOR_INA220 100 static int read_voltage_from_INA220(int i2caddress) 101 { 102 int i, ret, voltage_read = 0; 103 u16 vol_mon; 104 u8 buf[2]; 105 106 for (i = 0; i < NUM_READINGS; i++) { 107 ret = i2c_read(I2C_VOL_MONITOR_ADDR, 108 I2C_VOL_MONITOR_BUS_V_OFFSET, 1, 109 (void *)&buf, 2); 110 if (ret) { 111 printf("VID: failed to read core voltage\n"); 112 return ret; 113 } 114 vol_mon = (buf[0] << 8) | buf[1]; 115 if (vol_mon & I2C_VOL_MONITOR_BUS_V_OVF) { 116 printf("VID: Core voltage sensor error\n"); 117 return -1; 118 } 119 debug("VID: bus voltage reads 0x%04x\n", vol_mon); 120 /* LSB = 4mv */ 121 voltage_read += (vol_mon >> I2C_VOL_MONITOR_BUS_V_SHIFT) * 4; 122 udelay(WAIT_FOR_ADC); 123 } 124 /* calculate the average */ 125 voltage_read /= NUM_READINGS; 126 127 return voltage_read; 128 } 129 #endif 130 131 /* read voltage from IR */ 132 #ifdef CONFIG_VOL_MONITOR_IR36021_READ 133 static int read_voltage_from_IR(int i2caddress) 134 { 135 int i, ret, voltage_read = 0; 136 u16 vol_mon; 137 u8 buf; 138 139 for (i = 0; i < NUM_READINGS; i++) { 140 ret = i2c_read(i2caddress, 141 IR36021_LOOP1_VOUT_OFFSET, 142 1, (void *)&buf, 1); 143 if (ret) { 144 printf("VID: failed to read vcpu\n"); 145 return ret; 146 } 147 vol_mon = buf; 148 if (!vol_mon) { 149 printf("VID: Core voltage sensor error\n"); 150 return -1; 151 } 152 debug("VID: bus voltage reads 0x%02x\n", vol_mon); 153 /* Resolution is 1/128V. We scale up here to get 1/128mV 154 * and divide at the end 155 */ 156 voltage_read += vol_mon * 1000; 157 udelay(WAIT_FOR_ADC); 158 } 159 /* Scale down to the real mV as IR resolution is 1/128V, rounding up */ 160 voltage_read = DIV_ROUND_UP(voltage_read, 128); 161 162 /* calculate the average */ 163 voltage_read /= NUM_READINGS; 164 165 /* Compensate for a board specific voltage drop between regulator and 166 * SoC before converting into an IR VID value 167 */ 168 voltage_read -= board_vdd_drop_compensation(); 169 170 return voltage_read; 171 } 172 #endif 173 174 #ifdef CONFIG_VOL_MONITOR_LTC3882_READ 175 /* read the current value of the LTC Regulator Voltage */ 176 static int read_voltage_from_LTC(int i2caddress) 177 { 178 int ret, vcode = 0; 179 u8 chan = PWM_CHANNEL0; 180 181 /* select the PAGE 0 using PMBus commands PAGE for VDD*/ 182 ret = i2c_write(I2C_VOL_MONITOR_ADDR, 183 PMBUS_CMD_PAGE, 1, &chan, 1); 184 if (ret) { 185 printf("VID: failed to select VDD Page 0\n"); 186 return ret; 187 } 188 189 /*read the output voltage using PMBus command READ_VOUT*/ 190 ret = i2c_read(I2C_VOL_MONITOR_ADDR, 191 PMBUS_CMD_READ_VOUT, 1, (void *)&vcode, 2); 192 if (ret) { 193 printf("VID: failed to read the volatge\n"); 194 return ret; 195 } 196 197 /* Scale down to the real mV as LTC resolution is 1/4096V,rounding up */ 198 vcode = DIV_ROUND_UP(vcode * 1000, 4096); 199 200 return vcode; 201 } 202 #endif 203 204 static int read_voltage(int i2caddress) 205 { 206 int voltage_read; 207 #ifdef CONFIG_VOL_MONITOR_INA220 208 voltage_read = read_voltage_from_INA220(i2caddress); 209 #elif defined CONFIG_VOL_MONITOR_IR36021_READ 210 voltage_read = read_voltage_from_IR(i2caddress); 211 #elif defined CONFIG_VOL_MONITOR_LTC3882_READ 212 voltage_read = read_voltage_from_LTC(i2caddress); 213 #else 214 return -1; 215 #endif 216 return voltage_read; 217 } 218 219 #ifdef CONFIG_VOL_MONITOR_IR36021_SET 220 /* 221 * We need to calculate how long before the voltage stops to drop 222 * or increase. It returns with the loop count. Each loop takes 223 * several readings (WAIT_FOR_ADC) 224 */ 225 static int wait_for_new_voltage(int vdd, int i2caddress) 226 { 227 int timeout, vdd_current; 228 229 vdd_current = read_voltage(i2caddress); 230 /* wait until voltage starts to reach the target. Voltage slew 231 * rates by typical regulators will always lead to stable readings 232 * within each fairly long ADC interval in comparison to the 233 * intended voltage delta change until the target voltage is 234 * reached. The fairly small voltage delta change to any target 235 * VID voltage also means that this function will always complete 236 * within few iterations. If the timeout was ever reached, it would 237 * point to a serious failure in the regulator system. 238 */ 239 for (timeout = 0; 240 abs(vdd - vdd_current) > (IR_VDD_STEP_UP + IR_VDD_STEP_DOWN) && 241 timeout < MAX_LOOP_WAIT_NEW_VOL; timeout++) { 242 vdd_current = read_voltage(i2caddress); 243 } 244 if (timeout >= MAX_LOOP_WAIT_NEW_VOL) { 245 printf("VID: Voltage adjustment timeout\n"); 246 return -1; 247 } 248 return timeout; 249 } 250 251 /* 252 * this function keeps reading the voltage until it is stable or until the 253 * timeout expires 254 */ 255 static int wait_for_voltage_stable(int i2caddress) 256 { 257 int timeout, vdd_current, vdd; 258 259 vdd = read_voltage(i2caddress); 260 udelay(NUM_READINGS * WAIT_FOR_ADC); 261 262 /* wait until voltage is stable */ 263 vdd_current = read_voltage(i2caddress); 264 /* The maximum timeout is 265 * MAX_LOOP_WAIT_VOL_STABLE * NUM_READINGS * WAIT_FOR_ADC 266 */ 267 for (timeout = MAX_LOOP_WAIT_VOL_STABLE; 268 abs(vdd - vdd_current) > ADC_MIN_ACCURACY && 269 timeout > 0; timeout--) { 270 vdd = vdd_current; 271 udelay(NUM_READINGS * WAIT_FOR_ADC); 272 vdd_current = read_voltage(i2caddress); 273 } 274 if (timeout == 0) 275 return -1; 276 return vdd_current; 277 } 278 279 /* Set the voltage to the IR chip */ 280 static int set_voltage_to_IR(int i2caddress, int vdd) 281 { 282 int wait, vdd_last; 283 int ret; 284 u8 vid; 285 286 /* Compensate for a board specific voltage drop between regulator and 287 * SoC before converting into an IR VID value 288 */ 289 vdd += board_vdd_drop_compensation(); 290 #ifdef CONFIG_FSL_LSCH2 291 vid = DIV_ROUND_UP(vdd - 265, 5); 292 #else 293 vid = DIV_ROUND_UP(vdd - 245, 5); 294 #endif 295 296 ret = i2c_write(i2caddress, IR36021_LOOP1_MANUAL_ID_OFFSET, 297 1, (void *)&vid, sizeof(vid)); 298 if (ret) { 299 printf("VID: failed to write VID\n"); 300 return -1; 301 } 302 wait = wait_for_new_voltage(vdd, i2caddress); 303 if (wait < 0) 304 return -1; 305 debug("VID: Waited %d us\n", wait * NUM_READINGS * WAIT_FOR_ADC); 306 307 vdd_last = wait_for_voltage_stable(i2caddress); 308 if (vdd_last < 0) 309 return -1; 310 debug("VID: Current voltage is %d mV\n", vdd_last); 311 return vdd_last; 312 } 313 314 #endif 315 316 #ifdef CONFIG_VOL_MONITOR_LTC3882_SET 317 /* this function sets the VDD and returns the value set */ 318 static int set_voltage_to_LTC(int i2caddress, int vdd) 319 { 320 int ret, vdd_last, vdd_target = vdd; 321 322 /* Scale up to the LTC resolution is 1/4096V */ 323 vdd = (vdd * 4096) / 1000; 324 325 /* 5-byte buffer which needs to be sent following the 326 * PMBus command PAGE_PLUS_WRITE. 327 */ 328 u8 buff[5] = {0x04, PWM_CHANNEL0, PMBUS_CMD_VOUT_COMMAND, 329 vdd & 0xFF, (vdd & 0xFF00) >> 8}; 330 331 /* Write the desired voltage code to the regulator */ 332 ret = i2c_write(I2C_VOL_MONITOR_ADDR, 333 PMBUS_CMD_PAGE_PLUS_WRITE, 1, (void *)&buff, 5); 334 if (ret) { 335 printf("VID: I2C failed to write to the volatge regulator\n"); 336 return -1; 337 } 338 339 /* Wait for the volatge to get to the desired value */ 340 do { 341 vdd_last = read_voltage_from_LTC(i2caddress); 342 if (vdd_last < 0) { 343 printf("VID: Couldn't read sensor abort VID adjust\n"); 344 return -1; 345 } 346 } while (vdd_last != vdd_target); 347 348 return vdd_last; 349 } 350 #endif 351 352 static int set_voltage(int i2caddress, int vdd) 353 { 354 int vdd_last = -1; 355 356 #ifdef CONFIG_VOL_MONITOR_IR36021_SET 357 vdd_last = set_voltage_to_IR(i2caddress, vdd); 358 #elif defined CONFIG_VOL_MONITOR_LTC3882_SET 359 vdd_last = set_voltage_to_LTC(i2caddress, vdd); 360 #else 361 #error Specific voltage monitor must be defined 362 #endif 363 return vdd_last; 364 } 365 366 #ifdef CONFIG_FSL_LSCH3 367 int adjust_vdd(ulong vdd_override) 368 { 369 int re_enable = disable_interrupts(); 370 struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR); 371 u32 fusesr; 372 #if defined(CONFIG_VOL_MONITOR_IR36021_SET) || \ 373 defined(CONFIG_VOL_MONITOR_IR36021_READ) 374 u8 vid, buf; 375 #else 376 u8 vid; 377 #endif 378 int vdd_target, vdd_current, vdd_last; 379 int ret, i2caddress; 380 unsigned long vdd_string_override; 381 char *vdd_string; 382 #ifdef CONFIG_ARCH_LS1088A 383 static const uint16_t vdd[32] = { 384 10250, 385 9875, 386 9750, 387 0, /* reserved */ 388 0, /* reserved */ 389 0, /* reserved */ 390 0, /* reserved */ 391 0, /* reserved */ 392 9000, 393 0, /* reserved */ 394 0, /* reserved */ 395 0, /* reserved */ 396 0, /* reserved */ 397 0, /* reserved */ 398 0, /* reserved */ 399 0, /* reserved */ 400 10000, /* 1.0000V */ 401 10125, 402 10250, 403 0, /* reserved */ 404 0, /* reserved */ 405 0, /* reserved */ 406 0, /* reserved */ 407 0, /* reserved */ 408 0, /* reserved */ 409 0, /* reserved */ 410 0, /* reserved */ 411 0, /* reserved */ 412 0, /* reserved */ 413 0, /* reserved */ 414 0, /* reserved */ 415 0, /* reserved */ 416 }; 417 418 #else 419 static const uint16_t vdd[32] = { 420 10500, 421 0, /* reserved */ 422 9750, 423 0, /* reserved */ 424 9500, 425 0, /* reserved */ 426 0, /* reserved */ 427 0, /* reserved */ 428 0, /* reserved */ 429 0, /* reserved */ 430 0, /* reserved */ 431 9000, /* reserved */ 432 0, /* reserved */ 433 0, /* reserved */ 434 0, /* reserved */ 435 0, /* reserved */ 436 10000, /* 1.0000V */ 437 0, /* reserved */ 438 10250, 439 0, /* reserved */ 440 10500, 441 0, /* reserved */ 442 0, /* reserved */ 443 0, /* reserved */ 444 0, /* reserved */ 445 0, /* reserved */ 446 0, /* reserved */ 447 0, /* reserved */ 448 0, /* reserved */ 449 0, /* reserved */ 450 0, /* reserved */ 451 0, /* reserved */ 452 }; 453 #endif 454 struct vdd_drive { 455 u8 vid; 456 unsigned voltage; 457 }; 458 459 ret = i2c_multiplexer_select_vid_channel(I2C_MUX_CH_VOL_MONITOR); 460 if (ret) { 461 debug("VID: I2C failed to switch channel\n"); 462 ret = -1; 463 goto exit; 464 } 465 #if defined(CONFIG_VOL_MONITOR_IR36021_SET) || \ 466 defined(CONFIG_VOL_MONITOR_IR36021_READ) 467 ret = find_ir_chip_on_i2c(); 468 if (ret < 0) { 469 printf("VID: Could not find voltage regulator on I2C.\n"); 470 ret = -1; 471 goto exit; 472 } else { 473 i2caddress = ret; 474 debug("VID: IR Chip found on I2C address 0x%02x\n", i2caddress); 475 } 476 477 /* check IR chip work on Intel mode*/ 478 ret = i2c_read(i2caddress, 479 IR36021_INTEL_MODE_OOFSET, 480 1, (void *)&buf, 1); 481 if (ret) { 482 printf("VID: failed to read IR chip mode.\n"); 483 ret = -1; 484 goto exit; 485 } 486 if ((buf & IR36021_MODE_MASK) != IR36021_INTEL_MODE) { 487 printf("VID: IR Chip is not used in Intel mode.\n"); 488 ret = -1; 489 goto exit; 490 } 491 #endif 492 493 /* get the voltage ID from fuse status register */ 494 fusesr = in_le32(&gur->dcfg_fusesr); 495 vid = (fusesr >> FSL_CHASSIS3_DCFG_FUSESR_ALTVID_SHIFT) & 496 FSL_CHASSIS3_DCFG_FUSESR_ALTVID_MASK; 497 if ((vid == 0) || (vid == FSL_CHASSIS3_DCFG_FUSESR_ALTVID_MASK)) { 498 vid = (fusesr >> FSL_CHASSIS3_DCFG_FUSESR_VID_SHIFT) & 499 FSL_CHASSIS3_DCFG_FUSESR_VID_MASK; 500 } 501 vdd_target = vdd[vid]; 502 503 /* check override variable for overriding VDD */ 504 vdd_string = env_get(CONFIG_VID_FLS_ENV); 505 if (vdd_override == 0 && vdd_string && 506 !strict_strtoul(vdd_string, 10, &vdd_string_override)) 507 vdd_override = vdd_string_override; 508 509 if (vdd_override >= VDD_MV_MIN && vdd_override <= VDD_MV_MAX) { 510 vdd_target = vdd_override * 10; /* convert to 1/10 mV */ 511 debug("VDD override is %lu\n", vdd_override); 512 } else if (vdd_override != 0) { 513 printf("Invalid value.\n"); 514 } 515 516 /* divide and round up by 10 to get a value in mV */ 517 vdd_target = DIV_ROUND_UP(vdd_target, 10); 518 if (vdd_target == 0) { 519 debug("VID: VID not used\n"); 520 ret = 0; 521 goto exit; 522 } else if (vdd_target < VDD_MV_MIN || vdd_target > VDD_MV_MAX) { 523 /* Check vdd_target is in valid range */ 524 printf("VID: Target VID %d mV is not in range.\n", 525 vdd_target); 526 ret = -1; 527 goto exit; 528 } else { 529 debug("VID: vid = %d mV\n", vdd_target); 530 } 531 532 /* 533 * Read voltage monitor to check real voltage. 534 */ 535 vdd_last = read_voltage(i2caddress); 536 if (vdd_last < 0) { 537 printf("VID: Couldn't read sensor abort VID adjustment\n"); 538 ret = -1; 539 goto exit; 540 } 541 vdd_current = vdd_last; 542 debug("VID: Core voltage is currently at %d mV\n", vdd_last); 543 544 #ifdef CONFIG_VOL_MONITOR_LTC3882_SET 545 /* Set the target voltage */ 546 vdd_last = vdd_current = set_voltage(i2caddress, vdd_target); 547 #else 548 /* 549 * Adjust voltage to at or one step above target. 550 * As measurements are less precise than setting the values 551 * we may run through dummy steps that cancel each other 552 * when stepping up and then down. 553 */ 554 while (vdd_last > 0 && 555 vdd_last < vdd_target) { 556 vdd_current += IR_VDD_STEP_UP; 557 vdd_last = set_voltage(i2caddress, vdd_current); 558 } 559 while (vdd_last > 0 && 560 vdd_last > vdd_target + (IR_VDD_STEP_DOWN - 1)) { 561 vdd_current -= IR_VDD_STEP_DOWN; 562 vdd_last = set_voltage(i2caddress, vdd_current); 563 } 564 565 #endif 566 if (board_adjust_vdd(vdd_target) < 0) { 567 ret = -1; 568 goto exit; 569 } 570 571 if (vdd_last > 0) 572 printf("VID: Core voltage after adjustment is at %d mV\n", 573 vdd_last); 574 else 575 ret = -1; 576 exit: 577 if (re_enable) 578 enable_interrupts(); 579 i2c_multiplexer_select_vid_channel(I2C_MUX_CH_DEFAULT); 580 return ret; 581 } 582 #else /* !CONFIG_FSL_LSCH3 */ 583 int adjust_vdd(ulong vdd_override) 584 { 585 int re_enable = disable_interrupts(); 586 #if defined(CONFIG_FSL_LSCH2) 587 struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR); 588 #else 589 ccsr_gur_t __iomem *gur = 590 (void __iomem *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 591 #endif 592 u32 fusesr; 593 u8 vid, buf; 594 int vdd_target, vdd_current, vdd_last; 595 int ret, i2caddress; 596 unsigned long vdd_string_override; 597 char *vdd_string; 598 static const uint16_t vdd[32] = { 599 0, /* unused */ 600 9875, /* 0.9875V */ 601 9750, 602 9625, 603 9500, 604 9375, 605 9250, 606 9125, 607 9000, 608 8875, 609 8750, 610 8625, 611 8500, 612 8375, 613 8250, 614 8125, 615 10000, /* 1.0000V */ 616 10125, 617 10250, 618 10375, 619 10500, 620 10625, 621 10750, 622 10875, 623 11000, 624 0, /* reserved */ 625 }; 626 struct vdd_drive { 627 u8 vid; 628 unsigned voltage; 629 }; 630 631 ret = i2c_multiplexer_select_vid_channel(I2C_MUX_CH_VOL_MONITOR); 632 if (ret) { 633 debug("VID: I2C failed to switch channel\n"); 634 ret = -1; 635 goto exit; 636 } 637 #if defined(CONFIG_VOL_MONITOR_IR36021_SET) || \ 638 defined(CONFIG_VOL_MONITOR_IR36021_READ) 639 ret = find_ir_chip_on_i2c(); 640 if (ret < 0) { 641 printf("VID: Could not find voltage regulator on I2C.\n"); 642 ret = -1; 643 goto exit; 644 } else { 645 i2caddress = ret; 646 debug("VID: IR Chip found on I2C address 0x%02x\n", i2caddress); 647 } 648 649 /* check IR chip work on Intel mode*/ 650 ret = i2c_read(i2caddress, 651 IR36021_INTEL_MODE_OOFSET, 652 1, (void *)&buf, 1); 653 if (ret) { 654 printf("VID: failed to read IR chip mode.\n"); 655 ret = -1; 656 goto exit; 657 } 658 if ((buf & IR36021_MODE_MASK) != IR36021_INTEL_MODE) { 659 printf("VID: IR Chip is not used in Intel mode.\n"); 660 ret = -1; 661 goto exit; 662 } 663 #endif 664 665 /* get the voltage ID from fuse status register */ 666 fusesr = in_be32(&gur->dcfg_fusesr); 667 /* 668 * VID is used according to the table below 669 * --------------------------------------- 670 * | DA_V | 671 * |-------------------------------------| 672 * | 5b00000 | 5b00001-5b11110 | 5b11111 | 673 * ---------------+---------+-----------------+---------| 674 * | D | 5b00000 | NO VID | VID = DA_V | NO VID | 675 * | A |----------+---------+-----------------+---------| 676 * | _ | 5b00001 |VID = | VID = |VID = | 677 * | V | ~ | DA_V_ALT| DA_V_ALT | DA_A_VLT| 678 * | _ | 5b11110 | | | | 679 * | A |----------+---------+-----------------+---------| 680 * | L | 5b11111 | No VID | VID = DA_V | NO VID | 681 * | T | | | | | 682 * ------------------------------------------------------ 683 */ 684 #ifdef CONFIG_FSL_LSCH2 685 vid = (fusesr >> FSL_CHASSIS2_DCFG_FUSESR_ALTVID_SHIFT) & 686 FSL_CHASSIS2_DCFG_FUSESR_ALTVID_MASK; 687 if ((vid == 0) || (vid == FSL_CHASSIS2_DCFG_FUSESR_ALTVID_MASK)) { 688 vid = (fusesr >> FSL_CHASSIS2_DCFG_FUSESR_VID_SHIFT) & 689 FSL_CHASSIS2_DCFG_FUSESR_VID_MASK; 690 } 691 #else 692 vid = (fusesr >> FSL_CORENET_DCFG_FUSESR_ALTVID_SHIFT) & 693 FSL_CORENET_DCFG_FUSESR_ALTVID_MASK; 694 if ((vid == 0) || (vid == FSL_CORENET_DCFG_FUSESR_ALTVID_MASK)) { 695 vid = (fusesr >> FSL_CORENET_DCFG_FUSESR_VID_SHIFT) & 696 FSL_CORENET_DCFG_FUSESR_VID_MASK; 697 } 698 #endif 699 vdd_target = vdd[vid]; 700 701 /* check override variable for overriding VDD */ 702 vdd_string = env_get(CONFIG_VID_FLS_ENV); 703 if (vdd_override == 0 && vdd_string && 704 !strict_strtoul(vdd_string, 10, &vdd_string_override)) 705 vdd_override = vdd_string_override; 706 if (vdd_override >= VDD_MV_MIN && vdd_override <= VDD_MV_MAX) { 707 vdd_target = vdd_override * 10; /* convert to 1/10 mV */ 708 debug("VDD override is %lu\n", vdd_override); 709 } else if (vdd_override != 0) { 710 printf("Invalid value.\n"); 711 } 712 if (vdd_target == 0) { 713 debug("VID: VID not used\n"); 714 ret = 0; 715 goto exit; 716 } else { 717 /* divide and round up by 10 to get a value in mV */ 718 vdd_target = DIV_ROUND_UP(vdd_target, 10); 719 debug("VID: vid = %d mV\n", vdd_target); 720 } 721 722 /* 723 * Read voltage monitor to check real voltage. 724 */ 725 vdd_last = read_voltage(i2caddress); 726 if (vdd_last < 0) { 727 printf("VID: Couldn't read sensor abort VID adjustment\n"); 728 ret = -1; 729 goto exit; 730 } 731 vdd_current = vdd_last; 732 debug("VID: Core voltage is currently at %d mV\n", vdd_last); 733 /* 734 * Adjust voltage to at or one step above target. 735 * As measurements are less precise than setting the values 736 * we may run through dummy steps that cancel each other 737 * when stepping up and then down. 738 */ 739 while (vdd_last > 0 && 740 vdd_last < vdd_target) { 741 vdd_current += IR_VDD_STEP_UP; 742 vdd_last = set_voltage(i2caddress, vdd_current); 743 } 744 while (vdd_last > 0 && 745 vdd_last > vdd_target + (IR_VDD_STEP_DOWN - 1)) { 746 vdd_current -= IR_VDD_STEP_DOWN; 747 vdd_last = set_voltage(i2caddress, vdd_current); 748 } 749 750 if (vdd_last > 0) 751 printf("VID: Core voltage after adjustment is at %d mV\n", 752 vdd_last); 753 else 754 ret = -1; 755 exit: 756 if (re_enable) 757 enable_interrupts(); 758 759 i2c_multiplexer_select_vid_channel(I2C_MUX_CH_DEFAULT); 760 761 return ret; 762 } 763 #endif 764 765 static int print_vdd(void) 766 { 767 int vdd_last, ret, i2caddress; 768 769 ret = i2c_multiplexer_select_vid_channel(I2C_MUX_CH_VOL_MONITOR); 770 if (ret) { 771 debug("VID : I2c failed to switch channel\n"); 772 return -1; 773 } 774 #if defined(CONFIG_VOL_MONITOR_IR36021_SET) || \ 775 defined(CONFIG_VOL_MONITOR_IR36021_READ) 776 ret = find_ir_chip_on_i2c(); 777 if (ret < 0) { 778 printf("VID: Could not find voltage regulator on I2C.\n"); 779 goto exit; 780 } else { 781 i2caddress = ret; 782 debug("VID: IR Chip found on I2C address 0x%02x\n", i2caddress); 783 } 784 #endif 785 786 /* 787 * Read voltage monitor to check real voltage. 788 */ 789 vdd_last = read_voltage(i2caddress); 790 if (vdd_last < 0) { 791 printf("VID: Couldn't read sensor abort VID adjustment\n"); 792 goto exit; 793 } 794 printf("VID: Core voltage is at %d mV\n", vdd_last); 795 exit: 796 i2c_multiplexer_select_vid_channel(I2C_MUX_CH_DEFAULT); 797 798 return ret < 0 ? -1 : 0; 799 800 } 801 802 static int do_vdd_override(cmd_tbl_t *cmdtp, 803 int flag, int argc, 804 char * const argv[]) 805 { 806 ulong override; 807 808 if (argc < 2) 809 return CMD_RET_USAGE; 810 811 if (!strict_strtoul(argv[1], 10, &override)) 812 adjust_vdd(override); /* the value is checked by callee */ 813 else 814 return CMD_RET_USAGE; 815 return 0; 816 } 817 818 static int do_vdd_read(cmd_tbl_t *cmdtp, 819 int flag, int argc, 820 char * const argv[]) 821 { 822 if (argc < 1) 823 return CMD_RET_USAGE; 824 print_vdd(); 825 826 return 0; 827 } 828 829 U_BOOT_CMD( 830 vdd_override, 2, 0, do_vdd_override, 831 "override VDD", 832 " - override with the voltage specified in mV, eg. 1050" 833 ); 834 835 U_BOOT_CMD( 836 vdd_read, 1, 0, do_vdd_read, 837 "read VDD", 838 " - Read the voltage specified in mV" 839 ) 840