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

Commit 6776f3d2 authored by Enrico Scholz's avatar Enrico Scholz Committed by Russell King
Browse files

[ARM] 4403/1: Make the PXA-I2C driver work with lockdep validator



Using lockdep validator causes warnings like

  INFO: trying to register non-static key.
  the code is fine but needs lockdep annotation.
  turning off the locking correctness validator.
  [<c00241a0>] (dump_stack+0x0/0x14) from [<c00520f8>] (__lock_acquire+0x150/0xc40)
  [<c0051fa8>] (__lock_acquire+0x0/0xc40) from [<c00530a0>] (lock_acquire+0x5c/0x70)
  [<c0053044>] (lock_acquire+0x0/0x70) from [<c01d9e44>] (_spin_lock_irq+0x48/0x58)
   r7:c07e5144 r6:00000000 r5:c015fb94 r4:c07e50b8
  [<c01d9dfc>] (_spin_lock_irq+0x0/0x58) from [<c015fb94>] (i2c_pxa_xfer+0x110/0x2e0)
   r5:c07e50b8 r4:0000001f

This is caused by memcpy'ing a statical initialized spin-lock. This patch
removes a static pxa_i2c structure which was used only as a source for this
memcpy() operation. Instead of, members and the spinlock will be
initialized manually.

Signed-off-by: default avatarEnrico Scholz <enrico.scholz@sigma-chemnitz.de>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent ece97941
Loading
Loading
Loading
Loading
+9 −14
Original line number Diff line number Diff line
@@ -837,20 +837,10 @@ static const struct i2c_algorithm i2c_pxa_algorithm = {
	.functionality	= i2c_pxa_functionality,
};

static struct pxa_i2c i2c_pxa = {
	.lock	= __SPIN_LOCK_UNLOCKED(i2c_pxa.lock),
	.adap	= {
		.owner		= THIS_MODULE,
		.algo		= &i2c_pxa_algorithm,
		.name		= "pxa2xx-i2c.0",
		.retries	= 5,
	},
};

#define res_len(r)		((r)->end - (r)->start + 1)
static int i2c_pxa_probe(struct platform_device *dev)
{
	struct pxa_i2c *i2c = &i2c_pxa;
	struct pxa_i2c *i2c;
	struct resource *res;
	struct i2c_pxa_platform_data *plat = dev->dev.platform_data;
	int ret;
@@ -864,15 +854,20 @@ static int i2c_pxa_probe(struct platform_device *dev)
	if (!request_mem_region(res->start, res_len(res), res->name))
		return -ENOMEM;

	i2c = kmalloc(sizeof(struct pxa_i2c), GFP_KERNEL);
	i2c = kzalloc(sizeof(struct pxa_i2c), GFP_KERNEL);
	if (!i2c) {
		ret = -ENOMEM;
		goto emalloc;
	}

	memcpy(i2c, &i2c_pxa, sizeof(struct pxa_i2c));
	i2c->adap.owner   = THIS_MODULE;
	i2c->adap.algo    = &i2c_pxa_algorithm;
	i2c->adap.retries = 5;

	spin_lock_init(&i2c->lock);
	init_waitqueue_head(&i2c->wait);
	i2c->adap.name[strlen(i2c->adap.name) - 1] = '0' + dev->id % 10;

	sprintf(i2c->adap.name, "pxa_i2c-i2c.%u", dev->id);

	i2c->reg_base = ioremap(res->start, res_len(res));
	if (!i2c->reg_base) {