Due to Ohad Ben-Cohen gathered IOMMU drivers in drivers/iommu directory,
System MMU driver is moved to drivers/iommu directory and removed
from arch/arm/plat-s5p directory.

Please see
https://lkml.org/lkml/2011/6/8/69

Signed-off-by: KyongHo Cho <pullip....@samsung.com>
---
 arch/arm/plat-s5p/Kconfig               |    8 -
 arch/arm/plat-s5p/Makefile              |    1 -
 arch/arm/plat-s5p/include/plat/sysmmu.h |   95 ----------
 arch/arm/plat-s5p/sysmmu.c              |  312 -------------------------------
 4 files changed, 0 insertions(+), 416 deletions(-)
 delete mode 100644 arch/arm/plat-s5p/include/plat/sysmmu.h
 delete mode 100644 arch/arm/plat-s5p/sysmmu.c

diff --git a/arch/arm/plat-s5p/Kconfig b/arch/arm/plat-s5p/Kconfig
index f9241a7..05ee709 100644
--- a/arch/arm/plat-s5p/Kconfig
+++ b/arch/arm/plat-s5p/Kconfig
@@ -40,14 +40,6 @@ config S5P_HRT
        help
          Use the High Resolution timer support
 
-comment "System MMU"
-
-config S5P_SYSTEM_MMU
-       bool "S5P SYSTEM MMU"
-       depends on ARCH_EXYNOS4
-       help
-         Say Y here if you want to enable System MMU
-
 config S5P_DEV_FIMC0
        bool
        help
diff --git a/arch/arm/plat-s5p/Makefile b/arch/arm/plat-s5p/Makefile
index 1812019..afa0718 100644
--- a/arch/arm/plat-s5p/Makefile
+++ b/arch/arm/plat-s5p/Makefile
@@ -19,7 +19,6 @@ obj-y                         += clock.o
 obj-y                          += irq.o
 obj-$(CONFIG_S5P_EXT_INT)      += irq-eint.o
 obj-$(CONFIG_S5P_GPIO_INT)     += irq-gpioint.o
-obj-$(CONFIG_S5P_SYSTEM_MMU)   += sysmmu.o
 obj-$(CONFIG_PM)               += pm.o
 obj-$(CONFIG_PM)               += irq-pm.o
 obj-$(CONFIG_S5P_HRT)          += s5p-time.o
diff --git a/arch/arm/plat-s5p/include/plat/sysmmu.h 
b/arch/arm/plat-s5p/include/plat/sysmmu.h
deleted file mode 100644
index bf5283c..0000000
--- a/arch/arm/plat-s5p/include/plat/sysmmu.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/* linux/arch/arm/plat-s5p/include/plat/sysmmu.h
- *
- * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * Samsung System MMU driver for S5P platform
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
-*/
-
-#ifndef __ASM__PLAT_SYSMMU_H
-#define __ASM__PLAT_SYSMMU_H __FILE__
-
-enum S5P_SYSMMU_INTERRUPT_TYPE {
-       SYSMMU_PAGEFAULT,
-       SYSMMU_AR_MULTIHIT,
-       SYSMMU_AW_MULTIHIT,
-       SYSMMU_BUSERROR,
-       SYSMMU_AR_SECURITY,
-       SYSMMU_AR_ACCESS,
-       SYSMMU_AW_SECURITY,
-       SYSMMU_AW_PROTECTION, /* 7 */
-       SYSMMU_FAULTS_NUM
-};
-
-#ifdef CONFIG_S5P_SYSTEM_MMU
-
-#include <mach/sysmmu.h>
-
-/**
- * s5p_sysmmu_enable() - enable system mmu of ip
- * @ips: The ip connected system mmu.
- * #pgd: Base physical address of the 1st level page table
- *
- * This function enable system mmu to transfer address
- * from virtual address to physical address
- */
-void s5p_sysmmu_enable(sysmmu_ips ips, unsigned long pgd);
-
-/**
- * s5p_sysmmu_disable() - disable sysmmu mmu of ip
- * @ips: The ip connected system mmu.
- *
- * This function disable system mmu to transfer address
- * from virtual address to physical address
- */
-void s5p_sysmmu_disable(sysmmu_ips ips);
-
-/**
- * s5p_sysmmu_set_tablebase_pgd() - set page table base address to refer page 
table
- * @ips: The ip connected system mmu.
- * @pgd: The page table base address.
- *
- * This function set page table base address
- * When system mmu transfer address from virtaul address to physical address,
- * system mmu refer address information from page table
- */
-void s5p_sysmmu_set_tablebase_pgd(sysmmu_ips ips, unsigned long pgd);
-
-/**
- * s5p_sysmmu_tlb_invalidate() - flush all TLB entry in system mmu
- * @ips: The ip connected system mmu.
- *
- * This function flush all TLB entry in system mmu
- */
-void s5p_sysmmu_tlb_invalidate(sysmmu_ips ips);
-
-/** s5p_sysmmu_set_fault_handler() - Fault handler for System MMUs
- * @itype: type of fault.
- * @pgtable_base: the physical address of page table base. This is 0 if @ips is
- *               SYSMMU_BUSERROR.
- * @fault_addr: the device (virtual) address that the System MMU tried to
- *             translated. This is 0 if @ips is SYSMMU_BUSERROR.
- * Called when interrupt occurred by the System MMUs
- * The device drivers of peripheral devices that has a System MMU can implement
- * a fault handler to resolve address translation fault by System MMU.
- * The meanings of return value and parameters are described below.
-
- * return value: non-zero if the fault is correctly resolved.
- *         zero if the fault is not handled.
- */
-void s5p_sysmmu_set_fault_handler(sysmmu_ips ips,
-                       int (*handler)(enum S5P_SYSMMU_INTERRUPT_TYPE itype,
-                                       unsigned long pgtable_base,
-                                       unsigned long fault_addr));
-#else
-#define s5p_sysmmu_enable(ips, pgd) do { } while (0)
-#define s5p_sysmmu_disable(ips) do { } while (0)
-#define s5p_sysmmu_set_tablebase_pgd(ips, pgd) do { } while (0)
-#define s5p_sysmmu_tlb_invalidate(ips) do { } while (0)
-#define s5p_sysmmu_set_fault_handler(ips, handler) do { } while (0)
-#endif
-#endif /* __ASM_PLAT_SYSMMU_H */
diff --git a/arch/arm/plat-s5p/sysmmu.c b/arch/arm/plat-s5p/sysmmu.c
deleted file mode 100644
index e1cbc72..0000000
--- a/arch/arm/plat-s5p/sysmmu.c
+++ /dev/null
@@ -1,312 +0,0 @@
-/* linux/arch/arm/plat-s5p/sysmmu.c
- *
- * Copyright (c) 2010 Samsung Electronics Co., Ltd.
- *             http://www.samsung.com
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/io.h>
-#include <linux/interrupt.h>
-#include <linux/platform_device.h>
-
-#include <asm/pgtable.h>
-
-#include <mach/map.h>
-#include <mach/regs-sysmmu.h>
-#include <plat/sysmmu.h>
-
-#define CTRL_ENABLE    0x5
-#define CTRL_BLOCK     0x7
-#define CTRL_DISABLE   0x0
-
-static struct device *dev;
-
-static unsigned short fault_reg_offset[SYSMMU_FAULTS_NUM] = {
-       S5P_PAGE_FAULT_ADDR,
-       S5P_AR_FAULT_ADDR,
-       S5P_AW_FAULT_ADDR,
-       S5P_DEFAULT_SLAVE_ADDR,
-       S5P_AR_FAULT_ADDR,
-       S5P_AR_FAULT_ADDR,
-       S5P_AW_FAULT_ADDR,
-       S5P_AW_FAULT_ADDR
-};
-
-static char *sysmmu_fault_name[SYSMMU_FAULTS_NUM] = {
-       "PAGE FAULT",
-       "AR MULTI-HIT FAULT",
-       "AW MULTI-HIT FAULT",
-       "BUS ERROR",
-       "AR SECURITY PROTECTION FAULT",
-       "AR ACCESS PROTECTION FAULT",
-       "AW SECURITY PROTECTION FAULT",
-       "AW ACCESS PROTECTION FAULT"
-};
-
-static int (*fault_handlers[S5P_SYSMMU_TOTAL_IPNUM])(
-               enum S5P_SYSMMU_INTERRUPT_TYPE itype,
-               unsigned long pgtable_base,
-               unsigned long fault_addr);
-
-/*
- * If adjacent 2 bits are true, the system MMU is enabled.
- * The system MMU is disabled, otherwise.
- */
-static unsigned long sysmmu_states;
-
-static inline void set_sysmmu_active(sysmmu_ips ips)
-{
-       sysmmu_states |= 3 << (ips * 2);
-}
-
-static inline void set_sysmmu_inactive(sysmmu_ips ips)
-{
-       sysmmu_states &= ~(3 << (ips * 2));
-}
-
-static inline int is_sysmmu_active(sysmmu_ips ips)
-{
-       return sysmmu_states & (3 << (ips * 2));
-}
-
-static void __iomem *sysmmusfrs[S5P_SYSMMU_TOTAL_IPNUM];
-
-static inline void sysmmu_block(sysmmu_ips ips)
-{
-       __raw_writel(CTRL_BLOCK, sysmmusfrs[ips] + S5P_MMU_CTRL);
-       dev_dbg(dev, "%s is blocked.\n", sysmmu_ips_name[ips]);
-}
-
-static inline void sysmmu_unblock(sysmmu_ips ips)
-{
-       __raw_writel(CTRL_ENABLE, sysmmusfrs[ips] + S5P_MMU_CTRL);
-       dev_dbg(dev, "%s is unblocked.\n", sysmmu_ips_name[ips]);
-}
-
-static inline void __sysmmu_tlb_invalidate(sysmmu_ips ips)
-{
-       __raw_writel(0x1, sysmmusfrs[ips] + S5P_MMU_FLUSH);
-       dev_dbg(dev, "TLB of %s is invalidated.\n", sysmmu_ips_name[ips]);
-}
-
-static inline void __sysmmu_set_ptbase(sysmmu_ips ips, unsigned long pgd)
-{
-       if (unlikely(pgd == 0)) {
-               pgd = (unsigned long)ZERO_PAGE(0);
-               __raw_writel(0x20, sysmmusfrs[ips] + S5P_MMU_CFG); /* 4KB LV1 */
-       } else {
-               __raw_writel(0x0, sysmmusfrs[ips] + S5P_MMU_CFG); /* 16KB LV1 */
-       }
-
-       __raw_writel(pgd, sysmmusfrs[ips] + S5P_PT_BASE_ADDR);
-
-       dev_dbg(dev, "Page table base of %s is initialized with 0x%08lX.\n",
-                                               sysmmu_ips_name[ips], pgd);
-       __sysmmu_tlb_invalidate(ips);
-}
-
-void sysmmu_set_fault_handler(sysmmu_ips ips,
-                       int (*handler)(enum S5P_SYSMMU_INTERRUPT_TYPE itype,
-                                       unsigned long pgtable_base,
-                                       unsigned long fault_addr))
-{
-       BUG_ON(!((ips >= SYSMMU_MDMA) && (ips < S5P_SYSMMU_TOTAL_IPNUM)));
-       fault_handlers[ips] = handler;
-}
-
-static irqreturn_t s5p_sysmmu_irq(int irq, void *dev_id)
-{
-       /* SYSMMU is in blocked when interrupt occurred. */
-       unsigned long base = 0;
-       sysmmu_ips ips = (sysmmu_ips)dev_id;
-       enum S5P_SYSMMU_INTERRUPT_TYPE itype;
-
-       itype = (enum S5P_SYSMMU_INTERRUPT_TYPE)
-               __ffs(__raw_readl(sysmmusfrs[ips] + S5P_INT_STATUS));
-
-       BUG_ON(!((itype >= 0) && (itype < 8)));
-
-       dev_alert(dev, "%s occurred by %s.\n", sysmmu_fault_name[itype],
-                                                       sysmmu_ips_name[ips]);
-
-       if (fault_handlers[ips]) {
-               unsigned long addr;
-
-               base = __raw_readl(sysmmusfrs[ips] + S5P_PT_BASE_ADDR);
-               addr = __raw_readl(sysmmusfrs[ips] + fault_reg_offset[itype]);
-
-               if (fault_handlers[ips](itype, base, addr)) {
-                       __raw_writel(1 << itype,
-                                       sysmmusfrs[ips] + S5P_INT_CLEAR);
-                       dev_notice(dev, "%s from %s is resolved."
-                                       " Retrying translation.\n",
-                               sysmmu_fault_name[itype], sysmmu_ips_name[ips]);
-               } else {
-                       base = 0;
-               }
-       }
-
-       sysmmu_unblock(ips);
-
-       if (!base)
-               dev_notice(dev, "%s from %s is not handled.\n",
-                       sysmmu_fault_name[itype], sysmmu_ips_name[ips]);
-
-       return IRQ_HANDLED;
-}
-
-void s5p_sysmmu_set_tablebase_pgd(sysmmu_ips ips, unsigned long pgd)
-{
-       if (is_sysmmu_active(ips)) {
-               sysmmu_block(ips);
-               __sysmmu_set_ptbase(ips, pgd);
-               sysmmu_unblock(ips);
-       } else {
-               dev_dbg(dev, "%s is disabled. "
-                       "Skipping initializing page table base.\n",
-                                               sysmmu_ips_name[ips]);
-       }
-}
-
-void s5p_sysmmu_enable(sysmmu_ips ips, unsigned long pgd)
-{
-       if (!is_sysmmu_active(ips)) {
-               sysmmu_clk_enable(ips);
-
-               __sysmmu_set_ptbase(ips, pgd);
-
-               __raw_writel(CTRL_ENABLE, sysmmusfrs[ips] + S5P_MMU_CTRL);
-
-               set_sysmmu_active(ips);
-               dev_dbg(dev, "%s is enabled.\n", sysmmu_ips_name[ips]);
-       } else {
-               dev_dbg(dev, "%s is already enabled.\n", sysmmu_ips_name[ips]);
-       }
-}
-
-void s5p_sysmmu_disable(sysmmu_ips ips)
-{
-       if (is_sysmmu_active(ips)) {
-               __raw_writel(CTRL_DISABLE, sysmmusfrs[ips] + S5P_MMU_CTRL);
-               set_sysmmu_inactive(ips);
-               sysmmu_clk_disable(ips);
-               dev_dbg(dev, "%s is disabled.\n", sysmmu_ips_name[ips]);
-       } else {
-               dev_dbg(dev, "%s is already disabled.\n", sysmmu_ips_name[ips]);
-       }
-}
-
-void s5p_sysmmu_tlb_invalidate(sysmmu_ips ips)
-{
-       if (is_sysmmu_active(ips)) {
-               sysmmu_block(ips);
-               __sysmmu_tlb_invalidate(ips);
-               sysmmu_unblock(ips);
-       } else {
-               dev_dbg(dev, "%s is disabled. "
-                       "Skipping invalidating TLB.\n", sysmmu_ips_name[ips]);
-       }
-}
-
-static int s5p_sysmmu_probe(struct platform_device *pdev)
-{
-       int i, ret;
-       struct resource *res, *mem;
-
-       dev = &pdev->dev;
-
-       for (i = 0; i < S5P_SYSMMU_TOTAL_IPNUM; i++) {
-               int irq;
-
-               sysmmu_clk_init(dev, i);
-               sysmmu_clk_disable(i);
-
-               res = platform_get_resource(pdev, IORESOURCE_MEM, i);
-               if (!res) {
-                       dev_err(dev, "Failed to get the resource of %s.\n",
-                                                       sysmmu_ips_name[i]);
-                       ret = -ENODEV;
-                       goto err_res;
-               }
-
-               mem = request_mem_region(res->start, resource_size(res),
-                                        pdev->name);
-               if (!mem) {
-                       dev_err(dev, "Failed to request the memory region of 
%s.\n",
-                                                       sysmmu_ips_name[i]);
-                       ret = -EBUSY;
-                       goto err_res;
-               }
-
-               sysmmusfrs[i] = ioremap(res->start, resource_size(res));
-               if (!sysmmusfrs[i]) {
-                       dev_err(dev, "Failed to ioremap() for %s.\n",
-                                                       sysmmu_ips_name[i]);
-                       ret = -ENXIO;
-                       goto err_reg;
-               }
-
-               irq = platform_get_irq(pdev, i);
-               if (irq <= 0) {
-                       dev_err(dev, "Failed to get the IRQ resource of %s.\n",
-                                                       sysmmu_ips_name[i]);
-                       ret = -ENOENT;
-                       goto err_map;
-               }
-
-               if (request_irq(irq, s5p_sysmmu_irq, IRQF_DISABLED,
-                                               pdev->name, (void *)i)) {
-                       dev_err(dev, "Failed to request IRQ for %s.\n",
-                                                       sysmmu_ips_name[i]);
-                       ret = -ENOENT;
-                       goto err_map;
-               }
-       }
-
-       return 0;
-
-err_map:
-       iounmap(sysmmusfrs[i]);
-err_reg:
-       release_mem_region(mem->start, resource_size(mem));
-err_res:
-       return ret;
-}
-
-static int s5p_sysmmu_remove(struct platform_device *pdev)
-{
-       return 0;
-}
-int s5p_sysmmu_runtime_suspend(struct device *dev)
-{
-       return 0;
-}
-
-int s5p_sysmmu_runtime_resume(struct device *dev)
-{
-       return 0;
-}
-
-const struct dev_pm_ops s5p_sysmmu_pm_ops = {
-       .runtime_suspend        = s5p_sysmmu_runtime_suspend,
-       .runtime_resume         = s5p_sysmmu_runtime_resume,
-};
-
-static struct platform_driver s5p_sysmmu_driver = {
-       .probe          = s5p_sysmmu_probe,
-       .remove         = s5p_sysmmu_remove,
-       .driver         = {
-               .owner          = THIS_MODULE,
-               .name           = "s5p-sysmmu",
-               .pm             = &s5p_sysmmu_pm_ops,
-       }
-};
-
-static int __init s5p_sysmmu_init(void)
-{
-       return platform_driver_register(&s5p_sysmmu_driver);
-}
-arch_initcall(s5p_sysmmu_init);
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to