// XXX FIXME: Axon seems to support a subset of the RGMII, we // thus need to take that into account and possibly change some // of the bit settings below that don't seem to quite match the // AXON spec
staticinline u32 rgmii_mode_mask(int mode, int input)
{ switch (mode) { case PHY_INTERFACE_MODE_RGMII: case PHY_INTERFACE_MODE_RGMII_ID: case PHY_INTERFACE_MODE_RGMII_RXID: case PHY_INTERFACE_MODE_RGMII_TXID: return RGMII_FER_RGMII(input); case PHY_INTERFACE_MODE_TBI: return RGMII_FER_TBI(input); case PHY_INTERFACE_MODE_GMII: return RGMII_FER_GMII(input); case PHY_INTERFACE_MODE_MII: return RGMII_FER_MII(input); case PHY_INTERFACE_MODE_RTBI: return RGMII_FER_RTBI(input); default:
BUG();
}
}
int rgmii_attach(struct platform_device *ofdev, int input, int mode)
{ struct rgmii_instance *dev = platform_get_drvdata(ofdev); struct rgmii_regs __iomem *p = dev->base;
RGMII_DBG(dev, "attach(%d)" NL, input);
/* Check if we need to attach to a RGMII */ if (input < 0 || !rgmii_valid_mode(mode)) {
printk(KERN_ERR "%pOF: unsupported settings !\n",
ofdev->dev.of_node); return -ENODEV;
}
mutex_lock(&dev->lock);
/* Enable this input */
out_be32(&p->fer, in_be32(&p->fer) | rgmii_mode_mask(mode, input));
printk(KERN_NOTICE "%pOF: input %d in %s mode\n",
ofdev->dev.of_node, input, phy_modes(mode));
hdr->version = 0;
hdr->index = 0; /* for now, are there chips with more than one *rgmii?ifyes,thenwe'lladdacell_index *likewedoforemac
*/
memcpy_fromio(regs, dev->base, sizeof(struct rgmii_regs)); return regs + 1;
}
staticint rgmii_probe(struct platform_device *ofdev)
{ struct rgmii_instance *dev; int err;
dev = devm_kzalloc(&ofdev->dev, sizeof(struct rgmii_instance),
GFP_KERNEL); if (!dev) return -ENOMEM;
err = devm_mutex_init(&ofdev->dev, &dev->lock); if (err) return err;
/* Check for RGMII flags */ if (of_property_read_bool(ofdev->dev.of_node, "has-mdio"))
dev->flags |= EMAC_RGMII_FLAG_HAS_MDIO;
/* CAB lacks the right properties, fix this up */ if (of_device_is_compatible(ofdev->dev.of_node, "ibm,rgmii-axon"))
dev->flags |= EMAC_RGMII_FLAG_HAS_MDIO;
DBG2(dev, " Boot FER = 0x%08x, SSR = 0x%08x\n",
in_be32(&dev->base->fer), in_be32(&dev->base->ssr));
/* Disable all inputs by default */
out_be32(&dev->base->fer, 0);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.