static int i2c_versatile_probe(struct device_d *dev) { struct i2c_versatile *i2c; int ret; i2c = kzalloc(sizeof(struct i2c_versatile), GFP_KERNEL); if (!i2c) { ret = -ENOMEM; goto err_release; } i2c->base = dev_request_mem_region(dev, 0); if (!i2c->base) { ret = -ENOMEM; goto err_free; } writel(SCL | SDA, i2c->base + I2C_CONTROLS); i2c->adap.algo_data = &i2c->algo; i2c->adap.dev.parent = dev; i2c->algo = i2c_versatile_algo; i2c->algo.data = i2c; i2c->adap.nr = dev->id; ret = i2c_bit_add_numbered_bus(&i2c->adap); if (ret >= 0) { return 0; } err_free: kfree(i2c); err_release: return ret; }
static int i2c_versatile_probe(struct platform_device *dev) { struct i2c_versatile *i2c; struct resource *r; int ret; r = platform_get_resource(dev, IORESOURCE_MEM, 0); if (!r) { ret = -EINVAL; goto err_out; } if (!request_mem_region(r->start, r->end - r->start + 1, "versatile-i2c")) { ret = -EBUSY; goto err_out; } i2c = kzalloc(sizeof(struct i2c_versatile), GFP_KERNEL); if (!i2c) { ret = -ENOMEM; goto err_release; } i2c->base = ioremap(r->start, r->end - r->start + 1); if (!i2c->base) { ret = -ENOMEM; goto err_free; } writel(SCL | SDA, i2c->base + I2C_CONTROLS); i2c->adap.owner = THIS_MODULE; strlcpy(i2c->adap.name, "Versatile I2C adapter", sizeof(i2c->adap.name)); i2c->adap.algo_data = &i2c->algo; i2c->adap.dev.parent = &dev->dev; i2c->algo = i2c_versatile_algo; i2c->algo.data = i2c; if (dev->id >= 0) { /* static bus numbering */ i2c->adap.nr = dev->id; ret = i2c_bit_add_numbered_bus(&i2c->adap); } else /* dynamic bus numbering */ ret = i2c_bit_add_bus(&i2c->adap); if (ret >= 0) { platform_set_drvdata(dev, i2c); return 0; } iounmap(i2c->base); err_free: kfree(i2c); err_release: release_mem_region(r->start, r->end - r->start + 1); err_out: return ret; }
static int __devinit bcm5301x_bb_init(struct platform_device *pdev, struct bcm5301x_i2c_data *pdata) { struct i2c_algo_bit_data *bb_data = &pdata->bb_data; struct i2c_adapter *bb_adap = &pdata->bb_adap; bb_data->setsda = bcm5301x_bb_setsda; bb_data->setscl = bcm5301x_bb_setscl; bb_data->getsda = bcm5301x_bb_getsda; bb_data->getscl = bcm5301x_bb_getscl; bb_data->pre_xfer = bcm5301x_bb_pre_xfer; bb_data->post_xfer = bcm5301x_bb_post_xfer; bb_data->udelay = 5; /* 100 KHz; borrowed from i2c-gpio.c */ bb_data->timeout = BCM5301X_CFG_TIMEOUT(0); bb_data->data = pdata; bb_adap->owner = THIS_MODULE; snprintf(bb_adap->name, sizeof(bb_adap->name), BCM5301X_CFG_BB_DRV_NAME); bb_adap->algo_data = bb_data; bb_adap->dev.parent = &pdev->dev; bb_adap->nr = pdev->id + 1; return i2c_bit_add_numbered_bus(bb_adap); }
static int __init i2c_ioc_init(void) { force_ones = FORCE_ONES | SCL | SDA; return i2c_bit_add_numbered_bus(&ioc_ops); }