#include <button.h>
#include <clk.h>
#include <dm.h>
+#include <dm/of_extra.h>
#include <env.h>
#include <fdt_support.h>
#include <init.h>
#define SW_SMI_CMD_R(d, r) (0x9800 | (((d) & 0x1f) << 5) | ((r) & 0x1f))
#define SW_SMI_CMD_W(d, r) (0x9400 | (((d) & 0x1f) << 5) | ((r) & 0x1f))
-static int sw_multi_read(struct mii_dev *bus, int sw, int dev, int reg)
+static int sw_multi_read(struct udevice *bus, int sw, int dev, int reg)
{
- bus->write(bus, sw, 0, 0, SW_SMI_CMD_R(dev, reg));
+ dm_mdio_write(bus, sw, MDIO_DEVAD_NONE, 0, SW_SMI_CMD_R(dev, reg));
mdelay(5);
- return bus->read(bus, sw, 0, 1);
+ return dm_mdio_read(bus, sw, MDIO_DEVAD_NONE, 1);
}
-static void sw_multi_write(struct mii_dev *bus, int sw, int dev, int reg,
+static void sw_multi_write(struct udevice *bus, int sw, int dev, int reg,
u16 val)
{
- bus->write(bus, sw, 0, 1, val);
- bus->write(bus, sw, 0, 0, SW_SMI_CMD_W(dev, reg));
+ dm_mdio_write(bus, sw, MDIO_DEVAD_NONE, 1, val);
+ dm_mdio_write(bus, sw, MDIO_DEVAD_NONE, 0, SW_SMI_CMD_W(dev, reg));
mdelay(5);
}
-static int sw_scratch_read(struct mii_dev *bus, int sw, int reg)
+static int sw_scratch_read(struct udevice *bus, int sw, int reg)
{
sw_multi_write(bus, sw, 0x1c, 0x1a, (reg & 0x7f) << 8);
return sw_multi_read(bus, sw, 0x1c, 0x1a) & 0xff;
}
-static void sw_led_write(struct mii_dev *bus, int sw, int port, int reg,
+static void sw_led_write(struct udevice *bus, int sw, int port, int reg,
u16 val)
{
sw_multi_write(bus, sw, port, 0x16, 0x8000 | ((reg & 7) << 12)
| (val & 0x7ff));
}
-static void sw_blink_leds(struct mii_dev *bus, int peridot, int topaz)
+static void sw_blink_leds(struct udevice *bus, int peridot, int topaz)
{
int i, p;
struct {
}
}
-static void check_switch_address(struct mii_dev *bus, int addr)
+static void check_switch_address(struct udevice *bus, int addr)
{
if (sw_scratch_read(bus, addr, 0x70) >> 3 != addr)
printf("Check of switch MDIO address failed for 0x%02x\n",
static void mox_phy_leds_start_blinking(void)
{
struct phy_device *phydev;
- struct mii_dev *bus;
- const char *node_name;
- int node;
+ ofnode phy_node;
- node = fdt_path_offset(gd->fdt_blob, "ethernet0");
- if (node < 0) {
- printf("Cannot get eth0!\n");
- return;
- }
+ phy_node = ofnode_get_phy_node(ofnode_path("ethernet0"));
+ if (!ofnode_valid(phy_node))
+ goto err;
- node_name = fdt_get_name(gd->fdt_blob, node, NULL);
- if (!node_name) {
- printf("Cannot get eth0 node name!\n");
- return;
- }
-
- bus = miiphy_get_dev_by_name(node_name);
- if (!bus) {
- printf("Cannot get MDIO bus device!\n");
- return;
- }
-
- phydev = phy_find_by_mask(bus, BIT(1));
- if (!phydev) {
- printf("Cannot get ethernet PHY!\n");
- return;
- }
+ phydev = dm_phy_find_by_ofnode(phy_node);
+ if (!phydev)
+ goto err;
mox_phy_modify(phydev, 3, 0x12, 0x700, 0x400);
mox_phy_modify(phydev, 3, 0x10, 0xff, 0xbb);
+
+ return;
+err:
+ printf("Cannot get ethernet PHY!\n");
}
static bool read_reset_button(void)
return 0;
}
+static struct udevice *mox_mdio_bus(void)
+{
+ struct udevice *bus;
+ ofnode node;
+
+ node = ofnode_by_compatible(ofnode_null(), "marvell,orion-mdio");
+ if (!ofnode_valid(node))
+ goto err;
+
+ dm_mdio_probe_devices();
+
+ if (uclass_get_device_by_ofnode(UCLASS_MDIO, node, &bus))
+ goto err;
+
+ return bus;
+err:
+ printf("Cannot get MDIO bus device!\n");
+ return NULL;
+}
+
int last_stage_init(void)
{
struct gpio_desc reset_gpio = {};
* 0x70 of Peridot (and potentially Topaz) modules
*/
if (peridot || topaz) {
- struct mii_dev *bus;
- const char *node_name;
- int node;
+ struct udevice *bus = mox_mdio_bus();
- node = fdt_path_offset(gd->fdt_blob, "ethernet0");
- node_name = (node >= 0) ? fdt_get_name(gd->fdt_blob, node, NULL) : NULL;
- bus = node_name ? miiphy_get_dev_by_name(node_name) : NULL;
- if (!bus) {
- printf("Cannot get MDIO bus device!\n");
- } else {
+ if (bus) {
int i;
for (i = 0; i < peridot; ++i)