Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 44c5d739 authored by Russell King's avatar Russell King
Browse files

ARM: PNX4008: kzalloc i2c drivers internal data

parent 88d968b2
Loading
Loading
Loading
Loading
+7 −18
Original line number Original line Diff line number Diff line
@@ -18,45 +18,34 @@
#include <mach/irqs.h>
#include <mach/irqs.h>
#include <mach/i2c.h>
#include <mach/i2c.h>


static struct i2c_pnx_algo_data pnx_algo_data0 = {
	.base = PNX4008_I2C1_BASE,
	.irq = I2C_1_INT,
};

static struct i2c_pnx_algo_data pnx_algo_data1 = {
	.base = PNX4008_I2C2_BASE,
	.irq = I2C_2_INT,
};

static struct i2c_pnx_algo_data pnx_algo_data2 = {
	.base = (PNX4008_USB_CONFIG_BASE + 0x300),
	.irq = USB_I2C_INT,
};

static struct i2c_adapter pnx_adapter0 = {
static struct i2c_adapter pnx_adapter0 = {
	.name = I2C_CHIP_NAME "0",
	.name = I2C_CHIP_NAME "0",
	.algo_data = &pnx_algo_data0,
};
};

static struct i2c_adapter pnx_adapter1 = {
static struct i2c_adapter pnx_adapter1 = {
	.name = I2C_CHIP_NAME "1",
	.name = I2C_CHIP_NAME "1",
	.algo_data = &pnx_algo_data1,
};
};


static struct i2c_adapter pnx_adapter2 = {
static struct i2c_adapter pnx_adapter2 = {
	.name = "USB-I2C",
	.name = "USB-I2C",
	.algo_data = &pnx_algo_data2,
};
};


static struct i2c_pnx_data i2c0_data = {
static struct i2c_pnx_data i2c0_data = {
	.adapter = &pnx_adapter0,
	.adapter = &pnx_adapter0,
	.base = PNX4008_I2C1_BASE,
	.irq = I2C_1_INT,
};
};


static struct i2c_pnx_data i2c1_data = {
static struct i2c_pnx_data i2c1_data = {
	.adapter = &pnx_adapter1,
	.adapter = &pnx_adapter1,
	.base = PNX4008_I2C2_BASE,
	.irq = I2C_2_INT,
};
};


static struct i2c_pnx_data i2c2_data = {
static struct i2c_pnx_data i2c2_data = {
	.adapter = &pnx_adapter2,
	.adapter = &pnx_adapter2,
	.base = (PNX4008_USB_CONFIG_BASE + 0x300),
	.irq = USB_I2C_INT,
};
};


static struct platform_device i2c0_device = {
static struct platform_device i2c0_device = {
+19 −10
Original line number Original line Diff line number Diff line
@@ -587,10 +587,16 @@ static int __devinit i2c_pnx_probe(struct platform_device *pdev)
		goto out;
		goto out;
	}
	}


	alg_data = kzalloc(sizeof(*alg_data), GFP_KERNEL);
	if (!alg_data) {
		ret = -ENOMEM;
		goto err_kzalloc;
	}

	platform_set_drvdata(pdev, i2c_pnx);
	platform_set_drvdata(pdev, i2c_pnx);


	i2c_pnx->adapter->algo = &pnx_algorithm;
	i2c_pnx->adapter->algo = &pnx_algorithm;
	alg_data = i2c_pnx->adapter->algo_data;
	i2c_pnx->adapter->algo_data = alg_data;


	alg_data->clk = clk_get(&pdev->dev, NULL);
	alg_data->clk = clk_get(&pdev->dev, NULL);
	if (IS_ERR(alg_data->clk)) {
	if (IS_ERR(alg_data->clk)) {
@@ -603,16 +609,16 @@ static int __devinit i2c_pnx_probe(struct platform_device *pdev)
	alg_data->mif.timer.data = (unsigned long)i2c_pnx->adapter;
	alg_data->mif.timer.data = (unsigned long)i2c_pnx->adapter;


	/* Register I/O resource */
	/* Register I/O resource */
	if (!request_mem_region(alg_data->base, I2C_PNX_REGION_SIZE,
	if (!request_mem_region(i2c_pnx->base, I2C_PNX_REGION_SIZE,
				pdev->name)) {
				pdev->name)) {
		dev_err(&pdev->dev,
		dev_err(&pdev->dev,
		       "I/O region 0x%08x for I2C already in use.\n",
		       "I/O region 0x%08x for I2C already in use.\n",
		       alg_data->base);
		       i2c_pnx->base);
		ret = -ENODEV;
		ret = -ENODEV;
		goto out_clkget;
		goto out_clkget;
	}
	}


	alg_data->ioaddr = ioremap(alg_data->base, I2C_PNX_REGION_SIZE);
	alg_data->ioaddr = ioremap(i2c_pnx->base, I2C_PNX_REGION_SIZE);
	if (!alg_data->ioaddr) {
	if (!alg_data->ioaddr) {
		dev_err(&pdev->dev, "Couldn't ioremap I2C I/O region\n");
		dev_err(&pdev->dev, "Couldn't ioremap I2C I/O region\n");
		ret = -ENOMEM;
		ret = -ENOMEM;
@@ -647,7 +653,7 @@ static int __devinit i2c_pnx_probe(struct platform_device *pdev)
	}
	}
	init_completion(&alg_data->mif.complete);
	init_completion(&alg_data->mif.complete);


	ret = request_irq(alg_data->irq, i2c_pnx_interrupt,
	ret = request_irq(i2c_pnx->irq, i2c_pnx_interrupt,
			0, pdev->name, i2c_pnx->adapter);
			0, pdev->name, i2c_pnx->adapter);
	if (ret)
	if (ret)
		goto out_clock;
		goto out_clock;
@@ -662,21 +668,23 @@ static int __devinit i2c_pnx_probe(struct platform_device *pdev)
	}
	}


	dev_dbg(&pdev->dev, "%s: Master at %#8x, irq %d.\n",
	dev_dbg(&pdev->dev, "%s: Master at %#8x, irq %d.\n",
	       i2c_pnx->adapter->name, alg_data->base, alg_data->irq);
	       i2c_pnx->adapter->name, i2c_pnx->base, i2c_pnx->irq);


	return 0;
	return 0;


out_irq:
out_irq:
	free_irq(alg_data->irq, i2c_pnx->adapter);
	free_irq(i2c_pnx->irq, i2c_pnx->adapter);
out_clock:
out_clock:
	clk_disable(alg_data->clk);
	clk_disable(alg_data->clk);
out_unmap:
out_unmap:
	iounmap(alg_data->ioaddr);
	iounmap(alg_data->ioaddr);
out_release:
out_release:
	release_mem_region(alg_data->base, I2C_PNX_REGION_SIZE);
	release_mem_region(i2c_pnx->base, I2C_PNX_REGION_SIZE);
out_clkget:
out_clkget:
	clk_put(alg_data->clk);
	clk_put(alg_data->clk);
out_drvdata:
out_drvdata:
	kfree(alg_data);
err_kzalloc:
	platform_set_drvdata(pdev, NULL);
	platform_set_drvdata(pdev, NULL);
out:
out:
	return ret;
	return ret;
@@ -688,12 +696,13 @@ static int __devexit i2c_pnx_remove(struct platform_device *pdev)
	struct i2c_adapter *adap = i2c_pnx->adapter;
	struct i2c_adapter *adap = i2c_pnx->adapter;
	struct i2c_pnx_algo_data *alg_data = adap->algo_data;
	struct i2c_pnx_algo_data *alg_data = adap->algo_data;


	free_irq(alg_data->irq, i2c_pnx->adapter);
	free_irq(i2c_pnx->irq, i2c_pnx->adapter);
	i2c_del_adapter(adap);
	i2c_del_adapter(adap);
	clk_disable(alg_data->clk);
	clk_disable(alg_data->clk);
	iounmap(alg_data->ioaddr);
	iounmap(alg_data->ioaddr);
	release_mem_region(alg_data->base, I2C_PNX_REGION_SIZE);
	release_mem_region(i2c_pnx->base, I2C_PNX_REGION_SIZE);
	clk_put(alg_data->clk);
	clk_put(alg_data->clk);
	kfree(alg_data);
	platform_set_drvdata(pdev, NULL);
	platform_set_drvdata(pdev, NULL);


	return 0;
	return 0;
+2 −2
Original line number Original line Diff line number Diff line
@@ -25,9 +25,7 @@ struct i2c_pnx_mif {
};
};


struct i2c_pnx_algo_data {
struct i2c_pnx_algo_data {
	u32			base;
	void __iomem		*ioaddr;
	void __iomem		*ioaddr;
	int			irq;
	struct i2c_pnx_mif	mif;
	struct i2c_pnx_mif	mif;
	int			last;
	int			last;
	struct clk		*clk;
	struct clk		*clk;
@@ -35,6 +33,8 @@ struct i2c_pnx_algo_data {


struct i2c_pnx_data {
struct i2c_pnx_data {
	struct i2c_adapter *adapter;
	struct i2c_adapter *adapter;
	u32 base;
	int irq;
};
};


#endif /* __I2C_PNX_H__ */
#endif /* __I2C_PNX_H__ */