summaryrefslogtreecommitdiff
path: root/board/freescale/t4qds
diff options
context:
space:
mode:
authorYork Sun <yorksun@freescale.com>2013-03-25 07:40:01 +0000
committerAndy Fleming <afleming@freescale.com>2013-05-24 16:54:10 -0500
commit0aadf4aa51aaf21c62495fb25cc3e76bf0f268c2 (patch)
tree114a9f4b5f201b1a15d38558884a37827a046ce7 /board/freescale/t4qds
parent0c9ab437de1bcfd0524217619937b162273e43d4 (diff)
downloadu-boot-imx-0aadf4aa51aaf21c62495fb25cc3e76bf0f268c2.zip
u-boot-imx-0aadf4aa51aaf21c62495fb25cc3e76bf0f268c2.tar.gz
u-boot-imx-0aadf4aa51aaf21c62495fb25cc3e76bf0f268c2.tar.bz2
powerpc/t4240qds: Add VDD override
Allow VDD voltage overriding with a command. This is an add-on feasture of VID. To override VDD, use command vdd_override with the value of voltage in mV, for example vdd_override <voltage in mV, eg. 1050> The above example will set the VDD to 1.050 volt. Any wrong value out of range of 0.8188 to 1.2125 volt or invalid string is ignored. In addition to the command, if overriding VDD is needed earlier in booting process, save an variable and reboot: setenv t4240qds_vdd_mv <voltage in mV> saveenv Signed-off-by: York Sun <yorksun@freescale.com> Signed-off-by: Andy Fleming <afleming@freescale.com>
Diffstat (limited to 'board/freescale/t4qds')
-rw-r--r--board/freescale/t4qds/t4qds.c39
1 files changed, 37 insertions, 2 deletions
diff --git a/board/freescale/t4qds/t4qds.c b/board/freescale/t4qds/t4qds.c
index d521008..26539db 100644
--- a/board/freescale/t4qds/t4qds.c
+++ b/board/freescale/t4qds/t4qds.c
@@ -234,7 +234,7 @@ static inline int set_voltage(u8 vid)
}
-static int adjust_vdd(void)
+static int adjust_vdd(ulong vdd_override)
{
int re_enable = disable_interrupts();
ccsr_gur_t __iomem *gur =
@@ -243,6 +243,8 @@ static int adjust_vdd(void)
u8 vid, vid_current;
int vdd_target, vdd_current, vdd_last;
int ret;
+ unsigned long vdd_string_override;
+ char *vdd_string;
static const uint16_t vdd[32] = {
0, /* unused */
9875, /* 0.9875V */
@@ -292,6 +294,19 @@ static int adjust_vdd(void)
FSL_CORENET_DCFG_FUSESR_ALTVID_MASK;
}
vdd_target = vdd[vid];
+
+ /* check override variable for overriding VDD */
+ vdd_string = getenv("t4240qds_vdd_mv");
+ if (vdd_override == 0 && vdd_string &&
+ !strict_strtoul(vdd_string, 10, &vdd_string_override))
+ vdd_override = vdd_string_override;
+ if (vdd_override >= 819 && vdd_override <= 1212) {
+ vdd_target = vdd_override * 10; /* convert to 1/10 mV */
+ debug("VDD override is %lu\n", vdd_override);
+ } else if (vdd_override != 0) {
+ printf("Invalid value.\n");
+ }
+
if (vdd_target == 0) {
debug("VID: VID not used\n");
ret = 0;
@@ -511,7 +526,7 @@ int board_early_init_r(void)
* Adjust core voltage according to voltage ID
* This function changes I2C mux to channel 2.
*/
- if (adjust_vdd())
+ if (adjust_vdd(0))
printf("Warning: Adjusting core voltage failed.\n");
/* Configure board SERDES ports crossbar */
@@ -801,3 +816,23 @@ void qixis_dump_switch(void)
i + 1, byte_to_binary_mask(sw[i], mask[i], buf), sw[i]);
}
}
+
+static int do_vdd_adjust(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+ ulong override;
+
+ if (argc < 2)
+ return CMD_RET_USAGE;
+ if (!strict_strtoul(argv[1], 10, &override))
+ adjust_vdd(override); /* the value is checked by callee */
+ else
+ return CMD_RET_USAGE;
+
+ return 0;
+}
+
+U_BOOT_CMD(
+ vdd_override, 2, 0, do_vdd_adjust,
+ "Override VDD",
+ "- override with the voltage specified in mV, eg. 1050"
+);