/* * (C) Copyright 2010 * Dirk Eibach, Guntermann & Drunck GmbH, eibach@gdsys.de * * SPDX-License-Identifier: GPL-2.0+ */ #include #include #include struct io_bb_pinset { int mdio; int mdc; }; static int io_bb_mii_init(struct bb_miiphy_bus *bus) { return 0; } static int io_bb_mdio_active(struct bb_miiphy_bus *bus) { struct io_bb_pinset *pins = bus->priv; out_be32((void *)GPIO0_TCR, in_be32((void *)GPIO0_TCR) | pins->mdio); return 0; } static int io_bb_mdio_tristate(struct bb_miiphy_bus *bus) { struct io_bb_pinset *pins = bus->priv; out_be32((void *)GPIO0_TCR, in_be32((void *)GPIO0_TCR) & ~pins->mdio); return 0; } static int io_bb_set_mdio(struct bb_miiphy_bus *bus, int v) { struct io_bb_pinset *pins = bus->priv; if (v) out_be32((void *)GPIO0_OR, in_be32((void *)GPIO0_OR) | pins->mdio); else out_be32((void *)GPIO0_OR, in_be32((void *)GPIO0_OR) & ~pins->mdio); return 0; } static int io_bb_get_mdio(struct bb_miiphy_bus *bus, int *v) { struct io_bb_pinset *pins = bus->priv; *v = ((in_be32((void *)GPIO0_IR) & pins->mdio) != 0); return 0; } static int io_bb_set_mdc(struct bb_miiphy_bus *bus, int v) { struct io_bb_pinset *pins = bus->priv; if (v) out_be32((void *)GPIO0_OR, in_be32((void *)GPIO0_OR) | pins->mdc); else out_be32((void *)GPIO0_OR, in_be32((void *)GPIO0_OR) & ~pins->mdc); return 0; } static int io_bb_delay(struct bb_miiphy_bus *bus) { udelay(1); return 0; } struct io_bb_pinset io_bb_pinsets[] = { { .mdio = CONFIG_SYS_MDIO_PIN, .mdc = CONFIG_SYS_MDC_PIN, }, #ifdef CONFIG_SYS_GBIT_MII1_BUSNAME { .mdio = CONFIG_SYS_MDIO1_PIN, .mdc = CONFIG_SYS_MDC1_PIN, }, #endif }; struct bb_miiphy_bus bb_miiphy_buses[] = { { .name = CONFIG_SYS_GBIT_MII_BUSNAME, .init = io_bb_mii_init, .mdio_active = io_bb_mdio_active, .mdio_tristate = io_bb_mdio_tristate, .set_mdio = io_bb_set_mdio, .get_mdio = io_bb_get_mdio, .set_mdc = io_bb_set_mdc, .delay = io_bb_delay, .priv = &io_bb_pinsets[0], }, #ifdef CONFIG_SYS_GBIT_MII1_BUSNAME { .name = CONFIG_SYS_GBIT_MII1_BUSNAME, .init = io_bb_mii_init, .mdio_active = io_bb_mdio_active, .mdio_tristate = io_bb_mdio_tristate, .set_mdio = io_bb_set_mdio, .get_mdio = io_bb_get_mdio, .set_mdc = io_bb_set_mdc, .delay = io_bb_delay, .priv = &io_bb_pinsets[1], }, #endif }; int bb_miiphy_buses_num = sizeof(bb_miiphy_buses) / sizeof(bb_miiphy_buses[0]);