Merge remote branch 'origin' into secretlab/next-devicetree
Merging in current state of Linus' tree to deal with merge conflicts and build failures in vio.c after merge. Conflicts: drivers/i2c/busses/i2c-cpm.c drivers/i2c/busses/i2c-mpc.c drivers/net/gianfar.c Also fixed up one line in arch/powerpc/kernel/vio.c to use the correct node pointer. Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
This commit is contained in:
@@ -88,6 +88,11 @@ config LSI_ET1011C_PHY
|
||||
---help---
|
||||
Supports the LSI ET1011C PHY.
|
||||
|
||||
config MICREL_PHY
|
||||
tristate "Driver for Micrel PHYs"
|
||||
---help---
|
||||
Supports the KSZ9021, VSC8201, KS8001 PHYs.
|
||||
|
||||
config FIXED_PHY
|
||||
bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs"
|
||||
depends on PHYLIB=y
|
||||
|
@@ -20,4 +20,5 @@ obj-$(CONFIG_MDIO_BITBANG) += mdio-bitbang.o
|
||||
obj-$(CONFIG_MDIO_GPIO) += mdio-gpio.o
|
||||
obj-$(CONFIG_NATIONAL_PHY) += national.o
|
||||
obj-$(CONFIG_STE10XP) += ste10Xp.o
|
||||
obj-$(CONFIG_MICREL_PHY) += micrel.o
|
||||
obj-$(CONFIG_MDIO_OCTEON) += mdio-octeon.o
|
||||
|
@@ -130,3 +130,11 @@ static void __exit bcm63xx_phy_exit(void)
|
||||
|
||||
module_init(bcm63xx_phy_init);
|
||||
module_exit(bcm63xx_phy_exit);
|
||||
|
||||
static struct mdio_device_id bcm63xx_tbl[] = {
|
||||
{ 0x00406000, 0xfffffc00 },
|
||||
{ 0x002bdc00, 0xfffffc00 },
|
||||
{ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(mdio, bcm63xx_tbl);
|
||||
|
@@ -908,3 +908,19 @@ static void __exit broadcom_exit(void)
|
||||
|
||||
module_init(broadcom_init);
|
||||
module_exit(broadcom_exit);
|
||||
|
||||
static struct mdio_device_id broadcom_tbl[] = {
|
||||
{ 0x00206070, 0xfffffff0 },
|
||||
{ 0x002060e0, 0xfffffff0 },
|
||||
{ 0x002060c0, 0xfffffff0 },
|
||||
{ 0x002060b0, 0xfffffff0 },
|
||||
{ 0x0143bca0, 0xfffffff0 },
|
||||
{ 0x0143bcb0, 0xfffffff0 },
|
||||
{ PHY_ID_BCM50610, 0xfffffff0 },
|
||||
{ PHY_ID_BCM50610M, 0xfffffff0 },
|
||||
{ PHY_ID_BCM57780, 0xfffffff0 },
|
||||
{ PHY_ID_BCMAC131, 0xfffffff0 },
|
||||
{ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(mdio, broadcom_tbl);
|
||||
|
@@ -158,3 +158,11 @@ static void __exit cicada_exit(void)
|
||||
|
||||
module_init(cicada_init);
|
||||
module_exit(cicada_exit);
|
||||
|
||||
static struct mdio_device_id cicada_tbl[] = {
|
||||
{ 0x000fc410, 0x000ffff0 },
|
||||
{ 0x000fc440, 0x000fffc0 },
|
||||
{ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(mdio, cicada_tbl);
|
||||
|
@@ -218,3 +218,12 @@ static void __exit davicom_exit(void)
|
||||
|
||||
module_init(davicom_init);
|
||||
module_exit(davicom_exit);
|
||||
|
||||
static struct mdio_device_id davicom_tbl[] = {
|
||||
{ 0x0181b880, 0x0ffffff0 },
|
||||
{ 0x0181b8a0, 0x0ffffff0 },
|
||||
{ 0x00181b80, 0x0ffffff0 },
|
||||
{ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(mdio, davicom_tbl);
|
||||
|
@@ -110,3 +110,10 @@ static void __exit et1011c_exit(void)
|
||||
|
||||
module_init(et1011c_init);
|
||||
module_exit(et1011c_exit);
|
||||
|
||||
static struct mdio_device_id et1011c_tbl[] = {
|
||||
{ 0x0282f014, 0xfffffff0 },
|
||||
{ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(mdio, et1011c_tbl);
|
||||
|
@@ -131,3 +131,10 @@ static void __exit ip175c_exit(void)
|
||||
|
||||
module_init(ip175c_init);
|
||||
module_exit(ip175c_exit);
|
||||
|
||||
static struct mdio_device_id icplus_tbl[] = {
|
||||
{ 0x02430d80, 0x0ffffff0 },
|
||||
{ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(mdio, icplus_tbl);
|
||||
|
@@ -173,3 +173,11 @@ static void __exit lxt_exit(void)
|
||||
|
||||
module_init(lxt_init);
|
||||
module_exit(lxt_exit);
|
||||
|
||||
static struct mdio_device_id lxt_tbl[] = {
|
||||
{ 0x78100000, 0xfffffff0 },
|
||||
{ 0x001378e0, 0xfffffff0 },
|
||||
{ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(mdio, lxt_tbl);
|
||||
|
@@ -648,3 +648,16 @@ static void __exit marvell_exit(void)
|
||||
|
||||
module_init(marvell_init);
|
||||
module_exit(marvell_exit);
|
||||
|
||||
static struct mdio_device_id marvell_tbl[] = {
|
||||
{ 0x01410c60, 0xfffffff0 },
|
||||
{ 0x01410c90, 0xfffffff0 },
|
||||
{ 0x01410cc0, 0xfffffff0 },
|
||||
{ 0x01410e10, 0xfffffff0 },
|
||||
{ 0x01410cb0, 0xfffffff0 },
|
||||
{ 0x01410cd0, 0xfffffff0 },
|
||||
{ 0x01410e30, 0xfffffff0 },
|
||||
{ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(mdio, marvell_tbl);
|
||||
|
@@ -22,8 +22,13 @@
|
||||
#include <linux/types.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#define MDIO_READ 1
|
||||
#define MDIO_WRITE 0
|
||||
#define MDIO_READ 2
|
||||
#define MDIO_WRITE 1
|
||||
|
||||
#define MDIO_C45 (1<<15)
|
||||
#define MDIO_C45_ADDR (MDIO_C45 | 0)
|
||||
#define MDIO_C45_READ (MDIO_C45 | 3)
|
||||
#define MDIO_C45_WRITE (MDIO_C45 | 1)
|
||||
|
||||
#define MDIO_SETUP_TIME 10
|
||||
#define MDIO_HOLD_TIME 10
|
||||
@@ -89,7 +94,7 @@ static u16 mdiobb_get_num(struct mdiobb_ctrl *ctrl, int bits)
|
||||
/* Utility to send the preamble, address, and
|
||||
* register (common to read and write).
|
||||
*/
|
||||
static void mdiobb_cmd(struct mdiobb_ctrl *ctrl, int read, u8 phy, u8 reg)
|
||||
static void mdiobb_cmd(struct mdiobb_ctrl *ctrl, int op, u8 phy, u8 reg)
|
||||
{
|
||||
const struct mdiobb_ops *ops = ctrl->ops;
|
||||
int i;
|
||||
@@ -108,23 +113,56 @@ static void mdiobb_cmd(struct mdiobb_ctrl *ctrl, int read, u8 phy, u8 reg)
|
||||
for (i = 0; i < 32; i++)
|
||||
mdiobb_send_bit(ctrl, 1);
|
||||
|
||||
/* send the start bit (01) and the read opcode (10) or write (10) */
|
||||
/* send the start bit (01) and the read opcode (10) or write (10).
|
||||
Clause 45 operation uses 00 for the start and 11, 10 for
|
||||
read/write */
|
||||
mdiobb_send_bit(ctrl, 0);
|
||||
mdiobb_send_bit(ctrl, 1);
|
||||
mdiobb_send_bit(ctrl, read);
|
||||
mdiobb_send_bit(ctrl, !read);
|
||||
if (op & MDIO_C45)
|
||||
mdiobb_send_bit(ctrl, 0);
|
||||
else
|
||||
mdiobb_send_bit(ctrl, 1);
|
||||
mdiobb_send_bit(ctrl, (op >> 1) & 1);
|
||||
mdiobb_send_bit(ctrl, (op >> 0) & 1);
|
||||
|
||||
mdiobb_send_num(ctrl, phy, 5);
|
||||
mdiobb_send_num(ctrl, reg, 5);
|
||||
}
|
||||
|
||||
/* In clause 45 mode all commands are prefixed by MDIO_ADDR to specify the
|
||||
lower 16 bits of the 21 bit address. This transfer is done identically to a
|
||||
MDIO_WRITE except for a different code. To enable clause 45 mode or
|
||||
MII_ADDR_C45 into the address. Theoretically clause 45 and normal devices
|
||||
can exist on the same bus. Normal devices should ignore the MDIO_ADDR
|
||||
phase. */
|
||||
static int mdiobb_cmd_addr(struct mdiobb_ctrl *ctrl, int phy, u32 addr)
|
||||
{
|
||||
unsigned int dev_addr = (addr >> 16) & 0x1F;
|
||||
unsigned int reg = addr & 0xFFFF;
|
||||
mdiobb_cmd(ctrl, MDIO_C45_ADDR, phy, dev_addr);
|
||||
|
||||
/* send the turnaround (10) */
|
||||
mdiobb_send_bit(ctrl, 1);
|
||||
mdiobb_send_bit(ctrl, 0);
|
||||
|
||||
mdiobb_send_num(ctrl, reg, 16);
|
||||
|
||||
ctrl->ops->set_mdio_dir(ctrl, 0);
|
||||
mdiobb_get_bit(ctrl);
|
||||
|
||||
return dev_addr;
|
||||
}
|
||||
|
||||
static int mdiobb_read(struct mii_bus *bus, int phy, int reg)
|
||||
{
|
||||
struct mdiobb_ctrl *ctrl = bus->priv;
|
||||
int ret, i;
|
||||
|
||||
mdiobb_cmd(ctrl, MDIO_READ, phy, reg);
|
||||
if (reg & MII_ADDR_C45) {
|
||||
reg = mdiobb_cmd_addr(ctrl, phy, reg);
|
||||
mdiobb_cmd(ctrl, MDIO_C45_READ, phy, reg);
|
||||
} else
|
||||
mdiobb_cmd(ctrl, MDIO_READ, phy, reg);
|
||||
|
||||
ctrl->ops->set_mdio_dir(ctrl, 0);
|
||||
|
||||
/* check the turnaround bit: the PHY should be driving it to zero */
|
||||
@@ -147,7 +185,11 @@ static int mdiobb_write(struct mii_bus *bus, int phy, int reg, u16 val)
|
||||
{
|
||||
struct mdiobb_ctrl *ctrl = bus->priv;
|
||||
|
||||
mdiobb_cmd(ctrl, MDIO_WRITE, phy, reg);
|
||||
if (reg & MII_ADDR_C45) {
|
||||
reg = mdiobb_cmd_addr(ctrl, phy, reg);
|
||||
mdiobb_cmd(ctrl, MDIO_C45_WRITE, phy, reg);
|
||||
} else
|
||||
mdiobb_cmd(ctrl, MDIO_WRITE, phy, reg);
|
||||
|
||||
/* send the turnaround (10) */
|
||||
mdiobb_send_bit(ctrl, 1);
|
||||
|
@@ -88,6 +88,7 @@ static int octeon_mdiobus_write(struct mii_bus *bus, int phy_id,
|
||||
static int __init octeon_mdiobus_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct octeon_mdiobus *bus;
|
||||
union cvmx_smix_en smi_en;
|
||||
int i;
|
||||
int err = -ENOENT;
|
||||
|
||||
@@ -103,6 +104,10 @@ static int __init octeon_mdiobus_probe(struct platform_device *pdev)
|
||||
if (!bus->mii_bus)
|
||||
goto err;
|
||||
|
||||
smi_en.u64 = 0;
|
||||
smi_en.s.en = 1;
|
||||
cvmx_write_csr(CVMX_SMIX_EN(bus->unit), smi_en.u64);
|
||||
|
||||
/*
|
||||
* Standard Octeon evaluation boards don't support phy
|
||||
* interrupts, we need to poll.
|
||||
@@ -133,17 +138,22 @@ err_register:
|
||||
|
||||
err:
|
||||
devm_kfree(&pdev->dev, bus);
|
||||
smi_en.u64 = 0;
|
||||
cvmx_write_csr(CVMX_SMIX_EN(bus->unit), smi_en.u64);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __exit octeon_mdiobus_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct octeon_mdiobus *bus;
|
||||
union cvmx_smix_en smi_en;
|
||||
|
||||
bus = dev_get_drvdata(&pdev->dev);
|
||||
|
||||
mdiobus_unregister(bus->mii_bus);
|
||||
mdiobus_free(bus->mii_bus);
|
||||
smi_en.u64 = 0;
|
||||
cvmx_write_csr(CVMX_SMIX_EN(bus->unit), smi_en.u64);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -208,7 +208,7 @@ EXPORT_SYMBOL(mdiobus_scan);
|
||||
* because the bus read/write functions may wait for an interrupt
|
||||
* to conclude the operation.
|
||||
*/
|
||||
int mdiobus_read(struct mii_bus *bus, int addr, u16 regnum)
|
||||
int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum)
|
||||
{
|
||||
int retval;
|
||||
|
||||
@@ -233,7 +233,7 @@ EXPORT_SYMBOL(mdiobus_read);
|
||||
* because the bus read/write functions may wait for an interrupt
|
||||
* to conclude the operation.
|
||||
*/
|
||||
int mdiobus_write(struct mii_bus *bus, int addr, u16 regnum, u16 val)
|
||||
int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val)
|
||||
{
|
||||
int err;
|
||||
|
||||
|
114
drivers/net/phy/micrel.c
Normal file
114
drivers/net/phy/micrel.c
Normal file
@@ -0,0 +1,114 @@
|
||||
/*
|
||||
* drivers/net/phy/micrel.c
|
||||
*
|
||||
* Driver for Micrel PHYs
|
||||
*
|
||||
* Author: David J. Choi
|
||||
*
|
||||
* Copyright (c) 2010 Micrel, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* Support : ksz9021 , vsc8201, ks8001
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/phy.h>
|
||||
|
||||
#define PHY_ID_KSZ9021 0x00221611
|
||||
#define PHY_ID_VSC8201 0x000FC413
|
||||
#define PHY_ID_KS8001 0x0022161A
|
||||
|
||||
|
||||
static int kszphy_config_init(struct phy_device *phydev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static struct phy_driver ks8001_driver = {
|
||||
.phy_id = PHY_ID_KS8001,
|
||||
.name = "Micrel KS8001",
|
||||
.phy_id_mask = 0x00fffff0,
|
||||
.features = PHY_BASIC_FEATURES,
|
||||
.flags = PHY_POLL,
|
||||
.config_init = kszphy_config_init,
|
||||
.config_aneg = genphy_config_aneg,
|
||||
.read_status = genphy_read_status,
|
||||
.driver = { .owner = THIS_MODULE,},
|
||||
};
|
||||
|
||||
static struct phy_driver vsc8201_driver = {
|
||||
.phy_id = PHY_ID_VSC8201,
|
||||
.name = "Micrel VSC8201",
|
||||
.phy_id_mask = 0x00fffff0,
|
||||
.features = PHY_BASIC_FEATURES,
|
||||
.flags = PHY_POLL,
|
||||
.config_init = kszphy_config_init,
|
||||
.config_aneg = genphy_config_aneg,
|
||||
.read_status = genphy_read_status,
|
||||
.driver = { .owner = THIS_MODULE,},
|
||||
};
|
||||
|
||||
static struct phy_driver ksz9021_driver = {
|
||||
.phy_id = PHY_ID_KSZ9021,
|
||||
.phy_id_mask = 0x000fff10,
|
||||
.name = "Micrel KSZ9021 Gigabit PHY",
|
||||
.features = PHY_GBIT_FEATURES | SUPPORTED_Pause,
|
||||
.flags = PHY_POLL,
|
||||
.config_init = kszphy_config_init,
|
||||
.config_aneg = genphy_config_aneg,
|
||||
.read_status = genphy_read_status,
|
||||
.driver = { .owner = THIS_MODULE, },
|
||||
};
|
||||
|
||||
static int __init ksphy_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = phy_driver_register(&ks8001_driver);
|
||||
if (ret)
|
||||
goto err1;
|
||||
ret = phy_driver_register(&vsc8201_driver);
|
||||
if (ret)
|
||||
goto err2;
|
||||
|
||||
ret = phy_driver_register(&ksz9021_driver);
|
||||
if (ret)
|
||||
goto err3;
|
||||
return 0;
|
||||
|
||||
err3:
|
||||
phy_driver_unregister(&vsc8201_driver);
|
||||
err2:
|
||||
phy_driver_unregister(&ks8001_driver);
|
||||
err1:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit ksphy_exit(void)
|
||||
{
|
||||
phy_driver_unregister(&ks8001_driver);
|
||||
phy_driver_unregister(&vsc8201_driver);
|
||||
phy_driver_unregister(&ksz9021_driver);
|
||||
}
|
||||
|
||||
module_init(ksphy_init);
|
||||
module_exit(ksphy_exit);
|
||||
|
||||
MODULE_DESCRIPTION("Micrel PHY driver");
|
||||
MODULE_AUTHOR("David J. Choi");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static struct mdio_device_id micrel_tbl[] = {
|
||||
{ PHY_ID_KSZ9021, 0x000fff10 },
|
||||
{ PHY_ID_VSC8201, 0x00fffff0 },
|
||||
{ PHY_ID_KS8001, 0x00fffff0 },
|
||||
{ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(mdio, micrel_tbl);
|
@@ -97,7 +97,6 @@ static void ns_giga_speed_fallback(struct phy_device *phydev, int mode)
|
||||
phy_write(phydev, NS_EXP_MEM_DATA, 0x0008);
|
||||
phy_write(phydev, MII_BMCR, (bmcr & ~BMCR_PDOWN));
|
||||
phy_write(phydev, LED_CTRL_REG, mode);
|
||||
return;
|
||||
}
|
||||
|
||||
static void ns_10_base_t_hdx_loopack(struct phy_device *phydev, int disable)
|
||||
@@ -110,8 +109,6 @@ static void ns_10_base_t_hdx_loopack(struct phy_device *phydev, int disable)
|
||||
|
||||
printk(KERN_DEBUG "DP83865 PHY: 10BASE-T HDX loopback %s\n",
|
||||
(ns_exp_read(phydev, 0x1c0) & 0x0001) ? "off" : "on");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static int ns_config_init(struct phy_device *phydev)
|
||||
@@ -153,3 +150,10 @@ MODULE_LICENSE("GPL");
|
||||
|
||||
module_init(ns_init);
|
||||
module_exit(ns_exit);
|
||||
|
||||
static struct mdio_device_id ns_tbl[] = {
|
||||
{ DP83865_PHY_ID, 0xfffffff0 },
|
||||
{ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(mdio, ns_tbl);
|
||||
|
@@ -149,6 +149,7 @@ EXPORT_SYMBOL(phy_scan_fixups);
|
||||
struct phy_device* phy_device_create(struct mii_bus *bus, int addr, int phy_id)
|
||||
{
|
||||
struct phy_device *dev;
|
||||
|
||||
/* We allocate the device, and initialize the
|
||||
* default values */
|
||||
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
|
||||
@@ -179,6 +180,17 @@ struct phy_device* phy_device_create(struct mii_bus *bus, int addr, int phy_id)
|
||||
mutex_init(&dev->lock);
|
||||
INIT_DELAYED_WORK(&dev->state_queue, phy_state_machine);
|
||||
|
||||
/* Request the appropriate module unconditionally; don't
|
||||
bother trying to do so only if it isn't already loaded,
|
||||
because that gets complicated. A hotplug event would have
|
||||
done an unconditional modprobe anyway.
|
||||
We don't do normal hotplug because it won't work for MDIO
|
||||
-- because it relies on the device staying around for long
|
||||
enough for the driver to get loaded. With MDIO, the NIC
|
||||
driver will get bored and give up as soon as it finds that
|
||||
there's no driver _already_ loaded. */
|
||||
request_module(MDIO_MODULE_PREFIX MDIO_ID_FMT, MDIO_ID_ARGS(phy_id));
|
||||
|
||||
return dev;
|
||||
}
|
||||
EXPORT_SYMBOL(phy_device_create);
|
||||
|
@@ -137,3 +137,10 @@ static void __exit qs6612_exit(void)
|
||||
|
||||
module_init(qs6612_init);
|
||||
module_exit(qs6612_exit);
|
||||
|
||||
static struct mdio_device_id qs6612_tbl[] = {
|
||||
{ 0x00181440, 0xfffffff0 },
|
||||
{ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(mdio, qs6612_tbl);
|
||||
|
@@ -78,3 +78,10 @@ static void __exit realtek_exit(void)
|
||||
|
||||
module_init(realtek_init);
|
||||
module_exit(realtek_exit);
|
||||
|
||||
static struct mdio_device_id realtek_tbl[] = {
|
||||
{ 0x001cc912, 0x001fffff },
|
||||
{ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(mdio, realtek_tbl);
|
||||
|
@@ -253,3 +253,14 @@ MODULE_LICENSE("GPL");
|
||||
|
||||
module_init(smsc_init);
|
||||
module_exit(smsc_exit);
|
||||
|
||||
static struct mdio_device_id smsc_tbl[] = {
|
||||
{ 0x0007c0a0, 0xfffffff0 },
|
||||
{ 0x0007c0b0, 0xfffffff0 },
|
||||
{ 0x0007c0c0, 0xfffffff0 },
|
||||
{ 0x0007c0d0, 0xfffffff0 },
|
||||
{ 0x0007c0f0, 0xfffffff0 },
|
||||
{ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(mdio, smsc_tbl);
|
||||
|
@@ -132,6 +132,14 @@ static void __exit ste10Xp_exit(void)
|
||||
module_init(ste10Xp_init);
|
||||
module_exit(ste10Xp_exit);
|
||||
|
||||
static struct mdio_device_id ste10Xp_tbl[] = {
|
||||
{ STE101P_PHY_ID, 0xfffffff0 },
|
||||
{ STE100P_PHY_ID, 0xffffffff },
|
||||
{ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(mdio, ste10Xp_tbl);
|
||||
|
||||
MODULE_DESCRIPTION("STMicroelectronics STe10Xp PHY driver");
|
||||
MODULE_AUTHOR("Giuseppe Cavallaro <peppe.cavallaro@st.com>");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@@ -191,3 +191,11 @@ static void __exit vsc82xx_exit(void)
|
||||
|
||||
module_init(vsc82xx_init);
|
||||
module_exit(vsc82xx_exit);
|
||||
|
||||
static struct mdio_device_id vitesse_tbl[] = {
|
||||
{ PHY_ID_VSC8244, 0x000fffc0 },
|
||||
{ PHY_ID_VSC8221, 0x000ffff0 },
|
||||
{ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(mdio, vitesse_tbl);
|
||||
|
Reference in New Issue
Block a user