]> nv-tegra.nvidia Code Review - linux-2.6.git/blob - arch/arm/mach-bcmring/include/mach/csp/chipcHw_inline.h
Merge commit 'v2.6.32' into reiserfs/kill-bkl
[linux-2.6.git] / arch / arm / mach-bcmring / include / mach / csp / chipcHw_inline.h
1 /*****************************************************************************
2 * Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
3 *
4 * Unless you and Broadcom execute a separate written software license
5 * agreement governing use of this software, this software is licensed to you
6 * under the terms of the GNU General Public License version 2, available at
7 * http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
8 *
9 * Notwithstanding the above, under no circumstances may you combine this
10 * software in any way with any other Broadcom software provided under a
11 * license other than the GPL, without Broadcom's express prior written
12 * consent.
13 *****************************************************************************/
14
15 #ifndef CHIPC_INLINE_H
16 #define CHIPC_INLINE_H
17
18 /* ---- Include Files ----------------------------------------------------- */
19
20 #include <csp/errno.h>
21 #include <csp/reg.h>
22 #include <mach/csp/chipcHw_reg.h>
23 #include <mach/csp/chipcHw_def.h>
24
25 /* ---- Private Constants and Types --------------------------------------- */
26 typedef enum {
27         chipcHw_OPTYPE_BYPASS,  /* Bypass operation */
28         chipcHw_OPTYPE_OUTPUT   /* Output operation */
29 } chipcHw_OPTYPE_e;
30
31 /* ---- Public Constants and Types ---------------------------------------- */
32 /* ---- Public Variable Externs ------------------------------------------- */
33 /* ---- Public Function Prototypes ---------------------------------------- */
34 /* ---- Private Function Prototypes --------------------------------------- */
35 static inline void chipcHw_setClock(chipcHw_CLOCK_e clock,
36                                     chipcHw_OPTYPE_e type, int mode);
37
38 /****************************************************************************/
39 /**
40 *  @brief   Get Numeric Chip ID
41 *
42 *  This function returns Chip ID that includes the revison number
43 *
44 *  @return  Complete numeric Chip ID
45 *
46 */
47 /****************************************************************************/
48 static inline uint32_t chipcHw_getChipId(void)
49 {
50         return pChipcHw->ChipId;
51 }
52
53 /****************************************************************************/
54 /**
55 *  @brief   Enable Spread Spectrum
56 *
57 *  @note chipcHw_Init() must be called earlier
58 */
59 /****************************************************************************/
60 static inline void chipcHw_enableSpreadSpectrum(void)
61 {
62         if ((pChipcHw->
63              PLLPreDivider & chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_MASK) !=
64             chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_INTEGER) {
65                 ddrcReg_PHY_ADDR_CTL_REGP->ssCfg =
66                     (0xFFFF << ddrcReg_PHY_ADDR_SS_CFG_NDIV_AMPLITUDE_SHIFT) |
67                     (ddrcReg_PHY_ADDR_SS_CFG_MIN_CYCLE_PER_TICK <<
68                      ddrcReg_PHY_ADDR_SS_CFG_CYCLE_PER_TICK_SHIFT);
69                 ddrcReg_PHY_ADDR_CTL_REGP->ssCtl |=
70                     ddrcReg_PHY_ADDR_SS_CTRL_ENABLE;
71         }
72 }
73
74 /****************************************************************************/
75 /**
76 *  @brief   Disable Spread Spectrum
77 *
78 */
79 /****************************************************************************/
80 static inline void chipcHw_disableSpreadSpectrum(void)
81 {
82         ddrcReg_PHY_ADDR_CTL_REGP->ssCtl &= ~ddrcReg_PHY_ADDR_SS_CTRL_ENABLE;
83 }
84
85 /****************************************************************************/
86 /**
87 *  @brief   Get Chip Product ID
88 *
89 *  This function returns Chip Product ID
90 *
91 *  @return  Chip Product ID
92 */
93 /****************************************************************************/
94 static inline uint32_t chipcHw_getChipProductId(void)
95 {
96         return (pChipcHw->
97                  ChipId & chipcHw_REG_CHIPID_BASE_MASK) >>
98                 chipcHw_REG_CHIPID_BASE_SHIFT;
99 }
100
101 /****************************************************************************/
102 /**
103 *  @brief   Get revision number
104 *
105 *  This function returns revision number of the chip
106 *
107 *  @return  Revision number
108 */
109 /****************************************************************************/
110 static inline chipcHw_REV_NUMBER_e chipcHw_getChipRevisionNumber(void)
111 {
112         return pChipcHw->ChipId & chipcHw_REG_CHIPID_REV_MASK;
113 }
114
115 /****************************************************************************/
116 /**
117 *  @brief   Enables bus interface clock
118 *
119 *  Enables  bus interface clock of various device
120 *
121 *  @return  void
122 *
123 *  @note    use chipcHw_REG_BUS_CLOCK_XXXX for mask
124 */
125 /****************************************************************************/
126 static inline void chipcHw_busInterfaceClockEnable(uint32_t mask)
127 {
128         reg32_modify_or(&pChipcHw->BusIntfClock, mask);
129 }
130
131 /****************************************************************************/
132 /**
133 *  @brief   Disables bus interface clock
134 *
135 *  Disables  bus interface clock of various device
136 *
137 *  @return  void
138 *
139 *  @note    use chipcHw_REG_BUS_CLOCK_XXXX
140 */
141 /****************************************************************************/
142 static inline void chipcHw_busInterfaceClockDisable(uint32_t mask)
143 {
144         reg32_modify_and(&pChipcHw->BusIntfClock, ~mask);
145 }
146
147 /****************************************************************************/
148 /**
149 *  @brief   Get status (enabled/disabled) of bus interface clock
150 *
151 *  This function returns the status of devices' bus interface clock
152 *
153 *  @return  Bus interface clock
154 *
155 */
156 /****************************************************************************/
157 static inline uint32_t chipcHw_getBusInterfaceClockStatus(void)
158 {
159         return pChipcHw->BusIntfClock;
160 }
161
162 /****************************************************************************/
163 /**
164 *  @brief   Enables various audio channels
165 *
166 *  Enables audio channel
167 *
168 *  @return  void
169 *
170 *  @note    use chipcHw_REG_AUDIO_CHANNEL_XXXXXX
171 */
172 /****************************************************************************/
173 static inline void chipcHw_audioChannelEnable(uint32_t mask)
174 {
175         reg32_modify_or(&pChipcHw->AudioEnable, mask);
176 }
177
178 /****************************************************************************/
179 /**
180 *  @brief   Disables various audio channels
181 *
182 *  Disables audio channel
183 *
184 *  @return  void
185 *
186 *  @note    use chipcHw_REG_AUDIO_CHANNEL_XXXXXX
187 */
188 /****************************************************************************/
189 static inline void chipcHw_audioChannelDisable(uint32_t mask)
190 {
191         reg32_modify_and(&pChipcHw->AudioEnable, ~mask);
192 }
193
194 /****************************************************************************/
195 /**
196 *  @brief    Soft resets devices
197 *
198 *  Soft resets various devices
199 *
200 *  @return   void
201 *
202 *  @note     use chipcHw_REG_SOFT_RESET_XXXXXX defines
203 */
204 /****************************************************************************/
205 static inline void chipcHw_softReset(uint64_t mask)
206 {
207         chipcHw_softResetEnable(mask);
208         chipcHw_softResetDisable(mask);
209 }
210
211 static inline void chipcHw_softResetDisable(uint64_t mask)
212 {
213         uint32_t ctrl1 = (uint32_t) mask;
214         uint32_t ctrl2 = (uint32_t) (mask >> 32);
215
216         /* Deassert module soft reset */
217         REG_LOCAL_IRQ_SAVE;
218         pChipcHw->SoftReset1 ^= ctrl1;
219         pChipcHw->SoftReset2 ^= (ctrl2 & (~chipcHw_REG_SOFT_RESET_UNHOLD_MASK));
220         REG_LOCAL_IRQ_RESTORE;
221 }
222
223 static inline void chipcHw_softResetEnable(uint64_t mask)
224 {
225         uint32_t ctrl1 = (uint32_t) mask;
226         uint32_t ctrl2 = (uint32_t) (mask >> 32);
227         uint32_t unhold = 0;
228
229         REG_LOCAL_IRQ_SAVE;
230         pChipcHw->SoftReset1 |= ctrl1;
231         /* Mask out unhold request bits */
232         pChipcHw->SoftReset2 |= (ctrl2 & (~chipcHw_REG_SOFT_RESET_UNHOLD_MASK));
233
234         /* Process unhold requests */
235         if (ctrl2 & chipcHw_REG_SOFT_RESET_VPM_GLOBAL_UNHOLD) {
236                 unhold = chipcHw_REG_SOFT_RESET_VPM_GLOBAL_HOLD;
237         }
238
239         if (ctrl2 & chipcHw_REG_SOFT_RESET_VPM_UNHOLD) {
240                 unhold |= chipcHw_REG_SOFT_RESET_VPM_HOLD;
241         }
242
243         if (ctrl2 & chipcHw_REG_SOFT_RESET_ARM_UNHOLD) {
244                 unhold |= chipcHw_REG_SOFT_RESET_ARM_HOLD;
245         }
246
247         if (unhold) {
248                 /* Make sure unhold request is effective */
249                 pChipcHw->SoftReset1 &= ~unhold;
250         }
251         REG_LOCAL_IRQ_RESTORE;
252 }
253
254 /****************************************************************************/
255 /**
256 *  @brief    Configures misc CHIP functionality
257 *
258 *  Configures CHIP functionality
259 *
260 *  @return   void
261 *
262 *  @note     use chipcHw_REG_MISC_CTRL_XXXXXX
263 */
264 /****************************************************************************/
265 static inline void chipcHw_miscControl(uint32_t mask)
266 {
267         reg32_write(&pChipcHw->MiscCtrl, mask);
268 }
269
270 static inline void chipcHw_miscControlDisable(uint32_t mask)
271 {
272         reg32_modify_and(&pChipcHw->MiscCtrl, ~mask);
273 }
274
275 static inline void chipcHw_miscControlEnable(uint32_t mask)
276 {
277         reg32_modify_or(&pChipcHw->MiscCtrl, mask);
278 }
279
280 /****************************************************************************/
281 /**
282 *  @brief    Set OTP options
283 *
284 *  Set OTP options
285 *
286 *  @return   void
287 *
288 *  @note     use chipcHw_REG_OTP_XXXXXX
289 */
290 /****************************************************************************/
291 static inline void chipcHw_setOTPOption(uint64_t mask)
292 {
293         uint32_t ctrl1 = (uint32_t) mask;
294         uint32_t ctrl2 = (uint32_t) (mask >> 32);
295
296         reg32_modify_or(&pChipcHw->SoftOTP1, ctrl1);
297         reg32_modify_or(&pChipcHw->SoftOTP2, ctrl2);
298 }
299
300 /****************************************************************************/
301 /**
302 *  @brief    Get sticky bits
303 *
304 *  @return   Sticky bit options of type chipcHw_REG_STICKY_XXXXXX
305 *
306 */
307 /****************************************************************************/
308 static inline uint32_t chipcHw_getStickyBits(void)
309 {
310         return pChipcHw->Sticky;
311 }
312
313 /****************************************************************************/
314 /**
315 *  @brief    Set sticky bits
316 *
317 *  @return   void
318 *
319 *  @note     use chipcHw_REG_STICKY_XXXXXX
320 */
321 /****************************************************************************/
322 static inline void chipcHw_setStickyBits(uint32_t mask)
323 {
324         uint32_t bits = 0;
325
326         REG_LOCAL_IRQ_SAVE;
327         if (mask & chipcHw_REG_STICKY_POR_BROM) {
328                 bits |= chipcHw_REG_STICKY_POR_BROM;
329         } else {
330                 uint32_t sticky;
331                 sticky = pChipcHw->Sticky;
332
333                 if ((mask & chipcHw_REG_STICKY_BOOT_DONE)
334                     && (sticky & chipcHw_REG_STICKY_BOOT_DONE) == 0) {
335                         bits |= chipcHw_REG_STICKY_BOOT_DONE;
336                 }
337                 if ((mask & chipcHw_REG_STICKY_GENERAL_1)
338                     && (sticky & chipcHw_REG_STICKY_GENERAL_1) == 0) {
339                         bits |= chipcHw_REG_STICKY_GENERAL_1;
340                 }
341                 if ((mask & chipcHw_REG_STICKY_GENERAL_2)
342                     && (sticky & chipcHw_REG_STICKY_GENERAL_2) == 0) {
343                         bits |= chipcHw_REG_STICKY_GENERAL_2;
344                 }
345                 if ((mask & chipcHw_REG_STICKY_GENERAL_3)
346                     && (sticky & chipcHw_REG_STICKY_GENERAL_3) == 0) {
347                         bits |= chipcHw_REG_STICKY_GENERAL_3;
348                 }
349                 if ((mask & chipcHw_REG_STICKY_GENERAL_4)
350                     && (sticky & chipcHw_REG_STICKY_GENERAL_4) == 0) {
351                         bits |= chipcHw_REG_STICKY_GENERAL_4;
352                 }
353                 if ((mask & chipcHw_REG_STICKY_GENERAL_5)
354                     && (sticky & chipcHw_REG_STICKY_GENERAL_5) == 0) {
355                         bits |= chipcHw_REG_STICKY_GENERAL_5;
356                 }
357         }
358         pChipcHw->Sticky = bits;
359         REG_LOCAL_IRQ_RESTORE;
360 }
361
362 /****************************************************************************/
363 /**
364 *  @brief    Clear sticky bits
365 *
366 *  @return   void
367 *
368 *  @note     use chipcHw_REG_STICKY_XXXXXX
369 */
370 /****************************************************************************/
371 static inline void chipcHw_clearStickyBits(uint32_t mask)
372 {
373         uint32_t bits = 0;
374
375         REG_LOCAL_IRQ_SAVE;
376         if (mask &
377             (chipcHw_REG_STICKY_BOOT_DONE | chipcHw_REG_STICKY_GENERAL_1 |
378              chipcHw_REG_STICKY_GENERAL_2 | chipcHw_REG_STICKY_GENERAL_3 |
379              chipcHw_REG_STICKY_GENERAL_4 | chipcHw_REG_STICKY_GENERAL_5)) {
380                 uint32_t sticky = pChipcHw->Sticky;
381
382                 if ((mask & chipcHw_REG_STICKY_BOOT_DONE)
383                     && (sticky & chipcHw_REG_STICKY_BOOT_DONE)) {
384                         bits = chipcHw_REG_STICKY_BOOT_DONE;
385                         mask &= ~chipcHw_REG_STICKY_BOOT_DONE;
386                 }
387                 if ((mask & chipcHw_REG_STICKY_GENERAL_1)
388                     && (sticky & chipcHw_REG_STICKY_GENERAL_1)) {
389                         bits |= chipcHw_REG_STICKY_GENERAL_1;
390                         mask &= ~chipcHw_REG_STICKY_GENERAL_1;
391                 }
392                 if ((mask & chipcHw_REG_STICKY_GENERAL_2)
393                     && (sticky & chipcHw_REG_STICKY_GENERAL_2)) {
394                         bits |= chipcHw_REG_STICKY_GENERAL_2;
395                         mask &= ~chipcHw_REG_STICKY_GENERAL_2;
396                 }
397                 if ((mask & chipcHw_REG_STICKY_GENERAL_3)
398                     && (sticky & chipcHw_REG_STICKY_GENERAL_3)) {
399                         bits |= chipcHw_REG_STICKY_GENERAL_3;
400                         mask &= ~chipcHw_REG_STICKY_GENERAL_3;
401                 }
402                 if ((mask & chipcHw_REG_STICKY_GENERAL_4)
403                     && (sticky & chipcHw_REG_STICKY_GENERAL_4)) {
404                         bits |= chipcHw_REG_STICKY_GENERAL_4;
405                         mask &= ~chipcHw_REG_STICKY_GENERAL_4;
406                 }
407                 if ((mask & chipcHw_REG_STICKY_GENERAL_5)
408                     && (sticky & chipcHw_REG_STICKY_GENERAL_5)) {
409                         bits |= chipcHw_REG_STICKY_GENERAL_5;
410                         mask &= ~chipcHw_REG_STICKY_GENERAL_5;
411                 }
412         }
413         pChipcHw->Sticky = bits | mask;
414         REG_LOCAL_IRQ_RESTORE;
415 }
416
417 /****************************************************************************/
418 /**
419 *  @brief    Get software strap value
420 *
421 *  Retrieves software strap value
422 *
423 *  @return   Software strap value
424 *
425 */
426 /****************************************************************************/
427 static inline uint32_t chipcHw_getSoftStraps(void)
428 {
429         return pChipcHw->SoftStraps;
430 }
431
432 /****************************************************************************/
433 /**
434 *  @brief    Set software override strap options
435 *
436 *  set software override strap options
437 *
438 *  @return   nothing
439 *
440 */
441 /****************************************************************************/
442 static inline void chipcHw_setSoftStraps(uint32_t strapOptions)
443 {
444         reg32_write(&pChipcHw->SoftStraps, strapOptions);
445 }
446
447 /****************************************************************************/
448 /**
449 *  @brief   Get Pin Strap Options
450 *
451 *  This function returns the raw boot strap options
452 *
453 *  @return  strap options
454 *
455 */
456 /****************************************************************************/
457 static inline uint32_t chipcHw_getPinStraps(void)
458 {
459         return pChipcHw->PinStraps;
460 }
461
462 /****************************************************************************/
463 /**
464 *  @brief   Get Valid Strap Options
465 *
466 *  This function returns the valid raw boot strap options
467 *
468 *  @return  strap options
469 *
470 */
471 /****************************************************************************/
472 static inline uint32_t chipcHw_getValidStraps(void)
473 {
474         uint32_t softStraps;
475
476         /*
477          ** Always return the SoftStraps - bootROM calls chipcHw_initValidStraps
478          ** which copies HW straps to soft straps if there is no override
479          */
480         softStraps = chipcHw_getSoftStraps();
481
482         return softStraps;
483 }
484
485 /****************************************************************************/
486 /**
487 *  @brief    Initialize valid pin strap options
488 *
489 *  Retrieves valid pin strap options by copying HW strap options to soft register
490 *  (if chipcHw_STRAPS_SOFT_OVERRIDE not set)
491 *
492 *  @return   nothing
493 *
494 */
495 /****************************************************************************/
496 static inline void chipcHw_initValidStraps(void)
497 {
498         uint32_t softStraps;
499
500         REG_LOCAL_IRQ_SAVE;
501         softStraps = chipcHw_getSoftStraps();
502
503         if ((softStraps & chipcHw_STRAPS_SOFT_OVERRIDE) == 0) {
504                 /* Copy HW straps to software straps */
505                 chipcHw_setSoftStraps(chipcHw_getPinStraps());
506         }
507         REG_LOCAL_IRQ_RESTORE;
508 }
509
510 /****************************************************************************/
511 /**
512 *  @brief   Get boot device
513 *
514 *  This function returns the device type used in booting the system
515 *
516 *  @return  Boot device of type chipcHw_BOOT_DEVICE
517 *
518 */
519 /****************************************************************************/
520 static inline chipcHw_BOOT_DEVICE_e chipcHw_getBootDevice(void)
521 {
522         return chipcHw_getValidStraps() & chipcHw_STRAPS_BOOT_DEVICE_MASK;
523 }
524
525 /****************************************************************************/
526 /**
527 *  @brief   Get boot mode
528 *
529 *  This function returns the way the system was booted
530 *
531 *  @return  Boot mode of type chipcHw_BOOT_MODE
532 *
533 */
534 /****************************************************************************/
535 static inline chipcHw_BOOT_MODE_e chipcHw_getBootMode(void)
536 {
537         return chipcHw_getValidStraps() & chipcHw_STRAPS_BOOT_MODE_MASK;
538 }
539
540 /****************************************************************************/
541 /**
542 *  @brief   Get NAND flash page size
543 *
544 *  This function returns the NAND device page size
545 *
546 *  @return  Boot NAND device page size
547 *
548 */
549 /****************************************************************************/
550 static inline chipcHw_NAND_PAGESIZE_e chipcHw_getNandPageSize(void)
551 {
552         return chipcHw_getValidStraps() & chipcHw_STRAPS_NAND_PAGESIZE_MASK;
553 }
554
555 /****************************************************************************/
556 /**
557 *  @brief   Get NAND flash address cycle configuration
558 *
559 *  This function returns the NAND flash address cycle configuration
560 *
561 *  @return  0 = Do not extra address cycle, 1 = Add extra cycle
562 *
563 */
564 /****************************************************************************/
565 static inline int chipcHw_getNandExtraCycle(void)
566 {
567         if (chipcHw_getValidStraps() & chipcHw_STRAPS_NAND_EXTRA_CYCLE) {
568                 return 1;
569         } else {
570                 return 0;
571         }
572 }
573
574 /****************************************************************************/
575 /**
576 *  @brief   Activates PIF interface
577 *
578 *  This function activates PIF interface by taking control of LCD pins
579 *
580 *  @note
581 *       When activated, LCD pins will be defined as follows for PIF operation
582 *
583 *       CLD[17:0]  = pif_data[17:0]
584 *       CLD[23:18] = pif_address[5:0]
585 *       CLPOWER    = pif_wr_str
586 *       CLCP       = pif_rd_str
587 *       CLAC       = pif_hat1
588 *       CLFP       = pif_hrdy1
589 *       CLLP       = pif_hat2
590 *       GPIO[42]   = pif_hrdy2
591 *
592 *       In PIF mode, "pif_hrdy2" overrides other shared function for GPIO[42] pin
593 *
594 */
595 /****************************************************************************/
596 static inline void chipcHw_activatePifInterface(void)
597 {
598         reg32_write(&pChipcHw->LcdPifMode, chipcHw_REG_PIF_PIN_ENABLE);
599 }
600
601 /****************************************************************************/
602 /**
603 *  @brief   Activates LCD interface
604 *
605 *  This function activates LCD interface
606 *
607 *  @note
608 *       When activated, LCD pins will be defined as follows
609 *
610 *       CLD[17:0]  = LCD data
611 *       CLD[23:18] = LCD data
612 *       CLPOWER    = LCD power
613 *       CLCP       =
614 *       CLAC       = LCD ack
615 *       CLFP       =
616 *       CLLP       =
617 */
618 /****************************************************************************/
619 static inline void chipcHw_activateLcdInterface(void)
620 {
621         reg32_write(&pChipcHw->LcdPifMode, chipcHw_REG_LCD_PIN_ENABLE);
622 }
623
624 /****************************************************************************/
625 /**
626 *  @brief   Deactivates PIF/LCD interface
627 *
628 *  This function deactivates PIF/LCD interface
629 *
630 *  @note
631 *       When deactivated LCD pins will be in rti-stated
632 *
633 */
634 /****************************************************************************/
635 static inline void chipcHw_deactivatePifLcdInterface(void)
636 {
637         reg32_write(&pChipcHw->LcdPifMode, 0);
638 }
639
640 /****************************************************************************/
641 /**
642 *  @brief   Select GE2
643 *
644 *  This function select GE2 as the graphic engine
645 *
646 */
647 /****************************************************************************/
648 static inline void chipcHw_selectGE2(void)
649 {
650         reg32_modify_and(&pChipcHw->MiscCtrl, ~chipcHw_REG_MISC_CTRL_GE_SEL);
651 }
652
653 /****************************************************************************/
654 /**
655 *  @brief   Select GE3
656 *
657 *  This function select GE3 as the graphic engine
658 *
659 */
660 /****************************************************************************/
661 static inline void chipcHw_selectGE3(void)
662 {
663         reg32_modify_or(&pChipcHw->MiscCtrl, chipcHw_REG_MISC_CTRL_GE_SEL);
664 }
665
666 /****************************************************************************/
667 /**
668 *  @brief   Get to know the configuration of GPIO pin
669 *
670 */
671 /****************************************************************************/
672 static inline chipcHw_GPIO_FUNCTION_e chipcHw_getGpioPinFunction(int pin)
673 {
674         return (*((uint32_t *) chipcHw_REG_GPIO_MUX(pin)) &
675                 (chipcHw_REG_GPIO_MUX_MASK <<
676                  chipcHw_REG_GPIO_MUX_POSITION(pin))) >>
677             chipcHw_REG_GPIO_MUX_POSITION(pin);
678 }
679
680 /****************************************************************************/
681 /**
682 *  @brief   Configure GPIO pin function
683 *
684 */
685 /****************************************************************************/
686 static inline void chipcHw_setGpioPinFunction(int pin,
687                                               chipcHw_GPIO_FUNCTION_e func)
688 {
689         REG_LOCAL_IRQ_SAVE;
690         *((uint32_t *) chipcHw_REG_GPIO_MUX(pin)) &=
691             ~(chipcHw_REG_GPIO_MUX_MASK << chipcHw_REG_GPIO_MUX_POSITION(pin));
692         *((uint32_t *) chipcHw_REG_GPIO_MUX(pin)) |=
693             func << chipcHw_REG_GPIO_MUX_POSITION(pin);
694         REG_LOCAL_IRQ_RESTORE;
695 }
696
697 /****************************************************************************/
698 /**
699 *  @brief   Set Pin slew rate
700 *
701 *  This function sets the slew of individual pin
702 *
703 */
704 /****************************************************************************/
705 static inline void chipcHw_setPinSlewRate(uint32_t pin,
706                                           chipcHw_PIN_SLEW_RATE_e slewRate)
707 {
708         REG_LOCAL_IRQ_SAVE;
709         *((uint32_t *) chipcHw_REG_SLEW_RATE(pin)) &=
710             ~(chipcHw_REG_SLEW_RATE_MASK <<
711               chipcHw_REG_SLEW_RATE_POSITION(pin));
712         *((uint32_t *) chipcHw_REG_SLEW_RATE(pin)) |=
713             (uint32_t) slewRate << chipcHw_REG_SLEW_RATE_POSITION(pin);
714         REG_LOCAL_IRQ_RESTORE;
715 }
716
717 /****************************************************************************/
718 /**
719 *  @brief   Set Pin output drive current
720 *
721 *  This function sets output drive current of individual pin
722 *
723 *  Note: Avoid the use of the word 'current' since linux headers define this
724 *        to be the current task.
725 */
726 /****************************************************************************/
727 static inline void chipcHw_setPinOutputCurrent(uint32_t pin,
728                                                chipcHw_PIN_CURRENT_STRENGTH_e
729                                                curr)
730 {
731         REG_LOCAL_IRQ_SAVE;
732         *((uint32_t *) chipcHw_REG_CURRENT(pin)) &=
733             ~(chipcHw_REG_CURRENT_MASK << chipcHw_REG_CURRENT_POSITION(pin));
734         *((uint32_t *) chipcHw_REG_CURRENT(pin)) |=
735             (uint32_t) curr << chipcHw_REG_CURRENT_POSITION(pin);
736         REG_LOCAL_IRQ_RESTORE;
737 }
738
739 /****************************************************************************/
740 /**
741 *  @brief   Set Pin pullup register
742 *
743 *  This function sets pullup register of individual pin
744 *
745 */
746 /****************************************************************************/
747 static inline void chipcHw_setPinPullup(uint32_t pin, chipcHw_PIN_PULL_e pullup)
748 {
749         REG_LOCAL_IRQ_SAVE;
750         *((uint32_t *) chipcHw_REG_PULLUP(pin)) &=
751             ~(chipcHw_REG_PULLUP_MASK << chipcHw_REG_PULLUP_POSITION(pin));
752         *((uint32_t *) chipcHw_REG_PULLUP(pin)) |=
753             (uint32_t) pullup << chipcHw_REG_PULLUP_POSITION(pin);
754         REG_LOCAL_IRQ_RESTORE;
755 }
756
757 /****************************************************************************/
758 /**
759 *  @brief   Set Pin input type
760 *
761 *  This function sets input type of individual pin
762 *
763 */
764 /****************************************************************************/
765 static inline void chipcHw_setPinInputType(uint32_t pin,
766                                            chipcHw_PIN_INPUTTYPE_e inputType)
767 {
768         REG_LOCAL_IRQ_SAVE;
769         *((uint32_t *) chipcHw_REG_INPUTTYPE(pin)) &=
770             ~(chipcHw_REG_INPUTTYPE_MASK <<
771               chipcHw_REG_INPUTTYPE_POSITION(pin));
772         *((uint32_t *) chipcHw_REG_INPUTTYPE(pin)) |=
773             (uint32_t) inputType << chipcHw_REG_INPUTTYPE_POSITION(pin);
774         REG_LOCAL_IRQ_RESTORE;
775 }
776
777 /****************************************************************************/
778 /**
779 *  @brief   Power up the USB PHY
780 *
781 *  This function powers up the USB PHY
782 *
783 */
784 /****************************************************************************/
785 static inline void chipcHw_powerUpUsbPhy(void)
786 {
787         reg32_modify_and(&pChipcHw->MiscCtrl,
788                          chipcHw_REG_MISC_CTRL_USB_POWERON);
789 }
790
791 /****************************************************************************/
792 /**
793 *  @brief   Power down the USB PHY
794 *
795 *  This function powers down the USB PHY
796 *
797 */
798 /****************************************************************************/
799 static inline void chipcHw_powerDownUsbPhy(void)
800 {
801         reg32_modify_or(&pChipcHw->MiscCtrl,
802                         chipcHw_REG_MISC_CTRL_USB_POWEROFF);
803 }
804
805 /****************************************************************************/
806 /**
807 *  @brief   Set the 2nd USB as host
808 *
809 *  This function sets the 2nd USB as host
810 *
811 */
812 /****************************************************************************/
813 static inline void chipcHw_setUsbHost(void)
814 {
815         reg32_modify_or(&pChipcHw->MiscCtrl,
816                         chipcHw_REG_MISC_CTRL_USB_MODE_HOST);
817 }
818
819 /****************************************************************************/
820 /**
821 *  @brief   Set the 2nd USB as device
822 *
823 *  This function sets the 2nd USB as device
824 *
825 */
826 /****************************************************************************/
827 static inline void chipcHw_setUsbDevice(void)
828 {
829         reg32_modify_and(&pChipcHw->MiscCtrl,
830                          chipcHw_REG_MISC_CTRL_USB_MODE_DEVICE);
831 }
832
833 /****************************************************************************/
834 /**
835 *  @brief   Lower layer funtion to enable/disable a clock of a certain device
836 *
837 *  This function enables/disables a core clock
838 *
839 */
840 /****************************************************************************/
841 static inline void chipcHw_setClock(chipcHw_CLOCK_e clock,
842                                     chipcHw_OPTYPE_e type, int mode)
843 {
844         volatile uint32_t *pPLLReg = (uint32_t *) 0x0;
845         volatile uint32_t *pClockCtrl = (uint32_t *) 0x0;
846
847         switch (clock) {
848         case chipcHw_CLOCK_DDR:
849                 pPLLReg = &pChipcHw->DDRClock;
850                 break;
851         case chipcHw_CLOCK_ARM:
852                 pPLLReg = &pChipcHw->ARMClock;
853                 break;
854         case chipcHw_CLOCK_ESW:
855                 pPLLReg = &pChipcHw->ESWClock;
856                 break;
857         case chipcHw_CLOCK_VPM:
858                 pPLLReg = &pChipcHw->VPMClock;
859                 break;
860         case chipcHw_CLOCK_ESW125:
861                 pPLLReg = &pChipcHw->ESW125Clock;
862                 break;
863         case chipcHw_CLOCK_UART:
864                 pPLLReg = &pChipcHw->UARTClock;
865                 break;
866         case chipcHw_CLOCK_SDIO0:
867                 pPLLReg = &pChipcHw->SDIO0Clock;
868                 break;
869         case chipcHw_CLOCK_SDIO1:
870                 pPLLReg = &pChipcHw->SDIO1Clock;
871                 break;
872         case chipcHw_CLOCK_SPI:
873                 pPLLReg = &pChipcHw->SPIClock;
874                 break;
875         case chipcHw_CLOCK_ETM:
876                 pPLLReg = &pChipcHw->ETMClock;
877                 break;
878         case chipcHw_CLOCK_USB:
879                 pPLLReg = &pChipcHw->USBClock;
880                 if (type == chipcHw_OPTYPE_OUTPUT) {
881                         if (mode) {
882                                 reg32_modify_and(pPLLReg,
883                                                  ~chipcHw_REG_PLL_CLOCK_POWER_DOWN);
884                         } else {
885                                 reg32_modify_or(pPLLReg,
886                                                 chipcHw_REG_PLL_CLOCK_POWER_DOWN);
887                         }
888                 }
889                 break;
890         case chipcHw_CLOCK_LCD:
891                 pPLLReg = &pChipcHw->LCDClock;
892                 if (type == chipcHw_OPTYPE_OUTPUT) {
893                         if (mode) {
894                                 reg32_modify_and(pPLLReg,
895                                                  ~chipcHw_REG_PLL_CLOCK_POWER_DOWN);
896                         } else {
897                                 reg32_modify_or(pPLLReg,
898                                                 chipcHw_REG_PLL_CLOCK_POWER_DOWN);
899                         }
900                 }
901                 break;
902         case chipcHw_CLOCK_APM:
903                 pPLLReg = &pChipcHw->APMClock;
904                 if (type == chipcHw_OPTYPE_OUTPUT) {
905                         if (mode) {
906                                 reg32_modify_and(pPLLReg,
907                                                  ~chipcHw_REG_PLL_CLOCK_POWER_DOWN);
908                         } else {
909                                 reg32_modify_or(pPLLReg,
910                                                 chipcHw_REG_PLL_CLOCK_POWER_DOWN);
911                         }
912                 }
913                 break;
914         case chipcHw_CLOCK_BUS:
915                 pClockCtrl = &pChipcHw->ACLKClock;
916                 break;
917         case chipcHw_CLOCK_OTP:
918                 pClockCtrl = &pChipcHw->OTPClock;
919                 break;
920         case chipcHw_CLOCK_I2C:
921                 pClockCtrl = &pChipcHw->I2CClock;
922                 break;
923         case chipcHw_CLOCK_I2S0:
924                 pClockCtrl = &pChipcHw->I2S0Clock;
925                 break;
926         case chipcHw_CLOCK_RTBUS:
927                 pClockCtrl = &pChipcHw->RTBUSClock;
928                 break;
929         case chipcHw_CLOCK_APM100:
930                 pClockCtrl = &pChipcHw->APM100Clock;
931                 break;
932         case chipcHw_CLOCK_TSC:
933                 pClockCtrl = &pChipcHw->TSCClock;
934                 break;
935         case chipcHw_CLOCK_LED:
936                 pClockCtrl = &pChipcHw->LEDClock;
937                 break;
938         case chipcHw_CLOCK_I2S1:
939                 pClockCtrl = &pChipcHw->I2S1Clock;
940                 break;
941         }
942
943         if (pPLLReg) {
944                 switch (type) {
945                 case chipcHw_OPTYPE_OUTPUT:
946                         /* PLL clock output enable/disable */
947                         if (mode) {
948                                 if (clock == chipcHw_CLOCK_DDR) {
949                                         /* DDR clock enable is inverted */
950                                         reg32_modify_and(pPLLReg,
951                                                          ~chipcHw_REG_PLL_CLOCK_OUTPUT_ENABLE);
952                                 } else {
953                                         reg32_modify_or(pPLLReg,
954                                                         chipcHw_REG_PLL_CLOCK_OUTPUT_ENABLE);
955                                 }
956                         } else {
957                                 if (clock == chipcHw_CLOCK_DDR) {
958                                         /* DDR clock disable is inverted */
959                                         reg32_modify_or(pPLLReg,
960                                                         chipcHw_REG_PLL_CLOCK_OUTPUT_ENABLE);
961                                 } else {
962                                         reg32_modify_and(pPLLReg,
963                                                          ~chipcHw_REG_PLL_CLOCK_OUTPUT_ENABLE);
964                                 }
965                         }
966                         break;
967                 case chipcHw_OPTYPE_BYPASS:
968                         /* PLL clock bypass enable/disable */
969                         if (mode) {
970                                 reg32_modify_or(pPLLReg,
971                                                 chipcHw_REG_PLL_CLOCK_BYPASS_SELECT);
972                         } else {
973                                 reg32_modify_and(pPLLReg,
974                                                  ~chipcHw_REG_PLL_CLOCK_BYPASS_SELECT);
975                         }
976                         break;
977                 }
978         } else if (pClockCtrl) {
979                 switch (type) {
980                 case chipcHw_OPTYPE_OUTPUT:
981                         if (mode) {
982                                 reg32_modify_or(pClockCtrl,
983                                                 chipcHw_REG_DIV_CLOCK_OUTPUT_ENABLE);
984                         } else {
985                                 reg32_modify_and(pClockCtrl,
986                                                  ~chipcHw_REG_DIV_CLOCK_OUTPUT_ENABLE);
987                         }
988                         break;
989                 case chipcHw_OPTYPE_BYPASS:
990                         if (mode) {
991                                 reg32_modify_or(pClockCtrl,
992                                                 chipcHw_REG_DIV_CLOCK_BYPASS_SELECT);
993                         } else {
994                                 reg32_modify_and(pClockCtrl,
995                                                  ~chipcHw_REG_DIV_CLOCK_BYPASS_SELECT);
996                         }
997                         break;
998                 }
999         }
1000 }
1001
1002 /****************************************************************************/
1003 /**
1004 *  @brief   Disables a core clock of a certain device
1005 *
1006 *  This function disables a core clock
1007 *
1008 *  @note    no change in power consumption
1009 */
1010 /****************************************************************************/
1011 static inline void chipcHw_setClockDisable(chipcHw_CLOCK_e clock)
1012 {
1013
1014         /* Disable output of the clock */
1015         chipcHw_setClock(clock, chipcHw_OPTYPE_OUTPUT, 0);
1016 }
1017
1018 /****************************************************************************/
1019 /**
1020 *  @brief   Enable a core clock of a certain device
1021 *
1022 *  This function enables a core clock
1023 *
1024 *  @note    no change in power consumption
1025 */
1026 /****************************************************************************/
1027 static inline void chipcHw_setClockEnable(chipcHw_CLOCK_e clock)
1028 {
1029
1030         /* Enable output of the clock */
1031         chipcHw_setClock(clock, chipcHw_OPTYPE_OUTPUT, 1);
1032 }
1033
1034 /****************************************************************************/
1035 /**
1036 *  @brief   Enables bypass clock of a certain device
1037 *
1038 *  This function enables bypass clock
1039 *
1040 *  @note    Doesnot affect the bus interface clock
1041 */
1042 /****************************************************************************/
1043 static inline void chipcHw_bypassClockEnable(chipcHw_CLOCK_e clock)
1044 {
1045         /* Enable bypass clock */
1046         chipcHw_setClock(clock, chipcHw_OPTYPE_BYPASS, 1);
1047 }
1048
1049 /****************************************************************************/
1050 /**
1051 *  @brief   Disabled bypass clock of a certain device
1052 *
1053 *  This function disables bypass clock
1054 *
1055 *  @note    Doesnot affect the bus interface clock
1056 */
1057 /****************************************************************************/
1058 static inline void chipcHw_bypassClockDisable(chipcHw_CLOCK_e clock)
1059 {
1060         /* Disable bypass clock */
1061         chipcHw_setClock(clock, chipcHw_OPTYPE_BYPASS, 0);
1062
1063 }
1064
1065 /****************************************************************************/
1066 /**  @brief Checks if software strap is enabled
1067  *
1068  *   @return 1 : When enable
1069  *           0 : When disable
1070  */
1071 /****************************************************************************/
1072 static inline int chipcHw_isSoftwareStrapsEnable(void)
1073 {
1074         return pChipcHw->SoftStraps & 0x00000001;
1075 }
1076
1077 /****************************************************************************/
1078 /**  @brief Enable software strap
1079  */
1080 /****************************************************************************/
1081 static inline void chipcHw_softwareStrapsEnable(void)
1082 {
1083         reg32_modify_or(&pChipcHw->SoftStraps, 0x00000001);
1084 }
1085
1086 /****************************************************************************/
1087 /**  @brief Disable software strap
1088  */
1089 /****************************************************************************/
1090 static inline void chipcHw_softwareStrapsDisable(void)
1091 {
1092         reg32_modify_and(&pChipcHw->SoftStraps, (~0x00000001));
1093 }
1094
1095 /****************************************************************************/
1096 /**  @brief PLL test enable
1097  */
1098 /****************************************************************************/
1099 static inline void chipcHw_pllTestEnable(void)
1100 {
1101         reg32_modify_or(&pChipcHw->PLLConfig,
1102                         chipcHw_REG_PLL_CONFIG_TEST_ENABLE);
1103 }
1104
1105 /****************************************************************************/
1106 /**  @brief PLL2 test enable
1107  */
1108 /****************************************************************************/
1109 static inline void chipcHw_pll2TestEnable(void)
1110 {
1111         reg32_modify_or(&pChipcHw->PLLConfig2,
1112                         chipcHw_REG_PLL_CONFIG_TEST_ENABLE);
1113 }
1114
1115 /****************************************************************************/
1116 /**  @brief PLL test disable
1117  */
1118 /****************************************************************************/
1119 static inline void chipcHw_pllTestDisable(void)
1120 {
1121         reg32_modify_and(&pChipcHw->PLLConfig,
1122                          ~chipcHw_REG_PLL_CONFIG_TEST_ENABLE);
1123 }
1124
1125 /****************************************************************************/
1126 /**  @brief PLL2 test disable
1127  */
1128 /****************************************************************************/
1129 static inline void chipcHw_pll2TestDisable(void)
1130 {
1131         reg32_modify_and(&pChipcHw->PLLConfig2,
1132                          ~chipcHw_REG_PLL_CONFIG_TEST_ENABLE);
1133 }
1134
1135 /****************************************************************************/
1136 /**  @brief Get PLL test status
1137  */
1138 /****************************************************************************/
1139 static inline int chipcHw_isPllTestEnable(void)
1140 {
1141         return pChipcHw->PLLConfig & chipcHw_REG_PLL_CONFIG_TEST_ENABLE;
1142 }
1143
1144 /****************************************************************************/
1145 /**  @brief Get PLL2 test status
1146  */
1147 /****************************************************************************/
1148 static inline int chipcHw_isPll2TestEnable(void)
1149 {
1150         return pChipcHw->PLLConfig2 & chipcHw_REG_PLL_CONFIG_TEST_ENABLE;
1151 }
1152
1153 /****************************************************************************/
1154 /**  @brief PLL test select
1155  */
1156 /****************************************************************************/
1157 static inline void chipcHw_pllTestSelect(uint32_t val)
1158 {
1159         REG_LOCAL_IRQ_SAVE;
1160         pChipcHw->PLLConfig &= ~chipcHw_REG_PLL_CONFIG_TEST_SELECT_MASK;
1161         pChipcHw->PLLConfig |=
1162             (val) << chipcHw_REG_PLL_CONFIG_TEST_SELECT_SHIFT;
1163         REG_LOCAL_IRQ_RESTORE;
1164 }
1165
1166 /****************************************************************************/
1167 /**  @brief PLL2 test select
1168  */
1169 /****************************************************************************/
1170 static inline void chipcHw_pll2TestSelect(uint32_t val)
1171 {
1172
1173         REG_LOCAL_IRQ_SAVE;
1174         pChipcHw->PLLConfig2 &= ~chipcHw_REG_PLL_CONFIG_TEST_SELECT_MASK;
1175         pChipcHw->PLLConfig2 |=
1176             (val) << chipcHw_REG_PLL_CONFIG_TEST_SELECT_SHIFT;
1177         REG_LOCAL_IRQ_RESTORE;
1178 }
1179
1180 /****************************************************************************/
1181 /**  @brief Get PLL test selected option
1182  */
1183 /****************************************************************************/
1184 static inline uint8_t chipcHw_getPllTestSelected(void)
1185 {
1186         return (uint8_t) ((pChipcHw->
1187                            PLLConfig & chipcHw_REG_PLL_CONFIG_TEST_SELECT_MASK)
1188                           >> chipcHw_REG_PLL_CONFIG_TEST_SELECT_SHIFT);
1189 }
1190
1191 /****************************************************************************/
1192 /**  @brief Get PLL2 test selected option
1193  */
1194 /****************************************************************************/
1195 static inline uint8_t chipcHw_getPll2TestSelected(void)
1196 {
1197         return (uint8_t) ((pChipcHw->
1198                            PLLConfig2 & chipcHw_REG_PLL_CONFIG_TEST_SELECT_MASK)
1199                           >> chipcHw_REG_PLL_CONFIG_TEST_SELECT_SHIFT);
1200 }
1201
1202 /****************************************************************************/
1203 /**
1204 *  @brief  Disable the PLL1
1205 *
1206 */
1207 /****************************************************************************/
1208 static inline void chipcHw_pll1Disable(void)
1209 {
1210         REG_LOCAL_IRQ_SAVE;
1211         pChipcHw->PLLConfig |= chipcHw_REG_PLL_CONFIG_POWER_DOWN;
1212         REG_LOCAL_IRQ_RESTORE;
1213 }
1214
1215 /****************************************************************************/
1216 /**
1217 *  @brief  Disable the PLL2
1218 *
1219 */
1220 /****************************************************************************/
1221 static inline void chipcHw_pll2Disable(void)
1222 {
1223         REG_LOCAL_IRQ_SAVE;
1224         pChipcHw->PLLConfig2 |= chipcHw_REG_PLL_CONFIG_POWER_DOWN;
1225         REG_LOCAL_IRQ_RESTORE;
1226 }
1227
1228 /****************************************************************************/
1229 /**
1230 *  @brief   Enables DDR SW phase alignment interrupt
1231 */
1232 /****************************************************************************/
1233 static inline void chipcHw_ddrPhaseAlignInterruptEnable(void)
1234 {
1235         REG_LOCAL_IRQ_SAVE;
1236         pChipcHw->Spare1 |= chipcHw_REG_SPARE1_DDR_PHASE_INTR_ENABLE;
1237         REG_LOCAL_IRQ_RESTORE;
1238 }
1239
1240 /****************************************************************************/
1241 /**
1242 *  @brief   Disables DDR SW phase alignment interrupt
1243 */
1244 /****************************************************************************/
1245 static inline void chipcHw_ddrPhaseAlignInterruptDisable(void)
1246 {
1247         REG_LOCAL_IRQ_SAVE;
1248         pChipcHw->Spare1 &= ~chipcHw_REG_SPARE1_DDR_PHASE_INTR_ENABLE;
1249         REG_LOCAL_IRQ_RESTORE;
1250 }
1251
1252 /****************************************************************************/
1253 /**
1254 *  @brief   Set VPM SW phase alignment interrupt mode
1255 *
1256 *  This function sets VPM phase alignment interrupt
1257 */
1258 /****************************************************************************/
1259 static inline void
1260 chipcHw_vpmPhaseAlignInterruptMode(chipcHw_VPM_HW_PHASE_INTR_e mode)
1261 {
1262         REG_LOCAL_IRQ_SAVE;
1263         if (mode == chipcHw_VPM_HW_PHASE_INTR_DISABLE) {
1264                 pChipcHw->Spare1 &= ~chipcHw_REG_SPARE1_VPM_PHASE_INTR_ENABLE;
1265         } else {
1266                 pChipcHw->Spare1 |= chipcHw_REG_SPARE1_VPM_PHASE_INTR_ENABLE;
1267         }
1268         pChipcHw->VPMPhaseCtrl2 =
1269             (pChipcHw->
1270              VPMPhaseCtrl2 & ~(chipcHw_REG_VPM_INTR_SELECT_MASK <<
1271                                chipcHw_REG_VPM_INTR_SELECT_SHIFT)) | mode;
1272         REG_LOCAL_IRQ_RESTORE;
1273 }
1274
1275 /****************************************************************************/
1276 /**
1277 *  @brief   Enable DDR phase alignment in software
1278 *
1279 */
1280 /****************************************************************************/
1281 static inline void chipcHw_ddrSwPhaseAlignEnable(void)
1282 {
1283         REG_LOCAL_IRQ_SAVE;
1284         pChipcHw->DDRPhaseCtrl1 |= chipcHw_REG_DDR_SW_PHASE_CTRL_ENABLE;
1285         REG_LOCAL_IRQ_RESTORE;
1286 }
1287
1288 /****************************************************************************/
1289 /**
1290 *  @brief   Disable DDR phase alignment in software
1291 *
1292 */
1293 /****************************************************************************/
1294 static inline void chipcHw_ddrSwPhaseAlignDisable(void)
1295 {
1296         REG_LOCAL_IRQ_SAVE;
1297         pChipcHw->DDRPhaseCtrl1 &= ~chipcHw_REG_DDR_SW_PHASE_CTRL_ENABLE;
1298         REG_LOCAL_IRQ_RESTORE;
1299 }
1300
1301 /****************************************************************************/
1302 /**
1303 *  @brief   Enable DDR phase alignment in hardware
1304 *
1305 */
1306 /****************************************************************************/
1307 static inline void chipcHw_ddrHwPhaseAlignEnable(void)
1308 {
1309         REG_LOCAL_IRQ_SAVE;
1310         pChipcHw->DDRPhaseCtrl1 |= chipcHw_REG_DDR_HW_PHASE_CTRL_ENABLE;
1311         REG_LOCAL_IRQ_RESTORE;
1312 }
1313
1314 /****************************************************************************/
1315 /**
1316 *  @brief   Disable DDR phase alignment in hardware
1317 *
1318 */
1319 /****************************************************************************/
1320 static inline void chipcHw_ddrHwPhaseAlignDisable(void)
1321 {
1322         REG_LOCAL_IRQ_SAVE;
1323         pChipcHw->DDRPhaseCtrl1 &= ~chipcHw_REG_DDR_HW_PHASE_CTRL_ENABLE;
1324         REG_LOCAL_IRQ_RESTORE;
1325 }
1326
1327 /****************************************************************************/
1328 /**
1329 *  @brief   Enable VPM phase alignment in software
1330 *
1331 */
1332 /****************************************************************************/
1333 static inline void chipcHw_vpmSwPhaseAlignEnable(void)
1334 {
1335         REG_LOCAL_IRQ_SAVE;
1336         pChipcHw->VPMPhaseCtrl1 |= chipcHw_REG_VPM_SW_PHASE_CTRL_ENABLE;
1337         REG_LOCAL_IRQ_RESTORE;
1338 }
1339
1340 /****************************************************************************/
1341 /**
1342 *  @brief   Disable VPM phase alignment in software
1343 *
1344 */
1345 /****************************************************************************/
1346 static inline void chipcHw_vpmSwPhaseAlignDisable(void)
1347 {
1348         REG_LOCAL_IRQ_SAVE;
1349         pChipcHw->VPMPhaseCtrl1 &= ~chipcHw_REG_VPM_SW_PHASE_CTRL_ENABLE;
1350         REG_LOCAL_IRQ_RESTORE;
1351 }
1352
1353 /****************************************************************************/
1354 /**
1355 *  @brief   Enable VPM phase alignment in hardware
1356 *
1357 */
1358 /****************************************************************************/
1359 static inline void chipcHw_vpmHwPhaseAlignEnable(void)
1360 {
1361         REG_LOCAL_IRQ_SAVE;
1362         pChipcHw->VPMPhaseCtrl1 |= chipcHw_REG_VPM_HW_PHASE_CTRL_ENABLE;
1363         REG_LOCAL_IRQ_RESTORE;
1364 }
1365
1366 /****************************************************************************/
1367 /**
1368 *  @brief   Disable VPM phase alignment in hardware
1369 *
1370 */
1371 /****************************************************************************/
1372 static inline void chipcHw_vpmHwPhaseAlignDisable(void)
1373 {
1374         REG_LOCAL_IRQ_SAVE;
1375         pChipcHw->VPMPhaseCtrl1 &= ~chipcHw_REG_VPM_HW_PHASE_CTRL_ENABLE;
1376         REG_LOCAL_IRQ_RESTORE;
1377 }
1378
1379 /****************************************************************************/
1380 /**
1381 *  @brief   Set DDR phase alignment margin in hardware
1382 *
1383 */
1384 /****************************************************************************/
1385 static inline void
1386 chipcHw_setDdrHwPhaseAlignMargin(chipcHw_DDR_HW_PHASE_MARGIN_e margin)
1387 {
1388         uint32_t ge = 0;
1389         uint32_t le = 0;
1390
1391         switch (margin) {
1392         case chipcHw_DDR_HW_PHASE_MARGIN_STRICT:
1393                 ge = 0x0F;
1394                 le = 0x0F;
1395                 break;
1396         case chipcHw_DDR_HW_PHASE_MARGIN_MEDIUM:
1397                 ge = 0x03;
1398                 le = 0x3F;
1399                 break;
1400         case chipcHw_DDR_HW_PHASE_MARGIN_WIDE:
1401                 ge = 0x01;
1402                 le = 0x7F;
1403                 break;
1404         }
1405
1406         {
1407                 REG_LOCAL_IRQ_SAVE;
1408
1409                 pChipcHw->DDRPhaseCtrl1 &=
1410                     ~((chipcHw_REG_DDR_PHASE_VALUE_GE_MASK <<
1411                        chipcHw_REG_DDR_PHASE_VALUE_GE_SHIFT)
1412                       || (chipcHw_REG_DDR_PHASE_VALUE_LE_MASK <<
1413                           chipcHw_REG_DDR_PHASE_VALUE_LE_SHIFT));
1414
1415                 pChipcHw->DDRPhaseCtrl1 |=
1416                     ((ge << chipcHw_REG_DDR_PHASE_VALUE_GE_SHIFT)
1417                      || (le << chipcHw_REG_DDR_PHASE_VALUE_LE_SHIFT));
1418
1419                 REG_LOCAL_IRQ_RESTORE;
1420         }
1421 }
1422
1423 /****************************************************************************/
1424 /**
1425 *  @brief   Set VPM phase alignment margin in hardware
1426 *
1427 */
1428 /****************************************************************************/
1429 static inline void
1430 chipcHw_setVpmHwPhaseAlignMargin(chipcHw_VPM_HW_PHASE_MARGIN_e margin)
1431 {
1432         uint32_t ge = 0;
1433         uint32_t le = 0;
1434
1435         switch (margin) {
1436         case chipcHw_VPM_HW_PHASE_MARGIN_STRICT:
1437                 ge = 0x0F;
1438                 le = 0x0F;
1439                 break;
1440         case chipcHw_VPM_HW_PHASE_MARGIN_MEDIUM:
1441                 ge = 0x03;
1442                 le = 0x3F;
1443                 break;
1444         case chipcHw_VPM_HW_PHASE_MARGIN_WIDE:
1445                 ge = 0x01;
1446                 le = 0x7F;
1447                 break;
1448         }
1449
1450         {
1451                 REG_LOCAL_IRQ_SAVE;
1452
1453                 pChipcHw->VPMPhaseCtrl1 &=
1454                     ~((chipcHw_REG_VPM_PHASE_VALUE_GE_MASK <<
1455                        chipcHw_REG_VPM_PHASE_VALUE_GE_SHIFT)
1456                       || (chipcHw_REG_VPM_PHASE_VALUE_LE_MASK <<
1457                           chipcHw_REG_VPM_PHASE_VALUE_LE_SHIFT));
1458
1459                 pChipcHw->VPMPhaseCtrl1 |=
1460                     ((ge << chipcHw_REG_VPM_PHASE_VALUE_GE_SHIFT)
1461                      || (le << chipcHw_REG_VPM_PHASE_VALUE_LE_SHIFT));
1462
1463                 REG_LOCAL_IRQ_RESTORE;
1464         }
1465 }
1466
1467 /****************************************************************************/
1468 /**
1469 *  @brief   Checks DDR phase aligned status done by HW
1470 *
1471 *  @return  1: When aligned
1472 *           0: When not aligned
1473 */
1474 /****************************************************************************/
1475 static inline uint32_t chipcHw_isDdrHwPhaseAligned(void)
1476 {
1477         return (pChipcHw->
1478                 PhaseAlignStatus & chipcHw_REG_DDR_PHASE_ALIGNED) ? 1 : 0;
1479 }
1480
1481 /****************************************************************************/
1482 /**
1483 *  @brief   Checks VPM phase aligned status done by HW
1484 *
1485 *  @return  1: When aligned
1486 *           0: When not aligned
1487 */
1488 /****************************************************************************/
1489 static inline uint32_t chipcHw_isVpmHwPhaseAligned(void)
1490 {
1491         return (pChipcHw->
1492                 PhaseAlignStatus & chipcHw_REG_VPM_PHASE_ALIGNED) ? 1 : 0;
1493 }
1494
1495 /****************************************************************************/
1496 /**
1497 *  @brief   Get DDR phase aligned status done by HW
1498 *
1499 */
1500 /****************************************************************************/
1501 static inline uint32_t chipcHw_getDdrHwPhaseAlignStatus(void)
1502 {
1503         return (pChipcHw->
1504                 PhaseAlignStatus & chipcHw_REG_DDR_PHASE_STATUS_MASK) >>
1505             chipcHw_REG_DDR_PHASE_STATUS_SHIFT;
1506 }
1507
1508 /****************************************************************************/
1509 /**
1510 *  @brief   Get VPM phase aligned status done by HW
1511 *
1512 */
1513 /****************************************************************************/
1514 static inline uint32_t chipcHw_getVpmHwPhaseAlignStatus(void)
1515 {
1516         return (pChipcHw->
1517                 PhaseAlignStatus & chipcHw_REG_VPM_PHASE_STATUS_MASK) >>
1518             chipcHw_REG_VPM_PHASE_STATUS_SHIFT;
1519 }
1520
1521 /****************************************************************************/
1522 /**
1523 *  @brief   Get DDR phase control value
1524 *
1525 */
1526 /****************************************************************************/
1527 static inline uint32_t chipcHw_getDdrPhaseControl(void)
1528 {
1529         return (pChipcHw->
1530                 PhaseAlignStatus & chipcHw_REG_DDR_PHASE_CTRL_MASK) >>
1531             chipcHw_REG_DDR_PHASE_CTRL_SHIFT;
1532 }
1533
1534 /****************************************************************************/
1535 /**
1536 *  @brief   Get VPM phase control value
1537 *
1538 */
1539 /****************************************************************************/
1540 static inline uint32_t chipcHw_getVpmPhaseControl(void)
1541 {
1542         return (pChipcHw->
1543                 PhaseAlignStatus & chipcHw_REG_VPM_PHASE_CTRL_MASK) >>
1544             chipcHw_REG_VPM_PHASE_CTRL_SHIFT;
1545 }
1546
1547 /****************************************************************************/
1548 /**
1549 *  @brief   DDR phase alignment timeout count
1550 *
1551 *  @note    If HW fails to perform the phase alignment, it will trigger
1552 *           a DDR phase alignment timeout interrupt.
1553 */
1554 /****************************************************************************/
1555 static inline void chipcHw_ddrHwPhaseAlignTimeout(uint32_t busCycle)
1556 {
1557         REG_LOCAL_IRQ_SAVE;
1558         pChipcHw->DDRPhaseCtrl2 &=
1559             ~(chipcHw_REG_DDR_PHASE_TIMEOUT_COUNT_MASK <<
1560               chipcHw_REG_DDR_PHASE_TIMEOUT_COUNT_SHIFT);
1561         pChipcHw->DDRPhaseCtrl2 |=
1562             (busCycle & chipcHw_REG_DDR_PHASE_TIMEOUT_COUNT_MASK) <<
1563             chipcHw_REG_DDR_PHASE_TIMEOUT_COUNT_SHIFT;
1564         REG_LOCAL_IRQ_RESTORE;
1565 }
1566
1567 /****************************************************************************/
1568 /**
1569 *  @brief   VPM phase alignment timeout count
1570 *
1571 *  @note    If HW fails to perform the phase alignment, it will trigger
1572 *           a VPM phase alignment timeout interrupt.
1573 */
1574 /****************************************************************************/
1575 static inline void chipcHw_vpmHwPhaseAlignTimeout(uint32_t busCycle)
1576 {
1577         REG_LOCAL_IRQ_SAVE;
1578         pChipcHw->VPMPhaseCtrl2 &=
1579             ~(chipcHw_REG_VPM_PHASE_TIMEOUT_COUNT_MASK <<
1580               chipcHw_REG_VPM_PHASE_TIMEOUT_COUNT_SHIFT);
1581         pChipcHw->VPMPhaseCtrl2 |=
1582             (busCycle & chipcHw_REG_VPM_PHASE_TIMEOUT_COUNT_MASK) <<
1583             chipcHw_REG_VPM_PHASE_TIMEOUT_COUNT_SHIFT;
1584         REG_LOCAL_IRQ_RESTORE;
1585 }
1586
1587 /****************************************************************************/
1588 /**
1589 *  @brief   Clear DDR phase alignment timeout interrupt
1590 *
1591 */
1592 /****************************************************************************/
1593 static inline void chipcHw_ddrHwPhaseAlignTimeoutInterruptClear(void)
1594 {
1595         REG_LOCAL_IRQ_SAVE;
1596         /* Clear timeout interrupt service bit */
1597         pChipcHw->DDRPhaseCtrl2 |= chipcHw_REG_DDR_INTR_SERVICED;
1598         pChipcHw->DDRPhaseCtrl2 &= ~chipcHw_REG_DDR_INTR_SERVICED;
1599         REG_LOCAL_IRQ_RESTORE;
1600 }
1601
1602 /****************************************************************************/
1603 /**
1604 *  @brief   Clear VPM phase alignment timeout interrupt
1605 *
1606 */
1607 /****************************************************************************/
1608 static inline void chipcHw_vpmHwPhaseAlignTimeoutInterruptClear(void)
1609 {
1610         REG_LOCAL_IRQ_SAVE;
1611         /* Clear timeout interrupt service bit */
1612         pChipcHw->VPMPhaseCtrl2 |= chipcHw_REG_VPM_INTR_SERVICED;
1613         pChipcHw->VPMPhaseCtrl2 &= ~chipcHw_REG_VPM_INTR_SERVICED;
1614         REG_LOCAL_IRQ_RESTORE;
1615 }
1616
1617 /****************************************************************************/
1618 /**
1619 *  @brief   DDR phase alignment timeout interrupt enable
1620 *
1621 */
1622 /****************************************************************************/
1623 static inline void chipcHw_ddrHwPhaseAlignTimeoutInterruptEnable(void)
1624 {
1625         REG_LOCAL_IRQ_SAVE;
1626         chipcHw_ddrHwPhaseAlignTimeoutInterruptClear(); /* Recommended */
1627         /* Enable timeout interrupt */
1628         pChipcHw->DDRPhaseCtrl2 |= chipcHw_REG_DDR_TIMEOUT_INTR_ENABLE;
1629         REG_LOCAL_IRQ_RESTORE;
1630 }
1631
1632 /****************************************************************************/
1633 /**
1634 *  @brief   VPM phase alignment timeout interrupt enable
1635 *
1636 */
1637 /****************************************************************************/
1638 static inline void chipcHw_vpmHwPhaseAlignTimeoutInterruptEnable(void)
1639 {
1640         REG_LOCAL_IRQ_SAVE;
1641         chipcHw_vpmHwPhaseAlignTimeoutInterruptClear(); /* Recommended */
1642         /* Enable timeout interrupt */
1643         pChipcHw->VPMPhaseCtrl2 |= chipcHw_REG_VPM_TIMEOUT_INTR_ENABLE;
1644         REG_LOCAL_IRQ_RESTORE;
1645 }
1646
1647 /****************************************************************************/
1648 /**
1649 *  @brief   DDR phase alignment timeout interrupt disable
1650 *
1651 */
1652 /****************************************************************************/
1653 static inline void chipcHw_ddrHwPhaseAlignTimeoutInterruptDisable(void)
1654 {
1655         REG_LOCAL_IRQ_SAVE;
1656         pChipcHw->DDRPhaseCtrl2 &= ~chipcHw_REG_DDR_TIMEOUT_INTR_ENABLE;
1657         REG_LOCAL_IRQ_RESTORE;
1658 }
1659
1660 /****************************************************************************/
1661 /**
1662 *  @brief   VPM phase alignment timeout interrupt disable
1663 *
1664 */
1665 /****************************************************************************/
1666 static inline void chipcHw_vpmHwPhaseAlignTimeoutInterruptDisable(void)
1667 {
1668         REG_LOCAL_IRQ_SAVE;
1669         pChipcHw->VPMPhaseCtrl2 &= ~chipcHw_REG_VPM_TIMEOUT_INTR_ENABLE;
1670         REG_LOCAL_IRQ_RESTORE;
1671 }
1672
1673 #endif /* CHIPC_INLINE_H */