projects
/
profile
/
common
/
kernel-common.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
8106551
)
[ARM] pxamci: call mmc_remove_host() before freeing resources
author
Daniel Mack
<daniel@caiaq.de>
Tue, 1 Dec 2009 17:17:18 +0000
(18:17 +0100)
committer
Eric Miao
<eric.y.miao@gmail.com>
Wed, 2 Dec 2009 14:58:19 +0000
(22:58 +0800)
mmc_remove_host() will cause the mmc core to switch off the bus power by
eventually calling pxamci_set_ios(). This function uses the regulator or
the GPIO which have been freed already.
This causes the following Oops on module unload.
[ 49.519649] Unable to handle kernel paging request at virtual address
30303a70
[ 49.526878] pgd =
c7084000
[ 49.529563] [
30303a70
] *pgd=
00000000
[ 49.533136] Internal error: Oops: 5 [#1]
[ 49.537025] last sysfs file: /sys/devices/platform/pxa27x-ohci/usb1/1-1/1-1:1.0/host0/target0:0:0/0:0:0:0/scsi_level
[ 49.547471] Modules linked in: pxamci(-) eeti_ts
[ 49.552061] CPU: 0 Not tainted (2.6.32-rc8 #322)
[ 49.557001] PC is at regulator_is_enabled+0x3c/0xbc
[ 49.561846] LR is at regulator_is_enabled+0x30/0xbc
[ 49.566691] pc : [<
c01a2448
>] lr : [<
c01a243c
>] psr:
60000013
[ 49.566702] sp :
c7083e70
ip :
30303a30
fp :
00000000
[ 49.578093] r10:
c705e200
r9 :
c7082000
r8 :
c705e2e0
[ 49.583280] r7 :
c7061340
r6 :
c7061340
r5 :
c7083e70
r4 :
00000000
[ 49.589759] r3 :
c04dc434
r2 :
c04dc434
r1 :
c03eecea
r0 :
00000047
[ 49.596241] Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
[ 49.603329] Control:
0000397f
Table:
a7084018
DAC:
00000015
[ 49.609031] Process rmmod (pid: 1101, stack limit = 0xc7082278)
[ 49.614908] Stack: (0xc7083e70 to 0xc7084000)
[ 49.619238] 3e60:
c7082000
c703c4f8
c705ea00
c04f4074
[ 49.627366] 3e80:
00000000
c705e3a0
ffffffff
c0247ddc
c70361a0
00000000
c705e3a0
ffffffff
[ 49.635499] 3ea0:
c705e200
bf006400
c78c4f00
c705e200
c705e3a0
ffffffff
c705e200
ffffffff
[ 49.643633] 3ec0:
c04d8ac8
c02476d0
ffffffff
c0247c60
c705e200
c0248678
c705e200
c0249064
[ 49.651765] 3ee0:
ffffffff
bf006204
c04d8ad0
c04d8ad0
c04d8ac8
bf007490
00000880
c00440c4
[ 49.659898] 3f00:
0000b748
c01c5708
bf007490
c01c44c8
c04d8ac8
c04d8afc
bf007490
c01c4570
[ 49.668031] 3f20:
bf007490
bf00750c
c04f4258
c01c37a4
00000000
bf00750c
c7083f44
c007b014
[ 49.676162] 3f40:
4000d000
6d617870
08006963
00000001
00000000
c7085000
00000001
00000000
[ 49.684287] 3f60:
4000d000
c7083f8c
00000001
bea01a54
00005401
c7ab1400
c00440c4
00082000
[ 49.692420] 3f80:
bf00750c
00000880
c7083f8c
00000000
4000cfa8
00000000
00000880
bea01cc8
[ 49.700552] 3fa0:
00000081
c0043f40
00000000
00000880
bea01cc8
00000880
00000006
00000000
[ 49.708677] 3fc0:
00000000
00000880
bea01cc8
00000081
00000097
0000cca4
0000b748
00000000
[ 49.716802] 3fe0:
4001a4f0
bea01cc0
00018bf4
4001a4fc
20000010
bea01cc8
a063e021
a063e421
[ 49.724958] [<
c01a2448
>] (regulator_is_enabled+0x3c/0xbc) from [<
c0247ddc
>] (mmc_regulator_set_ocr+0x14/0xd8)
[ 49.734836] [<
c0247ddc
>] (mmc_regulator_set_ocr+0x14/0xd8) from [<
bf006400
>] (pxamci_set_ios+0xd8/0x17c [pxamci])
[ 49.745044] [<
bf006400
>] (pxamci_set_ios+0xd8/0x17c [pxamci]) from [<
c02476d0
>] (mmc_power_off+0x50/0x58)
[ 49.754555] [<
c02476d0
>] (mmc_power_off+0x50/0x58) from [<
c0247c60
>] (mmc_detach_bus+0x68/0xc4)
[ 49.763207] [<
c0247c60
>] (mmc_detach_bus+0x68/0xc4) from [<
c0248678
>] (mmc_stop_host+0xd4/0x1bc)
[ 49.771944] [<
c0248678
>] (mmc_stop_host+0xd4/0x1bc) from [<
c0249064
>] (mmc_remove_host+0xc/0x20)
[ 49.780681] [<
c0249064
>] (mmc_remove_host+0xc/0x20) from [<
bf006204
>] (pxamci_remove+0xc8/0x174 [pxamci])
[ 49.790211] [<
bf006204
>] (pxamci_remove+0xc8/0x174 [pxamci]) from [<
c01c5708
>] (platform_drv_remove+0x1c/0x24)
[ 49.800164] [<
c01c5708
>] (platform_drv_remove+0x1c/0x24) from [<
c01c44c8
>] (__device_release_driver+0x7c/0xc4)
[ 49.810110] [<
c01c44c8
>] (__device_release_driver+0x7c/0xc4) from [<
c01c4570
>] (driver_detach+0x60/0x8c)
[ 49.819535] [<
c01c4570
>] (driver_detach+0x60/0x8c) from [<
c01c37a4
>] (bus_remove_driver+0x90/0xcc)
[ 49.828452] [<
c01c37a4
>] (bus_remove_driver+0x90/0xcc) from [<
c007b014
>] (sys_delete_module+0x1d8/0x254)
[ 49.837891] [<
c007b014
>] (sys_delete_module+0x1d8/0x254) from [<
c0043f40
>] (ret_fast_syscall+0x0/0x28)
[ 49.847145] Code:
eb06c53a
e596c030
e1a0500d
e59f106c
(
e59c0040
)
[ 49.853566] ---[ end trace
b5fa66a00cea142f
]---
Signed-off-by: Daniel Mack <daniel@caiaq.de>
Reported-by: Sven Neumann <s.neumann@raumfeld.com>
Cc: Pierre Ossman <pierre@ossman.eu>
Cc: linux-mmc@vger.kernel.org
Cc: linux-arm-kernel@lists.infradead.org
Cc: stable@kernel.org
Signed-off-by: Eric Miao <eric.y.miao@gmail.com>
drivers/mmc/host/pxamci.c
patch
|
blob
|
history
diff --git
a/drivers/mmc/host/pxamci.c
b/drivers/mmc/host/pxamci.c
index
b00d673
..
9fb480b
100644
(file)
--- a/
drivers/mmc/host/pxamci.c
+++ b/
drivers/mmc/host/pxamci.c
@@
-760,6
+760,8
@@
static int pxamci_remove(struct platform_device *pdev)
if (mmc) {
struct pxamci_host *host = mmc_priv(mmc);
+ mmc_remove_host(mmc);
+
if (host->pdata) {
gpio_cd = host->pdata->gpio_card_detect;
gpio_ro = host->pdata->gpio_card_ro;
@@
-779,8
+781,6
@@
static int pxamci_remove(struct platform_device *pdev)
if (host->pdata && host->pdata->exit)
host->pdata->exit(&pdev->dev, mmc);
- mmc_remove_host(mmc);
-
pxamci_stop_clock(host);
writel(TXFIFO_WR_REQ|RXFIFO_RD_REQ|CLK_IS_OFF|STOP_CMD|
END_CMD_RES|PRG_DONE|DATA_TRAN_DONE,