mirror of
https://github.com/smaeul/u-boot.git
synced 2025-10-15 05:16:01 +01:00
arm: mvebu: turris_mox: Use DM registered MDIO
In order to be able to get rid of the non-DM MDIO bus registered in mvneta driver, start using the DM registered one in Turris MOX board code. This also allows us to drop the hack introduced in MOX' -u-boot.dtsi file. Signed-off-by: Marek Behún <marek.behun@nic.cz> Reviewed-by: Stefan Roese <sr@denx.de>
This commit is contained in:
parent
00b1bad961
commit
0ce0feb046
@ -3,25 +3,6 @@
|
|||||||
* 2022 by Marek Behún <kabel@kernel.org>
|
* 2022 by Marek Behún <kabel@kernel.org>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/ {
|
|
||||||
mdio {
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <0>;
|
|
||||||
|
|
||||||
old_binding_phy1: ethernet-phy@1 {
|
|
||||||
reg = <1>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
ð0 {
|
|
||||||
pinctrl-0 = <&rgmii_pins>, <&smi_pins>;
|
|
||||||
/delete-property/ phy-handle;
|
|
||||||
phy = <&old_binding_phy1>;
|
|
||||||
};
|
|
||||||
|
|
||||||
/delete-node/ &mdio;
|
|
||||||
|
|
||||||
&usb3 {
|
&usb3 {
|
||||||
vbus-supply = <&exp_usb3_vbus>;
|
vbus-supply = <&exp_usb3_vbus>;
|
||||||
};
|
};
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include <button.h>
|
#include <button.h>
|
||||||
#include <clk.h>
|
#include <clk.h>
|
||||||
#include <dm.h>
|
#include <dm.h>
|
||||||
|
#include <dm/of_extra.h>
|
||||||
#include <env.h>
|
#include <env.h>
|
||||||
#include <fdt_support.h>
|
#include <fdt_support.h>
|
||||||
#include <init.h>
|
#include <init.h>
|
||||||
@ -216,35 +217,35 @@ static int mox_get_topology(const u8 **ptopology, int *psize, int *pis_sd)
|
|||||||
#define SW_SMI_CMD_R(d, r) (0x9800 | (((d) & 0x1f) << 5) | ((r) & 0x1f))
|
#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))
|
#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);
|
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)
|
u16 val)
|
||||||
{
|
{
|
||||||
bus->write(bus, sw, 0, 1, val);
|
dm_mdio_write(bus, sw, MDIO_DEVAD_NONE, 1, val);
|
||||||
bus->write(bus, sw, 0, 0, SW_SMI_CMD_W(dev, reg));
|
dm_mdio_write(bus, sw, MDIO_DEVAD_NONE, 0, SW_SMI_CMD_W(dev, reg));
|
||||||
mdelay(5);
|
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);
|
sw_multi_write(bus, sw, 0x1c, 0x1a, (reg & 0x7f) << 8);
|
||||||
return sw_multi_read(bus, sw, 0x1c, 0x1a) & 0xff;
|
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)
|
u16 val)
|
||||||
{
|
{
|
||||||
sw_multi_write(bus, sw, port, 0x16, 0x8000 | ((reg & 7) << 12)
|
sw_multi_write(bus, sw, port, 0x16, 0x8000 | ((reg & 7) << 12)
|
||||||
| (val & 0x7ff));
|
| (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;
|
int i, p;
|
||||||
struct {
|
struct {
|
||||||
@ -275,7 +276,7 @@ static void sw_blink_leds(struct mii_dev *bus, int peridot, int topaz)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
if (sw_scratch_read(bus, addr, 0x70) >> 3 != addr)
|
||||||
printf("Check of switch MDIO address failed for 0x%02x\n",
|
printf("Check of switch MDIO address failed for 0x%02x\n",
|
||||||
@ -374,36 +375,22 @@ static void mox_phy_modify(struct phy_device *phydev, int page, int reg,
|
|||||||
static void mox_phy_leds_start_blinking(void)
|
static void mox_phy_leds_start_blinking(void)
|
||||||
{
|
{
|
||||||
struct phy_device *phydev;
|
struct phy_device *phydev;
|
||||||
struct mii_dev *bus;
|
ofnode phy_node;
|
||||||
const char *node_name;
|
|
||||||
int node;
|
|
||||||
|
|
||||||
node = fdt_path_offset(gd->fdt_blob, "ethernet0");
|
phy_node = ofnode_get_phy_node(ofnode_path("ethernet0"));
|
||||||
if (node < 0) {
|
if (!ofnode_valid(phy_node))
|
||||||
printf("Cannot get eth0!\n");
|
goto err;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
node_name = fdt_get_name(gd->fdt_blob, node, NULL);
|
phydev = dm_phy_find_by_ofnode(phy_node);
|
||||||
if (!node_name) {
|
if (!phydev)
|
||||||
printf("Cannot get eth0 node name!\n");
|
goto err;
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
mox_phy_modify(phydev, 3, 0x12, 0x700, 0x400);
|
mox_phy_modify(phydev, 3, 0x12, 0x700, 0x400);
|
||||||
mox_phy_modify(phydev, 3, 0x10, 0xff, 0xbb);
|
mox_phy_modify(phydev, 3, 0x10, 0xff, 0xbb);
|
||||||
|
|
||||||
|
return;
|
||||||
|
err:
|
||||||
|
printf("Cannot get ethernet PHY!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool read_reset_button(void)
|
static bool read_reset_button(void)
|
||||||
@ -611,6 +598,26 @@ int show_board_info(void)
|
|||||||
return 0;
|
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)
|
int last_stage_init(void)
|
||||||
{
|
{
|
||||||
struct gpio_desc reset_gpio = {};
|
struct gpio_desc reset_gpio = {};
|
||||||
@ -636,16 +643,9 @@ int last_stage_init(void)
|
|||||||
* 0x70 of Peridot (and potentially Topaz) modules
|
* 0x70 of Peridot (and potentially Topaz) modules
|
||||||
*/
|
*/
|
||||||
if (peridot || topaz) {
|
if (peridot || topaz) {
|
||||||
struct mii_dev *bus;
|
struct udevice *bus = mox_mdio_bus();
|
||||||
const char *node_name;
|
|
||||||
int node;
|
|
||||||
|
|
||||||
node = fdt_path_offset(gd->fdt_blob, "ethernet0");
|
if (bus) {
|
||||||
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 {
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < peridot; ++i)
|
for (i = 0; i < peridot; ++i)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user