Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /****************************************************************************/ |
| 2 | /* |
| 3 | * linux/include/asm-arm/arch-l7200/sib.h |
| 4 | * |
| 5 | * Registers and helper functions for the Serial Interface Bus. |
| 6 | * |
| 7 | * (C) Copyright 2000, S A McConnell (samcconn@cotw.com) |
| 8 | * |
| 9 | * This file is subject to the terms and conditions of the GNU General Public |
| 10 | * License. See the file COPYING in the main directory of this archive for |
| 11 | * more details. |
| 12 | */ |
| 13 | |
| 14 | /****************************************************************************/ |
| 15 | |
| 16 | #define SIB_OFF 0x00040000 /* Offset from IO_START to the SIB reg's. */ |
| 17 | |
| 18 | /* IO_START and IO_BASE are defined in hardware.h */ |
| 19 | |
| 20 | #define SIB_START (IO_START + SIB_OFF) /* Physical addr of the SIB reg. */ |
| 21 | #define SIB_BASE (IO_BASE + SIB_OFF) /* Virtual addr of the SIB reg. */ |
| 22 | |
| 23 | /* Offsets from the start of the SIB for all the registers. */ |
| 24 | |
| 25 | /* Define the SIB registers for use by device drivers and the kernel. */ |
| 26 | |
| 27 | typedef struct |
| 28 | { |
| 29 | unsigned int MCCR; /* SIB Control Register Offset: 0x00 */ |
| 30 | unsigned int RES1; /* Reserved Offset: 0x04 */ |
| 31 | unsigned int MCDR0; /* SIB Data Register 0 Offset: 0x08 */ |
| 32 | unsigned int MCDR1; /* SIB Data Register 1 Offset: 0x0c */ |
| 33 | unsigned int MCDR2; /* SIB Data Register 2 (UCB1x00) Offset: 0x10 */ |
| 34 | unsigned int RES2; /* Reserved Offset: 0x14 */ |
| 35 | unsigned int MCSR; /* SIB Status Register Offset: 0x18 */ |
| 36 | } SIB_Interface; |
| 37 | |
| 38 | #define SIB ((volatile SIB_Interface *) (SIB_BASE)) |
| 39 | |
| 40 | /* MCCR */ |
| 41 | |
| 42 | #define INTERNAL_FREQ 9216000 /* Hertz */ |
| 43 | #define AUDIO_FREQ 5000 /* Hertz */ |
| 44 | #define TELECOM_FREQ 5000 /* Hertz */ |
| 45 | |
| 46 | #define AUDIO_DIVIDE (INTERNAL_FREQ / (32 * AUDIO_FREQ)) |
| 47 | #define TELECOM_DIVIDE (INTERNAL_FREQ / (32 * TELECOM_FREQ)) |
| 48 | |
| 49 | #define MCCR_ASD57 AUDIO_DIVIDE |
| 50 | #define MCCR_TSD57 (TELECOM_DIVIDE << 8) |
| 51 | #define MCCR_MCE (1 << 16) /* SIB enable */ |
| 52 | #define MCCR_ECS (1 << 17) /* External Clock Select */ |
| 53 | #define MCCR_ADM (1 << 18) /* A/D Data Sampling */ |
| 54 | #define MCCR_PMC (1 << 26) /* PIN Multiplexer Control */ |
| 55 | |
| 56 | |
| 57 | #define GET_ASD ((SIB->MCCR >> 0) & 0x3f) /* Audio Sample Rate Div. */ |
| 58 | #define GET_TSD ((SIB->MCCR >> 8) & 0x3f) /* Telcom Sample Rate Div. */ |
| 59 | #define GET_MCE ((SIB->MCCR >> 16) & 0x01) /* SIB Enable */ |
| 60 | #define GET_ECS ((SIB->MCCR >> 17) & 0x01) /* External Clock Select */ |
| 61 | #define GET_ADM ((SIB->MCCR >> 18) & 0x01) /* A/D Data Sampling Mode */ |
| 62 | #define GET_TTM ((SIB->MCCR >> 19) & 0x01) /* Telco Trans. FIFO I mask */ |
| 63 | #define GET_TRM ((SIB->MCCR >> 20) & 0x01) /* Telco Recv. FIFO I mask */ |
| 64 | #define GET_ATM ((SIB->MCCR >> 21) & 0x01) /* Audio Trans. FIFO I mask */ |
| 65 | #define GET_ARM ((SIB->MCCR >> 22) & 0x01) /* Audio Recv. FIFO I mask */ |
| 66 | #define GET_LBM ((SIB->MCCR >> 23) & 0x01) /* Loop Back Mode */ |
| 67 | #define GET_ECP ((SIB->MCCR >> 24) & 0x03) /* Extern. Clck Prescale sel */ |
| 68 | #define GET_PMC ((SIB->MCCR >> 26) & 0x01) /* PIN Multiplexer Control */ |
| 69 | #define GET_ERI ((SIB->MCCR >> 27) & 0x01) /* External Read Interrupt */ |
| 70 | #define GET_EWI ((SIB->MCCR >> 28) & 0x01) /* External Write Interrupt */ |
| 71 | |
| 72 | /* MCDR0 */ |
| 73 | |
| 74 | #define AUDIO_RECV ((SIB->MCDR0 >> 4) & 0xfff) |
| 75 | #define AUDIO_WRITE(v) ((SIB->MCDR0 = (v & 0xfff) << 4)) |
| 76 | |
| 77 | /* MCDR1 */ |
| 78 | |
| 79 | #define TELECOM_RECV ((SIB->MCDR1 >> 2) & 032fff) |
| 80 | #define TELECOM_WRITE(v) ((SIB->MCDR1 = (v & 0x3fff) << 2)) |
| 81 | |
| 82 | |
| 83 | /* MCSR */ |
| 84 | |
| 85 | #define MCSR_ATU (1 << 4) /* Audio Transmit FIFO Underrun */ |
| 86 | #define MCSR_ARO (1 << 5) /* Audio Receive FIFO Underrun */ |
| 87 | #define MCSR_TTU (1 << 6) /* TELECOM Transmit FIFO Underrun */ |
| 88 | #define MCSR_TRO (1 << 7) /* TELECOM Receive FIFO Underrun */ |
| 89 | |
| 90 | #define MCSR_CLEAR_UNDERUN_BITS (MCSR_ATU | MCSR_ARO | MCSR_TTU | MCSR_TRO) |
| 91 | |
| 92 | |
| 93 | #define GET_ATS ((SIB->MCSR >> 0) & 0x01) /* Audio Transmit FIFO Service Req*/ |
| 94 | #define GET_ARS ((SIB->MCSR >> 1) & 0x01) /* Audio Recv FIFO Service Request*/ |
| 95 | #define GET_TTS ((SIB->MCSR >> 2) & 0x01) /* TELECOM Transmit FIFO Flag */ |
| 96 | #define GET_TRS ((SIB->MCSR >> 3) & 0x01) /* TELECOM Recv FIFO Service Req. */ |
| 97 | #define GET_ATU ((SIB->MCSR >> 4) & 0x01) /* Audio Transmit FIFO Underrun */ |
| 98 | #define GET_ARO ((SIB->MCSR >> 5) & 0x01) /* Audio Receive FIFO Underrun */ |
| 99 | #define GET_TTU ((SIB->MCSR >> 6) & 0x01) /* TELECOM Transmit FIFO Underrun */ |
| 100 | #define GET_TRO ((SIB->MCSR >> 7) & 0x01) /* TELECOM Receive FIFO Underrun */ |
| 101 | #define GET_ANF ((SIB->MCSR >> 8) & 0x01) /* Audio Transmit FIFO not full */ |
| 102 | #define GET_ANE ((SIB->MCSR >> 9) & 0x01) /* Audio Receive FIFO not empty */ |
| 103 | #define GET_TNF ((SIB->MCSR >> 10) & 0x01) /* Telecom Transmit FIFO not full */ |
| 104 | #define GET_TNE ((SIB->MCSR >> 11) & 0x01) /* Telecom Receive FIFO not empty */ |
| 105 | #define GET_CWC ((SIB->MCSR >> 12) & 0x01) /* Codec Write Complete */ |
| 106 | #define GET_CRC ((SIB->MCSR >> 13) & 0x01) /* Codec Read Complete */ |
| 107 | #define GET_ACE ((SIB->MCSR >> 14) & 0x01) /* Audio Codec Enabled */ |
| 108 | #define GET_TCE ((SIB->MCSR >> 15) & 0x01) /* Telecom Codec Enabled */ |
| 109 | |
| 110 | /* MCDR2 */ |
| 111 | |
| 112 | #define MCDR2_rW (1 << 16) |
| 113 | |
| 114 | #define WRITE_MCDR2(reg, data) (SIB->MCDR2 =((reg<<17)|MCDR2_rW|(data&0xffff))) |
| 115 | #define MCDR2_WRITE_COMPLETE GET_CWC |
| 116 | |
| 117 | #define INITIATE_MCDR2_READ(reg) (SIB->MCDR2 = (reg << 17)) |
| 118 | #define MCDR2_READ_COMPLETE GET_CRC |
| 119 | #define MCDR2_READ (SIB->MCDR2 & 0xffff) |