diff --git a/ddbridge/ddbridge-core.c b/ddbridge/ddbridge-core.c index 5dc474b..c20e83e 100644 --- a/ddbridge/ddbridge-core.c +++ b/ddbridge/ddbridge-core.c @@ -3189,25 +3189,25 @@ int ddbridge_flashread(struct ddb *dev, u32 link, u8 *buf, u32 addr, u32 len) return flashio(dev, link, cmd, 4, buf, len); } -static int mdio_write(struct ddb *dev, u8 adr, u8 reg, u16 val) +static int mdio_write(struct ddb *dev, u8 adr, u8 reg, u16 val, u32 mdio_base) { - ddbwritel(dev, adr, MDIO_ADR); - ddbwritel(dev, reg, MDIO_REG); - ddbwritel(dev, val, MDIO_VAL); - ddbwritel(dev, 0x03, MDIO_CTRL); - while (ddbreadl(dev, MDIO_CTRL) & 0x02) + ddbwritel(dev, adr, MDIO_ADR_OFF + mdio_base); + ddbwritel(dev, reg, MDIO_REG_OFF + mdio_base); + ddbwritel(dev, val, MDIO_VAL_OFF + mdio_base); + ddbwritel(dev, 0x03, MDIO_CTRL_OFF + mdio_base); + while (ddbreadl(dev, MDIO_CTRL_OFF + mdio_base) & 0x02) ndelay(500); return 0; } -static u16 mdio_read(struct ddb *dev, u8 adr, u8 reg) +static u16 mdio_read(struct ddb *dev, u8 adr, u8 reg, u32 mdio_base) { - ddbwritel(dev, adr, MDIO_ADR); - ddbwritel(dev, reg, MDIO_REG); - ddbwritel(dev, 0x07, MDIO_CTRL); - while (ddbreadl(dev, MDIO_CTRL) & 0x02) + ddbwritel(dev, adr, MDIO_ADR_OFF + mdio_base); + ddbwritel(dev, reg, MDIO_REG_OFF + mdio_base); + ddbwritel(dev, 0x07, MDIO_CTRL_OFF + mdio_base); + while (ddbreadl(dev, MDIO_CTRL_OFF + mdio_base) & 0x02) ndelay(500); - return ddbreadl(dev, MDIO_VAL); + return ddbreadl(dev, MDIO_VAL_OFF + mdio_base); } #define DDB_MAGIC 'd' @@ -3383,12 +3383,13 @@ static long ddb_ioctl(struct file *file, unsigned int cmd, unsigned long arg) case IOCTL_DDB_READ_MDIO: { struct ddb_mdio mdio; + u32 mdio_base = dev->link[0].info->mdio_base; - if (!dev->link[0].info->mdio_num) + if (!mdio_base) return -EIO; if (copy_from_user(&mdio, parg, sizeof(mdio))) return -EFAULT; - mdio.val = mdio_read(dev, mdio.adr, mdio.reg); + mdio.val = mdio_read(dev, mdio.adr, mdio.reg, mdio_base); if (copy_to_user(parg, &mdio, sizeof(mdio))) return -EFAULT; break; @@ -3396,12 +3397,13 @@ static long ddb_ioctl(struct file *file, unsigned int cmd, unsigned long arg) case IOCTL_DDB_WRITE_MDIO: { struct ddb_mdio mdio; + u32 mdio_base = dev->link[0].info->mdio_base; - if (!dev->link[0].info->mdio_num) + if (!mdio_base) return -EIO; if (copy_from_user(&mdio, parg, sizeof(mdio))) return -EFAULT; - mdio_write(dev, mdio.adr, mdio.reg, mdio.val); + mdio_write(dev, mdio.adr, mdio.reg, mdio.val, mdio_base); break; } case IOCTL_DDB_READ_MEM: diff --git a/ddbridge/ddbridge-hw.c b/ddbridge/ddbridge-hw.c index 8aa53dc..b21f20a 100644 --- a/ddbridge/ddbridge-hw.c +++ b/ddbridge/ddbridge-hw.c @@ -489,7 +489,7 @@ static const struct ddb_info ddb_octopro_hdin = { .regmap = &octopro_hdin_map, .port_num = 10, .i2c_mask = 0x3ff, - .mdio_num = 1, + .mdio_base = 0x10020, }; static const struct ddb_info ddb_octopro = { @@ -498,7 +498,7 @@ static const struct ddb_info ddb_octopro = { .regmap = &octopro_map, .port_num = 10, .i2c_mask = 0x3ff, - .mdio_num = 1, + .mdio_base = 0x10020, }; static const struct ddb_info ddb_s2_48 = { @@ -627,7 +627,7 @@ static const struct ddb_info ddb_octonet = { .port_num = 4, .i2c_mask = 0x0f, .ns_num = 12, - .mdio_num = 1, + .mdio_base = 0x20, }; static const struct ddb_info ddb_octonet_jse = { @@ -637,7 +637,7 @@ static const struct ddb_info ddb_octonet_jse = { .port_num = 4, .i2c_mask = 0x0f, .ns_num = 15, - .mdio_num = 1, + .mdio_base = 0x20, }; static const struct ddb_info ddb_octonet_gtl = { @@ -647,7 +647,7 @@ static const struct ddb_info ddb_octonet_gtl = { .port_num = 4, .i2c_mask = 0x05, .ns_num = 12, - .mdio_num = 1, + .mdio_base = 0x20, .con_clock = 1, }; diff --git a/ddbridge/ddbridge-regs.h b/ddbridge/ddbridge-regs.h index 596250b..7ac9f99 100644 --- a/ddbridge/ddbridge-regs.h +++ b/ddbridge/ddbridge-regs.h @@ -44,10 +44,17 @@ /* ------------------------------------------------------------------------- */ /* MDIO */ +#if 0 #define MDIO_CTRL 0x20 #define MDIO_ADR 0x24 #define MDIO_REG 0x28 #define MDIO_VAL 0x2C +#endif + +#define MDIO_CTRL_OFF 0x00 +#define MDIO_ADR_OFF 0x04 +#define MDIO_REG_OFF 0x08 +#define MDIO_VAL_OFF 0x0C /* ------------------------------------------------------------------------- */ diff --git a/ddbridge/ddbridge.h b/ddbridge/ddbridge.h index 370a79a..7958a0a 100644 --- a/ddbridge/ddbridge.h +++ b/ddbridge/ddbridge.h @@ -165,7 +165,6 @@ struct ddb_info { u32 board_control; u32 board_control_2; u8 ns_num; - u8 mdio_num; u8 con_clock; /* use a continuous clock */ u8 ts_quirks; #define TS_QUIRK_SERIAL 1 @@ -174,6 +173,7 @@ struct ddb_info { #define TS_QUIRK_ALT_OSC 8 u32 tempmon_irq; u32 lostlock_irq; + u32 mdio_base; u8 mci; const struct ddb_regmap *regmap; };