static int __init i2c_fsl_probe(struct device_d *pdev) { struct fsl_i2c_struct *i2c_fsl; struct i2c_platform_data *pdata; int ret; pdata = pdev->platform_data; i2c_fsl = xzalloc(sizeof(*i2c_fsl)); #ifdef CONFIG_COMMON_CLK i2c_fsl->clk = clk_get(pdev, NULL); if (IS_ERR(i2c_fsl->clk)) { ret = PTR_ERR(i2c_fsl->clk); goto fail; } #endif /* Setup i2c_fsl driver structure */ i2c_fsl->adapter.master_xfer = i2c_fsl_xfer; i2c_fsl->adapter.nr = pdev->id; i2c_fsl->adapter.dev.parent = pdev; i2c_fsl->adapter.dev.device_node = pdev->device_node; i2c_fsl->base = dev_request_mem_region(pdev, 0); if (IS_ERR(i2c_fsl->base)) { ret = PTR_ERR(i2c_fsl->base); goto fail; } i2c_fsl_init_recovery(i2c_fsl, pdev); i2c_fsl->dfsrr = -1; /* Set up clock divider */ if (pdata && pdata->bitrate) i2c_fsl_set_clk(i2c_fsl, pdata->bitrate); else i2c_fsl_set_clk(i2c_fsl, FSL_I2C_BIT_RATE); /* Set up chip registers to defaults */ writeb(0, i2c_fsl->base + FSL_I2C_I2CR); writeb(0, i2c_fsl->base + FSL_I2C_I2SR); /* Add I2C adapter */ ret = i2c_add_numbered_adapter(&i2c_fsl->adapter); if (ret < 0) { dev_err(pdev, "registration failed\n"); goto fail; } return 0; fail: kfree(i2c_fsl); return ret; }
static int __init i2c_fsl_probe(struct device_d *pdev) { struct resource *iores; struct fsl_i2c_struct *i2c_fsl; struct i2c_platform_data *pdata; int ret; pdata = pdev->platform_data; i2c_fsl = xzalloc(sizeof(*i2c_fsl)); #ifdef CONFIG_COMMON_CLK i2c_fsl->clk = clk_get(pdev, NULL); if (IS_ERR(i2c_fsl->clk)) { ret = PTR_ERR(i2c_fsl->clk); goto fail; } clk_enable(i2c_fsl->clk); #endif if (IS_ENABLED(CONFIG_OFDEVICE)) { i2c_fsl->hwdata = of_device_get_match_data(pdev); if (!i2c_fsl->hwdata) { ret = -EINVAL; goto fail; } } else { i2c_fsl->hwdata = &imx21_i2c_hwdata; } /* Setup i2c_fsl driver structure */ i2c_fsl->adapter.master_xfer = i2c_fsl_xfer; i2c_fsl->adapter.nr = pdev->id; i2c_fsl->adapter.dev.parent = pdev; i2c_fsl->adapter.dev.device_node = pdev->device_node; iores = dev_request_mem_resource(pdev, 0); if (IS_ERR(iores)) { ret = PTR_ERR(iores); goto fail; } i2c_fsl->base = IOMEM(iores->start); i2c_fsl_init_recovery(i2c_fsl, pdev); i2c_fsl->dfsrr = -1; /* Set up clock divider */ if (pdata && pdata->bitrate) i2c_fsl_set_clk(i2c_fsl, pdata->bitrate); else i2c_fsl_set_clk(i2c_fsl, FSL_I2C_BIT_RATE); /* Set up chip registers to defaults */ fsl_i2c_write_reg(i2c_fsl->hwdata->i2cr_ien_opcode ^ I2CR_IEN, i2c_fsl, FSL_I2C_I2CR); fsl_i2c_write_reg(i2c_fsl->hwdata->i2sr_clr_opcode, i2c_fsl, FSL_I2C_I2SR); /* Add I2C adapter */ ret = i2c_add_numbered_adapter(&i2c_fsl->adapter); if (ret < 0) { dev_err(pdev, "registration failed\n"); goto fail; } return 0; fail: kfree(i2c_fsl); return ret; }