Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef __INCLUDE_ATMEL_SSC_H
0003 #define __INCLUDE_ATMEL_SSC_H
0004 
0005 #include <linux/platform_device.h>
0006 #include <linux/list.h>
0007 #include <linux/io.h>
0008 
0009 struct atmel_ssc_platform_data {
0010     int         use_dma;
0011     int         has_fslen_ext;
0012 };
0013 
0014 struct ssc_device {
0015     struct list_head    list;
0016     dma_addr_t      phybase;
0017     void __iomem        *regs;
0018     struct platform_device  *pdev;
0019     struct atmel_ssc_platform_data *pdata;
0020     struct clk      *clk;
0021     int         user;
0022     int         irq;
0023     bool            clk_from_rk_pin;
0024     bool            sound_dai;
0025 };
0026 
0027 struct ssc_device * __must_check ssc_request(unsigned int ssc_num);
0028 void ssc_free(struct ssc_device *ssc);
0029 
0030 /* SSC register offsets */
0031 
0032 /* SSC Control Register */
0033 #define SSC_CR              0x00000000
0034 #define SSC_CR_RXDIS_SIZE            1
0035 #define SSC_CR_RXDIS_OFFSET          1
0036 #define SSC_CR_RXEN_SIZE             1
0037 #define SSC_CR_RXEN_OFFSET           0
0038 #define SSC_CR_SWRST_SIZE            1
0039 #define SSC_CR_SWRST_OFFSET         15
0040 #define SSC_CR_TXDIS_SIZE            1
0041 #define SSC_CR_TXDIS_OFFSET          9
0042 #define SSC_CR_TXEN_SIZE             1
0043 #define SSC_CR_TXEN_OFFSET           8
0044 
0045 /* SSC Clock Mode Register */
0046 #define SSC_CMR             0x00000004
0047 #define SSC_CMR_DIV_SIZE            12
0048 #define SSC_CMR_DIV_OFFSET           0
0049 
0050 /* SSC Receive Clock Mode Register */
0051 #define SSC_RCMR            0x00000010
0052 #define SSC_RCMR_CKG_SIZE            2
0053 #define SSC_RCMR_CKG_OFFSET          6
0054 #define SSC_RCMR_CKI_SIZE            1
0055 #define SSC_RCMR_CKI_OFFSET          5
0056 #define SSC_RCMR_CKO_SIZE            3
0057 #define SSC_RCMR_CKO_OFFSET          2
0058 #define SSC_RCMR_CKS_SIZE            2
0059 #define SSC_RCMR_CKS_OFFSET          0
0060 #define SSC_RCMR_PERIOD_SIZE             8
0061 #define SSC_RCMR_PERIOD_OFFSET          24
0062 #define SSC_RCMR_START_SIZE          4
0063 #define SSC_RCMR_START_OFFSET            8
0064 #define SSC_RCMR_STOP_SIZE           1
0065 #define SSC_RCMR_STOP_OFFSET            12
0066 #define SSC_RCMR_STTDLY_SIZE             8
0067 #define SSC_RCMR_STTDLY_OFFSET          16
0068 
0069 /* SSC Receive Frame Mode Register */
0070 #define SSC_RFMR            0x00000014
0071 #define SSC_RFMR_DATLEN_SIZE             5
0072 #define SSC_RFMR_DATLEN_OFFSET           0
0073 #define SSC_RFMR_DATNB_SIZE          4
0074 #define SSC_RFMR_DATNB_OFFSET            8
0075 #define SSC_RFMR_FSEDGE_SIZE             1
0076 #define SSC_RFMR_FSEDGE_OFFSET          24
0077 /*
0078  * The FSLEN_EXT exist on at91sam9rl, at91sam9g10,
0079  * at91sam9g20, and at91sam9g45 and newer SoCs
0080  */
0081 #define SSC_RFMR_FSLEN_EXT_SIZE          4
0082 #define SSC_RFMR_FSLEN_EXT_OFFSET       28
0083 #define SSC_RFMR_FSLEN_SIZE          4
0084 #define SSC_RFMR_FSLEN_OFFSET           16
0085 #define SSC_RFMR_FSOS_SIZE           4
0086 #define SSC_RFMR_FSOS_OFFSET            20
0087 #define SSC_RFMR_LOOP_SIZE           1
0088 #define SSC_RFMR_LOOP_OFFSET             5
0089 #define SSC_RFMR_MSBF_SIZE           1
0090 #define SSC_RFMR_MSBF_OFFSET             7
0091 
0092 /* SSC Transmit Clock Mode Register */
0093 #define SSC_TCMR            0x00000018
0094 #define SSC_TCMR_CKG_SIZE            2
0095 #define SSC_TCMR_CKG_OFFSET          6
0096 #define SSC_TCMR_CKI_SIZE            1
0097 #define SSC_TCMR_CKI_OFFSET          5
0098 #define SSC_TCMR_CKO_SIZE            3
0099 #define SSC_TCMR_CKO_OFFSET          2
0100 #define SSC_TCMR_CKS_SIZE            2
0101 #define SSC_TCMR_CKS_OFFSET          0
0102 #define SSC_TCMR_PERIOD_SIZE             8
0103 #define SSC_TCMR_PERIOD_OFFSET          24
0104 #define SSC_TCMR_START_SIZE          4
0105 #define SSC_TCMR_START_OFFSET            8
0106 #define SSC_TCMR_STTDLY_SIZE             8
0107 #define SSC_TCMR_STTDLY_OFFSET          16
0108 
0109 /* SSC Transmit Frame Mode Register */
0110 #define SSC_TFMR            0x0000001c
0111 #define SSC_TFMR_DATDEF_SIZE             1
0112 #define SSC_TFMR_DATDEF_OFFSET           5
0113 #define SSC_TFMR_DATLEN_SIZE             5
0114 #define SSC_TFMR_DATLEN_OFFSET           0
0115 #define SSC_TFMR_DATNB_SIZE          4
0116 #define SSC_TFMR_DATNB_OFFSET            8
0117 #define SSC_TFMR_FSDEN_SIZE          1
0118 #define SSC_TFMR_FSDEN_OFFSET           23
0119 #define SSC_TFMR_FSEDGE_SIZE             1
0120 #define SSC_TFMR_FSEDGE_OFFSET          24
0121 /*
0122  * The FSLEN_EXT exist on at91sam9rl, at91sam9g10,
0123  * at91sam9g20, and at91sam9g45 and newer SoCs
0124  */
0125 #define SSC_TFMR_FSLEN_EXT_SIZE          4
0126 #define SSC_TFMR_FSLEN_EXT_OFFSET       28
0127 #define SSC_TFMR_FSLEN_SIZE          4
0128 #define SSC_TFMR_FSLEN_OFFSET           16
0129 #define SSC_TFMR_FSOS_SIZE           3
0130 #define SSC_TFMR_FSOS_OFFSET            20
0131 #define SSC_TFMR_MSBF_SIZE           1
0132 #define SSC_TFMR_MSBF_OFFSET             7
0133 
0134 /* SSC Receive Hold Register */
0135 #define SSC_RHR             0x00000020
0136 #define SSC_RHR_RDAT_SIZE           32
0137 #define SSC_RHR_RDAT_OFFSET          0
0138 
0139 /* SSC Transmit Hold Register */
0140 #define SSC_THR             0x00000024
0141 #define SSC_THR_TDAT_SIZE           32
0142 #define SSC_THR_TDAT_OFFSET          0
0143 
0144 /* SSC Receive Sync. Holding Register */
0145 #define SSC_RSHR            0x00000030
0146 #define SSC_RSHR_RSDAT_SIZE         16
0147 #define SSC_RSHR_RSDAT_OFFSET            0
0148 
0149 /* SSC Transmit Sync. Holding Register */
0150 #define SSC_TSHR            0x00000034
0151 #define SSC_TSHR_TSDAT_SIZE         16
0152 #define SSC_TSHR_RSDAT_OFFSET            0
0153 
0154 /* SSC Receive Compare 0 Register */
0155 #define SSC_RC0R            0x00000038
0156 #define SSC_RC0R_CP0_SIZE           16
0157 #define SSC_RC0R_CP0_OFFSET          0
0158 
0159 /* SSC Receive Compare 1 Register */
0160 #define SSC_RC1R            0x0000003c
0161 #define SSC_RC1R_CP1_SIZE           16
0162 #define SSC_RC1R_CP1_OFFSET          0
0163 
0164 /* SSC Status Register */
0165 #define SSC_SR              0x00000040
0166 #define SSC_SR_CP0_SIZE              1
0167 #define SSC_SR_CP0_OFFSET            8
0168 #define SSC_SR_CP1_SIZE              1
0169 #define SSC_SR_CP1_OFFSET            9
0170 #define SSC_SR_ENDRX_SIZE            1
0171 #define SSC_SR_ENDRX_OFFSET          6
0172 #define SSC_SR_ENDTX_SIZE            1
0173 #define SSC_SR_ENDTX_OFFSET          2
0174 #define SSC_SR_OVRUN_SIZE            1
0175 #define SSC_SR_OVRUN_OFFSET          5
0176 #define SSC_SR_RXBUFF_SIZE           1
0177 #define SSC_SR_RXBUFF_OFFSET             7
0178 #define SSC_SR_RXEN_SIZE             1
0179 #define SSC_SR_RXEN_OFFSET          17
0180 #define SSC_SR_RXRDY_SIZE            1
0181 #define SSC_SR_RXRDY_OFFSET          4
0182 #define SSC_SR_RXSYN_SIZE            1
0183 #define SSC_SR_RXSYN_OFFSET         11
0184 #define SSC_SR_TXBUFE_SIZE           1
0185 #define SSC_SR_TXBUFE_OFFSET             3
0186 #define SSC_SR_TXEMPTY_SIZE          1
0187 #define SSC_SR_TXEMPTY_OFFSET            1
0188 #define SSC_SR_TXEN_SIZE             1
0189 #define SSC_SR_TXEN_OFFSET          16
0190 #define SSC_SR_TXRDY_SIZE            1
0191 #define SSC_SR_TXRDY_OFFSET          0
0192 #define SSC_SR_TXSYN_SIZE            1
0193 #define SSC_SR_TXSYN_OFFSET         10
0194 
0195 /* SSC Interrupt Enable Register */
0196 #define SSC_IER             0x00000044
0197 #define SSC_IER_CP0_SIZE             1
0198 #define SSC_IER_CP0_OFFSET           8
0199 #define SSC_IER_CP1_SIZE             1
0200 #define SSC_IER_CP1_OFFSET           9
0201 #define SSC_IER_ENDRX_SIZE           1
0202 #define SSC_IER_ENDRX_OFFSET             6
0203 #define SSC_IER_ENDTX_SIZE           1
0204 #define SSC_IER_ENDTX_OFFSET             2
0205 #define SSC_IER_OVRUN_SIZE           1
0206 #define SSC_IER_OVRUN_OFFSET             5
0207 #define SSC_IER_RXBUFF_SIZE          1
0208 #define SSC_IER_RXBUFF_OFFSET            7
0209 #define SSC_IER_RXRDY_SIZE           1
0210 #define SSC_IER_RXRDY_OFFSET             4
0211 #define SSC_IER_RXSYN_SIZE           1
0212 #define SSC_IER_RXSYN_OFFSET            11
0213 #define SSC_IER_TXBUFE_SIZE          1
0214 #define SSC_IER_TXBUFE_OFFSET            3
0215 #define SSC_IER_TXEMPTY_SIZE             1
0216 #define SSC_IER_TXEMPTY_OFFSET           1
0217 #define SSC_IER_TXRDY_SIZE           1
0218 #define SSC_IER_TXRDY_OFFSET             0
0219 #define SSC_IER_TXSYN_SIZE           1
0220 #define SSC_IER_TXSYN_OFFSET            10
0221 
0222 /* SSC Interrupt Disable Register */
0223 #define SSC_IDR             0x00000048
0224 #define SSC_IDR_CP0_SIZE             1
0225 #define SSC_IDR_CP0_OFFSET           8
0226 #define SSC_IDR_CP1_SIZE             1
0227 #define SSC_IDR_CP1_OFFSET           9
0228 #define SSC_IDR_ENDRX_SIZE           1
0229 #define SSC_IDR_ENDRX_OFFSET             6
0230 #define SSC_IDR_ENDTX_SIZE           1
0231 #define SSC_IDR_ENDTX_OFFSET             2
0232 #define SSC_IDR_OVRUN_SIZE           1
0233 #define SSC_IDR_OVRUN_OFFSET             5
0234 #define SSC_IDR_RXBUFF_SIZE          1
0235 #define SSC_IDR_RXBUFF_OFFSET            7
0236 #define SSC_IDR_RXRDY_SIZE           1
0237 #define SSC_IDR_RXRDY_OFFSET             4
0238 #define SSC_IDR_RXSYN_SIZE           1
0239 #define SSC_IDR_RXSYN_OFFSET            11
0240 #define SSC_IDR_TXBUFE_SIZE          1
0241 #define SSC_IDR_TXBUFE_OFFSET            3
0242 #define SSC_IDR_TXEMPTY_SIZE             1
0243 #define SSC_IDR_TXEMPTY_OFFSET           1
0244 #define SSC_IDR_TXRDY_SIZE           1
0245 #define SSC_IDR_TXRDY_OFFSET             0
0246 #define SSC_IDR_TXSYN_SIZE           1
0247 #define SSC_IDR_TXSYN_OFFSET            10
0248 
0249 /* SSC Interrupt Mask Register */
0250 #define SSC_IMR             0x0000004c
0251 #define SSC_IMR_CP0_SIZE             1
0252 #define SSC_IMR_CP0_OFFSET           8
0253 #define SSC_IMR_CP1_SIZE             1
0254 #define SSC_IMR_CP1_OFFSET           9
0255 #define SSC_IMR_ENDRX_SIZE           1
0256 #define SSC_IMR_ENDRX_OFFSET             6
0257 #define SSC_IMR_ENDTX_SIZE           1
0258 #define SSC_IMR_ENDTX_OFFSET             2
0259 #define SSC_IMR_OVRUN_SIZE           1
0260 #define SSC_IMR_OVRUN_OFFSET             5
0261 #define SSC_IMR_RXBUFF_SIZE          1
0262 #define SSC_IMR_RXBUFF_OFFSET            7
0263 #define SSC_IMR_RXRDY_SIZE           1
0264 #define SSC_IMR_RXRDY_OFFSET             4
0265 #define SSC_IMR_RXSYN_SIZE           1
0266 #define SSC_IMR_RXSYN_OFFSET            11
0267 #define SSC_IMR_TXBUFE_SIZE          1
0268 #define SSC_IMR_TXBUFE_OFFSET            3
0269 #define SSC_IMR_TXEMPTY_SIZE             1
0270 #define SSC_IMR_TXEMPTY_OFFSET           1
0271 #define SSC_IMR_TXRDY_SIZE           1
0272 #define SSC_IMR_TXRDY_OFFSET             0
0273 #define SSC_IMR_TXSYN_SIZE           1
0274 #define SSC_IMR_TXSYN_OFFSET            10
0275 
0276 /* SSC PDC Receive Pointer Register */
0277 #define SSC_PDC_RPR         0x00000100
0278 
0279 /* SSC PDC Receive Counter Register */
0280 #define SSC_PDC_RCR         0x00000104
0281 
0282 /* SSC PDC Transmit Pointer Register */
0283 #define SSC_PDC_TPR         0x00000108
0284 
0285 /* SSC PDC Receive Next Pointer Register */
0286 #define SSC_PDC_RNPR            0x00000110
0287 
0288 /* SSC PDC Receive Next Counter Register */
0289 #define SSC_PDC_RNCR            0x00000114
0290 
0291 /* SSC PDC Transmit Counter Register */
0292 #define SSC_PDC_TCR         0x0000010c
0293 
0294 /* SSC PDC Transmit Next Pointer Register */
0295 #define SSC_PDC_TNPR            0x00000118
0296 
0297 /* SSC PDC Transmit Next Counter Register */
0298 #define SSC_PDC_TNCR            0x0000011c
0299 
0300 /* SSC PDC Transfer Control Register */
0301 #define SSC_PDC_PTCR            0x00000120
0302 #define SSC_PDC_PTCR_RXTDIS_SIZE         1
0303 #define SSC_PDC_PTCR_RXTDIS_OFFSET       1
0304 #define SSC_PDC_PTCR_RXTEN_SIZE          1
0305 #define SSC_PDC_PTCR_RXTEN_OFFSET        0
0306 #define SSC_PDC_PTCR_TXTDIS_SIZE         1
0307 #define SSC_PDC_PTCR_TXTDIS_OFFSET       9
0308 #define SSC_PDC_PTCR_TXTEN_SIZE          1
0309 #define SSC_PDC_PTCR_TXTEN_OFFSET        8
0310 
0311 /* SSC PDC Transfer Status Register */
0312 #define SSC_PDC_PTSR            0x00000124
0313 #define SSC_PDC_PTSR_RXTEN_SIZE          1
0314 #define SSC_PDC_PTSR_RXTEN_OFFSET        0
0315 #define SSC_PDC_PTSR_TXTEN_SIZE          1
0316 #define SSC_PDC_PTSR_TXTEN_OFFSET        8
0317 
0318 /* Bit manipulation macros */
0319 #define SSC_BIT(name)                   \
0320     (1 << SSC_##name##_OFFSET)
0321 #define SSC_BF(name, value)             \
0322     (((value) & ((1 << SSC_##name##_SIZE) - 1)) \
0323      << SSC_##name##_OFFSET)
0324 #define SSC_BFEXT(name, value)              \
0325     (((value) >> SSC_##name##_OFFSET)       \
0326      & ((1 << SSC_##name##_SIZE) - 1))
0327 #define SSC_BFINS(name, value, old)         \
0328     (((old) & ~(((1 << SSC_##name##_SIZE) - 1)  \
0329     << SSC_##name##_OFFSET)) | SSC_BF(name, value))
0330 
0331 /* Register access macros */
0332 #define ssc_readl(base, reg)        __raw_readl(base + SSC_##reg)
0333 #define ssc_writel(base, reg, value)    __raw_writel((value), base + SSC_##reg)
0334 
0335 #endif /* __INCLUDE_ATMEL_SSC_H */