brintos

brintos / linux-shallow public Read only

0
0
Text · 2.1 KiB · a16bfa9 Raw
93 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Amlogic Meson6 and Meson8 DWMAC glue layer4 *5 * Copyright (C) 2014 Beniamino Galvani <b.galvani@gmail.com>6 */7 8#include <linux/device.h>9#include <linux/ethtool.h>10#include <linux/io.h>11#include <linux/ioport.h>12#include <linux/module.h>13#include <linux/platform_device.h>14#include <linux/stmmac.h>15 16#include "stmmac_platform.h"17 18#define ETHMAC_SPEED_100	BIT(1)19 20struct meson_dwmac {21	struct device	*dev;22	void __iomem	*reg;23};24 25static void meson6_dwmac_fix_mac_speed(void *priv, unsigned int speed, unsigned int mode)26{27	struct meson_dwmac *dwmac = priv;28	unsigned int val;29 30	val = readl(dwmac->reg);31 32	switch (speed) {33	case SPEED_10:34		val &= ~ETHMAC_SPEED_100;35		break;36	case SPEED_100:37		val |= ETHMAC_SPEED_100;38		break;39	}40 41	writel(val, dwmac->reg);42}43 44static int meson6_dwmac_probe(struct platform_device *pdev)45{46	struct plat_stmmacenet_data *plat_dat;47	struct stmmac_resources stmmac_res;48	struct meson_dwmac *dwmac;49	int ret;50 51	ret = stmmac_get_platform_resources(pdev, &stmmac_res);52	if (ret)53		return ret;54 55	plat_dat = devm_stmmac_probe_config_dt(pdev, stmmac_res.mac);56	if (IS_ERR(plat_dat))57		return PTR_ERR(plat_dat);58 59	dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL);60	if (!dwmac)61		return -ENOMEM;62 63	dwmac->reg = devm_platform_ioremap_resource(pdev, 1);64	if (IS_ERR(dwmac->reg))65		return PTR_ERR(dwmac->reg);66 67	plat_dat->bsp_priv = dwmac;68	plat_dat->fix_mac_speed = meson6_dwmac_fix_mac_speed;69 70	return stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);71}72 73static const struct of_device_id meson6_dwmac_match[] = {74	{ .compatible = "amlogic,meson6-dwmac" },75	{ }76};77MODULE_DEVICE_TABLE(of, meson6_dwmac_match);78 79static struct platform_driver meson6_dwmac_driver = {80	.probe  = meson6_dwmac_probe,81	.remove_new = stmmac_pltfr_remove,82	.driver = {83		.name           = "meson6-dwmac",84		.pm		= &stmmac_pltfr_pm_ops,85		.of_match_table = meson6_dwmac_match,86	},87};88module_platform_driver(meson6_dwmac_driver);89 90MODULE_AUTHOR("Beniamino Galvani <b.galvani@gmail.com>");91MODULE_DESCRIPTION("Amlogic Meson6 and Meson8 DWMAC glue layer");92MODULE_LICENSE("GPL v2");93