Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/arm/mach-exynos4/setup-sdhci-gpio.c
10817 views
1
/* linux/arch/arm/mach-exynos4/setup-sdhci-gpio.c
2
*
3
* Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
4
* http://www.samsung.com
5
*
6
* EXYNOS4 - Helper functions for setting up SDHCI device(s) GPIO (HSMMC)
7
*
8
* This program is free software; you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License version 2 as
10
* published by the Free Software Foundation.
11
*/
12
13
#include <linux/kernel.h>
14
#include <linux/types.h>
15
#include <linux/interrupt.h>
16
#include <linux/platform_device.h>
17
#include <linux/io.h>
18
#include <linux/gpio.h>
19
#include <linux/mmc/host.h>
20
#include <linux/mmc/card.h>
21
22
#include <plat/gpio-cfg.h>
23
#include <plat/regs-sdhci.h>
24
#include <plat/sdhci.h>
25
26
void exynos4_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width)
27
{
28
struct s3c_sdhci_platdata *pdata = dev->dev.platform_data;
29
unsigned int gpio;
30
31
/* Set all the necessary GPK0[0:1] pins to special-function 2 */
32
for (gpio = EXYNOS4_GPK0(0); gpio < EXYNOS4_GPK0(2); gpio++) {
33
s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
34
s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
35
s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
36
}
37
38
switch (width) {
39
case 8:
40
for (gpio = EXYNOS4_GPK1(3); gpio <= EXYNOS4_GPK1(6); gpio++) {
41
/* Data pin GPK1[3:6] to special-function 3 */
42
s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3));
43
s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);
44
s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
45
}
46
case 4:
47
for (gpio = EXYNOS4_GPK0(3); gpio <= EXYNOS4_GPK0(6); gpio++) {
48
/* Data pin GPK0[3:6] to special-function 2 */
49
s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
50
s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);
51
s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
52
}
53
default:
54
break;
55
}
56
57
if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) {
58
s3c_gpio_cfgpin(EXYNOS4_GPK0(2), S3C_GPIO_SFN(2));
59
s3c_gpio_setpull(EXYNOS4_GPK0(2), S3C_GPIO_PULL_UP);
60
s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
61
}
62
}
63
64
void exynos4_setup_sdhci1_cfg_gpio(struct platform_device *dev, int width)
65
{
66
struct s3c_sdhci_platdata *pdata = dev->dev.platform_data;
67
unsigned int gpio;
68
69
/* Set all the necessary GPK1[0:1] pins to special-function 2 */
70
for (gpio = EXYNOS4_GPK1(0); gpio < EXYNOS4_GPK1(2); gpio++) {
71
s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
72
s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
73
s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
74
}
75
76
for (gpio = EXYNOS4_GPK1(3); gpio <= EXYNOS4_GPK1(6); gpio++) {
77
/* Data pin GPK1[3:6] to special-function 2 */
78
s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
79
s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);
80
s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
81
}
82
83
if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) {
84
s3c_gpio_cfgpin(EXYNOS4_GPK1(2), S3C_GPIO_SFN(2));
85
s3c_gpio_setpull(EXYNOS4_GPK1(2), S3C_GPIO_PULL_UP);
86
s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
87
}
88
}
89
90
void exynos4_setup_sdhci2_cfg_gpio(struct platform_device *dev, int width)
91
{
92
struct s3c_sdhci_platdata *pdata = dev->dev.platform_data;
93
unsigned int gpio;
94
95
/* Set all the necessary GPK2[0:1] pins to special-function 2 */
96
for (gpio = EXYNOS4_GPK2(0); gpio < EXYNOS4_GPK2(2); gpio++) {
97
s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
98
s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
99
s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
100
}
101
102
switch (width) {
103
case 8:
104
for (gpio = EXYNOS4_GPK3(3); gpio <= EXYNOS4_GPK3(6); gpio++) {
105
/* Data pin GPK3[3:6] to special-function 3 */
106
s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3));
107
s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);
108
s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
109
}
110
case 4:
111
for (gpio = EXYNOS4_GPK2(3); gpio <= EXYNOS4_GPK2(6); gpio++) {
112
/* Data pin GPK2[3:6] to special-function 2 */
113
s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
114
s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);
115
s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
116
}
117
default:
118
break;
119
}
120
121
if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) {
122
s3c_gpio_cfgpin(EXYNOS4_GPK2(2), S3C_GPIO_SFN(2));
123
s3c_gpio_setpull(EXYNOS4_GPK2(2), S3C_GPIO_PULL_UP);
124
s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
125
}
126
}
127
128
void exynos4_setup_sdhci3_cfg_gpio(struct platform_device *dev, int width)
129
{
130
struct s3c_sdhci_platdata *pdata = dev->dev.platform_data;
131
unsigned int gpio;
132
133
/* Set all the necessary GPK3[0:1] pins to special-function 2 */
134
for (gpio = EXYNOS4_GPK3(0); gpio < EXYNOS4_GPK3(2); gpio++) {
135
s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
136
s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE);
137
s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
138
}
139
140
for (gpio = EXYNOS4_GPK3(3); gpio <= EXYNOS4_GPK3(6); gpio++) {
141
/* Data pin GPK3[3:6] to special-function 2 */
142
s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2));
143
s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP);
144
s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
145
}
146
147
if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) {
148
s3c_gpio_cfgpin(EXYNOS4_GPK3(2), S3C_GPIO_SFN(2));
149
s3c_gpio_setpull(EXYNOS4_GPK3(2), S3C_GPIO_PULL_UP);
150
s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4);
151
}
152
}
153
154