diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2019-10-17 08:10:23 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2019-10-17 08:10:23 +0200 |
commit | ee6d4a74eb6efa643e7b834b32e04d01c6b29b7f (patch) | |
tree | 2ca84274dfe2e54729bca7dc4bbfe42611a1ee7f /drivers/net/phy/mv88e6xxx/global1.c | |
parent | c59d7ab7317014cc14a98c47e91c2b582d5d08a7 (diff) | |
parent | 099b135ac30013dfc4b3310a5177cf2f7a17f3c3 (diff) | |
download | barebox-ee6d4a74eb6efa643e7b834b32e04d01c6b29b7f.tar.gz barebox-ee6d4a74eb6efa643e7b834b32e04d01c6b29b7f.tar.xz |
Merge branch 'for-next/misc'
Diffstat (limited to 'drivers/net/phy/mv88e6xxx/global1.c')
-rw-r--r-- | drivers/net/phy/mv88e6xxx/global1.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/drivers/net/phy/mv88e6xxx/global1.c b/drivers/net/phy/mv88e6xxx/global1.c new file mode 100644 index 0000000000..bace5396e9 --- /dev/null +++ b/drivers/net/phy/mv88e6xxx/global1.c @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Marvell 88E6xxx Switch Global (1) Registers support + * + * Copyright (c) 2008 Marvell Semiconductor + * + * Copyright (c) 2016-2017 Savoir-faire Linux Inc. + * Vivien Didelot <vivien.didelot@savoirfairelinux.com> + */ + +#include <clock.h> +#include <linux/bitfield.h> + +#include "chip.h" +#include "global1.h" + +static int mv88e6xxx_g1_read(struct mv88e6xxx_chip *chip, int reg, u16 *val) +{ + int addr = chip->info->global1_addr; + + return mv88e6xxx_read(chip, addr, reg, val); +} + +void mv88e6xxx_g1_wait_eeprom_done(struct mv88e6xxx_chip *chip) +{ + const uint64_t start = get_time_ns(); + const uint64_t timeout = SECOND; + u16 val; + int err; + + /* Wait up to 1 second for the switch to finish reading the + * EEPROM. + */ + while (!is_timeout(start, timeout)) { + err = mv88e6xxx_g1_read(chip, MV88E6XXX_G1_STS, &val); + if (err) { + dev_err(chip->dev, "Error reading status\n"); + return; + } + + if (val != 0xFFFF && /* switch will return 0xffff until + * EEPROM is loaded + */ + val & BIT(MV88E6XXX_G1_STS_IRQ_EEPROM_DONE)) + return; + + mdelay(2); + } + + dev_err(chip->dev, "Timeout waiting for EEPROM done\n"); +} |