Commit 2de05a57 authored by Kukjin Kim's avatar Kukjin Kim

Merge branch 'next/devel-exynos5250-1' into next/devel-samsung-2

parents ab5a4e63 380c3a54
* Samsung Exynos Interrupt Combiner Controller
Samsung's Exynos4 architecture includes a interrupt combiner controller which
can combine interrupt sources as a group and provide a single interrupt request
for the group. The interrupt request from each group are connected to a parent
interrupt controller, such as GIC in case of Exynos4210.
The interrupt combiner controller consists of multiple combiners. Upto eight
interrupt sources can be connected to a combiner. The combiner outputs one
combined interrupt for its eight interrupt sources. The combined interrupt
is usually connected to a parent interrupt controller.
A single node in the device tree is used to describe the interrupt combiner
controller module (which includes multiple combiners). A combiner in the
interrupt controller module shares config/control registers with other
combiners. For example, a 32-bit interrupt enable/disable config register
can accommodate upto 4 interrupt combiners (with each combiner supporting
upto 8 interrupt sources).
Required properties:
- compatible: should be "samsung,exynos4210-combiner".
- interrupt-controller: Identifies the node as an interrupt controller.
- #interrupt-cells: should be <2>. The meaning of the cells are
* First Cell: Combiner Group Number.
* Second Cell: Interrupt number within the group.
- reg: Base address and size of interrupt combiner registers.
- interrupts: The list of interrupts generated by the combiners which are then
connected to a parent interrupt controller. The format of the interrupt
specifier depends in the interrupt parent controller.
Optional properties:
- samsung,combiner-nr: The number of interrupt combiners supported. If this
property is not specified, the default number of combiners is assumed
to be 16.
- interrupt-parent: pHandle of the parent interrupt controller, if not
inherited from the parent node.
Example:
The following is a an example from the Exynos4210 SoC dtsi file.
combiner:interrupt-controller@10440000 {
compatible = "samsung,exynos4210-combiner";
interrupt-controller;
#interrupt-cells = <2>;
reg = <0x10440000 0x1000>;
interrupts = <0 0 0>, <0 1 0>, <0 2 0>, <0 3 0>,
<0 4 0>, <0 5 0>, <0 6 0>, <0 7 0>,
<0 8 0>, <0 9 0>, <0 10 0>, <0 11 0>,
<0 12 0>, <0 13 0>, <0 14 0>, <0 15 0>;
};
...@@ -1088,7 +1088,6 @@ source "arch/arm/mach-sa1100/Kconfig" ...@@ -1088,7 +1088,6 @@ source "arch/arm/mach-sa1100/Kconfig"
source "arch/arm/plat-samsung/Kconfig" source "arch/arm/plat-samsung/Kconfig"
source "arch/arm/plat-s3c24xx/Kconfig" source "arch/arm/plat-s3c24xx/Kconfig"
source "arch/arm/plat-s5p/Kconfig"
source "arch/arm/plat-spear/Kconfig" source "arch/arm/plat-spear/Kconfig"
......
...@@ -209,7 +209,7 @@ plat-$(CONFIG_PLAT_NOMADIK) := nomadik ...@@ -209,7 +209,7 @@ plat-$(CONFIG_PLAT_NOMADIK) := nomadik
plat-$(CONFIG_PLAT_ORION) := orion plat-$(CONFIG_PLAT_ORION) := orion
plat-$(CONFIG_PLAT_PXA) := pxa plat-$(CONFIG_PLAT_PXA) := pxa
plat-$(CONFIG_PLAT_S3C24XX) := s3c24xx samsung plat-$(CONFIG_PLAT_S3C24XX) := s3c24xx samsung
plat-$(CONFIG_PLAT_S5P) := s5p samsung plat-$(CONFIG_PLAT_S5P) := samsung
plat-$(CONFIG_PLAT_SPEAR) := spear plat-$(CONFIG_PLAT_SPEAR) := spear
plat-$(CONFIG_PLAT_VERSATILE) := versatile plat-$(CONFIG_PLAT_VERSATILE) := versatile
......
...@@ -23,4 +23,52 @@ memory { ...@@ -23,4 +23,52 @@ memory {
chosen { chosen {
bootargs = "root=/dev/ram0 rw ramdisk=8192 console=ttySAC1,115200"; bootargs = "root=/dev/ram0 rw ramdisk=8192 console=ttySAC1,115200";
}; };
i2c@12C60000 {
samsung,i2c-sda-delay = <100>;
samsung,i2c-max-bus-freq = <20000>;
gpios = <&gpb3 0 2 3 0>,
<&gpb3 1 2 3 0>;
eeprom@50 {
compatible = "samsung,s524ad0xd1";
reg = <0x50>;
};
};
i2c@12C70000 {
samsung,i2c-sda-delay = <100>;
samsung,i2c-max-bus-freq = <20000>;
gpios = <&gpb3 2 2 3 0>,
<&gpb3 3 2 3 0>;
eeprom@51 {
compatible = "samsung,s524ad0xd1";
reg = <0x51>;
};
};
i2c@12C80000 {
status = "disabled";
};
i2c@12C90000 {
status = "disabled";
};
i2c@12CA0000 {
status = "disabled";
};
i2c@12CB0000 {
status = "disabled";
};
i2c@12CC0000 {
status = "disabled";
};
i2c@12CD0000 {
status = "disabled";
};
}; };
...@@ -23,11 +23,11 @@ / { ...@@ -23,11 +23,11 @@ / {
compatible = "samsung,exynos5250"; compatible = "samsung,exynos5250";
interrupt-parent = <&gic>; interrupt-parent = <&gic>;
gic:interrupt-controller@10490000 { gic:interrupt-controller@10481000 {
compatible = "arm,cortex-a9-gic"; compatible = "arm,cortex-a9-gic";
#interrupt-cells = <3>; #interrupt-cells = <3>;
interrupt-controller; interrupt-controller;
reg = <0x10490000 0x1000>, <0x10480000 0x100>; reg = <0x10481000 0x1000>, <0x10482000 0x2000>;
}; };
watchdog { watchdog {
...@@ -42,30 +42,6 @@ rtc { ...@@ -42,30 +42,6 @@ rtc {
interrupts = <0 43 0>, <0 44 0>; interrupts = <0 43 0>, <0 44 0>;
}; };
sdhci@12200000 {
compatible = "samsung,exynos4210-sdhci";
reg = <0x12200000 0x100>;
interrupts = <0 75 0>;
};
sdhci@12210000 {
compatible = "samsung,exynos4210-sdhci";
reg = <0x12210000 0x100>;
interrupts = <0 76 0>;
};
sdhci@12220000 {
compatible = "samsung,exynos4210-sdhci";
reg = <0x12220000 0x100>;
interrupts = <0 77 0>;
};
sdhci@12230000 {
compatible = "samsung,exynos4210-sdhci";
reg = <0x12230000 0x100>;
interrupts = <0 78 0>;
};
serial@12C00000 { serial@12C00000 {
compatible = "samsung,exynos4210-uart"; compatible = "samsung,exynos4210-uart";
reg = <0x12C00000 0x100>; reg = <0x12C00000 0x100>;
...@@ -94,48 +70,64 @@ i2c@12C60000 { ...@@ -94,48 +70,64 @@ i2c@12C60000 {
compatible = "samsung,s3c2440-i2c"; compatible = "samsung,s3c2440-i2c";
reg = <0x12C60000 0x100>; reg = <0x12C60000 0x100>;
interrupts = <0 56 0>; interrupts = <0 56 0>;
#address-cells = <1>;
#size-cells = <0>;
}; };
i2c@12C70000 { i2c@12C70000 {
compatible = "samsung,s3c2440-i2c"; compatible = "samsung,s3c2440-i2c";
reg = <0x12C70000 0x100>; reg = <0x12C70000 0x100>;
interrupts = <0 57 0>; interrupts = <0 57 0>;
#address-cells = <1>;
#size-cells = <0>;
}; };
i2c@12C80000 { i2c@12C80000 {
compatible = "samsung,s3c2440-i2c"; compatible = "samsung,s3c2440-i2c";
reg = <0x12C80000 0x100>; reg = <0x12C80000 0x100>;
interrupts = <0 58 0>; interrupts = <0 58 0>;
#address-cells = <1>;
#size-cells = <0>;
}; };
i2c@12C90000 { i2c@12C90000 {
compatible = "samsung,s3c2440-i2c"; compatible = "samsung,s3c2440-i2c";
reg = <0x12C90000 0x100>; reg = <0x12C90000 0x100>;
interrupts = <0 59 0>; interrupts = <0 59 0>;
#address-cells = <1>;
#size-cells = <0>;
}; };
i2c@12CA0000 { i2c@12CA0000 {
compatible = "samsung,s3c2440-i2c"; compatible = "samsung,s3c2440-i2c";
reg = <0x12CA0000 0x100>; reg = <0x12CA0000 0x100>;
interrupts = <0 60 0>; interrupts = <0 60 0>;
#address-cells = <1>;
#size-cells = <0>;
}; };
i2c@12CB0000 { i2c@12CB0000 {
compatible = "samsung,s3c2440-i2c"; compatible = "samsung,s3c2440-i2c";
reg = <0x12CB0000 0x100>; reg = <0x12CB0000 0x100>;
interrupts = <0 61 0>; interrupts = <0 61 0>;
#address-cells = <1>;
#size-cells = <0>;
}; };
i2c@12CC0000 { i2c@12CC0000 {
compatible = "samsung,s3c2440-i2c"; compatible = "samsung,s3c2440-i2c";
reg = <0x12CC0000 0x100>; reg = <0x12CC0000 0x100>;
interrupts = <0 62 0>; interrupts = <0 62 0>;
#address-cells = <1>;
#size-cells = <0>;
}; };
i2c@12CD0000 { i2c@12CD0000 {
compatible = "samsung,s3c2440-i2c"; compatible = "samsung,s3c2440-i2c";
reg = <0x12CD0000 0x100>; reg = <0x12CD0000 0x100>;
interrupts = <0 63 0>; interrupts = <0 63 0>;
#address-cells = <1>;
#size-cells = <0>;
}; };
amba { amba {
...@@ -157,13 +149,13 @@ pdma1: pdma@121B0000 { ...@@ -157,13 +149,13 @@ pdma1: pdma@121B0000 {
interrupts = <0 35 0>; interrupts = <0 35 0>;
}; };
mdma0: pdma@10800000 { mdma0: mdma@10800000 {
compatible = "arm,pl330", "arm,primecell"; compatible = "arm,pl330", "arm,primecell";
reg = <0x10800000 0x1000>; reg = <0x10800000 0x1000>;
interrupts = <0 33 0>; interrupts = <0 33 0>;
}; };
mdma1: pdma@11C10000 { mdma1: mdma@11C10000 {
compatible = "arm,pl330", "arm,primecell"; compatible = "arm,pl330", "arm,primecell";
reg = <0x11C10000 0x1000>; reg = <0x11C10000 0x1000>;
interrupts = <0 124 0>; interrupts = <0 124 0>;
...@@ -242,6 +234,12 @@ gpc3: gpio-controller@11400140 { ...@@ -242,6 +234,12 @@ gpc3: gpio-controller@11400140 {
#gpio-cells = <4>; #gpio-cells = <4>;
}; };
gpc4: gpio-controller@114002E0 {
compatible = "samsung,exynos4-gpio";
reg = <0x114002E0 0x20>;
#gpio-cells = <4>;
};
gpd0: gpio-controller@11400160 { gpd0: gpio-controller@11400160 {
compatible = "samsung,exynos4-gpio"; compatible = "samsung,exynos4-gpio";
reg = <0x11400160 0x20>; reg = <0x11400160 0x20>;
...@@ -388,19 +386,19 @@ gpv1: gpio-controller@10D10020 { ...@@ -388,19 +386,19 @@ gpv1: gpio-controller@10D10020 {
gpv2: gpio-controller@10D10040 { gpv2: gpio-controller@10D10040 {
compatible = "samsung,exynos4-gpio"; compatible = "samsung,exynos4-gpio";
reg = <0x10D10040 0x20>; reg = <0x10D10060 0x20>;
#gpio-cells = <4>; #gpio-cells = <4>;
}; };
gpv3: gpio-controller@10D10060 { gpv3: gpio-controller@10D10060 {
compatible = "samsung,exynos4-gpio"; compatible = "samsung,exynos4-gpio";
reg = <0x10D10060 0x20>; reg = <0x10D10080 0x20>;
#gpio-cells = <4>; #gpio-cells = <4>;
}; };
gpv4: gpio-controller@10D10080 { gpv4: gpio-controller@10D10080 {
compatible = "samsung,exynos4-gpio"; compatible = "samsung,exynos4-gpio";
reg = <0x10D10080 0x20>; reg = <0x10D100C0 0x20>;
#gpio-cells = <4>; #gpio-cells = <4>;
}; };
......
...@@ -165,11 +165,29 @@ static struct clksrc_clk exynos5_clk_sclk_apll = { ...@@ -165,11 +165,29 @@ static struct clksrc_clk exynos5_clk_sclk_apll = {
.reg_div = { .reg = EXYNOS5_CLKDIV_CPU0, .shift = 24, .size = 3 }, .reg_div = { .reg = EXYNOS5_CLKDIV_CPU0, .shift = 24, .size = 3 },
}; };
static struct clksrc_clk exynos5_clk_mout_bpll_fout = {
.clk = {
.name = "mout_bpll_fout",
},
.sources = &clk_src_bpll_fout,
.reg_src = { .reg = EXYNOS5_PLL_DIV2_SEL, .shift = 0, .size = 1 },
};
static struct clk *exynos5_clk_src_bpll_list[] = {
[0] = &clk_fin_bpll,
[1] = &exynos5_clk_mout_bpll_fout.clk,
};
static struct clksrc_sources exynos5_clk_src_bpll = {
.sources = exynos5_clk_src_bpll_list,
.nr_sources = ARRAY_SIZE(exynos5_clk_src_bpll_list),
};
static struct clksrc_clk exynos5_clk_mout_bpll = { static struct clksrc_clk exynos5_clk_mout_bpll = {
.clk = { .clk = {
.name = "mout_bpll", .name = "mout_bpll",
}, },
.sources = &clk_src_bpll, .sources = &exynos5_clk_src_bpll,
.reg_src = { .reg = EXYNOS5_CLKSRC_CDREX, .shift = 0, .size = 1 }, .reg_src = { .reg = EXYNOS5_CLKSRC_CDREX, .shift = 0, .size = 1 },
}; };
...@@ -207,11 +225,29 @@ static struct clksrc_clk exynos5_clk_mout_epll = { ...@@ -207,11 +225,29 @@ static struct clksrc_clk exynos5_clk_mout_epll = {
.reg_src = { .reg = EXYNOS5_CLKSRC_TOP2, .shift = 12, .size = 1 }, .reg_src = { .reg = EXYNOS5_CLKSRC_TOP2, .shift = 12, .size = 1 },
}; };
static struct clksrc_clk exynos5_clk_mout_mpll_fout = {
.clk = {
.name = "mout_mpll_fout",
},
.sources = &clk_src_mpll_fout,
.reg_src = { .reg = EXYNOS5_PLL_DIV2_SEL, .shift = 4, .size = 1 },
};
static struct clk *exynos5_clk_src_mpll_list[] = {
[0] = &clk_fin_mpll,
[1] = &exynos5_clk_mout_mpll_fout.clk,
};
static struct clksrc_sources exynos5_clk_src_mpll = {
.sources = exynos5_clk_src_mpll_list,
.nr_sources = ARRAY_SIZE(exynos5_clk_src_mpll_list),
};
struct clksrc_clk exynos5_clk_mout_mpll = { struct clksrc_clk exynos5_clk_mout_mpll = {
.clk = { .clk = {
.name = "mout_mpll", .name = "mout_mpll",
}, },
.sources = &clk_src_mpll, .sources = &exynos5_clk_src_mpll,
.reg_src = { .reg = EXYNOS5_CLKSRC_CORE1, .shift = 8, .size = 1 }, .reg_src = { .reg = EXYNOS5_CLKSRC_CORE1, .shift = 8, .size = 1 },
}; };
...@@ -473,6 +509,11 @@ static struct clk exynos5_init_clocks_off[] = { ...@@ -473,6 +509,11 @@ static struct clk exynos5_init_clocks_off[] = {
.parent = &exynos5_clk_aclk_66.clk, .parent = &exynos5_clk_aclk_66.clk,
.enable = exynos5_clk_ip_peris_ctrl, .enable = exynos5_clk_ip_peris_ctrl,
.ctrlbit = (1 << 20), .ctrlbit = (1 << 20),
}, {
.name = "watchdog",
.parent = &exynos5_clk_aclk_66.clk,
.enable = exynos5_clk_ip_peris_ctrl,
.ctrlbit = (1 << 19),
}, { }, {
.name = "hsmmc", .name = "hsmmc",
.devname = "exynos4-sdhci.0", .devname = "exynos4-sdhci.0",
...@@ -1031,10 +1072,12 @@ static struct clksrc_clk *exynos5_sysclks[] = { ...@@ -1031,10 +1072,12 @@ static struct clksrc_clk *exynos5_sysclks[] = {
&exynos5_clk_mout_apll, &exynos5_clk_mout_apll,
&exynos5_clk_sclk_apll, &exynos5_clk_sclk_apll,
&exynos5_clk_mout_bpll, &exynos5_clk_mout_bpll,
&exynos5_clk_mout_bpll_fout,
&exynos5_clk_mout_bpll_user, &exynos5_clk_mout_bpll_user,
&exynos5_clk_mout_cpll, &exynos5_clk_mout_cpll,
&exynos5_clk_mout_epll, &exynos5_clk_mout_epll,
&exynos5_clk_mout_mpll, &exynos5_clk_mout_mpll,
&exynos5_clk_mout_mpll_fout,
&exynos5_clk_mout_mpll_user, &exynos5_clk_mout_mpll_user,
&exynos5_clk_vpllsrc, &exynos5_clk_vpllsrc,
&exynos5_clk_sclk_vpll, &exynos5_clk_sclk_vpll,
...@@ -1098,7 +1141,9 @@ static struct clk *exynos5_clks[] __initdata = { ...@@ -1098,7 +1141,9 @@ static struct clk *exynos5_clks[] __initdata = {
&exynos5_clk_sclk_hdmi27m, &exynos5_clk_sclk_hdmi27m,
&exynos5_clk_sclk_hdmiphy, &exynos5_clk_sclk_hdmiphy,
&clk_fout_bpll, &clk_fout_bpll,
&clk_fout_bpll_div2,
&clk_fout_cpll, &clk_fout_cpll,
&clk_fout_mpll_div2,
&exynos5_clk_armclk, &exynos5_clk_armclk,
}; };
...@@ -1263,8 +1308,10 @@ void __init_or_cpufreq exynos5_setup_clocks(void) ...@@ -1263,8 +1308,10 @@ void __init_or_cpufreq exynos5_setup_clocks(void)
clk_fout_apll.ops = &exynos5_fout_apll_ops; clk_fout_apll.ops = &exynos5_fout_apll_ops;
clk_fout_bpll.rate = bpll; clk_fout_bpll.rate = bpll;
clk_fout_bpll_div2.rate = bpll >> 1;
clk_fout_cpll.rate = cpll; clk_fout_cpll.rate = cpll;
clk_fout_mpll.rate = mpll; clk_fout_mpll.rate = mpll;
clk_fout_mpll_div2.rate = mpll >> 1;
clk_fout_epll.rate = epll; clk_fout_epll.rate = epll;
clk_fout_vpll.rate = vpll; clk_fout_vpll.rate = vpll;
......
...@@ -19,6 +19,9 @@ ...@@ -19,6 +19,9 @@
#include <linux/serial_core.h> #include <linux/serial_core.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_irq.h> #include <linux/of_irq.h>
#include <linux/export.h>
#include <linux/irqdomain.h>
#include <linux/of_address.h>
#include <asm/proc-fns.h> #include <asm/proc-fns.h>
#include <asm/exception.h> #include <asm/exception.h>
...@@ -265,12 +268,12 @@ static struct map_desc exynos5_iodesc[] __initdata = { ...@@ -265,12 +268,12 @@ static struct map_desc exynos5_iodesc[] __initdata = {
}, { }, {
.virtual = (unsigned long)S5P_VA_GIC_CPU, .virtual = (unsigned long)S5P_VA_GIC_CPU,
.pfn = __phys_to_pfn(EXYNOS5_PA_GIC_CPU), .pfn = __phys_to_pfn(EXYNOS5_PA_GIC_CPU),
.length = SZ_64K, .length = SZ_8K,
.type = MT_DEVICE, .type = MT_DEVICE,
}, { }, {
.virtual = (unsigned long)S5P_VA_GIC_DIST, .virtual = (unsigned long)S5P_VA_GIC_DIST,
.pfn = __phys_to_pfn(EXYNOS5_PA_GIC_DIST), .pfn = __phys_to_pfn(EXYNOS5_PA_GIC_DIST),
.length = SZ_64K, .length = SZ_4K,
.type = MT_DEVICE, .type = MT_DEVICE,
}, },
}; };
...@@ -399,6 +402,7 @@ struct combiner_chip_data { ...@@ -399,6 +402,7 @@ struct combiner_chip_data {
void __iomem *base; void __iomem *base;
}; };
static struct irq_domain *combiner_irq_domain;
static struct combiner_chip_data combiner_data[MAX_COMBINER_NR]; static struct combiner_chip_data combiner_data[MAX_COMBINER_NR];
static inline void __iomem *combiner_base(struct irq_data *data) static inline void __iomem *combiner_base(struct irq_data *data)
...@@ -411,14 +415,14 @@ static inline void __iomem *combiner_base(struct irq_data *data) ...@@ -411,14 +415,14 @@ static inline void __iomem *combiner_base(struct irq_data *data)
static void combiner_mask_irq(struct irq_data *data) static void combiner_mask_irq(struct irq_data *data)
{ {
u32 mask = 1 << (data->irq % 32); u32 mask = 1 << (data->hwirq % 32);
__raw_writel(mask, combiner_base(data) + COMBINER_ENABLE_CLEAR); __raw_writel(mask, combiner_base(data) + COMBINER_ENABLE_CLEAR);
} }
static void combiner_unmask_irq(struct irq_data *data) static void combiner_unmask_irq(struct irq_data *data)
{ {
u32 mask = 1 << (data->irq % 32); u32 mask = 1 << (data->hwirq % 32);
__raw_writel(mask, combiner_base(data) + COMBINER_ENABLE_SET); __raw_writel(mask, combiner_base(data) + COMBINER_ENABLE_SET);
} }
...@@ -474,49 +478,127 @@ static void __init combiner_cascade_irq(unsigned int combiner_nr, unsigned int i ...@@ -474,49 +478,127 @@ static void __init combiner_cascade_irq(unsigned int combiner_nr, unsigned int i
irq_set_chained_handler(irq, combiner_handle_cascade_irq); irq_set_chained_handler(irq, combiner_handle_cascade_irq);
} }
static void __init combiner_init(unsigned int combiner_nr, void __iomem *base, static void __init combiner_init_one(unsigned int combiner_nr,
unsigned int irq_start) void __iomem *base)
{ {
unsigned int i;
unsigned int max_nr;
if (soc_is_exynos5250())
max_nr = EXYNOS5_MAX_COMBINER_NR;
else
max_nr = EXYNOS4_MAX_COMBINER_NR;
if (combiner_nr >= max_nr)
BUG();
combiner_data[combiner_nr].base = base; combiner_data[combiner_nr].base = base;
combiner_data[combiner_nr].irq_offset = irq_start; combiner_data[combiner_nr].irq_offset = irq_find_mapping(
combiner_irq_domain, combiner_nr * MAX_IRQ_IN_COMBINER);
combiner_data[combiner_nr].irq_mask = 0xff << ((combiner_nr % 4) << 3); combiner_data[combiner_nr].irq_mask = 0xff << ((combiner_nr % 4) << 3);
/* Disable all interrupts */ /* Disable all interrupts */
__raw_writel(combiner_data[combiner_nr].irq_mask, __raw_writel(combiner_data[combiner_nr].irq_mask,
base + COMBINER_ENABLE_CLEAR); base + COMBINER_ENABLE_CLEAR);
}
/* Setup the Linux IRQ subsystem */ #ifdef CONFIG_OF
static int combiner_irq_domain_xlate(struct irq_domain *d,
struct device_node *controller,
const u32 *intspec, unsigned int intsize,
unsigned long *out_hwirq,
unsigned int *out_type)
{
if (d->of_node != controller)
return -EINVAL;
if (intsize < 2)
return -EINVAL;
for (i = irq_start; i < combiner_data[combiner_nr].irq_offset *out_hwirq = intspec[0] * MAX_IRQ_IN_COMBINER + intspec[1];
+ MAX_IRQ_IN_COMBINER; i++) { *out_type = 0;
irq_set_chip_and_handler(i, &combiner_chip, handle_level_irq);
irq_set_chip_data(i, &combiner_data[combiner_nr]); return 0;
set_irq_flags(i, IRQF_VALID | IRQF_PROBE); }
#else
static int combiner_irq_domain_xlate(struct irq_domain *d,
struct device_node *controller,
const u32 *intspec, unsigned int intsize,
unsigned long *out_hwirq,
unsigned int *out_type)
{
return -EINVAL;
}
#endif
static int combiner_irq_domain_map(struct irq_domain *d, unsigned int irq,
irq_hw_number_t hw)
{
irq_set_chip_and_handler(irq, &combiner_chip, handle_level_irq);
irq_set_chip_data(irq, &combiner_data[hw >> 3]);
set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
return 0;
}
static struct irq_domain_ops combiner_irq_domain_ops = {
.xlate = combiner_irq_domain_xlate,
.map = combiner_irq_domain_map,
};
void __init combiner_init(void __iomem *combiner_base, struct device_node *np)
{
int i, irq, irq_base;
unsigned int max_nr, nr_irq;
if (np) {
if (of_property_read_u32(np, "samsung,combiner-nr", &max_nr)) {
pr_warning("%s: number of combiners not specified, "
"setting default as %d.\n",
__func__, EXYNOS4_MAX_COMBINER_NR);
max_nr = EXYNOS4_MAX_COMBINER_NR;
}
} else {
max_nr = soc_is_exynos5250() ? EXYNOS5_MAX_COMBINER_NR :
EXYNOS4_MAX_COMBINER_NR;
}
nr_irq = max_nr * MAX_IRQ_IN_COMBINER;
irq_base = irq_alloc_descs(COMBINER_IRQ(0, 0), 1, nr_irq, 0);
if (IS_ERR_VALUE(irq_base)) {
irq_base = COMBINER_IRQ(0, 0);
pr_warning("%s: irq desc alloc failed. Continuing with %d as linux irq base\n", __func__, irq_base);
}
combiner_irq_domain = irq_domain_add_legacy(np, nr_irq, irq_base, 0,
&combiner_irq_domain_ops, &combiner_data);
if (WARN_ON(!combiner_irq_domain)) {
pr_warning("%s: irq domain init failed\n", __func__);
return;
}
for (i = 0; i < max_nr; i++) {
combiner_init_one(i, combiner_base + (i >> 2) * 0x10);
irq = np ? irq_of_parse_and_map(np, i) : IRQ_SPI(i);
combiner_cascade_irq(i, irq);
} }
} }
#ifdef CONFIG_OF #ifdef CONFIG_OF
int __init combiner_of_init(struct device_node *np, struct device_node *parent)
{
void __iomem *combiner_base;
combiner_base = of_iomap(np, 0);
if (!combiner_base) {
pr_err("%s: failed to map combiner registers\n", __func__);
return -ENXIO;
}
combiner_init(combiner_base, np);
return 0;
}
static const struct of_device_id exynos4_dt_irq_match[] = { static const struct of_device_id exynos4_dt_irq_match[] = {
{ .compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, { .compatible = "arm,cortex-a9-gic", .data = gic_of_init, },
{ .compatible = "samsung,exynos4210-combiner",
.data = combiner_of_init, },
{}, {},
}; };
#endif #endif
void __init exynos4_init_irq(void) void __init exynos4_init_irq(void)
{ {
int irq;
unsigned int gic_bank_offset; unsigned int gic_bank_offset;
gic_bank_offset = soc_is_exynos4412() ? 0x4000 : 0x8000; gic_bank_offset = soc_is_exynos4412() ? 0x4000 : 0x8000;
...@@ -528,12 +610,8 @@ void __init exynos4_init_irq(void) ...@@ -528,12 +610,8 @@ void __init exynos4_init_irq(void)
of_irq_init(exynos4_dt_irq_match); of_irq_init(exynos4_dt_irq_match);
#endif #endif
for (irq = 0; irq < EXYNOS4_MAX_COMBINER_NR; irq++) { if (!of_have_populated_dt())
combiner_init(S5P_VA_COMBINER_BASE, NULL);
combiner_init(irq, (void __iomem *)S5P_VA_COMBINER(irq),
COMBINER_IRQ(irq, 0));
combiner_cascade_irq(irq, IRQ_SPI(irq));
}
/* /*
* The parameters of s5p_init_irq() are for VIC init. * The parameters of s5p_init_irq() are for VIC init.
...@@ -545,18 +623,9 @@ void __init exynos4_init_irq(void) ...@@ -545,18 +623,9 @@ void __init exynos4_init_irq(void)
void __init exynos5_init_irq(void) void __init exynos5_init_irq(void)
{ {
int irq;
#ifdef CONFIG_OF #ifdef CONFIG_OF
of_irq_init(exynos4_dt_irq_match); of_irq_init(exynos4_dt_irq_match);
#endif #endif
for (irq = 0; irq < EXYNOS5_MAX_COMBINER_NR; irq++) {
combiner_init(irq, (void __iomem *)S5P_VA_COMBINER(irq),
COMBINER_IRQ(irq, 0));
combiner_cascade_irq(irq, IRQ_SPI(irq));
}
/* /*
* The parameters of s5p_init_irq() are for VIC init. * The parameters of s5p_init_irq() are for VIC init.
* Theses parameters should be NULL and 0 because EXYNOS4 * Theses parameters should be NULL and 0 because EXYNOS4
...@@ -565,30 +634,18 @@ void __init exynos5_init_irq(void) ...@@ -565,30 +634,18 @@ void __init exynos5_init_irq(void)
s5p_init_irq(NULL, 0); s5p_init_irq(NULL, 0);
} }
struct bus_type exynos4_subsys = { struct bus_type exynos_subsys = {
.name = "exynos4-core", .name = "exynos-core",
.dev_name = "exynos4-core", .dev_name = "exynos-core",
};
struct bus_type exynos5_subsys = {
.name = "exynos5-core",
.dev_name = "exynos5-core",
}; };
static struct device exynos4_dev = { static struct device exynos4_dev = {
.bus = &exynos4_subsys, .bus = &exynos_subsys,
};
static struct device exynos5_dev = {
.bus = &exynos5_subsys,
}; };
static int __init exynos_core_init(void) static int __init exynos_core_init(void)
{ {
if (soc_is_exynos5250()) return subsys_system_register(&exynos_subsys, NULL);
return subsys_system_register(&exynos5_subsys, NULL);
else
return subsys_system_register(&exynos4_subsys, NULL);
} }
core_initcall(exynos_core_init); core_initcall(exynos_core_init);
...@@ -675,10 +732,7 @@ static int __init exynos_init(void) ...@@ -675,10 +732,7 @@ static int __init exynos_init(void)
{ {
printk(KERN_INFO "EXYNOS: Initializing architecture\n"); printk(KERN_INFO "EXYNOS: Initializing architecture\n");
if (soc_is_exynos5250()) return device_register(&exynos4_dev);
return device_register(&exynos5_dev);
else
return device_register(&exynos4_dev);
} }
/* uart registration process */ /* uart registration process */
......
...@@ -153,10 +153,11 @@ enum exynos4_gpio_number { ...@@ -153,10 +153,11 @@ enum exynos4_gpio_number {
#define EXYNOS5_GPIO_B2_NR (4) #define EXYNOS5_GPIO_B2_NR (4)
#define EXYNOS5_GPIO_B3_NR (4) #define EXYNOS5_GPIO_B3_NR (4)
#define EXYNOS5_GPIO_C0_NR (7) #define EXYNOS5_GPIO_C0_NR (7)
#define EXYNOS5_GPIO_C1_NR (7) #define EXYNOS5_GPIO_C1_NR (4)
#define EXYNOS5_GPIO_C2_NR (7) #define EXYNOS5_GPIO_C2_NR (7)
#define EXYNOS5_GPIO_C3_NR (7) #define EXYNOS5_GPIO_C3_NR (7)
#define EXYNOS5_GPIO_D0_NR (8) #define EXYNOS5_GPIO_C4_NR (7)
#define EXYNOS5_GPIO_D0_NR (4)
#define EXYNOS5_GPIO_D1_NR (8) #define EXYNOS5_GPIO_D1_NR (8)
#define EXYNOS5_GPIO_Y0_NR (6) #define EXYNOS5_GPIO_Y0_NR (6)
#define EXYNOS5_GPIO_Y1_NR (4) #define EXYNOS5_GPIO_Y1_NR (4)
...@@ -199,7 +200,8 @@ enum exynos5_gpio_number { ...@@ -199,7 +200,8 @@ enum exynos5_gpio_number {
EXYNOS5_GPIO_C1_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_C0), EXYNOS5_GPIO_C1_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_C0),
EXYNOS5_GPIO_C2_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_C1), EXYNOS5_GPIO_C2_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_C1),
EXYNOS5_GPIO_C3_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_C2), EXYNOS5_GPIO_C3_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_C2),
EXYNOS5_GPIO_D0_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_C3), EXYNOS5_GPIO_C4_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_C3),
EXYNOS5_GPIO_D0_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_C4),
EXYNOS5_GPIO_D1_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_D0), EXYNOS5_GPIO_D1_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_D0),
EXYNOS5_GPIO_Y0_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_D1), EXYNOS5_GPIO_Y0_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_D1),
EXYNOS5_GPIO_Y1_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_Y0), EXYNOS5_GPIO_Y1_START = EXYNOS_GPIO_NEXT(EXYNOS5_GPIO_Y0),
...@@ -242,6 +244,7 @@ enum exynos5_gpio_number { ...@@ -242,6 +244,7 @@ enum exynos5_gpio_number {
#define EXYNOS5_GPC1(_nr) (EXYNOS5_GPIO_C1_START + (_nr)) #define EXYNOS5_GPC1(_nr) (EXYNOS5_GPIO_C1_START + (_nr))
#define EXYNOS5_GPC2(_nr) (EXYNOS5_GPIO_C2_START + (_nr)) #define EXYNOS5_GPC2(_nr) (EXYNOS5_GPIO_C2_START + (_nr))
#define EXYNOS5_GPC3(_nr) (EXYNOS5_GPIO_C3_START + (_nr)) #define EXYNOS5_GPC3(_nr) (EXYNOS5_GPIO_C3_START + (_nr))
#define EXYNOS5_GPC4(_nr) (EXYNOS5_GPIO_C4_START + (_nr))
#define EXYNOS5_GPD0(_nr) (EXYNOS5_GPIO_D0_START + (_nr)) #define EXYNOS5_GPD0(_nr) (EXYNOS5_GPIO_D0_START + (_nr))
#define EXYNOS5_GPD1(_nr) (EXYNOS5_GPIO_D1_START + (_nr)) #define EXYNOS5_GPD1(_nr) (EXYNOS5_GPIO_D1_START + (_nr))
#define EXYNOS5_GPY0(_nr) (EXYNOS5_GPIO_Y0_START + (_nr)) #define EXYNOS5_GPY0(_nr) (EXYNOS5_GPIO_Y0_START + (_nr))
......
...@@ -286,6 +286,7 @@ ...@@ -286,6 +286,7 @@
#define EXYNOS5_IRQ_MIPICSI1 IRQ_SPI(80) #define EXYNOS5_IRQ_MIPICSI1 IRQ_SPI(80)
#define EXYNOS5_IRQ_EFNFCON_DMA_ABORT IRQ_SPI(81) #define EXYNOS5_IRQ_EFNFCON_DMA_ABORT IRQ_SPI(81)
#define EXYNOS5_IRQ_MIPIDSI0 IRQ_SPI(82) #define EXYNOS5_IRQ_MIPIDSI0 IRQ_SPI(82)
#define EXYNOS5_IRQ_WDT_IOP IRQ_SPI(83)
#define EXYNOS5_IRQ_ROTATOR IRQ_SPI(84) #define EXYNOS5_IRQ_ROTATOR IRQ_SPI(84)
#define EXYNOS5_IRQ_GSC0 IRQ_SPI(85) #define EXYNOS5_IRQ_GSC0 IRQ_SPI(85)
#define EXYNOS5_IRQ_GSC1 IRQ_SPI(86) #define EXYNOS5_IRQ_GSC1 IRQ_SPI(86)
...@@ -294,8 +295,8 @@ ...@@ -294,8 +295,8 @@
#define EXYNOS5_IRQ_JPEG IRQ_SPI(89) #define EXYNOS5_IRQ_JPEG IRQ_SPI(89)
#define EXYNOS5_IRQ_EFNFCON_DMA IRQ_SPI(90) #define EXYNOS5_IRQ_EFNFCON_DMA IRQ_SPI(90)
#define EXYNOS5_IRQ_2D IRQ_SPI(91) #define EXYNOS5_IRQ_2D IRQ_SPI(91)
#define EXYNOS5_IRQ_SFMC0 IRQ_SPI(92) #define EXYNOS5_IRQ_EFNFCON_0 IRQ_SPI(92)
#define EXYNOS5_IRQ_SFMC1 IRQ_SPI(93) #define EXYNOS5_IRQ_EFNFCON_1 IRQ_SPI(93)
#define EXYNOS5_IRQ_MIXER IRQ_SPI(94) #define EXYNOS5_IRQ_MIXER IRQ_SPI(94)
#define EXYNOS5_IRQ_HDMI IRQ_SPI(95) #define EXYNOS5_IRQ_HDMI IRQ_SPI(95)
#define EXYNOS5_IRQ_MFC IRQ_SPI(96) #define EXYNOS5_IRQ_MFC IRQ_SPI(96)
...@@ -309,7 +310,7 @@ ...@@ -309,7 +310,7 @@
#define EXYNOS5_IRQ_PCM2 IRQ_SPI(104) #define EXYNOS5_IRQ_PCM2 IRQ_SPI(104)
#define EXYNOS5_IRQ_SPDIF IRQ_SPI(105) #define EXYNOS5_IRQ_SPDIF IRQ_SPI(105)
#define EXYNOS5_IRQ_ADC0 IRQ_SPI(106) #define EXYNOS5_IRQ_ADC0 IRQ_SPI(106)
#define EXYNOS5_IRQ_ADC1 IRQ_SPI(107)
#define EXYNOS5_IRQ_SATA_PHY IRQ_SPI(108) #define EXYNOS5_IRQ_SATA_PHY IRQ_SPI(108)
#define EXYNOS5_IRQ_SATA_PMEMREQ IRQ_SPI(109) #define EXYNOS5_IRQ_SATA_PMEMREQ IRQ_SPI(109)
#define EXYNOS5_IRQ_CAM_C IRQ_SPI(110) #define EXYNOS5_IRQ_CAM_C IRQ_SPI(110)
...@@ -318,8 +319,9 @@ ...@@ -318,8 +319,9 @@
#define EXYNOS5_IRQ_DP1_INTP1 IRQ_SPI(113) #define EXYNOS5_IRQ_DP1_INTP1 IRQ_SPI(113)
#define EXYNOS5_IRQ_CEC IRQ_SPI(114) #define EXYNOS5_IRQ_CEC IRQ_SPI(114)
#define EXYNOS5_IRQ_SATA IRQ_SPI(115) #define EXYNOS5_IRQ_SATA IRQ_SPI(115)
#define EXYNOS5_IRQ_NFCON IRQ_SPI(116)
#define EXYNOS5_IRQ_MCT_L0 IRQ_SPI(120)
#define EXYNOS5_IRQ_MCT_L1 IRQ_SPI(121)
#define EXYNOS5_IRQ_MMC44 IRQ_SPI(123) #define EXYNOS5_IRQ_MMC44 IRQ_SPI(123)
#define EXYNOS5_IRQ_MDMA1 IRQ_SPI(124) #define EXYNOS5_IRQ_MDMA1 IRQ_SPI(124)
#define EXYNOS5_IRQ_FIMC_LITE0 IRQ_SPI(125) #define EXYNOS5_IRQ_FIMC_LITE0 IRQ_SPI(125)
...@@ -327,7 +329,6 @@ ...@@ -327,7 +329,6 @@
#define EXYNOS5_IRQ_RP_TIMER IRQ_SPI(127) #define EXYNOS5_IRQ_RP_TIMER IRQ_SPI(127)
#define EXYNOS5_IRQ_PMU COMBINER_IRQ(1, 2) #define EXYNOS5_IRQ_PMU COMBINER_IRQ(1, 2)
#define EXYNOS5_IRQ_PMU_CPU1 COMBINER_IRQ(1, 6)
#define EXYNOS5_IRQ_SYSMMU_GSC0_0 COMBINER_IRQ(2, 0) #define EXYNOS5_IRQ_SYSMMU_GSC0_0 COMBINER_IRQ(2, 0)
#define EXYNOS5_IRQ_SYSMMU_GSC0_1 COMBINER_IRQ(2, 1) #define EXYNOS5_IRQ_SYSMMU_GSC0_1 COMBINER_IRQ(2, 1)
...@@ -338,6 +339,8 @@ ...@@ -338,6 +339,8 @@
#define EXYNOS5_IRQ_SYSMMU_GSC3_0 COMBINER_IRQ(2, 6) #define EXYNOS5_IRQ_SYSMMU_GSC3_0 COMBINER_IRQ(2, 6)
#define EXYNOS5_IRQ_SYSMMU_GSC3_1 COMBINER_IRQ(2, 7) #define EXYNOS5_IRQ_SYSMMU_GSC3_1 COMBINER_IRQ(2, 7)
#define EXYNOS5_IRQ_SYSMMU_LITE2_0 COMBINER_IRQ(3, 0)
#define EXYNOS5_IRQ_SYSMMU_LITE2_1 COMBINER_IRQ(3, 1)
#define EXYNOS5_IRQ_SYSMMU_FIMD1_0 COMBINER_IRQ(3, 2) #define EXYNOS5_IRQ_SYSMMU_FIMD1_0 COMBINER_IRQ(3, 2)
#define EXYNOS5_IRQ_SYSMMU_FIMD1_1 COMBINER_IRQ(3, 3) #define EXYNOS5_IRQ_SYSMMU_FIMD1_1 COMBINER_IRQ(3, 3)
#define EXYNOS5_IRQ_SYSMMU_LITE0_0 COMBINER_IRQ(3, 4) #define EXYNOS5_IRQ_SYSMMU_LITE0_0 COMBINER_IRQ(3, 4)
...@@ -361,8 +364,8 @@ ...@@ -361,8 +364,8 @@
#define EXYNOS5_IRQ_SYSMMU_ARM_0 COMBINER_IRQ(6, 0) #define EXYNOS5_IRQ_SYSMMU_ARM_0 COMBINER_IRQ(6, 0)
#define EXYNOS5_IRQ_SYSMMU_ARM_1 COMBINER_IRQ(6, 1) #define EXYNOS5_IRQ_SYSMMU_ARM_1 COMBINER_IRQ(6, 1)
#define EXYNOS5_IRQ_SYSMMU_MFC_L_0 COMBINER_IRQ(6, 2) #define EXYNOS5_IRQ_SYSMMU_MFC_R_0 COMBINER_IRQ(6, 2)
#define EXYNOS5_IRQ_SYSMMU_MFC_L_1 COMBINER_IRQ(6, 3) #define EXYNOS5_IRQ_SYSMMU_MFC_R_1 COMBINER_IRQ(6, 3)
#define EXYNOS5_IRQ_SYSMMU_RTIC_0 COMBINER_IRQ(6, 4) #define EXYNOS5_IRQ_SYSMMU_RTIC_0 COMBINER_IRQ(6, 4)
#define EXYNOS5_IRQ_SYSMMU_RTIC_1 COMBINER_IRQ(6, 5) #define EXYNOS5_IRQ_SYSMMU_RTIC_1 COMBINER_IRQ(6, 5)
#define EXYNOS5_IRQ_SYSMMU_SSS_0 COMBINER_IRQ(6, 6) #define EXYNOS5_IRQ_SYSMMU_SSS_0 COMBINER_IRQ(6, 6)
...@@ -374,11 +377,9 @@ ...@@ -374,11 +377,9 @@
#define EXYNOS5_IRQ_SYSMMU_MDMA1_1 COMBINER_IRQ(7, 3) #define EXYNOS5_IRQ_SYSMMU_MDMA1_1 COMBINER_IRQ(7, 3)
#define EXYNOS5_IRQ_SYSMMU_TV_0 COMBINER_IRQ(7, 4) #define EXYNOS5_IRQ_SYSMMU_TV_0 COMBINER_IRQ(7, 4)
#define EXYNOS5_IRQ_SYSMMU_TV_1 COMBINER_IRQ(7, 5) #define EXYNOS5_IRQ_SYSMMU_TV_1 COMBINER_IRQ(7, 5)
#define EXYNOS5_IRQ_SYSMMU_GPSX_0 COMBINER_IRQ(7, 6)
#define EXYNOS5_IRQ_SYSMMU_GPSX_1 COMBINER_IRQ(7, 7)
#define EXYNOS5_IRQ_SYSMMU_MFC_R_0 COMBINER_IRQ(8, 5) #define EXYNOS5_IRQ_SYSMMU_MFC_L_0 COMBINER_IRQ(8, 5)
#define EXYNOS5_IRQ_SYSMMU_MFC_R_1 COMBINER_IRQ(8, 6) #define EXYNOS5_IRQ_SYSMMU_MFC_L_1 COMBINER_IRQ(8, 6)
#define EXYNOS5_IRQ_SYSMMU_DIS1_0 COMBINER_IRQ(9, 4) #define EXYNOS5_IRQ_SYSMMU_DIS1_0 COMBINER_IRQ(9, 4)
#define EXYNOS5_IRQ_SYSMMU_DIS1_1 COMBINER_IRQ(9, 5) #define EXYNOS5_IRQ_SYSMMU_DIS1_1 COMBINER_IRQ(9, 5)
...@@ -394,17 +395,24 @@ ...@@ -394,17 +395,24 @@
#define EXYNOS5_IRQ_SYSMMU_DRC_0 COMBINER_IRQ(11, 6) #define EXYNOS5_IRQ_SYSMMU_DRC_0 COMBINER_IRQ(11, 6)
#define EXYNOS5_IRQ_SYSMMU_DRC_1 COMBINER_IRQ(11, 7) #define EXYNOS5_IRQ_SYSMMU_DRC_1 COMBINER_IRQ(11, 7)
#define EXYNOS5_IRQ_MDMA1_ABORT COMBINER_IRQ(13, 1)
#define EXYNOS5_IRQ_MDMA0_ABORT COMBINER_IRQ(15, 3)
#define EXYNOS5_IRQ_FIMD1_FIFO COMBINER_IRQ(18, 4) #define EXYNOS5_IRQ_FIMD1_FIFO COMBINER_IRQ(18, 4)
#define EXYNOS5_IRQ_FIMD1_VSYNC COMBINER_IRQ(18, 5) #define EXYNOS5_IRQ_FIMD1_VSYNC COMBINER_IRQ(18, 5)
#define EXYNOS5_IRQ_FIMD1_SYSTEM COMBINER_IRQ(18, 6) #define EXYNOS5_IRQ_FIMD1_SYSTEM COMBINER_IRQ(18, 6)
#define EXYNOS5_IRQ_ARMIOP_GIC COMBINER_IRQ(19, 0)
#define EXYNOS5_IRQ_ARMISP_GIC COMBINER_IRQ(19, 1)
#define EXYNOS5_IRQ_IOP_GIC COMBINER_IRQ(19, 3)
#define EXYNOS5_IRQ_ISP_GIC COMBINER_IRQ(19, 4)
#define EXYNOS5_IRQ_PMU_CPU1 COMBINER_IRQ(22, 4)
#define EXYNOS5_IRQ_EINT0 COMBINER_IRQ(23, 0) #define EXYNOS5_IRQ_EINT0 COMBINER_IRQ(23, 0)
#define EXYNOS5_IRQ_MCT_L0 COMBINER_IRQ(23, 1)
#define EXYNOS5_IRQ_MCT_L1 COMBINER_IRQ(23, 2)
#define EXYNOS5_IRQ_MCT_G0 COMBINER_IRQ(23, 3) #define EXYNOS5_IRQ_MCT_G0 COMBINER_IRQ(23, 3)
#define EXYNOS5_IRQ_MCT_G1 COMBINER_IRQ(23, 4) #define EXYNOS5_IRQ_MCT_G1 COMBINER_IRQ(23, 4)
#define EXYNOS5_IRQ_MCT_G2 COMBINER_IRQ(23, 5)
#define EXYNOS5_IRQ_MCT_G3 COMBINER_IRQ(23, 6)
#define EXYNOS5_IRQ_EINT1 COMBINER_IRQ(24, 0) #define EXYNOS5_IRQ_EINT1 COMBINER_IRQ(24, 0)
#define EXYNOS5_IRQ_SYSMMU_LITE1_0 COMBINER_IRQ(24, 1) #define EXYNOS5_IRQ_SYSMMU_LITE1_0 COMBINER_IRQ(24, 1)
...@@ -435,7 +443,7 @@ ...@@ -435,7 +443,7 @@
#define EXYNOS5_MAX_COMBINER_NR 32 #define EXYNOS5_MAX_COMBINER_NR 32
#define EXYNOS5_IRQ_GPIO1_NR_GROUPS 13 #define EXYNOS5_IRQ_GPIO1_NR_GROUPS 14
#define EXYNOS5_IRQ_GPIO2_NR_GROUPS 9 #define EXYNOS5_IRQ_GPIO2_NR_GROUPS 9
#define EXYNOS5_IRQ_GPIO3_NR_GROUPS 5 #define EXYNOS5_IRQ_GPIO3_NR_GROUPS 5
#define EXYNOS5_IRQ_GPIO4_NR_GROUPS 1 #define EXYNOS5_IRQ_GPIO4_NR_GROUPS 1
......
...@@ -81,8 +81,8 @@ ...@@ -81,8 +81,8 @@
#define EXYNOS4_PA_GIC_CPU 0x10480000 #define EXYNOS4_PA_GIC_CPU 0x10480000
#define EXYNOS4_PA_GIC_DIST 0x10490000 #define EXYNOS4_PA_GIC_DIST 0x10490000
#define EXYNOS5_PA_GIC_CPU 0x10480000 #define EXYNOS5_PA_GIC_CPU 0x10482000
#define EXYNOS5_PA_GIC_DIST 0x10490000 #define EXYNOS5_PA_GIC_DIST 0x10481000
#define EXYNOS4_PA_COREPERI 0x10500000 #define EXYNOS4_PA_COREPERI 0x10500000
#define EXYNOS4_PA_TWD 0x10500600 #define EXYNOS4_PA_TWD 0x10500600
......
...@@ -322,6 +322,8 @@ ...@@ -322,6 +322,8 @@
#define EXYNOS5_CLKSRC_CDREX EXYNOS_CLKREG(0x20200) #define EXYNOS5_CLKSRC_CDREX EXYNOS_CLKREG(0x20200)
#define EXYNOS5_CLKDIV_CDREX EXYNOS_CLKREG(0x20500) #define EXYNOS5_CLKDIV_CDREX EXYNOS_CLKREG(0x20500)
#define EXYNOS5_PLL_DIV2_SEL EXYNOS_CLKREG(0x20A24)
#define EXYNOS5_EPLL_LOCK EXYNOS_CLKREG(0x10030) #define EXYNOS5_EPLL_LOCK EXYNOS_CLKREG(0x10030)
#define EXYNOS5_EPLLCON0_LOCKED_SHIFT (29) #define EXYNOS5_EPLLCON0_LOCKED_SHIFT (29)
......
...@@ -43,6 +43,10 @@ static const struct of_dev_auxdata exynos5250_auxdata_lookup[] __initconst = { ...@@ -43,6 +43,10 @@ static const struct of_dev_auxdata exynos5250_auxdata_lookup[] __initconst = {
"exynos4210-uart.2", NULL), "exynos4210-uart.2", NULL),
OF_DEV_AUXDATA("samsung,exynos4210-uart", EXYNOS5_PA_UART3, OF_DEV_AUXDATA("samsung,exynos4210-uart", EXYNOS5_PA_UART3,
"exynos4210-uart.3", NULL), "exynos4210-uart.3", NULL),
OF_DEV_AUXDATA("samsung,s3c2440-i2c", EXYNOS5_PA_IIC(0),
"s3c2440-i2c.0", NULL),
OF_DEV_AUXDATA("samsung,s3c2440-i2c", EXYNOS5_PA_IIC(1),
"s3c2440-i2c.1", NULL),
OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_PDMA0, "dma-pl330.0", NULL), OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_PDMA0, "dma-pl330.0", NULL),
OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_PDMA1, "dma-pl330.1", NULL), OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_PDMA1, "dma-pl330.1", NULL),
OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_MDMA1, "dma-pl330.2", NULL), OF_DEV_AUXDATA("arm,pl330", EXYNOS5_PA_MDMA1, "dma-pl330.2", NULL),
......
...@@ -388,6 +388,7 @@ static int __cpuinit exynos4_local_timer_setup(struct clock_event_device *evt) ...@@ -388,6 +388,7 @@ static int __cpuinit exynos4_local_timer_setup(struct clock_event_device *evt)
{ {
struct mct_clock_event_device *mevt; struct mct_clock_event_device *mevt;
unsigned int cpu = smp_processor_id(); unsigned int cpu = smp_processor_id();
int mct_lx_irq;
mevt = this_cpu_ptr(&percpu_mct_tick); mevt = this_cpu_ptr(&percpu_mct_tick);
mevt->evt = evt; mevt->evt = evt;
...@@ -414,14 +415,18 @@ static int __cpuinit exynos4_local_timer_setup(struct clock_event_device *evt) ...@@ -414,14 +415,18 @@ static int __cpuinit exynos4_local_timer_setup(struct clock_event_device *evt)
if (mct_int_type == MCT_INT_SPI) { if (mct_int_type == MCT_INT_SPI) {
if (cpu == 0) { if (cpu == 0) {
mct_lx_irq = soc_is_exynos4210() ? EXYNOS4_IRQ_MCT_L0 :
EXYNOS5_IRQ_MCT_L0;
mct_tick0_event_irq.dev_id = mevt; mct_tick0_event_irq.dev_id = mevt;
evt->irq = EXYNOS4_IRQ_MCT_L0; evt->irq = mct_lx_irq;
setup_irq(EXYNOS4_IRQ_MCT_L0, &mct_tick0_event_irq); setup_irq(mct_lx_irq, &mct_tick0_event_irq);
} else { } else {
mct_lx_irq = soc_is_exynos4210() ? EXYNOS4_IRQ_MCT_L1 :
EXYNOS5_IRQ_MCT_L1;
mct_tick1_event_irq.dev_id = mevt; mct_tick1_event_irq.dev_id = mevt;
evt->irq = EXYNOS4_IRQ_MCT_L1; evt->irq = mct_lx_irq;
setup_irq(EXYNOS4_IRQ_MCT_L1, &mct_tick1_event_irq); setup_irq(mct_lx_irq, &mct_tick1_event_irq);
irq_set_affinity(EXYNOS4_IRQ_MCT_L1, cpumask_of(1)); irq_set_affinity(mct_lx_irq, cpumask_of(1));
} }
} else { } else {
enable_percpu_irq(EXYNOS_IRQ_MCT_LOCALTIMER, 0); enable_percpu_irq(EXYNOS_IRQ_MCT_LOCALTIMER, 0);
...@@ -473,7 +478,7 @@ static void __init exynos4_timer_resources(void) ...@@ -473,7 +478,7 @@ static void __init exynos4_timer_resources(void)
static void __init exynos4_timer_init(void) static void __init exynos4_timer_init(void)
{ {
if (soc_is_exynos4210()) if ((soc_is_exynos4210()) || (soc_is_exynos5250()))
mct_int_type = MCT_INT_SPI; mct_int_type = MCT_INT_SPI;
else else
mct_int_type = MCT_INT_PPI; mct_int_type = MCT_INT_PPI;
......
...@@ -275,7 +275,7 @@ static void exynos4_restore_pll(void) ...@@ -275,7 +275,7 @@ static void exynos4_restore_pll(void)
static struct subsys_interface exynos4_pm_interface = { static struct subsys_interface exynos4_pm_interface = {
.name = "exynos4_pm", .name = "exynos4_pm",
.subsys = &exynos4_subsys, .subsys = &exynos_subsys,
.add_dev = exynos4_pm_add, .add_dev = exynos4_pm_add,
}; };
......
# arch/arm/plat-s5p/Kconfig
#
# Copyright (c) 2009 Samsung Electronics Co., Ltd.
# http://www.samsung.com/
#
# Licensed under GPLv2
config PLAT_S5P
bool
depends on (ARCH_S5P64X0 || ARCH_S5PC100 || ARCH_S5PV210 || ARCH_EXYNOS)
default y
select ARM_VIC if !ARCH_EXYNOS
select ARM_GIC if ARCH_EXYNOS
select GIC_NON_BANKED if ARCH_EXYNOS4
select NO_IOPORT
select ARCH_REQUIRE_GPIOLIB
select S3C_GPIO_TRACK
select S5P_GPIO_DRVSTR
select SAMSUNG_GPIOLIB_4BIT
select PLAT_SAMSUNG
select SAMSUNG_CLKSRC
select SAMSUNG_IRQ_VIC_TIMER
help
Base platform code for Samsung's S5P series SoC.
config S5P_EXT_INT
bool
help
Use the external interrupts (other than GPIO interrupts.)
Note: Do not choose this for S5P6440 and S5P6450.
config S5P_GPIO_INT
bool
help
Common code for the GPIO interrupts (other than external interrupts.)
config S5P_HRT
bool
select SAMSUNG_DEV_PWM
help
Use the High Resolution timer support
config S5P_DEV_UART
def_bool y
depends on (ARCH_S5P64X0 || ARCH_S5PC100 || ARCH_S5PV210)
config S5P_PM
bool
help
Common code for power management support on S5P and newer SoCs
Note: Do not select this for S5P6440 and S5P6450.
config S5P_SLEEP
bool
help
Internal config node to apply common S5P sleep management code.
Can be selected by S5P and newer SoCs with similar sleep procedure.
config S5P_DEV_FIMC0
bool
help
Compile in platform device definitions for FIMC controller 0
config S5P_DEV_FIMC1
bool
help
Compile in platform device definitions for FIMC controller 1
config S5P_DEV_FIMC2
bool
help
Compile in platform device definitions for FIMC controller 2
config S5P_DEV_FIMC3
bool
help
Compile in platform device definitions for FIMC controller 3
config S5P_DEV_JPEG
bool
help
Compile in platform device definitions for JPEG codec
config S5P_DEV_G2D
bool
help
Compile in platform device definitions for G2D device
config S5P_DEV_FIMD0
bool
help
Compile in platform device definitions for FIMD controller 0
config S5P_DEV_I2C_HDMIPHY
bool
help
Compile in platform device definitions for I2C HDMIPHY controller
config S5P_DEV_MFC
bool
help
Compile in platform device definitions for MFC
config S5P_DEV_ONENAND
bool
help
Compile in platform device definition for OneNAND controller
config S5P_DEV_CSIS0
bool
help
Compile in platform device definitions for MIPI-CSIS channel 0
config S5P_DEV_CSIS1
bool
help
Compile in platform device definitions for MIPI-CSIS channel 1
config S5P_DEV_TV
bool
help
Compile in platform device definition for TV interface
config S5P_DEV_USB_EHCI
bool
help
Compile in platform device definition for USB EHCI
config S5P_SETUP_MIPIPHY
bool
help
Compile in common setup code for MIPI-CSIS and MIPI-DSIM devices
# arch/arm/plat-s5p/Makefile
#
# Copyright (c) 2009 Samsung Electronics Co., Ltd.
# http://www.samsung.com/
#
# Licensed under GPLv2
obj-y :=
obj-m :=
obj-n := dummy.o
obj- :=
# Core files
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_PM) += pm.o irq-pm.o
obj-$(CONFIG_S5P_SLEEP) += sleep.o
obj-$(CONFIG_S5P_HRT) += s5p-time.o
# devices
obj-$(CONFIG_S5P_DEV_UART) += dev-uart.o
obj-$(CONFIG_S5P_DEV_MFC) += dev-mfc.o
obj-$(CONFIG_S5P_SETUP_MIPIPHY) += setup-mipiphy.o
...@@ -13,6 +13,24 @@ config PLAT_SAMSUNG ...@@ -13,6 +13,24 @@ config PLAT_SAMSUNG
help help
Base platform code for all Samsung SoC based systems Base platform code for all Samsung SoC based systems
config PLAT_S5P
bool
depends on (ARCH_S5P64X0 || ARCH_S5PC100 || ARCH_S5PV210 || ARCH_EXYNOS)
default y
select ARM_VIC if !ARCH_EXYNOS
select ARM_GIC if ARCH_EXYNOS
select GIC_NON_BANKED if ARCH_EXYNOS4
select NO_IOPORT
select ARCH_REQUIRE_GPIOLIB
select S3C_GPIO_TRACK
select S5P_GPIO_DRVSTR
select SAMSUNG_GPIOLIB_4BIT
select PLAT_SAMSUNG
select SAMSUNG_CLKSRC
select SAMSUNG_IRQ_VIC_TIMER
help
Base platform code for Samsung's S5P series SoC.
if PLAT_SAMSUNG if PLAT_SAMSUNG
# boot configurations # boot configurations
...@@ -50,6 +68,14 @@ config S3C_LOWLEVEL_UART_PORT ...@@ -50,6 +68,14 @@ config S3C_LOWLEVEL_UART_PORT
this configuration should be between zero and two. The port this configuration should be between zero and two. The port
must have been initialised by the boot-loader before use. must have been initialised by the boot-loader before use.
# timer options
config S5P_HRT
bool
select SAMSUNG_DEV_PWM
help
Use the High Resolution timer support
# clock options # clock options
config SAMSUNG_CLKSRC config SAMSUNG_CLKSRC
...@@ -58,6 +84,11 @@ config SAMSUNG_CLKSRC ...@@ -58,6 +84,11 @@ config SAMSUNG_CLKSRC
Select the clock code for the clksrc implementation Select the clock code for the clksrc implementation
used by newer systems such as the S3C64XX. used by newer systems such as the S3C64XX.
config S5P_CLOCK
def_bool (ARCH_S5P64X0 || ARCH_S5PC100 || ARCH_S5PV210 || ARCH_EXYNOS)
help
Support common clock part for ARCH_S5P and ARCH_EXYNOS SoCs
# options for IRQ support # options for IRQ support
config SAMSUNG_IRQ_VIC_TIMER config SAMSUNG_IRQ_VIC_TIMER
...@@ -65,6 +96,22 @@ config SAMSUNG_IRQ_VIC_TIMER ...@@ -65,6 +96,22 @@ config SAMSUNG_IRQ_VIC_TIMER
help help
Internal configuration to build the VIC timer interrupt code. Internal configuration to build the VIC timer interrupt code.
config S5P_IRQ
def_bool (ARCH_S5P64X0 || ARCH_S5PC100 || ARCH_S5PV210 || ARCH_EXYNOS)
help
Support common interrup part for ARCH_S5P and ARCH_EXYNOS SoCs
config S5P_EXT_INT
bool
help
Use the external interrupts (other than GPIO interrupts.)
Note: Do not choose this for S5P6440 and S5P6450.
config S5P_GPIO_INT
bool
help
Common code for the GPIO interrupts (other than external interrupts.)
# options for gpio configuration support # options for gpio configuration support
config SAMSUNG_GPIOLIB_4BIT config SAMSUNG_GPIOLIB_4BIT
...@@ -117,6 +164,12 @@ config S3C_GPIO_TRACK ...@@ -117,6 +164,12 @@ config S3C_GPIO_TRACK
Internal configuration option to enable the s3c specific gpio Internal configuration option to enable the s3c specific gpio
chip tracking if the platform requires it. chip tracking if the platform requires it.
# uart options
config S5P_DEV_UART
def_bool y
depends on (ARCH_S5P64X0 || ARCH_S5PC100 || ARCH_S5PV210)
# ADC driver # ADC driver
config S3C_ADC config S3C_ADC
...@@ -274,6 +327,76 @@ config SAMSUNG_DEV_BACKLIGHT ...@@ -274,6 +327,76 @@ config SAMSUNG_DEV_BACKLIGHT
help help
Compile in platform device definition LCD backlight with PWM Timer Compile in platform device definition LCD backlight with PWM Timer
config S5P_DEV_CSIS0
bool
help
Compile in platform device definitions for MIPI-CSIS channel 0
config S5P_DEV_CSIS1
bool
help
Compile in platform device definitions for MIPI-CSIS channel 1
config S5P_DEV_FIMC0
bool
help
Compile in platform device definitions for FIMC controller 0
config S5P_DEV_FIMC1
bool
help
Compile in platform device definitions for FIMC controller 1
config S5P_DEV_FIMC2
bool
help
Compile in platform device definitions for FIMC controller 2
config S5P_DEV_FIMC3
bool
help
Compile in platform device definitions for FIMC controller 3
config S5P_DEV_FIMD0
bool
help
Compile in platform device definitions for FIMD controller 0
config S5P_DEV_G2D
bool
help
Compile in platform device definitions for G2D device
config S5P_DEV_I2C_HDMIPHY
bool
help
Compile in platform device definitions for I2C HDMIPHY controller
config S5P_DEV_JPEG
bool
help
Compile in platform device definitions for JPEG codec
config S5P_DEV_MFC
bool
help
Compile in setup memory (init) code for MFC
config S5P_DEV_ONENAND
bool
help
Compile in platform device definition for OneNAND controller
config S5P_DEV_TV
bool
help
Compile in platform device definition for TV interface
config S5P_DEV_USB_EHCI
bool
help
Compile in platform device definition for USB EHCI
config S3C24XX_PWM config S3C24XX_PWM
bool "PWM device support" bool "PWM device support"
select HAVE_PWM select HAVE_PWM
...@@ -281,6 +404,11 @@ config S3C24XX_PWM ...@@ -281,6 +404,11 @@ config S3C24XX_PWM
Support for exporting the PWM timer blocks via the pwm device Support for exporting the PWM timer blocks via the pwm device
system system
config S5P_SETUP_MIPIPHY
bool
help
Compile in common setup code for MIPI-CSIS and MIPI-DSIM devices
# DMA # DMA
config S3C_DMA config S3C_DMA
...@@ -351,6 +479,18 @@ config SAMSUNG_WAKEMASK ...@@ -351,6 +479,18 @@ config SAMSUNG_WAKEMASK
and above. This code allows a set of interrupt to wakeup-mask and above. This code allows a set of interrupt to wakeup-mask
mappings. See <plat/wakeup-mask.h> mappings. See <plat/wakeup-mask.h>
config S5P_PM
bool
help
Common code for power management support on S5P and newer SoCs
Note: Do not select this for S5P6440 and S5P6450.
config S5P_SLEEP
bool
help
Internal config node to apply common S5P sleep management code.
Can be selected by S5P and newer SoCs with similar sleep procedure.
comment "Power Domain" comment "Power Domain"
config SAMSUNG_PD config SAMSUNG_PD
......
...@@ -13,12 +13,18 @@ obj- := ...@@ -13,12 +13,18 @@ obj- :=
obj-y += init.o cpu.o obj-y += init.o cpu.o
obj-$(CONFIG_ARCH_USES_GETTIMEOFFSET) += time.o obj-$(CONFIG_ARCH_USES_GETTIMEOFFSET) += time.o
obj-$(CONFIG_S5P_HRT) += s5p-time.o
obj-y += clock.o obj-y += clock.o
obj-y += pwm-clock.o obj-y += pwm-clock.o
obj-$(CONFIG_SAMSUNG_CLKSRC) += clock-clksrc.o obj-$(CONFIG_SAMSUNG_CLKSRC) += clock-clksrc.o
obj-$(CONFIG_S5P_CLOCK) += s5p-clock.o
obj-$(CONFIG_SAMSUNG_IRQ_VIC_TIMER) += irq-vic-timer.o obj-$(CONFIG_SAMSUNG_IRQ_VIC_TIMER) += irq-vic-timer.o
obj-$(CONFIG_S5P_IRQ) += s5p-irq.o
obj-$(CONFIG_S5P_EXT_INT) += s5p-irq-eint.o
obj-$(CONFIG_S5P_GPIO_INT) += s5p-irq-gpioint.o
# ADC # ADC
...@@ -30,9 +36,13 @@ obj-y += platformdata.o ...@@ -30,9 +36,13 @@ obj-y += platformdata.o
obj-y += devs.o obj-y += devs.o
obj-y += dev-uart.o obj-y += dev-uart.o
obj-$(CONFIG_S5P_DEV_MFC) += s5p-dev-mfc.o
obj-$(CONFIG_S5P_DEV_UART) += s5p-dev-uart.o
obj-$(CONFIG_SAMSUNG_DEV_BACKLIGHT) += dev-backlight.o obj-$(CONFIG_SAMSUNG_DEV_BACKLIGHT) += dev-backlight.o
obj-$(CONFIG_S5P_SETUP_MIPIPHY) += setup-mipiphy.o
# DMA support # DMA support
obj-$(CONFIG_S3C_DMA) += dma.o s3c-dma-ops.o obj-$(CONFIG_S3C_DMA) += dma.o s3c-dma-ops.o
...@@ -47,6 +57,9 @@ obj-$(CONFIG_SAMSUNG_PM_CHECK) += pm-check.o ...@@ -47,6 +57,9 @@ obj-$(CONFIG_SAMSUNG_PM_CHECK) += pm-check.o
obj-$(CONFIG_SAMSUNG_WAKEMASK) += wakeup-mask.o obj-$(CONFIG_SAMSUNG_WAKEMASK) += wakeup-mask.o
obj-$(CONFIG_S5P_PM) += s5p-pm.o s5p-irq-pm.o
obj-$(CONFIG_S5P_SLEEP) += s5p-sleep.o
# PD support # PD support
obj-$(CONFIG_SAMSUNG_PD) += pd.o obj-$(CONFIG_SAMSUNG_PD) += pd.o
......
...@@ -202,7 +202,7 @@ extern struct bus_type s3c2443_subsys; ...@@ -202,7 +202,7 @@ extern struct bus_type s3c2443_subsys;
extern struct bus_type s3c6410_subsys; extern struct bus_type s3c6410_subsys;
extern struct bus_type s5p64x0_subsys; extern struct bus_type s5p64x0_subsys;
extern struct bus_type s5pv210_subsys; extern struct bus_type s5pv210_subsys;
extern struct bus_type exynos4_subsys; extern struct bus_type exynos_subsys;
extern void (*s5pc1xx_idle)(void); extern void (*s5pc1xx_idle)(void);
......
...@@ -32,8 +32,10 @@ extern struct clk clk_48m; ...@@ -32,8 +32,10 @@ extern struct clk clk_48m;
extern struct clk s5p_clk_27m; extern struct clk s5p_clk_27m;
extern struct clk clk_fout_apll; extern struct clk clk_fout_apll;
extern struct clk clk_fout_bpll; extern struct clk clk_fout_bpll;
extern struct clk clk_fout_bpll_div2;
extern struct clk clk_fout_cpll; extern struct clk clk_fout_cpll;
extern struct clk clk_fout_mpll; extern struct clk clk_fout_mpll;
extern struct clk clk_fout_mpll_div2;
extern struct clk clk_fout_epll; extern struct clk clk_fout_epll;
extern struct clk clk_fout_dpll; extern struct clk clk_fout_dpll;
extern struct clk clk_fout_vpll; extern struct clk clk_fout_vpll;
...@@ -42,8 +44,10 @@ extern struct clk clk_vpll; ...@@ -42,8 +44,10 @@ extern struct clk clk_vpll;
extern struct clksrc_sources clk_src_apll; extern struct clksrc_sources clk_src_apll;
extern struct clksrc_sources clk_src_bpll; extern struct clksrc_sources clk_src_bpll;
extern struct clksrc_sources clk_src_bpll_fout;
extern struct clksrc_sources clk_src_cpll; extern struct clksrc_sources clk_src_cpll;
extern struct clksrc_sources clk_src_mpll; extern struct clksrc_sources clk_src_mpll;
extern struct clksrc_sources clk_src_mpll_fout;
extern struct clksrc_sources clk_src_epll; extern struct clksrc_sources clk_src_epll;
extern struct clksrc_sources clk_src_dpll; extern struct clksrc_sources clk_src_dpll;
......
/* linux/arch/arm/plat-s5p/clock.c /*
*
* Copyright 2009 Samsung Electronics Co., Ltd. * Copyright 2009 Samsung Electronics Co., Ltd.
* http://www.samsung.com/ * http://www.samsung.com/
* *
...@@ -68,6 +67,11 @@ struct clk clk_fout_bpll = { ...@@ -68,6 +67,11 @@ struct clk clk_fout_bpll = {
.id = -1, .id = -1,
}; };
struct clk clk_fout_bpll_div2 = {
.name = "fout_bpll_div2",
.id = -1,
};
/* CPLL clock output */ /* CPLL clock output */
struct clk clk_fout_cpll = { struct clk clk_fout_cpll = {
...@@ -83,6 +87,11 @@ struct clk clk_fout_mpll = { ...@@ -83,6 +87,11 @@ struct clk clk_fout_mpll = {
.id = -1, .id = -1,
}; };
struct clk clk_fout_mpll_div2 = {
.name = "fout_mpll_div2",
.id = -1,
};
/* EPLL clock output */ /* EPLL clock output */
struct clk clk_fout_epll = { struct clk clk_fout_epll = {
.name = "fout_epll", .name = "fout_epll",
...@@ -126,6 +135,16 @@ struct clksrc_sources clk_src_bpll = { ...@@ -126,6 +135,16 @@ struct clksrc_sources clk_src_bpll = {
.nr_sources = ARRAY_SIZE(clk_src_bpll_list), .nr_sources = ARRAY_SIZE(clk_src_bpll_list),
}; };
static struct clk *clk_src_bpll_fout_list[] = {
[0] = &clk_fout_bpll_div2,
[1] = &clk_fout_bpll,
};
struct clksrc_sources clk_src_bpll_fout = {
.sources = clk_src_bpll_fout_list,
.nr_sources = ARRAY_SIZE(clk_src_bpll_fout_list),
};
/* Possible clock sources for CPLL Mux */ /* Possible clock sources for CPLL Mux */
static struct clk *clk_src_cpll_list[] = { static struct clk *clk_src_cpll_list[] = {
[0] = &clk_fin_cpll, [0] = &clk_fin_cpll,
...@@ -148,6 +167,16 @@ struct clksrc_sources clk_src_mpll = { ...@@ -148,6 +167,16 @@ struct clksrc_sources clk_src_mpll = {
.nr_sources = ARRAY_SIZE(clk_src_mpll_list), .nr_sources = ARRAY_SIZE(clk_src_mpll_list),
}; };
static struct clk *clk_src_mpll_fout_list[] = {
[0] = &clk_fout_mpll_div2,
[1] = &clk_fout_mpll,
};
struct clksrc_sources clk_src_mpll_fout = {
.sources = clk_src_mpll_fout_list,
.nr_sources = ARRAY_SIZE(clk_src_mpll_fout_list),
};
/* Possible clock sources for EPLL Mux */ /* Possible clock sources for EPLL Mux */
static struct clk *clk_src_epll_list[] = { static struct clk *clk_src_epll_list[] = {
[0] = &clk_fin_epll, [0] = &clk_fin_epll,
......
/* linux/arch/arm/plat-s5p/dev-mfc.c /*
*
* Copyright (C) 2010-2011 Samsung Electronics Co.Ltd * Copyright (C) 2010-2011 Samsung Electronics Co.Ltd
* *
* Base S5P MFC resource and device definitions * Base S5P MFC resource and device definitions
...@@ -9,7 +8,6 @@ ...@@ -9,7 +8,6 @@
* published by the Free Software Foundation. * published by the Free Software Foundation.
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
......
/* linux/arch/arm/plat-s5p/dev-uart.c /*
* * Copyright (c) 2009,2012 Samsung Electronics Co., Ltd.
* Copyright (c) 2009 Samsung Electronics Co., Ltd.
* http://www.samsung.com/ * http://www.samsung.com/
* *
* Base S5P UART resource and device definitions * Base S5P UART resource and device definitions
...@@ -14,6 +13,7 @@ ...@@ -14,6 +13,7 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/ioport.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
...@@ -26,86 +26,38 @@ ...@@ -26,86 +26,38 @@
/* Serial port registrations */ /* Serial port registrations */
static struct resource s5p_uart0_resource[] = { static struct resource s5p_uart0_resource[] = {
[0] = { [0] = DEFINE_RES_MEM(S5P_PA_UART0, S5P_SZ_UART),
.start = S5P_PA_UART0, [1] = DEFINE_RES_IRQ(IRQ_UART0),
.end = S5P_PA_UART0 + S5P_SZ_UART - 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = IRQ_UART0,
.end = IRQ_UART0,
.flags = IORESOURCE_IRQ,
},
}; };
static struct resource s5p_uart1_resource[] = { static struct resource s5p_uart1_resource[] = {
[0] = { [0] = DEFINE_RES_MEM(S5P_PA_UART1, S5P_SZ_UART),
.start = S5P_PA_UART1, [1] = DEFINE_RES_IRQ(IRQ_UART1),
.end = S5P_PA_UART1 + S5P_SZ_UART - 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = IRQ_UART1,
.end = IRQ_UART1,
.flags = IORESOURCE_IRQ,
},
}; };
static struct resource s5p_uart2_resource[] = { static struct resource s5p_uart2_resource[] = {
[0] = { [0] = DEFINE_RES_MEM(S5P_PA_UART2, S5P_SZ_UART),
.start = S5P_PA_UART2, [1] = DEFINE_RES_IRQ(IRQ_UART2),
.end = S5P_PA_UART2 + S5P_SZ_UART - 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = IRQ_UART2,
.end = IRQ_UART2,
.flags = IORESOURCE_IRQ,
},
}; };
static struct resource s5p_uart3_resource[] = { static struct resource s5p_uart3_resource[] = {
#if CONFIG_SERIAL_SAMSUNG_UARTS > 3 #if CONFIG_SERIAL_SAMSUNG_UARTS > 3
[0] = { [0] = DEFINE_RES_MEM(S5P_PA_UART3, S5P_SZ_UART),
.start = S5P_PA_UART3, [1] = DEFINE_RES_IRQ(IRQ_UART3),
.end = S5P_PA_UART3 + S5P_SZ_UART - 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = IRQ_UART3,
.end = IRQ_UART3,
.flags = IORESOURCE_IRQ,
},
#endif #endif
}; };
static struct resource s5p_uart4_resource[] = { static struct resource s5p_uart4_resource[] = {
#if CONFIG_SERIAL_SAMSUNG_UARTS > 4 #if CONFIG_SERIAL_SAMSUNG_UARTS > 4
[0] = { [0] = DEFINE_RES_MEM(S5P_PA_UART4, S5P_SZ_UART),
.start = S5P_PA_UART4, [1] = DEFINE_RES_IRQ(IRQ_UART4),
.end = S5P_PA_UART4 + S5P_SZ_UART - 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = IRQ_UART4,
.end = IRQ_UART4,
.flags = IORESOURCE_IRQ,
},
#endif #endif
}; };
static struct resource s5p_uart5_resource[] = { static struct resource s5p_uart5_resource[] = {
#if CONFIG_SERIAL_SAMSUNG_UARTS > 5 #if CONFIG_SERIAL_SAMSUNG_UARTS > 5
[0] = { [0] = DEFINE_RES_MEM(S5P_PA_UART5, S5P_SZ_UART),
.start = S5P_PA_UART5, [1] = DEFINE_RES_IRQ(IRQ_UART5),
.end = S5P_PA_UART5 + S5P_SZ_UART - 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = IRQ_UART5,
.end = IRQ_UART5,
.flags = IORESOURCE_IRQ,
},
#endif #endif
}; };
......
/* linux/arch/arm/plat-s5p/irq-eint.c /*
*
* Copyright (c) 2010 Samsung Electronics Co., Ltd. * Copyright (c) 2010 Samsung Electronics Co., Ltd.
* http://www.samsung.com * http://www.samsung.com
* *
......
/* linux/arch/arm/plat-s5p/irq-gpioint.c /*
*
* Copyright (c) 2010 Samsung Electronics Co., Ltd. * Copyright (c) 2010 Samsung Electronics Co., Ltd.
* Author: Kyungmin Park <kyungmin.park@samsung.com> * Author: Kyungmin Park <kyungmin.park@samsung.com>
* Author: Joonyoung Shim <jy0922.shim@samsung.com> * Author: Joonyoung Shim <jy0922.shim@samsung.com>
......
/* linux/arch/arm/plat-s5p/irq-pm.c /*
*
* Copyright (c) 2010 Samsung Electronics Co., Ltd. * Copyright (c) 2010 Samsung Electronics Co., Ltd.
* http://www.samsung.com * http://www.samsung.com
* *
......
/* arch/arm/plat-s5p/irq.c /*
*
* Copyright (c) 2009 Samsung Electronics Co., Ltd. * Copyright (c) 2009 Samsung Electronics Co., Ltd.
* http://www.samsung.com/ * http://www.samsung.com/
* *
......
/* linux/arch/arm/plat-s5p/pm.c /*
*
* Copyright (c) 2010 Samsung Electronics Co., Ltd. * Copyright (c) 2010 Samsung Electronics Co., Ltd.
* http://www.samsung.com * http://www.samsung.com
* *
......
/* linux/arch/arm/plat-s5p/sleep.S /*
*
* Copyright (c) 2011 Samsung Electronics Co., Ltd. * Copyright (c) 2011 Samsung Electronics Co., Ltd.
* http://www.samsung.com * http://www.samsung.com
* *
......
/* linux/arch/arm/plat-s5p/s5p-time.c /*
*
* Copyright (c) 2011 Samsung Electronics Co., Ltd. * Copyright (c) 2011 Samsung Electronics Co., Ltd.
* http://www.samsung.com/ * http://www.samsung.com/
* *
......
...@@ -2452,6 +2452,12 @@ static struct samsung_gpio_chip exynos5_gpios_1[] = { ...@@ -2452,6 +2452,12 @@ static struct samsung_gpio_chip exynos5_gpios_1[] = {
.ngpio = EXYNOS5_GPIO_C3_NR, .ngpio = EXYNOS5_GPIO_C3_NR,
.label = "GPC3", .label = "GPC3",
}, },
}, {
.chip = {
.base = EXYNOS5_GPC4(0),
.ngpio = EXYNOS5_GPIO_C4_NR,
.label = "GPC4",
},
}, { }, {
.chip = { .chip = {
.base = EXYNOS5_GPD0(0), .base = EXYNOS5_GPD0(0),
...@@ -2878,8 +2884,11 @@ static __init int samsung_gpiolib_init(void) ...@@ -2878,8 +2884,11 @@ static __init int samsung_gpiolib_init(void)
goto err_ioremap1; goto err_ioremap1;
} }
/* need to set base address for gpc4 */
exynos5_gpios_1[11].base = gpio_base1 + 0x2E0;
/* need to set base address for gpx */ /* need to set base address for gpx */
chip = &exynos5_gpios_1[20]; chip = &exynos5_gpios_1[21];
gpx_base = gpio_base1 + 0xC00; gpx_base = gpio_base1 + 0xC00;
for (i = 0; i < 4; i++, chip++, gpx_base += 0x20) for (i = 0; i < 4; i++, chip++, gpx_base += 0x20)
chip->base = gpx_base; chip->base = gpx_base;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment