Blame view

drivers/net/phy/mdio-octeon.c 2.83 KB
8bbe833a6   Andrew Lunn   net: phy: Add SDP...
1
  // SPDX-License-Identifier: GPL-2.0
25d967b72   David Daney   NET: Add driver f...
2
  /*
1eefee901   David Daney   phy: mdio-octeon:...
3
   * Copyright (C) 2009-2015 Cavium, Inc.
25d967b72   David Daney   NET: Add driver f...
4
   */
25d967b72   David Daney   NET: Add driver f...
5
  #include <linux/platform_device.h>
a6d678645   Radha Mohan Chintakuntla   net: mdio-octeon:...
6
  #include <linux/of_address.h>
2fd46f47b   David Daney   netdev: mdio-octe...
7
  #include <linux/of_mdio.h>
2fd46f47b   David Daney   netdev: mdio-octe...
8
  #include <linux/module.h>
2fd46f47b   David Daney   netdev: mdio-octe...
9
  #include <linux/gfp.h>
25d967b72   David Daney   NET: Add driver f...
10
  #include <linux/phy.h>
2fd46f47b   David Daney   netdev: mdio-octe...
11
  #include <linux/io.h>
25d967b72   David Daney   NET: Add driver f...
12

1eefee901   David Daney   phy: mdio-octeon:...
13
  #include "mdio-cavium.h"
25d967b72   David Daney   NET: Add driver f...
14

633d15949   Bill Pemberton   net/phy: remove _...
15
  static int octeon_mdiobus_probe(struct platform_device *pdev)
25d967b72   David Daney   NET: Add driver f...
16
  {
1eefee901   David Daney   phy: mdio-octeon:...
17
  	struct cavium_mdiobus *bus;
35d2aeac9   Andrew Lunn   phy: mdio-octeon:...
18
  	struct mii_bus *mii_bus;
2fd46f47b   David Daney   netdev: mdio-octe...
19
  	struct resource *res_mem;
1eefee901   David Daney   phy: mdio-octeon:...
20
21
  	resource_size_t mdio_phys;
  	resource_size_t regsize;
6c17812d6   David Daney   NET: mdio-octeon:...
22
  	union cvmx_smix_en smi_en;
25d967b72   David Daney   NET: Add driver f...
23
  	int err = -ENOENT;
35d2aeac9   Andrew Lunn   phy: mdio-octeon:...
24
25
  	mii_bus = devm_mdiobus_alloc_size(&pdev->dev, sizeof(*bus));
  	if (!mii_bus)
25d967b72   David Daney   NET: Add driver f...
26
  		return -ENOMEM;
2fd46f47b   David Daney   netdev: mdio-octe...
27
  	res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2fd46f47b   David Daney   netdev: mdio-octe...
28
29
30
  	if (res_mem == NULL) {
  		dev_err(&pdev->dev, "found no memory resource
  ");
de9e397e4   Radha Mohan Chintakuntla   net: mdio-octeon:...
31
  		return -ENXIO;
2fd46f47b   David Daney   netdev: mdio-octe...
32
  	}
de9e397e4   Radha Mohan Chintakuntla   net: mdio-octeon:...
33

35d2aeac9   Andrew Lunn   phy: mdio-octeon:...
34
35
  	bus = mii_bus->priv;
  	bus->mii_bus = mii_bus;
1eefee901   David Daney   phy: mdio-octeon:...
36
37
  	mdio_phys = res_mem->start;
  	regsize = resource_size(res_mem);
de9e397e4   Radha Mohan Chintakuntla   net: mdio-octeon:...
38

1eefee901   David Daney   phy: mdio-octeon:...
39
  	if (!devm_request_mem_region(&pdev->dev, mdio_phys, regsize,
2fd46f47b   David Daney   netdev: mdio-octe...
40
41
42
  				     res_mem->name)) {
  		dev_err(&pdev->dev, "request_mem_region failed
  ");
de9e397e4   Radha Mohan Chintakuntla   net: mdio-octeon:...
43
  		return -ENXIO;
2fd46f47b   David Daney   netdev: mdio-octe...
44
  	}
de9e397e4   Radha Mohan Chintakuntla   net: mdio-octeon:...
45

2fd46f47b   David Daney   netdev: mdio-octe...
46
  	bus->register_base =
1eefee901   David Daney   phy: mdio-octeon:...
47
  		(u64)devm_ioremap(&pdev->dev, mdio_phys, regsize);
de9e397e4   Radha Mohan Chintakuntla   net: mdio-octeon:...
48
49
50
51
52
  	if (!bus->register_base) {
  		dev_err(&pdev->dev, "dev_ioremap failed
  ");
  		return -ENOMEM;
  	}
25d967b72   David Daney   NET: Add driver f...
53

6c17812d6   David Daney   NET: mdio-octeon:...
54
55
  	smi_en.u64 = 0;
  	smi_en.s.en = 1;
a6d678645   Radha Mohan Chintakuntla   net: mdio-octeon:...
56
  	oct_mdio_writeq(smi_en.u64, bus->register_base + SMI_EN);
25d967b72   David Daney   NET: Add driver f...
57

1eefee901   David Daney   phy: mdio-octeon:...
58
  	bus->mii_bus->name = KBUILD_MODNAME;
2fd46f47b   David Daney   netdev: mdio-octe...
59
  	snprintf(bus->mii_bus->id, MII_BUS_ID_SIZE, "%llx", bus->register_base);
25d967b72   David Daney   NET: Add driver f...
60
  	bus->mii_bus->parent = &pdev->dev;
1eefee901   David Daney   phy: mdio-octeon:...
61
62
  	bus->mii_bus->read = cavium_mdiobus_read;
  	bus->mii_bus->write = cavium_mdiobus_write;
25d967b72   David Daney   NET: Add driver f...
63

f8825669b   Libo Chen   net: phy: mdio-oc...
64
  	platform_set_drvdata(pdev, bus);
25d967b72   David Daney   NET: Add driver f...
65

2fd46f47b   David Daney   netdev: mdio-octe...
66
  	err = of_mdiobus_register(bus->mii_bus, pdev->dev.of_node);
25d967b72   David Daney   NET: Add driver f...
67
  	if (err)
2fd46f47b   David Daney   netdev: mdio-octe...
68
  		goto fail_register;
25d967b72   David Daney   NET: Add driver f...
69

1eefee901   David Daney   phy: mdio-octeon:...
70
71
  	dev_info(&pdev->dev, "Probed
  ");
25d967b72   David Daney   NET: Add driver f...
72
73
  
  	return 0;
2fd46f47b   David Daney   netdev: mdio-octe...
74
  fail_register:
25d967b72   David Daney   NET: Add driver f...
75
  	mdiobus_free(bus->mii_bus);
6c17812d6   David Daney   NET: mdio-octeon:...
76
  	smi_en.u64 = 0;
a6d678645   Radha Mohan Chintakuntla   net: mdio-octeon:...
77
  	oct_mdio_writeq(smi_en.u64, bus->register_base + SMI_EN);
25d967b72   David Daney   NET: Add driver f...
78
79
  	return err;
  }
633d15949   Bill Pemberton   net/phy: remove _...
80
  static int octeon_mdiobus_remove(struct platform_device *pdev)
25d967b72   David Daney   NET: Add driver f...
81
  {
1eefee901   David Daney   phy: mdio-octeon:...
82
  	struct cavium_mdiobus *bus;
6c17812d6   David Daney   NET: mdio-octeon:...
83
  	union cvmx_smix_en smi_en;
25d967b72   David Daney   NET: Add driver f...
84

2c0c4fbe5   Jingoo Han   net: mdio-octeon:...
85
  	bus = platform_get_drvdata(pdev);
25d967b72   David Daney   NET: Add driver f...
86
87
88
  
  	mdiobus_unregister(bus->mii_bus);
  	mdiobus_free(bus->mii_bus);
6c17812d6   David Daney   NET: mdio-octeon:...
89
  	smi_en.u64 = 0;
a6d678645   Radha Mohan Chintakuntla   net: mdio-octeon:...
90
  	oct_mdio_writeq(smi_en.u64, bus->register_base + SMI_EN);
25d967b72   David Daney   NET: Add driver f...
91
92
  	return 0;
  }
d8a7dadbd   Fabian Frederick   net: phy: constif...
93
  static const struct of_device_id octeon_mdiobus_match[] = {
2fd46f47b   David Daney   netdev: mdio-octe...
94
95
96
97
98
99
  	{
  		.compatible = "cavium,octeon-3860-mdio",
  	},
  	{},
  };
  MODULE_DEVICE_TABLE(of, octeon_mdiobus_match);
25d967b72   David Daney   NET: Add driver f...
100
101
  static struct platform_driver octeon_mdiobus_driver = {
  	.driver = {
1eefee901   David Daney   phy: mdio-octeon:...
102
  		.name		= KBUILD_MODNAME,
2fd46f47b   David Daney   netdev: mdio-octe...
103
  		.of_match_table = octeon_mdiobus_match,
25d967b72   David Daney   NET: Add driver f...
104
105
  	},
  	.probe		= octeon_mdiobus_probe,
633d15949   Bill Pemberton   net/phy: remove _...
106
  	.remove		= octeon_mdiobus_remove,
25d967b72   David Daney   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   Sachin Kamat   net: mdio-octeon:...
114
  module_platform_driver(octeon_mdiobus_driver);
25d967b72   David Daney   NET: Add driver f...
115

1eefee901   David Daney   phy: mdio-octeon:...
116
  MODULE_DESCRIPTION("Cavium OCTEON MDIO bus driver");
25d967b72   David Daney   NET: Add driver f...
117
  MODULE_AUTHOR("David Daney");
8bbe833a6   Andrew Lunn   net: phy: Add SDP...
118
  MODULE_LICENSE("GPL v2");