aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-02-26 14:09:17 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2013-02-26 14:09:17 -0500
commitf6c0ffa8f0b0781f4954cb06f0a81d6c10c1b434 (patch)
treef99190661706d18f129497a4ef2d37822c9c34db /arch/arm
parent42a0a1b0fd343888c59afc8b243a77bcec2cc11c (diff)
parent604542b824f72fa5d7fd977af277538c1e15b5f0 (diff)
Merge tag 'iommu-updates-v3.9' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu
Pull IOMMU Updates from Joerg Roedel: "Besides some fixes and cleanups in the code there are three more important changes to point out this time: * New IOMMU driver for the ARM SHMOBILE platform * An IOMMU-API extension for non-paging IOMMUs (required for upcoming PAMU driver) * Rework of the way the Tegra IOMMU driver accesses its registetrs - register windows are easier to extend now. There are also a few changes to non-iommu code, but that is acked by the respective maintainers." * tag 'iommu-updates-v3.9' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu: (23 commits) iommu/tegra: assume CONFIG_OF in SMMU driver iommu/tegra: assume CONFIG_OF in gart driver iommu/amd: Remove redundant NULL check before dma_ops_domain_free(). iommu/amd: Initialize device table after dma_ops iommu/vt-d: Zero out allocated memory in dmar_enable_qi iommu/tegra: smmu: Fix incorrect mask for regbase iommu/exynos: Make exynos_sysmmu_disable static ARM: mach-shmobile: r8a7740: Add IPMMU device ARM: mach-shmobile: sh73a0: Add IPMMU device ARM: mach-shmobile: sh7372: Add IPMMU device iommu/shmobile: Add iommu driver for Renesas IPMMU modules iommu: Add DOMAIN_ATTR_WINDOWS domain attribute iommu: Add domain window handling functions iommu: Implement DOMAIN_ATTR_PAGING attribute iommu: Check for valid pgsize_bitmap in iommu_map/unmap iommu: Make sure DOMAIN_ATTR_MAX is really the maximum iommu/tegra: smmu: Change SMMU's dependency on ARCH_TEGRA iommu/tegra: smmu: Use helper function to check for valid register offset iommu/tegra: smmu: Support variable MMIO ranges/blocks iommu/tegra: Add missing spinlock initialization ...
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/mach-exynos/Kconfig5
-rw-r--r--arch/arm/mach-exynos/Makefile1
-rw-r--r--arch/arm/mach-exynos/clock-exynos4.c41
-rw-r--r--arch/arm/mach-exynos/clock-exynos4210.c9
-rw-r--r--arch/arm/mach-exynos/clock-exynos4212.c23
-rw-r--r--arch/arm/mach-exynos/clock-exynos5.c62
-rw-r--r--arch/arm/mach-exynos/dev-sysmmu.c274
-rw-r--r--arch/arm/mach-exynos/include/mach/sysmmu.h66
-rw-r--r--arch/arm/mach-exynos/mach-exynos4-dt.c34
-rw-r--r--arch/arm/mach-exynos/mach-exynos5-dt.c30
-rw-r--r--arch/arm/mach-shmobile/setup-r8a7740.c33
-rw-r--r--arch/arm/mach-shmobile/setup-sh7372.c39
-rw-r--r--arch/arm/mach-shmobile/setup-sh73a0.c31
13 files changed, 240 insertions, 408 deletions
diff --git a/arch/arm/mach-exynos/Kconfig b/arch/arm/mach-exynos/Kconfig
index 85afb031b676..70f94c87479d 100644
--- a/arch/arm/mach-exynos/Kconfig
+++ b/arch/arm/mach-exynos/Kconfig
@@ -105,11 +105,6 @@ config EXYNOS4_SETUP_FIMD0
105 help 105 help
106 Common setup code for FIMD0. 106 Common setup code for FIMD0.
107 107
108config EXYNOS_DEV_SYSMMU
109 bool
110 help
111 Common setup code for SYSTEM MMU in EXYNOS platforms
112
113config EXYNOS4_DEV_USB_OHCI 108config EXYNOS4_DEV_USB_OHCI
114 bool 109 bool
115 help 110 help
diff --git a/arch/arm/mach-exynos/Makefile b/arch/arm/mach-exynos/Makefile
index b189881657ec..435757e57bb4 100644
--- a/arch/arm/mach-exynos/Makefile
+++ b/arch/arm/mach-exynos/Makefile
@@ -52,7 +52,6 @@ obj-$(CONFIG_ARCH_EXYNOS4) += dev-audio.o
52obj-$(CONFIG_EXYNOS4_DEV_AHCI) += dev-ahci.o 52obj-$(CONFIG_EXYNOS4_DEV_AHCI) += dev-ahci.o
53obj-$(CONFIG_EXYNOS_DEV_DMA) += dma.o 53obj-$(CONFIG_EXYNOS_DEV_DMA) += dma.o
54obj-$(CONFIG_EXYNOS4_DEV_USB_OHCI) += dev-ohci.o 54obj-$(CONFIG_EXYNOS4_DEV_USB_OHCI) += dev-ohci.o
55obj-$(CONFIG_EXYNOS_DEV_SYSMMU) += dev-sysmmu.o
56 55
57obj-$(CONFIG_ARCH_EXYNOS) += setup-i2c0.o 56obj-$(CONFIG_ARCH_EXYNOS) += setup-i2c0.o
58obj-$(CONFIG_EXYNOS4_SETUP_FIMC) += setup-fimc.o 57obj-$(CONFIG_EXYNOS4_SETUP_FIMC) += setup-fimc.o
diff --git a/arch/arm/mach-exynos/clock-exynos4.c b/arch/arm/mach-exynos/clock-exynos4.c
index bbcb3dea0d40..8a8468d83c8c 100644
--- a/arch/arm/mach-exynos/clock-exynos4.c
+++ b/arch/arm/mach-exynos/clock-exynos4.c
@@ -24,7 +24,6 @@
24 24
25#include <mach/map.h> 25#include <mach/map.h>
26#include <mach/regs-clock.h> 26#include <mach/regs-clock.h>
27#include <mach/sysmmu.h>
28 27
29#include "common.h" 28#include "common.h"
30#include "clock-exynos4.h" 29#include "clock-exynos4.h"
@@ -709,53 +708,53 @@ static struct clk exynos4_init_clocks_off[] = {
709 .enable = exynos4_clk_ip_peril_ctrl, 708 .enable = exynos4_clk_ip_peril_ctrl,
710 .ctrlbit = (1 << 14), 709 .ctrlbit = (1 << 14),
711 }, { 710 }, {
712 .name = SYSMMU_CLOCK_NAME, 711 .name = "sysmmu",
713 .devname = SYSMMU_CLOCK_DEVNAME(mfc_l, 0), 712 .devname = "exynos-sysmmu.0",
714 .enable = exynos4_clk_ip_mfc_ctrl, 713 .enable = exynos4_clk_ip_mfc_ctrl,
715 .ctrlbit = (1 << 1), 714 .ctrlbit = (1 << 1),
716 }, { 715 }, {
717 .name = SYSMMU_CLOCK_NAME, 716 .name = "sysmmu",
718 .devname = SYSMMU_CLOCK_DEVNAME(mfc_r, 1), 717 .devname = "exynos-sysmmu.1",
719 .enable = exynos4_clk_ip_mfc_ctrl, 718 .enable = exynos4_clk_ip_mfc_ctrl,
720 .ctrlbit = (1 << 2), 719 .ctrlbit = (1 << 2),
721 }, { 720 }, {
722 .name = SYSMMU_CLOCK_NAME, 721 .name = "sysmmu",
723 .devname = SYSMMU_CLOCK_DEVNAME(tv, 2), 722 .devname = "exynos-sysmmu.2",
724 .enable = exynos4_clk_ip_tv_ctrl, 723 .enable = exynos4_clk_ip_tv_ctrl,
725 .ctrlbit = (1 << 4), 724 .ctrlbit = (1 << 4),
726 }, { 725 }, {
727 .name = SYSMMU_CLOCK_NAME, 726 .name = "sysmmu",
728 .devname = SYSMMU_CLOCK_DEVNAME(jpeg, 3), 727 .devname = "exynos-sysmmu.3",
729 .enable = exynos4_clk_ip_cam_ctrl, 728 .enable = exynos4_clk_ip_cam_ctrl,
730 .ctrlbit = (1 << 11), 729 .ctrlbit = (1 << 11),
731 }, { 730 }, {
732 .name = SYSMMU_CLOCK_NAME, 731 .name = "sysmmu",
733 .devname = SYSMMU_CLOCK_DEVNAME(rot, 4), 732 .devname = "exynos-sysmmu.4",
734 .enable = exynos4_clk_ip_image_ctrl, 733 .enable = exynos4_clk_ip_image_ctrl,
735 .ctrlbit = (1 << 4), 734 .ctrlbit = (1 << 4),
736 }, { 735 }, {
737 .name = SYSMMU_CLOCK_NAME, 736 .name = "sysmmu",
738 .devname = SYSMMU_CLOCK_DEVNAME(fimc0, 5), 737 .devname = "exynos-sysmmu.5",
739 .enable = exynos4_clk_ip_cam_ctrl, 738 .enable = exynos4_clk_ip_cam_ctrl,
740 .ctrlbit = (1 << 7), 739 .ctrlbit = (1 << 7),
741 }, { 740 }, {
742 .name = SYSMMU_CLOCK_NAME, 741 .name = "sysmmu",
743 .devname = SYSMMU_CLOCK_DEVNAME(fimc1, 6), 742 .devname = "exynos-sysmmu.6",
744 .enable = exynos4_clk_ip_cam_ctrl, 743 .enable = exynos4_clk_ip_cam_ctrl,
745 .ctrlbit = (1 << 8), 744 .ctrlbit = (1 << 8),
746 }, { 745 }, {
747 .name = SYSMMU_CLOCK_NAME, 746 .name = "sysmmu",
748 .devname = SYSMMU_CLOCK_DEVNAME(fimc2, 7), 747 .devname = "exynos-sysmmu.7",
749 .enable = exynos4_clk_ip_cam_ctrl, 748 .enable = exynos4_clk_ip_cam_ctrl,
750 .ctrlbit = (1 << 9), 749 .ctrlbit = (1 << 9),
751 }, { 750 }, {
752 .name = SYSMMU_CLOCK_NAME, 751 .name = "sysmmu",
753 .devname = SYSMMU_CLOCK_DEVNAME(fimc3, 8), 752 .devname = "exynos-sysmmu.8",
754 .enable = exynos4_clk_ip_cam_ctrl, 753 .enable = exynos4_clk_ip_cam_ctrl,
755 .ctrlbit = (1 << 10), 754 .ctrlbit = (1 << 10),
756 }, { 755 }, {
757 .name = SYSMMU_CLOCK_NAME, 756 .name = "sysmmu",
758 .devname = SYSMMU_CLOCK_DEVNAME(fimd0, 10), 757 .devname = "exynos-sysmmu.10",
759 .enable = exynos4_clk_ip_lcd0_ctrl, 758 .enable = exynos4_clk_ip_lcd0_ctrl,
760 .ctrlbit = (1 << 4), 759 .ctrlbit = (1 << 4),
761 } 760 }
diff --git a/arch/arm/mach-exynos/clock-exynos4210.c b/arch/arm/mach-exynos/clock-exynos4210.c
index fed4c26e9dad..19af9f783c56 100644
--- a/arch/arm/mach-exynos/clock-exynos4210.c
+++ b/arch/arm/mach-exynos/clock-exynos4210.c
@@ -26,7 +26,6 @@
26#include <mach/hardware.h> 26#include <mach/hardware.h>
27#include <mach/map.h> 27#include <mach/map.h>
28#include <mach/regs-clock.h> 28#include <mach/regs-clock.h>
29#include <mach/sysmmu.h>
30 29
31#include "common.h" 30#include "common.h"
32#include "clock-exynos4.h" 31#include "clock-exynos4.h"
@@ -129,13 +128,13 @@ static struct clk init_clocks_off[] = {
129 .enable = exynos4_clk_ip_lcd1_ctrl, 128 .enable = exynos4_clk_ip_lcd1_ctrl,
130 .ctrlbit = (1 << 0), 129 .ctrlbit = (1 << 0),
131 }, { 130 }, {
132 .name = SYSMMU_CLOCK_NAME, 131 .name = "sysmmu",
133 .devname = SYSMMU_CLOCK_DEVNAME(2d, 14), 132 .devname = "exynos-sysmmu.9",
134 .enable = exynos4_clk_ip_image_ctrl, 133 .enable = exynos4_clk_ip_image_ctrl,
135 .ctrlbit = (1 << 3), 134 .ctrlbit = (1 << 3),
136 }, { 135 }, {
137 .name = SYSMMU_CLOCK_NAME, 136 .name = "sysmmu",
138 .devname = SYSMMU_CLOCK_DEVNAME(fimd1, 11), 137 .devname = "exynos-sysmmu.11",
139 .enable = exynos4_clk_ip_lcd1_ctrl, 138 .enable = exynos4_clk_ip_lcd1_ctrl,
140 .ctrlbit = (1 << 4), 139 .ctrlbit = (1 << 4),
141 }, { 140 }, {
diff --git a/arch/arm/mach-exynos/clock-exynos4212.c b/arch/arm/mach-exynos/clock-exynos4212.c
index 8fba0b5fb8ab..529476f8ec71 100644
--- a/arch/arm/mach-exynos/clock-exynos4212.c
+++ b/arch/arm/mach-exynos/clock-exynos4212.c
@@ -26,7 +26,6 @@
26#include <mach/hardware.h> 26#include <mach/hardware.h>
27#include <mach/map.h> 27#include <mach/map.h>
28#include <mach/regs-clock.h> 28#include <mach/regs-clock.h>
29#include <mach/sysmmu.h>
30 29
31#include "common.h" 30#include "common.h"
32#include "clock-exynos4.h" 31#include "clock-exynos4.h"
@@ -111,21 +110,31 @@ static struct clksrc_clk clksrcs[] = {
111 110
112static struct clk init_clocks_off[] = { 111static struct clk init_clocks_off[] = {
113 { 112 {
114 .name = SYSMMU_CLOCK_NAME, 113 .name = "sysmmu",
115 .devname = SYSMMU_CLOCK_DEVNAME(2d, 14), 114 .devname = "exynos-sysmmu.9",
116 .enable = exynos4_clk_ip_dmc_ctrl, 115 .enable = exynos4_clk_ip_dmc_ctrl,
117 .ctrlbit = (1 << 24), 116 .ctrlbit = (1 << 24),
118 }, { 117 }, {
119 .name = SYSMMU_CLOCK_NAME, 118 .name = "sysmmu",
120 .devname = SYSMMU_CLOCK_DEVNAME(isp, 9), 119 .devname = "exynos-sysmmu.12",
121 .enable = exynos4212_clk_ip_isp0_ctrl, 120 .enable = exynos4212_clk_ip_isp0_ctrl,
122 .ctrlbit = (7 << 8), 121 .ctrlbit = (7 << 8),
123 }, { 122 }, {
124 .name = SYSMMU_CLOCK_NAME2, 123 .name = "sysmmu",
125 .devname = SYSMMU_CLOCK_DEVNAME(isp, 9), 124 .devname = "exynos-sysmmu.13",
126 .enable = exynos4212_clk_ip_isp1_ctrl, 125 .enable = exynos4212_clk_ip_isp1_ctrl,
127 .ctrlbit = (1 << 4), 126 .ctrlbit = (1 << 4),
128 }, { 127 }, {
128 .name = "sysmmu",
129 .devname = "exynos-sysmmu.14",
130 .enable = exynos4212_clk_ip_isp0_ctrl,
131 .ctrlbit = (1 << 11),
132 }, {
133 .name = "sysmmu",
134 .devname = "exynos-sysmmu.15",
135 .enable = exynos4212_clk_ip_isp0_ctrl,
136 .ctrlbit = (1 << 12),
137 }, {
129 .name = "flite", 138 .name = "flite",
130 .devname = "exynos-fimc-lite.0", 139 .devname = "exynos-fimc-lite.0",
131 .enable = exynos4212_clk_ip_isp0_ctrl, 140 .enable = exynos4212_clk_ip_isp0_ctrl,
diff --git a/arch/arm/mach-exynos/clock-exynos5.c b/arch/arm/mach-exynos/clock-exynos5.c
index e9d7b80bae49..b0ea31fc9fb8 100644
--- a/arch/arm/mach-exynos/clock-exynos5.c
+++ b/arch/arm/mach-exynos/clock-exynos5.c
@@ -24,7 +24,6 @@
24 24
25#include <mach/map.h> 25#include <mach/map.h>
26#include <mach/regs-clock.h> 26#include <mach/regs-clock.h>
27#include <mach/sysmmu.h>
28 27
29#include "common.h" 28#include "common.h"
30 29
@@ -859,73 +858,78 @@ static struct clk exynos5_init_clocks_off[] = {
859 .enable = exynos5_clk_ip_gscl_ctrl, 858 .enable = exynos5_clk_ip_gscl_ctrl,
860 .ctrlbit = (1 << 3), 859 .ctrlbit = (1 << 3),
861 }, { 860 }, {
862 .name = SYSMMU_CLOCK_NAME, 861 .name = "sysmmu",
863 .devname = SYSMMU_CLOCK_DEVNAME(mfc_l, 0), 862 .devname = "exynos-sysmmu.1",
864 .enable = &exynos5_clk_ip_mfc_ctrl, 863 .enable = &exynos5_clk_ip_mfc_ctrl,
865 .ctrlbit = (1 << 1), 864 .ctrlbit = (1 << 1),
866 }, { 865 }, {
867 .name = SYSMMU_CLOCK_NAME, 866 .name = "sysmmu",
868 .devname = SYSMMU_CLOCK_DEVNAME(mfc_r, 1), 867 .devname = "exynos-sysmmu.0",
869 .enable = &exynos5_clk_ip_mfc_ctrl, 868 .enable = &exynos5_clk_ip_mfc_ctrl,
870 .ctrlbit = (1 << 2), 869 .ctrlbit = (1 << 2),
871 }, { 870 }, {
872 .name = SYSMMU_CLOCK_NAME, 871 .name = "sysmmu",
873 .devname = SYSMMU_CLOCK_DEVNAME(tv, 2), 872 .devname = "exynos-sysmmu.2",
874 .enable = &exynos5_clk_ip_disp1_ctrl, 873 .enable = &exynos5_clk_ip_disp1_ctrl,
875 .ctrlbit = (1 << 9) 874 .ctrlbit = (1 << 9)
876 }, { 875 }, {
877 .name = SYSMMU_CLOCK_NAME, 876 .name = "sysmmu",
878 .devname = SYSMMU_CLOCK_DEVNAME(jpeg, 3), 877 .devname = "exynos-sysmmu.3",
879 .enable = &exynos5_clk_ip_gen_ctrl, 878 .enable = &exynos5_clk_ip_gen_ctrl,
880 .ctrlbit = (1 << 7), 879 .ctrlbit = (1 << 7),
881 }, { 880 }, {
882 .name = SYSMMU_CLOCK_NAME, 881 .name = "sysmmu",
883 .devname = SYSMMU_CLOCK_DEVNAME(rot, 4), 882 .devname = "exynos-sysmmu.4",
884 .enable = &exynos5_clk_ip_gen_ctrl, 883 .enable = &exynos5_clk_ip_gen_ctrl,
885 .ctrlbit = (1 << 6) 884 .ctrlbit = (1 << 6)
886 }, { 885 }, {
887 .name = SYSMMU_CLOCK_NAME, 886 .name = "sysmmu",
888 .devname = SYSMMU_CLOCK_DEVNAME(gsc0, 5), 887 .devname = "exynos-sysmmu.5",
889 .enable = &exynos5_clk_ip_gscl_ctrl, 888 .enable = &exynos5_clk_ip_gscl_ctrl,
890 .ctrlbit = (1 << 7), 889 .ctrlbit = (1 << 7),
891 }, { 890 }, {
892 .name = SYSMMU_CLOCK_NAME, 891 .name = "sysmmu",
893 .devname = SYSMMU_CLOCK_DEVNAME(gsc1, 6), 892 .devname = "exynos-sysmmu.6",
894 .enable = &exynos5_clk_ip_gscl_ctrl, 893 .enable = &exynos5_clk_ip_gscl_ctrl,
895 .ctrlbit = (1 << 8), 894 .ctrlbit = (1 << 8),
896 }, { 895 }, {
897 .name = SYSMMU_CLOCK_NAME, 896 .name = "sysmmu",
898 .devname = SYSMMU_CLOCK_DEVNAME(gsc2, 7), 897 .devname = "exynos-sysmmu.7",
899 .enable = &exynos5_clk_ip_gscl_ctrl, 898 .enable = &exynos5_clk_ip_gscl_ctrl,
900 .ctrlbit = (1 << 9), 899 .ctrlbit = (1 << 9),
901 }, { 900 }, {
902 .name = SYSMMU_CLOCK_NAME, 901 .name = "sysmmu",
903 .devname = SYSMMU_CLOCK_DEVNAME(gsc3, 8), 902 .devname = "exynos-sysmmu.8",
904 .enable = &exynos5_clk_ip_gscl_ctrl, 903 .enable = &exynos5_clk_ip_gscl_ctrl,
905 .ctrlbit = (1 << 10), 904 .ctrlbit = (1 << 10),
906 }, { 905 }, {
907 .name = SYSMMU_CLOCK_NAME, 906 .name = "sysmmu",
908 .devname = SYSMMU_CLOCK_DEVNAME(isp, 9), 907 .devname = "exynos-sysmmu.9",
909 .enable = &exynos5_clk_ip_isp0_ctrl, 908 .enable = &exynos5_clk_ip_isp0_ctrl,
910 .ctrlbit = (0x3F << 8), 909 .ctrlbit = (0x3F << 8),
911 }, { 910 }, {
912 .name = SYSMMU_CLOCK_NAME2, 911 .name = "sysmmu",
913 .devname = SYSMMU_CLOCK_DEVNAME(isp, 9), 912 .devname = "exynos-sysmmu.10",
914 .enable = &exynos5_clk_ip_isp1_ctrl, 913 .enable = &exynos5_clk_ip_isp1_ctrl,
915 .ctrlbit = (0xF << 4), 914 .ctrlbit = (0xF << 4),
916 }, { 915 }, {
917 .name = SYSMMU_CLOCK_NAME, 916 .name = "sysmmu",
918 .devname = SYSMMU_CLOCK_DEVNAME(camif0, 12), 917 .devname = "exynos-sysmmu.11",
918 .enable = &exynos5_clk_ip_disp1_ctrl,
919 .ctrlbit = (1 << 8)
920 }, {
921 .name = "sysmmu",
922 .devname = "exynos-sysmmu.12",
919 .enable = &exynos5_clk_ip_gscl_ctrl, 923 .enable = &exynos5_clk_ip_gscl_ctrl,
920 .ctrlbit = (1 << 11), 924 .ctrlbit = (1 << 11),
921 }, { 925 }, {
922 .name = SYSMMU_CLOCK_NAME, 926 .name = "sysmmu",
923 .devname = SYSMMU_CLOCK_DEVNAME(camif1, 13), 927 .devname = "exynos-sysmmu.13",
924 .enable = &exynos5_clk_ip_gscl_ctrl, 928 .enable = &exynos5_clk_ip_gscl_ctrl,
925 .ctrlbit = (1 << 12), 929 .ctrlbit = (1 << 12),
926 }, { 930 }, {
927 .name = SYSMMU_CLOCK_NAME, 931 .name = "sysmmu",
928 .devname = SYSMMU_CLOCK_DEVNAME(2d, 14), 932 .devname = "exynos-sysmmu.14",
929 .enable = &exynos5_clk_ip_acp_ctrl, 933 .enable = &exynos5_clk_ip_acp_ctrl,
930 .ctrlbit = (1 << 7) 934 .ctrlbit = (1 << 7)
931 } 935 }
diff --git a/arch/arm/mach-exynos/dev-sysmmu.c b/arch/arm/mach-exynos/dev-sysmmu.c
deleted file mode 100644
index c5b1ea301df0..000000000000
--- a/arch/arm/mach-exynos/dev-sysmmu.c
+++ /dev/null
@@ -1,274 +0,0 @@
1/* linux/arch/arm/mach-exynos/dev-sysmmu.c
2 *
3 * Copyright (c) 2010-2012 Samsung Electronics Co., Ltd.
4 * http://www.samsung.com
5 *
6 * EXYNOS - System MMU support
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 */
12
13#include <linux/platform_device.h>
14#include <linux/dma-mapping.h>
15
16#include <plat/cpu.h>
17
18#include <mach/map.h>
19#include <mach/irqs.h>
20#include <mach/sysmmu.h>
21
22static u64 exynos_sysmmu_dma_mask = DMA_BIT_MASK(32);
23
24#define SYSMMU_PLATFORM_DEVICE(ipname, devid) \
25static struct sysmmu_platform_data platdata_##ipname = { \
26 .dbgname = #ipname, \
27}; \
28struct platform_device SYSMMU_PLATDEV(ipname) = \
29{ \
30 .name = SYSMMU_DEVNAME_BASE, \
31 .id = devid, \
32 .dev = { \
33 .dma_mask = &exynos_sysmmu_dma_mask, \
34 .coherent_dma_mask = DMA_BIT_MASK(32), \
35 .platform_data = &platdata_##ipname, \
36 }, \
37}
38
39SYSMMU_PLATFORM_DEVICE(mfc_l, 0);
40SYSMMU_PLATFORM_DEVICE(mfc_r, 1);
41SYSMMU_PLATFORM_DEVICE(tv, 2);
42SYSMMU_PLATFORM_DEVICE(jpeg, 3);
43SYSMMU_PLATFORM_DEVICE(rot, 4);
44SYSMMU_PLATFORM_DEVICE(fimc0, 5); /* fimc* and gsc* exist exclusively */
45SYSMMU_PLATFORM_DEVICE(fimc1, 6);
46SYSMMU_PLATFORM_DEVICE(fimc2, 7);
47SYSMMU_PLATFORM_DEVICE(fimc3, 8);
48SYSMMU_PLATFORM_DEVICE(gsc0, 5);
49SYSMMU_PLATFORM_DEVICE(gsc1, 6);
50SYSMMU_PLATFORM_DEVICE(gsc2, 7);
51SYSMMU_PLATFORM_DEVICE(gsc3, 8);
52SYSMMU_PLATFORM_DEVICE(isp, 9);
53SYSMMU_PLATFORM_DEVICE(fimd0, 10);
54SYSMMU_PLATFORM_DEVICE(fimd1, 11);
55SYSMMU_PLATFORM_DEVICE(camif0, 12);
56SYSMMU_PLATFORM_DEVICE(camif1, 13);
57SYSMMU_PLATFORM_DEVICE(2d, 14);
58
59#define SYSMMU_RESOURCE_NAME(core, ipname) sysmmures_##core##_##ipname
60
61#define SYSMMU_RESOURCE(core, ipname) \
62 static struct resource SYSMMU_RESOURCE_NAME(core, ipname)[] __initdata =
63
64#define DEFINE_SYSMMU_RESOURCE(core, mem, irq) \
65 DEFINE_RES_MEM_NAMED(core##_PA_SYSMMU_##mem, SZ_4K, #mem), \
66 DEFINE_RES_IRQ_NAMED(core##_IRQ_SYSMMU_##irq##_0, #mem)
67
68#define SYSMMU_RESOURCE_DEFINE(core, ipname, mem, irq) \
69 SYSMMU_RESOURCE(core, ipname) { \
70 DEFINE_SYSMMU_RESOURCE(core, mem, irq) \
71 }
72
73struct sysmmu_resource_map {
74 struct platform_device *pdev;
75 struct resource *res;
76 u32 rnum;
77 struct device *pdd;
78 char *clocknames;
79};
80
81#define SYSMMU_RESOURCE_MAPPING(core, ipname, resname) { \
82 .pdev = &SYSMMU_PLATDEV(ipname), \
83 .res = SYSMMU_RESOURCE_NAME(EXYNOS##core, resname), \
84 .rnum = ARRAY_SIZE(SYSMMU_RESOURCE_NAME(EXYNOS##core, resname)),\
85 .clocknames = SYSMMU_CLOCK_NAME, \
86}
87
88#define SYSMMU_RESOURCE_MAPPING_MC(core, ipname, resname, pdata) { \
89 .pdev = &SYSMMU_PLATDEV(ipname), \
90 .res = SYSMMU_RESOURCE_NAME(EXYNOS##core, resname), \
91 .rnum = ARRAY_SIZE(SYSMMU_RESOURCE_NAME(EXYNOS##core, resname)),\
92 .clocknames = SYSMMU_CLOCK_NAME "," SYSMMU_CLOCK_NAME2, \
93}
94
95#ifdef CONFIG_EXYNOS_DEV_PD
96#define SYSMMU_RESOURCE_MAPPING_PD(core, ipname, resname, pd) { \
97 .pdev = &SYSMMU_PLATDEV(ipname), \
98 .res = &SYSMMU_RESOURCE_NAME(EXYNOS##core, resname), \
99 .rnum = ARRAY_SIZE(SYSMMU_RESOURCE_NAME(EXYNOS##core, resname)),\
100 .clocknames = SYSMMU_CLOCK_NAME, \
101 .pdd = &exynos##core##_device_pd[pd].dev, \
102}
103
104#define SYSMMU_RESOURCE_MAPPING_MCPD(core, ipname, resname, pd, pdata) {\
105 .pdev = &SYSMMU_PLATDEV(ipname), \
106 .res = &SYSMMU_RESOURCE_NAME(EXYNOS##core, resname), \
107 .rnum = ARRAY_SIZE(SYSMMU_RESOURCE_NAME(EXYNOS##core, resname)),\
108 .clocknames = SYSMMU_CLOCK_NAME "," SYSMMU_CLOCK_NAME2, \
109 .pdd = &exynos##core##_device_pd[pd].dev, \
110}
111#else
112#define SYSMMU_RESOURCE_MAPPING_PD(core, ipname, resname, pd) \
113 SYSMMU_RESOURCE_MAPPING(core, ipname, resname)
114#define SYSMMU_RESOURCE_MAPPING_MCPD(core, ipname, resname, pd, pdata) \
115 SYSMMU_RESOURCE_MAPPING_MC(core, ipname, resname, pdata)
116
117#endif /* CONFIG_EXYNOS_DEV_PD */
118
119#ifdef CONFIG_ARCH_EXYNOS4
120SYSMMU_RESOURCE_DEFINE(EXYNOS4, fimc0, FIMC0, FIMC0);
121SYSMMU_RESOURCE_DEFINE(EXYNOS4, fimc1, FIMC1, FIMC1);
122SYSMMU_RESOURCE_DEFINE(EXYNOS4, fimc2, FIMC2, FIMC2);
123SYSMMU_RESOURCE_DEFINE(EXYNOS4, fimc3, FIMC3, FIMC3);
124SYSMMU_RESOURCE_DEFINE(EXYNOS4, jpeg, JPEG, JPEG);
125SYSMMU_RESOURCE_DEFINE(EXYNOS4, 2d, G2D, 2D);
126SYSMMU_RESOURCE_DEFINE(EXYNOS4, tv, TV, TV_M0);
127SYSMMU_RESOURCE_DEFINE(EXYNOS4, 2d_acp, 2D_ACP, 2D);
128SYSMMU_RESOURCE_DEFINE(EXYNOS4, rot, ROTATOR, ROTATOR);
129SYSMMU_RESOURCE_DEFINE(EXYNOS4, fimd0, FIMD0, LCD0_M0);
130SYSMMU_RESOURCE_DEFINE(EXYNOS4, fimd1, FIMD1, LCD1_M1);
131SYSMMU_RESOURCE_DEFINE(EXYNOS4, flite0, FIMC_LITE0, FIMC_LITE0);
132SYSMMU_RESOURCE_DEFINE(EXYNOS4, flite1, FIMC_LITE1, FIMC_LITE1);
133SYSMMU_RESOURCE_DEFINE(EXYNOS4, mfc_r, MFC_R, MFC_M0);
134SYSMMU_RESOURCE_DEFINE(EXYNOS4, mfc_l, MFC_L, MFC_M1);
135SYSMMU_RESOURCE(EXYNOS4, isp) {
136 DEFINE_SYSMMU_RESOURCE(EXYNOS4, FIMC_ISP, FIMC_ISP),
137 DEFINE_SYSMMU_RESOURCE(EXYNOS4, FIMC_DRC, FIMC_DRC),
138 DEFINE_SYSMMU_RESOURCE(EXYNOS4, FIMC_FD, FIMC_FD),
139 DEFINE_SYSMMU_RESOURCE(EXYNOS4, ISPCPU, FIMC_CX),
140};
141
142static struct sysmmu_resource_map sysmmu_resmap4[] __initdata = {
143 SYSMMU_RESOURCE_MAPPING_PD(4, fimc0, fimc0, PD_CAM),
144 SYSMMU_RESOURCE_MAPPING_PD(4, fimc1, fimc1, PD_CAM),
145 SYSMMU_RESOURCE_MAPPING_PD(4, fimc2, fimc2, PD_CAM),
146 SYSMMU_RESOURCE_MAPPING_PD(4, fimc3, fimc3, PD_CAM),
147 SYSMMU_RESOURCE_MAPPING_PD(4, tv, tv, PD_TV),
148 SYSMMU_RESOURCE_MAPPING_PD(4, mfc_r, mfc_r, PD_MFC),
149 SYSMMU_RESOURCE_MAPPING_PD(4, mfc_l, mfc_l, PD_MFC),
150 SYSMMU_RESOURCE_MAPPING_PD(4, rot, rot, PD_LCD0),
151 SYSMMU_RESOURCE_MAPPING_PD(4, jpeg, jpeg, PD_CAM),
152 SYSMMU_RESOURCE_MAPPING_PD(4, fimd0, fimd0, PD_LCD0),
153};
154
155static struct sysmmu_resource_map sysmmu_resmap4210[] __initdata = {
156 SYSMMU_RESOURCE_MAPPING_PD(4, 2d, 2d, PD_LCD0),
157 SYSMMU_RESOURCE_MAPPING_PD(4, fimd1, fimd1, PD_LCD1),
158};
159
160static struct sysmmu_resource_map sysmmu_resmap4212[] __initdata = {
161 SYSMMU_RESOURCE_MAPPING(4, 2d, 2d_acp),
162 SYSMMU_RESOURCE_MAPPING_PD(4, camif0, flite0, PD_ISP),
163 SYSMMU_RESOURCE_MAPPING_PD(4, camif1, flite1, PD_ISP),
164 SYSMMU_RESOURCE_MAPPING_PD(4, isp, isp, PD_ISP),
165};
166#endif /* CONFIG_ARCH_EXYNOS4 */
167
168#ifdef CONFIG_ARCH_EXYNOS5
169SYSMMU_RESOURCE_DEFINE(EXYNOS5, jpeg, JPEG, JPEG);
170SYSMMU_RESOURCE_DEFINE(EXYNOS5, fimd1, FIMD1, FIMD1);
171SYSMMU_RESOURCE_DEFINE(EXYNOS5, 2d, 2D, 2D);
172SYSMMU_RESOURCE_DEFINE(EXYNOS5, rot, ROTATOR, ROTATOR);
173SYSMMU_RESOURCE_DEFINE(EXYNOS5, tv, TV, TV);
174SYSMMU_RESOURCE_DEFINE(EXYNOS5, flite0, LITE0, LITE0);
175SYSMMU_RESOURCE_DEFINE(EXYNOS5, flite1, LITE1, LITE1);
176SYSMMU_RESOURCE_DEFINE(EXYNOS5, gsc0, GSC0, GSC0);
177SYSMMU_RESOURCE_DEFINE(EXYNOS5, gsc1, GSC1, GSC1);
178SYSMMU_RESOURCE_DEFINE(EXYNOS5, gsc2, GSC2, GSC2);
179SYSMMU_RESOURCE_DEFINE(EXYNOS5, gsc3, GSC3, GSC3);
180SYSMMU_RESOURCE_DEFINE(EXYNOS5, mfc_r, MFC_R, MFC_R);
181SYSMMU_RESOURCE_DEFINE(EXYNOS5, mfc_l, MFC_L, MFC_L);
182SYSMMU_RESOURCE(EXYNOS5, isp) {
183 DEFINE_SYSMMU_RESOURCE(EXYNOS5, ISP, ISP),
184 DEFINE_SYSMMU_RESOURCE(EXYNOS5, DRC, DRC),
185 DEFINE_SYSMMU_RESOURCE(EXYNOS5, FD, FD),
186 DEFINE_SYSMMU_RESOURCE(EXYNOS5, ISPCPU, MCUISP),
187 DEFINE_SYSMMU_RESOURCE(EXYNOS5, SCALERC, SCALERCISP),
188 DEFINE_SYSMMU_RESOURCE(EXYNOS5, SCALERP, SCALERPISP),
189 DEFINE_SYSMMU_RESOURCE(EXYNOS5, ODC, ODC),
190 DEFINE_SYSMMU_RESOURCE(EXYNOS5, DIS0, DIS0),
191 DEFINE_SYSMMU_RESOURCE(EXYNOS5, DIS1, DIS1),
192 DEFINE_SYSMMU_RESOURCE(EXYNOS5, 3DNR, 3DNR),
193};
194
195static struct sysmmu_resource_map sysmmu_resmap5[] __initdata = {
196 SYSMMU_RESOURCE_MAPPING(5, jpeg, jpeg),
197 SYSMMU_RESOURCE_MAPPING(5, fimd1, fimd1),
198 SYSMMU_RESOURCE_MAPPING(5, 2d, 2d),
199 SYSMMU_RESOURCE_MAPPING(5, rot, rot),
200 SYSMMU_RESOURCE_MAPPING_PD(5, tv, tv, PD_DISP1),
201 SYSMMU_RESOURCE_MAPPING_PD(5, camif0, flite0, PD_GSCL),
202 SYSMMU_RESOURCE_MAPPING_PD(5, camif1, flite1, PD_GSCL),
203 SYSMMU_RESOURCE_MAPPING_PD(5, gsc0, gsc0, PD_GSCL),
204 SYSMMU_RESOURCE_MAPPING_PD(5, gsc1, gsc1, PD_GSCL),
205 SYSMMU_RESOURCE_MAPPING_PD(5, gsc2, gsc2, PD_GSCL),
206 SYSMMU_RESOURCE_MAPPING_PD(5, gsc3, gsc3, PD_GSCL),
207 SYSMMU_RESOURCE_MAPPING_PD(5, mfc_r, mfc_r, PD_MFC),
208 SYSMMU_RESOURCE_MAPPING_PD(5, mfc_l, mfc_l, PD_MFC),
209 SYSMMU_RESOURCE_MAPPING_MCPD(5, isp, isp, PD_ISP, mc_platdata),
210};
211#endif /* CONFIG_ARCH_EXYNOS5 */
212
213static int __init init_sysmmu_platform_device(void)
214{
215 int i, j;
216 struct sysmmu_resource_map *resmap[2] = {NULL, NULL};
217 int nmap[2] = {0, 0};
218
219#ifdef CONFIG_ARCH_EXYNOS5
220 if (soc_is_exynos5250()) {
221 resmap[0] = sysmmu_resmap5;
222 nmap[0] = ARRAY_SIZE(sysmmu_resmap5);
223 nmap[1] = 0;
224 }
225#endif
226
227#ifdef CONFIG_ARCH_EXYNOS4
228 if (resmap[0] == NULL) {
229 resmap[0] = sysmmu_resmap4;
230 nmap[0] = ARRAY_SIZE(sysmmu_resmap4);
231 }
232
233 if (soc_is_exynos4210()) {
234 resmap[1] = sysmmu_resmap4210;
235 nmap[1] = ARRAY_SIZE(sysmmu_resmap4210);
236 }
237
238 if (soc_is_exynos4412() || soc_is_exynos4212()) {
239 resmap[1] = sysmmu_resmap4212;
240 nmap[1] = ARRAY_SIZE(sysmmu_resmap4212);
241 }
242#endif
243
244 for (j = 0; j < 2; j++) {
245 for (i = 0; i < nmap[j]; i++) {
246 struct sysmmu_resource_map *map;
247 struct sysmmu_platform_data *platdata;
248
249 map = &resmap[j][i];
250
251 map->pdev->dev.parent = map->pdd;
252
253 platdata = map->pdev->dev.platform_data;
254 platdata->clockname = map->clocknames;
255
256 if (platform_device_add_resources(map->pdev, map->res,
257 map->rnum)) {
258 pr_err("%s: Failed to add device resources for "
259 "%s.%d\n", __func__,
260 map->pdev->name, map->pdev->id);
261 continue;
262 }
263
264 if (platform_device_register(map->pdev)) {
265 pr_err("%s: Failed to register %s.%d\n",
266 __func__, map->pdev->name,
267 map->pdev->id);
268 }
269 }
270 }
271
272 return 0;
273}
274arch_initcall(init_sysmmu_platform_device);
diff --git a/arch/arm/mach-exynos/include/mach/sysmmu.h b/arch/arm/mach-exynos/include/mach/sysmmu.h
deleted file mode 100644
index 88a4543b0001..000000000000
--- a/arch/arm/mach-exynos/include/mach/sysmmu.h
+++ /dev/null
@@ -1,66 +0,0 @@
1/*
2 * Copyright (c) 2011-2012 Samsung Electronics Co., Ltd.
3 * http://www.samsung.com
4 *
5 * EXYNOS - System MMU support
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11
12#ifndef _ARM_MACH_EXYNOS_SYSMMU_H_
13#define _ARM_MACH_EXYNOS_SYSMMU_H_
14
15struct sysmmu_platform_data {
16 char *dbgname;
17 /* comma(,) separated list of clock names for clock gating */
18 char *clockname;
19};
20
21#define SYSMMU_DEVNAME_BASE "exynos-sysmmu"
22
23#define SYSMMU_CLOCK_NAME "sysmmu"
24#define SYSMMU_CLOCK_NAME2 "sysmmu_mc"
25
26#ifdef CONFIG_EXYNOS_DEV_SYSMMU
27#include <linux/device.h>
28struct platform_device;
29
30#define SYSMMU_PLATDEV(ipname) exynos_device_sysmmu_##ipname
31
32extern struct platform_device SYSMMU_PLATDEV(mfc_l);
33extern struct platform_device SYSMMU_PLATDEV(mfc_r);
34extern struct platform_device SYSMMU_PLATDEV(tv);
35extern struct platform_device SYSMMU_PLATDEV(jpeg);
36extern struct platform_device SYSMMU_PLATDEV(rot);
37extern struct platform_device SYSMMU_PLATDEV(fimc0);
38extern struct platform_device SYSMMU_PLATDEV(fimc1);
39extern struct platform_device SYSMMU_PLATDEV(fimc2);
40extern struct platform_device SYSMMU_PLATDEV(fimc3);
41extern struct platform_device SYSMMU_PLATDEV(gsc0);
42extern struct platform_device SYSMMU_PLATDEV(gsc1);
43extern struct platform_device SYSMMU_PLATDEV(gsc2);
44extern struct platform_device SYSMMU_PLATDEV(gsc3);
45extern struct platform_device SYSMMU_PLATDEV(isp);
46extern struct platform_device SYSMMU_PLATDEV(fimd0);
47extern struct platform_device SYSMMU_PLATDEV(fimd1);
48extern struct platform_device SYSMMU_PLATDEV(camif0);
49extern struct platform_device SYSMMU_PLATDEV(camif1);
50extern struct platform_device SYSMMU_PLATDEV(2d);
51
52#ifdef CONFIG_IOMMU_API
53static inline void platform_set_sysmmu(
54 struct device *sysmmu, struct device *dev)
55{
56 dev->archdata.iommu = sysmmu;
57}
58#endif
59
60#else /* !CONFIG_EXYNOS_DEV_SYSMMU */
61#define platform_set_sysmmu(sysmmu, dev) do { } while (0)
62#endif
63
64#define SYSMMU_CLOCK_DEVNAME(ipname, id) (SYSMMU_DEVNAME_BASE "." #id)
65
66#endif /* _ARM_MACH_EXYNOS_SYSMMU_H_ */
diff --git a/arch/arm/mach-exynos/mach-exynos4-dt.c b/arch/arm/mach-exynos/mach-exynos4-dt.c
index 112d10e53d20..3358088c822a 100644
--- a/arch/arm/mach-exynos/mach-exynos4-dt.c
+++ b/arch/arm/mach-exynos/mach-exynos4-dt.c
@@ -79,6 +79,40 @@ static const struct of_dev_auxdata exynos4_auxdata_lookup[] __initconst = {
79 OF_DEV_AUXDATA("arm,pl330", EXYNOS4_PA_MDMA1, "dma-pl330.2", NULL), 79 OF_DEV_AUXDATA("arm,pl330", EXYNOS4_PA_MDMA1, "dma-pl330.2", NULL),
80 OF_DEV_AUXDATA("samsung,exynos4210-tmu", EXYNOS4_PA_TMU, 80 OF_DEV_AUXDATA("samsung,exynos4210-tmu", EXYNOS4_PA_TMU,
81 "exynos-tmu", NULL), 81 "exynos-tmu", NULL),
82 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x13620000,
83 "exynos-sysmmu.0", NULL), /* MFC_L */
84 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x13630000,
85 "exynos-sysmmu.1", NULL), /* MFC_R */
86 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x13E20000,
87 "exynos-sysmmu.2", NULL), /* TV */
88 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x11A60000,
89 "exynos-sysmmu.3", NULL), /* JPEG */
90 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x12A30000,
91 "exynos-sysmmu.4", NULL), /* ROTATOR */
92 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x11A20000,
93 "exynos-sysmmu.5", NULL), /* FIMC0 */
94 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x11A30000,
95 "exynos-sysmmu.6", NULL), /* FIMC1 */
96 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x11A40000,
97 "exynos-sysmmu.7", NULL), /* FIMC2 */
98 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x11A50000,
99 "exynos-sysmmu.8", NULL), /* FIMC3 */
100 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x12A20000,
101 "exynos-sysmmu.9", NULL), /* G2D(4210) */
102 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x10A40000,
103 "exynos-sysmmu.9", NULL), /* G2D(4x12) */
104 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x11E20000,
105 "exynos-sysmmu.10", NULL), /* FIMD0 */
106 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x12220000,
107 "exynos-sysmmu.11", NULL), /* FIMD1(4210) */
108 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x12260000,
109 "exynos-sysmmu.12", NULL), /* IS0(4x12) */
110 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x122B0000,
111 "exynos-sysmmu.13", NULL), /* IS1(4x12) */
112 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x123B0000,
113 "exynos-sysmmu.14", NULL), /* FIMC-LITE0(4x12) */
114 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x123C0000,
115 "exynos-sysmmu.15", NULL), /* FIMC-LITE1(4x12) */
82 {}, 116 {},
83}; 117};
84 118
diff --git a/arch/arm/mach-exynos/mach-exynos5-dt.c b/arch/arm/mach-exynos/mach-exynos5-dt.c
index 973a06637572..acaeb14db54b 100644
--- a/arch/arm/mach-exynos/mach-exynos5-dt.c
+++ b/arch/arm/mach-exynos/mach-exynos5-dt.c
@@ -109,6 +109,36 @@ static const struct of_dev_auxdata exynos5250_auxdata_lookup[] __initconst = {
109 "samsung-i2s.1", NULL), 109 "samsung-i2s.1", NULL),
110 OF_DEV_AUXDATA("samsung,i2s-v5", 0x12D70000, 110 OF_DEV_AUXDATA("samsung,i2s-v5", 0x12D70000,
111 "samsung-i2s.2", NULL), 111 "samsung-i2s.2", NULL),
112 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x11210000,
113 "exynos-sysmmu.0", "mfc"), /* MFC_L */
114 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x11200000,
115 "exynos-sysmmu.1", "mfc"), /* MFC_R */
116 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x14650000,
117 "exynos-sysmmu.2", NULL), /* TV */
118 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x11F20000,
119 "exynos-sysmmu.3", "jpeg"), /* JPEG */
120 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x11D40000,
121 "exynos-sysmmu.4", NULL), /* ROTATOR */
122 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x13E80000,
123 "exynos-sysmmu.5", "gscl"), /* GSCL0 */
124 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x13E90000,
125 "exynos-sysmmu.6", "gscl"), /* GSCL1 */
126 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x13EA0000,
127 "exynos-sysmmu.7", "gscl"), /* GSCL2 */
128 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x13EB0000,
129 "exynos-sysmmu.8", "gscl"), /* GSCL3 */
130 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x13260000,
131 "exynos-sysmmu.9", NULL), /* FIMC-IS0 */
132 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x132C0000,
133 "exynos-sysmmu.10", NULL), /* FIMC-IS1 */
134 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x14640000,
135 "exynos-sysmmu.11", NULL), /* FIMD1 */
136 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x13C40000,
137 "exynos-sysmmu.12", NULL), /* FIMC-LITE0 */
138 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x13C50000,
139 "exynos-sysmmu.13", NULL), /* FIMC-LITE1 */
140 OF_DEV_AUXDATA("samsung,exynos-sysmmu", 0x10A60000,
141 "exynos-sysmmu.14", NULL), /* G2D */
112 {}, 142 {},
113}; 143};
114 144
diff --git a/arch/arm/mach-shmobile/setup-r8a7740.c b/arch/arm/mach-shmobile/setup-r8a7740.c
index 30ac79c7c687..8b85d4d8fab6 100644
--- a/arch/arm/mach-shmobile/setup-r8a7740.c
+++ b/arch/arm/mach-shmobile/setup-r8a7740.c
@@ -27,6 +27,7 @@
27#include <linux/serial_sci.h> 27#include <linux/serial_sci.h>
28#include <linux/sh_dma.h> 28#include <linux/sh_dma.h>
29#include <linux/sh_timer.h> 29#include <linux/sh_timer.h>
30#include <linux/platform_data/sh_ipmmu.h>
30#include <mach/dma-register.h> 31#include <mach/dma-register.h>
31#include <mach/r8a7740.h> 32#include <mach/r8a7740.h>
32#include <mach/pm-rmobile.h> 33#include <mach/pm-rmobile.h>
@@ -378,6 +379,37 @@ static struct platform_device tmu02_device = {
378 .num_resources = ARRAY_SIZE(tmu02_resources), 379 .num_resources = ARRAY_SIZE(tmu02_resources),
379}; 380};
380 381
382/* IPMMUI (an IPMMU module for ICB/LMB) */
383static struct resource ipmmu_resources[] = {
384 [0] = {
385 .name = "IPMMUI",
386 .start = 0xfe951000,
387 .end = 0xfe9510ff,
388 .flags = IORESOURCE_MEM,
389 },
390};
391
392static const char * const ipmmu_dev_names[] = {
393 "sh_mobile_lcdc_fb.0",
394 "sh_mobile_lcdc_fb.1",
395 "sh_mobile_ceu.0",
396};
397
398static struct shmobile_ipmmu_platform_data ipmmu_platform_data = {
399 .dev_names = ipmmu_dev_names,
400 .num_dev_names = ARRAY_SIZE(ipmmu_dev_names),
401};
402
403static struct platform_device ipmmu_device = {
404 .name = "ipmmu",
405 .id = -1,
406 .dev = {
407 .platform_data = &ipmmu_platform_data,
408 },
409 .resource = ipmmu_resources,
410 .num_resources = ARRAY_SIZE(ipmmu_resources),
411};
412
381static struct platform_device *r8a7740_early_devices[] __initdata = { 413static struct platform_device *r8a7740_early_devices[] __initdata = {
382 &scif0_device, 414 &scif0_device,
383 &scif1_device, 415 &scif1_device,
@@ -392,6 +424,7 @@ static struct platform_device *r8a7740_early_devices[] __initdata = {
392 &tmu00_device, 424 &tmu00_device,
393 &tmu01_device, 425 &tmu01_device,
394 &tmu02_device, 426 &tmu02_device,
427 &ipmmu_device,
395}; 428};
396 429
397/* DMA */ 430/* DMA */
diff --git a/arch/arm/mach-shmobile/setup-sh7372.c b/arch/arm/mach-shmobile/setup-sh7372.c
index d2079d5e3334..59c7146bf66f 100644
--- a/arch/arm/mach-shmobile/setup-sh7372.c
+++ b/arch/arm/mach-shmobile/setup-sh7372.c
@@ -33,6 +33,7 @@
33#include <linux/sh_timer.h> 33#include <linux/sh_timer.h>
34#include <linux/pm_domain.h> 34#include <linux/pm_domain.h>
35#include <linux/dma-mapping.h> 35#include <linux/dma-mapping.h>
36#include <linux/platform_data/sh_ipmmu.h>
36#include <mach/dma-register.h> 37#include <mach/dma-register.h>
37#include <mach/hardware.h> 38#include <mach/hardware.h>
38#include <mach/irqs.h> 39#include <mach/irqs.h>
@@ -1008,6 +1009,43 @@ static struct platform_device spu1_device = {
1008 .num_resources = ARRAY_SIZE(spu1_resources), 1009 .num_resources = ARRAY_SIZE(spu1_resources),
1009}; 1010};
1010 1011
1012/* IPMMUI (an IPMMU module for ICB/LMB) */
1013static struct resource ipmmu_resources[] = {
1014 [0] = {
1015 .name = "IPMMUI",
1016 .start = 0xfe951000,
1017 .end = 0xfe9510ff,
1018 .flags = IORESOURCE_MEM,
1019 },
1020};
1021
1022static const char * const ipmmu_dev_names[] = {
1023 "sh_mobile_lcdc_fb.0",
1024 "sh_mobile_lcdc_fb.1",
1025 "sh_mobile_ceu.0",
1026 "uio_pdrv_genirq.0",
1027 "uio_pdrv_genirq.1",
1028 "uio_pdrv_genirq.2",
1029 "uio_pdrv_genirq.3",
1030 "uio_pdrv_genirq.4",
1031 "uio_pdrv_genirq.5",
1032};
1033
1034static struct shmobile_ipmmu_platform_data ipmmu_platform_data = {
1035 .dev_names = ipmmu_dev_names,
1036 .num_dev_names = ARRAY_SIZE(ipmmu_dev_names),
1037};
1038
1039static struct platform_device ipmmu_device = {
1040 .name = "ipmmu",
1041 .id = -1,
1042 .dev = {
1043 .platform_data = &ipmmu_platform_data,
1044 },
1045 .resource = ipmmu_resources,
1046 .num_resources = ARRAY_SIZE(ipmmu_resources),
1047};
1048
1011static struct platform_device *sh7372_early_devices[] __initdata = { 1049static struct platform_device *sh7372_early_devices[] __initdata = {
1012 &scif0_device, 1050 &scif0_device,
1013 &scif1_device, 1051 &scif1_device,
@@ -1019,6 +1057,7 @@ static struct platform_device *sh7372_early_devices[] __initdata = {
1019 &cmt2_device, 1057 &cmt2_device,
1020 &tmu00_device, 1058 &tmu00_device,
1021 &tmu01_device, 1059 &tmu01_device,
1060 &ipmmu_device,
1022}; 1061};
1023 1062
1024static struct platform_device *sh7372_late_devices[] __initdata = { 1063static struct platform_device *sh7372_late_devices[] __initdata = {
diff --git a/arch/arm/mach-shmobile/setup-sh73a0.c b/arch/arm/mach-shmobile/setup-sh73a0.c
index 2ecd6681692f..bdab575f88bc 100644
--- a/arch/arm/mach-shmobile/setup-sh73a0.c
+++ b/arch/arm/mach-shmobile/setup-sh73a0.c
@@ -31,6 +31,7 @@
31#include <linux/sh_dma.h> 31#include <linux/sh_dma.h>
32#include <linux/sh_intc.h> 32#include <linux/sh_intc.h>
33#include <linux/sh_timer.h> 33#include <linux/sh_timer.h>
34#include <linux/platform_data/sh_ipmmu.h>
34#include <mach/dma-register.h> 35#include <mach/dma-register.h>
35#include <mach/hardware.h> 36#include <mach/hardware.h>
36#include <mach/irqs.h> 37#include <mach/irqs.h>
@@ -780,6 +781,35 @@ static struct platform_device pmu_device = {
780 .resource = pmu_resources, 781 .resource = pmu_resources,
781}; 782};
782 783
784/* an IPMMU module for ICB */
785static struct resource ipmmu_resources[] = {
786 [0] = {
787 .name = "IPMMU",
788 .start = 0xfe951000,
789 .end = 0xfe9510ff,
790 .flags = IORESOURCE_MEM,
791 },
792};
793
794static const char * const ipmmu_dev_names[] = {
795 "sh_mobile_lcdc_fb.0",
796};
797
798static struct shmobile_ipmmu_platform_data ipmmu_platform_data = {
799 .dev_names = ipmmu_dev_names,
800 .num_dev_names = ARRAY_SIZE(ipmmu_dev_names),
801};
802
803static struct platform_device ipmmu_device = {
804 .name = "ipmmu",
805 .id = -1,
806 .dev = {
807 .platform_data = &ipmmu_platform_data,
808 },
809 .resource = ipmmu_resources,
810 .num_resources = ARRAY_SIZE(ipmmu_resources),
811};
812
783static struct platform_device *sh73a0_early_devices_dt[] __initdata = { 813static struct platform_device *sh73a0_early_devices_dt[] __initdata = {
784 &scif0_device, 814 &scif0_device,
785 &scif1_device, 815 &scif1_device,
@@ -796,6 +826,7 @@ static struct platform_device *sh73a0_early_devices_dt[] __initdata = {
796static struct platform_device *sh73a0_early_devices[] __initdata = { 826static struct platform_device *sh73a0_early_devices[] __initdata = {
797 &tmu00_device, 827 &tmu00_device,
798 &tmu01_device, 828 &tmu01_device,
829 &ipmmu_device,
799}; 830};
800 831
801static struct platform_device *sh73a0_late_devices[] __initdata = { 832static struct platform_device *sh73a0_late_devices[] __initdata = {