diff options
author | Marc Dietrich <marvin24@gmx.de> | 2013-04-29 17:14:52 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-05-14 07:07:50 -0400 |
commit | c2b62f60f67e0375c09d3c385ba90999d39d3dce (patch) | |
tree | 4bd2dcc1e0c9b73cbdcea4fce495022ceb998f46 | |
parent | 111c158787b2a2036c444f735370cb6aef823f78 (diff) |
staging: nvec: cleanup childs on remove
Disable device functions and unregister notifier if available. The
serio device must not be "kzallocated". Otherwise serio_unregister_port
will fail because the device is already freed.
Signed-off-by: Marc Dietrich <marvin24@gmx.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/staging/nvec/nvec.c | 5 | ||||
-rw-r--r-- | drivers/staging/nvec/nvec_kbd.c | 9 | ||||
-rw-r--r-- | drivers/staging/nvec/nvec_power.c | 1 | ||||
-rw-r--r-- | drivers/staging/nvec/nvec_ps2.c | 7 |
4 files changed, 19 insertions, 3 deletions
diff --git a/drivers/staging/nvec/nvec.c b/drivers/staging/nvec/nvec.c index 51a123e2b066..0e34679916b8 100644 --- a/drivers/staging/nvec/nvec.c +++ b/drivers/staging/nvec/nvec.c | |||
@@ -829,7 +829,7 @@ static int tegra_nvec_probe(struct platform_device *pdev) | |||
829 | return -ENODEV; | 829 | return -ENODEV; |
830 | } | 830 | } |
831 | 831 | ||
832 | i2c_clk = clk_get(&pdev->dev, "div-clk"); | 832 | i2c_clk = devm_clk_get(&pdev->dev, "div-clk"); |
833 | if (IS_ERR(i2c_clk)) { | 833 | if (IS_ERR(i2c_clk)) { |
834 | dev_err(nvec->dev, "failed to get controller clock\n"); | 834 | dev_err(nvec->dev, "failed to get controller clock\n"); |
835 | return -ENODEV; | 835 | return -ENODEV; |
@@ -916,8 +916,11 @@ static int tegra_nvec_remove(struct platform_device *pdev) | |||
916 | 916 | ||
917 | nvec_toggle_global_events(nvec, false); | 917 | nvec_toggle_global_events(nvec, false); |
918 | mfd_remove_devices(nvec->dev); | 918 | mfd_remove_devices(nvec->dev); |
919 | nvec_unregister_notifier(nvec, &nvec->nvec_status_notifier); | ||
919 | cancel_work_sync(&nvec->rx_work); | 920 | cancel_work_sync(&nvec->rx_work); |
920 | cancel_work_sync(&nvec->tx_work); | 921 | cancel_work_sync(&nvec->tx_work); |
922 | /* FIXME: needs check wether nvec is responsible for power off */ | ||
923 | pm_power_off = NULL; | ||
921 | 924 | ||
922 | return 0; | 925 | return 0; |
923 | } | 926 | } |
diff --git a/drivers/staging/nvec/nvec_kbd.c b/drivers/staging/nvec/nvec_kbd.c index fdbe0f3e86d8..a0ec52a4114f 100644 --- a/drivers/staging/nvec/nvec_kbd.c +++ b/drivers/staging/nvec/nvec_kbd.c | |||
@@ -169,8 +169,15 @@ fail: | |||
169 | 169 | ||
170 | static int nvec_kbd_remove(struct platform_device *pdev) | 170 | static int nvec_kbd_remove(struct platform_device *pdev) |
171 | { | 171 | { |
172 | struct nvec_chip *nvec = dev_get_drvdata(pdev->dev.parent); | ||
173 | char disable_kbd[] = { NVEC_KBD, DISABLE_KBD }, | ||
174 | uncnfg_wake_key_reporting[] = { NVEC_KBD, CNFG_WAKE_KEY_REPORTING, | ||
175 | false }; | ||
176 | nvec_write_async(nvec, uncnfg_wake_key_reporting, 3); | ||
177 | nvec_write_async(nvec, disable_kbd, 2); | ||
178 | nvec_unregister_notifier(nvec, &keys_dev.notifier); | ||
179 | |||
172 | input_unregister_device(keys_dev.input); | 180 | input_unregister_device(keys_dev.input); |
173 | input_free_device(keys_dev.input); | ||
174 | 181 | ||
175 | return 0; | 182 | return 0; |
176 | } | 183 | } |
diff --git a/drivers/staging/nvec/nvec_power.c b/drivers/staging/nvec/nvec_power.c index 296f7b9a8c8c..aacfcd6954a3 100644 --- a/drivers/staging/nvec/nvec_power.c +++ b/drivers/staging/nvec/nvec_power.c | |||
@@ -414,6 +414,7 @@ static int nvec_power_remove(struct platform_device *pdev) | |||
414 | struct nvec_power *power = platform_get_drvdata(pdev); | 414 | struct nvec_power *power = platform_get_drvdata(pdev); |
415 | 415 | ||
416 | cancel_delayed_work_sync(&power->poller); | 416 | cancel_delayed_work_sync(&power->poller); |
417 | nvec_unregister_notifier(power->nvec, &power->notifier); | ||
417 | switch (pdev->id) { | 418 | switch (pdev->id) { |
418 | case AC: | 419 | case AC: |
419 | power_supply_unregister(&nvec_psy); | 420 | power_supply_unregister(&nvec_psy); |
diff --git a/drivers/staging/nvec/nvec_ps2.c b/drivers/staging/nvec/nvec_ps2.c index abb03f023ff6..06dbb02085a9 100644 --- a/drivers/staging/nvec/nvec_ps2.c +++ b/drivers/staging/nvec/nvec_ps2.c | |||
@@ -106,7 +106,7 @@ static int nvec_mouse_probe(struct platform_device *pdev) | |||
106 | struct serio *ser_dev; | 106 | struct serio *ser_dev; |
107 | char mouse_reset[] = { NVEC_PS2, SEND_COMMAND, PSMOUSE_RST, 3 }; | 107 | char mouse_reset[] = { NVEC_PS2, SEND_COMMAND, PSMOUSE_RST, 3 }; |
108 | 108 | ||
109 | ser_dev = devm_kzalloc(&pdev->dev, sizeof(struct serio), GFP_KERNEL); | 109 | ser_dev = kzalloc(sizeof(struct serio), GFP_KERNEL); |
110 | if (ser_dev == NULL) | 110 | if (ser_dev == NULL) |
111 | return -ENOMEM; | 111 | return -ENOMEM; |
112 | 112 | ||
@@ -133,6 +133,11 @@ static int nvec_mouse_probe(struct platform_device *pdev) | |||
133 | 133 | ||
134 | static int nvec_mouse_remove(struct platform_device *pdev) | 134 | static int nvec_mouse_remove(struct platform_device *pdev) |
135 | { | 135 | { |
136 | struct nvec_chip *nvec = dev_get_drvdata(pdev->dev.parent); | ||
137 | |||
138 | ps2_sendcommand(ps2_dev.ser_dev, DISABLE_MOUSE); | ||
139 | ps2_stopstreaming(ps2_dev.ser_dev); | ||
140 | nvec_unregister_notifier(nvec, &ps2_dev.notifier); | ||
136 | serio_unregister_port(ps2_dev.ser_dev); | 141 | serio_unregister_port(ps2_dev.ser_dev); |
137 | 142 | ||
138 | return 0; | 143 | return 0; |