mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-06 02:50:43 +00:00
dsa: Add mdio device support to Marvell switches
Allow Marvell switches to be mdio devices. Currently the driver just allocate the private structure and detects what device is on the bus. Later patches will make them register with the DSA framework. Signed-off-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
fcdce7d075
commit
14c7b3c387
2 changed files with 99 additions and 18 deletions
27
Documentation/devicetree/bindings/net/dsa/marvell.txt
Normal file
27
Documentation/devicetree/bindings/net/dsa/marvell.txt
Normal file
|
@ -0,0 +1,27 @@
|
|||
Marvell DSA Switch Device Tree Bindings
|
||||
---------------------------------------
|
||||
|
||||
WARNING: This binding is currently unstable. Do not program it into a
|
||||
FLASH never to be changed again. Once this binding is stable, this
|
||||
warning will be removed.
|
||||
|
||||
If you need a stable binding, use the old dsa.txt binding.
|
||||
|
||||
Marvell Switches are MDIO devices. The following properties should be
|
||||
placed as a child node of an mdio device.
|
||||
|
||||
Required properties:
|
||||
- compatible : Should be one of "marvell,mv88e6085",
|
||||
- reg : Address on the MII bus for the switch.
|
||||
|
||||
Example:
|
||||
|
||||
mdio {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
switch0: switch@0 {
|
||||
compatible = "marvell,mv88e6085";
|
||||
reg = <0>;
|
||||
};
|
||||
};
|
|
@ -5,6 +5,8 @@
|
|||
* Copyright (c) 2015 CMC Electronics, Inc.
|
||||
* Added support for VLAN Table Unit operations
|
||||
*
|
||||
* Copyright (c) 2016 Andrew Lunn <andrew@lunn.ch>
|
||||
*
|
||||
* 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
|
||||
|
@ -17,6 +19,7 @@
|
|||
#include <linux/if_bridge.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/mdio.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
|
@ -3625,36 +3628,87 @@ struct dsa_switch_driver mv88e6xxx_switch_driver = {
|
|||
.port_fdb_dump = mv88e6xxx_port_fdb_dump,
|
||||
};
|
||||
|
||||
int mv88e6xxx_probe(struct mdio_device *mdiodev)
|
||||
{
|
||||
struct device *dev = &mdiodev->dev;
|
||||
struct mv88e6xxx_priv_state *ps;
|
||||
int id, prod_num, rev;
|
||||
struct dsa_switch *ds;
|
||||
|
||||
ds = devm_kzalloc(dev, sizeof(*ds) + sizeof(*ps), GFP_KERNEL);
|
||||
if (!ds)
|
||||
return -ENOMEM;
|
||||
|
||||
ps = (struct mv88e6xxx_priv_state *)(ds + 1);
|
||||
ds->priv = ps;
|
||||
ps->dev = dev;
|
||||
ps->ds = ds;
|
||||
ps->bus = mdiodev->bus;
|
||||
ps->sw_addr = mdiodev->addr;
|
||||
mutex_init(&ps->smi_mutex);
|
||||
|
||||
get_device(&ps->bus->dev);
|
||||
|
||||
ds->drv = &mv88e6xxx_switch_driver;
|
||||
|
||||
id = mv88e6xxx_reg_read(ps, REG_PORT(0), PORT_SWITCH_ID);
|
||||
if (id < 0)
|
||||
return id;
|
||||
|
||||
prod_num = (id & 0xfff0) >> 4;
|
||||
rev = id & 0x000f;
|
||||
|
||||
ps->info = mv88e6xxx_lookup_info(prod_num, mv88e6xxx_table,
|
||||
ARRAY_SIZE(mv88e6xxx_table));
|
||||
if (!ps->info)
|
||||
return -ENODEV;
|
||||
|
||||
dev_set_drvdata(dev, ds);
|
||||
|
||||
dev_info(dev, "switch 0x%x probed: %s, revision %u\n",
|
||||
prod_num, ps->info->name, rev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mv88e6xxx_remove(struct mdio_device *mdiodev)
|
||||
{
|
||||
struct dsa_switch *ds = dev_get_drvdata(&mdiodev->dev);
|
||||
struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
|
||||
|
||||
put_device(&ps->bus->dev);
|
||||
}
|
||||
|
||||
static const struct of_device_id mv88e6xxx_of_match[] = {
|
||||
{ .compatible = "marvell,mv88e6085" },
|
||||
{ /* sentinel */ },
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(of, mv88e6xxx_of_match);
|
||||
|
||||
static struct mdio_driver mv88e6xxx_driver = {
|
||||
.probe = mv88e6xxx_probe,
|
||||
.remove = mv88e6xxx_remove,
|
||||
.mdiodrv.driver = {
|
||||
.name = "mv88e6085",
|
||||
.of_match_table = mv88e6xxx_of_match,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init mv88e6xxx_init(void)
|
||||
{
|
||||
register_switch_driver(&mv88e6xxx_switch_driver);
|
||||
|
||||
return 0;
|
||||
return mdio_driver_register(&mv88e6xxx_driver);
|
||||
}
|
||||
module_init(mv88e6xxx_init);
|
||||
|
||||
static void __exit mv88e6xxx_cleanup(void)
|
||||
{
|
||||
mdio_driver_unregister(&mv88e6xxx_driver);
|
||||
unregister_switch_driver(&mv88e6xxx_switch_driver);
|
||||
}
|
||||
module_exit(mv88e6xxx_cleanup);
|
||||
|
||||
MODULE_ALIAS("platform:mv88e6085");
|
||||
MODULE_ALIAS("platform:mv88e6095");
|
||||
MODULE_ALIAS("platform:mv88e6095f");
|
||||
MODULE_ALIAS("platform:mv88e6123");
|
||||
MODULE_ALIAS("platform:mv88e6131");
|
||||
MODULE_ALIAS("platform:mv88e6161");
|
||||
MODULE_ALIAS("platform:mv88e6165");
|
||||
MODULE_ALIAS("platform:mv88e6171");
|
||||
MODULE_ALIAS("platform:mv88e6172");
|
||||
MODULE_ALIAS("platform:mv88e6175");
|
||||
MODULE_ALIAS("platform:mv88e6176");
|
||||
MODULE_ALIAS("platform:mv88e6320");
|
||||
MODULE_ALIAS("platform:mv88e6321");
|
||||
MODULE_ALIAS("platform:mv88e6350");
|
||||
MODULE_ALIAS("platform:mv88e6351");
|
||||
MODULE_ALIAS("platform:mv88e6352");
|
||||
MODULE_AUTHOR("Lennert Buytenhek <buytenh@wantstofly.org>");
|
||||
MODULE_DESCRIPTION("Driver for Marvell 88E6XXX ethernet switch chips");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
Loading…
Reference in a new issue