Blame view
drivers/net/phy/mdio-octeon.c
2.83 KB
8bbe833a6 net: phy: Add SDP... |
1 |
// SPDX-License-Identifier: GPL-2.0 |
25d967b72 NET: Add driver f... |
2 |
/* |
1eefee901 phy: mdio-octeon:... |
3 |
* Copyright (C) 2009-2015 Cavium, Inc. |
25d967b72 NET: Add driver f... |
4 |
*/ |
25d967b72 NET: Add driver f... |
5 |
#include <linux/platform_device.h> |
a6d678645 net: mdio-octeon:... |
6 |
#include <linux/of_address.h> |
2fd46f47b netdev: mdio-octe... |
7 |
#include <linux/of_mdio.h> |
2fd46f47b netdev: mdio-octe... |
8 |
#include <linux/module.h> |
2fd46f47b netdev: mdio-octe... |
9 |
#include <linux/gfp.h> |
25d967b72 NET: Add driver f... |
10 |
#include <linux/phy.h> |
2fd46f47b netdev: mdio-octe... |
11 |
#include <linux/io.h> |
25d967b72 NET: Add driver f... |
12 |
|
1eefee901 phy: mdio-octeon:... |
13 |
#include "mdio-cavium.h" |
25d967b72 NET: Add driver f... |
14 |
|
633d15949 net/phy: remove _... |
15 |
static int octeon_mdiobus_probe(struct platform_device *pdev) |
25d967b72 NET: Add driver f... |
16 |
{ |
1eefee901 phy: mdio-octeon:... |
17 |
struct cavium_mdiobus *bus; |
35d2aeac9 phy: mdio-octeon:... |
18 |
struct mii_bus *mii_bus; |
2fd46f47b netdev: mdio-octe... |
19 |
struct resource *res_mem; |
1eefee901 phy: mdio-octeon:... |
20 21 |
resource_size_t mdio_phys; resource_size_t regsize; |
6c17812d6 NET: mdio-octeon:... |
22 |
union cvmx_smix_en smi_en; |
25d967b72 NET: Add driver f... |
23 |
int err = -ENOENT; |
35d2aeac9 phy: mdio-octeon:... |
24 25 |
mii_bus = devm_mdiobus_alloc_size(&pdev->dev, sizeof(*bus)); if (!mii_bus) |
25d967b72 NET: Add driver f... |
26 |
return -ENOMEM; |
2fd46f47b netdev: mdio-octe... |
27 |
res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
2fd46f47b netdev: mdio-octe... |
28 29 30 |
if (res_mem == NULL) { dev_err(&pdev->dev, "found no memory resource "); |
de9e397e4 net: mdio-octeon:... |
31 |
return -ENXIO; |
2fd46f47b netdev: mdio-octe... |
32 |
} |
de9e397e4 net: mdio-octeon:... |
33 |
|
35d2aeac9 phy: mdio-octeon:... |
34 35 |
bus = mii_bus->priv; bus->mii_bus = mii_bus; |
1eefee901 phy: mdio-octeon:... |
36 37 |
mdio_phys = res_mem->start; regsize = resource_size(res_mem); |
de9e397e4 net: mdio-octeon:... |
38 |
|
1eefee901 phy: mdio-octeon:... |
39 |
if (!devm_request_mem_region(&pdev->dev, mdio_phys, regsize, |
2fd46f47b netdev: mdio-octe... |
40 41 42 |
res_mem->name)) { dev_err(&pdev->dev, "request_mem_region failed "); |
de9e397e4 net: mdio-octeon:... |
43 |
return -ENXIO; |
2fd46f47b netdev: mdio-octe... |
44 |
} |
de9e397e4 net: mdio-octeon:... |
45 |
|
2fd46f47b netdev: mdio-octe... |
46 |
bus->register_base = |
1eefee901 phy: mdio-octeon:... |
47 |
(u64)devm_ioremap(&pdev->dev, mdio_phys, regsize); |
de9e397e4 net: mdio-octeon:... |
48 49 50 51 52 |
if (!bus->register_base) { dev_err(&pdev->dev, "dev_ioremap failed "); return -ENOMEM; } |
25d967b72 NET: Add driver f... |
53 |
|
6c17812d6 NET: mdio-octeon:... |
54 55 |
smi_en.u64 = 0; smi_en.s.en = 1; |
a6d678645 net: mdio-octeon:... |
56 |
oct_mdio_writeq(smi_en.u64, bus->register_base + SMI_EN); |
25d967b72 NET: Add driver f... |
57 |
|
1eefee901 phy: mdio-octeon:... |
58 |
bus->mii_bus->name = KBUILD_MODNAME; |
2fd46f47b netdev: mdio-octe... |
59 |
snprintf(bus->mii_bus->id, MII_BUS_ID_SIZE, "%llx", bus->register_base); |
25d967b72 NET: Add driver f... |
60 |
bus->mii_bus->parent = &pdev->dev; |
1eefee901 phy: mdio-octeon:... |
61 62 |
bus->mii_bus->read = cavium_mdiobus_read; bus->mii_bus->write = cavium_mdiobus_write; |
25d967b72 NET: Add driver f... |
63 |
|
f8825669b net: phy: mdio-oc... |
64 |
platform_set_drvdata(pdev, bus); |
25d967b72 NET: Add driver f... |
65 |
|
2fd46f47b netdev: mdio-octe... |
66 |
err = of_mdiobus_register(bus->mii_bus, pdev->dev.of_node); |
25d967b72 NET: Add driver f... |
67 |
if (err) |
2fd46f47b netdev: mdio-octe... |
68 |
goto fail_register; |
25d967b72 NET: Add driver f... |
69 |
|
1eefee901 phy: mdio-octeon:... |
70 71 |
dev_info(&pdev->dev, "Probed "); |
25d967b72 NET: Add driver f... |
72 73 |
return 0; |
2fd46f47b netdev: mdio-octe... |
74 |
fail_register: |
25d967b72 NET: Add driver f... |
75 |
mdiobus_free(bus->mii_bus); |
6c17812d6 NET: mdio-octeon:... |
76 |
smi_en.u64 = 0; |
a6d678645 net: mdio-octeon:... |
77 |
oct_mdio_writeq(smi_en.u64, bus->register_base + SMI_EN); |
25d967b72 NET: Add driver f... |
78 79 |
return err; } |
633d15949 net/phy: remove _... |
80 |
static int octeon_mdiobus_remove(struct platform_device *pdev) |
25d967b72 NET: Add driver f... |
81 |
{ |
1eefee901 phy: mdio-octeon:... |
82 |
struct cavium_mdiobus *bus; |
6c17812d6 NET: mdio-octeon:... |
83 |
union cvmx_smix_en smi_en; |
25d967b72 NET: Add driver f... |
84 |
|
2c0c4fbe5 net: mdio-octeon:... |
85 |
bus = platform_get_drvdata(pdev); |
25d967b72 NET: Add driver f... |
86 87 88 |
mdiobus_unregister(bus->mii_bus); mdiobus_free(bus->mii_bus); |
6c17812d6 NET: mdio-octeon:... |
89 |
smi_en.u64 = 0; |
a6d678645 net: mdio-octeon:... |
90 |
oct_mdio_writeq(smi_en.u64, bus->register_base + SMI_EN); |
25d967b72 NET: Add driver f... |
91 92 |
return 0; } |
d8a7dadbd net: phy: constif... |
93 |
static const struct of_device_id octeon_mdiobus_match[] = { |
2fd46f47b netdev: mdio-octe... |
94 95 96 97 98 99 |
{ .compatible = "cavium,octeon-3860-mdio", }, {}, }; MODULE_DEVICE_TABLE(of, octeon_mdiobus_match); |
25d967b72 NET: Add driver f... |
100 101 |
static struct platform_driver octeon_mdiobus_driver = { .driver = { |
1eefee901 phy: mdio-octeon:... |
102 |
.name = KBUILD_MODNAME, |
2fd46f47b netdev: mdio-octe... |
103 |
.of_match_table = octeon_mdiobus_match, |
25d967b72 NET: Add driver f... |
104 105 |
}, .probe = octeon_mdiobus_probe, |
633d15949 net/phy: remove _... |
106 |
.remove = octeon_mdiobus_remove, |
25d967b72 NET: Add driver f... |
107 108 109 110 111 112 113 |
}; void octeon_mdiobus_force_mod_depencency(void) { /* Let ethernet drivers force us to be loaded. */ } EXPORT_SYMBOL(octeon_mdiobus_force_mod_depencency); |
9fad0c941 net: mdio-octeon:... |
114 |
module_platform_driver(octeon_mdiobus_driver); |
25d967b72 NET: Add driver f... |
115 |
|
1eefee901 phy: mdio-octeon:... |
116 |
MODULE_DESCRIPTION("Cavium OCTEON MDIO bus driver"); |
25d967b72 NET: Add driver f... |
117 |
MODULE_AUTHOR("David Daney"); |
8bbe833a6 net: phy: Add SDP... |
118 |
MODULE_LICENSE("GPL v2"); |