blob: 7fdd1760a74c951a63282db15ab4f9ece2bc8abf [file] [log] [blame]
Beniamino Galvani0ad5adc2014-09-20 15:29:16 +02001/*
Martin Blumenstingl466fd242016-09-06 23:38:48 +02002 * Amlogic Meson6 and Meson8 DWMAC glue layer
Beniamino Galvani0ad5adc2014-09-20 15:29:16 +02003 *
4 * Copyright (C) 2014 Beniamino Galvani <b.galvani@gmail.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 * You should have received a copy of the GNU General Public License
11 * along with this program. If not, see <http://www.gnu.org/licenses/>.
12 */
13
14#include <linux/device.h>
15#include <linux/ethtool.h>
16#include <linux/io.h>
17#include <linux/ioport.h>
Joachim Eastwood40e6b0b2015-05-14 12:11:01 +020018#include <linux/module.h>
Beniamino Galvani0ad5adc2014-09-20 15:29:16 +020019#include <linux/platform_device.h>
20#include <linux/stmmac.h>
21
Andy Shevchenkof10f9fb2014-11-07 16:46:42 +020022#include "stmmac_platform.h"
23
Beniamino Galvani0ad5adc2014-09-20 15:29:16 +020024#define ETHMAC_SPEED_100 BIT(1)
25
26struct meson_dwmac {
27 struct device *dev;
28 void __iomem *reg;
29};
30
31static void meson6_dwmac_fix_mac_speed(void *priv, unsigned int speed)
32{
33 struct meson_dwmac *dwmac = priv;
34 unsigned int val;
35
36 val = readl(dwmac->reg);
37
38 switch (speed) {
39 case SPEED_10:
40 val &= ~ETHMAC_SPEED_100;
41 break;
42 case SPEED_100:
43 val |= ETHMAC_SPEED_100;
44 break;
45 }
46
47 writel(val, dwmac->reg);
48}
49
Joachim Eastwood1734bef2015-07-17 00:26:11 +020050static int meson6_dwmac_probe(struct platform_device *pdev)
Beniamino Galvani0ad5adc2014-09-20 15:29:16 +020051{
Joachim Eastwood1734bef2015-07-17 00:26:11 +020052 struct plat_stmmacenet_data *plat_dat;
53 struct stmmac_resources stmmac_res;
Beniamino Galvani0ad5adc2014-09-20 15:29:16 +020054 struct meson_dwmac *dwmac;
55 struct resource *res;
Joachim Eastwood1734bef2015-07-17 00:26:11 +020056 int ret;
57
58 ret = stmmac_get_platform_resources(pdev, &stmmac_res);
59 if (ret)
60 return ret;
61
62 plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
63 if (IS_ERR(plat_dat))
64 return PTR_ERR(plat_dat);
Beniamino Galvani0ad5adc2014-09-20 15:29:16 +020065
66 dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL);
Johan Hovoldd2ed0a72016-11-30 15:29:55 +010067 if (!dwmac) {
68 ret = -ENOMEM;
69 goto err_remove_config_dt;
70 }
Beniamino Galvani0ad5adc2014-09-20 15:29:16 +020071
72 res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
73 dwmac->reg = devm_ioremap_resource(&pdev->dev, res);
Johan Hovoldd2ed0a72016-11-30 15:29:55 +010074 if (IS_ERR(dwmac->reg)) {
75 ret = PTR_ERR(dwmac->reg);
76 goto err_remove_config_dt;
77 }
Beniamino Galvani0ad5adc2014-09-20 15:29:16 +020078
Joachim Eastwood1734bef2015-07-17 00:26:11 +020079 plat_dat->bsp_priv = dwmac;
80 plat_dat->fix_mac_speed = meson6_dwmac_fix_mac_speed;
81
Johan Hovoldd2ed0a72016-11-30 15:29:55 +010082 ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
83 if (ret)
84 goto err_remove_config_dt;
85
86 return 0;
87
88err_remove_config_dt:
89 stmmac_remove_config_dt(pdev, plat_dat);
90
91 return ret;
Beniamino Galvani0ad5adc2014-09-20 15:29:16 +020092}
93
Joachim Eastwood40e6b0b2015-05-14 12:11:01 +020094static const struct of_device_id meson6_dwmac_match[] = {
Joachim Eastwood1734bef2015-07-17 00:26:11 +020095 { .compatible = "amlogic,meson6-dwmac" },
Joachim Eastwood40e6b0b2015-05-14 12:11:01 +020096 { }
97};
98MODULE_DEVICE_TABLE(of, meson6_dwmac_match);
99
100static struct platform_driver meson6_dwmac_driver = {
Joachim Eastwood1734bef2015-07-17 00:26:11 +0200101 .probe = meson6_dwmac_probe,
Joachim Eastwood40e6b0b2015-05-14 12:11:01 +0200102 .remove = stmmac_pltfr_remove,
103 .driver = {
104 .name = "meson6-dwmac",
105 .pm = &stmmac_pltfr_pm_ops,
106 .of_match_table = meson6_dwmac_match,
107 },
108};
109module_platform_driver(meson6_dwmac_driver);
110
111MODULE_AUTHOR("Beniamino Galvani <b.galvani@gmail.com>");
Martin Blumenstingl466fd242016-09-06 23:38:48 +0200112MODULE_DESCRIPTION("Amlogic Meson6 and Meson8 DWMAC glue layer");
Joachim Eastwood40e6b0b2015-05-14 12:11:01 +0200113MODULE_LICENSE("GPL v2");