Hi Wolfram, On Sat, Mar 20, 2010 at 03:12:54PM +0100, Wolfram Sang wrote: > Fix I2C-drivers which missed setting clientdata to NULL before freeing the > structure it points to. Also fix drivers which do this _after_ the structure > was freed already. Patch applied, many thanks. Cheers, Samuel. > Signed-off-by: Wolfram Sang <w.sang@xxxxxxxxxxxxxx> > Cc: Samuel Ortiz <sameo@xxxxxxxxxxxxxxx> > Cc: Mark Brown <broonie@xxxxxxxxxxxxxxxxxxxxxxxxxxx> > --- > > Found using coccinelle, then reviewed. Full patchset is available via > kernel-janitors, linux-i2c, and LKML. > --- > drivers/mfd/88pm860x-i2c.c | 1 + > drivers/mfd/ab3100-core.c | 2 ++ > drivers/mfd/da903x.c | 1 + > drivers/mfd/menelaus.c | 3 ++- > drivers/mfd/pcf50633-core.c | 1 + > drivers/mfd/tps65010.c | 2 +- > drivers/mfd/wm8350-i2c.c | 2 ++ > 7 files changed, 10 insertions(+), 2 deletions(-) > > diff --git a/drivers/mfd/88pm860x-i2c.c b/drivers/mfd/88pm860x-i2c.c > index c37e12b..aa81448 100644 > --- a/drivers/mfd/88pm860x-i2c.c > +++ b/drivers/mfd/88pm860x-i2c.c > @@ -201,6 +201,7 @@ static int __devexit pm860x_remove(struct i2c_client *client) > i2c_unregister_device(chip->companion); > i2c_set_clientdata(chip->companion, NULL); > i2c_set_clientdata(chip->client, NULL); > + i2c_set_clientdata(client, NULL); > kfree(chip); > return 0; > } > diff --git a/drivers/mfd/ab3100-core.c b/drivers/mfd/ab3100-core.c > index a2ce3b6..e6fc43f 100644 > --- a/drivers/mfd/ab3100-core.c > +++ b/drivers/mfd/ab3100-core.c > @@ -919,6 +919,7 @@ static int __init ab3100_probe(struct i2c_client *client, > i2c_unregister_device(ab3100->testreg_client); > exit_no_testreg_client: > exit_no_detect: > + i2c_set_clientdata(client, NULL); > kfree(ab3100); > return err; > } > @@ -940,6 +941,7 @@ static int __exit ab3100_remove(struct i2c_client *client) > * their notifiers so deactivate IRQ > */ > free_irq(client->irq, ab3100); > + i2c_set_clientdata(client, NULL); > kfree(ab3100); > return 0; > } > diff --git a/drivers/mfd/da903x.c b/drivers/mfd/da903x.c > index e5ffe56..ec8178c 100644 > --- a/drivers/mfd/da903x.c > +++ b/drivers/mfd/da903x.c > @@ -543,6 +543,7 @@ static int __devexit da903x_remove(struct i2c_client *client) > struct da903x_chip *chip = i2c_get_clientdata(client); > > da903x_remove_subdevs(chip); > + i2c_set_clientdata(client, NULL); > kfree(chip); > return 0; > } > diff --git a/drivers/mfd/menelaus.c b/drivers/mfd/menelaus.c > index 970afa1..d9e60ba 100644 > --- a/drivers/mfd/menelaus.c > +++ b/drivers/mfd/menelaus.c > @@ -1227,6 +1227,7 @@ fail2: > free_irq(client->irq, menelaus); > flush_scheduled_work(); > fail1: > + i2c_set_clientdata(client, NULL); > kfree(menelaus); > return err; > } > @@ -1236,8 +1237,8 @@ static int __exit menelaus_remove(struct i2c_client *client) > struct menelaus_chip *menelaus = i2c_get_clientdata(client); > > free_irq(client->irq, menelaus); > - kfree(menelaus); > i2c_set_clientdata(client, NULL); > + kfree(menelaus); > the_menelaus = NULL; > return 0; > } > diff --git a/drivers/mfd/pcf50633-core.c b/drivers/mfd/pcf50633-core.c > index 03dcc92..ab7b4dd 100644 > --- a/drivers/mfd/pcf50633-core.c > +++ b/drivers/mfd/pcf50633-core.c > @@ -675,6 +675,7 @@ static int __devexit pcf50633_remove(struct i2c_client *client) > for (i = 0; i < PCF50633_NUM_REGULATORS; i++) > platform_device_unregister(pcf->regulator_pdev[i]); > > + i2c_set_clientdata(client, NULL); > kfree(pcf); > > return 0; > diff --git a/drivers/mfd/tps65010.c b/drivers/mfd/tps65010.c > index e595530..9b22a77 100644 > --- a/drivers/mfd/tps65010.c > +++ b/drivers/mfd/tps65010.c > @@ -530,8 +530,8 @@ static int __exit tps65010_remove(struct i2c_client *client) > cancel_delayed_work(&tps->work); > flush_scheduled_work(); > debugfs_remove(tps->file); > - kfree(tps); > i2c_set_clientdata(client, NULL); > + kfree(tps); > the_tps = NULL; > return 0; > } > diff --git a/drivers/mfd/wm8350-i2c.c b/drivers/mfd/wm8350-i2c.c > index 8d8c932..2dd3e8a 100644 > --- a/drivers/mfd/wm8350-i2c.c > +++ b/drivers/mfd/wm8350-i2c.c > @@ -81,6 +81,7 @@ static int wm8350_i2c_probe(struct i2c_client *i2c, > return ret; > > err: > + i2c_set_clientdata(i2c, NULL); > kfree(wm8350); > return ret; > } > @@ -90,6 +91,7 @@ static int wm8350_i2c_remove(struct i2c_client *i2c) > struct wm8350 *wm8350 = i2c_get_clientdata(i2c); > > wm8350_device_exit(wm8350); > + i2c_set_clientdata(i2c, NULL); > kfree(wm8350); > > return 0; > -- > 1.7.0 > -- Intel Open Source Technology Centre http://oss.intel.com/ -- To unsubscribe from this list: send the line "unsubscribe linux-i2c" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html