cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

dwmac-meson.c (2305B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Amlogic Meson6 and Meson8 DWMAC glue layer
      4 *
      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)
     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 = 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		ret = -ENOMEM;
     62		goto err_remove_config_dt;
     63	}
     64
     65	dwmac->reg = devm_platform_ioremap_resource(pdev, 1);
     66	if (IS_ERR(dwmac->reg)) {
     67		ret = PTR_ERR(dwmac->reg);
     68		goto err_remove_config_dt;
     69	}
     70
     71	plat_dat->bsp_priv = dwmac;
     72	plat_dat->fix_mac_speed = meson6_dwmac_fix_mac_speed;
     73
     74	ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
     75	if (ret)
     76		goto err_remove_config_dt;
     77
     78	return 0;
     79
     80err_remove_config_dt:
     81	stmmac_remove_config_dt(pdev, plat_dat);
     82
     83	return ret;
     84}
     85
     86static const struct of_device_id meson6_dwmac_match[] = {
     87	{ .compatible = "amlogic,meson6-dwmac" },
     88	{ }
     89};
     90MODULE_DEVICE_TABLE(of, meson6_dwmac_match);
     91
     92static struct platform_driver meson6_dwmac_driver = {
     93	.probe  = meson6_dwmac_probe,
     94	.remove = stmmac_pltfr_remove,
     95	.driver = {
     96		.name           = "meson6-dwmac",
     97		.pm		= &stmmac_pltfr_pm_ops,
     98		.of_match_table = meson6_dwmac_match,
     99	},
    100};
    101module_platform_driver(meson6_dwmac_driver);
    102
    103MODULE_AUTHOR("Beniamino Galvani <b.galvani@gmail.com>");
    104MODULE_DESCRIPTION("Amlogic Meson6 and Meson8 DWMAC glue layer");
    105MODULE_LICENSE("GPL v2");