diff options
Diffstat (limited to 'arch/arm/plat-s3c')
24 files changed, 541 insertions, 52 deletions
diff --git a/arch/arm/plat-s3c/Kconfig b/arch/arm/plat-s3c/Kconfig index 8931c5f0e46..e139a72c214 100644 --- a/arch/arm/plat-s3c/Kconfig +++ b/arch/arm/plat-s3c/Kconfig @@ -159,6 +159,12 @@ config S3C_GPIO_CFG_S3C64XX  	  Internal configuration to enable S3C64XX style GPIO configuration  	  functions. +config S5P_GPIO_CFG_S5PC1XX +	bool +	help +	  Internal configuration to enable S5PC1XX style GPIO configuration +	  functions. +  # DMA  config S3C_DMA @@ -178,6 +184,11 @@ config S3C_DEV_HSMMC1  	help  	  Compile in platform device definitions for HSMMC channel 1 +config S3C_DEV_HSMMC2 +	bool +	help +	  Compile in platform device definitions for HSMMC channel 2 +  config S3C_DEV_I2C1  	bool  	help diff --git a/arch/arm/plat-s3c/Makefile b/arch/arm/plat-s3c/Makefile index 3c09109e9e8..50444da9842 100644 --- a/arch/arm/plat-s3c/Makefile +++ b/arch/arm/plat-s3c/Makefile @@ -36,6 +36,7 @@ obj-$(CONFIG_HAVE_PWM)		+= pwm.o  obj-$(CONFIG_S3C_DEV_HSMMC)	+= dev-hsmmc.o  obj-$(CONFIG_S3C_DEV_HSMMC1)	+= dev-hsmmc1.o +obj-$(CONFIG_S3C_DEV_HSMMC2)	+= dev-hsmmc2.o  obj-y				+= dev-i2c0.o  obj-$(CONFIG_S3C_DEV_I2C1)	+= dev-i2c1.o  obj-$(CONFIG_S3C_DEV_FB)	+= dev-fb.o diff --git a/arch/arm/plat-s3c/clock.c b/arch/arm/plat-s3c/clock.c index 4d01ef1a25d..619cfa82dca 100644 --- a/arch/arm/plat-s3c/clock.c +++ b/arch/arm/plat-s3c/clock.c @@ -1,6 +1,6 @@  /* linux/arch/arm/plat-s3c24xx/clock.c   * - * Copyright (c) 2004-2005 Simtec Electronics + * Copyright 2004-2005 Simtec Electronics   *	Ben Dooks <ben@simtec.co.uk>   *   * S3C24XX Core clock control support @@ -337,7 +337,7 @@ int s3c24xx_register_clocks(struct clk **clks, int nr_clks)  int __init s3c24xx_register_baseclocks(unsigned long xtal)  { -	printk(KERN_INFO "S3C24XX Clocks, (c) 2004 Simtec Electronics\n"); +	printk(KERN_INFO "S3C24XX Clocks, Copyright 2004 Simtec Electronics\n");  	clk_xtal.rate = xtal; diff --git a/arch/arm/plat-s3c/dev-hsmmc2.c b/arch/arm/plat-s3c/dev-hsmmc2.c new file mode 100644 index 00000000000..824580bc0e0 --- /dev/null +++ b/arch/arm/plat-s3c/dev-hsmmc2.c @@ -0,0 +1,69 @@ +/* linux/arch/arm/plat-s3c/dev-hsmmc2.c + * + * Copyright (c) 2009 Samsung Electronics + * Copyright (c) 2009 Maurus Cuelenaere + * + * Based on arch/arm/plat-s3c/dev-hsmmc1.c + * original file Copyright (c) 2008 Simtec Electronics + * + * S3C series device definition for hsmmc device 2 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. +*/ + +#include <linux/kernel.h> +#include <linux/platform_device.h> +#include <linux/mmc/host.h> + +#include <mach/map.h> +#include <plat/sdhci.h> +#include <plat/devs.h> + +#define S3C_SZ_HSMMC	(0x1000) + +static struct resource s3c_hsmmc2_resource[] = { +	[0] = { +		.start = S3C_PA_HSMMC2, +		.end   = S3C_PA_HSMMC2 + S3C_SZ_HSMMC - 1, +		.flags = IORESOURCE_MEM, +	}, +	[1] = { +		.start = IRQ_HSMMC2, +		.end   = IRQ_HSMMC2, +		.flags = IORESOURCE_IRQ, +	} +}; + +static u64 s3c_device_hsmmc2_dmamask = 0xffffffffUL; + +struct s3c_sdhci_platdata s3c_hsmmc2_def_platdata = { +	.max_width	= 4, +	.host_caps	= (MMC_CAP_4_BIT_DATA | +			   MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED), +}; + +struct platform_device s3c_device_hsmmc2 = { +	.name		= "s3c-sdhci", +	.id		= 2, +	.num_resources	= ARRAY_SIZE(s3c_hsmmc2_resource), +	.resource	= s3c_hsmmc2_resource, +	.dev		= { +		.dma_mask		= &s3c_device_hsmmc2_dmamask, +		.coherent_dma_mask	= 0xffffffffUL, +		.platform_data		= &s3c_hsmmc2_def_platdata, +	}, +}; + +void s3c_sdhci2_set_platdata(struct s3c_sdhci_platdata *pd) +{ +	struct s3c_sdhci_platdata *set = &s3c_hsmmc2_def_platdata; + +	set->max_width = pd->max_width; + +	if (pd->cfg_gpio) +		set->cfg_gpio = pd->cfg_gpio; +	if (pd->cfg_card) +		set->cfg_card = pd->cfg_card; +} diff --git a/arch/arm/plat-s3c/dev-i2c0.c b/arch/arm/plat-s3c/dev-i2c0.c index 428372868fb..4c761529b94 100644 --- a/arch/arm/plat-s3c/dev-i2c0.c +++ b/arch/arm/plat-s3c/dev-i2c0.c @@ -1,6 +1,6 @@  /* linux/arch/arm/plat-s3c/dev-i2c0.c   * - * Copyright 2008,2009 Simtec Electronics + * Copyright 2008-2009 Simtec Electronics   *	Ben Dooks <ben@simtec.co.uk>   *	http://armlinux.simtec.co.uk/   * diff --git a/arch/arm/plat-s3c/dev-i2c1.c b/arch/arm/plat-s3c/dev-i2c1.c index 8349c462788..d44f7911050 100644 --- a/arch/arm/plat-s3c/dev-i2c1.c +++ b/arch/arm/plat-s3c/dev-i2c1.c @@ -1,6 +1,6 @@  /* linux/arch/arm/plat-s3c/dev-i2c1.c   * - * Copyright 2008,2009 Simtec Electronics + * Copyright 2008-2009 Simtec Electronics   *	Ben Dooks <ben@simtec.co.uk>   *	http://armlinux.simtec.co.uk/   * diff --git a/arch/arm/plat-s3c/dev-nand.c b/arch/arm/plat-s3c/dev-nand.c index 4e532373243..e771e77dcd5 100644 --- a/arch/arm/plat-s3c/dev-nand.c +++ b/arch/arm/plat-s3c/dev-nand.c @@ -9,8 +9,12 @@  #include <linux/kernel.h>  #include <linux/platform_device.h> +#include <linux/mtd/mtd.h> +#include <linux/mtd/partitions.h> +  #include <mach/map.h>  #include <plat/devs.h> +#include <plat/nand.h>  static struct resource s3c_nand_resource[] = {  	[0] = { @@ -28,3 +32,96 @@ struct platform_device s3c_device_nand = {  };  EXPORT_SYMBOL(s3c_device_nand); + +/** + * s3c_nand_copy_set() - copy nand set data + * @set: The new structure, directly copied from the old. + * + * Copy all the fields from the NAND set field from what is probably __initdata + * to new kernel memory. The code returns 0 if the copy happened correctly or + * an error code for the calling function to display. + * + * Note, we currently do not try and look to see if we've already copied the + * data in a previous set. + */ +static int __init s3c_nand_copy_set(struct s3c2410_nand_set *set) +{ +	void *ptr; +	int size; + +	size = sizeof(struct mtd_partition) * set->nr_partitions; +	if (size) { +		ptr = kmemdup(set->partitions, size, GFP_KERNEL); +		set->partitions = ptr; + +		if (!ptr) +			return -ENOMEM; +	} +	 +	size = sizeof(int) * set->nr_chips; +	if (size) { +		ptr = kmemdup(set->nr_map, size, GFP_KERNEL); +		set->nr_map = ptr; + +		if (!ptr) +			return -ENOMEM; +	} + +	if (set->ecc_layout) { +		ptr = kmemdup(set->ecc_layout, +			      sizeof(struct nand_ecclayout), GFP_KERNEL); +		set->ecc_layout = ptr; + +		if (!ptr) +			return -ENOMEM; +	} +	 +	return 0; +} + +void __init s3c_nand_set_platdata(struct s3c2410_platform_nand *nand) +{ +	struct s3c2410_platform_nand *npd; +	int size; +	int ret; + +	/* note, if we get a failure in allocation, we simply drop out of the +	 * function. If there is so little memory available at initialisation +	 * time then there is little chance the system is going to run. +	 */  + +	npd = kmemdup(nand, sizeof(struct s3c2410_platform_nand), GFP_KERNEL); +	if (!npd) { +		printk(KERN_ERR "%s: failed copying platform data\n", __func__); +		return; +	} + +	/* now see if we need to copy any of the nand set data */ + +	size = sizeof(struct s3c2410_nand_set) * npd->nr_sets; +	if (size) { +		struct s3c2410_nand_set *from = npd->sets; +		struct s3c2410_nand_set *to; +		int i; + +		to = kmemdup(from, size, GFP_KERNEL); +		npd->sets = to;	/* set, even if we failed */ + +		if (!to) { +			printk(KERN_ERR "%s: no memory for sets\n", __func__); +			return; +		} +		 +		for (i = 0; i < npd->nr_sets; i++) { +			ret = s3c_nand_copy_set(to); +			if (!ret) { +				printk(KERN_ERR "%s: failed to copy set %d\n", +				__func__, i); +				return; +			} +			to++; +		} +	} +} + +EXPORT_SYMBOL_GPL(s3c_nand_set_platdata); diff --git a/arch/arm/plat-s3c/dma.c b/arch/arm/plat-s3c/dma.c index c9db75c06af..a995850cd9d 100644 --- a/arch/arm/plat-s3c/dma.c +++ b/arch/arm/plat-s3c/dma.c @@ -1,6 +1,6 @@  /* linux/arch/arm/plat-s3c/dma.c   * - * Copyright (c) 2003-2005,2006,2009 Simtec Electronics + * Copyright (c) 2003-2009 Simtec Electronics   *	Ben Dooks <ben@simtec.co.uk>   *	http://armlinux.simtec.co.uk/   * diff --git a/arch/arm/plat-s3c/include/plat/audio-simtec.h b/arch/arm/plat-s3c/include/plat/audio-simtec.h index 0f440b9168d..53a93656d5d 100644 --- a/arch/arm/plat-s3c/include/plat/audio-simtec.h +++ b/arch/arm/plat-s3c/include/plat/audio-simtec.h @@ -33,5 +33,5 @@ struct s3c24xx_audio_simtec_pdata {  	void	(*startup)(void);  }; -extern int simtec_audio_add(const char *codec_name, +extern int simtec_audio_add(const char *codec_name, bool has_lr_routing,  			    struct s3c24xx_audio_simtec_pdata *pdata); diff --git a/arch/arm/plat-s3c/include/plat/audio.h b/arch/arm/plat-s3c/include/plat/audio.h index de0e8da48bc..f22d23bb627 100644 --- a/arch/arm/plat-s3c/include/plat/audio.h +++ b/arch/arm/plat-s3c/include/plat/audio.h @@ -1,45 +1,17 @@ -/* arch/arm/mach-s3c2410/include/mach/audio.h +/* arch/arm/plat-s3c/include/plat/audio.h   * - * Copyright (c) 2004-2005 Simtec Electronics - *	http://www.simtec.co.uk/products/SWLINUX/ - *	Ben Dooks <ben@simtec.co.uk> - * - * S3C24XX - Audio platfrom_device info + * Copyright (c) 2009 Samsung Electronics Co. Ltd + * Author: Jaswinder Singh <jassi.brar@samsung.com>   *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation. -*/ - -#ifndef __ASM_ARCH_AUDIO_H -#define __ASM_ARCH_AUDIO_H __FILE__ - -/* struct s3c24xx_iis_ops - * - * called from the s3c24xx audio core to deal with the architecture - * or the codec's setup and control. - * - * the pointer to itself is passed through in case the caller wants to - * embed this in an larger structure for easy reference to it's context. -*/ + */ -struct s3c24xx_iis_ops { -	struct module *owner; - -	int	(*startup)(struct s3c24xx_iis_ops *me); -	void	(*shutdown)(struct s3c24xx_iis_ops *me); -	int	(*suspend)(struct s3c24xx_iis_ops *me); -	int	(*resume)(struct s3c24xx_iis_ops *me); - -	int	(*open)(struct s3c24xx_iis_ops *me, struct snd_pcm_substream *strm); -	int	(*close)(struct s3c24xx_iis_ops *me, struct snd_pcm_substream *strm); -	int	(*prepare)(struct s3c24xx_iis_ops *me, struct snd_pcm_substream *strm, struct snd_pcm_runtime *rt); +/** + * struct s3c_audio_pdata - common platform data for audio device drivers + * @cfg_gpio: Callback function to setup mux'ed pins in I2S/PCM/AC97 mode + */ +struct s3c_audio_pdata { +	int (*cfg_gpio)(struct platform_device *);  }; - -struct s3c24xx_platdata_iis { -	const char		*codec_clk; -	struct s3c24xx_iis_ops	*ops; -	int			(*match_dev)(struct device *dev); -}; - -#endif /* __ASM_ARCH_AUDIO_H */ diff --git a/arch/arm/plat-s3c/include/plat/cpu-freq.h b/arch/arm/plat-s3c/include/plat/cpu-freq.h index 7b982b7f28c..94eb06a2ea5 100644 --- a/arch/arm/plat-s3c/include/plat/cpu-freq.h +++ b/arch/arm/plat-s3c/include/plat/cpu-freq.h @@ -1,6 +1,6 @@  /* arch/arm/plat-s3c/include/plat/cpu-freq.h   * - * Copyright (c) 2006,2007 Simtec Electronics + * Copyright (c) 2006-2007 Simtec Electronics   *	http://armlinux.simtec.co.uk/   *	Ben Dooks <ben@simtec.co.uk>   * diff --git a/arch/arm/plat-s3c/include/plat/cpu.h b/arch/arm/plat-s3c/include/plat/cpu.h index fbc3d498e02..d1131ca11e9 100644 --- a/arch/arm/plat-s3c/include/plat/cpu.h +++ b/arch/arm/plat-s3c/include/plat/cpu.h @@ -12,6 +12,9 @@  /* todo - fix when rmk changes iodescs to use `void __iomem *` */ +#ifndef __SAMSUNG_PLAT_CPU_H +#define __SAMSUNG_PLAT_CPU_H +  #define IODESC_ENT(x) { (unsigned long)S3C24XX_VA_##x, __phys_to_pfn(S3C24XX_PA_##x), S3C24XX_SZ_##x, MT_DEVICE }  #ifndef MHZ @@ -73,3 +76,6 @@ extern struct sysdev_class s3c2443_sysclass;  extern struct sysdev_class s3c6410_sysclass;  extern struct sysdev_class s3c64xx_sysclass; +extern void (*s5pc1xx_idle)(void); + +#endif diff --git a/arch/arm/plat-s3c/include/plat/devs.h b/arch/arm/plat-s3c/include/plat/devs.h index 0f540ea1e99..932cbbbb427 100644 --- a/arch/arm/plat-s3c/include/plat/devs.h +++ b/arch/arm/plat-s3c/include/plat/devs.h @@ -28,6 +28,9 @@ extern struct platform_device s3c64xx_device_iis0;  extern struct platform_device s3c64xx_device_iis1;  extern struct platform_device s3c64xx_device_iisv4; +extern struct platform_device s3c64xx_device_pcm0; +extern struct platform_device s3c64xx_device_pcm1; +  extern struct platform_device s3c_device_fb;  extern struct platform_device s3c_device_usb;  extern struct platform_device s3c_device_lcd; diff --git a/arch/arm/plat-s3c/include/plat/dma.h b/arch/arm/plat-s3c/include/plat/dma.h index 34dba98f08e..e429d10be3a 100644 --- a/arch/arm/plat-s3c/include/plat/dma.h +++ b/arch/arm/plat-s3c/include/plat/dma.h @@ -1,6 +1,6 @@  /* arch/arm/plat-s3c/include/plat/dma.h   * - * Copyright (C) 2003,2004,2006 Simtec Electronics + * Copyright (C) 2003-2006 Simtec Electronics   *	Ben Dooks <ben@simtec.co.uk>   *   * Samsung S3C DMA support diff --git a/arch/arm/plat-s3c/include/plat/fb.h b/arch/arm/plat-s3c/include/plat/fb.h index 214ff561b0d..f8db87930f8 100644 --- a/arch/arm/plat-s3c/include/plat/fb.h +++ b/arch/arm/plat-s3c/include/plat/fb.h @@ -70,4 +70,11 @@ extern void s3c_fb_set_platdata(struct s3c_fb_platdata *pd);   */  extern void s3c64xx_fb_gpio_setup_24bpp(void); +/** + * s5pc100_fb_gpio_setup_24bpp() - S5PC100 setup function for 24bpp LCD + * + * Initialise the GPIO for an 24bpp LCD display on the RGB interface. + */ +extern void s5pc100_fb_gpio_setup_24bpp(void); +  #endif /* __PLAT_S3C_FB_H */ diff --git a/arch/arm/plat-s3c/include/plat/iic.h b/arch/arm/plat-s3c/include/plat/iic.h index 67450f11574..3083df00dee 100644 --- a/arch/arm/plat-s3c/include/plat/iic.h +++ b/arch/arm/plat-s3c/include/plat/iic.h @@ -1,6 +1,6 @@  /* arch/arm/plat-s3c/include/plat/iic.h   * - * Copyright 2004,2009 Simtec Electronics + * Copyright 2004-2009 Simtec Electronics   *	Ben Dooks <ben@simtec.co.uk>   *   * S3C - I2C Controller platform_device info diff --git a/arch/arm/plat-s3c/include/plat/nand.h b/arch/arm/plat-s3c/include/plat/nand.h index 18f958801e6..06598597841 100644 --- a/arch/arm/plat-s3c/include/plat/nand.h +++ b/arch/arm/plat-s3c/include/plat/nand.h @@ -55,3 +55,11 @@ struct s3c2410_platform_nand {  					       int chip);  }; +/** + * s3c_nand_set_platdata() - register NAND platform data. + * @nand: The NAND platform data to register with s3c_device_nand. + * + * This function copies the given NAND platform data, @nand and registers + * it with the s3c_device_nand. This allows @nand to be __initdata. +*/ +extern void s3c_nand_set_platdata(struct s3c2410_platform_nand *nand); diff --git a/arch/arm/plat-s3c/include/plat/regs-fb-v4.h b/arch/arm/plat-s3c/include/plat/regs-fb-v4.h new file mode 100644 index 00000000000..a60ed0d06c9 --- /dev/null +++ b/arch/arm/plat-s3c/include/plat/regs-fb-v4.h @@ -0,0 +1,235 @@ +/* arch/arm/plat-s3c/include/plat/regs-fb-v4.h + * + * Copyright 2008 Openmoko, Inc. + * Copyright 2008 Simtec Electronics + *      http://armlinux.simtec.co.uk/ + *      Ben Dooks <ben@simtec.co.uk> + * + * S3C64XX - new-style framebuffer register definitions + * + * This is the register set for the new style framebuffer interface + * found from the S3C2443 onwards and specifically the S3C64XX series + * S3C6400 and S3C6410. + * + * The file contains the cpu specific items which change between whichever + * architecture is selected. See <plat/regs-fb.h> for the core definitions + * that are the same. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. +*/ + +/* include the core definitions here, in case we really do need to + * override them at a later date. +*/ + +#include <plat/regs-fb.h> + +#define S3C_FB_MAX_WIN (5)  /* number of hardware windows available. */ +#define VIDCON1_FSTATUS_EVEN	(1 << 15) + +/* Video timing controls */ +#define VIDTCON0				(0x10) +#define VIDTCON1				(0x14) +#define VIDTCON2				(0x18) + +/* Window position controls */ + +#define WINCON(_win)				(0x20 + ((_win) * 4)) + +/* OSD1 and OSD4 do not have register D */ + +#define VIDOSD_A(_win)				(0x40 + ((_win) * 16)) +#define VIDOSD_B(_win)				(0x44 + ((_win) * 16)) +#define VIDOSD_C(_win)				(0x48 + ((_win) * 16)) +#define VIDOSD_D(_win)				(0x4C + ((_win) * 16)) + + +#define VIDINTCON0				(0x130) + +#define WxKEYCONy(_win, _con)			((0x140 + ((_win) * 8)) + ((_con) * 4)) + +/* WINCONx */ + +#define WINCONx_CSCWIDTH_MASK			(0x3 << 26) +#define WINCONx_CSCWIDTH_SHIFT			(26) +#define WINCONx_CSCWIDTH_WIDE			(0x0 << 26) +#define WINCONx_CSCWIDTH_NARROW			(0x3 << 26) + +#define WINCONx_ENLOCAL				(1 << 22) +#define WINCONx_BUFSTATUS			(1 << 21) +#define WINCONx_BUFSEL				(1 << 20) +#define WINCONx_BUFAUTOEN			(1 << 19) +#define WINCONx_YCbCr				(1 << 13) + +#define WINCON1_LOCALSEL_CAMIF			(1 << 23) + +#define WINCON2_LOCALSEL_CAMIF			(1 << 23) +#define WINCON2_BLD_PIX				(1 << 6) + +#define WINCON2_ALPHA_SEL			(1 << 1) +#define WINCON2_BPPMODE_MASK			(0xf << 2) +#define WINCON2_BPPMODE_SHIFT			(2) +#define WINCON2_BPPMODE_1BPP			(0x0 << 2) +#define WINCON2_BPPMODE_2BPP			(0x1 << 2) +#define WINCON2_BPPMODE_4BPP			(0x2 << 2) +#define WINCON2_BPPMODE_8BPP_1232		(0x4 << 2) +#define WINCON2_BPPMODE_16BPP_565		(0x5 << 2) +#define WINCON2_BPPMODE_16BPP_A1555		(0x6 << 2) +#define WINCON2_BPPMODE_16BPP_I1555		(0x7 << 2) +#define WINCON2_BPPMODE_18BPP_666		(0x8 << 2) +#define WINCON2_BPPMODE_18BPP_A1665		(0x9 << 2) +#define WINCON2_BPPMODE_19BPP_A1666		(0xa << 2) +#define WINCON2_BPPMODE_24BPP_888		(0xb << 2) +#define WINCON2_BPPMODE_24BPP_A1887		(0xc << 2) +#define WINCON2_BPPMODE_25BPP_A1888		(0xd << 2) +#define WINCON2_BPPMODE_28BPP_A4888		(0xd << 2) + +#define WINCON3_BLD_PIX				(1 << 6) + +#define WINCON3_ALPHA_SEL			(1 << 1) +#define WINCON3_BPPMODE_MASK			(0xf << 2) +#define WINCON3_BPPMODE_SHIFT			(2) +#define WINCON3_BPPMODE_1BPP			(0x0 << 2) +#define WINCON3_BPPMODE_2BPP			(0x1 << 2) +#define WINCON3_BPPMODE_4BPP			(0x2 << 2) +#define WINCON3_BPPMODE_16BPP_565		(0x5 << 2) +#define WINCON3_BPPMODE_16BPP_A1555		(0x6 << 2) +#define WINCON3_BPPMODE_16BPP_I1555		(0x7 << 2) +#define WINCON3_BPPMODE_18BPP_666		(0x8 << 2) +#define WINCON3_BPPMODE_18BPP_A1665		(0x9 << 2) +#define WINCON3_BPPMODE_19BPP_A1666		(0xa << 2) +#define WINCON3_BPPMODE_24BPP_888		(0xb << 2) +#define WINCON3_BPPMODE_24BPP_A1887		(0xc << 2) +#define WINCON3_BPPMODE_25BPP_A1888		(0xd << 2) +#define WINCON3_BPPMODE_28BPP_A4888		(0xd << 2) + +#define VIDINTCON0_FIFIOSEL_WINDOW2		(0x10 << 5) +#define VIDINTCON0_FIFIOSEL_WINDOW3		(0x20 << 5) +#define VIDINTCON0_FIFIOSEL_WINDOW4		(0x40 << 5) + +#define DITHMODE				(0x170) +#define WINxMAP(_win)				(0x180 + ((_win) * 4)) + + +#define DITHMODE_R_POS_MASK			(0x3 << 5) +#define DITHMODE_R_POS_SHIFT			(5) +#define DITHMODE_R_POS_8BIT			(0x0 << 5) +#define DITHMODE_R_POS_6BIT			(0x1 << 5) +#define DITHMODE_R_POS_5BIT			(0x2 << 5) + +#define DITHMODE_G_POS_MASK			(0x3 << 3) +#define DITHMODE_G_POS_SHIFT			(3) +#define DITHMODE_G_POS_8BIT			(0x0 << 3) +#define DITHMODE_G_POS_6BIT			(0x1 << 3) +#define DITHMODE_G_POS_5BIT			(0x2 << 3) + +#define DITHMODE_B_POS_MASK			(0x3 << 1) +#define DITHMODE_B_POS_SHIFT			(1) +#define DITHMODE_B_POS_8BIT			(0x0 << 1) +#define DITHMODE_B_POS_6BIT			(0x1 << 1) +#define DITHMODE_B_POS_5BIT			(0x2 << 1) + +#define DITHMODE_DITH_EN			(1 << 0) + +#define WPALCON					(0x1A0) + +/* Palette control */ +/* Note for S5PC100: you can still use those macros on WPALCON (aka WPALCON_L), + * but make sure that WPALCON_H W2PAL-W4PAL entries are zeroed out */ +#define WPALCON_W4PAL_16BPP_A555		(1 << 8) +#define WPALCON_W3PAL_16BPP_A555		(1 << 7) +#define WPALCON_W2PAL_16BPP_A555		(1 << 6) + + +/* system specific implementation code for palette sizes, and other + * information that changes depending on which architecture is being + * compiled. +*/ + +/* return true if window _win has OSD register D */ +#define s3c_fb_has_osd_d(_win) ((_win) != 4 && (_win) != 0) + +static inline unsigned int s3c_fb_win_pal_size(unsigned int win) +{ +	if (win < 2) +		return 256; +	if (win < 4) +		return 16; +	if (win == 4) +		return 4; + +	BUG();	/* shouldn't get here */ +} + +static inline int s3c_fb_validate_win_bpp(unsigned int win, unsigned int bpp) +{ +	/* all windows can do 1/2 bpp */ + +	if ((bpp == 25 || bpp == 19) && win == 0) +		return 0;	/* win 0 does not have 19 or 25bpp modes */ + +	if (bpp == 4 && win == 4) +		return 0; + +	if (bpp == 8 && (win >= 3)) +		return 0;	/* win 3/4 cannot do 8bpp in any mode */ + +	return 1; +} + +static inline int s3c_fb_pal_is16(unsigned int window) +{ +	return window > 1; +} + +struct s3c_fb_palette { +	struct fb_bitfield	r; +	struct fb_bitfield	g; +	struct fb_bitfield	b; +	struct fb_bitfield	a; +}; + +static inline void s3c_fb_init_palette(unsigned int window, +				       struct s3c_fb_palette *palette) +{ +	if (window < 2) { +		/* Windows 0/1 are 8/8/8 or A/8/8/8 */ +		palette->r.offset = 16; +		palette->r.length = 8; +		palette->g.offset = 8; +		palette->g.length = 8; +		palette->b.offset = 0; +		palette->b.length = 8; +	} else { +		/* currently we assume RGB 5/6/5 */ +		palette->r.offset = 11; +		palette->r.length = 5; +		palette->g.offset = 5; +		palette->g.length = 6; +		palette->b.offset = 0; +		palette->b.length = 5; +	} +} + +/* Notes on per-window bpp settings + * + * Value	Win0	 Win1	  Win2	   Win3	    Win 4 + * 0000		1(P)	 1(P)	  1(P)	   1(P)	    1(P) + * 0001		2(P)	 2(P)     2(P)	   2(P)	    2(P) + * 0010		4(P)	 4(P)     4(P)	   4(P)     -none- + * 0011		8(P)	 8(P)     -none-   -none-   -none- + * 0100		-none-	 8(A232)  8(A232)  -none-   -none- + * 0101		16(565)	 16(565)  16(565)  16(565)   16(565) + * 0110		-none-	 16(A555) 16(A555) 16(A555)  16(A555) + * 0111		16(I555) 16(I565) 16(I555) 16(I555)  16(I555) + * 1000		18(666)	 18(666)  18(666)  18(666)   18(666) + * 1001		-none-	 18(A665) 18(A665) 18(A665)  16(A665) + * 1010		-none-	 19(A666) 19(A666) 19(A666)  19(A666) + * 1011		24(888)	 24(888)  24(888)  24(888)   24(888) + * 1100		-none-	 24(A887) 24(A887) 24(A887)  24(A887) + * 1101		-none-	 25(A888) 25(A888) 25(A888)  25(A888) + * 1110		-none-	 -none-	  -none-   -none-    -none- + * 1111		-none-	 -none-   -none-   -none-    -none- +*/ diff --git a/arch/arm/plat-s3c/include/plat/regs-nand.h b/arch/arm/plat-s3c/include/plat/regs-nand.h index b2caa4bca27..238efea7b9e 100644 --- a/arch/arm/plat-s3c/include/plat/regs-nand.h +++ b/arch/arm/plat-s3c/include/plat/regs-nand.h @@ -1,7 +1,7 @@  /* arch/arm/mach-s3c2410/include/mach/regs-nand.h   * - * Copyright (c) 2004,2005 Simtec Electronics <linux@simtec.co.uk> - *		      http://www.simtec.co.uk/products/SWLINUX/ + * Copyright (c) 2004-2005 Simtec Electronics <linux@simtec.co.uk> + *	http://www.simtec.co.uk/products/SWLINUX/   *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License version 2 as diff --git a/arch/arm/plat-s3c/include/plat/regs-s3c2412-iis.h b/arch/arm/plat-s3c/include/plat/regs-s3c2412-iis.h index 07659dad174..abf2fbc2eb2 100644 --- a/arch/arm/plat-s3c/include/plat/regs-s3c2412-iis.h +++ b/arch/arm/plat-s3c/include/plat/regs-s3c2412-iis.h @@ -67,6 +67,8 @@  #define S3C2412_IISMOD_BCLK_MASK	(3 << 1)  #define S3C2412_IISMOD_8BIT		(1 << 0) +#define S3C64XX_IISMOD_CDCLKCON		(1 << 12) +  #define S3C2412_IISPSR_PSREN		(1 << 15)  #define S3C2412_IISFIC_TXFLUSH		(1 << 15) diff --git a/arch/arm/plat-s3c/include/plat/regs-serial.h b/arch/arm/plat-s3c/include/plat/regs-serial.h index 66af75a5cdd..85d8904e7f2 100644 --- a/arch/arm/plat-s3c/include/plat/regs-serial.h +++ b/arch/arm/plat-s3c/include/plat/regs-serial.h @@ -6,7 +6,7 @@   *   *  Copyright (C) 2002 Shane Nay (shane@minirl.com)   * - *  Additional defines, (c) 2003 Simtec Electronics (linux@simtec.co.uk) + *  Additional defines, Copyright 2003 Simtec Electronics (linux@simtec.co.uk)   *   *  Adapted from:   * diff --git a/arch/arm/plat-s3c/include/plat/sdhci.h b/arch/arm/plat-s3c/include/plat/sdhci.h index f615308ccdf..53198673b6b 100644 --- a/arch/arm/plat-s3c/include/plat/sdhci.h +++ b/arch/arm/plat-s3c/include/plat/sdhci.h @@ -57,6 +57,7 @@ struct s3c_sdhci_platdata {   */  extern void s3c_sdhci0_set_platdata(struct s3c_sdhci_platdata *pd);  extern void s3c_sdhci1_set_platdata(struct s3c_sdhci_platdata *pd); +extern void s3c_sdhci2_set_platdata(struct s3c_sdhci_platdata *pd);  /* Default platform data, exported so that per-cpu initialisation can   * set the correct one when there are more than one cpu type selected. @@ -64,11 +65,16 @@ extern void s3c_sdhci1_set_platdata(struct s3c_sdhci_platdata *pd);  extern struct s3c_sdhci_platdata s3c_hsmmc0_def_platdata;  extern struct s3c_sdhci_platdata s3c_hsmmc1_def_platdata; +extern struct s3c_sdhci_platdata s3c_hsmmc2_def_platdata;  /* Helper function availablity */  extern void s3c64xx_setup_sdhci0_cfg_gpio(struct platform_device *, int w);  extern void s3c64xx_setup_sdhci1_cfg_gpio(struct platform_device *, int w); +extern void s5pc100_setup_sdhci0_cfg_gpio(struct platform_device *, int w); +extern void s5pc100_setup_sdhci1_cfg_gpio(struct platform_device *, int w); +extern void s5pc100_setup_sdhci2_cfg_gpio(struct platform_device *, int w); +extern void s3c64xx_setup_sdhci2_cfg_gpio(struct platform_device *, int w);  /* S3C6400 SDHCI setup */ @@ -103,6 +109,17 @@ static inline void s3c6400_default_sdhci1(void)  static inline void s3c6400_default_sdhci1(void) { }  #endif /* CONFIG_S3C_DEV_HSMMC1 */ +#ifdef CONFIG_S3C_DEV_HSMMC2 +static inline void s3c6400_default_sdhci2(void) +{ +	s3c_hsmmc2_def_platdata.clocks = s3c6400_hsmmc_clksrcs; +	s3c_hsmmc2_def_platdata.cfg_gpio = s3c64xx_setup_sdhci2_cfg_gpio; +	s3c_hsmmc2_def_platdata.cfg_card = s3c6400_setup_sdhci_cfg_card; +} +#else +static inline void s3c6400_default_sdhci2(void) { } +#endif /* CONFIG_S3C_DEV_HSMMC2 */ +  #else  static inline void s3c6400_default_sdhci0(void) { }  static inline void s3c6400_default_sdhci1(void) { } @@ -140,9 +157,70 @@ static inline void s3c6410_default_sdhci1(void)  static inline void s3c6410_default_sdhci1(void) { }  #endif /* CONFIG_S3C_DEV_HSMMC1 */ +#ifdef CONFIG_S3C_DEV_HSMMC2 +static inline void s3c6410_default_sdhci2(void) +{ +	s3c_hsmmc2_def_platdata.clocks = s3c6410_hsmmc_clksrcs; +	s3c_hsmmc2_def_platdata.cfg_gpio = s3c64xx_setup_sdhci2_cfg_gpio; +	s3c_hsmmc2_def_platdata.cfg_card = s3c6410_setup_sdhci0_cfg_card; +} +#else +static inline void s3c6410_default_sdhci2(void) { } +#endif /* CONFIG_S3C_DEV_HSMMC2 */ +  #else  static inline void s3c6410_default_sdhci0(void) { }  static inline void s3c6410_default_sdhci1(void) { }  #endif /* CONFIG_S3C6410_SETUP_SDHCI */ +/* S5PC100 SDHCI setup */ + +#ifdef CONFIG_S5PC100_SETUP_SDHCI +extern char *s5pc100_hsmmc_clksrcs[4]; + +extern void s5pc100_setup_sdhci0_cfg_card(struct platform_device *dev, +					   void __iomem *r, +					   struct mmc_ios *ios, +					   struct mmc_card *card); + +#ifdef CONFIG_S3C_DEV_HSMMC +static inline void s5pc100_default_sdhci0(void) +{ +	s3c_hsmmc0_def_platdata.clocks = s5pc100_hsmmc_clksrcs; +	s3c_hsmmc0_def_platdata.cfg_gpio = s5pc100_setup_sdhci0_cfg_gpio; +	s3c_hsmmc0_def_platdata.cfg_card = s5pc100_setup_sdhci0_cfg_card; +} +#else +static inline void s5pc100_default_sdhci0(void) { } +#endif /* CONFIG_S3C_DEV_HSMMC */ + +#ifdef CONFIG_S3C_DEV_HSMMC1 +static inline void s5pc100_default_sdhci1(void) +{ +	s3c_hsmmc1_def_platdata.clocks = s5pc100_hsmmc_clksrcs; +	s3c_hsmmc1_def_platdata.cfg_gpio = s5pc100_setup_sdhci1_cfg_gpio; +	s3c_hsmmc1_def_platdata.cfg_card = s5pc100_setup_sdhci0_cfg_card; +} +#else +static inline void s5pc100_default_sdhci1(void) { } +#endif /* CONFIG_S3C_DEV_HSMMC1 */ + +#ifdef CONFIG_S3C_DEV_HSMMC2 +static inline void s5pc100_default_sdhci2(void) +{ +	s3c_hsmmc2_def_platdata.clocks = s5pc100_hsmmc_clksrcs; +	s3c_hsmmc2_def_platdata.cfg_gpio = s5pc100_setup_sdhci2_cfg_gpio; +	s3c_hsmmc2_def_platdata.cfg_card = s5pc100_setup_sdhci0_cfg_card; +} +#else +static inline void s5pc100_default_sdhci2(void) { } +#endif /* CONFIG_S3C_DEV_HSMMC1 */ + + +#else +static inline void s5pc100_default_sdhci0(void) { } +static inline void s5pc100_default_sdhci1(void) { } +static inline void s5pc100_default_sdhci2(void) { } +#endif /* CONFIG_S5PC100_SETUP_SDHCI */ +  #endif /* __PLAT_S3C_SDHCI_H */ diff --git a/arch/arm/plat-s3c/pm-check.c b/arch/arm/plat-s3c/pm-check.c index 39f2555564d..8eb1f439861 100644 --- a/arch/arm/plat-s3c/pm-check.c +++ b/arch/arm/plat-s3c/pm-check.c @@ -1,7 +1,7 @@  /* linux/arch/arm/plat-s3c/pm-check.c   *  originally in linux/arch/arm/plat-s3c24xx/pm.c   * - * Copyright (c) 2004,2006,2008 Simtec Electronics + * Copyright (c) 2004-2008 Simtec Electronics   *	http://armlinux.simtec.co.uk   *	Ben Dooks <ben@simtec.co.uk>   * diff --git a/arch/arm/plat-s3c/pm.c b/arch/arm/plat-s3c/pm.c index 8d97db2c7a0..767470601e5 100644 --- a/arch/arm/plat-s3c/pm.c +++ b/arch/arm/plat-s3c/pm.c @@ -1,7 +1,7 @@  /* linux/arch/arm/plat-s3c/pm.c   *   * Copyright 2008 Openmoko, Inc. - * Copyright 2004,2006,2008 Simtec Electronics + * Copyright 2004-2008 Simtec Electronics   *	Ben Dooks <ben@simtec.co.uk>   *	http://armlinux.simtec.co.uk/   *  |