94 lines
2.1 KiB
C
94 lines
2.1 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/*
|
|
* Copyright (C) 2024 Schneider-Electric
|
|
*
|
|
* Clément Léger <clement.leger@bootlin.com>
|
|
*/
|
|
|
|
#include <linux/of.h>
|
|
#include <linux/pcs-rzn1-miic.h>
|
|
#include <linux/phylink.h>
|
|
#include <linux/platform_device.h>
|
|
|
|
#include "stmmac_platform.h"
|
|
#include "stmmac.h"
|
|
|
|
static int rzn1_dwmac_pcs_init(struct stmmac_priv *priv)
|
|
{
|
|
struct device_node *np = priv->device->of_node;
|
|
struct device_node *pcs_node;
|
|
struct phylink_pcs *pcs;
|
|
|
|
pcs_node = of_parse_phandle(np, "pcs-handle", 0);
|
|
|
|
if (pcs_node) {
|
|
pcs = miic_create(priv->device, pcs_node);
|
|
of_node_put(pcs_node);
|
|
if (IS_ERR(pcs))
|
|
return PTR_ERR(pcs);
|
|
|
|
priv->hw->phylink_pcs = pcs;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void rzn1_dwmac_pcs_exit(struct stmmac_priv *priv)
|
|
{
|
|
if (priv->hw->phylink_pcs)
|
|
miic_destroy(priv->hw->phylink_pcs);
|
|
}
|
|
|
|
static struct phylink_pcs *rzn1_dwmac_select_pcs(struct stmmac_priv *priv,
|
|
phy_interface_t interface)
|
|
{
|
|
return priv->hw->phylink_pcs;
|
|
}
|
|
|
|
static int rzn1_dwmac_probe(struct platform_device *pdev)
|
|
{
|
|
struct plat_stmmacenet_data *plat_dat;
|
|
struct stmmac_resources stmmac_res;
|
|
struct device *dev = &pdev->dev;
|
|
int ret;
|
|
|
|
ret = stmmac_get_platform_resources(pdev, &stmmac_res);
|
|
if (ret)
|
|
return ret;
|
|
|
|
plat_dat = devm_stmmac_probe_config_dt(pdev, stmmac_res.mac);
|
|
if (IS_ERR(plat_dat))
|
|
return PTR_ERR(plat_dat);
|
|
|
|
plat_dat->bsp_priv = plat_dat;
|
|
plat_dat->pcs_init = rzn1_dwmac_pcs_init;
|
|
plat_dat->pcs_exit = rzn1_dwmac_pcs_exit;
|
|
plat_dat->select_pcs = rzn1_dwmac_select_pcs;
|
|
|
|
ret = stmmac_dvr_probe(dev, plat_dat, &stmmac_res);
|
|
if (ret)
|
|
return ret;
|
|
|
|
return 0;
|
|
}
|
|
|
|
static const struct of_device_id rzn1_dwmac_match[] = {
|
|
{ .compatible = "renesas,rzn1-gmac" },
|
|
{ }
|
|
};
|
|
MODULE_DEVICE_TABLE(of, rzn1_dwmac_match);
|
|
|
|
static struct platform_driver rzn1_dwmac_driver = {
|
|
.probe = rzn1_dwmac_probe,
|
|
.remove = stmmac_pltfr_remove,
|
|
.driver = {
|
|
.name = "rzn1-dwmac",
|
|
.of_match_table = rzn1_dwmac_match,
|
|
},
|
|
};
|
|
module_platform_driver(rzn1_dwmac_driver);
|
|
|
|
MODULE_AUTHOR("Clément Léger <clement.leger@bootlin.com>");
|
|
MODULE_DESCRIPTION("Renesas RZN1 DWMAC specific glue layer");
|
|
MODULE_LICENSE("GPL");
|