McBSP support for 34XX
Subsystems (3)
PATCH 4/4 McBSP support for 34XX
Signed-off-by chandra shekhar <[email protected]>
--- arch/arm/mach-omap2/mcbsp.c | 187 ++++++++++++++++++++++++++++++++++++++ include/asm-arm/arch-omap/mcbsp.h | 79 ++++++++++++++++ 2 files changed, 266 insertions(+)
arch/arm/mach-omap2/mcbsp.c +187 -0
@@ -24,6 +24,7 @@#include <asm/arch/cpu.h> #include <asm/arch/mcbsp.h> +struct omap_mcbsp_reg_cfg mcbsp_cfg = {0 };struct mcbsp_internal_clk {struct clk clk;struct clk **childs;
@@ -217,6 +218,192 @@if (mcbsp_dma_tx->tx_callback !=NULL ) mcbsp_dma_tx->tx_callback (ch_status, mcbsp_dma_tx->tx_cb_arg); } + +/* +* Set McBSP recv parameters +* id : McBSP interface ID +* mcbsp_cfg : McBSP register configuration +* rp : McBSP recv parameters +*/ +void omap2_mcbsp_set_recv_param (unsigned int id, +struct omap_mcbsp_reg_cfg *mcbsp_cfg, +struct omap_mcbsp_cfg_param *rp) +{ +u32 io_base; + io_base = mcbsp[id].io_base; + + mcbsp_cfg->spcr1 =RJUST (rp->justification); + mcbsp_cfg->rcr2 =RCOMPAND (rp->reverse_compand) | +RDATDLY (rp->data_delay); +if (rp->phase ==OMAP_MCBSP_FRAME_SINGLEPHASE ) + mcbsp_cfg->rcr2 = mcbsp_cfg->rcr2 & ~(RPHASE ); +else + mcbsp_cfg->rcr2 = mcbsp_cfg->rcr2 | (RPHASE ) | +RWDLEN2 (rp->word_length2) |RFRLEN2 (rp->frame_length2); + mcbsp_cfg->rcr1 =RWDLEN1 (rp->word_length1) | +RFRLEN1 (rp->frame_length1); +if (rp->fsync_src ==OMAP_MCBSP_RXFSYNC_INTERNAL ) + mcbsp_cfg->pcr0 = mcbsp_cfg->pcr0 |FSRM ; +if (rp->clk_mode ==OMAP_MCBSP_CLKRXSRC_INTERNAL ) + mcbsp_cfg->pcr0 = mcbsp_cfg->pcr0 |CLKRM ; +if (rp->clk_polarity ==OMAP_MCBSP_CLKR_POLARITY_RISING ) + mcbsp_cfg->pcr0 = mcbsp_cfg->pcr0 |CLKRP ; +if (rp->fs_polarity ==OMAP_MCBSP_FS_ACTIVE_LOW ) + mcbsp_cfg->pcr0 = mcbsp_cfg->pcr0 |FSRP ; +return ; + +} + +/* +* Set McBSP transmit parameters +* id : McBSP interface ID +* mcbsp_cfg : McBSP register configuration +* tp : McBSP transmit parameters +*/ + +void omap2_mcbsp_set_trans_param (unsigned int id, +struct omap_mcbsp_reg_cfg *mcbsp_cfg, +struct omap_mcbsp_cfg_param *tp) +{ + mcbsp_cfg->xcr2 =XCOMPAND (tp->reverse_compand) | +XDATDLY (tp->data_delay); +if (tp->phase ==OMAP_MCBSP_FRAME_SINGLEPHASE ) + mcbsp_cfg->xcr2 = mcbsp_cfg->xcr2 & ~(XPHASE ); +else + mcbsp_cfg->xcr2 = mcbsp_cfg->xcr2 | (XPHASE ) | +RWDLEN2 (tp->word_length2) |RFRLEN2 (tp->frame_length2); + mcbsp_cfg->xcr1 =XWDLEN1 (tp->word_length1) | +XFRLEN1 (tp->frame_length1); +if (tp->fs_polarity ==OMAP_MCBSP_FS_ACTIVE_LOW ) + mcbsp_cfg->pcr0 = mcbsp_cfg->pcr0 |FSXP ; +if (tp->fsync_src ==OMAP_MCBSP_TXFSYNC_INTERNAL ) + mcbsp_cfg->pcr0 = mcbsp_cfg->pcr0 |FSXM ; +if (tp->clk_mode ==OMAP_MCBSP_CLKTXSRC_INTERNAL ) + mcbsp_cfg->pcr0 = mcbsp_cfg->pcr0 |CLKXM ; +if (tp->clk_polarity ==OMAP_MCBSP_CLKX_POLARITY_FALLING ) + mcbsp_cfg->pcr0 = mcbsp_cfg->pcr0 |CLKXP ; +return ; + +} + +/* +* Set McBSP SRG configuration +* id : McBSP interface ID +* mcbsp_cfg : McBSP register configuration +* interface_mode : Master/Slave +* param : McBSP SRG and FSG configuration +*/ + +void omap2_mcbsp_set_srg_cfg_param (unsigned int id,int interface_mode, +struct omap_mcbsp_reg_cfg *mcbsp_cfg, +struct omap_mcbsp_srg_fsg_cfg *param) +{ +u32 io_base; +u32 clk_rate, clkgdv; + io_base = mcbsp[id].io_base; + + mcbsp[id].interface_mode = interface_mode; + mcbsp_cfg->srgr1 =FWID (param->pulse_width); + +if (interface_mode ==OMAP_MCBSP_MASTER ) { +/* clk_rate = clk_get_rate(omap_mcbsp_clk[id].fck); */ + clk_rate =96000000 ; + clkgdv = clk_rate / (param->sample_rate * + (param->bits_per_sample -1 )); + mcbsp_cfg->srgr1 = mcbsp_cfg->srgr1 |CLKGDV (clkgdv); + } +if (param->dlb) + mcbsp_cfg->spcr1 = mcbsp_cfg->spcr1 & ~(ALB ); + +if (param->sync_mode ==OMAP_MCBSP_SRG_FREERUNNING ) + mcbsp_cfg->spcr2 = mcbsp_cfg->spcr2 |FREE ; + mcbsp_cfg->srgr2 =FPER (param->period)|(param->fsgm?FSGM :0 ); + +switch (param->srg_src) { + +case OMAP_MCBSP_SRGCLKSRC_CLKS : + mcbsp_cfg->pcr0 = mcbsp_cfg->pcr0 & ~(SCLKME ); + mcbsp_cfg->srgr2 = mcbsp_cfg->srgr2 & ~(CLKSM ); +/* +* McBSP master operation at low voltage is only possible if +* CLKSP=0 In Master mode, if client driver tries to configiure +* input clock polarity as falling edge, we force it to Rising +*/ + +if ((param->polarity ==OMAP_MCBSP_CLKS_POLARITY_RISING ) || + (interface_mode ==OMAP_MCBSP_MASTER )) + mcbsp_cfg->srgr2 = mcbsp_cfg->srgr2 & ~(CLKSP ); +else + mcbsp_cfg->srgr2 = mcbsp_cfg->srgr2 | (CLKSP ); +break ; + + +case OMAP_MCBSP_SRGCLKSRC_FCLK : + mcbsp_cfg->pcr0 = mcbsp_cfg->pcr0 & ~(SCLKME ); + mcbsp_cfg->srgr2 = mcbsp_cfg->srgr2 | (CLKSM ); + +break ; + +case OMAP_MCBSP_SRGCLKSRC_CLKR : + mcbsp_cfg->pcr0 = mcbsp_cfg->pcr0 | (SCLKME ); + mcbsp_cfg->srgr2 = mcbsp_cfg->srgr2 & ~(CLKSM ); +if (param->polarity ==OMAP_MCBSP_CLKR_POLARITY_FALLING ) + mcbsp_cfg->pcr0 = mcbsp_cfg->pcr0 & ~(CLKRP ); +else + mcbsp_cfg->pcr0 = mcbsp_cfg->pcr0 | (CLKRP ); + +break ; + +case OMAP_MCBSP_SRGCLKSRC_CLKX : + mcbsp_cfg->pcr0 = mcbsp_cfg->pcr0 | (SCLKME ); + mcbsp_cfg->srgr2 = mcbsp_cfg->srgr2 | (CLKSM ); + +if (param->polarity ==OMAP_MCBSP_CLKX_POLARITY_RISING ) + mcbsp_cfg->pcr0 = mcbsp_cfg->pcr0 & ~(CLKXP ); +else + mcbsp_cfg->pcr0 = mcbsp_cfg->pcr0 | (CLKXP ); +break ; + + } +if (param->sync_mode ==OMAP_MCBSP_SRG_FREERUNNING ) + mcbsp_cfg->srgr2 = mcbsp_cfg->srgr2 & ~(GSYNC ); +else if (param->sync_mode ==OMAP_MCBSP_SRG_RUNNING ) + mcbsp_cfg->srgr2 = mcbsp_cfg->srgr2 | (GSYNC ); + + mcbsp_cfg->xccr =omap_mcbsp_read (io_base,OMAP_MCBSP_REG_XCCR ); +if (param->dlb) + mcbsp_cfg->xccr = mcbsp_cfg->xccr | (DILB ); + mcbsp_cfg->rccr =omap_mcbsp_read (io_base,OMAP_MCBSP_REG_RCCR ); + +return ; +} + +/* +* configure the McBSP registers +* id : McBSP interface ID +* interface_mode : Master/Slave +* rp : McBSP recv parameters +* tp : McBSP transmit parameters +* param : McBSP SRG and FSG configuration +*/ +int omap2_mcbsp_params_cfg (unsigned int id,int interface_mode, +struct omap_mcbsp_cfg_param *rp, +struct omap_mcbsp_cfg_param *tp, +struct omap_mcbsp_srg_fsg_cfg *param) +{ +if (rp) +omap2_mcbsp_set_recv_param (id, &mcbsp_cfg, rp); +if (tp) +omap2_mcbsp_set_trans_param (id, &mcbsp_cfg, tp); +if (param) +omap2_mcbsp_set_srg_cfg_param (id, + interface_mode, &mcbsp_cfg, param); +omap_mcbsp_config (id, &mcbsp_cfg); + +return (0 ); +} +EXPORT_SYMBOL (omap2_mcbsp_params_cfg); +/* * Enable/Disable the sample rate generator * id : McBSP interface ID
include/asm-arm/arch-omap/mcbsp.h +79 -0
89 lines not on this page · raw message