1 /*
2  * Amlogic Meson DWMAC glue layer
3  *
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>
18 #include <linux/platform_device.h>
19 #include <linux/stmmac.h>
20 
21 #define ETHMAC_SPEED_100	BIT(1)
22 
23 struct meson_dwmac {
24 	struct device	*dev;
25 	void __iomem	*reg;
26 };
27 
28 static void meson6_dwmac_fix_mac_speed(void *priv, unsigned int speed)
29 {
30 	struct meson_dwmac *dwmac = priv;
31 	unsigned int val;
32 
33 	val = readl(dwmac->reg);
34 
35 	switch (speed) {
36 	case SPEED_10:
37 		val &= ~ETHMAC_SPEED_100;
38 		break;
39 	case SPEED_100:
40 		val |= ETHMAC_SPEED_100;
41 		break;
42 	}
43 
44 	writel(val, dwmac->reg);
45 }
46 
47 static void *meson6_dwmac_setup(struct platform_device *pdev)
48 {
49 	struct meson_dwmac *dwmac;
50 	struct resource *res;
51 
52 	dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL);
53 	if (!dwmac)
54 		return ERR_PTR(-ENOMEM);
55 
56 	res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
57 	dwmac->reg = devm_ioremap_resource(&pdev->dev, res);
58 	if (IS_ERR(dwmac->reg))
59 		return dwmac->reg;
60 
61 	return dwmac;
62 }
63 
64 const struct stmmac_of_data meson6_dwmac_data = {
65 	.setup		= meson6_dwmac_setup,
66 	.fix_mac_speed	= meson6_dwmac_fix_mac_speed,
67 };
68