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

Commit c29cfa6d authored by Yauhen Kharuzhy's avatar Yauhen Kharuzhy Committed by Kukjin Kim
Browse files

ARM: S3C2416: Add platform helpers for setup SDHCI



Samsung S3C2416 has two SDHCI controllers compatible with other
Samsung's SoCs (S3C64XX, S5PC100 etc...).

Add required platform setup code that the devices can be used with
sdhci-s3c driver.

Signed-off-by: default avatarYauhen Kharuzhy <yauhen.kharuzhy@promwad.com>
[kgene.kim@samsung.com: change to __raw_{readl,writel} from {readl,writel}]
[kgene.kim@samsung.com: build error fixes]
Signed-off-by: default avatarKukjin Kim <kgene.kim@samsung.com>
parent 95d6791b
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -31,6 +31,17 @@ config S3C2416_PM
	help
	  Internal config node to apply S3C2416 power management

config S3C2416_SETUP_SDHCI
	bool
	select S3C2416_SETUP_SDHCI_GPIO
	help
	  Internal helper functions for S3C2416 based SDHCI systems

config S3C2416_SETUP_SDHCI_GPIO
	bool
	help
	  Common setup code for SDHCI gpio.

menu "S3C2416 Machines"

config MACH_SMDK2416
@@ -42,6 +53,7 @@ config MACH_SMDK2416
	select S3C_DEV_HSMMC1
	select S3C_DEV_NAND
	select S3C_DEV_USB_HOST
	select S3C2416_SETUP_SDHCI
	select S3C2416_PM if PM
	help
	  Say Y here if you are using an SMDK2416
+4 −0
Original line number Diff line number Diff line
@@ -14,6 +14,10 @@ obj-$(CONFIG_CPU_S3C2416) += irq.o
obj-$(CONFIG_S3C2416_PM)	+= pm.o
#obj-$(CONFIG_S3C2416_DMA)	+= dma.o

# Device setup
obj-$(CONFIG_S3C2416_SETUP_SDHCI) += setup-sdhci.o
obj-$(CONFIG_S3C2416_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o

# Machine support

obj-$(CONFIG_MACH_SMDK2416)	+= mach-smdk2416.o
+5 −0
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@
#include <plat/s3c2416.h>
#include <plat/devs.h>
#include <plat/cpu.h>
#include <plat/sdhci.h>

#include <plat/iic-core.h>
#include <plat/fb-core.h>
@@ -115,6 +116,10 @@ void __init s3c2416_map_io(void)
	s3c24xx_gpiocfg_default.set_pull = s3c_gpio_setpull_updown;
	s3c24xx_gpiocfg_default.get_pull = s3c_gpio_getpull_updown;

	/* initialize device information early */
	s3c2416_default_sdhci0();
	s3c2416_default_sdhci1();

	iotable_init(s3c2416_iodesc, ARRAY_SIZE(s3c2416_iodesc));
}

+34 −0
Original line number Diff line number Diff line
/* linux/arch/arm/plat-s3c2416/setup-sdhci-gpio.c
 *
 * Copyright 2010 Promwad Innovation Company
 *	Yauhen Kharuzhy <yauhen.kharuzhy@promwad.com>
 *
 * S3C2416 - Helper functions for setting up SDHCI device(s) GPIO (HSMMC)
 *
 * Based on mach-s3c64xx/setup-sdhci-gpio.c
 *
 * 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/types.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/io.h>
#include <linux/gpio.h>

#include <mach/regs-gpio.h>
#include <plat/gpio-cfg.h>

void s3c2416_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width)
{
	s3c_gpio_cfgrange_nopull(S3C2410_GPE(5), 2 + width, S3C_GPIO_SFN(2));
}

void s3c2416_setup_sdhci1_cfg_gpio(struct platform_device *dev, int width)
{
	s3c_gpio_cfgrange_nopull(S3C2410_GPL(0), width, S3C_GPIO_SFN(2));
	s3c_gpio_cfgrange_nopull(S3C2410_GPL(8), 2, S3C_GPIO_SFN(2));
}
+61 −0
Original line number Diff line number Diff line
/* linux/arch/arm/mach-s3c2416/setup-sdhci.c
 *
 * Copyright 2010 Promwad Innovation Company
 *	Yauhen Kharuzhy <yauhen.kharuzhy@promwad.com>
 *
 * S3C2416 - Helper functions for settign up SDHCI device(s) (HSMMC)
 *
 * Based on mach-s3c64xx/setup-sdhci.c
 *
 * 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/types.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/io.h>

#include <linux/mmc/card.h>
#include <linux/mmc/host.h>

#include <plat/regs-sdhci.h>
#include <plat/sdhci.h>

/* clock sources for the mmc bus clock, order as for the ctrl2[5..4] */

char *s3c2416_hsmmc_clksrcs[4] = {
	[0] = "hsmmc",
	[1] = "hsmmc",
	[2] = "hsmmc-if",
	/* [3] = "48m", - note not successfully used yet */
};

void s3c2416_setup_sdhci_cfg_card(struct platform_device *dev,
				  void __iomem *r,
				  struct mmc_ios *ios,
				  struct mmc_card *card)
{
	u32 ctrl2, ctrl3;

	ctrl2 = __raw_readl(r + S3C_SDHCI_CONTROL2);
	ctrl2 &= S3C_SDHCI_CTRL2_SELBASECLK_MASK;
	ctrl2 |= (S3C64XX_SDHCI_CTRL2_ENSTAASYNCCLR |
		  S3C64XX_SDHCI_CTRL2_ENCMDCNFMSK |
		  S3C_SDHCI_CTRL2_ENFBCLKRX |
		  S3C_SDHCI_CTRL2_DFCNT_NONE |
		  S3C_SDHCI_CTRL2_ENCLKOUTHOLD);

	if (ios->clock < 25 * 1000000)
		ctrl3 = (S3C_SDHCI_CTRL3_FCSEL3 |
			 S3C_SDHCI_CTRL3_FCSEL2 |
			 S3C_SDHCI_CTRL3_FCSEL1 |
			 S3C_SDHCI_CTRL3_FCSEL0);
	else
		ctrl3 = (S3C_SDHCI_CTRL3_FCSEL1 | S3C_SDHCI_CTRL3_FCSEL0);

	__raw_writel(ctrl2, r + S3C_SDHCI_CONTROL2);
	__raw_writel(ctrl3, r + S3C_SDHCI_CONTROL3);
}
Loading