mirror of
https://github.com/AsahiLinux/u-boot
synced 2025-03-13 21:36:57 +00:00
board: traverse: ten64: ensure retimer reset is done on new board revisions
Board revision C (production) and later require the SFP+ retimer to be turned on (or reset) on boot, by way of issuing a command to the board's microcontroller (via I2C). The comparison statement here was incorrect, as the board ID decrements every revision (from 0xFF downwards), so this was matching board RevA,B,C instead of Rev >= C. Another oops that transpired when working on this issue, is that if the board controller is not called (such as CONFIG_TEN64_CONTROLLER=n or earlier board rev), then the retimer udevice was not obtained. So the board version check has to be moved inside board_cycle_retimer (which probes/fetches the retimer device) as well. Signed-off-by: Mathew McBride <matt@traverse.com.au>
This commit is contained in:
parent
269b4a3550
commit
7a041fea2d
1 changed files with 19 additions and 18 deletions
|
@ -341,21 +341,28 @@ static int board_cycle_retimer(struct udevice **retim_dev)
|
|||
u8 loop;
|
||||
struct udevice *uc_dev;
|
||||
struct udevice *i2cbus;
|
||||
u32 board_rev = ten64_get_board_rev();
|
||||
|
||||
ret = ten64_get_micro_udevice(&uc_dev, &i2cbus);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = dm_i2c_probe(i2cbus, I2C_RETIMER_ADDR, 0, retim_dev);
|
||||
if (ret == 0) {
|
||||
puts("(retimer on, resetting...) ");
|
||||
/* Retimer power cycle not implemented on early board
|
||||
* revisions/controller firmwares
|
||||
*/
|
||||
if (IS_ENABLED(CONFIG_TEN64_CONTROLLER) &&
|
||||
board_rev <= TEN64_BOARD_REV_C) {
|
||||
ret = dm_i2c_probe(i2cbus, I2C_RETIMER_ADDR, 0, retim_dev);
|
||||
if (ret == 0) {
|
||||
puts("(retimer on, resetting...) ");
|
||||
|
||||
ret = misc_call(uc_dev, TEN64_CNTRL_10G_OFF, NULL, 0, NULL, 0);
|
||||
mdelay(1000);
|
||||
ret = misc_call(uc_dev, TEN64_CNTRL_10G_OFF, NULL, 0, NULL, 0);
|
||||
mdelay(1000);
|
||||
}
|
||||
|
||||
ret = misc_call(uc_dev, TEN64_CNTRL_10G_ON, NULL, 0, NULL, 0);
|
||||
}
|
||||
|
||||
ret = misc_call(uc_dev, TEN64_CNTRL_10G_ON, NULL, 0, NULL, 0);
|
||||
|
||||
// Wait for retimer to come back
|
||||
for (loop = 0; loop < 5; loop++) {
|
||||
ret = dm_i2c_probe(i2cbus, I2C_RETIMER_ADDR, 0, retim_dev);
|
||||
|
@ -375,19 +382,13 @@ static void ten64_board_retimer_ds110df410_init(void)
|
|||
u8 reg;
|
||||
int ret;
|
||||
struct udevice *retim_dev;
|
||||
u32 board_rev = ten64_get_board_rev();
|
||||
|
||||
puts("Retimer: ");
|
||||
/* Retimer power cycle not implemented on early board
|
||||
* revisions/controller firmwares
|
||||
*/
|
||||
if (IS_ENABLED(CONFIG_TEN64_CONTROLLER) &&
|
||||
board_rev >= TEN64_BOARD_REV_C) {
|
||||
ret = board_cycle_retimer(&retim_dev);
|
||||
if (ret) {
|
||||
puts("Retimer power on failed\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ret = board_cycle_retimer(&retim_dev);
|
||||
if (ret) {
|
||||
puts("Retimer power on failed\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Access to Control/Shared register */
|
||||
|
|
Loading…
Add table
Reference in a new issue