forked from luck/tmp_suning_uos_patched
[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: Enrico Scholz <enrico.scholz@sigma-chemnitz.de> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
ece97941c3
commit
6776f3d26a
|
@ -837,20 +837,10 @@ static const struct i2c_algorithm i2c_pxa_algorithm = {
|
||||||
.functionality = i2c_pxa_functionality,
|
.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)
|
#define res_len(r) ((r)->end - (r)->start + 1)
|
||||||
static int i2c_pxa_probe(struct platform_device *dev)
|
static int i2c_pxa_probe(struct platform_device *dev)
|
||||||
{
|
{
|
||||||
struct pxa_i2c *i2c = &i2c_pxa;
|
struct pxa_i2c *i2c;
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
struct i2c_pxa_platform_data *plat = dev->dev.platform_data;
|
struct i2c_pxa_platform_data *plat = dev->dev.platform_data;
|
||||||
int ret;
|
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))
|
if (!request_mem_region(res->start, res_len(res), res->name))
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
i2c = kmalloc(sizeof(struct pxa_i2c), GFP_KERNEL);
|
i2c = kzalloc(sizeof(struct pxa_i2c), GFP_KERNEL);
|
||||||
if (!i2c) {
|
if (!i2c) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto emalloc;
|
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);
|
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));
|
i2c->reg_base = ioremap(res->start, res_len(res));
|
||||||
if (!i2c->reg_base) {
|
if (!i2c->reg_base) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user