SPDX: Convert all of our single license tags to Linux Kernel style
[platform/kernel/u-boot.git] / board / freescale / common / vid.c
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                 0,      /* 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 )