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; }
void rgmii_set_speed(struct ocp_device *ocpdev, int input, int speed) { struct ibm_ocp_rgmii *dev = ocp_get_drvdata(ocpdev); u32 ssr = in_be32(&dev->base->ssr) & ~RGMII_SSR_MASK(input); RGMII_DBG("%d: speed(%d, %d)" NL, ocpdev->def->index, input, speed); if (speed == SPEED_1000) ssr |= RGMII_SSR_1000(input); else if (speed == SPEED_100) ssr |= RGMII_SSR_100(input); out_be32(&dev->base->ssr, ssr); }
void __rgmii_fini(struct ocp_device *ocpdev, int input) { struct ibm_ocp_rgmii *dev = ocp_get_drvdata(ocpdev); BUG_ON(!dev || dev->users == 0); RGMII_DBG("%d: fini(%d)" NL, ocpdev->def->index, input); /* Disable this input */ out_be32(&dev->base->fer, in_be32(&dev->base->fer) & ~RGMII_FER_MASK(input)); if (!--dev->users) { /* Free everything if this is the last user */ ocp_set_drvdata(ocpdev, NULL); iounmap((void *)dev->base); kfree(dev); } }
void __devexit rgmii_detach(struct of_device *ofdev, int input) { struct rgmii_instance *dev = dev_get_drvdata(&ofdev->dev); struct rgmii_regs __iomem *p = dev->base; mutex_lock(&dev->lock); BUG_ON(!dev || dev->users == 0); RGMII_DBG(dev, "detach(%d)" NL, input); /* Disable this input */ out_be32(&p->fer, in_be32(&p->fer) & ~RGMII_FER_MASK(input)); --dev->users; mutex_unlock(&dev->lock); }
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; }
void rgmii_set_speed(struct of_device *ofdev, int input, int speed) { struct rgmii_instance *dev = dev_get_drvdata(&ofdev->dev); struct rgmii_regs __iomem *p = dev->base; u32 ssr; mutex_lock(&dev->lock); ssr = in_be32(&p->ssr) & ~RGMII_SSR_MASK(input); RGMII_DBG(dev, "speed(%d, %d)" NL, input, speed); if (speed == SPEED_1000) ssr |= RGMII_SSR_1000(input); else if (speed == SPEED_100) ssr |= RGMII_SSR_100(input); out_be32(&p->ssr, ssr); mutex_unlock(&dev->lock); }