static int i2c_pxa_probe(struct platform_device *dev) { struct pxa_i2c *i2c = &i2c_pxa; struct resource *res; #ifdef CONFIG_I2C_PXA_SLAVE struct i2c_pxa_platform_data *plat = dev->dev.platform_data; #endif int ret; int irq; res = platform_get_resource(dev, IORESOURCE_MEM, 0); irq = platform_get_irq(dev, 0); if (res == NULL || irq < 0) return -ENODEV; if (!request_mem_region(res->start, res_len(res), res->name)) return -ENOMEM; i2c = kmalloc(sizeof(struct pxa_i2c), GFP_KERNEL); if (!i2c) { ret = -ENOMEM; goto emalloc; } memcpy(i2c, &i2c_pxa, sizeof(struct pxa_i2c)); init_waitqueue_head(&i2c->wait); i2c->adap.name[strlen(i2c->adap.name) - 1] = '0' + dev->id % 10; i2c->reg_base = ioremap(res->start, res_len(res)); if (!i2c->reg_base) { ret = -EIO; goto eremap; } i2c->iobase = res->start; i2c->iosize = res_len(res); i2c->irq = irq; i2c->slave_addr = I2C_PXA_SLAVE_ADDR; #ifdef CONFIG_I2C_PXA_SLAVE if (plat) { i2c->slave_addr = plat->slave_addr; i2c->slave = plat->slave; } #endif switch (dev->id) { case 0: #ifdef CONFIG_PXA27x pxa_gpio_mode(GPIO117_I2CSCL_MD); pxa_gpio_mode(GPIO118_I2CSDA_MD); #endif pxa_set_cken(CKEN14_I2C, 1); break; #ifdef CONFIG_PXA27x case 1: local_irq_disable(); PCFR |= PCFR_PI2CEN; local_irq_enable(); pxa_set_cken(CKEN15_PWRI2C, 1); #endif } ret = request_irq(irq, i2c_pxa_handler, IRQF_DISABLED, i2c->adap.name, i2c); if (ret) goto ereqirq; i2c_pxa_reset(i2c); i2c->adap.algo_data = i2c; i2c->adap.dev.parent = &dev->dev; ret = i2c_add_adapter(&i2c->adap); if (ret < 0) { printk(KERN_INFO "I2C: Failed to add bus\n"); goto eadapt; } platform_set_drvdata(dev, i2c); #ifdef CONFIG_I2C_PXA_SLAVE printk(KERN_INFO "I2C: %s: PXA I2C adapter, slave address %d\n", i2c->adap.dev.bus_id, i2c->slave_addr); #else printk(KERN_INFO "I2C: %s: PXA I2C adapter\n", i2c->adap.dev.bus_id); #endif return 0; eadapt: free_irq(irq, i2c); ereqirq: switch (dev->id) { case 0: pxa_set_cken(CKEN14_I2C, 0); break; #ifdef CONFIG_PXA27x case 1: pxa_set_cken(CKEN15_PWRI2C, 0); local_irq_disable(); PCFR &= ~PCFR_PI2CEN; local_irq_enable(); #endif } eremap: kfree(i2c); emalloc: release_mem_region(res->start, res_len(res)); return ret; }
static int __devinit i2c_pca_pf_probe(struct platform_device *pdev) { struct i2c_pca_pf_data *i2c; struct resource *res; struct i2c_pca9564_pf_platform_data *platform_data = pdev->dev.platform_data; int ret = 0; int irq; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); irq = platform_get_irq(pdev, 0); /* If irq is 0, we do polling. */ if (res == NULL) { ret = -ENODEV; goto e_print; } if (!request_mem_region(res->start, res_len(res), res->name)) { ret = -ENOMEM; goto e_print; } i2c = kzalloc(sizeof(struct i2c_pca_pf_data), GFP_KERNEL); if (!i2c) { ret = -ENOMEM; goto e_alloc; } init_waitqueue_head(&i2c->wait); i2c->reg_base = ioremap(res->start, res_len(res)); if (!i2c->reg_base) { ret = -EIO; goto e_remap; } i2c->io_base = res->start; i2c->io_size = res_len(res); i2c->irq = irq; i2c->adap.nr = pdev->id >= 0 ? pdev->id : 0; i2c->adap.owner = THIS_MODULE; snprintf(i2c->adap.name, sizeof(i2c->adap.name), "PCA9564 at 0x%08lx", (unsigned long) res->start); i2c->adap.algo_data = &i2c->algo_data; i2c->adap.dev.parent = &pdev->dev; i2c->adap.timeout = platform_data->timeout; i2c->algo_data.i2c_clock = platform_data->i2c_clock_speed; i2c->algo_data.data = i2c; switch (res->flags & IORESOURCE_MEM_TYPE_MASK) { case IORESOURCE_MEM_32BIT: i2c->algo_data.write_byte = i2c_pca_pf_writebyte32; i2c->algo_data.read_byte = i2c_pca_pf_readbyte32; break; case IORESOURCE_MEM_16BIT: i2c->algo_data.write_byte = i2c_pca_pf_writebyte16; i2c->algo_data.read_byte = i2c_pca_pf_readbyte16; break; case IORESOURCE_MEM_8BIT: default: i2c->algo_data.write_byte = i2c_pca_pf_writebyte8; i2c->algo_data.read_byte = i2c_pca_pf_readbyte8; break; } i2c->algo_data.wait_for_completion = i2c_pca_pf_waitforcompletion; i2c->gpio = platform_data->gpio; i2c->algo_data.reset_chip = i2c_pca_pf_dummyreset; /* Use gpio_is_valid() when in mainline */ if (i2c->gpio > -1) { ret = gpio_request(i2c->gpio, i2c->adap.name); if (ret == 0) { gpio_direction_output(i2c->gpio, 1); i2c->algo_data.reset_chip = i2c_pca_pf_resetchip; } else { printk(KERN_WARNING "%s: Registering gpio failed!\n", i2c->adap.name); i2c->gpio = ret; } } if (irq) { ret = request_irq(irq, i2c_pca_pf_handler, IRQF_TRIGGER_FALLING, i2c->adap.name, i2c); if (ret) goto e_reqirq; } if (i2c_pca_add_numbered_bus(&i2c->adap) < 0) { ret = -ENODEV; goto e_adapt; } platform_set_drvdata(pdev, i2c); printk(KERN_INFO "%s registered.\n", i2c->adap.name); return 0; e_adapt: if (irq) free_irq(irq, i2c); e_reqirq: if (i2c->gpio > -1) gpio_free(i2c->gpio); iounmap(i2c->reg_base); e_remap: kfree(i2c); e_alloc: release_mem_region(res->start, res_len(res)); e_print: printk(KERN_ERR "Registering PCA9564 FAILED! (%d)\n", ret); return ret; }