| /* |
| * Amlogic Meson DWMAC glue layer |
| * |
| * Copyright (C) 2014 Beniamino Galvani <b.galvani@gmail.com> |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program. If not, see <http://www.gnu.org/licenses/>. |
| */ |
| |
| #include <linux/device.h> |
| #include <linux/ethtool.h> |
| #include <linux/io.h> |
| #include <linux/ioport.h> |
| #include <linux/platform_device.h> |
| #include <linux/stmmac.h> |
| |
| #include "stmmac_platform.h" |
| |
| #define ETHMAC_SPEED_100 BIT(1) |
| |
| struct meson_dwmac { |
| struct device *dev; |
| void __iomem *reg; |
| }; |
| |
| static void meson6_dwmac_fix_mac_speed(void *priv, unsigned int speed) |
| { |
| struct meson_dwmac *dwmac = priv; |
| unsigned int val; |
| |
| val = readl(dwmac->reg); |
| |
| switch (speed) { |
| case SPEED_10: |
| val &= ~ETHMAC_SPEED_100; |
| break; |
| case SPEED_100: |
| val |= ETHMAC_SPEED_100; |
| break; |
| } |
| |
| writel(val, dwmac->reg); |
| } |
| |
| static void *meson6_dwmac_setup(struct platform_device *pdev) |
| { |
| struct meson_dwmac *dwmac; |
| struct resource *res; |
| |
| dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL); |
| if (!dwmac) |
| return ERR_PTR(-ENOMEM); |
| |
| res = platform_get_resource(pdev, IORESOURCE_MEM, 1); |
| dwmac->reg = devm_ioremap_resource(&pdev->dev, res); |
| if (IS_ERR(dwmac->reg)) |
| return ERR_CAST(dwmac->reg); |
| |
| return dwmac; |
| } |
| |
| const struct stmmac_of_data meson6_dwmac_data = { |
| .setup = meson6_dwmac_setup, |
| .fix_mac_speed = meson6_dwmac_fix_mac_speed, |
| }; |