tizen 2.4 release
[kernel/u-boot-tm1.git] / arch / arm / include / asm / arch-sc8825 / sprd-audio.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 __AUDIO_GLB_REG_H
15 #define __AUDIO_GLB_REG_H
16
17 #include <common.h>
18 #include <errno.h>
19 #include <ubi_uboot.h>
20 #include <asm/arch/hardware.h>
21 #include <asm/arch/regs_glb.h>
22 #include <asm/arch/regs_ana_glb.h>
23 #include <asm/arch/sci.h>
24 #include <asm/arch/adi.h>
25
26 #ifdef CONFIG_SOUND_USE_DMA
27 #include <asm/arch/dma.h>
28 #endif
29 #ifdef CONFIG_SOUND_USE_INT
30 #include <mach/irqs.h>
31 #endif
32
33 /* OKAY, this is for other else owner
34    if you do not care the audio config
35    you can set FIXED_AUDIO  to 0
36    for compile happy.
37 */
38 /* FIXME */
39 #define FIXED_AUDIO 1
40
41 enum {
42         AUDIO_NO_CHANGE,
43         AUDIO_TO_DSP_CTRL,
44         AUDIO_TO_ARM_CTRL,
45         AUDIO_TO_ARM_CP_CTRL,
46 };
47
48 #if FIXED_AUDIO
49
50 #ifdef SPRD_VB_BASE
51 #undef SPRD_VB_BASE
52 #endif
53 #define SPRD_VB_BASE SPRD_VB_PHYS
54
55 #ifdef SPRD_MISC_BASE
56 #undef SPRD_MISC_BASE
57 #endif
58 #define SPRD_MISC_BASE SPRD_MISC_PHYS
59
60 #define VBC_BASE                SPRD_VB_BASE
61 #define CODEC_DP_BASE           (SPRD_VB_BASE + 0x1000)
62 #define CODEC_AP_BASE           (SPRD_MISC_BASE + 0x0700)
63 #define VBC_PHY_BASE            SPRD_VB_PHYS
64 #define CODEC_DP_PHY_BASE       (SPRD_VB_PHYS + 0x1000)
65 #define CODEC_AP_PHY_BASE       (SPRD_MISC_PHYS + 0x0700)
66
67 #ifdef CONFIG_SOUND_USE_INT
68 #define CODEC_AP_IRQ            (IRQ_ANA_AUD_INT)
69 #define CODEC_DP_IRQ            (IRQ_REQ_AUD_INT)
70 #endif
71
72 #ifdef CONFIG_SPRD_AUDIO_BUFFER_USE_IRAM
73 #define SPRD_IRAM_ALL_PHYS      0X00000000
74 #define SPRD_IRAM_ALL_SIZE      SZ_32K
75 #endif
76 #endif
77
78 /* ------------------------------------------------------------------------- */
79
80 /* NOTE: all function maybe will call by atomic funtion
81          don NOT any complex oprations. Just register.
82 return
83    0:   unchanged
84    1:   changed
85    ohter error
86 */
87 /* vbc setting */
88
89 static inline int arch_audio_vbc_reg_enable(void)
90 {
91         int ret = 0;
92
93 #if FIXED_AUDIO
94         sci_glb_set(REG_GLB_GEN1, BIT_VBC_EN);
95 #endif
96
97         return ret;
98 }
99
100 static inline int arch_audio_vbc_reg_disable(void)
101 {
102         int ret = 0;
103
104 #if FIXED_AUDIO
105         sci_glb_clr(REG_GLB_GEN1, BIT_VBC_EN);
106 #endif
107
108         return ret;
109 }
110
111 static inline int arch_audio_vbc_enable(void)
112 {
113         int ret = 0;
114
115 #if FIXED_AUDIO
116         sci_glb_set(REG_GLB_BUSCLK, BIT_ARM_VBC_ANAON);
117 #endif
118
119         return ret;
120 }
121
122 static inline int arch_audio_vbc_disable(void)
123 {
124         int ret = 0;
125
126 #if FIXED_AUDIO
127         sci_glb_clr(REG_GLB_BUSCLK, BIT_ARM_VBC_ANAON);
128 #endif
129
130         return ret;
131 }
132
133 static inline int arch_audio_vbc_switch(int master)
134 {
135         int ret = 0;
136
137 #if FIXED_AUDIO
138         switch (master) {
139         case AUDIO_TO_ARM_CTRL:
140                 sci_glb_set(REG_GLB_BUSCLK, BIT_ARM_VBC_ACC);
141                 sci_glb_clr(REG_GLB_BUSCLK, BIT_ARM_VBC_ACC_CP);
142                 break;
143         case AUDIO_TO_ARM_CP_CTRL:
144                 sci_glb_set(REG_GLB_BUSCLK, BIT_ARM_VBC_ACC);
145                 sci_glb_set(REG_GLB_BUSCLK, BIT_ARM_VBC_ACC_CP);
146                 break;
147         case AUDIO_TO_DSP_CTRL:
148                 sci_glb_clr(REG_GLB_BUSCLK, BIT_ARM_VBC_ACC);
149                 break;
150         case AUDIO_NO_CHANGE:
151                 ret = sci_glb_read(REG_GLB_BUSCLK, BIT_ARM_VBC_ACC);
152                 if (ret == 0) {
153                         ret = AUDIO_TO_DSP_CTRL;
154                 } else {
155                         ret = sci_glb_read(REG_GLB_BUSCLK, BIT_ARM_VBC_ACC_CP);
156                         if (ret == 0)
157                                 ret = AUDIO_TO_ARM_CTRL;
158                         else
159                                 ret = AUDIO_TO_ARM_CP_CTRL;
160                 }
161                 break;
162         default:
163                 ret = -ENODEV;
164                 break;
165         }
166 #endif
167
168         return ret;
169 }
170
171 static inline int arch_audio_vbc_ad_enable(int chan)
172 {
173         int ret = 0;
174
175 #if FIXED_AUDIO
176         switch (chan) {
177         case 0:
178                 sci_glb_set(REG_GLB_BUSCLK, BIT_ARM_VBC_AD0ON);
179                 break;
180         case 1:
181                 sci_glb_set(REG_GLB_BUSCLK, BIT_ARM_VBC_AD1ON);
182                 break;
183         default:
184                 ret = -ENODEV;
185                 break;
186         }
187 #endif
188
189         return ret;
190 }
191
192 static inline int arch_audio_vbc_ad_disable(int chan)
193 {
194         int ret = 0;
195
196 #if FIXED_AUDIO
197         switch (chan) {
198         case 0:
199                 sci_glb_clr(REG_GLB_BUSCLK, BIT_ARM_VBC_AD0ON);
200                 break;
201         case 1:
202                 sci_glb_clr(REG_GLB_BUSCLK, BIT_ARM_VBC_AD1ON);
203                 break;
204         default:
205                 ret = -ENODEV;
206                 break;
207         }
208 #endif
209
210         return ret;
211 }
212
213 static inline int arch_audio_vbc_da_enable(int chan)
214 {
215         int ret = 0;
216
217 #if FIXED_AUDIO
218         switch (chan) {
219         case 0:
220                 sci_glb_set(REG_GLB_BUSCLK, BIT_ARM_VBC_DA0ON);
221                 break;
222         case 1:
223                 sci_glb_set(REG_GLB_BUSCLK, BIT_ARM_VBC_DA1ON);
224                 break;
225         default:
226                 ret = -ENODEV;
227                 break;
228         }
229 #endif
230
231         return ret;
232 }
233
234 static inline int arch_audio_vbc_da_disable(int chan)
235 {
236         int ret = 0;
237
238 #if FIXED_AUDIO
239         switch (chan) {
240         case 0:
241                 sci_glb_clr(REG_GLB_BUSCLK, BIT_ARM_VBC_DA0ON);
242                 break;
243         case 1:
244                 sci_glb_clr(REG_GLB_BUSCLK, BIT_ARM_VBC_DA1ON);
245                 break;
246         default:
247                 ret = -ENODEV;
248                 break;
249         }
250 #endif
251
252         return ret;
253 }
254
255 static inline int arch_audio_vbc_da_dma_info(int chan)
256 {
257         int ret = 0;
258
259 #if FIXED_AUDIO
260 #ifdef CONFIG_SOUND_USE_DMA
261         switch (chan) {
262         case 0:
263                 ret = DMA_VB_DA0;
264                 break;
265         case 1:
266                 ret = DMA_VB_DA1;
267                 break;
268         default:
269                 ret = -ENODEV;
270                 break;
271         }
272 #endif
273 #endif
274
275         return ret;
276 }
277
278 static inline int arch_audio_vbc_ad_dma_info(int chan)
279 {
280         int ret = 0;
281
282 #if FIXED_AUDIO
283 #ifdef CONFIG_SOUND_USE_DMA
284         switch (chan) {
285         case 0:
286                 ret = DMA_VB_AD0;
287                 break;
288         case 1:
289                 ret = DMA_VB_AD1;
290                 break;
291         default:
292                 ret = -ENODEV;
293                 break;
294         }
295 #endif
296 #endif
297
298         return ret;
299 }
300
301 static inline int arch_audio_vbc_reset(void)
302 {
303         int ret = 0;
304
305 #if FIXED_AUDIO
306         sci_glb_set(REG_GLB_SOFT_RST, BIT_VBC_RST);
307         udelay(10);
308         sci_glb_clr(REG_GLB_SOFT_RST, BIT_VBC_RST);
309 #endif
310
311         return ret;
312 }
313
314 /* some SOC will move this into vbc module */
315 static inline int arch_audio_vbc_ad_int_clr(void)
316 {
317         int ret = 0;
318
319 #if FIXED_AUDIO
320 #endif
321
322         return ret;
323 }
324
325 /* some SOC will move this into vbc module */
326 static inline int arch_audio_vbc_da_int_clr(void)
327 {
328         int ret = 0;
329
330 #if FIXED_AUDIO
331 #endif
332
333         return ret;
334 }
335
336 /* some SOC will move this into vbc module */
337 static inline int arch_audio_vbc_is_ad_int(void)
338 {
339         int ret = 0;
340
341 #if FIXED_AUDIO
342 #endif
343
344         return ret;
345 }
346
347 /* some SOC will move this into vbc module */
348 static inline int arch_audio_vbc_is_da_int(void)
349 {
350         int ret = 0;
351
352 #if FIXED_AUDIO
353 #endif
354
355         return ret;
356 }
357
358 /* ------------------------------------------------------------------------- */
359
360 /* codec setting */
361 static inline int arch_audio_codec_write_mask(int reg, int val, int mask)
362 {
363         int ret = 0;
364
365 #if FIXED_AUDIO
366         ret = sci_adi_write(reg, val, mask);
367 #endif
368
369         return ret;
370 }
371
372 static inline int arch_audio_codec_write(int reg, int val)
373 {
374         int ret = 0;
375
376 #if FIXED_AUDIO
377         ret = sci_adi_write(reg, val, 0xFFFF);
378 #endif
379
380         return ret;
381 }
382
383 static inline int arch_audio_codec_read(int reg)
384 {
385         int ret = 0;
386
387 #if FIXED_AUDIO
388         ret = sci_adi_read(reg);
389 #endif
390
391         return ret;
392 }
393
394 static inline int arch_audio_codec_audif_enable(int auto_clk)
395 {
396         int ret = 0;
397
398 #if FIXED_AUDIO
399         if (auto_clk) {
400                 sci_glb_clr(REG_GLB_GEN1, BIT_AUD_IF_EB);
401                 sci_glb_set(REG_GLB_GEN1, BIT_AUDIF_AUTO_EN);
402         } else {
403                 sci_glb_set(REG_GLB_GEN1, BIT_AUD_IF_EB);
404                 sci_glb_clr(REG_GLB_GEN1, BIT_AUDIF_AUTO_EN);
405         }
406 #endif
407
408         return ret;
409 }
410
411 static inline int arch_audio_codec_audif_disable(void)
412 {
413         int ret = 0;
414
415 #if FIXED_AUDIO
416         sci_glb_clr(REG_GLB_GEN1, BIT_AUDIF_AUTO_EN);
417         sci_glb_clr(REG_GLB_GEN1, BIT_AUD_IF_EB);
418 #endif
419
420         return ret;
421 }
422
423 static inline int arch_audio_codec_digital_reg_enable(void)
424 {
425         int ret = 0;
426
427 #if FIXED_AUDIO
428         sci_glb_set(REG_GLB_GEN1, BIT_AUD_TOP_EB);
429         if (ret >= 0)
430                 arch_audio_codec_audif_enable(1);
431 #endif
432
433         return ret;
434 }
435
436 static inline int arch_audio_codec_digital_reg_disable(void)
437 {
438         int ret = 0;
439
440 #if FIXED_AUDIO
441         arch_audio_codec_audif_disable();
442         sci_glb_clr(REG_GLB_GEN1, BIT_AUD_TOP_EB);
443 #endif
444
445         return ret;
446 }
447
448 static inline int arch_audio_codec_analog_reg_enable(void)
449 {
450         int ret = 0;
451
452 #if FIXED_AUDIO
453         ret =
454             sci_adi_write(ANA_REG_GLB_ARM_AUD_CLK_RST, BIT_AUD_ARM_EN,
455                               BIT_AUD_ARM_EN);
456 #endif
457
458         return ret;
459 }
460
461 static inline int arch_audio_codec_analog_reg_disable(void)
462 {
463         int ret = 0;
464
465 #if FIXED_AUDIO
466         ret = sci_adi_write(ANA_REG_GLB_ARM_AUD_CLK_RST, 0, BIT_AUD_ARM_EN);
467 #endif
468
469         return ret;
470 }
471
472 static inline int arch_audio_codec_enable(void)
473 {
474         int ret = 0;
475
476 #if FIXED_AUDIO
477         int mask = BIT_AUD6M5_CLK_TX_INV_ARM_EN |
478             BIT_RTC_AUD_ARM_EN | BIT_CLK_AUD_6M5_ARM_EN | BIT_CLK_AUDIF_ARM_EN;
479         ret = sci_adi_write(ANA_REG_GLB_ARM_AUD_CLK_RST, mask, mask);
480 #endif
481
482         return ret;
483 }
484
485 static inline int arch_audio_codec_disable(void)
486 {
487         int ret = 0;
488
489 #if FIXED_AUDIO
490         int mask =
491             BIT_RTC_AUD_ARM_EN | BIT_CLK_AUD_6M5_ARM_EN | BIT_CLK_AUDIF_ARM_EN;
492         ret = sci_adi_write(ANA_REG_GLB_ARM_AUD_CLK_RST, 0, mask);
493 #endif
494
495         return ret;
496 }
497
498 static inline int arch_audio_codec_switch(int master)
499 {
500         int ret = 0;
501
502 #if FIXED_AUDIO
503         switch (master) {
504         case AUDIO_TO_ARM_CTRL:
505                 sci_glb_set(REG_GLB_GEN1, BIT_AUD_CTL_SEL | BIT_AUD_CLK_SEL);
506                 sci_glb_set(REG_GLB_BUSCLK, BIT_ARM_VB_SEL);
507                 ret =
508                     sci_adi_write(ANA_REG_GLB_ARM_AUD_CLK_RST,
509                                       BIT_AUD_ARM_ACC, BIT_AUD_ARM_ACC);
510                 break;
511         case AUDIO_TO_DSP_CTRL:
512                 sci_glb_clr(REG_GLB_GEN1, BIT_AUD_CTL_SEL | BIT_AUD_CLK_SEL);
513                 sci_glb_clr(REG_GLB_BUSCLK, BIT_ARM_VB_SEL);
514                 ret =
515                     sci_adi_write(ANA_REG_GLB_ARM_AUD_CLK_RST, 0,
516                                       BIT_AUD_ARM_ACC);
517                 break;
518         case AUDIO_NO_CHANGE:
519                 ret =
520                     sci_adi_read(ANA_REG_GLB_ARM_AUD_CLK_RST) & BIT_AUD_ARM_ACC;
521                 if (ret == 0)
522                         ret = AUDIO_TO_DSP_CTRL;
523                 else
524                         ret = AUDIO_TO_ARM_CTRL;
525                 break;
526         default:
527                 ret = -ENODEV;
528                 break;
529         }
530 #endif
531
532         return ret;
533 }
534
535 static inline int arch_audio_codec_reset(void)
536 {
537         int ret = 0;
538
539 #if FIXED_AUDIO
540         int mask =
541             BIT_AUD_ARM_SOFT_RST | BIT_AUDTX_ARM_SOFT_RST |
542             BIT_AUDRX_ARM_SOFT_RST;
543         sci_glb_set(REG_GLB_SOFT_RST, BIT_AUD_TOP_RST);
544         sci_glb_set(REG_GLB_SOFT_RST, BIT_AUD_IF_RST);
545         ret = sci_adi_write(ANA_REG_GLB_ARM_AUD_CLK_RST, mask, mask);
546         udelay(10);
547         sci_glb_clr(REG_GLB_SOFT_RST, BIT_AUD_TOP_RST);
548         sci_glb_clr(REG_GLB_SOFT_RST, BIT_AUD_IF_RST);
549         if (ret >= 0)
550                 ret = sci_adi_write(ANA_REG_GLB_ARM_AUD_CLK_RST, 0, mask);
551 #endif
552
553         return ret;
554 }
555
556 /* ------------------------------------------------------------------------- */
557
558 /* i2s setting */
559 static inline const char * arch_audio_i2s_clk_name(int id)
560 {
561 #if FIXED_AUDIO
562         switch (id) {
563         case 0:
564                 return "clk_iis0";
565                 break;
566         case 1:
567                 return "clk_iis1";
568                 break;
569         default:
570                 break;
571         }
572         return NULL;
573 #endif
574 }
575
576 static inline int arch_audio_i2s_enable(int id)
577 {
578         int ret = 0;
579
580 #if FIXED_AUDIO
581         switch (id) {
582         case 0:
583                 sci_glb_set(REG_GLB_GEN0, BIT_IIS0_EB);
584                 break;
585         case 1:
586                 sci_glb_set(REG_GLB_GEN0, BIT_IIS1_EB);
587                 break;
588         default:
589                 ret = -ENODEV;
590                 break;
591         }
592 #endif
593
594         return ret;
595 }
596
597 static inline int arch_audio_i2s_disable(int id)
598 {
599         int ret = 0;
600
601 #if FIXED_AUDIO
602         switch (id) {
603         case 0:
604                 sci_glb_clr(REG_GLB_GEN0, BIT_IIS0_EB);
605                 break;
606         case 1:
607                 sci_glb_clr(REG_GLB_GEN0, BIT_IIS1_EB);
608                 break;
609         default:
610                 ret = -ENODEV;
611                 break;
612         }
613 #endif
614
615         return ret;
616 }
617
618 static inline int arch_audio_i2s_tx_dma_info(int id)
619 {
620         int ret = 0;
621
622 #if FIXED_AUDIO
623 #ifdef CONFIG_SOUND_USE_DMA
624         switch (id) {
625         case 0:
626                 ret = DMA_IIS_TX;
627                 break;
628         case 1:
629                 ret = DMA_IIS1_TX;
630                 break;
631         default:
632                 ret = -ENODEV;
633                 break;
634         }
635 #endif
636 #endif
637
638         return ret;
639 }
640
641 static inline int arch_audio_i2s_rx_dma_info(int id)
642 {
643         int ret = 0;
644
645 #if FIXED_AUDIO
646 #ifdef CONFIG_SOUND_USE_DMA
647         switch (id) {
648         case 0:
649                 ret = DMA_IIS_RX;
650                 break;
651         case 1:
652                 ret = DMA_IIS1_RX;
653                 break;
654         default:
655                 ret = -ENODEV;
656                 break;
657         }
658 #endif
659
660 #endif
661
662         return ret;
663 }
664
665 static inline int arch_audio_i2s_reset(int id)
666 {
667         int ret = 0;
668
669 #if FIXED_AUDIO
670         switch (id) {
671         case 0:
672                 sci_glb_set(REG_GLB_SOFT_RST, BIT_IIS0_RST);
673                 udelay(10);
674                 sci_glb_clr(REG_GLB_SOFT_RST, BIT_IIS0_RST);
675                 break;
676         case 1:
677                 sci_glb_set(REG_GLB_SOFT_RST, BIT_IIS1_RST);
678                 udelay(10);
679                 sci_glb_clr(REG_GLB_SOFT_RST, BIT_IIS1_RST);
680                 break;
681         default:
682                 ret = -ENODEV;
683                 break;
684         }
685 #endif
686
687         return ret;
688 }
689
690 static inline int arch_audio_i2s_switch(int id, int master)
691 {
692         int ret = 0;
693
694 #if FIXED_AUDIO
695         switch (id) {
696         case 0:
697                 switch (master) {
698                 case AUDIO_TO_ARM_CTRL:
699                         sci_glb_clr(REG_GLB_PCTRL, BIT_IIS0_CTL_SEL);
700                         break;
701                 case AUDIO_TO_DSP_CTRL:
702                         sci_glb_set(REG_GLB_PCTRL, BIT_IIS0_CTL_SEL);
703                         break;
704                 case AUDIO_NO_CHANGE:
705                         ret = sci_glb_read(REG_GLB_PCTRL, BIT_IIS0_CTL_SEL);
706                         if (ret != 0)
707                                 ret = AUDIO_TO_DSP_CTRL;
708                         else
709                                 ret = AUDIO_TO_ARM_CTRL;
710                         break;
711                 default:
712                         ret = -ENODEV;
713                         break;
714                 }
715                 break;
716         case 1:
717                 switch (master) {
718                 case AUDIO_TO_ARM_CTRL:
719                         sci_glb_clr(REG_GLB_PCTRL, BIT_IIS1_CTL_SEL);
720                         break;
721                 case AUDIO_TO_DSP_CTRL:
722                         sci_glb_set(REG_GLB_PCTRL, BIT_IIS1_CTL_SEL);
723                         break;
724                 case AUDIO_NO_CHANGE:
725                         ret = sci_glb_read(REG_GLB_PCTRL, BIT_IIS1_CTL_SEL);
726                         if (ret != 0)
727                                 ret = AUDIO_TO_DSP_CTRL;
728                         else
729                                 ret = AUDIO_TO_ARM_CTRL;
730                         break;
731                 default:
732                         ret = -ENODEV;
733                         break;
734                 }
735                 break;
736         default:
737                 ret = -ENODEV;
738                 break;
739         }
740 #endif
741
742         return ret;
743 }
744
745 #endif