2011-02-14 10:22:36 +03:00
/* linux/arch/arm/mach-exynos4/setup-sdhci-gpio.c
2010-10-06 06:09:42 +04:00
*
2011-02-14 10:22:36 +03:00
* Copyright ( c ) 2010 - 2011 Samsung Electronics Co . , Ltd .
* http : //www.samsung.com
2010-10-06 06:09:42 +04:00
*
2011-02-14 10:22:36 +03:00
* EXYNOS4 - Helper functions for setting up SDHCI device ( s ) GPIO ( HSMMC )
2010-10-06 06:09:42 +04:00
*
* 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 <linux/mmc/host.h>
# include <linux/mmc/card.h>
# include <plat/gpio-cfg.h>
# include <plat/regs-sdhci.h>
# include <plat/sdhci.h>
2011-02-14 10:22:36 +03:00
void exynos4_setup_sdhci0_cfg_gpio ( struct platform_device * dev , int width )
2010-10-06 06:09:42 +04:00
{
struct s3c_sdhci_platdata * pdata = dev - > dev . platform_data ;
unsigned int gpio ;
/* Set all the necessary GPK0[0:1] pins to special-function 2 */
2011-02-14 10:22:36 +03:00
for ( gpio = EXYNOS4_GPK0 ( 0 ) ; gpio < EXYNOS4_GPK0 ( 2 ) ; gpio + + ) {
2010-10-06 06:09:42 +04:00
s3c_gpio_cfgpin ( gpio , S3C_GPIO_SFN ( 2 ) ) ;
s3c_gpio_setpull ( gpio , S3C_GPIO_PULL_NONE ) ;
s5p_gpio_set_drvstr ( gpio , S5P_GPIO_DRVSTR_LV4 ) ;
}
switch ( width ) {
case 8 :
2011-02-14 10:22:36 +03:00
for ( gpio = EXYNOS4_GPK1 ( 3 ) ; gpio < = EXYNOS4_GPK1 ( 6 ) ; gpio + + ) {
2011-03-31 05:57:33 +04:00
/* Data pin GPK1[3:6] to special-function 3 */
2010-10-06 06:09:42 +04:00
s3c_gpio_cfgpin ( gpio , S3C_GPIO_SFN ( 3 ) ) ;
s3c_gpio_setpull ( gpio , S3C_GPIO_PULL_UP ) ;
s5p_gpio_set_drvstr ( gpio , S5P_GPIO_DRVSTR_LV4 ) ;
}
case 4 :
2011-02-14 10:22:36 +03:00
for ( gpio = EXYNOS4_GPK0 ( 3 ) ; gpio < = EXYNOS4_GPK0 ( 6 ) ; gpio + + ) {
2011-03-31 05:57:33 +04:00
/* Data pin GPK0[3:6] to special-function 2 */
2010-10-06 06:09:42 +04:00
s3c_gpio_cfgpin ( gpio , S3C_GPIO_SFN ( 2 ) ) ;
s3c_gpio_setpull ( gpio , S3C_GPIO_PULL_UP ) ;
s5p_gpio_set_drvstr ( gpio , S5P_GPIO_DRVSTR_LV4 ) ;
}
default :
break ;
}
if ( pdata - > cd_type = = S3C_SDHCI_CD_INTERNAL ) {
2011-02-14 10:22:36 +03:00
s3c_gpio_cfgpin ( EXYNOS4_GPK0 ( 2 ) , S3C_GPIO_SFN ( 2 ) ) ;
s3c_gpio_setpull ( EXYNOS4_GPK0 ( 2 ) , S3C_GPIO_PULL_UP ) ;
2010-10-06 06:09:42 +04:00
s5p_gpio_set_drvstr ( gpio , S5P_GPIO_DRVSTR_LV4 ) ;
}
}
2011-02-14 10:22:36 +03:00
void exynos4_setup_sdhci1_cfg_gpio ( struct platform_device * dev , int width )
2010-10-06 06:09:42 +04:00
{
struct s3c_sdhci_platdata * pdata = dev - > dev . platform_data ;
unsigned int gpio ;
/* Set all the necessary GPK1[0:1] pins to special-function 2 */
2011-02-14 10:22:36 +03:00
for ( gpio = EXYNOS4_GPK1 ( 0 ) ; gpio < EXYNOS4_GPK1 ( 2 ) ; gpio + + ) {
2010-10-06 06:09:42 +04:00
s3c_gpio_cfgpin ( gpio , S3C_GPIO_SFN ( 2 ) ) ;
s3c_gpio_setpull ( gpio , S3C_GPIO_PULL_NONE ) ;
s5p_gpio_set_drvstr ( gpio , S5P_GPIO_DRVSTR_LV4 ) ;
}
2011-02-14 10:22:36 +03:00
for ( gpio = EXYNOS4_GPK1 ( 3 ) ; gpio < = EXYNOS4_GPK1 ( 6 ) ; gpio + + ) {
2010-10-06 06:09:42 +04:00
/* Data pin GPK1[3:6] to special-function 2 */
s3c_gpio_cfgpin ( gpio , S3C_GPIO_SFN ( 2 ) ) ;
s3c_gpio_setpull ( gpio , S3C_GPIO_PULL_UP ) ;
s5p_gpio_set_drvstr ( gpio , S5P_GPIO_DRVSTR_LV4 ) ;
}
if ( pdata - > cd_type = = S3C_SDHCI_CD_INTERNAL ) {
2011-02-14 10:22:36 +03:00
s3c_gpio_cfgpin ( EXYNOS4_GPK1 ( 2 ) , S3C_GPIO_SFN ( 2 ) ) ;
s3c_gpio_setpull ( EXYNOS4_GPK1 ( 2 ) , S3C_GPIO_PULL_UP ) ;
2010-10-06 06:09:42 +04:00
s5p_gpio_set_drvstr ( gpio , S5P_GPIO_DRVSTR_LV4 ) ;
}
}
2011-02-14 10:22:36 +03:00
void exynos4_setup_sdhci2_cfg_gpio ( struct platform_device * dev , int width )
2010-10-06 06:09:42 +04:00
{
struct s3c_sdhci_platdata * pdata = dev - > dev . platform_data ;
unsigned int gpio ;
/* Set all the necessary GPK2[0:1] pins to special-function 2 */
2011-02-14 10:22:36 +03:00
for ( gpio = EXYNOS4_GPK2 ( 0 ) ; gpio < EXYNOS4_GPK2 ( 2 ) ; gpio + + ) {
2010-10-06 06:09:42 +04:00
s3c_gpio_cfgpin ( gpio , S3C_GPIO_SFN ( 2 ) ) ;
s3c_gpio_setpull ( gpio , S3C_GPIO_PULL_NONE ) ;
s5p_gpio_set_drvstr ( gpio , S5P_GPIO_DRVSTR_LV4 ) ;
}
switch ( width ) {
case 8 :
2011-02-14 10:22:36 +03:00
for ( gpio = EXYNOS4_GPK3 ( 3 ) ; gpio < = EXYNOS4_GPK3 ( 6 ) ; gpio + + ) {
2010-10-06 06:09:42 +04:00
/* Data pin GPK3[3:6] to special-function 3 */
s3c_gpio_cfgpin ( gpio , S3C_GPIO_SFN ( 3 ) ) ;
s3c_gpio_setpull ( gpio , S3C_GPIO_PULL_UP ) ;
s5p_gpio_set_drvstr ( gpio , S5P_GPIO_DRVSTR_LV4 ) ;
}
case 4 :
2011-02-14 10:22:36 +03:00
for ( gpio = EXYNOS4_GPK2 ( 3 ) ; gpio < = EXYNOS4_GPK2 ( 6 ) ; gpio + + ) {
2010-10-06 06:09:42 +04:00
/* Data pin GPK2[3:6] to special-function 2 */
s3c_gpio_cfgpin ( gpio , S3C_GPIO_SFN ( 2 ) ) ;
s3c_gpio_setpull ( gpio , S3C_GPIO_PULL_UP ) ;
s5p_gpio_set_drvstr ( gpio , S5P_GPIO_DRVSTR_LV4 ) ;
}
default :
break ;
}
if ( pdata - > cd_type = = S3C_SDHCI_CD_INTERNAL ) {
2011-02-14 10:22:36 +03:00
s3c_gpio_cfgpin ( EXYNOS4_GPK2 ( 2 ) , S3C_GPIO_SFN ( 2 ) ) ;
s3c_gpio_setpull ( EXYNOS4_GPK2 ( 2 ) , S3C_GPIO_PULL_UP ) ;
2010-10-06 06:09:42 +04:00
s5p_gpio_set_drvstr ( gpio , S5P_GPIO_DRVSTR_LV4 ) ;
}
}
2011-02-14 10:22:36 +03:00
void exynos4_setup_sdhci3_cfg_gpio ( struct platform_device * dev , int width )
2010-10-06 06:09:42 +04:00
{
struct s3c_sdhci_platdata * pdata = dev - > dev . platform_data ;
unsigned int gpio ;
/* Set all the necessary GPK3[0:1] pins to special-function 2 */
2011-02-14 10:22:36 +03:00
for ( gpio = EXYNOS4_GPK3 ( 0 ) ; gpio < EXYNOS4_GPK3 ( 2 ) ; gpio + + ) {
2010-10-06 06:09:42 +04:00
s3c_gpio_cfgpin ( gpio , S3C_GPIO_SFN ( 2 ) ) ;
s3c_gpio_setpull ( gpio , S3C_GPIO_PULL_NONE ) ;
s5p_gpio_set_drvstr ( gpio , S5P_GPIO_DRVSTR_LV4 ) ;
}
2011-02-14 10:22:36 +03:00
for ( gpio = EXYNOS4_GPK3 ( 3 ) ; gpio < = EXYNOS4_GPK3 ( 6 ) ; gpio + + ) {
2010-10-06 06:09:42 +04:00
/* Data pin GPK3[3:6] to special-function 2 */
s3c_gpio_cfgpin ( gpio , S3C_GPIO_SFN ( 2 ) ) ;
s3c_gpio_setpull ( gpio , S3C_GPIO_PULL_UP ) ;
s5p_gpio_set_drvstr ( gpio , S5P_GPIO_DRVSTR_LV4 ) ;
}
if ( pdata - > cd_type = = S3C_SDHCI_CD_INTERNAL ) {
2011-02-14 10:22:36 +03:00
s3c_gpio_cfgpin ( EXYNOS4_GPK3 ( 2 ) , S3C_GPIO_SFN ( 2 ) ) ;
s3c_gpio_setpull ( EXYNOS4_GPK3 ( 2 ) , S3C_GPIO_PULL_UP ) ;
2010-10-06 06:09:42 +04:00
s5p_gpio_set_drvstr ( gpio , S5P_GPIO_DRVSTR_LV4 ) ;
}
}