|
@@ -14,12 +14,21 @@
|
|
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
|
|
|
|
|
#include <linux/bcma/bcma.h>
|
|
|
+#include <linux/brcmphy.h>
|
|
|
#include <linux/etherdevice.h>
|
|
|
#include <linux/of_address.h>
|
|
|
#include <linux/of_mdio.h>
|
|
|
#include <linux/of_net.h>
|
|
|
#include "bgmac.h"
|
|
|
|
|
|
+#define NICPM_IOMUX_CTRL 0x00000008
|
|
|
+
|
|
|
+#define NICPM_IOMUX_CTRL_INIT_VAL 0x3196e000
|
|
|
+#define NICPM_IOMUX_CTRL_SPD_SHIFT 10
|
|
|
+#define NICPM_IOMUX_CTRL_SPD_10M 0
|
|
|
+#define NICPM_IOMUX_CTRL_SPD_100M 1
|
|
|
+#define NICPM_IOMUX_CTRL_SPD_1000M 2
|
|
|
+
|
|
|
static u32 platform_bgmac_read(struct bgmac *bgmac, u16 offset)
|
|
|
{
|
|
|
return readl(bgmac->plat.base + offset);
|
|
@@ -87,12 +96,46 @@ static void platform_bgmac_cmn_maskset32(struct bgmac *bgmac, u16 offset,
|
|
|
WARN_ON(1);
|
|
|
}
|
|
|
|
|
|
+static void bgmac_nicpm_speed_set(struct net_device *net_dev)
|
|
|
+{
|
|
|
+ struct bgmac *bgmac = netdev_priv(net_dev);
|
|
|
+ u32 val;
|
|
|
+
|
|
|
+ if (!bgmac->plat.nicpm_base)
|
|
|
+ return;
|
|
|
+
|
|
|
+ val = NICPM_IOMUX_CTRL_INIT_VAL;
|
|
|
+ switch (bgmac->net_dev->phydev->speed) {
|
|
|
+ default:
|
|
|
+ netdev_err(net_dev, "Unsupported speed. Defaulting to 1000Mb\n");
|
|
|
+ case SPEED_1000:
|
|
|
+ val |= NICPM_IOMUX_CTRL_SPD_1000M << NICPM_IOMUX_CTRL_SPD_SHIFT;
|
|
|
+ break;
|
|
|
+ case SPEED_100:
|
|
|
+ val |= NICPM_IOMUX_CTRL_SPD_100M << NICPM_IOMUX_CTRL_SPD_SHIFT;
|
|
|
+ break;
|
|
|
+ case SPEED_10:
|
|
|
+ val |= NICPM_IOMUX_CTRL_SPD_10M << NICPM_IOMUX_CTRL_SPD_SHIFT;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ writel(val, bgmac->plat.nicpm_base + NICPM_IOMUX_CTRL);
|
|
|
+
|
|
|
+ bgmac_adjust_link(bgmac->net_dev);
|
|
|
+}
|
|
|
+
|
|
|
static int platform_phy_connect(struct bgmac *bgmac)
|
|
|
{
|
|
|
struct phy_device *phy_dev;
|
|
|
|
|
|
- phy_dev = of_phy_get_and_connect(bgmac->net_dev, bgmac->dev->of_node,
|
|
|
- bgmac_adjust_link);
|
|
|
+ if (bgmac->plat.nicpm_base)
|
|
|
+ phy_dev = of_phy_get_and_connect(bgmac->net_dev,
|
|
|
+ bgmac->dev->of_node,
|
|
|
+ bgmac_nicpm_speed_set);
|
|
|
+ else
|
|
|
+ phy_dev = of_phy_get_and_connect(bgmac->net_dev,
|
|
|
+ bgmac->dev->of_node,
|
|
|
+ bgmac_adjust_link);
|
|
|
if (!phy_dev) {
|
|
|
dev_err(bgmac->dev, "PHY connection failed\n");
|
|
|
return -ENODEV;
|
|
@@ -156,6 +199,14 @@ static int bgmac_probe(struct platform_device *pdev)
|
|
|
if (IS_ERR(bgmac->plat.idm_base))
|
|
|
return PTR_ERR(bgmac->plat.idm_base);
|
|
|
|
|
|
+ regs = platform_get_resource_byname(pdev, IORESOURCE_MEM, "nicpm_base");
|
|
|
+ if (regs) {
|
|
|
+ bgmac->plat.nicpm_base = devm_ioremap_resource(&pdev->dev,
|
|
|
+ regs);
|
|
|
+ if (IS_ERR(bgmac->plat.nicpm_base))
|
|
|
+ return PTR_ERR(bgmac->plat.nicpm_base);
|
|
|
+ }
|
|
|
+
|
|
|
bgmac->read = platform_bgmac_read;
|
|
|
bgmac->write = platform_bgmac_write;
|
|
|
bgmac->idm_read = platform_bgmac_idm_read;
|
|
@@ -187,6 +238,7 @@ static int bgmac_remove(struct platform_device *pdev)
|
|
|
static const struct of_device_id bgmac_of_enet_match[] = {
|
|
|
{.compatible = "brcm,amac",},
|
|
|
{.compatible = "brcm,nsp-amac",},
|
|
|
+ {.compatible = "brcm,ns2-amac",},
|
|
|
{},
|
|
|
};
|
|
|
|