diff options
| -rw-r--r-- | arch/sh/Kconfig | 2 | ||||
| -rw-r--r-- | arch/sh/boards/mach-ap325rxa/setup.c | 32 | ||||
| -rw-r--r-- | arch/sh/boards/mach-ecovec24/setup.c | 3 | ||||
| -rw-r--r-- | arch/sh/include/asm/pgtable.h | 1 | ||||
| -rw-r--r-- | arch/sh/include/asm/ptrace.h | 6 | ||||
| -rw-r--r-- | arch/sh/include/asm/tlb.h | 1 | ||||
| -rw-r--r-- | arch/sh/include/cpu-sh4/cpu/sh7722.h | 1 | ||||
| -rw-r--r-- | arch/sh/include/cpu-sh4/cpu/sh7724.h | 1 | ||||
| -rw-r--r-- | arch/sh/include/cpu-sh4/cpu/sh7757.h | 1 | ||||
| -rw-r--r-- | arch/sh/kernel/process_32.c | 1 | ||||
| -rw-r--r-- | arch/sh/mm/consistent.c | 2 | ||||
| -rw-r--r-- | drivers/clocksource/sh_cmt.c | 12 | ||||
| -rw-r--r-- | drivers/clocksource/sh_tmu.c | 12 | ||||
| -rw-r--r-- | drivers/dma/shdma.c | 9 |
14 files changed, 39 insertions, 45 deletions
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index 74495a5ea027..f03338c2f088 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig | |||
| @@ -161,7 +161,7 @@ config ARCH_HAS_CPU_IDLE_WAIT | |||
| 161 | 161 | ||
| 162 | config NO_IOPORT | 162 | config NO_IOPORT |
| 163 | def_bool !PCI | 163 | def_bool !PCI |
| 164 | depends on !SH_CAYMAN && !SH_SH4202_MICRODEV | 164 | depends on !SH_CAYMAN && !SH_SH4202_MICRODEV && !SH_SHMIN |
| 165 | 165 | ||
| 166 | config IO_TRAPPED | 166 | config IO_TRAPPED |
| 167 | bool | 167 | bool |
diff --git a/arch/sh/boards/mach-ap325rxa/setup.c b/arch/sh/boards/mach-ap325rxa/setup.c index 618bd566cf53..969421f64a15 100644 --- a/arch/sh/boards/mach-ap325rxa/setup.c +++ b/arch/sh/boards/mach-ap325rxa/setup.c | |||
| @@ -359,37 +359,31 @@ static struct soc_camera_link camera_link = { | |||
| 359 | .priv = &camera_info, | 359 | .priv = &camera_info, |
| 360 | }; | 360 | }; |
| 361 | 361 | ||
| 362 | static void dummy_release(struct device *dev) | 362 | static struct platform_device *camera_device; |
| 363 | |||
| 364 | static void ap325rxa_camera_release(struct device *dev) | ||
| 363 | { | 365 | { |
| 366 | soc_camera_platform_release(&camera_device); | ||
| 364 | } | 367 | } |
| 365 | 368 | ||
| 366 | static struct platform_device camera_device = { | ||
| 367 | .name = "soc_camera_platform", | ||
| 368 | .dev = { | ||
| 369 | .platform_data = &camera_info, | ||
| 370 | .release = dummy_release, | ||
| 371 | }, | ||
| 372 | }; | ||
| 373 | |||
| 374 | static int ap325rxa_camera_add(struct soc_camera_link *icl, | 369 | static int ap325rxa_camera_add(struct soc_camera_link *icl, |
| 375 | struct device *dev) | 370 | struct device *dev) |
| 376 | { | 371 | { |
| 377 | if (icl != &camera_link || camera_probe() <= 0) | 372 | int ret = soc_camera_platform_add(icl, dev, &camera_device, &camera_link, |
| 378 | return -ENODEV; | 373 | ap325rxa_camera_release, 0); |
| 374 | if (ret < 0) | ||
| 375 | return ret; | ||
| 379 | 376 | ||
| 380 | camera_info.dev = dev; | 377 | ret = camera_probe(); |
| 378 | if (ret < 0) | ||
| 379 | soc_camera_platform_del(icl, camera_device, &camera_link); | ||
| 381 | 380 | ||
| 382 | return platform_device_register(&camera_device); | 381 | return ret; |
| 383 | } | 382 | } |
| 384 | 383 | ||
| 385 | static void ap325rxa_camera_del(struct soc_camera_link *icl) | 384 | static void ap325rxa_camera_del(struct soc_camera_link *icl) |
| 386 | { | 385 | { |
| 387 | if (icl != &camera_link) | 386 | soc_camera_platform_del(icl, camera_device, &camera_link); |
| 388 | return; | ||
| 389 | |||
| 390 | platform_device_unregister(&camera_device); | ||
| 391 | memset(&camera_device.dev.kobj, 0, | ||
| 392 | sizeof(camera_device.dev.kobj)); | ||
| 393 | } | 387 | } |
| 394 | #endif /* CONFIG_I2C */ | 388 | #endif /* CONFIG_I2C */ |
| 395 | 389 | ||
diff --git a/arch/sh/boards/mach-ecovec24/setup.c b/arch/sh/boards/mach-ecovec24/setup.c index bb13d0e1b964..3a32741cc0ac 100644 --- a/arch/sh/boards/mach-ecovec24/setup.c +++ b/arch/sh/boards/mach-ecovec24/setup.c | |||
| @@ -885,6 +885,9 @@ static struct platform_device sh_mmcif_device = { | |||
| 885 | }, | 885 | }, |
| 886 | .num_resources = ARRAY_SIZE(sh_mmcif_resources), | 886 | .num_resources = ARRAY_SIZE(sh_mmcif_resources), |
| 887 | .resource = sh_mmcif_resources, | 887 | .resource = sh_mmcif_resources, |
| 888 | .archdata = { | ||
| 889 | .hwblk_id = HWBLK_MMC, | ||
| 890 | }, | ||
| 888 | }; | 891 | }; |
| 889 | #endif | 892 | #endif |
| 890 | 893 | ||
diff --git a/arch/sh/include/asm/pgtable.h b/arch/sh/include/asm/pgtable.h index db85916b9e95..9210e93a92c3 100644 --- a/arch/sh/include/asm/pgtable.h +++ b/arch/sh/include/asm/pgtable.h | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <asm/pgtable-2level.h> | 18 | #include <asm/pgtable-2level.h> |
| 19 | #endif | 19 | #endif |
| 20 | #include <asm/page.h> | 20 | #include <asm/page.h> |
| 21 | #include <asm/mmu.h> | ||
| 21 | 22 | ||
| 22 | #ifndef __ASSEMBLY__ | 23 | #ifndef __ASSEMBLY__ |
| 23 | #include <asm/addrspace.h> | 24 | #include <asm/addrspace.h> |
diff --git a/arch/sh/include/asm/ptrace.h b/arch/sh/include/asm/ptrace.h index 40725b4a8018..88bd6be168a9 100644 --- a/arch/sh/include/asm/ptrace.h +++ b/arch/sh/include/asm/ptrace.h | |||
| @@ -41,7 +41,9 @@ | |||
| 41 | 41 | ||
| 42 | #define user_mode(regs) (((regs)->sr & 0x40000000)==0) | 42 | #define user_mode(regs) (((regs)->sr & 0x40000000)==0) |
| 43 | #define kernel_stack_pointer(_regs) ((unsigned long)(_regs)->regs[15]) | 43 | #define kernel_stack_pointer(_regs) ((unsigned long)(_regs)->regs[15]) |
| 44 | #define GET_USP(regs) ((regs)->regs[15]) | 44 | |
| 45 | #define GET_FP(regs) ((regs)->regs[14]) | ||
| 46 | #define GET_USP(regs) ((regs)->regs[15]) | ||
| 45 | 47 | ||
| 46 | extern void show_regs(struct pt_regs *); | 48 | extern void show_regs(struct pt_regs *); |
| 47 | 49 | ||
| @@ -131,7 +133,7 @@ extern void ptrace_triggered(struct perf_event *bp, int nmi, | |||
| 131 | 133 | ||
| 132 | static inline unsigned long profile_pc(struct pt_regs *regs) | 134 | static inline unsigned long profile_pc(struct pt_regs *regs) |
| 133 | { | 135 | { |
| 134 | unsigned long pc = instruction_pointer(regs); | 136 | unsigned long pc = regs->pc; |
| 135 | 137 | ||
| 136 | if (virt_addr_uncached(pc)) | 138 | if (virt_addr_uncached(pc)) |
| 137 | return CAC_ADDR(pc); | 139 | return CAC_ADDR(pc); |
diff --git a/arch/sh/include/asm/tlb.h b/arch/sh/include/asm/tlb.h index 6c308d8b9a50..ec88bfcdf7ce 100644 --- a/arch/sh/include/asm/tlb.h +++ b/arch/sh/include/asm/tlb.h | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | #include <linux/pagemap.h> | 9 | #include <linux/pagemap.h> |
| 10 | 10 | ||
| 11 | #ifdef CONFIG_MMU | 11 | #ifdef CONFIG_MMU |
| 12 | #include <linux/swap.h> | ||
| 12 | #include <asm/pgalloc.h> | 13 | #include <asm/pgalloc.h> |
| 13 | #include <asm/tlbflush.h> | 14 | #include <asm/tlbflush.h> |
| 14 | #include <asm/mmu_context.h> | 15 | #include <asm/mmu_context.h> |
diff --git a/arch/sh/include/cpu-sh4/cpu/sh7722.h b/arch/sh/include/cpu-sh4/cpu/sh7722.h index 7a5b8a331b4a..bd0622788d64 100644 --- a/arch/sh/include/cpu-sh4/cpu/sh7722.h +++ b/arch/sh/include/cpu-sh4/cpu/sh7722.h | |||
| @@ -236,6 +236,7 @@ enum { | |||
| 236 | }; | 236 | }; |
| 237 | 237 | ||
| 238 | enum { | 238 | enum { |
| 239 | SHDMA_SLAVE_INVALID, | ||
| 239 | SHDMA_SLAVE_SCIF0_TX, | 240 | SHDMA_SLAVE_SCIF0_TX, |
| 240 | SHDMA_SLAVE_SCIF0_RX, | 241 | SHDMA_SLAVE_SCIF0_RX, |
| 241 | SHDMA_SLAVE_SCIF1_TX, | 242 | SHDMA_SLAVE_SCIF1_TX, |
diff --git a/arch/sh/include/cpu-sh4/cpu/sh7724.h b/arch/sh/include/cpu-sh4/cpu/sh7724.h index 7eb435999426..3daef8ecbc63 100644 --- a/arch/sh/include/cpu-sh4/cpu/sh7724.h +++ b/arch/sh/include/cpu-sh4/cpu/sh7724.h | |||
| @@ -285,6 +285,7 @@ enum { | |||
| 285 | }; | 285 | }; |
| 286 | 286 | ||
| 287 | enum { | 287 | enum { |
| 288 | SHDMA_SLAVE_INVALID, | ||
| 288 | SHDMA_SLAVE_SCIF0_TX, | 289 | SHDMA_SLAVE_SCIF0_TX, |
| 289 | SHDMA_SLAVE_SCIF0_RX, | 290 | SHDMA_SLAVE_SCIF0_RX, |
| 290 | SHDMA_SLAVE_SCIF1_TX, | 291 | SHDMA_SLAVE_SCIF1_TX, |
diff --git a/arch/sh/include/cpu-sh4/cpu/sh7757.h b/arch/sh/include/cpu-sh4/cpu/sh7757.h index 05b8196c7753..41f9f8b9db73 100644 --- a/arch/sh/include/cpu-sh4/cpu/sh7757.h +++ b/arch/sh/include/cpu-sh4/cpu/sh7757.h | |||
| @@ -252,6 +252,7 @@ enum { | |||
| 252 | }; | 252 | }; |
| 253 | 253 | ||
| 254 | enum { | 254 | enum { |
| 255 | SHDMA_SLAVE_INVALID, | ||
| 255 | SHDMA_SLAVE_SDHI_TX, | 256 | SHDMA_SLAVE_SDHI_TX, |
| 256 | SHDMA_SLAVE_SDHI_RX, | 257 | SHDMA_SLAVE_SDHI_RX, |
| 257 | SHDMA_SLAVE_MMCIF_TX, | 258 | SHDMA_SLAVE_MMCIF_TX, |
diff --git a/arch/sh/kernel/process_32.c b/arch/sh/kernel/process_32.c index 762a13984bbd..b473f0c06fbc 100644 --- a/arch/sh/kernel/process_32.c +++ b/arch/sh/kernel/process_32.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <linux/fs.h> | 21 | #include <linux/fs.h> |
| 22 | #include <linux/ftrace.h> | 22 | #include <linux/ftrace.h> |
| 23 | #include <linux/hw_breakpoint.h> | 23 | #include <linux/hw_breakpoint.h> |
| 24 | #include <linux/prefetch.h> | ||
| 24 | #include <asm/uaccess.h> | 25 | #include <asm/uaccess.h> |
| 25 | #include <asm/mmu_context.h> | 26 | #include <asm/mmu_context.h> |
| 26 | #include <asm/system.h> | 27 | #include <asm/system.h> |
diff --git a/arch/sh/mm/consistent.c b/arch/sh/mm/consistent.c index 40733a952402..f251b5f27652 100644 --- a/arch/sh/mm/consistent.c +++ b/arch/sh/mm/consistent.c | |||
| @@ -82,7 +82,7 @@ void dma_cache_sync(struct device *dev, void *vaddr, size_t size, | |||
| 82 | void *addr; | 82 | void *addr; |
| 83 | 83 | ||
| 84 | addr = __in_29bit_mode() ? | 84 | addr = __in_29bit_mode() ? |
| 85 | (void *)P1SEGADDR((unsigned long)vaddr) : vaddr; | 85 | (void *)CAC_ADDR((unsigned long)vaddr) : vaddr; |
| 86 | 86 | ||
| 87 | switch (direction) { | 87 | switch (direction) { |
| 88 | case DMA_FROM_DEVICE: /* invalidate only */ | 88 | case DMA_FROM_DEVICE: /* invalidate only */ |
diff --git a/drivers/clocksource/sh_cmt.c b/drivers/clocksource/sh_cmt.c index 036e5865eb40..dc7c033ef587 100644 --- a/drivers/clocksource/sh_cmt.c +++ b/drivers/clocksource/sh_cmt.c | |||
| @@ -24,7 +24,6 @@ | |||
| 24 | #include <linux/ioport.h> | 24 | #include <linux/ioport.h> |
| 25 | #include <linux/io.h> | 25 | #include <linux/io.h> |
| 26 | #include <linux/clk.h> | 26 | #include <linux/clk.h> |
| 27 | #include <linux/pm_runtime.h> | ||
| 28 | #include <linux/irq.h> | 27 | #include <linux/irq.h> |
| 29 | #include <linux/err.h> | 28 | #include <linux/err.h> |
| 30 | #include <linux/clocksource.h> | 29 | #include <linux/clocksource.h> |
| @@ -153,12 +152,10 @@ static int sh_cmt_enable(struct sh_cmt_priv *p, unsigned long *rate) | |||
| 153 | { | 152 | { |
| 154 | int ret; | 153 | int ret; |
| 155 | 154 | ||
| 156 | /* wake up device and enable clock */ | 155 | /* enable clock */ |
| 157 | pm_runtime_get_sync(&p->pdev->dev); | ||
| 158 | ret = clk_enable(p->clk); | 156 | ret = clk_enable(p->clk); |
| 159 | if (ret) { | 157 | if (ret) { |
| 160 | dev_err(&p->pdev->dev, "cannot enable clock\n"); | 158 | dev_err(&p->pdev->dev, "cannot enable clock\n"); |
| 161 | pm_runtime_put_sync(&p->pdev->dev); | ||
| 162 | return ret; | 159 | return ret; |
| 163 | } | 160 | } |
| 164 | 161 | ||
| @@ -190,9 +187,8 @@ static void sh_cmt_disable(struct sh_cmt_priv *p) | |||
| 190 | /* disable interrupts in CMT block */ | 187 | /* disable interrupts in CMT block */ |
| 191 | sh_cmt_write(p, CMCSR, 0); | 188 | sh_cmt_write(p, CMCSR, 0); |
| 192 | 189 | ||
| 193 | /* stop clock and mark device as idle */ | 190 | /* stop clock */ |
| 194 | clk_disable(p->clk); | 191 | clk_disable(p->clk); |
| 195 | pm_runtime_put_sync(&p->pdev->dev); | ||
| 196 | } | 192 | } |
| 197 | 193 | ||
| 198 | /* private flags */ | 194 | /* private flags */ |
| @@ -664,7 +660,6 @@ static int __devinit sh_cmt_probe(struct platform_device *pdev) | |||
| 664 | 660 | ||
| 665 | if (p) { | 661 | if (p) { |
| 666 | dev_info(&pdev->dev, "kept as earlytimer\n"); | 662 | dev_info(&pdev->dev, "kept as earlytimer\n"); |
| 667 | pm_runtime_enable(&pdev->dev); | ||
| 668 | return 0; | 663 | return 0; |
| 669 | } | 664 | } |
| 670 | 665 | ||
| @@ -679,9 +674,6 @@ static int __devinit sh_cmt_probe(struct platform_device *pdev) | |||
| 679 | kfree(p); | 674 | kfree(p); |
| 680 | platform_set_drvdata(pdev, NULL); | 675 | platform_set_drvdata(pdev, NULL); |
| 681 | } | 676 | } |
| 682 | |||
| 683 | if (!is_early_platform_device(pdev)) | ||
| 684 | pm_runtime_enable(&pdev->dev); | ||
| 685 | return ret; | 677 | return ret; |
| 686 | } | 678 | } |
| 687 | 679 | ||
diff --git a/drivers/clocksource/sh_tmu.c b/drivers/clocksource/sh_tmu.c index 17296288a205..808135768617 100644 --- a/drivers/clocksource/sh_tmu.c +++ b/drivers/clocksource/sh_tmu.c | |||
| @@ -25,7 +25,6 @@ | |||
| 25 | #include <linux/delay.h> | 25 | #include <linux/delay.h> |
| 26 | #include <linux/io.h> | 26 | #include <linux/io.h> |
| 27 | #include <linux/clk.h> | 27 | #include <linux/clk.h> |
| 28 | #include <linux/pm_runtime.h> | ||
| 29 | #include <linux/irq.h> | 28 | #include <linux/irq.h> |
| 30 | #include <linux/err.h> | 29 | #include <linux/err.h> |
| 31 | #include <linux/clocksource.h> | 30 | #include <linux/clocksource.h> |
| @@ -110,12 +109,10 @@ static int sh_tmu_enable(struct sh_tmu_priv *p) | |||
| 110 | { | 109 | { |
| 111 | int ret; | 110 | int ret; |
| 112 | 111 | ||
| 113 | /* wake up device and enable clock */ | 112 | /* enable clock */ |
| 114 | pm_runtime_get_sync(&p->pdev->dev); | ||
| 115 | ret = clk_enable(p->clk); | 113 | ret = clk_enable(p->clk); |
| 116 | if (ret) { | 114 | if (ret) { |
| 117 | dev_err(&p->pdev->dev, "cannot enable clock\n"); | 115 | dev_err(&p->pdev->dev, "cannot enable clock\n"); |
| 118 | pm_runtime_put_sync(&p->pdev->dev); | ||
| 119 | return ret; | 116 | return ret; |
| 120 | } | 117 | } |
| 121 | 118 | ||
| @@ -144,9 +141,8 @@ static void sh_tmu_disable(struct sh_tmu_priv *p) | |||
| 144 | /* disable interrupts in TMU block */ | 141 | /* disable interrupts in TMU block */ |
| 145 | sh_tmu_write(p, TCR, 0x0000); | 142 | sh_tmu_write(p, TCR, 0x0000); |
| 146 | 143 | ||
| 147 | /* stop clock and mark device as idle */ | 144 | /* stop clock */ |
| 148 | clk_disable(p->clk); | 145 | clk_disable(p->clk); |
| 149 | pm_runtime_put_sync(&p->pdev->dev); | ||
| 150 | } | 146 | } |
| 151 | 147 | ||
| 152 | static void sh_tmu_set_next(struct sh_tmu_priv *p, unsigned long delta, | 148 | static void sh_tmu_set_next(struct sh_tmu_priv *p, unsigned long delta, |
| @@ -415,7 +411,6 @@ static int __devinit sh_tmu_probe(struct platform_device *pdev) | |||
| 415 | 411 | ||
| 416 | if (p) { | 412 | if (p) { |
| 417 | dev_info(&pdev->dev, "kept as earlytimer\n"); | 413 | dev_info(&pdev->dev, "kept as earlytimer\n"); |
| 418 | pm_runtime_enable(&pdev->dev); | ||
| 419 | return 0; | 414 | return 0; |
| 420 | } | 415 | } |
| 421 | 416 | ||
| @@ -430,9 +425,6 @@ static int __devinit sh_tmu_probe(struct platform_device *pdev) | |||
| 430 | kfree(p); | 425 | kfree(p); |
| 431 | platform_set_drvdata(pdev, NULL); | 426 | platform_set_drvdata(pdev, NULL); |
| 432 | } | 427 | } |
| 433 | |||
| 434 | if (!is_early_platform_device(pdev)) | ||
| 435 | pm_runtime_enable(&pdev->dev); | ||
| 436 | return ret; | 428 | return ret; |
| 437 | } | 429 | } |
| 438 | 430 | ||
diff --git a/drivers/dma/shdma.c b/drivers/dma/shdma.c index 636e40925b16..2a638f9f09a2 100644 --- a/drivers/dma/shdma.c +++ b/drivers/dma/shdma.c | |||
| @@ -343,7 +343,7 @@ static int sh_dmae_alloc_chan_resources(struct dma_chan *chan) | |||
| 343 | 343 | ||
| 344 | dmae_set_dmars(sh_chan, cfg->mid_rid); | 344 | dmae_set_dmars(sh_chan, cfg->mid_rid); |
| 345 | dmae_set_chcr(sh_chan, cfg->chcr); | 345 | dmae_set_chcr(sh_chan, cfg->chcr); |
| 346 | } else if ((sh_dmae_readl(sh_chan, CHCR) & 0xf00) != 0x400) { | 346 | } else { |
| 347 | dmae_init(sh_chan); | 347 | dmae_init(sh_chan); |
| 348 | } | 348 | } |
| 349 | 349 | ||
| @@ -1144,6 +1144,8 @@ static int __init sh_dmae_probe(struct platform_device *pdev) | |||
| 1144 | /* platform data */ | 1144 | /* platform data */ |
| 1145 | shdev->pdata = pdata; | 1145 | shdev->pdata = pdata; |
| 1146 | 1146 | ||
| 1147 | platform_set_drvdata(pdev, shdev); | ||
| 1148 | |||
| 1147 | pm_runtime_enable(&pdev->dev); | 1149 | pm_runtime_enable(&pdev->dev); |
| 1148 | pm_runtime_get_sync(&pdev->dev); | 1150 | pm_runtime_get_sync(&pdev->dev); |
| 1149 | 1151 | ||
| @@ -1256,7 +1258,6 @@ static int __init sh_dmae_probe(struct platform_device *pdev) | |||
| 1256 | 1258 | ||
| 1257 | pm_runtime_put(&pdev->dev); | 1259 | pm_runtime_put(&pdev->dev); |
| 1258 | 1260 | ||
| 1259 | platform_set_drvdata(pdev, shdev); | ||
| 1260 | dma_async_device_register(&shdev->common); | 1261 | dma_async_device_register(&shdev->common); |
| 1261 | 1262 | ||
| 1262 | return err; | 1263 | return err; |
| @@ -1278,6 +1279,8 @@ rst_err: | |||
| 1278 | 1279 | ||
| 1279 | if (dmars) | 1280 | if (dmars) |
| 1280 | iounmap(shdev->dmars); | 1281 | iounmap(shdev->dmars); |
| 1282 | |||
| 1283 | platform_set_drvdata(pdev, NULL); | ||
| 1281 | emapdmars: | 1284 | emapdmars: |
| 1282 | iounmap(shdev->chan_reg); | 1285 | iounmap(shdev->chan_reg); |
| 1283 | synchronize_rcu(); | 1286 | synchronize_rcu(); |
| @@ -1316,6 +1319,8 @@ static int __exit sh_dmae_remove(struct platform_device *pdev) | |||
| 1316 | iounmap(shdev->dmars); | 1319 | iounmap(shdev->dmars); |
| 1317 | iounmap(shdev->chan_reg); | 1320 | iounmap(shdev->chan_reg); |
| 1318 | 1321 | ||
| 1322 | platform_set_drvdata(pdev, NULL); | ||
| 1323 | |||
| 1319 | synchronize_rcu(); | 1324 | synchronize_rcu(); |
| 1320 | kfree(shdev); | 1325 | kfree(shdev); |
| 1321 | 1326 | ||
