1/* 2 * DWMAC glue for NXP LPC18xx/LPC43xx Ethernet 3 * 4 * Copyright (C) 2015 Joachim Eastwood <manabian@gmail.com> 5 * 6 * This file is licensed under the terms of the GNU General Public 7 * License version 2. This program is licensed "as is" without any 8 * warranty of any kind, whether express or implied. 9 */ 10 11#include <linux/mfd/syscon.h> 12#include <linux/module.h> 13#include <linux/of.h> 14#include <linux/of_net.h> 15#include <linux/phy.h> 16#include <linux/platform_device.h> 17#include <linux/regmap.h> 18#include <linux/stmmac.h> 19 20#include "stmmac_platform.h" 21 22/* Register defines for CREG syscon */ 23#define LPC18XX_CREG_CREG6 0x12c 24# define LPC18XX_CREG_CREG6_ETHMODE_MASK 0x7 25# define LPC18XX_CREG_CREG6_ETHMODE_MII 0x0 26# define LPC18XX_CREG_CREG6_ETHMODE_RMII 0x4 27 28static int lpc18xx_dwmac_probe(struct platform_device *pdev) 29{ 30 struct plat_stmmacenet_data *plat_dat; 31 struct stmmac_resources stmmac_res; 32 struct regmap *reg; 33 u8 ethmode; 34 int ret; 35 36 ret = stmmac_get_platform_resources(pdev, &stmmac_res); 37 if (ret) 38 return ret; 39 40 plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac); 41 if (IS_ERR(plat_dat)) 42 return PTR_ERR(plat_dat); 43 44 plat_dat->has_gmac = true; 45 46 reg = syscon_regmap_lookup_by_compatible("nxp,lpc1850-creg"); 47 if (IS_ERR(reg)) { 48 dev_err(&pdev->dev, "syscon lookup failed\n"); 49 return PTR_ERR(reg); 50 } 51 52 if (plat_dat->interface == PHY_INTERFACE_MODE_MII) { 53 ethmode = LPC18XX_CREG_CREG6_ETHMODE_MII; 54 } else if (plat_dat->interface == PHY_INTERFACE_MODE_RMII) { 55 ethmode = LPC18XX_CREG_CREG6_ETHMODE_RMII; 56 } else { 57 dev_err(&pdev->dev, "Only MII and RMII mode supported\n"); 58 return -EINVAL; 59 } 60 61 regmap_update_bits(reg, LPC18XX_CREG_CREG6, 62 LPC18XX_CREG_CREG6_ETHMODE_MASK, ethmode); 63 64 return stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); 65} 66 67static const struct of_device_id lpc18xx_dwmac_match[] = { 68 { .compatible = "nxp,lpc1850-dwmac" }, 69 { } 70}; 71MODULE_DEVICE_TABLE(of, lpc18xx_dwmac_match); 72 73static struct platform_driver lpc18xx_dwmac_driver = { 74 .probe = lpc18xx_dwmac_probe, 75 .remove = stmmac_pltfr_remove, 76 .driver = { 77 .name = "lpc18xx-dwmac", 78 .pm = &stmmac_pltfr_pm_ops, 79 .of_match_table = lpc18xx_dwmac_match, 80 }, 81}; 82module_platform_driver(lpc18xx_dwmac_driver); 83 84MODULE_AUTHOR("Joachim Eastwood <manabian@gmail.com>"); 85MODULE_DESCRIPTION("DWMAC glue for LPC18xx/43xx Ethernet"); 86MODULE_LICENSE("GPL v2"); 87