1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun //
3*4882a593Smuzhiyun // Copyright 2009 Wolfson Microelectronics
4*4882a593Smuzhiyun // Mark Brown <broonie@opensource.wolfsonmicro.com>
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun #include <linux/kernel.h>
7*4882a593Smuzhiyun #include <linux/string.h>
8*4882a593Smuzhiyun #include <linux/platform_device.h>
9*4882a593Smuzhiyun #include <linux/dma-mapping.h>
10*4882a593Smuzhiyun #include <linux/gpio.h>
11*4882a593Smuzhiyun #include <linux/export.h>
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun #include <mach/irqs.h>
14*4882a593Smuzhiyun #include "map.h"
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun #include "devs.h"
17*4882a593Smuzhiyun #include <linux/platform_data/asoc-s3c.h>
18*4882a593Smuzhiyun #include "gpio-cfg.h"
19*4882a593Smuzhiyun #include "gpio-samsung.h"
20*4882a593Smuzhiyun
s3c64xx_i2s_cfg_gpio(struct platform_device * pdev)21*4882a593Smuzhiyun static int s3c64xx_i2s_cfg_gpio(struct platform_device *pdev)
22*4882a593Smuzhiyun {
23*4882a593Smuzhiyun unsigned int base;
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun switch (pdev->id) {
26*4882a593Smuzhiyun case 0:
27*4882a593Smuzhiyun base = S3C64XX_GPD(0);
28*4882a593Smuzhiyun break;
29*4882a593Smuzhiyun case 1:
30*4882a593Smuzhiyun base = S3C64XX_GPE(0);
31*4882a593Smuzhiyun break;
32*4882a593Smuzhiyun case 2:
33*4882a593Smuzhiyun s3c_gpio_cfgpin(S3C64XX_GPC(4), S3C_GPIO_SFN(5));
34*4882a593Smuzhiyun s3c_gpio_cfgpin(S3C64XX_GPC(5), S3C_GPIO_SFN(5));
35*4882a593Smuzhiyun s3c_gpio_cfgpin(S3C64XX_GPC(7), S3C_GPIO_SFN(5));
36*4882a593Smuzhiyun s3c_gpio_cfgpin_range(S3C64XX_GPH(6), 4, S3C_GPIO_SFN(5));
37*4882a593Smuzhiyun return 0;
38*4882a593Smuzhiyun default:
39*4882a593Smuzhiyun printk(KERN_DEBUG "Invalid I2S Controller number: %d\n",
40*4882a593Smuzhiyun pdev->id);
41*4882a593Smuzhiyun return -EINVAL;
42*4882a593Smuzhiyun }
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun s3c_gpio_cfgpin_range(base, 5, S3C_GPIO_SFN(3));
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun return 0;
47*4882a593Smuzhiyun }
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun static struct resource s3c64xx_iis0_resource[] = {
50*4882a593Smuzhiyun [0] = DEFINE_RES_MEM(S3C64XX_PA_IIS0, SZ_256),
51*4882a593Smuzhiyun };
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun static struct s3c_audio_pdata i2s0_pdata = {
54*4882a593Smuzhiyun .cfg_gpio = s3c64xx_i2s_cfg_gpio,
55*4882a593Smuzhiyun };
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun struct platform_device s3c64xx_device_iis0 = {
58*4882a593Smuzhiyun .name = "samsung-i2s",
59*4882a593Smuzhiyun .id = 0,
60*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(s3c64xx_iis0_resource),
61*4882a593Smuzhiyun .resource = s3c64xx_iis0_resource,
62*4882a593Smuzhiyun .dev = {
63*4882a593Smuzhiyun .platform_data = &i2s0_pdata,
64*4882a593Smuzhiyun },
65*4882a593Smuzhiyun };
66*4882a593Smuzhiyun EXPORT_SYMBOL(s3c64xx_device_iis0);
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun static struct resource s3c64xx_iis1_resource[] = {
69*4882a593Smuzhiyun [0] = DEFINE_RES_MEM(S3C64XX_PA_IIS1, SZ_256),
70*4882a593Smuzhiyun };
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun static struct s3c_audio_pdata i2s1_pdata = {
73*4882a593Smuzhiyun .cfg_gpio = s3c64xx_i2s_cfg_gpio,
74*4882a593Smuzhiyun };
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun struct platform_device s3c64xx_device_iis1 = {
77*4882a593Smuzhiyun .name = "samsung-i2s",
78*4882a593Smuzhiyun .id = 1,
79*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(s3c64xx_iis1_resource),
80*4882a593Smuzhiyun .resource = s3c64xx_iis1_resource,
81*4882a593Smuzhiyun .dev = {
82*4882a593Smuzhiyun .platform_data = &i2s1_pdata,
83*4882a593Smuzhiyun },
84*4882a593Smuzhiyun };
85*4882a593Smuzhiyun EXPORT_SYMBOL(s3c64xx_device_iis1);
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun static struct resource s3c64xx_iisv4_resource[] = {
88*4882a593Smuzhiyun [0] = DEFINE_RES_MEM(S3C64XX_PA_IISV4, SZ_256),
89*4882a593Smuzhiyun };
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun static struct s3c_audio_pdata i2sv4_pdata = {
92*4882a593Smuzhiyun .cfg_gpio = s3c64xx_i2s_cfg_gpio,
93*4882a593Smuzhiyun .type = {
94*4882a593Smuzhiyun .quirks = QUIRK_PRI_6CHAN,
95*4882a593Smuzhiyun },
96*4882a593Smuzhiyun };
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun struct platform_device s3c64xx_device_iisv4 = {
99*4882a593Smuzhiyun .name = "samsung-i2s",
100*4882a593Smuzhiyun .id = 2,
101*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(s3c64xx_iisv4_resource),
102*4882a593Smuzhiyun .resource = s3c64xx_iisv4_resource,
103*4882a593Smuzhiyun .dev = {
104*4882a593Smuzhiyun .platform_data = &i2sv4_pdata,
105*4882a593Smuzhiyun },
106*4882a593Smuzhiyun };
107*4882a593Smuzhiyun EXPORT_SYMBOL(s3c64xx_device_iisv4);
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun /* PCM Controller platform_devices */
111*4882a593Smuzhiyun
s3c64xx_pcm_cfg_gpio(struct platform_device * pdev)112*4882a593Smuzhiyun static int s3c64xx_pcm_cfg_gpio(struct platform_device *pdev)
113*4882a593Smuzhiyun {
114*4882a593Smuzhiyun unsigned int base;
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun switch (pdev->id) {
117*4882a593Smuzhiyun case 0:
118*4882a593Smuzhiyun base = S3C64XX_GPD(0);
119*4882a593Smuzhiyun break;
120*4882a593Smuzhiyun case 1:
121*4882a593Smuzhiyun base = S3C64XX_GPE(0);
122*4882a593Smuzhiyun break;
123*4882a593Smuzhiyun default:
124*4882a593Smuzhiyun printk(KERN_DEBUG "Invalid PCM Controller number: %d\n",
125*4882a593Smuzhiyun pdev->id);
126*4882a593Smuzhiyun return -EINVAL;
127*4882a593Smuzhiyun }
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun s3c_gpio_cfgpin_range(base, 5, S3C_GPIO_SFN(2));
130*4882a593Smuzhiyun return 0;
131*4882a593Smuzhiyun }
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun static struct resource s3c64xx_pcm0_resource[] = {
134*4882a593Smuzhiyun [0] = DEFINE_RES_MEM(S3C64XX_PA_PCM0, SZ_256),
135*4882a593Smuzhiyun };
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun static struct s3c_audio_pdata s3c_pcm0_pdata = {
138*4882a593Smuzhiyun .cfg_gpio = s3c64xx_pcm_cfg_gpio,
139*4882a593Smuzhiyun };
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun struct platform_device s3c64xx_device_pcm0 = {
142*4882a593Smuzhiyun .name = "samsung-pcm",
143*4882a593Smuzhiyun .id = 0,
144*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(s3c64xx_pcm0_resource),
145*4882a593Smuzhiyun .resource = s3c64xx_pcm0_resource,
146*4882a593Smuzhiyun .dev = {
147*4882a593Smuzhiyun .platform_data = &s3c_pcm0_pdata,
148*4882a593Smuzhiyun },
149*4882a593Smuzhiyun };
150*4882a593Smuzhiyun EXPORT_SYMBOL(s3c64xx_device_pcm0);
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun static struct resource s3c64xx_pcm1_resource[] = {
153*4882a593Smuzhiyun [0] = DEFINE_RES_MEM(S3C64XX_PA_PCM1, SZ_256),
154*4882a593Smuzhiyun };
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun static struct s3c_audio_pdata s3c_pcm1_pdata = {
157*4882a593Smuzhiyun .cfg_gpio = s3c64xx_pcm_cfg_gpio,
158*4882a593Smuzhiyun };
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun struct platform_device s3c64xx_device_pcm1 = {
161*4882a593Smuzhiyun .name = "samsung-pcm",
162*4882a593Smuzhiyun .id = 1,
163*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(s3c64xx_pcm1_resource),
164*4882a593Smuzhiyun .resource = s3c64xx_pcm1_resource,
165*4882a593Smuzhiyun .dev = {
166*4882a593Smuzhiyun .platform_data = &s3c_pcm1_pdata,
167*4882a593Smuzhiyun },
168*4882a593Smuzhiyun };
169*4882a593Smuzhiyun EXPORT_SYMBOL(s3c64xx_device_pcm1);
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun /* AC97 Controller platform devices */
172*4882a593Smuzhiyun
s3c64xx_ac97_cfg_gpd(struct platform_device * pdev)173*4882a593Smuzhiyun static int s3c64xx_ac97_cfg_gpd(struct platform_device *pdev)
174*4882a593Smuzhiyun {
175*4882a593Smuzhiyun return s3c_gpio_cfgpin_range(S3C64XX_GPD(0), 5, S3C_GPIO_SFN(4));
176*4882a593Smuzhiyun }
177*4882a593Smuzhiyun
s3c64xx_ac97_cfg_gpe(struct platform_device * pdev)178*4882a593Smuzhiyun static int s3c64xx_ac97_cfg_gpe(struct platform_device *pdev)
179*4882a593Smuzhiyun {
180*4882a593Smuzhiyun return s3c_gpio_cfgpin_range(S3C64XX_GPE(0), 5, S3C_GPIO_SFN(4));
181*4882a593Smuzhiyun }
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun static struct resource s3c64xx_ac97_resource[] = {
184*4882a593Smuzhiyun [0] = DEFINE_RES_MEM(S3C64XX_PA_AC97, SZ_256),
185*4882a593Smuzhiyun [1] = DEFINE_RES_IRQ(IRQ_AC97),
186*4882a593Smuzhiyun };
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun static struct s3c_audio_pdata s3c_ac97_pdata = {
189*4882a593Smuzhiyun };
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun static u64 s3c64xx_ac97_dmamask = DMA_BIT_MASK(32);
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun struct platform_device s3c64xx_device_ac97 = {
194*4882a593Smuzhiyun .name = "samsung-ac97",
195*4882a593Smuzhiyun .id = -1,
196*4882a593Smuzhiyun .num_resources = ARRAY_SIZE(s3c64xx_ac97_resource),
197*4882a593Smuzhiyun .resource = s3c64xx_ac97_resource,
198*4882a593Smuzhiyun .dev = {
199*4882a593Smuzhiyun .platform_data = &s3c_ac97_pdata,
200*4882a593Smuzhiyun .dma_mask = &s3c64xx_ac97_dmamask,
201*4882a593Smuzhiyun .coherent_dma_mask = DMA_BIT_MASK(32),
202*4882a593Smuzhiyun },
203*4882a593Smuzhiyun };
204*4882a593Smuzhiyun EXPORT_SYMBOL(s3c64xx_device_ac97);
205*4882a593Smuzhiyun
s3c64xx_ac97_setup_gpio(int num)206*4882a593Smuzhiyun void __init s3c64xx_ac97_setup_gpio(int num)
207*4882a593Smuzhiyun {
208*4882a593Smuzhiyun if (num == S3C64XX_AC97_GPD)
209*4882a593Smuzhiyun s3c_ac97_pdata.cfg_gpio = s3c64xx_ac97_cfg_gpd;
210*4882a593Smuzhiyun else
211*4882a593Smuzhiyun s3c_ac97_pdata.cfg_gpio = s3c64xx_ac97_cfg_gpe;
212*4882a593Smuzhiyun }
213