123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- /*
- * 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,
- };
|