change source file mode to 0644 instead of 0755
[profile/mobile/platform/kernel/u-boot-tm1.git] / arch / arm / include / asm / arch-sc9630 / __sprd_audio_sc9630.h
1 /*
2  * Copyright (C) 2012 Spreadtrum Communications Inc.
3  *
4  * This software is licensed under the terms of the GNU General Public
5  * License version 2, as published by the Free Software Foundation, and
6  * may be copied, distributed, and modified under those terms.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  */
13
14 #ifndef __ASM_ARCH_AUDIO_GLB_SC9630_H
15 #define __ASM_ARCH_AUDIO_GLB_SC9630_H
16
17 #ifndef __ASM_ARCH_AUDIO_GLB_H
18 #error  "Don't include this file directly, include <mach/sprd-audio.h>"
19 #endif
20 #include <common.h>
21 #include <errno.h>
22 #include <ubi_uboot.h>
23 #include <asm/arch/sprd_reg.h>
24 #include <asm/arch/sci.h>
25 #include <asm/arch/adi.h>
26
27 #ifdef CONFIG_SOUND_USE_DMA
28 #include <asm/arch/dma.h>
29 #endif
30 #ifdef CONFIG_SOUND_USE_INT
31 #include <mach/irqs.h>
32 #endif
33
34 /* OKAY, this is for other else owner
35    if you do not care the audio config
36    you can set FIXED_AUDIO  to 0
37    for compile happy.
38 */
39 /* FIXME */
40 #define FIXED_AUDIO 1
41
42 enum {
43         AUDIO_NO_CHANGE,
44         AUDIO_TO_CP0_DSP_CTRL,
45         AUDIO_TO_CP1_DSP_CTRL,
46         AUDIO_TO_AP_ARM_CTRL,
47         AUDIO_TO_CP0_ARM_CTRL,
48         AUDIO_TO_CP1_ARM_CTRL,
49         AUDIO_TO_CP2_ARM_CTRL,
50 };
51
52 #if FIXED_AUDIO
53
54 #ifdef SPRD_VBC_BASE
55 #undef SPRD_VBC_BASE
56 #endif
57 #define SPRD_VBC_BASE SPRD_VBC_PHYS
58
59 #ifdef SPRD_AUDIO_BASE
60 #undef SPRD_AUDIO_BASE
61 #endif
62 #define SPRD_AUDIO_BASE SPRD_AUDIO_PHYS
63
64 #ifdef SPRD_ADI_BASE
65 #undef SPRD_ADI_BASE
66 #endif
67 #define SPRD_ADI_BASE SPRD_ADI_PHYS
68
69 #define VBC_BASE                SPRD_VBC_BASE
70 #define CODEC_DP_BASE           SPRD_AUDIO_BASE
71 #define CODEC_AP_BASE           (SPRD_ADI_BASE + 0x8600)
72 #define VBC_PHY_BASE            SPRD_VBC_PHYS
73 #define CODEC_DP_PHY_BASE       SPRD_AUDIO_PHYS
74 #define CODEC_AP_PHY_BASE       (SPRD_ADI_PHYS + 0x8600)
75 #ifdef CONFIG_SOUND_USE_INT
76 #define CODEC_AP_IRQ            (IRQ_ANA_INT)
77 #define CODEC_DP_IRQ            (IRQ_REQ_AUD_INT)
78 #endif
79
80 #ifdef CONFIG_SPRD_AUDIO_BUFFER_USE_IRAM
81 #define SPRD_IRAM_ALL_PHYS      0X00000000
82 #define SPRD_IRAM_ALL_SIZE      SZ_32K
83 #endif
84
85 #define CLASS_G_LDO_ID                  LDO_LDO_CLSG
86 #endif
87
88 /* ------------------------------------------------------------------------- */
89
90 /* NOTE: all function maybe will call by atomic funtion
91          don NOT any complex oprations. Just register.
92 return
93    0:   unchanged
94    1:   changed
95    ohter error
96 */
97 /* vbc setting */
98
99 static inline int arch_audio_vbc_reg_enable(void)
100 {
101         int ret = 0;
102
103 #if FIXED_AUDIO
104         sci_glb_set(REG_AON_APB_APB_EB0, BIT_VBC_EB);
105 #endif
106
107         return ret;
108 }
109
110 static inline int arch_audio_vbc_reg_disable(void)
111 {
112         int ret = 0;
113
114 #if FIXED_AUDIO
115         sci_glb_clr(REG_AON_APB_APB_EB0, BIT_VBC_EB);
116 #endif
117
118         return ret;
119 }
120
121 static inline int arch_audio_vbc_enable(void)
122 {
123         int ret = 0;
124
125 #if FIXED_AUDIO
126         //sci_glb_set(REG_GLB_BUSCLK, BIT_ARM_VBC_ANAON);
127 #endif
128
129         return ret;
130 }
131
132 static inline int arch_audio_vbc_disable(void)
133 {
134         int ret = 0;
135
136 #if FIXED_AUDIO
137         //sci_glb_clr(REG_GLB_BUSCLK, BIT_ARM_VBC_ANAON);
138 #endif
139
140         return ret;
141 }
142
143 static inline int arch_audio_vbc_switch(int master)
144 {
145         int ret = 0;
146 #if FIXED_AUDIO
147         int val = 0;
148         int mask =
149             BITS_VBC_AFIFO_INT_SYS_SEL(3) | BITS_VBC_DA01_INT_SYS_SEL(3) |
150             BITS_VBC_AD01_INT_SYS_SEL(3)
151             | BITS_VBC_AD23_INT_SYS_SEL(3) | BITS_VBC_DA01_DMA_SYS_SEL(3) |
152             BITS_VBC_AD01_DMA_SYS_SEL(3)
153             | BITS_VBC_AD23_DMA_SYS_SEL(3);
154
155         switch (master) {
156         case AUDIO_TO_AP_ARM_CTRL:
157                 val =
158                     BITS_VBC_AFIFO_INT_SYS_SEL(0) | BITS_VBC_DA01_INT_SYS_SEL(0)
159                     | BITS_VBC_AD01_INT_SYS_SEL(0)
160                     | BITS_VBC_AD23_INT_SYS_SEL(0) |
161                     BITS_VBC_DA01_DMA_SYS_SEL(0) | BITS_VBC_AD01_DMA_SYS_SEL(0)
162                     | BITS_VBC_AD23_DMA_SYS_SEL(0);
163                 sci_glb_write(REG_AON_APB_VBC_CTRL, val, mask);
164                 break;
165         case AUDIO_TO_CP0_DSP_CTRL:
166                 val =
167                     BITS_VBC_AFIFO_INT_SYS_SEL(1) | BITS_VBC_DA01_INT_SYS_SEL(1)
168                     | BITS_VBC_AD01_INT_SYS_SEL(1)
169                     | BITS_VBC_AD23_INT_SYS_SEL(1) |
170                     BITS_VBC_DA01_DMA_SYS_SEL(1) | BITS_VBC_AD01_DMA_SYS_SEL(1)
171                     | BITS_VBC_AD23_DMA_SYS_SEL(1);
172                 sci_glb_write(REG_AON_APB_VBC_CTRL, val, mask);
173                 sci_glb_write(REG_AON_APB_VBC_CTRL, 0,
174                         (BIT_VBC_DMA_CP0_ARM_SEL |
175                                BIT_VBC_DMA_CP0_ARM_SEL));
176                 break;
177         case AUDIO_TO_CP1_DSP_CTRL:
178                 val =
179                     BITS_VBC_AFIFO_INT_SYS_SEL(2) | BITS_VBC_DA01_INT_SYS_SEL(2)
180                     | BITS_VBC_AD01_INT_SYS_SEL(2)
181                     | BITS_VBC_AD23_INT_SYS_SEL(2) |
182                     BITS_VBC_DA01_DMA_SYS_SEL(2) | BITS_VBC_AD01_DMA_SYS_SEL(2)
183                     | BITS_VBC_AD23_DMA_SYS_SEL(2);
184                 sci_glb_write(REG_AON_APB_VBC_CTRL, val, mask);
185                 sci_glb_write(REG_AON_APB_VBC_CTRL, 0,
186                               (BIT_VBC_DMA_CP1_ARM_SEL |
187                                BIT_VBC_DMA_CP1_ARM_SEL));
188                 break;
189         case AUDIO_TO_CP0_ARM_CTRL:
190                 val =
191                     BITS_VBC_AFIFO_INT_SYS_SEL(1) | BITS_VBC_DA01_INT_SYS_SEL(1)
192                     | BITS_VBC_AD01_INT_SYS_SEL(1)
193                     | BITS_VBC_AD23_INT_SYS_SEL(1) |
194                     BITS_VBC_DA01_DMA_SYS_SEL(1) | BITS_VBC_AD01_DMA_SYS_SEL(1)
195                     | BITS_VBC_AD23_DMA_SYS_SEL(1);
196                 sci_glb_write(REG_AON_APB_VBC_CTRL,
197                               (val | BIT_VBC_INT_CP0_ARM_SEL |
198                                BIT_VBC_DMA_CP0_ARM_SEL),
199                               (mask | BIT_VBC_INT_CP0_ARM_SEL |
200                                BIT_VBC_DMA_CP0_ARM_SEL));
201                 break;
202         case AUDIO_TO_CP1_ARM_CTRL:
203                 val =
204                     BITS_VBC_AFIFO_INT_SYS_SEL(2) | BITS_VBC_DA01_INT_SYS_SEL(2)
205                     | BITS_VBC_AD01_INT_SYS_SEL(2)
206                     | BITS_VBC_AD23_INT_SYS_SEL(2) |
207                     BITS_VBC_DA01_DMA_SYS_SEL(2) | BITS_VBC_AD01_DMA_SYS_SEL(2)
208                     | BITS_VBC_AD23_DMA_SYS_SEL(2);
209                 sci_glb_write(REG_AON_APB_VBC_CTRL,
210                               (val | BIT_VBC_INT_CP1_ARM_SEL |
211                                BIT_VBC_DMA_CP1_ARM_SEL),
212                               (mask | BIT_VBC_INT_CP1_ARM_SEL |
213                                BIT_VBC_DMA_CP1_ARM_SEL));
214                 break;
215         case AUDIO_TO_CP2_ARM_CTRL:
216                 val =
217                     BITS_VBC_AFIFO_INT_SYS_SEL(3) | BITS_VBC_DA01_INT_SYS_SEL(3)
218                     | BITS_VBC_AD01_INT_SYS_SEL(3)
219                     | BITS_VBC_AD23_INT_SYS_SEL(3) |
220                     BITS_VBC_DA01_DMA_SYS_SEL(3) | BITS_VBC_AD01_DMA_SYS_SEL(3)
221                     | BITS_VBC_AD23_DMA_SYS_SEL(3);
222                 sci_glb_write(REG_AON_APB_VBC_CTRL, val, mask);
223                 break;
224         case AUDIO_NO_CHANGE:
225                 ret =
226                     sci_glb_read(REG_AON_APB_VBC_CTRL,
227                                  BITS_VBC_DA01_INT_SYS_SEL(3));
228                 if (ret == 0) {
229                         ret = AUDIO_TO_AP_ARM_CTRL;
230                 } else if (ret == 1) {
231                         ret =
232                             sci_glb_read(REG_AON_APB_VBC_CTRL,
233                                          BIT_VBC_INT_CP0_ARM_SEL);
234                         if (ret)
235                                 ret = AUDIO_TO_CP0_ARM_CTRL;
236                         else
237                                 ret = AUDIO_TO_CP0_DSP_CTRL;
238                 } else if (ret == 2) {
239                         ret =
240                             sci_glb_read(REG_AON_APB_VBC_CTRL,
241                                          BIT_VBC_INT_CP1_ARM_SEL);
242                         if (ret)
243                                 ret = AUDIO_TO_CP1_ARM_CTRL;
244                         else
245                                 ret = AUDIO_TO_CP1_DSP_CTRL;
246                 } else if (ret == 3) {
247                         ret = AUDIO_TO_CP2_ARM_CTRL;
248                 }
249                 break;
250         default:
251                 ret = -ENODEV;
252                 break;
253         }
254 #endif
255
256         return ret;
257 }
258
259 static inline int arch_audio_vbc_da_dma_info(int chan)
260 {
261         int ret = 0;
262
263 #if FIXED_AUDIO
264 #ifdef CONFIG_SOUND_USE_DMA
265         switch (chan) {
266         case 0:
267                 ret = DMA_VB_DA0;
268                 break;
269         case 1:
270                 ret = DMA_VB_DA1;
271                 break;
272         default:
273                 ret = -ENODEV;
274                 break;
275         }
276 #endif
277 #endif
278
279         return ret;
280 }
281
282 static inline int arch_audio_vbc_ad_dma_info(int chan)
283 {
284         int ret = 0;
285
286 #if FIXED_AUDIO
287 #ifdef CONFIG_SOUND_USE_DMA
288         switch (chan) {
289         case 0:
290                 ret = DMA_VB_AD0;
291                 break;
292         case 1:
293                 ret = DMA_VB_AD1;
294                 break;
295         default:
296                 ret = -ENODEV;
297                 break;
298         }
299 #endif
300 #endif
301
302         return ret;
303 }
304
305 static inline int arch_audio_vbc_ad23_dma_info(int chan)
306 {
307         int ret = 0;
308
309 #if FIXED_AUDIO
310 #ifdef CONFIG_SOUND_USE_DMA
311         switch (chan) {
312         case 0:
313                 ret = DMA_VB_AD2;
314                 break;
315         case 1:
316                 ret = DMA_VB_AD3;
317                 break;
318         default:
319                 ret = -ENODEV;
320                 break;
321         }
322 #endif
323 #endif
324
325         return ret;
326 }
327
328 static inline int arch_audio_vbc_reset(void)
329 {
330         int ret = 0;
331
332 #if FIXED_AUDIO
333         sci_glb_set(REG_AON_APB_APB_RST0, BIT_VBC_SOFT_RST);
334         udelay(10);
335         sci_glb_clr(REG_AON_APB_APB_RST0, BIT_VBC_SOFT_RST);
336 #endif
337
338         return ret;
339 }
340
341 #if 1
342 /* some SOC will move this into vbc module */
343 static inline int arch_audio_vbc_ad_int_clr(void)
344 {
345         int ret = 0;
346
347 #if FIXED_AUDIO
348 #ifdef CONFIG_SOUND_USE_INT
349         sci_glb_set((SPRD_INTC0_BASE + 0x0C), IRQ_REQ_AUD_VBC_AD01_INT);
350 #endif
351 #endif
352
353         return ret;
354 }
355
356 static inline int arch_audio_vbc_ad23_int_clr(void)
357 {
358         int ret = 0;
359
360 #if FIXED_AUDIO
361 #ifdef CONFIG_SOUND_USE_INT
362         sci_glb_set((SPRD_INTC0_BASE + 0x0C), IRQ_REQ_AUD_VBC_AD23_INT);
363 #endif
364 #endif
365
366         return ret;
367 }
368
369 /* some SOC will move this into vbc module */
370 static inline int arch_audio_vbc_da_int_clr(void)
371 {
372         int ret = 0;
373
374 #if FIXED_AUDIO
375 #ifdef CONFIG_SOUND_USE_INT
376         sci_glb_set((SPRD_INTC0_BASE + 0x0C), IRQ_REQ_AUD_VBC_DA_INT);
377 #endif
378 #endif
379         return ret;
380 }
381
382 /* some SOC will move this into vbc module */
383 static inline int arch_audio_vbc_is_ad_int(void)
384 {
385         int ret = 0;
386
387 #if FIXED_AUDIO
388 #ifdef CONFIG_SOUND_USE_INT
389         sci_glb_read((SPRD_INTC0_BASE + 0x0), IRQ_REQ_AUD_VBC_AD01_INT);
390 #endif
391 #endif
392
393         return ret;
394 }
395
396 /* some SOC will move this into vbc module */
397 static inline int arch_audio_vbc_is_ad23_int(void)
398 {
399         int ret = 0;
400
401 #if FIXED_AUDIO
402 #ifdef CONFIG_SOUND_USE_INT
403         sci_glb_read((SPRD_INTC0_BASE + 0x0), IRQ_REQ_AUD_VBC_AD23_INT);
404 #endif
405 #endif
406
407         return ret;
408 }
409
410 /* some SOC will move this into vbc module */
411 static inline int arch_audio_vbc_is_da_int(void)
412 {
413         int ret = 0;
414
415 #if FIXED_AUDIO
416 #ifdef CONFIG_SOUND_USE_INT
417         sci_glb_read((SPRD_INTC0_BASE + 0x0), IRQ_REQ_AUD_VBC_DA_INT);
418 #endif
419 #endif
420
421         return ret;
422 }
423 #endif
424 /* ------------------------------------------------------------------------- */
425
426 /* codec setting */
427 static inline int arch_audio_codec_write_mask(int reg, int val, int mask)
428 {
429         int ret = 0;
430
431 #if FIXED_AUDIO
432         ret = sci_adi_write(reg, val, mask);
433 #endif
434
435         return ret;
436 }
437
438 static inline int arch_audio_codec_write(int reg, int val)
439 {
440         int ret = 0;
441
442 #if FIXED_AUDIO
443         ret = sci_adi_write(reg, val, 0xFFFF);
444 #endif
445
446         return ret;
447 }
448
449 static inline int arch_audio_codec_read(int reg)
450 {
451         int ret = 0;
452
453 #if FIXED_AUDIO
454         ret = sci_adi_read(reg);
455 #endif
456
457         return ret;
458 }
459
460 static inline int arch_audio_codec_audif_enable(int auto_clk)
461 {
462         int ret = 0;
463
464 #if FIXED_AUDIO
465         if (auto_clk) {
466                 sci_glb_clr(REG_AON_APB_APB_EB0, BIT_AUDIF_EB);
467                 sci_glb_set(REG_AON_APB_VBC_CTRL, BIT_AUDIF_CKG_AUTO_EN);
468         } else {
469                 sci_glb_set(REG_AON_APB_APB_EB0, BIT_AUDIF_EB);
470                 sci_glb_clr(REG_AON_APB_VBC_CTRL, BIT_AUDIF_CKG_AUTO_EN);
471         }
472 #endif
473
474         return ret;
475 }
476
477 static inline int arch_audio_codec_audif_disable(void)
478 {
479         int ret = 0;
480
481 #if FIXED_AUDIO
482         sci_glb_clr(REG_AON_APB_APB_EB0, BIT_AUDIF_EB);
483         sci_glb_clr(REG_AON_APB_VBC_CTRL, BIT_AUDIF_CKG_AUTO_EN);
484 #endif
485
486         return ret;
487 }
488
489 static inline int arch_audio_codec_digital_reg_enable(void)
490 {
491         int ret = 0;
492
493 #if FIXED_AUDIO
494         ret = sci_glb_set(REG_AON_APB_APB_EB0, BIT_AUD_EB);
495         if (ret >= 0)
496                 arch_audio_codec_audif_enable(1);
497 #endif
498
499         return ret;
500 }
501
502 static inline int arch_audio_codec_digital_reg_disable(void)
503 {
504         int ret = 0;
505
506 #if FIXED_AUDIO
507         arch_audio_codec_audif_disable();
508         sci_glb_clr(REG_AON_APB_APB_EB0, BIT_AUD_EB);
509 #endif
510
511         return ret;
512 }
513
514 static inline int arch_audio_codec_analog_reg_enable(void)
515 {
516         int ret = 0;
517
518 #if FIXED_AUDIO
519         ret =
520                 sci_adi_write(ANA_REG_GLB_ARM_MODULE_EN, BIT_ANA_AUD_EN,
521                                                 BIT_ANA_AUD_EN);
522 #endif
523
524         return ret;
525 }
526
527 static inline int arch_audio_codec_analog_reg_disable(void)
528 {
529         int ret = 0;
530
531 #if FIXED_AUDIO
532         ret = sci_adi_write(ANA_REG_GLB_ARM_MODULE_EN, 0, BIT_ANA_AUD_EN);
533 #endif
534
535         return ret;
536 }
537
538 static inline int arch_audio_codec_enable(void)
539 {
540         int ret = 0;
541
542 #if FIXED_AUDIO
543         /*AUDIF , 6.5M*/
544         int mask = BIT_CLK_AUD_6P5M_EN | BIT_CLK_AUDIF_EN;
545         sci_adi_write(ANA_REG_GLB_ARM_CLK_EN, mask, mask);
546 #if defined(CONFIG_SPX15)|| defined(CONFIG_ARCH_SCX35L)
547         sci_adi_write(ANA_REG_GLB_AUDIO_CTRL0, BIT_CLK_AUD_6P5M_TX_INV_EN, BIT_CLK_AUD_6P5M_TX_INV_EN);
548 #else
549         sci_adi_write(ANA_REG_GLB_AUDIO_CTRL, BIT_CLK_AUD_6P5M_TX_INV_EN, BIT_CLK_AUD_6P5M_TX_INV_EN);
550 #endif
551         /*RTC*/
552         sci_adi_write(ANA_REG_GLB_RTC_CLK_EN, BIT_RTC_AUD_EN, BIT_RTC_AUD_EN);
553         /*26M*/
554         sci_adi_write(ANA_REG_GLB_XTL_WAIT_CTRL, BIT_XTL_EN, BIT_XTL_EN);
555         /*internal digital 26M enable*/
556         sci_glb_write(REG_AON_APB_SINDRV_CTRL,  (BIT_SINDRV_ENA |BIT_SINDRV_ENA_SQUARE), (BIT_SINDRV_ENA |BIT_SINDRV_ENA_SQUARE));
557
558 #endif
559
560         return ret;
561 }
562
563 static inline int arch_audio_codec_disable(void)
564 {
565         int ret = 0;
566
567 #if FIXED_AUDIO
568         /*AUDIF , 6.5M*/
569         int mask = BIT_CLK_AUD_6P5M_EN | BIT_CLK_AUDIF_EN;
570         sci_adi_write(ANA_REG_GLB_ARM_CLK_EN, 0, mask);
571 #if defined(CONFIG_SPX15)||defined(CONFIG_ARCH_SCX35L)
572         sci_adi_write(ANA_REG_GLB_AUDIO_CTRL0, BIT_CLK_AUD_6P5M_TX_INV_EN, BIT_CLK_AUD_6P5M_TX_INV_EN);
573 #else
574         sci_adi_write(ANA_REG_GLB_AUDIO_CTRL, BIT_CLK_AUD_6P5M_TX_INV_EN, BIT_CLK_AUD_6P5M_TX_INV_EN);
575 #endif
576
577         /*RTC*/
578         sci_adi_write(ANA_REG_GLB_RTC_CLK_EN, 0, BIT_RTC_AUD_EN);
579         /*26M*/
580         sci_adi_write(ANA_REG_GLB_XTL_WAIT_CTRL, 0, BIT_XTL_EN);
581         /*internal digital 26M enable*/
582         sci_glb_write(REG_AON_APB_SINDRV_CTRL,  0,  (BIT_SINDRV_ENA |BIT_SINDRV_ENA_SQUARE));
583 #endif
584
585         return ret;
586 }
587
588 static inline int arch_audio_codec_switch(int master)
589 {
590         int ret = 0;
591
592 #if FIXED_AUDIO
593         switch (master) {
594         case AUDIO_TO_AP_ARM_CTRL:
595                 sci_glb_write(REG_AON_APB_VBC_CTRL, BITS_AUD_INT_SYS_SEL(0),
596                               BITS_AUD_INT_SYS_SEL(3));
597                 break;
598         case AUDIO_TO_CP0_ARM_CTRL:
599                 sci_glb_write(REG_AON_APB_VBC_CTRL, BITS_AUD_INT_SYS_SEL(1),
600                               BITS_AUD_INT_SYS_SEL(3));
601                 break;
602         case AUDIO_TO_CP1_ARM_CTRL:
603                 sci_glb_write(REG_AON_APB_VBC_CTRL, BITS_AUD_INT_SYS_SEL(2),
604                               BITS_AUD_INT_SYS_SEL(3));
605                 break;
606         case AUDIO_TO_CP2_ARM_CTRL:
607                 sci_glb_write(REG_AON_APB_VBC_CTRL, BITS_AUD_INT_SYS_SEL(3),
608                               BITS_AUD_INT_SYS_SEL(3));
609                 break;
610         case AUDIO_NO_CHANGE:
611                 ret =
612                     sci_glb_read(REG_AON_APB_VBC_CTRL, BITS_AUD_INT_SYS_SEL(3));
613                 if (ret == 0) {
614                         ret = AUDIO_TO_AP_ARM_CTRL;
615                 } else if (ret == 1) {
616                         ret = AUDIO_TO_CP0_ARM_CTRL;
617                 } else if (ret == 2) {
618                         ret = AUDIO_TO_CP1_ARM_CTRL;
619                 } else if (ret == 3) {
620                         ret = AUDIO_TO_CP2_ARM_CTRL;
621                 }
622                 break;
623         default:
624                 ret = -ENODEV;
625                 break;
626         }
627 #endif
628
629         return ret;
630 }
631
632 static inline int arch_audio_codec_reset(void)
633 {
634         int ret = 0;
635
636 #if FIXED_AUDIO
637         int mask =
638             BIT_ANA_AUD_SOFT_RST | BIT_ANA_AUDTX_SOFT_RST |
639             BIT_ANA_AUDRX_SOFT_RST;
640         sci_glb_set(REG_AON_APB_APB_RST0, BIT_AUD_SOFT_RST);
641         sci_glb_set(REG_AON_APB_APB_RST0, BIT_AUDIF_SOFT_RST);
642         ret = sci_adi_write(ANA_REG_GLB_ARM_RST, mask, mask);
643         udelay(10);
644         sci_glb_clr(REG_AON_APB_APB_RST0, BIT_AUD_SOFT_RST);
645         sci_glb_clr(REG_AON_APB_APB_RST0, BIT_AUDIF_SOFT_RST);
646         if (ret >= 0)
647                 ret = sci_adi_write(ANA_REG_GLB_ARM_RST, 0, mask);
648 #endif
649         return ret;
650 }
651
652 static inline int arch_audio_codec_loop_enable(void)
653 {
654         sci_adi_write(ANA_REG_GLB_ARM_CLK_EN, BIT_CLK_AUD_LOOP_EN, BIT_CLK_AUD_LOOP_EN);
655 }
656
657 static inline int arch_audio_codec_loop_disable(void)
658 {
659         sci_adi_write(ANA_REG_GLB_ARM_CLK_EN, 0, BIT_CLK_AUD_LOOP_EN);
660 }
661
662 /* ------------------------------------------------------------------------- */
663
664 /* i2s setting */
665
666 static inline int arch_audio_i2s_enable(int id)
667 {
668         int ret = 0;
669
670 #if FIXED_AUDIO
671         switch (id) {
672         case 0:
673                 sci_glb_set(REG_AP_APB_APB_EB, BIT_IIS0_EB);
674                 break;
675         case 1:
676                 sci_glb_set(REG_AP_APB_APB_EB, BIT_IIS1_EB);
677                 break;
678         case 2:
679                 sci_glb_set(REG_AP_APB_APB_EB, BIT_IIS2_EB);
680                 break;
681         case 3:
682                 sci_glb_set(REG_AP_APB_APB_EB, BIT_IIS3_EB);
683                 break;
684         default:
685                 ret = -ENODEV;
686                 break;
687         }
688 #endif
689
690         return ret;
691 }
692
693 static inline int arch_audio_i2s_disable(int id)
694 {
695         int ret = 0;
696
697 #if FIXED_AUDIO
698         switch (id) {
699         case 0:
700                 sci_glb_clr(REG_AP_APB_APB_EB, BIT_IIS0_EB);
701                 break;
702         case 1:
703                 sci_glb_clr(REG_AP_APB_APB_EB, BIT_IIS1_EB);
704                 break;
705         case 2:
706                 sci_glb_clr(REG_AP_APB_APB_EB, BIT_IIS2_EB);
707                 break;
708         case 3:
709                 sci_glb_clr(REG_AP_APB_APB_EB, BIT_IIS3_EB);
710                 break;
711         default:
712                 ret = -ENODEV;
713                 break;
714         }
715 #endif
716
717         return ret;
718 }
719
720 static inline int arch_audio_i2s_tx_dma_info(int id)
721 {
722         int ret = 0;
723
724 #if FIXED_AUDIO
725 #ifdef CONFIG_SOUND_USE_DMA
726         switch (id) {
727         case 0:
728                 ret = DMA_IIS0_TX;
729                 break;
730         case 1:
731                 ret = DMA_IIS1_TX;
732                 break;
733         case 2:
734                 ret = DMA_IIS2_TX;
735                 break;
736         case 3:
737                 ret = DMA_IIS3_TX;
738                 break;
739         default:
740                 ret = -ENODEV;
741                 break;
742         }
743 #endif
744 #endif
745
746         return ret;
747 }
748
749 static inline int arch_audio_i2s_rx_dma_info(int id)
750 {
751         int ret = 0;
752
753 #if FIXED_AUDIO
754 #ifdef CONFIG_SOUND_USE_DMA
755         switch (id) {
756         case 0:
757                 ret = DMA_IIS0_RX;
758                 break;
759         case 1:
760                 ret = DMA_IIS1_RX;
761                 break;
762         case 2:
763                 ret = DMA_IIS2_RX;
764                 break;
765         case 3:
766                 ret = DMA_IIS3_RX;
767                 break;
768         default:
769                 ret = -ENODEV;
770                 break;
771         }
772 #endif
773
774 #endif
775
776         return ret;
777 }
778
779 static inline int arch_audio_i2s_reset(int id)
780 {
781         int ret = 0;
782
783 #if FIXED_AUDIO
784         switch (id) {
785         case 0:
786                 sci_glb_set(REG_AP_APB_APB_RST, BIT_IIS0_SOFT_RST);
787                 udelay(10);
788                 sci_glb_clr(REG_AP_APB_APB_RST, BIT_IIS0_SOFT_RST);
789                 break;
790         case 1:
791                 sci_glb_set(REG_AP_APB_APB_RST, BIT_IIS1_SOFT_RST);
792                 udelay(10);
793                 sci_glb_clr(REG_AP_APB_APB_RST, BIT_IIS1_SOFT_RST);
794                 break;
795         case 2:
796                 sci_glb_set(REG_AP_APB_APB_RST, BIT_IIS2_SOFT_RST);
797                 udelay(10);
798                 sci_glb_clr(REG_AP_APB_APB_RST, BIT_IIS2_SOFT_RST);
799                 break;
800         case 3:
801                 sci_glb_set(REG_AP_APB_APB_RST, BIT_IIS3_SOFT_RST);
802                 udelay(10);
803                 sci_glb_clr(REG_AP_APB_APB_RST, BIT_IIS3_SOFT_RST);
804                 break;
805         default:
806                 ret = -ENODEV;
807                 break;
808         }
809 #endif
810
811         return ret;
812 }
813
814 /*sc9630 AP IIS and CP IIS are different. AP IIS cann't switch to other master*/
815 static inline int arch_audio_i2s_switch(int id, int master)
816 {
817         int ret = 0;
818
819 #if FIXED_AUDIO
820         switch (master) {
821         case AUDIO_TO_AP_ARM_CTRL:
822                 break;
823         case AUDIO_NO_CHANGE:
824                 ret = AUDIO_TO_AP_ARM_CTRL;
825                 break;
826         default:
827                 ret = -ENODEV;
828                 break;
829         }
830 #endif
831         return ret;
832 }
833
834 #include <asm/arch/pinmap.h>
835 static inline int audio_reg_write(u32 reg, u32 val, u32 msk)
836 {
837         __raw_writel((__raw_readl(reg) & ~msk) | val, reg);
838 }
839
840 static inline int pin_func_set(u32 reg, u32 func)
841 {
842         audio_reg_write(reg, BITS_PIN_AF(func), BITS_PIN_AF(0xFFFFFFFF));
843 }
844
845 static inline int arch_audio_pin_func_i2s_port(int id, int sel)
846 {
847         int ret = 0;
848
849 #if FIXED_AUDIO
850         switch (id) {
851         case 0:
852                 pin_func_set(CTL_PIN_BASE + REG_PIN_IIS0DI, 0);
853                 pin_func_set(CTL_PIN_BASE + REG_PIN_IIS0DO, 0);
854                 pin_func_set(CTL_PIN_BASE + REG_PIN_IIS0CLK, 0);
855                 pin_func_set(CTL_PIN_BASE + REG_PIN_IIS0LRCK, 0);
856                 break;
857         case 1:
858 #ifndef CONFIG_SPX15
859                 pin_func_set(CTL_PIN_BASE + REG_PIN_IIS1DI, 0);
860                 pin_func_set(CTL_PIN_BASE + REG_PIN_IIS1DO, 0);
861                 pin_func_set(CTL_PIN_BASE + REG_PIN_IIS1CLK, 0);
862                 pin_func_set(CTL_PIN_BASE + REG_PIN_IIS1LRCK, 0);
863 #endif
864                 break;
865         case 2:
866                 if (sel) {
867                         pin_func_set(CTL_PIN_BASE + REG_PIN_NFD11, 2);
868                         pin_func_set(CTL_PIN_BASE + REG_PIN_NFD12, 2);
869                         pin_func_set(CTL_PIN_BASE + REG_PIN_NFD13, 2);
870                         pin_func_set(CTL_PIN_BASE + REG_PIN_NFD14, 2);
871                 } else {
872 #ifndef CONFIG_SPX15
873                         pin_func_set(CTL_PIN_BASE + REG_PIN_IIS2DI, 0);
874                         pin_func_set(CTL_PIN_BASE + REG_PIN_IIS2DO, 0);
875                         pin_func_set(CTL_PIN_BASE + REG_PIN_IIS2CLK, 0);
876                         pin_func_set(CTL_PIN_BASE + REG_PIN_IIS2LRCK, 0);
877 #endif
878                 }
879                 break;
880         case 3:
881                 if (sel) {
882                         pin_func_set(CTL_PIN_BASE + REG_PIN_NFD5, 2);
883                         pin_func_set(CTL_PIN_BASE + REG_PIN_NFD6, 2);
884                         pin_func_set(CTL_PIN_BASE + REG_PIN_NFD7, 2);
885                         pin_func_set(CTL_PIN_BASE + REG_PIN_NFD8, 2);
886                 } else {
887                         pin_func_set(CTL_PIN_BASE + REG_PIN_TRACEDAT3, 1);
888                         pin_func_set(CTL_PIN_BASE + REG_PIN_TRACEDAT4, 1);
889                         pin_func_set(CTL_PIN_BASE + REG_PIN_TRACEDAT5, 1);
890                         pin_func_set(CTL_PIN_BASE + REG_PIN_TRACEDAT6, 1);
891                 }
892                 break;
893         default:
894                 ret = -ENODEV;
895                 break;
896         }
897 #endif
898         return ret;
899 }
900
901 enum {
902         I2S_PORT_SYS_SEL_AP = 0,
903         I2S_PORT_SYS_SEL_CP0 = 1,
904         I2S_PORT_SYS_SEL_CP1 = 2,
905         I2S_PORT_SYS_SEL_CP2 = 3,
906         I2S_PORT_SYS_SEL_VBC = 4,
907 };
908
909 static inline int arch_audio_i2s_port_sys_sel(int id, int sel)
910 {
911         int ret = 0;
912
913 #if FIXED_AUDIO
914         int val;
915         int msk;
916         switch (id) {
917         case 0:
918                 msk = BIT(6) | BIT(7) | BIT(8);
919                 val = (sel << 6) & msk;
920                 break;
921         case 1:
922                 msk = BIT(9) | BIT(10) | BIT(11);
923                 val = (sel << 9) & msk;
924                 break;
925         case 2:
926                 msk = BIT(12) | BIT(13) | BIT(14);
927                 val = (sel << 12) & msk;
928                 break;
929         case 3:
930                 msk = BIT(15) | BIT(16) | BIT(17);
931                 val = (sel << 15) & msk;
932                 break;
933         default:
934                 ret = -ENODEV;
935                 break;
936         }
937         if (!ret)
938                 audio_reg_write(CTL_PIN_BASE + REG_PIN_CTRL3, val, msk);
939 #endif
940         return ret;
941
942 }
943
944 #endif