Эх сурвалжийг харах

ARM: S5PV210: Add SDHCI devices for GONI board

This patch add support for SDHCI blocks on Samsung Goni board. The
following host controllers are defined:
1. Internal MoviNAND device (permanently wired to the controller)
2. Internal WiFI SDIO device (card is activated by power regualor)
3. External MMC/SD socket (card detection is provided by external
gpio interrupt)

Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
Marek Szyprowski 15 жил өмнө
parent
commit
19b90c7c0f

+ 4 - 0
arch/arm/mach-s5pv210/Kconfig

@@ -74,8 +74,12 @@ config MACH_GONI
 	select CPU_S5PV210
 	select CPU_S5PV210
 	select ARCH_SPARSEMEM_ENABLE
 	select ARCH_SPARSEMEM_ENABLE
 	select S5PV210_SETUP_FB_24BPP
 	select S5PV210_SETUP_FB_24BPP
+	select S5PV210_SETUP_SDHCI
 	select S3C_DEV_FB
 	select S3C_DEV_FB
 	select S5PC110_DEV_ONENAND
 	select S5PC110_DEV_ONENAND
+	select S3C_DEV_HSMMC
+	select S3C_DEV_HSMMC1
+	select S3C_DEV_HSMMC2
 	help
 	help
 	  Machine support for Samsung GONI board
 	  Machine support for Samsung GONI board
 	  S5PC110(MCP) is one of package option of S5PV210
 	  S5PC110(MCP) is one of package option of S5PV210

+ 39 - 0
arch/arm/mach-s5pv210/mach-goni.c

@@ -35,6 +35,7 @@
 #include <plat/devs.h>
 #include <plat/devs.h>
 #include <plat/cpu.h>
 #include <plat/cpu.h>
 #include <plat/fb.h>
 #include <plat/fb.h>
+#include <plat/sdhci.h>
 
 
 /* Following are default values for UCON, ULCON and UFCON UART registers */
 /* Following are default values for UCON, ULCON and UFCON UART registers */
 #define S5PV210_UCON_DEFAULT	(S3C2410_UCON_TXILEVEL |	\
 #define S5PV210_UCON_DEFAULT	(S3C2410_UCON_TXILEVEL |	\
@@ -420,12 +421,47 @@ static void __init goni_pmic_init(void)
 	s3c_gpio_setpull(S5PV210_GPH2(6), S3C_GPIO_PULL_UP);
 	s3c_gpio_setpull(S5PV210_GPH2(6), S3C_GPIO_PULL_UP);
 }
 }
 
 
+/* MoviNAND */
+static struct s3c_sdhci_platdata goni_hsmmc0_data __initdata = {
+	.max_width		= 4,
+	.cd_type		= S3C_SDHCI_CD_PERMANENT,
+};
+
+/* Wireless LAN */
+static struct s3c_sdhci_platdata goni_hsmmc1_data __initdata = {
+	.max_width		= 4,
+	.cd_type		= S3C_SDHCI_CD_EXTERNAL,
+	/* ext_cd_{init,cleanup} callbacks will be added later */
+};
+
+/* External Flash */
+#define GONI_EXT_FLASH_EN	S5PV210_MP05(4)
+#define GONI_EXT_FLASH_CD	S5PV210_GPH3(4)
+static struct s3c_sdhci_platdata goni_hsmmc2_data __initdata = {
+	.max_width		= 4,
+	.cd_type		= S3C_SDHCI_CD_GPIO,
+	.ext_cd_gpio		= GONI_EXT_FLASH_CD,
+	.ext_cd_gpio_invert	= 1,
+};
+
+static void goni_setup_sdhci(void)
+{
+	gpio_request(GONI_EXT_FLASH_EN, "FLASH_EN");
+	gpio_direction_output(GONI_EXT_FLASH_EN, 1);
+
+	s3c_sdhci0_set_platdata(&goni_hsmmc0_data);
+	s3c_sdhci1_set_platdata(&goni_hsmmc1_data);
+	s3c_sdhci2_set_platdata(&goni_hsmmc2_data);
+};
 
 
 static struct platform_device *goni_devices[] __initdata = {
 static struct platform_device *goni_devices[] __initdata = {
 	&s3c_device_fb,
 	&s3c_device_fb,
 	&s5pc110_device_onenand,
 	&s5pc110_device_onenand,
 	&goni_i2c_gpio_pmic,
 	&goni_i2c_gpio_pmic,
 	&goni_device_gpiokeys,
 	&goni_device_gpiokeys,
+	&s3c_device_hsmmc0,
+	&s3c_device_hsmmc1,
+	&s3c_device_hsmmc2,
 };
 };
 
 
 static void __init goni_map_io(void)
 static void __init goni_map_io(void)
@@ -441,6 +477,9 @@ static void __init goni_machine_init(void)
 	goni_pmic_init();
 	goni_pmic_init();
 	i2c_register_board_info(AP_I2C_GPIO_PMIC_BUS_4, i2c_gpio_pmic_devs,
 	i2c_register_board_info(AP_I2C_GPIO_PMIC_BUS_4, i2c_gpio_pmic_devs,
 			ARRAY_SIZE(i2c_gpio_pmic_devs));
 			ARRAY_SIZE(i2c_gpio_pmic_devs));
+	/* SDHCI */
+	goni_setup_sdhci();
+
 	/* FB */
 	/* FB */
 	s3c_fb_set_platdata(&goni_lcd_pdata);
 	s3c_fb_set_platdata(&goni_lcd_pdata);