[coreboot-gerrit] New patch to review for coreboot: e7cb457 pistachio: fix clocks setup code

Stefan Reinauer (stefan.reinauer@coreboot.org) gerrit at coreboot.org
Tue Apr 14 03:03:08 CEST 2015


Stefan Reinauer (stefan.reinauer at coreboot.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/9667

-gerrit

commit e7cb4579b0683e4b99b0e7e184b4b8b54272cc9a
Author: Ionela Voinescu <ionela.voinescu at imgtec.com>
Date:   Mon Jan 26 17:15:59 2015 +0000

    pistachio: fix clocks setup code
    
    Some of the asserts were not done properly: the value has
    to be shifted before is matched with the mask.
    Added condition to exit while loop for USB clock setup.
    
    BUG=chrome-os-partner:31438
    TEST=tested on Pistachio bring up board; after this patch is
    applied none of the asserts fail and the code is executed
    properly.
    BRANCH=none
    
    Change-Id: Ib3aae9f7751a9f077bc95b6e0f9d63e3e16d8e4b
    Signed-off-by: Stefan Reinauer <reinauer at chromium.org>
    Original-Commit-Id: 96999a4322ba98e87bc6746ad05b30cc56704e2e
    Original-Change-Id: I8d2d468d618ca1ffcb1421409122482444e6d420
    Original-Signed-off-by: Ionela Voinescu <ionela.voinescu at imgtec.com>
    Original-Reviewed-on: https://chromium-review.googlesource.com/243214
    Original-Reviewed-by: David Hendricks <dhendrix at chromium.org>
---
 src/soc/imgtec/pistachio/clocks.c | 22 ++++++++++++++++------
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/src/soc/imgtec/pistachio/clocks.c b/src/soc/imgtec/pistachio/clocks.c
index ec77d65..1b7722f 100644
--- a/src/soc/imgtec/pistachio/clocks.c
+++ b/src/soc/imgtec/pistachio/clocks.c
@@ -179,8 +179,10 @@ static int pll_setup(struct pll_parameters *param, u8 divider1, u8 divider2)
 	struct stopwatch sw;
 
 	/* Check input parameters */
-	assert(!(divider1 & ~(param->postdiv1_mask)));
-	assert(!(divider2 & ~(param->postdiv2_mask)));
+	assert(!((divider1 << param->postdiv1_shift) &
+		~(param->postdiv1_mask)));
+	assert(!((divider2 << param->postdiv2_shift) &
+		~(param->postdiv2_mask)));
 
 	/* Temporary bypass PLL (select XTAL as clock input) */
 	reg = read32(PISTACHIO_CLOCK_SWITCH);
@@ -198,7 +200,8 @@ static int pll_setup(struct pll_parameters *param, u8 divider1, u8 divider2)
 	write32(param->power_down_ctrl_addr, reg);
 
 	if (param->feedback_addr) {
-		assert(!(param->feedback & ~(param->feedback_mask)));
+		assert(!((param->feedback << param->feedback_shift) &
+			~(param->feedback_mask)));
 		reg = read32(param->feedback_addr);
 		reg &= ~(param->feedback_mask);
 		reg |= (param->feedback << param->feedback_shift) &
@@ -207,7 +210,8 @@ static int pll_setup(struct pll_parameters *param, u8 divider1, u8 divider2)
 	}
 
 	if (param->refdiv_addr) {
-		assert(!(param->refdivider & ~(param->refdiv_mask)));
+		assert(!((param->refdivider << param->refdiv_shift) &
+			~(param->refdiv_mask)));
 		reg = read32(param->refdiv_addr);
 		reg &= ~(param->refdiv_mask);
 		reg |= (param->refdivider << param->refdiv_shift) &
@@ -307,8 +311,10 @@ int usb_clk_setup(u8 divider, u8 refclksel, u8 fsel)
 
 	/* Check input parameters */
 	assert(!(divider & ~(USBPHYCLKOUT_MASK)));
-	assert(!(refclksel & ~(USBPHYSTRAPCTRL_REFCLKSEL_MASK)));
-	assert(!(fsel & ~(USBPHYCONTROL1_FSEL_MASK)));
+	assert(!((refclksel << USBPHYSTRAPCTRL_REFCLKSEL_SHIFT) &
+		~(USBPHYSTRAPCTRL_REFCLKSEL_MASK)));
+	assert(!((fsel << USBPHYCONTROL1_FSEL_SHIFT) &
+		~(USBPHYCONTROL1_FSEL_MASK)));
 
 	/* Set USB divider */
 	reg = read32(USBPHYCLKOUT_CTRL_ADDR);
@@ -338,6 +344,10 @@ int usb_clk_setup(u8 divider, u8 refclksel, u8 fsel)
 			return USB_VBUS_FAULT;
 		if (stopwatch_expired(&sw))
 			return USB_TIMEOUT;
+		/* Check if USB is set up properly */
+		if ((reg & USBPHYSTATUS_RX_PHY_CLK_MASK) &&
+			(reg & USBPHYSTATUS_RX_UTMI_CLK_MASK))
+			break;
 	}
 
 	return CLOCKS_OK;



More information about the coreboot-gerrit mailing list