tizen 2.4 release
[profile/mobile/platform/kernel/linux-3.10-sc7730.git] / include / soc / sprd / __sprd_audio_sc8835l.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_SCX35L_H
15 #define __ASM_ARCH_AUDIO_GLB_SCX35L_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
21 #include <linux/delay.h>
22
23 #include <soc/sprd/hardware.h>
24 #include <soc/sprd/sci.h>
25 #include <soc/sprd/sci_glb_regs.h>
26 #include <soc/sprd/adi.h>
27 #include <soc/sprd/irqs.h>
28 #ifndef CONFIG_SND_SOC_SPRD_AUDIO_DMA_ENGINE
29 #include <soc/sprd/dma.h>
30 #else
31 #include <../../../drivers/dma/sprd_dma.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_ARM_CTRL = AUDIO_TO_AP_ARM_CTRL,
48         AUDIO_TO_CP0_ARM_CTRL,
49         AUDIO_TO_CP1_ARM_CTRL,
50         AUDIO_TO_CP2_ARM_CTRL,
51 };
52
53 #if FIXED_AUDIO
54
55 #if 1
56 #define CODEC_DP_BASE           (0x1000)
57 #define VBC_BASE                (0x1000)
58 #define CODEC_AP_BASE           (0x2000)
59 #define CODEC_AP_OFFSET         (0)
60
61 #define CODEC_DP_BASE_DEFAULT           0x40000000
62 #define CODEC_DP_SIZE_DEFAULT           SZ_8K
63
64 #define VBC_BASE_DEFAULT                        0x40020000
65 #define VBC_BASE_SIZE_DEFAULT           SZ_4K + SZ_8K
66
67 #define VBC_PHY_BASE            0
68 #else
69 #define VBC_BASE                (SPRD_VBC_BASE)
70 #define CODEC_DP_BASE           SPRD_AUDIO_BASE
71 #define VBC_PHY_BASE            SPRD_VBC_PHYS
72
73 /* CODEC_AP_BASE: the bit15 cann't be 1 for asoc reg.*/
74 #if (ANA_AUDCFGA_INT_BASE & BIT(15))
75 #define CODEC_AP_BASE   (ANA_AUDCFGA_INT_BASE & ~(BIT(15)))
76 #define CODEC_AP_OFFSET   (0x8000)
77 #else
78 #define CODEC_AP_BASE (ANA_AUDCFGA_INT_BASE)
79 #define CODEC_AP_OFFSET  (0)
80 #endif
81 #endif
82 /* for CP2 */
83 #define VBC_CP2_PHY_BASE        (0x02020000)
84 #define CP2_PHYS_VBDA0          (VBC_CP2_PHY_BASE + 0x0000)
85 #define CP2_PHYS_VBDA1          (VBC_CP2_PHY_BASE + 0x0004)
86
87 #define CODEC_DP_PHY_BASE       SPRD_AUDIO_PHYS
88 #define CODEC_AP_PHY_BASE       (SPRD_ADISLAVE_PHYS + 0x0600)
89 #define CODEC_AP_IRQ            (IRQ_ANA_AUD_INT)
90 #define CODEC_DP_IRQ            (IRQ_REQ_AUD_INT)
91
92 #define SPRD_IRAM_ALL_PHYS        (SPRD_IRAM2_PHYS)
93 #define SPRD_IRAM_ALL_SIZE        (SPRD_IRAM2_SIZE)
94
95 #define CLASS_G_LDO_ID                  "vddclsg"
96 #endif
97
98 /* ------------------------------------------------------------------------- */
99
100 /* NOTE: all function maybe will call by atomic funtion
101          don NOT any complex oprations. Just register.
102 return
103    0:   unchanged
104    1:   changed
105    ohter error
106 */
107 /* vbc setting */
108
109 static inline int arch_audio_vbc_reg_enable(void)
110 {
111         int ret = 0;
112
113 #if FIXED_AUDIO
114         sci_glb_set(REG_AON_APB_APB_EB0, BIT_VBC_EB);
115 #endif
116
117         return ret;
118 }
119
120 static inline int arch_audio_vbc_reg_disable(void)
121 {
122         int ret = 0;
123
124 #if FIXED_AUDIO
125         sci_glb_clr(REG_AON_APB_APB_EB0, BIT_VBC_EB);
126 #endif
127
128         return ret;
129 }
130
131 static inline int arch_audio_vbc_enable(void)
132 {
133         int ret = 0;
134
135 #if FIXED_AUDIO
136 #endif
137
138         return ret;
139 }
140
141 static inline int arch_audio_vbc_disable(void)
142 {
143         int ret = 0;
144
145 #if FIXED_AUDIO
146 #endif
147
148         return ret;
149 }
150
151 static inline int arch_audio_vbc_reset(void);
152 static inline int arch_audio_vbc_switch(int master)
153 {
154         int ret = 0;
155 #if FIXED_AUDIO
156         int val = 0;
157         int mask =
158             BITS_VBC_AFIFO_INT_SYS_SEL(3) | BITS_VBC_DA01_INT_SYS_SEL(3) |
159             BITS_VBC_AD01_INT_SYS_SEL(3)
160             | BITS_VBC_AD23_INT_SYS_SEL(3) | BITS_VBC_DA01_DMA_SYS_SEL(3) |
161             BITS_VBC_AD01_DMA_SYS_SEL(3)
162             | BITS_VBC_AD23_DMA_SYS_SEL(3);
163
164         if (master != AUDIO_NO_CHANGE) {
165                 sci_glb_set(REG_AON_APB_CP0_WPROT_EN0, BIT(6));
166                 sci_glb_set(REG_AON_APB_CP1_WPROT_EN0, BIT(6));
167         //changed by jian.chen
168                 //sci_glb_set(REG_AON_APB_CP2_WPROT_EN, BIT(6));
169         }
170         switch (master) {
171         case AUDIO_TO_AP_ARM_CTRL:
172                 val =
173                     BITS_VBC_AFIFO_INT_SYS_SEL(0) | BITS_VBC_DA01_INT_SYS_SEL(0)
174                     | BITS_VBC_AD01_INT_SYS_SEL(0)
175                     | BITS_VBC_AD23_INT_SYS_SEL(0);
176                 #ifndef CONFIG_SND_SOC_SPRD_AUDIO_USE_AON_DMA
177                 val |=
178                         (BITS_VBC_DA01_DMA_SYS_SEL(0) | BITS_VBC_AD01_DMA_SYS_SEL(0)
179                     | BITS_VBC_AD23_DMA_SYS_SEL(0));
180                 #else
181                 /* Capture will only use AP DMA for the limitation of IRAM size */
182                 val |=
183                         (BITS_VBC_DA01_DMA_SYS_SEL(2) | BITS_VBC_AD01_DMA_SYS_SEL(0)
184                     | BITS_VBC_AD23_DMA_SYS_SEL(0));
185                 #endif
186                 sci_glb_write(REG_AON_APB_VBC_CTRL, val, mask);
187                 sci_glb_clr(REG_AON_APB_AP_WPROT_EN0, BIT(6));
188                 arch_audio_vbc_reset();
189                 arch_audio_vbc_reg_disable();
190                 break;
191         case AUDIO_TO_CP0_DSP_CTRL:
192                 arch_audio_vbc_reset();
193                 arch_audio_vbc_reg_enable();
194                 sci_glb_clr(REG_AON_APB_CP0_WPROT_EN0, BIT(6));
195                 val =
196                     BITS_VBC_AFIFO_INT_SYS_SEL(1) | BITS_VBC_DA01_INT_SYS_SEL(1)
197                     | BITS_VBC_AD01_INT_SYS_SEL(1)
198                     | BITS_VBC_AD23_INT_SYS_SEL(1) |
199                     BITS_VBC_DA01_DMA_SYS_SEL(1) | BITS_VBC_AD01_DMA_SYS_SEL(1)
200                     | BITS_VBC_AD23_DMA_SYS_SEL(1);
201                 sci_glb_write(REG_AON_APB_VBC_CTRL, val, mask);
202 #ifndef CONFIG_ARCH_SCX20L
203                 sci_glb_write(REG_AON_APB_VBC_CTRL, 0,
204                               (BIT_VBC_DMA_CP0_ARM_SEL |
205                                BIT_VBC_DMA_CP0_ARM_SEL));
206 #endif
207                 break;
208         case AUDIO_TO_CP1_DSP_CTRL:
209                 arch_audio_vbc_reset();
210                 arch_audio_vbc_reg_enable();
211                 sci_glb_clr(REG_AON_APB_CP1_WPROT_EN0, BIT(6));
212                 val =
213                     BITS_VBC_AFIFO_INT_SYS_SEL(2) | BITS_VBC_DA01_INT_SYS_SEL(2)
214                     | BITS_VBC_AD01_INT_SYS_SEL(2)
215                     | BITS_VBC_AD23_INT_SYS_SEL(2) |
216                     BITS_VBC_DA01_DMA_SYS_SEL(2) | BITS_VBC_AD01_DMA_SYS_SEL(2)
217                     | BITS_VBC_AD23_DMA_SYS_SEL(2);
218                 sci_glb_write(REG_AON_APB_VBC_CTRL, val, mask);
219 #ifndef CONFIG_ARCH_SCX20L
220                 sci_glb_write(REG_AON_APB_VBC_CTRL, 0,
221                               (BIT_VBC_DMA_CP1_ARM_SEL |
222                                BIT_VBC_DMA_CP1_ARM_SEL));
223 #endif
224                 break;
225         case AUDIO_TO_CP0_ARM_CTRL:
226                 arch_audio_vbc_reset();
227                 arch_audio_vbc_reg_enable();
228                 sci_glb_clr(REG_AON_APB_CP0_WPROT_EN0, BIT(6));
229                 val =
230                     BITS_VBC_AFIFO_INT_SYS_SEL(1) | BITS_VBC_DA01_INT_SYS_SEL(1)
231                     | BITS_VBC_AD01_INT_SYS_SEL(1)
232                     | BITS_VBC_AD23_INT_SYS_SEL(1) |
233                     BITS_VBC_DA01_DMA_SYS_SEL(1) | BITS_VBC_AD01_DMA_SYS_SEL(1)
234                     | BITS_VBC_AD23_DMA_SYS_SEL(1);
235 #ifndef CONFIG_ARCH_SCX20L
236                 sci_glb_write(REG_AON_APB_VBC_CTRL,
237                               (val | BIT_VBC_INT_CP0_ARM_SEL |
238                                BIT_VBC_DMA_CP0_ARM_SEL),
239                               (mask | BIT_VBC_INT_CP0_ARM_SEL |
240                                BIT_VBC_DMA_CP0_ARM_SEL));
241 #endif
242                 break;
243         case AUDIO_TO_CP1_ARM_CTRL:
244                 arch_audio_vbc_reset();
245                 arch_audio_vbc_reg_enable();
246                 sci_glb_clr(REG_AON_APB_CP1_WPROT_EN0, BIT(6));
247                 val =
248                     BITS_VBC_AFIFO_INT_SYS_SEL(2) | BITS_VBC_DA01_INT_SYS_SEL(2)
249                     | BITS_VBC_AD01_INT_SYS_SEL(2)
250                     | BITS_VBC_AD23_INT_SYS_SEL(2) |
251                     BITS_VBC_DA01_DMA_SYS_SEL(2) | BITS_VBC_AD01_DMA_SYS_SEL(2)
252                     | BITS_VBC_AD23_DMA_SYS_SEL(2);
253 #ifndef CONFIG_ARCH_SCX20L
254                 sci_glb_write(REG_AON_APB_VBC_CTRL,
255                               (val | BIT_VBC_INT_CP1_ARM_SEL |
256                                BIT_VBC_DMA_CP1_ARM_SEL),
257                               (mask | BIT_VBC_INT_CP1_ARM_SEL |
258                                BIT_VBC_DMA_CP1_ARM_SEL));
259 #endif
260                 break;
261         //changed by jian.chen
262         /*
263         case AUDIO_TO_CP2_ARM_CTRL:
264                 sci_glb_clr(REG_AON_APB_CP2_WPROT_EN, BIT(6));
265                 val =
266                     BITS_VBC_AFIFO_INT_SYS_SEL(3) | BITS_VBC_DA01_INT_SYS_SEL(3)
267                     | BITS_VBC_AD01_INT_SYS_SEL(3)
268                     | BITS_VBC_AD23_INT_SYS_SEL(3) |
269                     BITS_VBC_DA01_DMA_SYS_SEL(3) | BITS_VBC_AD01_DMA_SYS_SEL(3)
270                     | BITS_VBC_AD23_DMA_SYS_SEL(3);
271                 sci_glb_write(REG_AON_APB_VBC_CTRL, val, mask);
272                 break;
273                 */
274         case AUDIO_NO_CHANGE:
275                 ret =
276                     sci_glb_read(REG_AON_APB_VBC_CTRL,
277                                  BITS_VBC_DA01_INT_SYS_SEL(3));
278                 if (ret == BITS_VBC_DA01_INT_SYS_SEL(0)) {
279                         ret = AUDIO_TO_AP_ARM_CTRL;
280                 } else if (ret == BITS_VBC_DA01_INT_SYS_SEL(1)) {
281 #ifndef CONFIG_ARCH_SCX20L
282                         ret =
283                             sci_glb_read(REG_AON_APB_VBC_CTRL,
284                                          BIT_VBC_INT_CP0_ARM_SEL);
285                         if (ret)
286                                 ret = AUDIO_TO_CP0_ARM_CTRL;
287                         else
288 #endif
289                                 ret = AUDIO_TO_CP0_DSP_CTRL;
290                 } else if (ret == BITS_VBC_DA01_INT_SYS_SEL(2)) {
291 #ifndef CONFIG_ARCH_SCX20L
292                         ret =
293                             sci_glb_read(REG_AON_APB_VBC_CTRL,
294                                          BIT_VBC_INT_CP1_ARM_SEL);
295                         if (ret)
296                                 ret = AUDIO_TO_CP1_ARM_CTRL;
297                         else
298 #endif
299                                 ret = AUDIO_TO_CP1_DSP_CTRL;
300                 } else if (ret == BITS_VBC_DA01_INT_SYS_SEL(3)) {
301                         ret = AUDIO_TO_CP2_ARM_CTRL;
302                 }
303                 break;
304         default:
305                 ret = -ENODEV;
306                 break;
307         }
308 #endif
309
310         return ret;
311 }
312
313 static inline int arch_audio_vbc_da_dma_info(int chan)
314 {
315         int ret = 0;
316
317 #if FIXED_AUDIO
318         switch (chan) {
319         case 0:
320                 ret = DMA_VB_DA0;
321                 break;
322         case 1:
323                 ret = DMA_VB_DA1;
324                 break;
325         default:
326                 ret = -ENODEV;
327                 break;
328         }
329 #endif
330
331         return ret;
332 }
333
334 static inline int arch_audio_vbc_ad_dma_info(int chan)
335 {
336         int ret = 0;
337
338 #if FIXED_AUDIO
339         switch (chan) {
340         case 0:
341                 ret = DMA_VB_AD0;
342                 break;
343         case 1:
344                 ret = DMA_VB_AD1;
345                 break;
346         default:
347                 ret = -ENODEV;
348                 break;
349         }
350 #endif
351
352         return ret;
353 }
354
355 static inline int arch_audio_vbc_ad23_dma_info(int chan)
356 {
357         int ret = 0;
358
359 #if FIXED_AUDIO
360         switch (chan) {
361         case 0:
362                 ret = DMA_VB_AD2;
363                 break;
364         case 1:
365                 ret = DMA_VB_AD3;
366                 break;
367         default:
368                 ret = -ENODEV;
369                 break;
370         }
371 #endif
372
373         return ret;
374 }
375
376 static inline int arch_audio_vbc_reset(void)
377 {
378         int ret = 0;
379
380 #if FIXED_AUDIO
381         sci_glb_set(REG_AON_APB_APB_RST0, BIT_VBC_SOFT_RST);
382         udelay(10);
383         sci_glb_clr(REG_AON_APB_APB_RST0, BIT_VBC_SOFT_RST);
384 #endif
385
386         return ret;
387 }
388
389 #if 1
390 /* some SOC will move this into vbc module */
391 static inline int arch_audio_vbc_ad_int_clr(void)
392 {
393         int ret = 0;
394
395
396         return ret;
397 }
398
399 static inline int arch_audio_vbc_ad23_int_clr(void)
400 {
401         int ret = 0;
402
403
404         return ret;
405 }
406
407 /* some SOC will move this into vbc module */
408 static inline int arch_audio_vbc_da_int_clr(void)
409 {
410         int ret = 0;
411
412
413         return ret;
414 }
415
416 /* some SOC will move this into vbc module */
417 static inline int arch_audio_vbc_is_ad_int(void)
418 {
419         int ret = 0;
420
421
422         return ret;
423 }
424
425 /* some SOC will move this into vbc module */
426 static inline int arch_audio_vbc_is_ad23_int(void)
427 {
428         int ret = 0;
429
430
431         return ret;
432 }
433
434 /* some SOC will move this into vbc module */
435 static inline int arch_audio_vbc_is_da_int(void)
436 {
437         int ret = 0;
438
439
440         return ret;
441 }
442 #endif
443 /* ------------------------------------------------------------------------- */
444
445 /* codec setting */
446 static inline int arch_audio_codec_write_mask(int reg, int val, int mask)
447 {
448         int ret = 0;
449
450 #if FIXED_AUDIO
451         ret = sci_adi_write((reg + CODEC_AP_OFFSET + ANA_AUDCFGA_INT_BASE - CODEC_AP_BASE), val, mask);
452 #endif
453
454         return ret;
455 }
456
457 static inline int arch_audio_codec_write(int reg, int val)
458 {
459         int ret = 0;
460
461 #if FIXED_AUDIO
462         ret = sci_adi_write((reg + CODEC_AP_OFFSET + ANA_AUDCFGA_INT_BASE - CODEC_AP_BASE), val, 0xFFFF);
463 #endif
464
465         return ret;
466 }
467
468 static inline int arch_audio_codec_read(int reg)
469 {
470         int ret = 0;
471
472 #if FIXED_AUDIO
473         ret = sci_adi_read(reg + CODEC_AP_OFFSET + ANA_AUDCFGA_INT_BASE - CODEC_AP_BASE);
474 #endif
475
476         return ret;
477 }
478
479 static inline int arch_audio_codec_audif_enable(int auto_clk)
480 {
481         int ret = 0;
482
483 #if FIXED_AUDIO
484         if (auto_clk) {
485                 sci_glb_clr(REG_AON_APB_APB_EB0, BIT_AUDIF_EB);
486                 sci_glb_set(REG_AON_APB_VBC_CTRL, BIT_AUDIF_CKG_AUTO_EN);
487         } else {
488                 sci_glb_set(REG_AON_APB_APB_EB0, BIT_AUDIF_EB);
489                 sci_glb_clr(REG_AON_APB_VBC_CTRL, BIT_AUDIF_CKG_AUTO_EN);
490         }
491 #endif
492
493         return ret;
494 }
495
496 static inline int arch_audio_codec_audif_disable(void)
497 {
498         int ret = 0;
499
500 #if FIXED_AUDIO
501         sci_glb_clr(REG_AON_APB_APB_EB0, BIT_AUDIF_EB);
502         sci_glb_clr(REG_AON_APB_VBC_CTRL, BIT_AUDIF_CKG_AUTO_EN);
503 #endif
504
505         return ret;
506 }
507
508 static inline int arch_audio_codec_digital_reg_enable(void)
509 {
510         int ret = 0;
511
512 #if FIXED_AUDIO
513         ret = sci_glb_set(REG_AON_APB_APB_EB0, BIT_AUD_EB);
514         if (ret >= 0)
515                 arch_audio_codec_audif_enable(0);
516 #endif
517
518         return ret;
519 }
520
521 static inline int arch_audio_codec_digital_reg_disable(void)
522 {
523         int ret = 0;
524
525 #if FIXED_AUDIO
526         arch_audio_codec_audif_disable();
527         sci_glb_clr(REG_AON_APB_APB_EB0, BIT_AUD_EB);
528 #endif
529
530         return ret;
531 }
532
533 static inline int arch_audio_codec_analog_reg_enable(void)
534 {
535         int ret = 0;
536
537 #if FIXED_AUDIO
538         ret =
539             sci_adi_write(ANA_REG_GLB_ARM_MODULE_EN, BIT_ANA_AUD_EN,
540                           BIT_ANA_AUD_EN);
541         if (ret >= 0) {
542                 /* Disable Sleep Control Audio Power */
543                 ret = sci_adi_write(ANA_REG_GLB_AUD_SLP_CTRL, 0, 0xFFFF);
544         }
545 #endif
546
547         return ret;
548 }
549
550 static inline int arch_audio_codec_analog_reg_disable(void)
551 {
552         int ret = 0;
553
554 #if FIXED_AUDIO
555         ret = sci_adi_write(ANA_REG_GLB_ARM_MODULE_EN, 0, BIT_ANA_AUD_EN);
556 #endif
557
558         return ret;
559 }
560
561 static inline int arch_audio_codec_analog_enable(void)
562 {
563         int ret = 0;
564
565 #if FIXED_AUDIO
566         /* AUDIF , 6.5M */
567         int mask = BIT_CLK_AUD_6P5M_EN | BIT_CLK_AUDIF_EN;
568         sci_adi_write(ANA_REG_GLB_ARM_CLK_EN, mask, mask);
569         sci_adi_write(ANA_REG_GLB_AUDIO_CTRL0, BIT_CLK_AUD_6P5M_TX_INV_EN,
570                       BIT_CLK_AUD_6P5M_TX_INV_EN);
571         /* RTC */
572         sci_adi_write(ANA_REG_GLB_RTC_CLK_EN, BIT_RTC_AUD_EN, BIT_RTC_AUD_EN);
573         /* 26M */
574         sci_adi_write(ANA_REG_GLB_XTL_WAIT_CTRL, BIT_XTL_EN, BIT_XTL_EN);
575
576         /* FIXME: disable deepsleep force power off audio ldo */
577         sci_adi_write(ANA_REG_GLB_AUD_SLP_CTRL, 0, 0xFFFF);
578 #endif
579         return ret;
580 }
581
582 static inline int arch_audio_codec_digital_enable(void)
583 {
584         int ret = 0;
585
586 #if FIXED_AUDIO
587         /* internal digital 26M enable */
588         sci_glb_write(REG_AON_APB_SINDRV_CTRL, BIT_SINDRV_ENA, BIT_SINDRV_ENA);
589 #endif
590
591         return ret;
592 }
593
594 static inline int arch_audio_codec_analog_disable(void)
595 {
596         int ret = 0;
597
598 #if FIXED_AUDIO
599         /* AUDIF , 6.5M */
600         int mask = BIT_CLK_AUD_6P5M_EN | BIT_CLK_AUDIF_EN;
601         sci_adi_write(ANA_REG_GLB_ARM_CLK_EN, 0, mask);
602         sci_adi_write(ANA_REG_GLB_AUDIO_CTRL0, BIT_CLK_AUD_6P5M_TX_INV_EN,
603                       BIT_CLK_AUD_6P5M_TX_INV_EN);
604         /* RTC */
605         sci_adi_write(ANA_REG_GLB_RTC_CLK_EN, 0, BIT_RTC_AUD_EN);
606         /* 26M  this is shared with adc, so we cann't close it */
607         /* sci_adi_write(ANA_REG_GLB_XTL_WAIT_CTRL, 0, BIT_XTL_EN); */
608 #endif
609
610         return ret;
611 }
612
613 static inline int arch_audio_codec_digital_disable(void)
614 {
615         int ret = 0;
616
617 #if FIXED_AUDIO
618         /* internal digital 26M disable */
619         sci_glb_write(REG_AON_APB_SINDRV_CTRL, 0, BIT_SINDRV_ENA);
620
621 #endif
622
623         return ret;
624 }
625
626 static inline int arch_audio_codec_switch(int master)
627 {
628         int ret = 0;
629
630 #if FIXED_AUDIO
631         switch (master) {
632         case AUDIO_TO_AP_ARM_CTRL:
633                 sci_glb_write(REG_AON_APB_VBC_CTRL, BITS_AUD_INT_SYS_SEL(0),
634                               BITS_AUD_INT_SYS_SEL(3));
635                 break;
636         case AUDIO_TO_CP0_ARM_CTRL:
637                 sci_glb_write(REG_AON_APB_VBC_CTRL, BITS_AUD_INT_SYS_SEL(1),
638                               BITS_AUD_INT_SYS_SEL(3));
639                 break;
640         case AUDIO_TO_CP1_ARM_CTRL:
641                 sci_glb_write(REG_AON_APB_VBC_CTRL, BITS_AUD_INT_SYS_SEL(2),
642                               BITS_AUD_INT_SYS_SEL(3));
643                 break;
644         case AUDIO_TO_CP2_ARM_CTRL:
645                 sci_glb_write(REG_AON_APB_VBC_CTRL, BITS_AUD_INT_SYS_SEL(3),
646                               BITS_AUD_INT_SYS_SEL(3));
647                 break;
648         case AUDIO_NO_CHANGE:
649                 ret =
650                     sci_glb_read(REG_AON_APB_VBC_CTRL, BITS_AUD_INT_SYS_SEL(3));
651                 if (ret == 0) {
652                         ret = AUDIO_TO_AP_ARM_CTRL;
653                 } else if (ret == 1) {
654                         ret = AUDIO_TO_CP0_ARM_CTRL;
655                 } else if (ret == 2) {
656                         ret = AUDIO_TO_CP1_ARM_CTRL;
657                 } else if (ret == 3) {
658                         ret = AUDIO_TO_CP2_ARM_CTRL;
659                 }
660                 break;
661         default:
662                 ret = -ENODEV;
663                 break;
664         }
665 #endif
666
667         return ret;
668 }
669
670 static inline int arch_audio_codec_reset(void)
671 {
672         int ret = 0;
673
674 #if FIXED_AUDIO
675         int mask =
676             BIT_ANA_AUD_SOFT_RST | BIT_ANA_AUDTX_SOFT_RST |
677             BIT_ANA_AUDRX_SOFT_RST;
678         sci_glb_set(REG_AON_APB_APB_RST0, BIT_AUD_SOFT_RST);
679         sci_glb_set(REG_AON_APB_APB_RST0, BIT_AUDIF_SOFT_RST);
680         ret = sci_adi_write(ANA_REG_GLB_ARM_RST, mask, mask);
681         udelay(10);
682         sci_glb_clr(REG_AON_APB_APB_RST0, BIT_AUD_SOFT_RST);
683         sci_glb_clr(REG_AON_APB_APB_RST0, BIT_AUDIF_SOFT_RST);
684         if (ret >= 0)
685                 ret = sci_adi_write(ANA_REG_GLB_ARM_RST, 0, mask);
686 #endif
687
688         return ret;
689 }
690
691 static inline int arch_audio_codec_digital_reset(void)
692 {
693         int ret = 0;
694
695 #if FIXED_AUDIO
696         sci_glb_set(REG_AON_APB_APB_RST0, BIT_AUD_SOFT_RST);
697         sci_glb_set(REG_AON_APB_APB_RST0, BIT_AUDIF_SOFT_RST);
698         udelay(10);
699         sci_glb_clr(REG_AON_APB_APB_RST0, BIT_AUD_SOFT_RST);
700         sci_glb_clr(REG_AON_APB_APB_RST0, BIT_AUDIF_SOFT_RST);
701 #endif
702
703         return ret;
704 }
705
706 static inline int arch_audio_codec_analog_reset(void)
707 {
708         int ret = 0;
709
710 #if FIXED_AUDIO
711         int mask =
712             BIT_ANA_AUD_SOFT_RST | BIT_ANA_AUDTX_SOFT_RST |
713             BIT_ANA_AUDRX_SOFT_RST;
714         ret = sci_adi_write(ANA_REG_GLB_ARM_RST, mask, mask);
715         udelay(10);
716         if (ret >= 0)
717                 ret = sci_adi_write(ANA_REG_GLB_ARM_RST, 0, mask);
718 #endif
719
720         return ret;
721 }
722
723 static inline int arch_audio_sleep_xtl_enable(void)
724 {
725
726 #if FIXED_AUDIO
727                 sci_glb_set(REG_PMU_APB_SLEEP_XTLON_CTRL, BIT_AP_SLEEP_XTL_ON);
728 #endif
729         return 0;
730 }
731 static inline int arch_audio_sleep_xtl_disable(void)
732 {
733
734 #if FIXED_AUDIO
735                 sci_glb_clr(REG_PMU_APB_SLEEP_XTLON_CTRL, BIT_AP_SLEEP_XTL_ON);
736 #endif
737         return 0;
738 }
739
740 static inline int arch_audio_memory_sleep_enable(void)
741 {
742 #if 0
743 #if FIXED_AUDIO
744         sci_glb_clr(REG_PMU_APB_MEM_PD_CFG0, BITS_AON_MEM_PD_CFG_VBC(3));
745         sci_glb_clr(REG_PMU_APB_MEM_PD_CFG0, BITS_AON_MEM_PD_CFG_AUD(3));
746 #endif
747         return 0;
748 #endif
749 }
750
751 static inline int arch_audio_memory_sleep_disable(void)
752 {
753 #if 0
754 #if FIXED_AUDIO
755         sci_glb_set(REG_PMU_APB_MEM_PD_CFG0, BITS_AON_MEM_PD_CFG_VBC(1));
756         sci_glb_set(REG_PMU_APB_MEM_PD_CFG0, BITS_AON_MEM_PD_CFG_AUD(1));
757 #endif
758         return 0;
759 #endif
760 }
761
762 static inline int arch_audio_codec_adie_loop_clk_en(int on)
763 {
764         int ret = 0;
765         if (on)
766                 ret = sci_adi_write(ANA_REG_GLB_ARM_CLK_EN, BIT_CLK_AUD_LOOP_EN, BIT_CLK_AUD_LOOP_EN);
767         else
768                 ret = sci_adi_write(ANA_REG_GLB_ARM_CLK_EN, 0, BIT_CLK_AUD_LOOP_EN);
769         return ret;
770 }
771
772 /* ------------------------------------------------------------------------- */
773
774 /* i2s setting */
775 static inline const char *arch_audio_i2s_clk_name(int id)
776 {
777 #if FIXED_AUDIO
778         switch (id) {
779         case 0:
780                 return "clk_iis0";
781                 break;
782         case 1:
783                 return "clk_iis1";
784                 break;
785         case 2:
786                 return "clk_iis2";
787                 break;
788         case 3:
789                 return "clk_iis3";
790                 break;
791         default:
792                 break;
793         }
794 #endif
795         return NULL;
796 }
797
798 static inline int arch_audio_i2s_enable(int id)
799 {
800         int ret = 0;
801
802 #if FIXED_AUDIO
803         switch (id) {
804         case 0:
805                 sci_glb_set(REG_AP_APB_APB_EB, BIT_IIS0_EB);
806                 break;
807         case 1:
808                 sci_glb_set(REG_AP_APB_APB_EB, BIT_IIS1_EB);
809                 break;
810         case 2:
811                 sci_glb_set(REG_AP_APB_APB_EB, BIT_IIS2_EB);
812                 break;
813         case 3:
814                 sci_glb_set(REG_AP_APB_APB_EB, BIT_IIS3_EB);
815                 break;
816         default:
817                 ret = -ENODEV;
818                 break;
819         }
820 #endif
821
822         return ret;
823 }
824
825 static inline int arch_audio_i2s_disable(int id)
826 {
827         int ret = 0;
828
829 #if FIXED_AUDIO
830         switch (id) {
831         case 0:
832                 sci_glb_clr(REG_AP_APB_APB_EB, BIT_IIS0_EB);
833                 break;
834         case 1:
835                 sci_glb_clr(REG_AP_APB_APB_EB, BIT_IIS1_EB);
836                 break;
837         case 2:
838                 sci_glb_clr(REG_AP_APB_APB_EB, BIT_IIS2_EB);
839                 break;
840         case 3:
841                 sci_glb_clr(REG_AP_APB_APB_EB, BIT_IIS3_EB);
842                 break;
843         default:
844                 ret = -ENODEV;
845                 break;
846         }
847 #endif
848
849         return ret;
850 }
851
852 static inline int arch_audio_i2s_tx_dma_info(int id)
853 {
854         int ret = 0;
855
856 #if FIXED_AUDIO
857         switch (id) {
858         case 0:
859                 ret = DMA_IIS0_TX;
860                 break;
861         case 1:
862                 ret = DMA_IIS1_TX;
863                 break;
864         case 2:
865                 ret = DMA_IIS2_TX;
866                 break;
867         case 3:
868                 ret = DMA_IIS3_TX;
869                 break;
870         default:
871                 ret = -ENODEV;
872                 break;
873         }
874 #endif
875
876         return ret;
877 }
878
879 static inline int arch_audio_i2s_rx_dma_info(int id)
880 {
881         int ret = 0;
882
883 #if FIXED_AUDIO
884         switch (id) {
885         case 0:
886                 ret = DMA_IIS0_RX;
887                 break;
888         case 1:
889                 ret = DMA_IIS1_RX;
890                 break;
891         case 2:
892                 ret = DMA_IIS2_RX;
893                 break;
894         case 3:
895                 ret = DMA_IIS3_RX;
896                 break;
897         default:
898                 ret = -ENODEV;
899                 break;
900         }
901
902 #endif
903
904         return ret;
905 }
906
907 static inline int arch_audio_i2s_reset(int id)
908 {
909         int ret = 0;
910
911 #if FIXED_AUDIO
912         switch (id) {
913         case 0:
914                 sci_glb_set(REG_AP_APB_APB_RST, BIT_IIS0_SOFT_RST);
915                 udelay(10);
916                 sci_glb_clr(REG_AP_APB_APB_RST, BIT_IIS0_SOFT_RST);
917                 break;
918         case 1:
919                 sci_glb_set(REG_AP_APB_APB_RST, BIT_IIS1_SOFT_RST);
920                 udelay(10);
921                 sci_glb_clr(REG_AP_APB_APB_RST, BIT_IIS1_SOFT_RST);
922                 break;
923         case 2:
924                 sci_glb_set(REG_AP_APB_APB_RST, BIT_IIS2_SOFT_RST);
925                 udelay(10);
926                 sci_glb_clr(REG_AP_APB_APB_RST, BIT_IIS2_SOFT_RST);
927                 break;
928         case 3:
929                 sci_glb_set(REG_AP_APB_APB_RST, BIT_IIS3_SOFT_RST);
930                 udelay(10);
931                 sci_glb_clr(REG_AP_APB_APB_RST, BIT_IIS3_SOFT_RST);
932                 break;
933         default:
934                 ret = -ENODEV;
935                 break;
936         }
937 #endif
938
939         return ret;
940 }
941
942 /* sc8830 AP IIS and CP IIS are different. AP IIS cann't switch to other master*/
943 static inline int arch_audio_i2s_switch(int id, int master)
944 {
945         int ret = 0;
946
947 #if FIXED_AUDIO
948         switch (master) {
949         case AUDIO_TO_AP_ARM_CTRL:
950                 break;
951         case AUDIO_NO_CHANGE:
952                 ret = AUDIO_TO_AP_ARM_CTRL;
953                 break;
954         default:
955                 ret = -ENODEV;
956                 break;
957         }
958 #endif
959
960         return ret;
961 }
962
963 #endif