Skip to content

Commit

Permalink
macintosh/hwmon/ams: Fix device removal sequence
Browse files Browse the repository at this point in the history
Some code that is in ams_exit() (the module exit code) should instead
be called when the device (not module) is removed. It probably doesn't
make much of a difference in the PMU case, but in the I2C case it does
matter.

I make no guarantee that my fix isn't racy, I'm not familiar enough
with the ams driver code to tell for sure.

Signed-off-by: Jean Delvare <khali@linux-fr.org>
Tested-by: Christian Kujau <lists@nerdbynature.de>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Stelian Pop <stelian@popies.net>
Cc: Michael Hanselmann <linux-kernel@hansmi.ch>
Cc: stable@kernel.org
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
  • Loading branch information
Jean Delvare authored and Benjamin Herrenschmidt committed Feb 3, 2010
1 parent 33a470f commit 98ceb75
Show file tree
Hide file tree
Showing 4 changed files with 12 additions and 4 deletions.
11 changes: 7 additions & 4 deletions drivers/hwmon/ams/ams-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -213,17 +213,14 @@ int __init ams_init(void)
return -ENODEV;
}

void ams_exit(void)
void ams_sensor_detach(void)
{
/* Remove input device */
ams_input_exit();

/* Remove attributes */
device_remove_file(&ams_info.of_dev->dev, &dev_attr_current);

/* Shut down implementation */
ams_info.exit();

/* Flush interrupt worker
*
* We do this after ams_info.exit(), because an interrupt might
Expand All @@ -239,6 +236,12 @@ void ams_exit(void)
pmf_unregister_irq_client(&ams_freefall_client);
}

static void __exit ams_exit(void)
{
/* Shut down implementation */
ams_info.exit();
}

MODULE_AUTHOR("Stelian Pop, Michael Hanselmann");
MODULE_DESCRIPTION("Apple Motion Sensor driver");
MODULE_LICENSE("GPL");
Expand Down
2 changes: 2 additions & 0 deletions drivers/hwmon/ams/ams-i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,8 @@ static int ams_i2c_probe(struct i2c_client *client,
static int ams_i2c_remove(struct i2c_client *client)
{
if (ams_info.has_device) {
ams_sensor_detach();

/* Disable interrupts */
ams_i2c_set_irq(AMS_IRQ_ALL, 0);

Expand Down
2 changes: 2 additions & 0 deletions drivers/hwmon/ams/ams-pmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,8 @@ static void ams_pmu_get_xyz(s8 *x, s8 *y, s8 *z)

static void ams_pmu_exit(void)
{
ams_sensor_detach();

/* Disable interrupts */
ams_pmu_set_irq(AMS_IRQ_ALL, 0);

Expand Down
1 change: 1 addition & 0 deletions drivers/hwmon/ams/ams.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ extern struct ams ams_info;

extern void ams_sensors(s8 *x, s8 *y, s8 *z);
extern int ams_sensor_attach(void);
extern void ams_sensor_detach(void);

extern int ams_pmu_init(struct device_node *np);
extern int ams_i2c_init(struct device_node *np);
Expand Down

0 comments on commit 98ceb75

Please sign in to comment.