Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7abec10c authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'next/cleanup3' of git://git.linaro.org/people/arnd/arm-soc

* 'next/cleanup3' of git://git.linaro.org/people/arnd/arm-soc: (79 commits)
  ARM: SAMSUNG: Move fimc plat. device from board files to plat-samsung
  ARM: SAMSUNG: Cleanup resources by using macro
  ARM: SAMSUNG: Cleanup plat-samsung/devs.c and devs.h
  ARM: S5P: To merge devs.c files to one devs.c
  ARM: S3C64XX: To merge devs.c files to one devs.c
  ARM: S3C24XX: To merge s3c24xx devs.c files to one devs.c
  ARM: S5P64X0: Add Power Management support
  ARM: S5P: Make the sleep code common for S5P series SoCs
  ARM: S5P: Make the common S5P PM code conditionally compile
  ARM: SAMSUNG: Move S5P header files to plat-samsung
  ARM: SAMSUNG: Move S3C24XX header files to plat-samsung
  ARM: SAMSUNG: Moving each SoC support header files
  ARM: SAMSUNG: Consolidate plat/pll.h
  ARM: SAMSUNG: Consolidate plat/pwm-clock.h
  ARM: SAMSUNG: Cleanup mach/clkdev.h
  ARM: SAMSUNG: remove sdhci default configuration setup platform helper
  ARM: EXYNOS4: Add FIMC device on SMDKV310 board
  ARM: EXYNOS4: Add header file protection macros
  ARM: EXYNOS4: Add usb ehci device to the SMDKV310
  ARM: S3C2443: Add hsspi-clock from pclk and rename S3C2443 hsspi sclk
  ...

Fix up conflicts in
 - arch/arm/mach-exynos4/{Kconfig,clock.c}
	ARM_CPU_SUSPEND, various random device tables (gah!)
 - drivers/gpio/Makefile
	sa1100 gpio added, samsung gpio drivers merged
parents 0de9adf2 cfaf8fc5
Loading
Loading
Loading
Loading
+1 −4
Original line number Diff line number Diff line
@@ -777,9 +777,6 @@ config ARCH_S3C64XX
	select SAMSUNG_CLKSRC
	select SAMSUNG_IRQ_VIC_TIMER
	select S3C_GPIO_TRACK
	select S3C_GPIO_PULL_UPDOWN
	select S3C_GPIO_CFG_S3C24XX
	select S3C_GPIO_CFG_S3C64XX
	select S3C_DEV_NAND
	select USB_ARCH_HAS_OHCI
	select SAMSUNG_GPIOLIB_4BIT
@@ -2212,7 +2209,7 @@ menu "Power management options"
source "kernel/power/Kconfig"

config ARCH_SUSPEND_POSSIBLE
	depends on !ARCH_S5P64X0 && !ARCH_S5PC100
	depends on !ARCH_S5PC100
	depends on CPU_ARM920T || CPU_ARM926T || CPU_SA1100 || \
		CPU_V6 || CPU_V6K || CPU_V7 || CPU_XSC3 || CPU_XSCALE
	def_bool y
+38 −0
Original line number Diff line number Diff line
@@ -13,11 +13,16 @@ config CPU_EXYNOS4210
	bool
	select SAMSUNG_DMADEV
	select ARM_CPU_SUSPEND if PM
	select S5P_PM if PM
	select S5P_SLEEP if PM
	help
	  Enable EXYNOS4210 CPU support

config SOC_EXYNOS4212
	bool
	select ARM_CPU_SUSPEND if PM
	select S5P_PM if PM
	select S5P_SLEEP if PM
	help
	  Enable EXYNOS4212 SoC support

@@ -137,6 +142,14 @@ config MACH_SMDKV310
	select S3C_DEV_RTC
	select S3C_DEV_WDT
	select S3C_DEV_I2C1
	select S5P_DEV_FIMC0
	select S5P_DEV_FIMC1
	select S5P_DEV_FIMC2
	select S5P_DEV_FIMC3
	select S5P_DEV_I2C_HDMIPHY
	select S5P_DEV_MFC
	select S5P_DEV_TV
	select S5P_DEV_USB_EHCI
	select S3C_DEV_HSMMC
	select S3C_DEV_HSMMC1
	select S3C_DEV_HSMMC2
@@ -151,6 +164,7 @@ config MACH_SMDKV310
	select EXYNOS4_SETUP_I2C1
	select EXYNOS4_SETUP_KEYPAD
	select EXYNOS4_SETUP_SDHCI
	select EXYNOS4_SETUP_USB_PHY
	help
	  Machine support for Samsung SMDKV310

@@ -176,19 +190,26 @@ config MACH_UNIVERSAL_C210
	select S5P_DEV_FIMC1
	select S5P_DEV_FIMC2
	select S5P_DEV_FIMC3
	select S5P_DEV_CSIS0
	select S5P_DEV_FIMD0
	select S3C_DEV_HSMMC
	select S3C_DEV_HSMMC2
	select S3C_DEV_HSMMC3
	select S3C_DEV_I2C1
	select S3C_DEV_I2C3
	select S3C_DEV_I2C5
	select S5P_DEV_I2C_HDMIPHY
	select S5P_DEV_MFC
	select S5P_DEV_ONENAND
	select S5P_DEV_TV
	select EXYNOS4_DEV_PD
	select EXYNOS4_SETUP_FIMD0
	select EXYNOS4_SETUP_I2C1
	select EXYNOS4_SETUP_I2C3
	select EXYNOS4_SETUP_I2C5
	select EXYNOS4_SETUP_SDHCI
	select EXYNOS4_SETUP_FIMC
	select S5P_SETUP_MIPIPHY
	help
	  Machine support for Samsung Mobile Universal S5PC210 Reference
	  Board.
@@ -197,6 +218,8 @@ config MACH_NURI
	bool "Mobile NURI Board"
	select CPU_EXYNOS4210
	select S3C_DEV_WDT
	select S3C_DEV_RTC
	select S5P_DEV_FIMD0
	select S3C_DEV_HSMMC
	select S3C_DEV_HSMMC2
	select S3C_DEV_HSMMC3
@@ -206,6 +229,7 @@ config MACH_NURI
	select S5P_DEV_MFC
	select S5P_DEV_USB_EHCI
	select EXYNOS4_DEV_PD
	select EXYNOS4_SETUP_FIMD0
	select EXYNOS4_SETUP_I2C1
	select EXYNOS4_SETUP_I2C3
	select EXYNOS4_SETUP_I2C5
@@ -221,8 +245,22 @@ config MACH_ORIGEN
	select CPU_EXYNOS4210
	select S3C_DEV_RTC
	select S3C_DEV_WDT
	select S3C_DEV_HSMMC
	select S3C_DEV_HSMMC2
	select S5P_DEV_FIMC0
	select S5P_DEV_FIMC1
	select S5P_DEV_FIMC2
	select S5P_DEV_FIMC3
	select S5P_DEV_FIMD0
	select S5P_DEV_I2C_HDMIPHY
	select S5P_DEV_TV
	select S5P_DEV_USB_EHCI
	select EXYNOS4_DEV_PD
	select SAMSUNG_DEV_BACKLIGHT
	select SAMSUNG_DEV_PWM
	select EXYNOS4_SETUP_FIMD0
	select EXYNOS4_SETUP_SDHCI
	select EXYNOS4_SETUP_USB_PHY
	help
	  Machine support for ORIGEN based on Samsung EXYNOS4210

+1 −1
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@ obj-$(CONFIG_ARCH_EXYNOS4) += cpu.o init.o clock.o irq-combiner.o
obj-$(CONFIG_ARCH_EXYNOS4)	+= setup-i2c0.o irq-eint.o dma.o pmu.o
obj-$(CONFIG_CPU_EXYNOS4210)	+= clock-exynos4210.o
obj-$(CONFIG_SOC_EXYNOS4212)	+= clock-exynos4212.o
obj-$(CONFIG_PM)		+= pm.o sleep.o
obj-$(CONFIG_PM)		+= pm.o
obj-$(CONFIG_CPU_IDLE)		+= cpuidle.o

obj-$(CONFIG_SMP)		+= platsmp.o headsmp.o
+201 −3
Original line number Diff line number Diff line
@@ -151,6 +151,11 @@ static int exynos4_clk_ip_mfc_ctrl(struct clk *clk, int enable)
	return s5p_gatectrl(S5P_CLKGATE_IP_MFC, clk, enable);
}

static int exynos4_clksrc_mask_tv_ctrl(struct clk *clk, int enable)
{
	return s5p_gatectrl(S5P_CLKSRC_MASK_TV, clk, enable);
}

static int exynos4_clk_ip_cam_ctrl(struct clk *clk, int enable)
{
	return s5p_gatectrl(S5P_CLKGATE_IP_CAM, clk, enable);
@@ -191,6 +196,16 @@ static int exynos4_clk_ip_perir_ctrl(struct clk *clk, int enable)
	return s5p_gatectrl(S5P_CLKGATE_IP_PERIR, clk, enable);
}

static int exynos4_clk_hdmiphy_ctrl(struct clk *clk, int enable)
{
	return s5p_gatectrl(S5P_HDMI_PHY_CONTROL, clk, enable);
}

static int exynos4_clk_dac_ctrl(struct clk *clk, int enable)
{
	return s5p_gatectrl(S5P_DAC_PHY_CONTROL, clk, enable);
}

/* Core list of CMU_CPU side */

static struct clksrc_clk clk_mout_apll = {
@@ -507,14 +522,44 @@ static struct clk init_clocks_off[] = {
		.parent		= &clk_aclk_133.clk,
		.enable		= exynos4_clk_ip_fsys_ctrl,
		.ctrlbit	= (1 << 9),
	}, {
		.name		= "dac",
		.devname	= "s5p-sdo",
		.enable		= exynos4_clk_ip_tv_ctrl,
		.ctrlbit	= (1 << 2),
	}, {
		.name		= "mixer",
		.devname	= "s5p-mixer",
		.enable		= exynos4_clk_ip_tv_ctrl,
		.ctrlbit	= (1 << 1),
	}, {
		.name		= "vp",
		.devname	= "s5p-mixer",
		.enable		= exynos4_clk_ip_tv_ctrl,
		.ctrlbit	= (1 << 0),
	}, {
		.name		= "hdmi",
		.devname	= "exynos4-hdmi",
		.enable		= exynos4_clk_ip_tv_ctrl,
		.ctrlbit	= (1 << 3),
	}, {
		.name		= "hdmiphy",
		.devname	= "exynos4-hdmi",
		.enable		= exynos4_clk_hdmiphy_ctrl,
		.ctrlbit	= (1 << 0),
	}, {
		.name		= "dacphy",
		.devname	= "s5p-sdo",
		.enable		= exynos4_clk_dac_ctrl,
		.ctrlbit	= (1 << 0),
	}, {
		.name		= "dma",
		.devname	= "s3c-pl330.0",
		.devname	= "dma-pl330.0",
		.enable		= exynos4_clk_ip_fsys_ctrl,
		.ctrlbit	= (1 << 0),
	}, {
		.name		= "dma",
		.devname	= "s3c-pl330.1",
		.devname	= "dma-pl330.1",
		.enable		= exynos4_clk_ip_fsys_ctrl,
		.ctrlbit	= (1 << 1),
	}, {
@@ -634,6 +679,12 @@ static struct clk init_clocks_off[] = {
		.parent		= &clk_aclk_100.clk,
		.enable		= exynos4_clk_ip_peril_ctrl,
		.ctrlbit	= (1 << 13),
	}, {
		.name		= "i2c",
		.devname	= "s3c2440-hdmiphy-i2c",
		.parent		= &clk_aclk_100.clk,
		.enable		= exynos4_clk_ip_peril_ctrl,
		.ctrlbit	= (1 << 14),
	}, {
		.name		= "SYSMMU_MDMA",
		.enable		= exynos4_clk_ip_image_ctrl,
@@ -836,6 +887,81 @@ static struct clksrc_sources clkset_mout_mfc = {
	.nr_sources	= ARRAY_SIZE(clkset_mout_mfc_list),
};

static struct clk *clkset_sclk_dac_list[] = {
	[0] = &clk_sclk_vpll.clk,
	[1] = &clk_sclk_hdmiphy,
};

static struct clksrc_sources clkset_sclk_dac = {
	.sources	= clkset_sclk_dac_list,
	.nr_sources	= ARRAY_SIZE(clkset_sclk_dac_list),
};

static struct clksrc_clk clk_sclk_dac = {
	.clk		= {
		.name		= "sclk_dac",
		.enable		= exynos4_clksrc_mask_tv_ctrl,
		.ctrlbit	= (1 << 8),
	},
	.sources = &clkset_sclk_dac,
	.reg_src = { .reg = S5P_CLKSRC_TV, .shift = 8, .size = 1 },
};

static struct clksrc_clk clk_sclk_pixel = {
	.clk		= {
		.name		= "sclk_pixel",
		.parent = &clk_sclk_vpll.clk,
	},
	.reg_div = { .reg = S5P_CLKDIV_TV, .shift = 0, .size = 4 },
};

static struct clk *clkset_sclk_hdmi_list[] = {
	[0] = &clk_sclk_pixel.clk,
	[1] = &clk_sclk_hdmiphy,
};

static struct clksrc_sources clkset_sclk_hdmi = {
	.sources	= clkset_sclk_hdmi_list,
	.nr_sources	= ARRAY_SIZE(clkset_sclk_hdmi_list),
};

static struct clksrc_clk clk_sclk_hdmi = {
	.clk		= {
		.name		= "sclk_hdmi",
		.enable		= exynos4_clksrc_mask_tv_ctrl,
		.ctrlbit	= (1 << 0),
	},
	.sources = &clkset_sclk_hdmi,
	.reg_src = { .reg = S5P_CLKSRC_TV, .shift = 0, .size = 1 },
};

static struct clk *clkset_sclk_mixer_list[] = {
	[0] = &clk_sclk_dac.clk,
	[1] = &clk_sclk_hdmi.clk,
};

static struct clksrc_sources clkset_sclk_mixer = {
	.sources	= clkset_sclk_mixer_list,
	.nr_sources	= ARRAY_SIZE(clkset_sclk_mixer_list),
};

static struct clksrc_clk clk_sclk_mixer = {
	.clk		= {
		.name		= "sclk_mixer",
		.enable		= exynos4_clksrc_mask_tv_ctrl,
		.ctrlbit	= (1 << 4),
	},
	.sources = &clkset_sclk_mixer,
	.reg_src = { .reg = S5P_CLKSRC_TV, .shift = 4, .size = 1 },
};

static struct clksrc_clk *sclk_tv[] = {
	&clk_sclk_dac,
	&clk_sclk_pixel,
	&clk_sclk_hdmi,
	&clk_sclk_mixer,
};

static struct clksrc_clk clk_dout_mmc0 = {
	.clk		= {
		.name		= "dout_mmc0",
@@ -1162,6 +1288,71 @@ static struct clk_ops exynos4_fout_apll_ops = {
	.get_rate = exynos4_fout_apll_get_rate,
};

static u32 vpll_div[][8] = {
	{  54000000, 3, 53, 3, 1024, 0, 17, 0 },
	{ 108000000, 3, 53, 2, 1024, 0, 17, 0 },
};

static unsigned long exynos4_vpll_get_rate(struct clk *clk)
{
	return clk->rate;
}

static int exynos4_vpll_set_rate(struct clk *clk, unsigned long rate)
{
	unsigned int vpll_con0, vpll_con1 = 0;
	unsigned int i;

	/* Return if nothing changed */
	if (clk->rate == rate)
		return 0;

	vpll_con0 = __raw_readl(S5P_VPLL_CON0);
	vpll_con0 &= ~(0x1 << 27 |					\
			PLL90XX_MDIV_MASK << PLL46XX_MDIV_SHIFT |	\
			PLL90XX_PDIV_MASK << PLL46XX_PDIV_SHIFT |	\
			PLL90XX_SDIV_MASK << PLL46XX_SDIV_SHIFT);

	vpll_con1 = __raw_readl(S5P_VPLL_CON1);
	vpll_con1 &= ~(PLL46XX_MRR_MASK << PLL46XX_MRR_SHIFT |	\
			PLL46XX_MFR_MASK << PLL46XX_MFR_SHIFT |	\
			PLL4650C_KDIV_MASK << PLL46XX_KDIV_SHIFT);

	for (i = 0; i < ARRAY_SIZE(vpll_div); i++) {
		if (vpll_div[i][0] == rate) {
			vpll_con0 |= vpll_div[i][1] << PLL46XX_PDIV_SHIFT;
			vpll_con0 |= vpll_div[i][2] << PLL46XX_MDIV_SHIFT;
			vpll_con0 |= vpll_div[i][3] << PLL46XX_SDIV_SHIFT;
			vpll_con1 |= vpll_div[i][4] << PLL46XX_KDIV_SHIFT;
			vpll_con1 |= vpll_div[i][5] << PLL46XX_MFR_SHIFT;
			vpll_con1 |= vpll_div[i][6] << PLL46XX_MRR_SHIFT;
			vpll_con0 |= vpll_div[i][7] << 27;
			break;
		}
	}

	if (i == ARRAY_SIZE(vpll_div)) {
		printk(KERN_ERR "%s: Invalid Clock VPLL Frequency\n",
				__func__);
		return -EINVAL;
	}

	__raw_writel(vpll_con0, S5P_VPLL_CON0);
	__raw_writel(vpll_con1, S5P_VPLL_CON1);

	/* Wait for VPLL lock */
	while (!(__raw_readl(S5P_VPLL_CON0) & (1 << PLL46XX_LOCKED_SHIFT)))
		continue;

	clk->rate = rate;
	return 0;
}

static struct clk_ops exynos4_vpll_ops = {
	.get_rate = exynos4_vpll_get_rate,
	.set_rate = exynos4_vpll_set_rate,
};

void __init_or_cpufreq exynos4_setup_clocks(void)
{
	struct clk *xtal_clk;
@@ -1219,6 +1410,7 @@ void __init_or_cpufreq exynos4_setup_clocks(void)
	clk_fout_apll.ops = &exynos4_fout_apll_ops;
	clk_fout_mpll.rate = mpll;
	clk_fout_epll.rate = epll;
	clk_fout_vpll.ops = &exynos4_vpll_ops;
	clk_fout_vpll.rate = vpll;

	printk(KERN_INFO "EXYNOS4: PLL settings, A=%ld, M=%ld, E=%ld V=%ld",
@@ -1246,7 +1438,10 @@ void __init_or_cpufreq exynos4_setup_clocks(void)
}

static struct clk *clks[] __initdata = {
	/* Nothing here yet */
	&clk_sclk_hdmi27m,
	&clk_sclk_hdmiphy,
	&clk_sclk_usbphy0,
	&clk_sclk_usbphy1,
};

#ifdef CONFIG_PM_SLEEP
@@ -1280,6 +1475,9 @@ void __init exynos4_register_clocks(void)
	for (ptr = 0; ptr < ARRAY_SIZE(sysclks); ptr++)
		s3c_register_clksrc(sysclks[ptr], 1);

	for (ptr = 0; ptr < ARRAY_SIZE(sclk_tv); ptr++)
		s3c_register_clksrc(sclk_tv[ptr], 1);

	s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs));
	s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks));

+2 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
#include <plat/fimc-core.h>
#include <plat/iic-core.h>
#include <plat/reset.h>
#include <plat/tv-core.h>

#include <mach/regs-irq.h>
#include <mach/regs-pmu.h>
@@ -182,6 +183,7 @@ void __init exynos4_map_io(void)
	s3c_i2c2_setname("s3c2440-i2c");

	s5p_fb_setname(0, "exynos4-fb");
	s5p_hdmi_setname("exynos4-hdmi");
}

void __init exynos4_init_clocks(int xtal)
Loading