remove linux 2.4 specific build system code
[openwrt/svn-archive/archive.git] / target / linux / generic-2.6 / files / crypto / ocf / kirkwood / mvHal / kw_family / boardEnv / mvBoardEnvLib.c
1 /*******************************************************************************
2 Copyright (C) Marvell International Ltd. and its affiliates
3
4 This software file (the "File") is owned and distributed by Marvell
5 International Ltd. and/or its affiliates ("Marvell") under the following
6 alternative licensing terms. Once you have made an election to distribute the
7 File under one of the following license alternatives, please (i) delete this
8 introductory statement regarding license alternatives, (ii) delete the two
9 license alternatives that you have not elected to use and (iii) preserve the
10 Marvell copyright notice above.
11
12 ********************************************************************************
13 Marvell Commercial License Option
14
15 If you received this File from Marvell and you have entered into a commercial
16 license agreement (a "Commercial License") with Marvell, the File is licensed
17 to you under the terms of the applicable Commercial License.
18
19 ********************************************************************************
20 Marvell GPL License Option
21
22 If you received this File from Marvell, you may opt to use, redistribute and/or
23 modify this File in accordance with the terms and conditions of the General
24 Public License Version 2, June 1991 (the "GPL License"), a copy of which is
25 available along with the File in the license.txt file or by writing to the Free
26 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
27 on the worldwide web at http://www.gnu.org/licenses/gpl.txt.
28
29 THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
30 WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
31 DISCLAIMED. The GPL License provides additional details about this warranty
32 disclaimer.
33 ********************************************************************************
34 Marvell BSD License Option
35
36 If you received this File from Marvell, you may opt to use, redistribute and/or
37 modify this File under the following licensing terms.
38 Redistribution and use in source and binary forms, with or without modification,
39 are permitted provided that the following conditions are met:
40
41 * Redistributions of source code must retain the above copyright notice,
42 this list of conditions and the following disclaimer.
43
44 * Redistributions in binary form must reproduce the above copyright
45 notice, this list of conditions and the following disclaimer in the
46 documentation and/or other materials provided with the distribution.
47
48 * Neither the name of Marvell nor the names of its contributors may be
49 used to endorse or promote products derived from this software without
50 specific prior written permission.
51
52 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
53 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
54 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
55 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
56 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
57 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
58 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
59 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
60 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
61 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
62
63 *******************************************************************************/
64
65 #include "boardEnv/mvBoardEnvLib.h"
66 #include "ctrlEnv/mvCtrlEnvLib.h"
67 #include "ctrlEnv/sys/mvCpuIf.h"
68 #include "cpu/mvCpu.h"
69 #include "cntmr/mvCntmr.h"
70 #include "gpp/mvGpp.h"
71 #include "twsi/mvTwsi.h"
72 #include "pex/mvPex.h"
73 #include "device/mvDevice.h"
74 #include "eth/gbe/mvEthRegs.h"
75
76 /* defines */
77 /* #define MV_DEBUG */
78 #ifdef MV_DEBUG
79 #define DB(x) x
80 #else
81 #define DB(x)
82 #endif
83
84 extern MV_CPU_ARM_CLK _cpuARMDDRCLK[];
85
86 #define CODE_IN_ROM MV_FALSE
87 #define CODE_IN_RAM MV_TRUE
88
89 extern MV_BOARD_INFO* boardInfoTbl[];
90 #define BOARD_INFO(boardId) boardInfoTbl[boardId - BOARD_ID_BASE]
91
92 /* Locals */
93 static MV_DEV_CS_INFO* boardGetDevEntry(MV_32 devNum, MV_BOARD_DEV_CLASS devClass);
94
95 MV_U32 tClkRate = -1;
96
97
98 /*******************************************************************************
99 * mvBoardEnvInit - Init board
100 *
101 * DESCRIPTION:
102 * In this function the board environment take care of device bank
103 * initialization.
104 *
105 * INPUT:
106 * None.
107 *
108 * OUTPUT:
109 * None.
110 *
111 * RETURN:
112 * None.
113 *
114 *******************************************************************************/
115 MV_VOID mvBoardEnvInit(MV_VOID)
116 {
117 MV_U32 boardId= mvBoardIdGet();
118
119 if (!((boardId >= BOARD_ID_BASE)&&(boardId < MV_MAX_BOARD_ID)))
120 {
121 mvOsPrintf("mvBoardEnvInit:Board unknown.\n");
122 return;
123
124 }
125
126 /* Set GPP Out value */
127 MV_REG_WRITE(GPP_DATA_OUT_REG(0), BOARD_INFO(boardId)->gppOutValLow);
128 MV_REG_WRITE(GPP_DATA_OUT_REG(1), BOARD_INFO(boardId)->gppOutValHigh);
129
130 /* set GPP polarity */
131 mvGppPolaritySet(0, 0xFFFFFFFF, BOARD_INFO(boardId)->gppPolarityValLow);
132 mvGppPolaritySet(1, 0xFFFFFFFF, BOARD_INFO(boardId)->gppPolarityValHigh);
133
134 /* Workaround for Erratum FE-MISC-70*/
135 if(mvCtrlRevGet()==MV_88F6XXX_A0_REV)
136 {
137 BOARD_INFO(boardId)->gppOutEnValLow &= 0xfffffffd;
138 BOARD_INFO(boardId)->gppOutEnValLow |= (BOARD_INFO(boardId)->gppOutEnValHigh) & 0x00000002;
139 } /*End of WA*/
140
141 /* Set GPP Out Enable*/
142 mvGppTypeSet(0, 0xFFFFFFFF, BOARD_INFO(boardId)->gppOutEnValLow);
143 mvGppTypeSet(1, 0xFFFFFFFF, BOARD_INFO(boardId)->gppOutEnValHigh);
144
145 /* Nand CE */
146 MV_REG_BIT_SET(NAND_CTRL_REG, NAND_ACTCEBOOT_BIT);
147 }
148
149 /*******************************************************************************
150 * mvBoardModelGet - Get Board model
151 *
152 * DESCRIPTION:
153 * This function returns 16bit describing board model.
154 * Board model is constructed of one byte major and minor numbers in the
155 * following manner:
156 *
157 * INPUT:
158 * None.
159 *
160 * OUTPUT:
161 * None.
162 *
163 * RETURN:
164 * String describing board model.
165 *
166 *******************************************************************************/
167 MV_U16 mvBoardModelGet(MV_VOID)
168 {
169 return (mvBoardIdGet() >> 16);
170 }
171
172 /*******************************************************************************
173 * mbBoardRevlGet - Get Board revision
174 *
175 * DESCRIPTION:
176 * This function returns a 32bit describing the board revision.
177 * Board revision is constructed of 4bytes. 2bytes describes major number
178 * and the other 2bytes describes minor munber.
179 * For example for board revision 3.4 the function will return
180 * 0x00030004.
181 *
182 * INPUT:
183 * None.
184 *
185 * OUTPUT:
186 * None.
187 *
188 * RETURN:
189 * String describing board model.
190 *
191 *******************************************************************************/
192 MV_U16 mvBoardRevGet(MV_VOID)
193 {
194 return (mvBoardIdGet() & 0xFFFF);
195 }
196
197 /*******************************************************************************
198 * mvBoardNameGet - Get Board name
199 *
200 * DESCRIPTION:
201 * This function returns a string describing the board model and revision.
202 * String is extracted from board I2C EEPROM.
203 *
204 * INPUT:
205 * None.
206 *
207 * OUTPUT:
208 * pNameBuff - Buffer to contain board name string. Minimum size 32 chars.
209 *
210 * RETURN:
211 *
212 * MV_ERROR if informantion can not be read.
213 *******************************************************************************/
214 MV_STATUS mvBoardNameGet(char *pNameBuff)
215 {
216 MV_U32 boardId= mvBoardIdGet();
217
218 if (!((boardId >= BOARD_ID_BASE)&&(boardId < MV_MAX_BOARD_ID)))
219 {
220 mvOsSPrintf (pNameBuff, "Board unknown.\n");
221 return MV_ERROR;
222
223 }
224
225 mvOsSPrintf (pNameBuff, "%s",BOARD_INFO(boardId)->boardName);
226
227 return MV_OK;
228 }
229
230 /*******************************************************************************
231 * mvBoardIsPortInSgmii -
232 *
233 * DESCRIPTION:
234 * This routine returns MV_TRUE for port number works in SGMII or MV_FALSE
235 * For all other options.
236 *
237 * INPUT:
238 * ethPortNum - Ethernet port number.
239 *
240 * OUTPUT:
241 * None.
242 *
243 * RETURN:
244 * MV_TRUE - port in SGMII.
245 * MV_FALSE - other.
246 *
247 *******************************************************************************/
248 MV_BOOL mvBoardIsPortInSgmii(MV_U32 ethPortNum)
249 {
250 MV_BOOL ethPortSgmiiSupport[BOARD_ETH_PORT_NUM] = MV_ETH_PORT_SGMII;
251
252 if(ethPortNum >= BOARD_ETH_PORT_NUM)
253 {
254 mvOsPrintf ("Invalid portNo=%d\n", ethPortNum);
255 return MV_FALSE;
256 }
257 return ethPortSgmiiSupport[ethPortNum];
258 }
259
260 /*******************************************************************************
261 * mvBoardIsPortInGmii -
262 *
263 * DESCRIPTION:
264 * This routine returns MV_TRUE for port number works in GMII or MV_FALSE
265 * For all other options.
266 *
267 * INPUT:
268 *
269 * OUTPUT:
270 * None.
271 *
272 * RETURN:
273 * MV_TRUE - port in GMII.
274 * MV_FALSE - other.
275 *
276 *******************************************************************************/
277 MV_BOOL mvBoardIsPortInGmii(MV_VOID)
278 {
279 MV_U32 devClassId, devClass = 0;
280 if (mvBoardMppGroupTypeGet(devClass) == MV_BOARD_AUTO)
281 {
282 /* Get MPP module ID */
283 devClassId = mvBoarModuleTypeGet(devClass);
284 if (MV_BOARD_MODULE_GMII_ID == devClassId)
285 return MV_TRUE;
286 }
287 else if (mvBoardMppGroupTypeGet(devClass) == MV_BOARD_GMII)
288 return MV_TRUE;
289
290 return MV_FALSE;
291 }
292 /*******************************************************************************
293 * mvBoardPhyAddrGet - Get the phy address
294 *
295 * DESCRIPTION:
296 * This routine returns the Phy address of a given ethernet port.
297 *
298 * INPUT:
299 * ethPortNum - Ethernet port number.
300 *
301 * OUTPUT:
302 * None.
303 *
304 * RETURN:
305 * 32bit describing Phy address, -1 if the port number is wrong.
306 *
307 *******************************************************************************/
308 MV_32 mvBoardPhyAddrGet(MV_U32 ethPortNum)
309 {
310 MV_U32 boardId= mvBoardIdGet();
311
312 if (!((boardId >= BOARD_ID_BASE)&&(boardId < MV_MAX_BOARD_ID)))
313 {
314 mvOsPrintf("mvBoardPhyAddrGet: Board unknown.\n");
315 return MV_ERROR;
316 }
317
318 return BOARD_INFO(boardId)->pBoardMacInfo[ethPortNum].boardEthSmiAddr;
319 }
320
321 /*******************************************************************************
322 * mvBoardMacSpeedGet - Get the Mac speed
323 *
324 * DESCRIPTION:
325 * This routine returns the Mac speed if pre define of a given ethernet port.
326 *
327 * INPUT:
328 * ethPortNum - Ethernet port number.
329 *
330 * OUTPUT:
331 * None.
332 *
333 * RETURN:
334 * MV_BOARD_MAC_SPEED, -1 if the port number is wrong.
335 *
336 *******************************************************************************/
337 MV_BOARD_MAC_SPEED mvBoardMacSpeedGet(MV_U32 ethPortNum)
338 {
339 MV_U32 boardId= mvBoardIdGet();
340
341 if (!((boardId >= BOARD_ID_BASE)&&(boardId < MV_MAX_BOARD_ID)))
342 {
343 mvOsPrintf("mvBoardMacSpeedGet: Board unknown.\n");
344 return MV_ERROR;
345 }
346
347 return BOARD_INFO(boardId)->pBoardMacInfo[ethPortNum].boardMacSpeed;
348 }
349
350 /*******************************************************************************
351 * mvBoardLinkStatusIrqGet - Get the IRQ number for the link status indication
352 *
353 * DESCRIPTION:
354 * This routine returns the IRQ number for the link status indication.
355 *
356 * INPUT:
357 * ethPortNum - Ethernet port number.
358 *
359 * OUTPUT:
360 * None.
361 *
362 * RETURN:
363 * the number of the IRQ for the link status indication, -1 if the port
364 * number is wrong or if not relevant.
365 *
366 *******************************************************************************/
367 MV_32 mvBoardLinkStatusIrqGet(MV_U32 ethPortNum)
368 {
369 MV_U32 boardId = mvBoardIdGet();
370
371 if (!((boardId >= BOARD_ID_BASE)&&(boardId < MV_MAX_BOARD_ID)))
372 {
373 mvOsPrintf("mvBoardLinkStatusIrqGet: Board unknown.\n");
374 return MV_ERROR;
375 }
376
377 return BOARD_INFO(boardId)->pSwitchInfo[ethPortNum].linkStatusIrq;
378 }
379
380 /*******************************************************************************
381 * mvBoardSwitchPortGet - Get the mapping between the board connector and the
382 * Ethernet Switch port
383 *
384 * DESCRIPTION:
385 * This routine returns the matching Switch port.
386 *
387 * INPUT:
388 * ethPortNum - Ethernet port number.
389 * boardPortNum - logical number of the connector on the board
390 *
391 * OUTPUT:
392 * None.
393 *
394 * RETURN:
395 * the matching Switch port, -1 if the port number is wrong or if not relevant.
396 *
397 *******************************************************************************/
398 MV_32 mvBoardSwitchPortGet(MV_U32 ethPortNum, MV_U8 boardPortNum)
399 {
400 MV_U32 boardId = mvBoardIdGet();
401
402 if (!((boardId >= BOARD_ID_BASE)&&(boardId < MV_MAX_BOARD_ID)))
403 {
404 mvOsPrintf("mvBoardSwitchPortGet: Board unknown.\n");
405 return MV_ERROR;
406 }
407 if (boardPortNum >= BOARD_ETH_SWITCH_PORT_NUM)
408 {
409 mvOsPrintf("mvBoardSwitchPortGet: Illegal board port number.\n");
410 return MV_ERROR;
411 }
412
413 return BOARD_INFO(boardId)->pSwitchInfo[ethPortNum].qdPort[boardPortNum];
414 }
415
416 /*******************************************************************************
417 * mvBoardSwitchCpuPortGet - Get the the Ethernet Switch CPU port
418 *
419 * DESCRIPTION:
420 * This routine returns the Switch CPU port.
421 *
422 * INPUT:
423 * ethPortNum - Ethernet port number.
424 *
425 * OUTPUT:
426 * None.
427 *
428 * RETURN:
429 * the Switch CPU port, -1 if the port number is wrong or if not relevant.
430 *
431 *******************************************************************************/
432 MV_32 mvBoardSwitchCpuPortGet(MV_U32 ethPortNum)
433 {
434 MV_U32 boardId = mvBoardIdGet();
435
436 if (!((boardId >= BOARD_ID_BASE)&&(boardId < MV_MAX_BOARD_ID)))
437 {
438 mvOsPrintf("mvBoardSwitchCpuPortGet: Board unknown.\n");
439 return MV_ERROR;
440 }
441
442 return BOARD_INFO(boardId)->pSwitchInfo[ethPortNum].qdCpuPort;
443 }
444
445 /*******************************************************************************
446 * mvBoardIsSwitchConnected - Get switch connection status
447 * DESCRIPTION:
448 * This routine returns port's connection status
449 *
450 * INPUT:
451 * ethPortNum - Ethernet port number.
452 *
453 * OUTPUT:
454 * None.
455 *
456 * RETURN:
457 * 1 - if ethPortNum is connected to switch, 0 otherwise
458 *
459 *******************************************************************************/
460 MV_32 mvBoardIsSwitchConnected(MV_U32 ethPortNum)
461 {
462 MV_U32 boardId = mvBoardIdGet();
463
464 if (!((boardId >= BOARD_ID_BASE)&&(boardId < MV_MAX_BOARD_ID)))
465 {
466 mvOsPrintf("mvBoardIsSwitchConnected: Board unknown.\n");
467 return MV_ERROR;
468 }
469
470 if(ethPortNum >= BOARD_INFO(boardId)->numBoardMacInfo)
471 {
472 mvOsPrintf("mvBoardIsSwitchConnected: Illegal port number(%u)\n", ethPortNum);
473 return MV_ERROR;
474 }
475
476 if((MV_32)(BOARD_INFO(boardId)->pSwitchInfo))
477 return (MV_32)(BOARD_INFO(boardId)->pSwitchInfo[ethPortNum].switchOnPort == ethPortNum);
478 else
479 return 0;
480 }
481 /*******************************************************************************
482 * mvBoardSmiScanModeGet - Get Switch SMI scan mode
483 *
484 * DESCRIPTION:
485 * This routine returns Switch SMI scan mode.
486 *
487 * INPUT:
488 * ethPortNum - Ethernet port number.
489 *
490 * OUTPUT:
491 * None.
492 *
493 * RETURN:
494 * 1 for SMI_MANUAL_MODE, -1 if the port number is wrong or if not relevant.
495 *
496 *******************************************************************************/
497 MV_32 mvBoardSmiScanModeGet(MV_U32 ethPortNum)
498 {
499 MV_U32 boardId = mvBoardIdGet();
500
501 if (!((boardId >= BOARD_ID_BASE)&&(boardId < MV_MAX_BOARD_ID)))
502 {
503 mvOsPrintf("mvBoardSmiScanModeGet: Board unknown.\n");
504 return MV_ERROR;
505 }
506
507 return BOARD_INFO(boardId)->pSwitchInfo[ethPortNum].smiScanMode;
508 }
509 /*******************************************************************************
510 * mvBoardSpecInitGet -
511 *
512 * DESCRIPTION:
513 *
514 * INPUT:
515 *
516 * OUTPUT:
517 * None.
518 *
519 * RETURN: Return MV_TRUE and parameters in case board need spesific phy init,
520 * otherwise return MV_FALSE.
521 *
522 *
523 *******************************************************************************/
524
525 MV_BOOL mvBoardSpecInitGet(MV_U32* regOff, MV_U32* data)
526 {
527 return MV_FALSE;
528 }
529
530 /*******************************************************************************
531 * mvBoardTclkGet - Get the board Tclk (Controller clock)
532 *
533 * DESCRIPTION:
534 * This routine extract the controller core clock.
535 * This function uses the controller counters to make identification.
536 * Note: In order to avoid interference, make sure task context switch
537 * and interrupts will not occure during this function operation
538 *
539 * INPUT:
540 * countNum - Counter number.
541 *
542 * OUTPUT:
543 * None.
544 *
545 * RETURN:
546 * 32bit clock cycles in Hertz.
547 *
548 *******************************************************************************/
549 MV_U32 mvBoardTclkGet(MV_VOID)
550 {
551 if(mvCtrlModelGet()==MV_6281_DEV_ID)
552 {
553 #if defined(TCLK_AUTO_DETECT)
554 MV_U32 tmpTClkRate = MV_BOARD_TCLK_166MHZ;
555
556 tmpTClkRate = MV_REG_READ(MPP_SAMPLE_AT_RESET);
557 tmpTClkRate &= MSAR_TCLCK_MASK;
558
559 switch (tmpTClkRate)
560 {
561 case MSAR_TCLCK_166:
562 return MV_BOARD_TCLK_166MHZ;
563 break;
564 case MSAR_TCLCK_200:
565 return MV_BOARD_TCLK_200MHZ;
566 break;
567 }
568 #else
569 return MV_BOARD_TCLK_200MHZ;
570 #endif
571 }
572
573 return MV_BOARD_TCLK_166MHZ;
574
575 }
576 /*******************************************************************************
577 * mvBoardSysClkGet - Get the board SysClk (CPU bus clock)
578 *
579 * DESCRIPTION:
580 * This routine extract the CPU bus clock.
581 *
582 * INPUT:
583 * countNum - Counter number.
584 *
585 * OUTPUT:
586 * None.
587 *
588 * RETURN:
589 * 32bit clock cycles in Hertz.
590 *
591 *******************************************************************************/
592 static MV_U32 mvBoard6180SysClkGet(MV_VOID)
593 {
594 MV_U32 sysClkRate=0;
595 MV_CPU_ARM_CLK _cpu6180_ddr_l2_CLK[] = MV_CPU6180_DDR_L2_CLCK_TBL;
596
597 sysClkRate = MV_REG_READ(MPP_SAMPLE_AT_RESET);
598 sysClkRate = sysClkRate & MSAR_CPUCLCK_MASK_6180;
599 sysClkRate = sysClkRate >> MSAR_CPUCLCK_OFFS_6180;
600
601 sysClkRate = _cpu6180_ddr_l2_CLK[sysClkRate].ddrClk;
602
603 return sysClkRate;
604
605 }
606
607 MV_U32 mvBoardSysClkGet(MV_VOID)
608 {
609 #ifdef SYSCLK_AUTO_DETECT
610 MV_U32 sysClkRate, tmp, pClkRate, indexDdrRtio;
611 MV_U32 cpuCLK[] = MV_CPU_CLCK_TBL;
612 MV_U32 ddrRtio[][2] = MV_DDR_CLCK_RTIO_TBL;
613
614 if(mvCtrlModelGet() == MV_6180_DEV_ID)
615 return mvBoard6180SysClkGet();
616
617 tmp = MV_REG_READ(MPP_SAMPLE_AT_RESET);
618 pClkRate = MSAR_CPUCLCK_EXTRACT(tmp);
619 pClkRate = cpuCLK[pClkRate];
620
621 indexDdrRtio = tmp & MSAR_DDRCLCK_RTIO_MASK;
622 indexDdrRtio = indexDdrRtio >> MSAR_DDRCLCK_RTIO_OFFS;
623 if(ddrRtio[indexDdrRtio][0] != 0)
624 sysClkRate = ((pClkRate * ddrRtio[indexDdrRtio][1]) / ddrRtio[indexDdrRtio][0]);
625 else
626 sysClkRate = 0;
627 return sysClkRate;
628 #else
629 return MV_BOARD_DEFAULT_SYSCLK;
630 #endif
631 }
632
633
634 /*******************************************************************************
635 * mvBoardPexBridgeIntPinGet - Get PEX to PCI bridge interrupt pin number
636 *
637 * DESCRIPTION:
638 * Multi-ported PCI Express bridges that is implemented on the board
639 * collapse interrupts across multiple conventional PCI/PCI-X buses.
640 * A dual-headed PCI Express bridge would map (or "swizzle") the
641 * interrupts per the following table (in accordance with the respective
642 * logical PCI/PCI-X bridge's Device Number), collapse the INTA#-INTD#
643 * signals from its two logical PCI/PCI-X bridges, collapse the
644 * INTA#-INTD# signals from any internal sources, and convert the
645 * signals to in-band PCI Express messages. 10
646 * This function returns the upstream interrupt as it was converted by
647 * the bridge, according to board configuration and the following table:
648 * PCI dev num
649 * Interrupt pin 7, 8, 9
650 * A -> A D C
651 * B -> B A D
652 * C -> C B A
653 * D -> D C B
654 *
655 *
656 * INPUT:
657 * devNum - PCI/PCIX device number.
658 * intPin - PCI Int pin
659 *
660 * OUTPUT:
661 * None.
662 *
663 * RETURN:
664 * Int pin connected to the Interrupt controller
665 *
666 *******************************************************************************/
667 MV_U32 mvBoardPexBridgeIntPinGet(MV_U32 devNum, MV_U32 intPin)
668 {
669 MV_U32 realIntPin = ((intPin + (3 - (devNum % 4))) %4 );
670
671 if (realIntPin == 0) return 4;
672 else return realIntPin;
673
674 }
675
676 /*******************************************************************************
677 * mvBoardDebugLedNumGet - Get number of debug Leds
678 *
679 * DESCRIPTION:
680 * INPUT:
681 * boardId
682 *
683 * OUTPUT:
684 * None.
685 *
686 * RETURN:
687 * None.
688 *
689 *******************************************************************************/
690 MV_U32 mvBoardDebugLedNumGet(MV_U32 boardId)
691 {
692 return BOARD_INFO(boardId)->activeLedsNumber;
693 }
694
695 /*******************************************************************************
696 * mvBoardDebugLeg - Set the board debug Leds
697 *
698 * DESCRIPTION: turn on/off status leds.
699 * Note: assume MPP leds are part of group 0 only.
700 *
701 * INPUT:
702 * hexNum - Number to be displied in hex by Leds.
703 *
704 * OUTPUT:
705 * None.
706 *
707 * RETURN:
708 * None.
709 *
710 *******************************************************************************/
711 MV_VOID mvBoardDebugLed(MV_U32 hexNum)
712 {
713 MV_U32 val = 0,totalMask, currentBitMask = 1,i;
714 MV_U32 boardId= mvBoardIdGet();
715
716 if (BOARD_INFO(boardId)->pLedGppPin == NULL)
717 return;
718
719 totalMask = (1 << BOARD_INFO(boardId)->activeLedsNumber) -1;
720 hexNum &= totalMask;
721 totalMask = 0;
722
723 for (i = 0 ; i < BOARD_INFO(boardId)->activeLedsNumber ; i++)
724 {
725 if (hexNum & currentBitMask)
726 {
727 val |= (1 << BOARD_INFO(boardId)->pLedGppPin[i]);
728 }
729
730 totalMask |= (1 << BOARD_INFO(boardId)->pLedGppPin[i]);
731
732 currentBitMask = (currentBitMask << 1);
733 }
734
735 if (BOARD_INFO(boardId)->ledsPolarity)
736 {
737 mvGppValueSet(0, totalMask, val);
738 }
739 else
740 {
741 mvGppValueSet(0, totalMask, ~val);
742 }
743 }
744
745
746 /*******************************************************************************
747 * mvBoarGpioPinGet - mvBoarGpioPinGet
748 *
749 * DESCRIPTION:
750 *
751 * INPUT:
752 * class - MV_BOARD_GPP_CLASS enum.
753 *
754 * OUTPUT:
755 * None.
756 *
757 * RETURN:
758 * GPIO pin number. The function return -1 for bad parameters.
759 *
760 *******************************************************************************/
761 MV_32 mvBoarGpioPinNumGet(MV_BOARD_GPP_CLASS class, MV_U32 index)
762 {
763 MV_U32 boardId, i;
764 MV_U32 indexFound = 0;
765
766 boardId = mvBoardIdGet();
767
768 if (!((boardId >= BOARD_ID_BASE)&&(boardId < MV_MAX_BOARD_ID)))
769 {
770 mvOsPrintf("mvBoardRTCGpioPinGet:Board unknown.\n");
771 return MV_ERROR;
772
773 }
774
775 for (i = 0; i < BOARD_INFO(boardId)->numBoardGppInfo; i++)
776 if (BOARD_INFO(boardId)->pBoardGppInfo[i].devClass == class) {
777 if (indexFound == index)
778 return (MV_U32)BOARD_INFO(boardId)->pBoardGppInfo[i].gppPinNum;
779 else
780 indexFound++;
781
782 }
783
784 return MV_ERROR;
785 }
786
787
788 /*******************************************************************************
789 * mvBoardRTCGpioPinGet - mvBoardRTCGpioPinGet
790 *
791 * DESCRIPTION:
792 *
793 * INPUT:
794 * None.
795 *
796 * OUTPUT:
797 * None.
798 *
799 * RETURN:
800 * GPIO pin number. The function return -1 for bad parameters.
801 *
802 *******************************************************************************/
803 MV_32 mvBoardRTCGpioPinGet(MV_VOID)
804 {
805 return mvBoarGpioPinNumGet(BOARD_GPP_RTC, 0);
806 }
807
808
809 /*******************************************************************************
810 * mvBoardReset - mvBoardReset
811 *
812 * DESCRIPTION:
813 * Reset the board
814 * INPUT:
815 * None.
816 *
817 * OUTPUT:
818 * None.
819 *
820 * RETURN:
821 * None
822 *
823 *******************************************************************************/
824 MV_VOID mvBoardReset(MV_VOID)
825 {
826 MV_32 resetPin;
827
828 /* Get gpp reset pin if define */
829 resetPin = mvBoardResetGpioPinGet();
830 if (resetPin != MV_ERROR)
831 {
832 MV_REG_BIT_RESET( GPP_DATA_OUT_REG(0) ,(1 << resetPin));
833 MV_REG_BIT_RESET( GPP_DATA_OUT_EN_REG(0) ,(1 << resetPin));
834
835 }
836 else
837 {
838 /* No gpp reset pin was found, try to reset ussing
839 system reset out */
840 MV_REG_BIT_SET( CPU_RSTOUTN_MASK_REG , BIT2);
841 MV_REG_BIT_SET( CPU_SYS_SOFT_RST_REG , BIT0);
842 }
843 }
844
845 /*******************************************************************************
846 * mvBoardResetGpioPinGet - mvBoardResetGpioPinGet
847 *
848 * DESCRIPTION:
849 *
850 * INPUT:
851 * None.
852 *
853 * OUTPUT:
854 * None.
855 *
856 * RETURN:
857 * GPIO pin number. The function return -1 for bad parameters.
858 *
859 *******************************************************************************/
860 MV_32 mvBoardResetGpioPinGet(MV_VOID)
861 {
862 return mvBoarGpioPinNumGet(BOARD_GPP_RESET, 0);
863 }
864 /*******************************************************************************
865 * mvBoardSDIOGpioPinGet - mvBoardSDIOGpioPinGet
866 *
867 * DESCRIPTION:
868 * used for hotswap detection
869 * INPUT:
870 * None.
871 *
872 * OUTPUT:
873 * None.
874 *
875 * RETURN:
876 * GPIO pin number. The function return -1 for bad parameters.
877 *
878 *******************************************************************************/
879 MV_32 mvBoardSDIOGpioPinGet(MV_VOID)
880 {
881 return mvBoarGpioPinNumGet(BOARD_GPP_SDIO_DETECT, 0);
882 }
883
884 /*******************************************************************************
885 * mvBoardUSBVbusGpioPinGet - return Vbus input GPP
886 *
887 * DESCRIPTION:
888 *
889 * INPUT:
890 * int devNo.
891 *
892 * OUTPUT:
893 * None.
894 *
895 * RETURN:
896 * GPIO pin number. The function return -1 for bad parameters.
897 *
898 *******************************************************************************/
899 MV_32 mvBoardUSBVbusGpioPinGet(MV_32 devId)
900 {
901 return mvBoarGpioPinNumGet(BOARD_GPP_USB_VBUS, devId);
902 }
903
904 /*******************************************************************************
905 * mvBoardUSBVbusEnGpioPinGet - return Vbus Enable output GPP
906 *
907 * DESCRIPTION:
908 *
909 * INPUT:
910 * int devNo.
911 *
912 * OUTPUT:
913 * None.
914 *
915 * RETURN:
916 * GPIO pin number. The function return -1 for bad parameters.
917 *
918 *******************************************************************************/
919 MV_32 mvBoardUSBVbusEnGpioPinGet(MV_32 devId)
920 {
921 return mvBoarGpioPinNumGet(BOARD_GPP_USB_VBUS_EN, devId);
922 }
923
924
925 /*******************************************************************************
926 * mvBoardGpioIntMaskGet - Get GPIO mask for interrupt pins
927 *
928 * DESCRIPTION:
929 * This function returns a 32-bit mask of GPP pins that connected to
930 * interrupt generating sources on board.
931 * For example if UART channel A is hardwired to GPP pin 8 and
932 * UART channel B is hardwired to GPP pin 4 the fuinction will return
933 * the value 0x000000110
934 *
935 * INPUT:
936 * None.
937 *
938 * OUTPUT:
939 * None.
940 *
941 * RETURN:
942 * See description. The function return -1 if board is not identified.
943 *
944 *******************************************************************************/
945 MV_32 mvBoardGpioIntMaskLowGet(MV_VOID)
946 {
947 MV_U32 boardId;
948
949 boardId = mvBoardIdGet();
950
951 if (!((boardId >= BOARD_ID_BASE)&&(boardId < MV_MAX_BOARD_ID)))
952 {
953 mvOsPrintf("mvBoardGpioIntMaskGet:Board unknown.\n");
954 return MV_ERROR;
955
956 }
957
958 return BOARD_INFO(boardId)->intsGppMaskLow;
959 }
960 MV_32 mvBoardGpioIntMaskHighGet(MV_VOID)
961 {
962 MV_U32 boardId;
963
964 boardId = mvBoardIdGet();
965
966 if (!((boardId >= BOARD_ID_BASE)&&(boardId < MV_MAX_BOARD_ID)))
967 {
968 mvOsPrintf("mvBoardGpioIntMaskGet:Board unknown.\n");
969 return MV_ERROR;
970
971 }
972
973 return BOARD_INFO(boardId)->intsGppMaskHigh;
974 }
975
976
977 /*******************************************************************************
978 * mvBoardMppGet - Get board dependent MPP register value
979 *
980 * DESCRIPTION:
981 * MPP settings are derived from board design.
982 * MPP group consist of 8 MPPs. An MPP group represent MPP
983 * control register.
984 * This function retrieves board dependend MPP register value.
985 *
986 * INPUT:
987 * mppGroupNum - MPP group number.
988 *
989 * OUTPUT:
990 * None.
991 *
992 * RETURN:
993 * 32bit value describing MPP control register value.
994 *
995 *******************************************************************************/
996 MV_32 mvBoardMppGet(MV_U32 mppGroupNum)
997 {
998 MV_U32 boardId;
999
1000 boardId = mvBoardIdGet();
1001
1002 if (!((boardId >= BOARD_ID_BASE)&&(boardId < MV_MAX_BOARD_ID)))
1003 {
1004 mvOsPrintf("mvBoardMppGet:Board unknown.\n");
1005 return MV_ERROR;
1006
1007 }
1008
1009 return BOARD_INFO(boardId)->pBoardMppConfigValue[0].mppGroup[mppGroupNum];
1010 }
1011
1012
1013 /*******************************************************************************
1014 * mvBoardMppGroupId - If MPP group type is AUTO then identify it using twsi
1015 *
1016 * DESCRIPTION:
1017 *
1018 * INPUT:
1019 *
1020 * OUTPUT:
1021 * None.
1022 *
1023 * RETURN:
1024 *
1025 *******************************************************************************/
1026 MV_VOID mvBoardMppGroupIdUpdate(MV_VOID)
1027 {
1028
1029 MV_BOARD_MPP_GROUP_CLASS devClass;
1030 MV_BOARD_MODULE_ID_CLASS devClassId;
1031 MV_BOARD_MPP_TYPE_CLASS mppGroupType;
1032 MV_U32 devId;
1033 MV_U32 maxMppGrp = 1;
1034
1035 devId = mvCtrlModelGet();
1036
1037 switch(devId){
1038 case MV_6281_DEV_ID:
1039 maxMppGrp = MV_6281_MPP_MAX_MODULE;
1040 break;
1041 case MV_6192_DEV_ID:
1042 maxMppGrp = MV_6192_MPP_MAX_MODULE;
1043 break;
1044 case MV_6190_DEV_ID:
1045 maxMppGrp = MV_6190_MPP_MAX_MODULE;
1046 break;
1047 case MV_6180_DEV_ID:
1048 maxMppGrp = MV_6180_MPP_MAX_MODULE;
1049 break;
1050 }
1051
1052 for (devClass = 0; devClass < maxMppGrp; devClass++)
1053 {
1054 /* If MPP group can be defined by the module connected to it */
1055 if (mvBoardMppGroupTypeGet(devClass) == MV_BOARD_AUTO)
1056 {
1057 /* Get MPP module ID */
1058 devClassId = mvBoarModuleTypeGet(devClass);
1059 if (MV_ERROR != devClassId)
1060 {
1061 switch(devClassId)
1062 {
1063 case MV_BOARD_MODULE_TDM_ID:
1064 case MV_BOARD_MODULE_TDM_5CHAN_ID:
1065 mppGroupType = MV_BOARD_TDM;
1066 break;
1067 case MV_BOARD_MODULE_AUDIO_ID:
1068 mppGroupType = MV_BOARD_AUDIO;
1069 break;
1070 case MV_BOARD_MODULE_RGMII_ID:
1071 mppGroupType = MV_BOARD_RGMII;
1072 break;
1073 case MV_BOARD_MODULE_GMII_ID:
1074 mppGroupType = MV_BOARD_GMII;
1075 break;
1076 case MV_BOARD_MODULE_TS_ID:
1077 mppGroupType = MV_BOARD_TS;
1078 break;
1079 case MV_BOARD_MODULE_MII_ID:
1080 mppGroupType = MV_BOARD_MII;
1081 break;
1082 default:
1083 mppGroupType = MV_BOARD_OTHER;
1084 break;
1085 }
1086 }
1087 else
1088 /* The module bay is empty */
1089 mppGroupType = MV_BOARD_OTHER;
1090
1091 /* Update MPP group type */
1092 mvBoardMppGroupTypeSet(devClass, mppGroupType);
1093 }
1094
1095 /* Update MPP output voltage for RGMII 1.8V. Set port to GMII for GMII module */
1096 if ((mvBoardMppGroupTypeGet(devClass) == MV_BOARD_RGMII))
1097 MV_REG_BIT_SET(MPP_OUTPUT_DRIVE_REG,MPP_1_8_RGMII1_OUTPUT_DRIVE | MPP_1_8_RGMII0_OUTPUT_DRIVE);
1098 else
1099 {
1100 if ((mvBoardMppGroupTypeGet(devClass) == MV_BOARD_GMII))
1101 {
1102 MV_REG_BIT_RESET(MPP_OUTPUT_DRIVE_REG, BIT7 | BIT15);
1103 MV_REG_BIT_RESET(ETH_PORT_SERIAL_CTRL_1_REG(0),BIT3);
1104 MV_REG_BIT_RESET(ETH_PORT_SERIAL_CTRL_1_REG(1),BIT3);
1105 }
1106 else if ((mvBoardMppGroupTypeGet(devClass) == MV_BOARD_MII))
1107 {
1108 /* Assumption that the MDC & MDIO should be 3.3V */
1109 MV_REG_BIT_RESET(MPP_OUTPUT_DRIVE_REG, BIT7 | BIT15);
1110 /* Assumption that only ETH1 can be MII when using modules on DB */
1111 MV_REG_BIT_RESET(ETH_PORT_SERIAL_CTRL_1_REG(1),BIT3);
1112 }
1113 }
1114 }
1115 }
1116
1117 /*******************************************************************************
1118 * mvBoardMppGroupTypeGet
1119 *
1120 * DESCRIPTION:
1121 *
1122 * INPUT:
1123 * mppGroupClass - MPP group number 0 for MPP[35:20] or 1 for MPP[49:36].
1124 *
1125 * OUTPUT:
1126 * None.
1127 *
1128 * RETURN:
1129 *
1130 *******************************************************************************/
1131 MV_BOARD_MPP_TYPE_CLASS mvBoardMppGroupTypeGet(MV_BOARD_MPP_GROUP_CLASS mppGroupClass)
1132 {
1133 MV_U32 boardId;
1134
1135 boardId = mvBoardIdGet();
1136
1137 if (!((boardId >= BOARD_ID_BASE)&&(boardId < MV_MAX_BOARD_ID)))
1138 {
1139 mvOsPrintf("mvBoardMppGet:Board unknown.\n");
1140 return MV_ERROR;
1141
1142 }
1143
1144 if (mppGroupClass == MV_BOARD_MPP_GROUP_1)
1145 return BOARD_INFO(boardId)->pBoardMppTypeValue[0].boardMppGroup1;
1146 else
1147 return BOARD_INFO(boardId)->pBoardMppTypeValue[0].boardMppGroup2;
1148 }
1149
1150 /*******************************************************************************
1151 * mvBoardMppGroupTypeSet
1152 *
1153 * DESCRIPTION:
1154 *
1155 * INPUT:
1156 * mppGroupClass - MPP group number 0 for MPP[35:20] or 1 for MPP[49:36].
1157 * mppGroupType - MPP group type for MPP[35:20] or for MPP[49:36].
1158 *
1159 * OUTPUT:
1160 * None.
1161 *
1162 * RETURN:
1163 *
1164 *******************************************************************************/
1165 MV_VOID mvBoardMppGroupTypeSet(MV_BOARD_MPP_GROUP_CLASS mppGroupClass,
1166 MV_BOARD_MPP_TYPE_CLASS mppGroupType)
1167 {
1168 MV_U32 boardId;
1169
1170 boardId = mvBoardIdGet();
1171
1172 if (!((boardId >= BOARD_ID_BASE)&&(boardId < MV_MAX_BOARD_ID)))
1173 {
1174 mvOsPrintf("mvBoardMppGet:Board unknown.\n");
1175 }
1176
1177 if (mppGroupClass == MV_BOARD_MPP_GROUP_1)
1178 BOARD_INFO(boardId)->pBoardMppTypeValue[0].boardMppGroup1 = mppGroupType;
1179 else
1180 BOARD_INFO(boardId)->pBoardMppTypeValue[0].boardMppGroup2 = mppGroupType;
1181
1182 }
1183
1184 /*******************************************************************************
1185 * mvBoardMppMuxSet - Update MPP mux
1186 *
1187 * DESCRIPTION:
1188 *
1189 * INPUT:
1190 *
1191 * OUTPUT:
1192 * None.
1193 *
1194 * RETURN:
1195 *
1196 *******************************************************************************/
1197 MV_VOID mvBoardMppMuxSet(MV_VOID)
1198 {
1199
1200 MV_BOARD_MPP_GROUP_CLASS devClass;
1201 MV_BOARD_MPP_TYPE_CLASS mppGroupType;
1202 MV_U32 devId;
1203 MV_U8 muxVal = 0xf;
1204 MV_U32 maxMppGrp = 1;
1205 MV_TWSI_SLAVE twsiSlave;
1206 MV_TWSI_ADDR slave;
1207
1208 devId = mvCtrlModelGet();
1209
1210 switch(devId){
1211 case MV_6281_DEV_ID:
1212 maxMppGrp = MV_6281_MPP_MAX_MODULE;
1213 break;
1214 case MV_6192_DEV_ID:
1215 maxMppGrp = MV_6192_MPP_MAX_MODULE;
1216 break;
1217 case MV_6190_DEV_ID:
1218 maxMppGrp = MV_6190_MPP_MAX_MODULE;
1219 break;
1220 case MV_6180_DEV_ID:
1221 maxMppGrp = MV_6180_MPP_MAX_MODULE;
1222 break;
1223 }
1224
1225 for (devClass = 0; devClass < maxMppGrp; devClass++)
1226 {
1227 mppGroupType = mvBoardMppGroupTypeGet(devClass);
1228
1229 switch(mppGroupType)
1230 {
1231 case MV_BOARD_TDM:
1232 muxVal &= ~(devClass ? (0x2 << (devClass * 2)):0x0);
1233 break;
1234 case MV_BOARD_AUDIO:
1235 muxVal &= ~(devClass ? 0x7 : 0x0); /*old Z0 value 0xd:0x0*/
1236 break;
1237 case MV_BOARD_TS:
1238 muxVal &= ~(devClass ? (0x2 << (devClass * 2)):0x0);
1239 break;
1240 default:
1241 muxVal |= (devClass ? 0xf : 0);
1242 break;
1243 }
1244 }
1245
1246 /* TWSI init */
1247 slave.type = ADDR7_BIT;
1248 slave.address = 0;
1249 mvTwsiInit(0, TWSI_SPEED, mvBoardTclkGet(), &slave, 0);
1250
1251 /* Read MPP module ID */
1252 DB(mvOsPrintf("Board: twsi exp set\n"));
1253 twsiSlave.slaveAddr.address = mvBoardTwsiExpAddrGet(MV_BOARD_MUX_I2C_ADDR_ENTRY);
1254 twsiSlave.slaveAddr.type = mvBoardTwsiExpAddrTypeGet(MV_BOARD_MUX_I2C_ADDR_ENTRY);
1255 twsiSlave.validOffset = MV_TRUE;
1256 /* Offset is the first command after the address which indicate the register number to be read
1257 in next operation */
1258 twsiSlave.offset = 2;
1259 twsiSlave.moreThen256 = MV_FALSE;
1260
1261
1262
1263 if( MV_OK != mvTwsiWrite (0, &twsiSlave, &muxVal, 1) )
1264 {
1265 DB(mvOsPrintf("Board: twsi exp out val fail\n"));
1266 return;
1267 }
1268 DB(mvOsPrintf("Board: twsi exp out val succeded\n"));
1269
1270 /* Change twsi exp to output */
1271 twsiSlave.offset = 6;
1272 muxVal = 0;
1273 if( MV_OK != mvTwsiWrite (0, &twsiSlave, &muxVal, 1) )
1274 {
1275 DB(mvOsPrintf("Board: twsi exp change to out fail\n"));
1276 return;
1277 }
1278 DB(mvOsPrintf("Board: twsi exp change to out succeded\n"));
1279
1280 }
1281
1282 /*******************************************************************************
1283 * mvBoardTdmMppSet - set MPPs in TDM module
1284 *
1285 * DESCRIPTION:
1286 *
1287 * INPUT: type of second telephony device
1288 *
1289 * OUTPUT:
1290 * None.
1291 *
1292 * RETURN:
1293 *
1294 *******************************************************************************/
1295 MV_VOID mvBoardTdmMppSet(MV_32 chType)
1296 {
1297
1298 MV_BOARD_MPP_GROUP_CLASS devClass;
1299 MV_BOARD_MPP_TYPE_CLASS mppGroupType;
1300 MV_U32 devId;
1301 MV_U8 muxVal = 1;
1302 MV_U8 muxValMask = 1;
1303 MV_U8 twsiVal;
1304 MV_U32 maxMppGrp = 1;
1305 MV_TWSI_SLAVE twsiSlave;
1306 MV_TWSI_ADDR slave;
1307
1308 devId = mvCtrlModelGet();
1309
1310 switch(devId){
1311 case MV_6281_DEV_ID:
1312 maxMppGrp = MV_6281_MPP_MAX_MODULE;
1313 break;
1314 case MV_6192_DEV_ID:
1315 maxMppGrp = MV_6192_MPP_MAX_MODULE;
1316 break;
1317 case MV_6190_DEV_ID:
1318 maxMppGrp = MV_6190_MPP_MAX_MODULE;
1319 break;
1320 case MV_6180_DEV_ID:
1321 maxMppGrp = MV_6180_MPP_MAX_MODULE;
1322 break;
1323 }
1324
1325 for (devClass = 0; devClass < maxMppGrp; devClass++)
1326 {
1327 mppGroupType = mvBoardMppGroupTypeGet(devClass);
1328 if(mppGroupType == MV_BOARD_TDM)
1329 break;
1330 }
1331
1332 if(devClass == maxMppGrp)
1333 return; /* TDM module not found */
1334
1335 /* TWSI init */
1336 slave.type = ADDR7_BIT;
1337 slave.address = 0;
1338 mvTwsiInit(0, TWSI_SPEED, mvBoardTclkGet(), &slave, 0);
1339
1340 /* Read MPP module ID */
1341 DB(mvOsPrintf("Board: twsi exp set\n"));
1342 twsiSlave.slaveAddr.address = mvBoardTwsiExpAddrGet(devClass);
1343 twsiSlave.slaveAddr.type = ADDR7_BIT;
1344 twsiSlave.validOffset = MV_TRUE;
1345 /* Offset is the first command after the address which indicate the register number to be read
1346 in next operation */
1347 twsiSlave.offset = 3;
1348 twsiSlave.moreThen256 = MV_FALSE;
1349
1350 if(mvBoardIdGet() == RD_88F6281A_ID)
1351 {
1352 muxVal = 0xc;
1353 muxValMask = 0xf3;
1354 }
1355
1356 mvTwsiRead(0, &twsiSlave, &twsiVal, 1);
1357 muxVal = (twsiVal & muxValMask) | muxVal;
1358
1359 if( MV_OK != mvTwsiWrite (0, &twsiSlave, &muxVal, 1) )
1360 {
1361 mvOsPrintf("Board: twsi exp out val fail\n");
1362 return;
1363 }
1364 DB(mvOsPrintf("Board: twsi exp out val succeded\n"));
1365
1366 /* Change twsi exp to output */
1367 twsiSlave.offset = 7;
1368 muxVal = 0xfe;
1369 if(mvBoardIdGet() == RD_88F6281A_ID)
1370 muxVal = 0xf3;
1371
1372 mvTwsiRead(0, &twsiSlave, &twsiVal, 1);
1373 muxVal = (twsiVal & muxVal);
1374
1375 if( MV_OK != mvTwsiWrite (0, &twsiSlave, &muxVal, 1) )
1376 {
1377 mvOsPrintf("Board: twsi exp change to out fail\n");
1378 return;
1379 }
1380 DB(mvOsPrintf("Board: twsi exp change to out succeded\n"));
1381 /* reset the line to 0 */
1382 twsiSlave.offset = 3;
1383 muxVal = 0;
1384 muxValMask = 1;
1385
1386 if(mvBoardIdGet() == RD_88F6281A_ID) {
1387 muxVal = 0x0;
1388 muxValMask = 0xf3;
1389 }
1390
1391 mvTwsiRead(0, &twsiSlave, &twsiVal, 1);
1392 muxVal = (twsiVal & muxValMask) | muxVal;
1393
1394 if( MV_OK != mvTwsiWrite (0, &twsiSlave, &muxVal, 1) )
1395 {
1396 mvOsPrintf("Board: twsi exp out val fail\n");
1397 return;
1398 }
1399 DB(mvOsPrintf("Board: twsi exp out val succeded\n"));
1400
1401 mvOsDelay(20);
1402
1403 /* set the line to 1 */
1404 twsiSlave.offset = 3;
1405 muxVal = 1;
1406 muxValMask = 1;
1407
1408 if(mvBoardIdGet() == RD_88F6281A_ID)
1409 {
1410 muxVal = 0xc;
1411 muxValMask = 0xf3;
1412 if(chType) /* FXS - issue reset properly */
1413 {
1414 MV_REG_BIT_SET(GPP_DATA_OUT_REG(1), MV_GPP12);
1415 mvOsDelay(50);
1416 MV_REG_BIT_RESET(GPP_DATA_OUT_REG(1), MV_GPP12);
1417 }
1418 else /* FXO - issue reset via TDM_CODEC_RST*/
1419 {
1420 /* change MPP44 type to TDM_CODEC_RST(0x2) */
1421 MV_REG_WRITE(MPP_CONTROL_REG5, ((MV_REG_READ(MPP_CONTROL_REG5) & 0xFFF0FFFF) | BIT17));
1422 }
1423 }
1424
1425 mvTwsiRead(0, &twsiSlave, &twsiVal, 1);
1426 muxVal = (twsiVal & muxValMask) | muxVal;
1427
1428 if( MV_OK != mvTwsiWrite (0, &twsiSlave, &muxVal, 1) )
1429 {
1430 mvOsPrintf("Board: twsi exp out val fail\n");
1431 return;
1432 }
1433
1434 /* TBD - 5 channels */
1435 #if defined(MV_TDM_5CHANNELS)
1436 /* change MPP38 type to GPIO(0x0) & polarity for TDM_STROBE */
1437 MV_REG_WRITE(MPP_CONTROL_REG4, (MV_REG_READ(MPP_CONTROL_REG4) & 0xF0FFFFFF));
1438 mvGppPolaritySet(1, MV_GPP6, 0);
1439
1440 twsiSlave.offset = 6;
1441 twsiSlave.slaveAddr.address = mvBoardTwsiExpAddrGet(2);
1442
1443 mvTwsiRead(0, &twsiSlave, &twsiVal, 1);
1444 muxVal = (twsiVal & ~BIT2);
1445
1446 if( MV_OK != mvTwsiWrite (0, &twsiSlave, &muxVal, 1) )
1447 {
1448 mvOsPrintf("Board: twsi exp change to out fail\n");
1449 return;
1450 }
1451
1452
1453 twsiSlave.offset = 2;
1454
1455 mvTwsiRead(0, &twsiSlave, &twsiVal, 1);
1456 muxVal = (twsiVal & ~BIT2);
1457
1458 if( MV_OK != mvTwsiWrite (0, &twsiSlave, &muxVal, 1) )
1459 {
1460 mvOsPrintf("Board: twsi exp change to out fail\n");
1461 return;
1462 }
1463 #endif
1464 DB(mvOsPrintf("Board: twsi exp out val succeded\n"));
1465
1466
1467 }
1468 /*******************************************************************************
1469 * mvBoardVoiceConnModeGet - return SLIC/DAA connection & interrupt modes
1470 *
1471 * DESCRIPTION:
1472 *
1473 * INPUT:
1474 *
1475 * OUTPUT:
1476 * None.
1477 *
1478 * RETURN:
1479 *
1480 *******************************************************************************/
1481
1482 MV_VOID mvBoardVoiceConnModeGet(MV_32* connMode, MV_32* irqMode)
1483 {
1484 switch(mvBoardIdGet())
1485 {
1486 case RD_88F6281A_ID:
1487 *connMode = DAISY_CHAIN_MODE;
1488 *irqMode = INTERRUPT_TO_TDM;
1489 break;
1490 case DB_88F6281A_BP_ID:
1491 *connMode = DUAL_CHIP_SELECT_MODE;
1492 *irqMode = INTERRUPT_TO_TDM;
1493 break;
1494 case RD_88F6192A_ID:
1495 *connMode = DUAL_CHIP_SELECT_MODE;
1496 *irqMode = INTERRUPT_TO_TDM;
1497 break;
1498 case DB_88F6192A_BP_ID:
1499 *connMode = DUAL_CHIP_SELECT_MODE;
1500 *irqMode = INTERRUPT_TO_TDM;
1501 break;
1502 default:
1503 *connMode = *irqMode = -1;
1504 mvOsPrintf("mvBoardVoiceAssembleModeGet: TDM not supported(boardId=0x%x)\n",mvBoardIdGet());
1505 }
1506 return;
1507
1508 }
1509
1510 /*******************************************************************************
1511 * mvBoardMppModuleTypePrint - print module detect
1512 *
1513 * DESCRIPTION:
1514 *
1515 * INPUT:
1516 *
1517 * OUTPUT:
1518 * None.
1519 *
1520 * RETURN:
1521 *
1522 *******************************************************************************/
1523 MV_VOID mvBoardMppModuleTypePrint(MV_VOID)
1524 {
1525
1526 MV_BOARD_MPP_GROUP_CLASS devClass;
1527 MV_BOARD_MPP_TYPE_CLASS mppGroupType;
1528 MV_U32 devId;
1529 MV_U32 maxMppGrp = 1;
1530
1531 devId = mvCtrlModelGet();
1532
1533 switch(devId){
1534 case MV_6281_DEV_ID:
1535 maxMppGrp = MV_6281_MPP_MAX_MODULE;
1536 break;
1537 case MV_6192_DEV_ID:
1538 maxMppGrp = MV_6192_MPP_MAX_MODULE;
1539 break;
1540 case MV_6190_DEV_ID:
1541 maxMppGrp = MV_6190_MPP_MAX_MODULE;
1542 break;
1543 case MV_6180_DEV_ID:
1544 maxMppGrp = MV_6180_MPP_MAX_MODULE;
1545 break;
1546 }
1547
1548 for (devClass = 0; devClass < maxMppGrp; devClass++)
1549 {
1550 mppGroupType = mvBoardMppGroupTypeGet(devClass);
1551
1552 switch(mppGroupType)
1553 {
1554 case MV_BOARD_TDM:
1555 if(devId != MV_6190_DEV_ID)
1556 mvOsPrintf("Module %d is TDM\n", devClass);
1557 break;
1558 case MV_BOARD_AUDIO:
1559 if(devId != MV_6190_DEV_ID)
1560 mvOsPrintf("Module %d is AUDIO\n", devClass);
1561 break;
1562 case MV_BOARD_RGMII:
1563 if(devId != MV_6190_DEV_ID)
1564 mvOsPrintf("Module %d is RGMII\n", devClass);
1565 break;
1566 case MV_BOARD_GMII:
1567 if(devId != MV_6190_DEV_ID)
1568 mvOsPrintf("Module %d is GMII\n", devClass);
1569 break;
1570 case MV_BOARD_TS:
1571 if(devId != MV_6190_DEV_ID)
1572 mvOsPrintf("Module %d is TS\n", devClass);
1573 break;
1574 default:
1575 break;
1576 }
1577 }
1578 }
1579
1580 /* Board devices API managments */
1581
1582 /*******************************************************************************
1583 * mvBoardGetDeviceNumber - Get number of device of some type on the board
1584 *
1585 * DESCRIPTION:
1586 *
1587 * INPUT:
1588 * devType - The device type ( Flash,RTC , etc .. )
1589 *
1590 * OUTPUT:
1591 * None.
1592 *
1593 * RETURN:
1594 * If the device is found on the board the then the functions returns the
1595 * number of those devices else the function returns 0
1596 *
1597 *
1598 *******************************************************************************/
1599 MV_32 mvBoardGetDevicesNumber(MV_BOARD_DEV_CLASS devClass)
1600 {
1601 MV_U32 foundIndex=0,devNum;
1602 MV_U32 boardId= mvBoardIdGet();
1603
1604 if (!((boardId >= BOARD_ID_BASE)&&(boardId < MV_MAX_BOARD_ID)))
1605 {
1606 mvOsPrintf("mvBoardGetDeviceNumber:Board unknown.\n");
1607 return 0xFFFFFFFF;
1608
1609 }
1610
1611 for (devNum = START_DEV_CS; devNum < BOARD_INFO(boardId)->numBoardDeviceIf; devNum++)
1612 {
1613 if (BOARD_INFO(boardId)->pDevCsInfo[devNum].devClass == devClass)
1614 {
1615 foundIndex++;
1616 }
1617 }
1618
1619 return foundIndex;
1620
1621 }
1622
1623 /*******************************************************************************
1624 * mvBoardGetDeviceBaseAddr - Get base address of a device existing on the board
1625 *
1626 * DESCRIPTION:
1627 *
1628 * INPUT:
1629 * devIndex - The device sequential number on the board
1630 * devType - The device type ( Flash,RTC , etc .. )
1631 *
1632 * OUTPUT:
1633 * None.
1634 *
1635 * RETURN:
1636 * If the device is found on the board the then the functions returns the
1637 * Base address else the function returns 0xffffffff
1638 *
1639 *
1640 *******************************************************************************/
1641 MV_32 mvBoardGetDeviceBaseAddr(MV_32 devNum, MV_BOARD_DEV_CLASS devClass)
1642 {
1643 MV_DEV_CS_INFO* devEntry;
1644 devEntry = boardGetDevEntry(devNum,devClass);
1645 if (devEntry != NULL)
1646 {
1647 return mvCpuIfTargetWinBaseLowGet(DEV_TO_TARGET(devEntry->deviceCS));
1648
1649 }
1650
1651 return 0xFFFFFFFF;
1652 }
1653
1654 /*******************************************************************************
1655 * mvBoardGetDeviceBusWidth - Get Bus width of a device existing on the board
1656 *
1657 * DESCRIPTION:
1658 *
1659 * INPUT:
1660 * devIndex - The device sequential number on the board
1661 * devType - The device type ( Flash,RTC , etc .. )
1662 *
1663 * OUTPUT:
1664 * None.
1665 *
1666 * RETURN:
1667 * If the device is found on the board the then the functions returns the
1668 * Bus width else the function returns 0xffffffff
1669 *
1670 *
1671 *******************************************************************************/
1672 MV_32 mvBoardGetDeviceBusWidth(MV_32 devNum, MV_BOARD_DEV_CLASS devClass)
1673 {
1674 MV_DEV_CS_INFO* devEntry;
1675
1676 devEntry = boardGetDevEntry(devNum,devClass);
1677 if (devEntry != NULL)
1678 {
1679 return 8;
1680 }
1681
1682 return 0xFFFFFFFF;
1683
1684 }
1685
1686 /*******************************************************************************
1687 * mvBoardGetDeviceWidth - Get dev width of a device existing on the board
1688 *
1689 * DESCRIPTION:
1690 *
1691 * INPUT:
1692 * devIndex - The device sequential number on the board
1693 * devType - The device type ( Flash,RTC , etc .. )
1694 *
1695 * OUTPUT:
1696 * None.
1697 *
1698 * RETURN:
1699 * If the device is found on the board the then the functions returns the
1700 * dev width else the function returns 0xffffffff
1701 *
1702 *
1703 *******************************************************************************/
1704 MV_32 mvBoardGetDeviceWidth(MV_32 devNum, MV_BOARD_DEV_CLASS devClass)
1705 {
1706 MV_DEV_CS_INFO* devEntry;
1707 MV_U32 boardId= mvBoardIdGet();
1708
1709 if (!((boardId >= BOARD_ID_BASE)&&(boardId < MV_MAX_BOARD_ID)))
1710 {
1711 mvOsPrintf("Board unknown.\n");
1712 return 0xFFFFFFFF;
1713 }
1714
1715 devEntry = boardGetDevEntry(devNum,devClass);
1716 if (devEntry != NULL)
1717 return devEntry->devWidth;
1718
1719 return MV_ERROR;
1720
1721 }
1722
1723 /*******************************************************************************
1724 * mvBoardGetDeviceWinSize - Get the window size of a device existing on the board
1725 *
1726 * DESCRIPTION:
1727 *
1728 * INPUT:
1729 * devIndex - The device sequential number on the board
1730 * devType - The device type ( Flash,RTC , etc .. )
1731 *
1732 * OUTPUT:
1733 * None.
1734 *
1735 * RETURN:
1736 * If the device is found on the board the then the functions returns the
1737 * window size else the function returns 0xffffffff
1738 *
1739 *
1740 *******************************************************************************/
1741 MV_32 mvBoardGetDeviceWinSize(MV_32 devNum, MV_BOARD_DEV_CLASS devClass)
1742 {
1743 MV_DEV_CS_INFO* devEntry;
1744 MV_U32 boardId = mvBoardIdGet();
1745
1746 if (!((boardId >= BOARD_ID_BASE)&&(boardId < MV_MAX_BOARD_ID)))
1747 {
1748 mvOsPrintf("Board unknown.\n");
1749 return 0xFFFFFFFF;
1750 }
1751
1752 devEntry = boardGetDevEntry(devNum,devClass);
1753 if (devEntry != NULL)
1754 {
1755 return mvCpuIfTargetWinSizeGet(DEV_TO_TARGET(devEntry->deviceCS));
1756 }
1757
1758 return 0xFFFFFFFF;
1759 }
1760
1761
1762 /*******************************************************************************
1763 * boardGetDevEntry - returns the entry pointer of a device on the board
1764 *
1765 * DESCRIPTION:
1766 *
1767 * INPUT:
1768 * devIndex - The device sequential number on the board
1769 * devType - The device type ( Flash,RTC , etc .. )
1770 *
1771 * OUTPUT:
1772 * None.
1773 *
1774 * RETURN:
1775 * If the device is found on the board the then the functions returns the
1776 * dev number else the function returns 0x0
1777 *
1778 *
1779 *******************************************************************************/
1780 static MV_DEV_CS_INFO* boardGetDevEntry(MV_32 devNum, MV_BOARD_DEV_CLASS devClass)
1781 {
1782 MV_U32 foundIndex=0,devIndex;
1783 MV_U32 boardId= mvBoardIdGet();
1784
1785 if (!((boardId >= BOARD_ID_BASE)&&(boardId < MV_MAX_BOARD_ID)))
1786 {
1787 mvOsPrintf("boardGetDevEntry: Board unknown.\n");
1788 return NULL;
1789
1790 }
1791
1792 for (devIndex = START_DEV_CS; devIndex < BOARD_INFO(boardId)->numBoardDeviceIf; devIndex++)
1793 {
1794 /* TBR */
1795 /*if (BOARD_INFO(boardId)->pDevCsInfo[devIndex].deviceCS == MV_BOOTDEVICE_INDEX)
1796 continue;*/
1797
1798 if (BOARD_INFO(boardId)->pDevCsInfo[devIndex].devClass == devClass)
1799 {
1800 if (foundIndex == devNum)
1801 {
1802 return &(BOARD_INFO(boardId)->pDevCsInfo[devIndex]);
1803 }
1804 foundIndex++;
1805 }
1806 }
1807
1808 /* device not found */
1809 return NULL;
1810 }
1811
1812 /* Get device CS number */
1813
1814 MV_U32 boardGetDevCSNum(MV_32 devNum, MV_BOARD_DEV_CLASS devClass)
1815 {
1816 MV_DEV_CS_INFO* devEntry;
1817 MV_U32 boardId= mvBoardIdGet();
1818
1819 if (!((boardId >= BOARD_ID_BASE)&&(boardId < MV_MAX_BOARD_ID)))
1820 {
1821 mvOsPrintf("Board unknown.\n");
1822 return 0xFFFFFFFF;
1823
1824 }
1825
1826
1827 devEntry = boardGetDevEntry(devNum,devClass);
1828 if (devEntry != NULL)
1829 return devEntry->deviceCS;
1830
1831 return 0xFFFFFFFF;
1832
1833 }
1834
1835 /*******************************************************************************
1836 * mvBoardRtcTwsiAddrTypeGet -
1837 *
1838 * DESCRIPTION:
1839 *
1840 * INPUT:
1841 *
1842 * OUTPUT:
1843 * None.
1844 *
1845 * RETURN:
1846 *
1847 *
1848 *******************************************************************************/
1849 MV_U8 mvBoardRtcTwsiAddrTypeGet()
1850 {
1851 int i;
1852 MV_U32 boardId= mvBoardIdGet();
1853
1854 for (i = 0; i < BOARD_INFO(boardId)->numBoardTwsiDev; i++)
1855 if (BOARD_INFO(boardId)->pBoardTwsiDev[i].devClass == BOARD_TWSI_RTC)
1856 return BOARD_INFO(boardId)->pBoardTwsiDev[i].twsiDevAddrType;
1857 return (MV_ERROR);
1858 }
1859
1860 /*******************************************************************************
1861 * mvBoardRtcTwsiAddrGet -
1862 *
1863 * DESCRIPTION:
1864 *
1865 * INPUT:
1866 *
1867 * OUTPUT:
1868 * None.
1869 *
1870 * RETURN:
1871 *
1872 *
1873 *******************************************************************************/
1874 MV_U8 mvBoardRtcTwsiAddrGet()
1875 {
1876 int i;
1877 MV_U32 boardId= mvBoardIdGet();
1878
1879 for (i = 0; i < BOARD_INFO(boardId)->numBoardTwsiDev; i++)
1880 if (BOARD_INFO(boardId)->pBoardTwsiDev[i].devClass == BOARD_TWSI_RTC)
1881 return BOARD_INFO(boardId)->pBoardTwsiDev[i].twsiDevAddr;
1882 return (0xFF);
1883 }
1884
1885 /*******************************************************************************
1886 * mvBoardA2DTwsiAddrTypeGet -
1887 *
1888 * DESCRIPTION:
1889 *
1890 * INPUT:
1891 *
1892 * OUTPUT:
1893 * None.
1894 *
1895 * RETURN:
1896 *
1897 *
1898 *******************************************************************************/
1899 MV_U8 mvBoardA2DTwsiAddrTypeGet()
1900 {
1901 int i;
1902 MV_U32 boardId= mvBoardIdGet();
1903
1904 for (i = 0; i < BOARD_INFO(boardId)->numBoardTwsiDev; i++)
1905 if (BOARD_INFO(boardId)->pBoardTwsiDev[i].devClass == BOARD_TWSI_AUDIO_DEC)
1906 return BOARD_INFO(boardId)->pBoardTwsiDev[i].twsiDevAddrType;
1907 return (MV_ERROR);
1908 }
1909
1910 /*******************************************************************************
1911 * mvBoardA2DTwsiAddrGet -
1912 *
1913 * DESCRIPTION:
1914 *
1915 * INPUT:
1916 *
1917 * OUTPUT:
1918 * None.
1919 *
1920 * RETURN:
1921 *
1922 *
1923 *******************************************************************************/
1924 MV_U8 mvBoardA2DTwsiAddrGet()
1925 {
1926 int i;
1927 MV_U32 boardId= mvBoardIdGet();
1928
1929 for (i = 0; i < BOARD_INFO(boardId)->numBoardTwsiDev; i++)
1930 if (BOARD_INFO(boardId)->pBoardTwsiDev[i].devClass == BOARD_TWSI_AUDIO_DEC)
1931 return BOARD_INFO(boardId)->pBoardTwsiDev[i].twsiDevAddr;
1932 return (0xFF);
1933 }
1934
1935 /*******************************************************************************
1936 * mvBoardTwsiExpAddrTypeGet -
1937 *
1938 * DESCRIPTION:
1939 *
1940 * INPUT:
1941 *
1942 * OUTPUT:
1943 * None.
1944 *
1945 * RETURN:
1946 *
1947 *
1948 *******************************************************************************/
1949 MV_U8 mvBoardTwsiExpAddrTypeGet(MV_U32 index)
1950 {
1951 int i;
1952 MV_U32 indexFound = 0;
1953 MV_U32 boardId= mvBoardIdGet();
1954
1955 for (i = 0; i < BOARD_INFO(boardId)->numBoardTwsiDev; i++)
1956 if (BOARD_INFO(boardId)->pBoardTwsiDev[i].devClass == BOARD_DEV_TWSI_EXP)
1957 {
1958 if (indexFound == index)
1959 return BOARD_INFO(boardId)->pBoardTwsiDev[i].twsiDevAddrType;
1960 else
1961 indexFound++;
1962 }
1963
1964 return (MV_ERROR);
1965 }
1966
1967 /*******************************************************************************
1968 * mvBoardTwsiExpAddrGet -
1969 *
1970 * DESCRIPTION:
1971 *
1972 * INPUT:
1973 *
1974 * OUTPUT:
1975 * None.
1976 *
1977 * RETURN:
1978 *
1979 *
1980 *******************************************************************************/
1981 MV_U8 mvBoardTwsiExpAddrGet(MV_U32 index)
1982 {
1983 int i;
1984 MV_U32 indexFound = 0;
1985 MV_U32 boardId= mvBoardIdGet();
1986
1987 for (i = 0; i < BOARD_INFO(boardId)->numBoardTwsiDev; i++)
1988 if (BOARD_INFO(boardId)->pBoardTwsiDev[i].devClass == BOARD_DEV_TWSI_EXP)
1989 {
1990 if (indexFound == index)
1991 return BOARD_INFO(boardId)->pBoardTwsiDev[i].twsiDevAddr;
1992 else
1993 indexFound++;
1994 }
1995
1996 return (0xFF);
1997 }
1998
1999
2000 /*******************************************************************************
2001 * mvBoardTwsiSatRAddrTypeGet -
2002 *
2003 * DESCRIPTION:
2004 *
2005 * INPUT:
2006 *
2007 * OUTPUT:
2008 * None.
2009 *
2010 * RETURN:
2011 *
2012 *
2013 *******************************************************************************/
2014 MV_U8 mvBoardTwsiSatRAddrTypeGet(MV_U32 index)
2015 {
2016 int i;
2017 MV_U32 indexFound = 0;
2018 MV_U32 boardId= mvBoardIdGet();
2019
2020 for (i = 0; i < BOARD_INFO(boardId)->numBoardTwsiDev; i++)
2021 if (BOARD_INFO(boardId)->pBoardTwsiDev[i].devClass == BOARD_DEV_TWSI_SATR)
2022 {
2023 if (indexFound == index)
2024 return BOARD_INFO(boardId)->pBoardTwsiDev[i].twsiDevAddrType;
2025 else
2026 indexFound++;
2027 }
2028
2029 return (MV_ERROR);
2030 }
2031
2032 /*******************************************************************************
2033 * mvBoardTwsiSatRAddrGet -
2034 *
2035 * DESCRIPTION:
2036 *
2037 * INPUT:
2038 *
2039 * OUTPUT:
2040 * None.
2041 *
2042 * RETURN:
2043 *
2044 *
2045 *******************************************************************************/
2046 MV_U8 mvBoardTwsiSatRAddrGet(MV_U32 index)
2047 {
2048 int i;
2049 MV_U32 indexFound = 0;
2050 MV_U32 boardId= mvBoardIdGet();
2051
2052 for (i = 0; i < BOARD_INFO(boardId)->numBoardTwsiDev; i++)
2053 if (BOARD_INFO(boardId)->pBoardTwsiDev[i].devClass == BOARD_DEV_TWSI_SATR)
2054 {
2055 if (indexFound == index)
2056 return BOARD_INFO(boardId)->pBoardTwsiDev[i].twsiDevAddr;
2057 else
2058 indexFound++;
2059 }
2060
2061 return (0xFF);
2062 }
2063
2064 /*******************************************************************************
2065 * mvBoardNandWidthGet -
2066 *
2067 * DESCRIPTION: Get the width of the first NAND device in byte.
2068 *
2069 * INPUT:
2070 *
2071 * OUTPUT:
2072 * None.
2073 *
2074 * RETURN: 1, 2, 4 or MV_ERROR
2075 *
2076 *
2077 *******************************************************************************/
2078 /* */
2079 MV_32 mvBoardNandWidthGet(void)
2080 {
2081 MV_U32 devNum;
2082 MV_U32 devWidth;
2083 MV_U32 boardId= mvBoardIdGet();
2084
2085 for (devNum = START_DEV_CS; devNum < BOARD_INFO(boardId)->numBoardDeviceIf; devNum++)
2086 {
2087 devWidth = mvBoardGetDeviceWidth(devNum, BOARD_DEV_NAND_FLASH);
2088 if (devWidth != MV_ERROR)
2089 return (devWidth / 8);
2090 }
2091
2092 /* NAND wasn't found */
2093 return MV_ERROR;
2094 }
2095
2096 MV_U32 gBoardId = -1;
2097
2098 /*******************************************************************************
2099 * mvBoardIdGet - Get Board model
2100 *
2101 * DESCRIPTION:
2102 * This function returns board ID.
2103 * Board ID is 32bit word constructed of board model (16bit) and
2104 * board revision (16bit) in the following way: 0xMMMMRRRR.
2105 *
2106 * INPUT:
2107 * None.
2108 *
2109 * OUTPUT:
2110 * None.
2111 *
2112 * RETURN:
2113 * 32bit board ID number, '-1' if board is undefined.
2114 *
2115 *******************************************************************************/
2116 MV_U32 mvBoardIdGet(MV_VOID)
2117 {
2118 MV_U32 tmpBoardId = -1;
2119
2120 if(gBoardId == -1)
2121 {
2122 #if defined(DB_88F6281A)
2123 tmpBoardId = DB_88F6281A_BP_ID;
2124 #elif defined(RD_88F6281A)
2125 tmpBoardId = RD_88F6281A_ID;
2126 #elif defined(DB_88F6192A)
2127 tmpBoardId = DB_88F6192A_BP_ID;
2128 #elif defined(DB_88F6190A)
2129 tmpBoardId = DB_88F6190A_BP_ID;
2130 #elif defined(RD_88F6192A)
2131 tmpBoardId = RD_88F6192A_ID;
2132 #elif defined(RD_88F6190A)
2133 tmpBoardId = RD_88F6190A_ID;
2134 #elif defined(DB_88F6180A)
2135 tmpBoardId = DB_88F6180A_BP_ID;
2136 #elif defined(RD_88F6281A_PCAC)
2137 tmpBoardId = RD_88F6281A_PCAC_ID;
2138 #elif defined(RD_88F6281A_SHEEVA_PLUG)
2139 tmpBoardId = SHEEVA_PLUG_ID;
2140 #elif defined(DB_CUSTOMER)
2141 tmpBoardId = DB_CUSTOMER_ID;
2142 #endif
2143 gBoardId = tmpBoardId;
2144 }
2145
2146 return gBoardId;
2147 }
2148
2149
2150 /*******************************************************************************
2151 * mvBoarModuleTypeGet - mvBoarModuleTypeGet
2152 *
2153 * DESCRIPTION:
2154 *
2155 * INPUT:
2156 * group num - MV_BOARD_MPP_GROUP_CLASS enum
2157 *
2158 * OUTPUT:
2159 * None.
2160 *
2161 * RETURN:
2162 * module num - MV_BOARD_MODULE_CLASS enum
2163 *
2164 *******************************************************************************/
2165 MV_BOARD_MODULE_ID_CLASS mvBoarModuleTypeGet(MV_BOARD_MPP_GROUP_CLASS devClass)
2166 {
2167 MV_TWSI_SLAVE twsiSlave;
2168 MV_TWSI_ADDR slave;
2169 MV_U8 data;
2170
2171 /* TWSI init */
2172 slave.type = ADDR7_BIT;
2173 slave.address = 0;
2174 mvTwsiInit(0, TWSI_SPEED, mvBoardTclkGet(), &slave, 0);
2175
2176 /* Read MPP module ID */
2177 DB(mvOsPrintf("Board: Read MPP module ID\n"));
2178 twsiSlave.slaveAddr.address = mvBoardTwsiExpAddrGet(devClass);
2179 twsiSlave.slaveAddr.type = mvBoardTwsiExpAddrTypeGet(devClass);
2180 twsiSlave.validOffset = MV_TRUE;
2181 /* Offset is the first command after the address which indicate the register number to be read
2182 in next operation */
2183 twsiSlave.offset = 0;
2184 twsiSlave.moreThen256 = MV_FALSE;
2185
2186
2187
2188 if( MV_OK != mvTwsiRead (0, &twsiSlave, &data, 1) )
2189 {
2190 DB(mvOsPrintf("Board: Read MPP module ID fail\n"));
2191 return MV_ERROR;
2192 }
2193 DB(mvOsPrintf("Board: Read MPP module ID succeded\n"));
2194
2195 return data;
2196 }
2197
2198 /*******************************************************************************
2199 * mvBoarTwsiSatRGet -
2200 *
2201 * DESCRIPTION:
2202 *
2203 * INPUT:
2204 * device num - one of three devices
2205 * reg num - 0 or 1
2206 *
2207 * OUTPUT:
2208 * None.
2209 *
2210 * RETURN:
2211 * reg value
2212 *
2213 *******************************************************************************/
2214 MV_U8 mvBoarTwsiSatRGet(MV_U8 devNum, MV_U8 regNum)
2215 {
2216 MV_TWSI_SLAVE twsiSlave;
2217 MV_TWSI_ADDR slave;
2218 MV_U8 data;
2219
2220 /* TWSI init */
2221 slave.type = ADDR7_BIT;
2222 slave.address = 0;
2223 mvTwsiInit(0, TWSI_SPEED, mvBoardTclkGet(), &slave, 0);
2224
2225 /* Read MPP module ID */
2226 DB(mvOsPrintf("Board: Read S@R device read\n"));
2227 twsiSlave.slaveAddr.address = mvBoardTwsiSatRAddrGet(devNum);
2228 twsiSlave.slaveAddr.type = mvBoardTwsiSatRAddrTypeGet(devNum);
2229 twsiSlave.validOffset = MV_TRUE;
2230 /* Use offset as command */
2231 twsiSlave.offset = regNum;
2232 twsiSlave.moreThen256 = MV_FALSE;
2233
2234 if( MV_OK != mvTwsiRead (0, &twsiSlave, &data, 1) )
2235 {
2236 DB(mvOsPrintf("Board: Read S@R fail\n"));
2237 return MV_ERROR;
2238 }
2239 DB(mvOsPrintf("Board: Read S@R succeded\n"));
2240
2241 return data;
2242 }
2243
2244 /*******************************************************************************
2245 * mvBoarTwsiSatRSet -
2246 *
2247 * DESCRIPTION:
2248 *
2249 * INPUT:
2250 * devNum - one of three devices
2251 * regNum - 0 or 1
2252 * regVal - value
2253 *
2254 *
2255 * OUTPUT:
2256 * None.
2257 *
2258 * RETURN:
2259 * reg value
2260 *
2261 *******************************************************************************/
2262 MV_STATUS mvBoarTwsiSatRSet(MV_U8 devNum, MV_U8 regNum, MV_U8 regVal)
2263 {
2264 MV_TWSI_SLAVE twsiSlave;
2265 MV_TWSI_ADDR slave;
2266
2267 /* TWSI init */
2268 slave.type = ADDR7_BIT;
2269 slave.address = 0;
2270 mvTwsiInit(0, TWSI_SPEED, mvBoardTclkGet(), &slave, 0);
2271
2272 /* Read MPP module ID */
2273 twsiSlave.slaveAddr.address = mvBoardTwsiSatRAddrGet(devNum);
2274 twsiSlave.slaveAddr.type = mvBoardTwsiSatRAddrTypeGet(devNum);
2275 twsiSlave.validOffset = MV_TRUE;
2276 DB(mvOsPrintf("Board: Write S@R device addr %x, type %x, data %x\n", twsiSlave.slaveAddr.address,\
2277 twsiSlave.slaveAddr.type, regVal));
2278 /* Use offset as command */
2279 twsiSlave.offset = regNum;
2280 twsiSlave.moreThen256 = MV_FALSE;
2281 if( MV_OK != mvTwsiWrite (0, &twsiSlave, &regVal, 1) )
2282 {
2283 DB(mvOsPrintf("Board: Write S@R fail\n"));
2284 return MV_ERROR;
2285 }
2286 DB(mvOsPrintf("Board: Write S@R succeded\n"));
2287
2288 return MV_OK;
2289 }
2290
2291 /*******************************************************************************
2292 * mvBoardSlicGpioPinGet -
2293 *
2294 * DESCRIPTION:
2295 *
2296 * INPUT:
2297 *
2298 * OUTPUT:
2299 * None.
2300 *
2301 * RETURN:
2302 *
2303 *
2304 *******************************************************************************/
2305 MV_32 mvBoardSlicGpioPinGet(MV_U32 slicNum)
2306 {
2307 MV_U32 boardId;
2308 boardId = mvBoardIdGet();
2309
2310 switch (boardId)
2311 {
2312 case DB_88F6281A_BP_ID:
2313 case RD_88F6281A_ID:
2314 default:
2315 return MV_ERROR;
2316 break;
2317
2318 }
2319 }
2320
2321 /*******************************************************************************
2322 * mvBoardFanPowerControl - Turn on/off the fan power control on the RD-6281A
2323 *
2324 * DESCRIPTION:
2325 *
2326 * INPUT:
2327 * mode - MV_TRUE = on ; MV_FALSE = off
2328 *
2329 * OUTPUT:
2330 * MV_STATUS - MV_OK , MV_ERROR.
2331 *
2332 * RETURN:
2333 *
2334 *******************************************************************************/
2335 MV_STATUS mvBoardFanPowerControl(MV_BOOL mode)
2336 {
2337
2338 MV_U8 val = 1, twsiVal;
2339 MV_TWSI_SLAVE twsiSlave;
2340 MV_TWSI_ADDR slave;
2341
2342 if(mvBoardIdGet() != RD_88F6281A_ID)
2343 return MV_ERROR;
2344
2345 /* TWSI init */
2346 slave.type = ADDR7_BIT;
2347 slave.address = 0;
2348 mvTwsiInit(0, TWSI_SPEED, mvBoardTclkGet(), &slave, 0);
2349
2350 /* Read MPP module ID */
2351 DB(mvOsPrintf("Board: twsi exp set\n"));
2352 twsiSlave.slaveAddr.address = mvBoardTwsiExpAddrGet(1);
2353 twsiSlave.slaveAddr.type = ADDR7_BIT;
2354 twsiSlave.validOffset = MV_TRUE;
2355 /* Offset is the first command after the address which indicate the register number to be read
2356 in next operation */
2357 twsiSlave.offset = 3;
2358 twsiSlave.moreThen256 = MV_FALSE;
2359 if(mode == MV_TRUE)
2360 val = 0x1;
2361 else
2362 val = 0;
2363 mvTwsiRead(0, &twsiSlave, &twsiVal, 1);
2364 val = (twsiVal & 0xfe) | val;
2365
2366 if( MV_OK != mvTwsiWrite (0, &twsiSlave, &val, 1) )
2367 {
2368 DB(mvOsPrintf("Board: twsi exp out val fail\n"));
2369 return MV_ERROR;
2370 }
2371 DB(mvOsPrintf("Board: twsi exp out val succeded\n"));
2372
2373 /* Change twsi exp to output */
2374 twsiSlave.offset = 7;
2375 mvTwsiRead(0, &twsiSlave, &twsiVal, 1);
2376 val = (twsiVal & 0xfe);
2377 if( MV_OK != mvTwsiWrite (0, &twsiSlave, &val, 1) )
2378 {
2379 DB(mvOsPrintf("Board: twsi exp change to out fail\n"));
2380 return MV_ERROR;
2381 }
2382 DB(mvOsPrintf("Board: twsi exp change to out succeded\n"));
2383 return MV_OK;
2384 }
2385
2386 /*******************************************************************************
2387 * mvBoardHDDPowerControl - Turn on/off the HDD power control on the RD-6281A
2388 *
2389 * DESCRIPTION:
2390 *
2391 * INPUT:
2392 * mode - MV_TRUE = on ; MV_FALSE = off
2393 *
2394 * OUTPUT:
2395 * MV_STATUS - MV_OK , MV_ERROR.
2396 *
2397 * RETURN:
2398 *
2399 *******************************************************************************/
2400 MV_STATUS mvBoardHDDPowerControl(MV_BOOL mode)
2401 {
2402
2403 MV_U8 val = 1, twsiVal;
2404 MV_TWSI_SLAVE twsiSlave;
2405 MV_TWSI_ADDR slave;
2406
2407 if(mvBoardIdGet() != RD_88F6281A_ID)
2408 return MV_ERROR;
2409
2410 /* TWSI init */
2411 slave.type = ADDR7_BIT;
2412 slave.address = 0;
2413 mvTwsiInit(0, TWSI_SPEED, mvBoardTclkGet(), &slave, 0);
2414
2415 /* Read MPP module ID */
2416 DB(mvOsPrintf("Board: twsi exp set\n"));
2417 twsiSlave.slaveAddr.address = mvBoardTwsiExpAddrGet(1);
2418 twsiSlave.slaveAddr.type = ADDR7_BIT;
2419 twsiSlave.validOffset = MV_TRUE;
2420 /* Offset is the first command after the address which indicate the register number to be read
2421 in next operation */
2422 twsiSlave.offset = 3;
2423 twsiSlave.moreThen256 = MV_FALSE;
2424 if(mode == MV_TRUE)
2425 val = 0x2;
2426 else
2427 val = 0;
2428 mvTwsiRead(0, &twsiSlave, &twsiVal, 1);
2429 val = (twsiVal & 0xfd) | val;
2430 if( MV_OK != mvTwsiWrite (0, &twsiSlave, &val, 1) )
2431 {
2432 DB(mvOsPrintf("Board: twsi exp out val fail\n"));
2433 return MV_ERROR;
2434 }
2435 DB(mvOsPrintf("Board: twsi exp out val succeded\n"));
2436
2437 /* Change twsi exp to output */
2438 twsiSlave.offset = 7;
2439 mvTwsiRead(0, &twsiSlave, &twsiVal, 1);
2440 val = (twsiVal & 0xfd);
2441 if( MV_OK != mvTwsiWrite (0, &twsiSlave, &val, 1) )
2442 {
2443 DB(mvOsPrintf("Board: twsi exp change to out fail\n"));
2444 return MV_ERROR;
2445 }
2446 DB(mvOsPrintf("Board: twsi exp change to out succeded\n"));
2447 return MV_OK;
2448 }
2449
2450 /*******************************************************************************
2451 * mvBoardSDioWPControl - Turn on/off the SDIO WP on the RD-6281A
2452 *
2453 * DESCRIPTION:
2454 *
2455 * INPUT:
2456 * mode - MV_TRUE = on ; MV_FALSE = off
2457 *
2458 * OUTPUT:
2459 * MV_STATUS - MV_OK , MV_ERROR.
2460 *
2461 * RETURN:
2462 *
2463 *******************************************************************************/
2464 MV_STATUS mvBoardSDioWPControl(MV_BOOL mode)
2465 {
2466
2467 MV_U8 val = 1, twsiVal;
2468 MV_TWSI_SLAVE twsiSlave;
2469 MV_TWSI_ADDR slave;
2470
2471 if(mvBoardIdGet() != RD_88F6281A_ID)
2472 return MV_ERROR;
2473
2474 /* TWSI init */
2475 slave.type = ADDR7_BIT;
2476 slave.address = 0;
2477 mvTwsiInit(0, TWSI_SPEED, mvBoardTclkGet(), &slave, 0);
2478
2479 /* Read MPP module ID */
2480 DB(mvOsPrintf("Board: twsi exp set\n"));
2481 twsiSlave.slaveAddr.address = mvBoardTwsiExpAddrGet(0);
2482 twsiSlave.slaveAddr.type = ADDR7_BIT;
2483 twsiSlave.validOffset = MV_TRUE;
2484 /* Offset is the first command after the address which indicate the register number to be read
2485 in next operation */
2486 twsiSlave.offset = 3;
2487 twsiSlave.moreThen256 = MV_FALSE;
2488 if(mode == MV_TRUE)
2489 val = 0x10;
2490 else
2491 val = 0;
2492 mvTwsiRead(0, &twsiSlave, &twsiVal, 1);
2493 val = (twsiVal & 0xef) | val;
2494 if( MV_OK != mvTwsiWrite (0, &twsiSlave, &val, 1) )
2495 {
2496 DB(mvOsPrintf("Board: twsi exp out val fail\n"));
2497 return MV_ERROR;
2498 }
2499 DB(mvOsPrintf("Board: twsi exp out val succeded\n"));
2500
2501 /* Change twsi exp to output */
2502 twsiSlave.offset = 7;
2503 mvTwsiRead(0, &twsiSlave, &twsiVal, 1);
2504 val = (twsiVal & 0xef);
2505 if( MV_OK != mvTwsiWrite (0, &twsiSlave, &val, 1) )
2506 {
2507 DB(mvOsPrintf("Board: twsi exp change to out fail\n"));
2508 return MV_ERROR;
2509 }
2510 DB(mvOsPrintf("Board: twsi exp change to out succeded\n"));
2511 return MV_OK;
2512 }
2513