Example #1
0
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;
}
Example #2
0
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;
}