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 28 static 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 = devm_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->mac_interface == PHY_INTERFACE_MODE_MII) { 53 ethmode = LPC18XX_CREG_CREG6_ETHMODE_MII; 54 } else if (plat_dat->mac_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 67 static const struct of_device_id lpc18xx_dwmac_match[] = { 68 { .compatible = "nxp,lpc1850-dwmac" }, 69 { } 70 }; 71 MODULE_DEVICE_TABLE(of, lpc18xx_dwmac_match); 72 73 static 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 }; 82 module_platform_driver(lpc18xx_dwmac_driver); 83 84 MODULE_AUTHOR("Joachim Eastwood <manabian@gmail.com>"); 85 MODULE_DESCRIPTION("DWMAC glue for LPC18xx/43xx Ethernet"); 86 MODULE_LICENSE("GPL v2"); 87