162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * OMAP Multi-Channel Buffered Serial Port 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Contact: Jarkko Nikula <jarkko.nikula@bitmer.com> 662306a36Sopenharmony_ci * Peter Ujfalusi <peter.ujfalusi@ti.com> 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#ifndef __OMAP_MCBSP_PRIV_H__ 1062306a36Sopenharmony_ci#define __OMAP_MCBSP_PRIV_H__ 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <linux/platform_data/asoc-ti-mcbsp.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#ifdef CONFIG_ARCH_OMAP1 1562306a36Sopenharmony_ci#define mcbsp_omap1() 1 1662306a36Sopenharmony_ci#else 1762306a36Sopenharmony_ci#define mcbsp_omap1() 0 1862306a36Sopenharmony_ci#endif 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci/* McBSP register numbers. Register address offset = num * reg_step */ 2162306a36Sopenharmony_cienum { 2262306a36Sopenharmony_ci /* Common registers */ 2362306a36Sopenharmony_ci OMAP_MCBSP_REG_SPCR2 = 4, 2462306a36Sopenharmony_ci OMAP_MCBSP_REG_SPCR1, 2562306a36Sopenharmony_ci OMAP_MCBSP_REG_RCR2, 2662306a36Sopenharmony_ci OMAP_MCBSP_REG_RCR1, 2762306a36Sopenharmony_ci OMAP_MCBSP_REG_XCR2, 2862306a36Sopenharmony_ci OMAP_MCBSP_REG_XCR1, 2962306a36Sopenharmony_ci OMAP_MCBSP_REG_SRGR2, 3062306a36Sopenharmony_ci OMAP_MCBSP_REG_SRGR1, 3162306a36Sopenharmony_ci OMAP_MCBSP_REG_MCR2, 3262306a36Sopenharmony_ci OMAP_MCBSP_REG_MCR1, 3362306a36Sopenharmony_ci OMAP_MCBSP_REG_RCERA, 3462306a36Sopenharmony_ci OMAP_MCBSP_REG_RCERB, 3562306a36Sopenharmony_ci OMAP_MCBSP_REG_XCERA, 3662306a36Sopenharmony_ci OMAP_MCBSP_REG_XCERB, 3762306a36Sopenharmony_ci OMAP_MCBSP_REG_PCR0, 3862306a36Sopenharmony_ci OMAP_MCBSP_REG_RCERC, 3962306a36Sopenharmony_ci OMAP_MCBSP_REG_RCERD, 4062306a36Sopenharmony_ci OMAP_MCBSP_REG_XCERC, 4162306a36Sopenharmony_ci OMAP_MCBSP_REG_XCERD, 4262306a36Sopenharmony_ci OMAP_MCBSP_REG_RCERE, 4362306a36Sopenharmony_ci OMAP_MCBSP_REG_RCERF, 4462306a36Sopenharmony_ci OMAP_MCBSP_REG_XCERE, 4562306a36Sopenharmony_ci OMAP_MCBSP_REG_XCERF, 4662306a36Sopenharmony_ci OMAP_MCBSP_REG_RCERG, 4762306a36Sopenharmony_ci OMAP_MCBSP_REG_RCERH, 4862306a36Sopenharmony_ci OMAP_MCBSP_REG_XCERG, 4962306a36Sopenharmony_ci OMAP_MCBSP_REG_XCERH, 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci /* OMAP1-OMAP2420 registers */ 5262306a36Sopenharmony_ci OMAP_MCBSP_REG_DRR2 = 0, 5362306a36Sopenharmony_ci OMAP_MCBSP_REG_DRR1, 5462306a36Sopenharmony_ci OMAP_MCBSP_REG_DXR2, 5562306a36Sopenharmony_ci OMAP_MCBSP_REG_DXR1, 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci /* OMAP2430 and onwards */ 5862306a36Sopenharmony_ci OMAP_MCBSP_REG_DRR = 0, 5962306a36Sopenharmony_ci OMAP_MCBSP_REG_DXR = 2, 6062306a36Sopenharmony_ci OMAP_MCBSP_REG_SYSCON = 35, 6162306a36Sopenharmony_ci OMAP_MCBSP_REG_THRSH2, 6262306a36Sopenharmony_ci OMAP_MCBSP_REG_THRSH1, 6362306a36Sopenharmony_ci OMAP_MCBSP_REG_IRQST = 40, 6462306a36Sopenharmony_ci OMAP_MCBSP_REG_IRQEN, 6562306a36Sopenharmony_ci OMAP_MCBSP_REG_WAKEUPEN, 6662306a36Sopenharmony_ci OMAP_MCBSP_REG_XCCR, 6762306a36Sopenharmony_ci OMAP_MCBSP_REG_RCCR, 6862306a36Sopenharmony_ci OMAP_MCBSP_REG_XBUFFSTAT, 6962306a36Sopenharmony_ci OMAP_MCBSP_REG_RBUFFSTAT, 7062306a36Sopenharmony_ci OMAP_MCBSP_REG_SSELCR, 7162306a36Sopenharmony_ci}; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci/************************** McBSP SPCR1 bit definitions ***********************/ 7462306a36Sopenharmony_ci#define RRST BIT(0) 7562306a36Sopenharmony_ci#define RRDY BIT(1) 7662306a36Sopenharmony_ci#define RFULL BIT(2) 7762306a36Sopenharmony_ci#define RSYNC_ERR BIT(3) 7862306a36Sopenharmony_ci#define RINTM(value) (((value) & 0x3) << 4) /* bits 4:5 */ 7962306a36Sopenharmony_ci#define ABIS BIT(6) 8062306a36Sopenharmony_ci#define DXENA BIT(7) 8162306a36Sopenharmony_ci#define CLKSTP(value) (((value) & 0x3) << 11) /* bits 11:12 */ 8262306a36Sopenharmony_ci#define RJUST(value) (((value) & 0x3) << 13) /* bits 13:14 */ 8362306a36Sopenharmony_ci#define ALB BIT(15) 8462306a36Sopenharmony_ci#define DLB BIT(15) 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci/************************** McBSP SPCR2 bit definitions ***********************/ 8762306a36Sopenharmony_ci#define XRST BIT(0) 8862306a36Sopenharmony_ci#define XRDY BIT(1) 8962306a36Sopenharmony_ci#define XEMPTY BIT(2) 9062306a36Sopenharmony_ci#define XSYNC_ERR BIT(3) 9162306a36Sopenharmony_ci#define XINTM(value) (((value) & 0x3) << 4) /* bits 4:5 */ 9262306a36Sopenharmony_ci#define GRST BIT(6) 9362306a36Sopenharmony_ci#define FRST BIT(7) 9462306a36Sopenharmony_ci#define SOFT BIT(8) 9562306a36Sopenharmony_ci#define FREE BIT(9) 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci/************************** McBSP PCR bit definitions *************************/ 9862306a36Sopenharmony_ci#define CLKRP BIT(0) 9962306a36Sopenharmony_ci#define CLKXP BIT(1) 10062306a36Sopenharmony_ci#define FSRP BIT(2) 10162306a36Sopenharmony_ci#define FSXP BIT(3) 10262306a36Sopenharmony_ci#define DR_STAT BIT(4) 10362306a36Sopenharmony_ci#define DX_STAT BIT(5) 10462306a36Sopenharmony_ci#define CLKS_STAT BIT(6) 10562306a36Sopenharmony_ci#define SCLKME BIT(7) 10662306a36Sopenharmony_ci#define CLKRM BIT(8) 10762306a36Sopenharmony_ci#define CLKXM BIT(9) 10862306a36Sopenharmony_ci#define FSRM BIT(10) 10962306a36Sopenharmony_ci#define FSXM BIT(11) 11062306a36Sopenharmony_ci#define RIOEN BIT(12) 11162306a36Sopenharmony_ci#define XIOEN BIT(13) 11262306a36Sopenharmony_ci#define IDLE_EN BIT(14) 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci/************************** McBSP RCR1 bit definitions ************************/ 11562306a36Sopenharmony_ci#define RWDLEN1(value) (((value) & 0x7) << 5) /* Bits 5:7 */ 11662306a36Sopenharmony_ci#define RFRLEN1(value) (((value) & 0x7f) << 8) /* Bits 8:14 */ 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci/************************** McBSP XCR1 bit definitions ************************/ 11962306a36Sopenharmony_ci#define XWDLEN1(value) (((value) & 0x7) << 5) /* Bits 5:7 */ 12062306a36Sopenharmony_ci#define XFRLEN1(value) (((value) & 0x7f) << 8) /* Bits 8:14 */ 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci/*************************** McBSP RCR2 bit definitions ***********************/ 12362306a36Sopenharmony_ci#define RDATDLY(value) ((value) & 0x3) /* Bits 0:1 */ 12462306a36Sopenharmony_ci#define RFIG BIT(2) 12562306a36Sopenharmony_ci#define RCOMPAND(value) (((value) & 0x3) << 3) /* Bits 3:4 */ 12662306a36Sopenharmony_ci#define RWDLEN2(value) (((value) & 0x7) << 5) /* Bits 5:7 */ 12762306a36Sopenharmony_ci#define RFRLEN2(value) (((value) & 0x7f) << 8) /* Bits 8:14 */ 12862306a36Sopenharmony_ci#define RPHASE BIT(15) 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci/*************************** McBSP XCR2 bit definitions ***********************/ 13162306a36Sopenharmony_ci#define XDATDLY(value) ((value) & 0x3) /* Bits 0:1 */ 13262306a36Sopenharmony_ci#define XFIG BIT(2) 13362306a36Sopenharmony_ci#define XCOMPAND(value) (((value) & 0x3) << 3) /* Bits 3:4 */ 13462306a36Sopenharmony_ci#define XWDLEN2(value) (((value) & 0x7) << 5) /* Bits 5:7 */ 13562306a36Sopenharmony_ci#define XFRLEN2(value) (((value) & 0x7f) << 8) /* Bits 8:14 */ 13662306a36Sopenharmony_ci#define XPHASE BIT(15) 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci/************************* McBSP SRGR1 bit definitions ************************/ 13962306a36Sopenharmony_ci#define CLKGDV(value) ((value) & 0x7f) /* Bits 0:7 */ 14062306a36Sopenharmony_ci#define FWID(value) (((value) & 0xff) << 8) /* Bits 8:15 */ 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci/************************* McBSP SRGR2 bit definitions ************************/ 14362306a36Sopenharmony_ci#define FPER(value) ((value) & 0x0fff) /* Bits 0:11 */ 14462306a36Sopenharmony_ci#define FSGM BIT(12) 14562306a36Sopenharmony_ci#define CLKSM BIT(13) 14662306a36Sopenharmony_ci#define CLKSP BIT(14) 14762306a36Sopenharmony_ci#define GSYNC BIT(15) 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci/************************* McBSP MCR1 bit definitions *************************/ 15062306a36Sopenharmony_ci#define RMCM BIT(0) 15162306a36Sopenharmony_ci#define RCBLK(value) (((value) & 0x7) << 2) /* Bits 2:4 */ 15262306a36Sopenharmony_ci#define RPABLK(value) (((value) & 0x3) << 5) /* Bits 5:6 */ 15362306a36Sopenharmony_ci#define RPBBLK(value) (((value) & 0x3) << 7) /* Bits 7:8 */ 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci/************************* McBSP MCR2 bit definitions *************************/ 15662306a36Sopenharmony_ci#define XMCM(value) ((value) & 0x3) /* Bits 0:1 */ 15762306a36Sopenharmony_ci#define XCBLK(value) (((value) & 0x7) << 2) /* Bits 2:4 */ 15862306a36Sopenharmony_ci#define XPABLK(value) (((value) & 0x3) << 5) /* Bits 5:6 */ 15962306a36Sopenharmony_ci#define XPBBLK(value) (((value) & 0x3) << 7) /* Bits 7:8 */ 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci/*********************** McBSP XCCR bit definitions *************************/ 16262306a36Sopenharmony_ci#define XDISABLE BIT(0) 16362306a36Sopenharmony_ci#define XDMAEN BIT(3) 16462306a36Sopenharmony_ci#define DILB BIT(5) 16562306a36Sopenharmony_ci#define XFULL_CYCLE BIT(11) 16662306a36Sopenharmony_ci#define DXENDLY(value) (((value) & 0x3) << 12) /* Bits 12:13 */ 16762306a36Sopenharmony_ci#define PPCONNECT BIT(14) 16862306a36Sopenharmony_ci#define EXTCLKGATE BIT(15) 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci/********************** McBSP RCCR bit definitions *************************/ 17162306a36Sopenharmony_ci#define RDISABLE BIT(0) 17262306a36Sopenharmony_ci#define RDMAEN BIT(3) 17362306a36Sopenharmony_ci#define RFULL_CYCLE BIT(11) 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci/********************** McBSP SYSCONFIG bit definitions ********************/ 17662306a36Sopenharmony_ci#define SOFTRST BIT(1) 17762306a36Sopenharmony_ci#define ENAWAKEUP BIT(2) 17862306a36Sopenharmony_ci#define SIDLEMODE(value) (((value) & 0x3) << 3) 17962306a36Sopenharmony_ci#define CLOCKACTIVITY(value) (((value) & 0x3) << 8) 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci/********************** McBSP DMA operating modes **************************/ 18262306a36Sopenharmony_ci#define MCBSP_DMA_MODE_ELEMENT 0 18362306a36Sopenharmony_ci#define MCBSP_DMA_MODE_THRESHOLD 1 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci/********************** McBSP WAKEUPEN/IRQST/IRQEN bit definitions *********/ 18662306a36Sopenharmony_ci#define RSYNCERREN BIT(0) 18762306a36Sopenharmony_ci#define RFSREN BIT(1) 18862306a36Sopenharmony_ci#define REOFEN BIT(2) 18962306a36Sopenharmony_ci#define RRDYEN BIT(3) 19062306a36Sopenharmony_ci#define RUNDFLEN BIT(4) 19162306a36Sopenharmony_ci#define ROVFLEN BIT(5) 19262306a36Sopenharmony_ci#define XSYNCERREN BIT(7) 19362306a36Sopenharmony_ci#define XFSXEN BIT(8) 19462306a36Sopenharmony_ci#define XEOFEN BIT(9) 19562306a36Sopenharmony_ci#define XRDYEN BIT(10) 19662306a36Sopenharmony_ci#define XUNDFLEN BIT(11) 19762306a36Sopenharmony_ci#define XOVFLEN BIT(12) 19862306a36Sopenharmony_ci#define XEMPTYEOFEN BIT(14) 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci/* Clock signal muxing options */ 20162306a36Sopenharmony_ci#define CLKR_SRC_CLKR 0 /* CLKR signal is from the CLKR pin */ 20262306a36Sopenharmony_ci#define CLKR_SRC_CLKX 1 /* CLKR signal is from the CLKX pin */ 20362306a36Sopenharmony_ci#define FSR_SRC_FSR 2 /* FSR signal is from the FSR pin */ 20462306a36Sopenharmony_ci#define FSR_SRC_FSX 3 /* FSR signal is from the FSX pin */ 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci/* McBSP functional clock sources */ 20762306a36Sopenharmony_ci#define MCBSP_CLKS_PRCM_SRC 0 20862306a36Sopenharmony_ci#define MCBSP_CLKS_PAD_SRC 1 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci/* we don't do multichannel for now */ 21162306a36Sopenharmony_cistruct omap_mcbsp_reg_cfg { 21262306a36Sopenharmony_ci u16 spcr2; 21362306a36Sopenharmony_ci u16 spcr1; 21462306a36Sopenharmony_ci u16 rcr2; 21562306a36Sopenharmony_ci u16 rcr1; 21662306a36Sopenharmony_ci u16 xcr2; 21762306a36Sopenharmony_ci u16 xcr1; 21862306a36Sopenharmony_ci u16 srgr2; 21962306a36Sopenharmony_ci u16 srgr1; 22062306a36Sopenharmony_ci u16 mcr2; 22162306a36Sopenharmony_ci u16 mcr1; 22262306a36Sopenharmony_ci u16 pcr0; 22362306a36Sopenharmony_ci u16 rcerc; 22462306a36Sopenharmony_ci u16 rcerd; 22562306a36Sopenharmony_ci u16 xcerc; 22662306a36Sopenharmony_ci u16 xcerd; 22762306a36Sopenharmony_ci u16 rcere; 22862306a36Sopenharmony_ci u16 rcerf; 22962306a36Sopenharmony_ci u16 xcere; 23062306a36Sopenharmony_ci u16 xcerf; 23162306a36Sopenharmony_ci u16 rcerg; 23262306a36Sopenharmony_ci u16 rcerh; 23362306a36Sopenharmony_ci u16 xcerg; 23462306a36Sopenharmony_ci u16 xcerh; 23562306a36Sopenharmony_ci u16 xccr; 23662306a36Sopenharmony_ci u16 rccr; 23762306a36Sopenharmony_ci}; 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_cistruct omap_mcbsp_st_data; 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_cistruct omap_mcbsp { 24262306a36Sopenharmony_ci struct device *dev; 24362306a36Sopenharmony_ci struct clk *fclk; 24462306a36Sopenharmony_ci spinlock_t lock; 24562306a36Sopenharmony_ci unsigned long phys_base; 24662306a36Sopenharmony_ci unsigned long phys_dma_base; 24762306a36Sopenharmony_ci void __iomem *io_base; 24862306a36Sopenharmony_ci u8 id; 24962306a36Sopenharmony_ci /* 25062306a36Sopenharmony_ci * Flags indicating is the bus already activated and configured by 25162306a36Sopenharmony_ci * another substream 25262306a36Sopenharmony_ci */ 25362306a36Sopenharmony_ci int active; 25462306a36Sopenharmony_ci int configured; 25562306a36Sopenharmony_ci u8 free; 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci int irq; 25862306a36Sopenharmony_ci int rx_irq; 25962306a36Sopenharmony_ci int tx_irq; 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci /* Protect the field .free, while checking if the mcbsp is in use */ 26262306a36Sopenharmony_ci struct omap_mcbsp_platform_data *pdata; 26362306a36Sopenharmony_ci struct omap_mcbsp_st_data *st_data; 26462306a36Sopenharmony_ci struct omap_mcbsp_reg_cfg cfg_regs; 26562306a36Sopenharmony_ci struct snd_dmaengine_dai_dma_data dma_data[2]; 26662306a36Sopenharmony_ci unsigned int dma_req[2]; 26762306a36Sopenharmony_ci int dma_op_mode; 26862306a36Sopenharmony_ci u16 max_tx_thres; 26962306a36Sopenharmony_ci u16 max_rx_thres; 27062306a36Sopenharmony_ci void *reg_cache; 27162306a36Sopenharmony_ci int reg_cache_size; 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci unsigned int fmt; 27462306a36Sopenharmony_ci unsigned int in_freq; 27562306a36Sopenharmony_ci unsigned int latency[2]; 27662306a36Sopenharmony_ci int clk_div; 27762306a36Sopenharmony_ci int wlen; 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci struct pm_qos_request pm_qos_req; 28062306a36Sopenharmony_ci}; 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_cistatic inline void omap_mcbsp_write(struct omap_mcbsp *mcbsp, u16 reg, u32 val) 28362306a36Sopenharmony_ci{ 28462306a36Sopenharmony_ci void __iomem *addr = mcbsp->io_base + reg * mcbsp->pdata->reg_step; 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci if (mcbsp->pdata->reg_size == 2) { 28762306a36Sopenharmony_ci ((u16 *)mcbsp->reg_cache)[reg] = (u16)val; 28862306a36Sopenharmony_ci writew_relaxed((u16)val, addr); 28962306a36Sopenharmony_ci } else { 29062306a36Sopenharmony_ci ((u32 *)mcbsp->reg_cache)[reg] = val; 29162306a36Sopenharmony_ci writel_relaxed(val, addr); 29262306a36Sopenharmony_ci } 29362306a36Sopenharmony_ci} 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_cistatic inline int omap_mcbsp_read(struct omap_mcbsp *mcbsp, u16 reg, 29662306a36Sopenharmony_ci bool from_cache) 29762306a36Sopenharmony_ci{ 29862306a36Sopenharmony_ci void __iomem *addr = mcbsp->io_base + reg * mcbsp->pdata->reg_step; 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ci if (mcbsp->pdata->reg_size == 2) { 30162306a36Sopenharmony_ci return !from_cache ? readw_relaxed(addr) : 30262306a36Sopenharmony_ci ((u16 *)mcbsp->reg_cache)[reg]; 30362306a36Sopenharmony_ci } else { 30462306a36Sopenharmony_ci return !from_cache ? readl_relaxed(addr) : 30562306a36Sopenharmony_ci ((u32 *)mcbsp->reg_cache)[reg]; 30662306a36Sopenharmony_ci } 30762306a36Sopenharmony_ci} 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci#define MCBSP_READ(mcbsp, reg) \ 31062306a36Sopenharmony_ci omap_mcbsp_read(mcbsp, OMAP_MCBSP_REG_##reg, 0) 31162306a36Sopenharmony_ci#define MCBSP_WRITE(mcbsp, reg, val) \ 31262306a36Sopenharmony_ci omap_mcbsp_write(mcbsp, OMAP_MCBSP_REG_##reg, val) 31362306a36Sopenharmony_ci#define MCBSP_READ_CACHE(mcbsp, reg) \ 31462306a36Sopenharmony_ci omap_mcbsp_read(mcbsp, OMAP_MCBSP_REG_##reg, 1) 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci/* Sidetone specific API */ 31862306a36Sopenharmony_ciint omap_mcbsp_st_init(struct platform_device *pdev); 31962306a36Sopenharmony_ciint omap_mcbsp_st_start(struct omap_mcbsp *mcbsp); 32062306a36Sopenharmony_ciint omap_mcbsp_st_stop(struct omap_mcbsp *mcbsp); 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_ci#endif /* __OMAP_MCBSP_PRIV_H__ */ 323