int __devinit rgmii_attach(struct of_device *ofdev, int input, int mode) { struct rgmii_instance *dev = dev_get_drvdata(&ofdev->dev); 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 "%s: unsupported settings !\n", ofdev->node->full_name); 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 "%s: input %d in %s mode\n", ofdev->node->full_name, input, rgmii_mode_name(mode)); ++dev->users; mutex_unlock(&dev->lock); return 0; }
static int __init rgmii_init(struct ocp_device *ocpdev, int input, int mode) { struct ibm_ocp_rgmii *dev = ocp_get_drvdata(ocpdev); struct rgmii_regs *p; RGMII_DBG("%d: init(%d, %d)" NL, ocpdev->def->index, input, mode); if (!dev) { dev = kmalloc(sizeof(struct ibm_ocp_rgmii), GFP_KERNEL); if (!dev) { printk(KERN_ERR "rgmii%d: couldn't allocate device structure!\n", ocpdev->def->index); return -ENOMEM; } memset(dev, 0, sizeof(struct ibm_ocp_rgmii)); p = (struct rgmii_regs *)ioremap(ocpdev->def->paddr, sizeof(struct rgmii_regs)); if (!p) { printk(KERN_ERR "rgmii%d: could not ioremap device registers!\n", ocpdev->def->index); kfree(dev); return -ENOMEM; } dev->base = p; ocp_set_drvdata(ocpdev, dev); /* Disable all inputs by default */ out_be32(&p->fer, 0); } else p = dev->base; /* Enable this input */ out_be32(&p->fer, in_be32(&p->fer) | rgmii_mode_mask(mode, input)); printk(KERN_NOTICE "rgmii%d: input %d in %s mode\n", ocpdev->def->index, input, rgmii_mode_name(mode)); ++dev->users; return 0; }