Path: blob/master/arch/arm/mach-exynos4/setup-sdhci-gpio.c
10817 views
/* linux/arch/arm/mach-exynos4/setup-sdhci-gpio.c1*2* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.3* http://www.samsung.com4*5* EXYNOS4 - Helper functions for setting up SDHCI device(s) GPIO (HSMMC)6*7* This program is free software; you can redistribute it and/or modify8* it under the terms of the GNU General Public License version 2 as9* published by the Free Software Foundation.10*/1112#include <linux/kernel.h>13#include <linux/types.h>14#include <linux/interrupt.h>15#include <linux/platform_device.h>16#include <linux/io.h>17#include <linux/gpio.h>18#include <linux/mmc/host.h>19#include <linux/mmc/card.h>2021#include <plat/gpio-cfg.h>22#include <plat/regs-sdhci.h>23#include <plat/sdhci.h>2425void exynos4_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width)26{27struct s3c_sdhci_platdata *pdata = dev->dev.platform_data;28unsigned int gpio;2930/* Set all the necessary GPK0[0:1] pins to special-function 2 */31for (gpio = EXYNOS4_GPK0(0); gpio < EXYNOS4_GPK0(2); gpio++) {32s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));33s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);34s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);35}3637switch (width) {38case 8:39for (gpio = EXYNOS4_GPK1(3); gpio <= EXYNOS4_GPK1(6); gpio++) {40/* Data pin GPK1[3:6] to special-function 3 */41s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3));42s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);43s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);44}45case 4:46for (gpio = EXYNOS4_GPK0(3); gpio <= EXYNOS4_GPK0(6); gpio++) {47/* Data pin GPK0[3:6] to special-function 2 */48s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));49s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);50s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);51}52default:53break;54}5556if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) {57s3c_gpio_cfgpin(EXYNOS4_GPK0(2), S3C_GPIO_SFN(2));58s3c_gpio_setpull(EXYNOS4_GPK0(2), S3C_GPIO_PULL_UP);59s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);60}61}6263void exynos4_setup_sdhci1_cfg_gpio(struct platform_device *dev, int width)64{65struct s3c_sdhci_platdata *pdata = dev->dev.platform_data;66unsigned int gpio;6768/* Set all the necessary GPK1[0:1] pins to special-function 2 */69for (gpio = EXYNOS4_GPK1(0); gpio < EXYNOS4_GPK1(2); gpio++) {70s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));71s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);72s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);73}7475for (gpio = EXYNOS4_GPK1(3); gpio <= EXYNOS4_GPK1(6); gpio++) {76/* Data pin GPK1[3:6] to special-function 2 */77s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));78s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);79s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);80}8182if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) {83s3c_gpio_cfgpin(EXYNOS4_GPK1(2), S3C_GPIO_SFN(2));84s3c_gpio_setpull(EXYNOS4_GPK1(2), S3C_GPIO_PULL_UP);85s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);86}87}8889void exynos4_setup_sdhci2_cfg_gpio(struct platform_device *dev, int width)90{91struct s3c_sdhci_platdata *pdata = dev->dev.platform_data;92unsigned int gpio;9394/* Set all the necessary GPK2[0:1] pins to special-function 2 */95for (gpio = EXYNOS4_GPK2(0); gpio < EXYNOS4_GPK2(2); gpio++) {96s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));97s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);98s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);99}100101switch (width) {102case 8:103for (gpio = EXYNOS4_GPK3(3); gpio <= EXYNOS4_GPK3(6); gpio++) {104/* Data pin GPK3[3:6] to special-function 3 */105s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3));106s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);107s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);108}109case 4:110for (gpio = EXYNOS4_GPK2(3); gpio <= EXYNOS4_GPK2(6); gpio++) {111/* Data pin GPK2[3:6] to special-function 2 */112s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));113s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);114s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);115}116default:117break;118}119120if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) {121s3c_gpio_cfgpin(EXYNOS4_GPK2(2), S3C_GPIO_SFN(2));122s3c_gpio_setpull(EXYNOS4_GPK2(2), S3C_GPIO_PULL_UP);123s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);124}125}126127void exynos4_setup_sdhci3_cfg_gpio(struct platform_device *dev, int width)128{129struct s3c_sdhci_platdata *pdata = dev->dev.platform_data;130unsigned int gpio;131132/* Set all the necessary GPK3[0:1] pins to special-function 2 */133for (gpio = EXYNOS4_GPK3(0); gpio < EXYNOS4_GPK3(2); gpio++) {134s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));135s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);136s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);137}138139for (gpio = EXYNOS4_GPK3(3); gpio <= EXYNOS4_GPK3(6); gpio++) {140/* Data pin GPK3[3:6] to special-function 2 */141s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));142s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);143s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);144}145146if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) {147s3c_gpio_cfgpin(EXYNOS4_GPK3(2), S3C_GPIO_SFN(2));148s3c_gpio_setpull(EXYNOS4_GPK3(2), S3C_GPIO_PULL_UP);149s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);150}151}152153154