Skip to content

Commit

Permalink
[ARM] pxa: avoid kfreeing static data if platform device fails to reg…
Browse files Browse the repository at this point in the history
…ister

When a dynamically allocated platform device is 'put', the platform
device's platform_data is kfree'd.  This is bad if it's pointing at
static data.  Use the provided function to register platform data
for these devices.

This also means we can mark the pcmcia ops structures as __initdata.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
  • Loading branch information
Russell King authored and Russell King committed Jun 2, 2008
1 parent 04ba0f6 commit 4e5e8de
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 13 deletions.
11 changes: 7 additions & 4 deletions drivers/pcmcia/pxa2xx_cm_x270.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ static void cmx270_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
}


static struct pcmcia_low_level cmx270_pcmcia_ops = {
static struct pcmcia_low_level cmx270_pcmcia_ops __initdata = {
.owner = THIS_MODULE,
.hw_init = cmx270_pcmcia_hw_init,
.hw_shutdown = cmx270_pcmcia_shutdown,
Expand All @@ -156,10 +156,13 @@ static int __init cmx270_pcmcia_init(void)
if (!cmx270_pcmcia_device)
return -ENOMEM;

cmx270_pcmcia_device->dev.platform_data = &cmx270_pcmcia_ops;
ret = platform_device_add_data(cmx270_pcmcia_device, &cmx270_pcmcia_ops,
sizeof(cmx270_pcmcia_ops));

printk(KERN_INFO "Registering cm-x270 PCMCIA interface.\n");
ret = platform_device_add(cmx270_pcmcia_device);
if (ret == 0) {
printk(KERN_INFO "Registering cm-x270 PCMCIA interface.\n");
ret = platform_device_add(cmx270_pcmcia_device);
}

if (ret)
platform_device_put(cmx270_pcmcia_device);
Expand Down
9 changes: 5 additions & 4 deletions drivers/pcmcia/pxa2xx_mainstone.c
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ static void mst_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
{
}

static struct pcmcia_low_level mst_pcmcia_ops = {
static struct pcmcia_low_level mst_pcmcia_ops __initdata = {
.owner = THIS_MODULE,
.hw_init = mst_pcmcia_hw_init,
.hw_shutdown = mst_pcmcia_hw_shutdown,
Expand All @@ -161,9 +161,10 @@ static int __init mst_pcmcia_init(void)
if (!mst_pcmcia_device)
return -ENOMEM;

mst_pcmcia_device->dev.platform_data = &mst_pcmcia_ops;

ret = platform_device_add(mst_pcmcia_device);
ret = platform_device_add_data(mst_pcmcia_device, &mst_pcmcia_ops,
sizeof(mst_pcmcia_ops));
if (ret == 0)
ret = platform_device_add(mst_pcmcia_device);

if (ret)
platform_device_put(mst_pcmcia_device);
Expand Down
12 changes: 7 additions & 5 deletions drivers/pcmcia/pxa2xx_sharpsl.c
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ static void sharpsl_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
sharpsl_pcmcia_init_reset(skt);
}

static struct pcmcia_low_level sharpsl_pcmcia_ops = {
static struct pcmcia_low_level sharpsl_pcmcia_ops __initdata = {
.owner = THIS_MODULE,
.hw_init = sharpsl_pcmcia_hw_init,
.hw_shutdown = sharpsl_pcmcia_hw_shutdown,
Expand Down Expand Up @@ -261,10 +261,12 @@ static int __init sharpsl_pcmcia_init(void)
if (!sharpsl_pcmcia_device)
return -ENOMEM;

sharpsl_pcmcia_device->dev.platform_data = &sharpsl_pcmcia_ops;
sharpsl_pcmcia_device->dev.parent = platform_scoop_config->devs[0].dev;

ret = platform_device_add(sharpsl_pcmcia_device);
ret = platform_device_add_data(sharpsl_pcmcia_device,
&sharpsl_pcmcia_ops, sizeof(sharpsl_pcmcia_ops));
if (ret == 0) {
sharpsl_pcmcia_device->dev.parent = platform_scoop_config->devs[0].dev;
ret = platform_device_add(sharpsl_pcmcia_device);
}

if (ret)
platform_device_put(sharpsl_pcmcia_device);
Expand Down

0 comments on commit 4e5e8de

Please sign in to comment.