void omap2_mcbsp_set_trans_param(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; }
/* * This must be called before _set_clkdiv and _set_sysclk since McBSP register * cache is initialized here */ static int omap_mcbsp_dai_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) { struct omap_mcbsp_data *mcbsp_data = snd_soc_dai_get_drvdata(cpu_dai); struct omap_mcbsp_reg_cfg *regs = &mcbsp_data->regs; bool inv_fs = false; if (mcbsp_data->configured) return 0; mcbsp_data->fmt = fmt; memset(regs, 0, sizeof(*regs)); /* Generic McBSP register settings */ regs->spcr2 |= XINTM(3) | FREE; regs->spcr1 |= RINTM(3); /* RFIG and XFIG are not defined in 34xx */ if (!cpu_is_omap34xx() && !cpu_is_omap44xx()) { regs->rcr2 |= RFIG; regs->xcr2 |= XFIG; } if (cpu_is_omap2430() || cpu_is_omap34xx() || cpu_is_omap44xx()) { regs->xccr = DXENDLY(1) | XDMAEN | XDISABLE; regs->rccr = RFULL_CYCLE | RDMAEN | RDISABLE; } switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { case SND_SOC_DAIFMT_I2S: /* 1-bit data delay */ regs->rcr2 |= RDATDLY(1); regs->xcr2 |= XDATDLY(1); break; case SND_SOC_DAIFMT_LEFT_J: /* 0-bit data delay */ regs->rcr2 |= RDATDLY(0); regs->xcr2 |= XDATDLY(0); regs->spcr1 |= RJUST(2); /* Invert FS polarity configuration */ inv_fs = true; break; case SND_SOC_DAIFMT_DSP_A: /* 1-bit data delay */ regs->rcr2 |= RDATDLY(1); regs->xcr2 |= XDATDLY(1); /* Invert FS polarity configuration */ inv_fs = true; break; case SND_SOC_DAIFMT_DSP_B: /* 0-bit data delay */ regs->rcr2 |= RDATDLY(0); regs->xcr2 |= XDATDLY(0); /* Invert FS polarity configuration */ inv_fs = true; break; default: /* Unsupported data format */ return -EINVAL; } switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBS_CFS: /* McBSP master. Set FS and bit clocks as outputs */ regs->pcr0 |= FSXM | FSRM | CLKXM | CLKRM; /* Sample rate generator drives the FS */ regs->srgr2 |= FSGM; break; case SND_SOC_DAIFMT_CBM_CFM: /* McBSP slave */ break; default: /* Unsupported master/slave configuration */ return -EINVAL; } /* Set bit clock (CLKX/CLKR) and FS polarities */ switch (fmt & SND_SOC_DAIFMT_INV_MASK) { case SND_SOC_DAIFMT_NB_NF: /* * Normal BCLK + FS. * FS active low. TX data driven on falling edge of bit clock * and RX data sampled on rising edge of bit clock. */ regs->pcr0 |= FSXP | FSRP | CLKXP | CLKRP; break; case SND_SOC_DAIFMT_NB_IF: regs->pcr0 |= CLKXP | CLKRP; break; case SND_SOC_DAIFMT_IB_NF: regs->pcr0 |= FSXP | FSRP; break; case SND_SOC_DAIFMT_IB_IF: break; default: return -EINVAL; } if (inv_fs == true) regs->pcr0 ^= FSXP | FSRP; return 0; }
.platform_data = (void *) 2 /* CS2 */, }, .num_resources = ARRAY_SIZE(osk5912_cf_resources), .resource = osk5912_cf_resources, }; #define DEFAULT_BITPERSAMPLE 16 static struct omap_mcbsp_reg_cfg mcbsp_regs = { .spcr2 = FREE | FRST | GRST | XRST | XINTM(3), .spcr1 = RINTM(3) | RRST, .rcr2 = RPHASE | RFRLEN2(OMAP_MCBSP_WORD_8) | RWDLEN2(OMAP_MCBSP_WORD_16) | RDATDLY(0), .rcr1 = RFRLEN1(OMAP_MCBSP_WORD_8) | RWDLEN1(OMAP_MCBSP_WORD_16), .xcr2 = XPHASE | XFRLEN2(OMAP_MCBSP_WORD_8) | XWDLEN2(OMAP_MCBSP_WORD_16) | XDATDLY(0) | XFIG, .xcr1 = XFRLEN1(OMAP_MCBSP_WORD_8) | XWDLEN1(OMAP_MCBSP_WORD_16), .srgr1 = FWID(DEFAULT_BITPERSAMPLE - 1), .srgr2 = GSYNC | CLKSP | FSGM | FPER(DEFAULT_BITPERSAMPLE * 2 - 1), /*.pcr0 = FSXM | FSRM | CLKXM | CLKRM | CLKXP | CLKRP,*/ /* mcbsp: master */ .pcr0 = CLKXP | CLKRP, /* mcbsp: slave */ }; static struct omap_alsa_codec_config alsa_config = { .name = "OSK AIC23", .mcbsp_regs_alsa = &mcbsp_regs, .codec_configure_dev = NULL, /* aic23_configure, */ .codec_set_samplerate = NULL, /* aic23_set_samplerate, */ .codec_clock_setup = NULL, /* aic23_clock_setup, */ .codec_clock_on = NULL, /* aic23_clock_on, */ .codec_clock_off = NULL, /* aic23_clock_off, */
.power_pin = PALMTE_MMC_POWER_GPIO, .switch_pin = PALMTE_MMC_SWITCH_GPIO, }, }; static struct omap_lcd_config palmte_lcd_config __initdata = { .ctrl_name = "internal", }; static struct omap_uart_config palmte_uart_config __initdata = { .enabled_uarts = (1 << 0) | (1 << 1) | (0 << 2), }; static struct omap_mcbsp_reg_cfg palmte_mcbsp1_regs = { .spcr2 = FRST | GRST | XRST | XINTM(3), .xcr2 = XDATDLY(1) | XFIG, .xcr1 = XWDLEN1(OMAP_MCBSP_WORD_32), .pcr0 = SCLKME | FSXP | CLKXP, }; static struct omap_alsa_codec_config palmte_alsa_config = { .name = "TSC2102 audio", .mcbsp_regs_alsa = &palmte_mcbsp1_regs, .codec_configure_dev = NULL, /* tsc2102_configure, */ .codec_set_samplerate = NULL, /* tsc2102_set_samplerate, */ .codec_clock_setup = NULL, /* tsc2102_clock_setup, */ .codec_clock_on = NULL, /* tsc2102_clock_on, */ .codec_clock_off = NULL, /* tsc2102_clock_off, */ .get_default_samplerate = NULL, /* tsc2102_get_default_samplerate, */ };
/* * This must be called before _set_clkdiv and _set_sysclk since McBSP register * cache is initialized here */ static int omap_mcbsp_dai_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt) { struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data); struct omap_mcbsp_reg_cfg *regs = &mcbsp_data->regs; unsigned int temp_fmt = fmt; if (mcbsp_data->configured) return 0; mcbsp_data->fmt = fmt; memset(regs, 0, sizeof(*regs)); /* Generic McBSP register settings */ regs->spcr2 |= XINTM(3) | FREE; regs->spcr1 |= RINTM(3); regs->rcr2 |= RFIG; regs->xcr2 |= XFIG; if (cpu_is_omap2430() || cpu_is_omap34xx()) { regs->xccr = DXENDLY(1); regs->rccr = RFULL_CYCLE; } switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { case SND_SOC_DAIFMT_I2S: case SND_SOC_DAIFMT_I2S_1PHASE: /* 1-bit data delay */ regs->rcr2 |= RDATDLY(1); regs->xcr2 |= XDATDLY(1); break; case SND_SOC_DAIFMT_DSP_A: case SND_SOC_DAIFMT_DSP_A_1PHASE: /* 1-bit data delay */ regs->rcr2 |= RDATDLY(1); regs->xcr2 |= XDATDLY(1); /* Invert FS polarity configuration */ temp_fmt ^= SND_SOC_DAIFMT_NB_IF; break; case SND_SOC_DAIFMT_DSP_B: /* 0-bit data delay */ regs->rcr2 |= RDATDLY(0); regs->xcr2 |= XDATDLY(0); /* Invert FS polarity configuration */ temp_fmt ^= SND_SOC_DAIFMT_NB_IF; break; case SND_SOC_DAIFMT_SPDIF: /* The recording has to work even if the output is in SPDIF mode, so receive in DSP-A mode */ /* 1-bit data delay */ regs->rcr2 |= RDATDLY(1); /* 0-bit data delay */ regs->xcr2 |= XDATDLY(0); /* LSB First */ regs->xcr2 |= XCOMPAND(1); break; default: /* Unsupported data format */ return -EINVAL; } switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { case SND_SOC_DAIFMT_CBS_CFS: /* McBSP master. Set FS and bit clocks as outputs */ regs->pcr0 |= FSXM | FSRM | CLKXM | CLKRM; /* Sample rate generator drives the FS */ regs->srgr2 |= FSGM; break; case SND_SOC_DAIFMT_CBM_CFM: /* McBSP slave */ break; default: /* Unsupported master/slave configuration */ return -EINVAL; } /* Set bit clock (CLKX/CLKR) and FS polarities */ switch (temp_fmt & SND_SOC_DAIFMT_INV_MASK) { case SND_SOC_DAIFMT_NB_NF: /* * Normal BCLK + FS. * FS active low. TX data driven on falling edge of bit clock * and RX data sampled on rising edge of bit clock. */ regs->pcr0 |= FSXP | FSRP | CLKXP | CLKRP; break; case SND_SOC_DAIFMT_NB_IF: regs->pcr0 |= CLKXP | CLKRP; break; case SND_SOC_DAIFMT_IB_NF: regs->pcr0 |= FSXP | FSRP; break; case SND_SOC_DAIFMT_IB_IF: break; default: return -EINVAL; } return 0; }
{44100, 44100, 1, 0x00}, {32000, 48000, 1.5, 0x11}, {24000, 96000, 4, 0x66}, {22050, 44100, 2, 0x22}, {16000, 48000, 3, 0x44}, {12000, 48000, 4, 0x66}, {11025, 44100, 4, 0x66}, {8000, 48000, 6, 0xAA}, }; static struct davinci_mcbsp_reg_cfg initial_config = { .spcr2 = FREE | XINTM(3), .spcr1 = RINTM(3), .rcr2 = RWDLEN2(DAVINCI_MCBSP_WORD_16) | RDATDLY(1), .rcr1 = RFRLEN1(1) | RWDLEN1(DAVINCI_MCBSP_WORD_16), .xcr2 = XWDLEN2(DAVINCI_MCBSP_WORD_16) | XDATDLY(1) | XFIG, .xcr1 = XFRLEN1(1) | XWDLEN1(DAVINCI_MCBSP_WORD_16), .srgr1 = FWID(DEFAULT_BITPERSAMPLE - 1), .srgr2 = FSGM | FPER(DEFAULT_BITPERSAMPLE * 2 - 1), #ifndef AIC33_MASTER /* configure McBSP to be the I2S master */ .pcr0 = FSXM | FSRM | CLKXM | CLKRM | CLKXP | CLKRP, #else /* configure McBSP to be the I2S slave */ .pcr0 = CLKXP | CLKRP, #endif /* AIC33_MASTER */ }; static void davinci_aic33_initialize(void *dummy); static void davinci_aic33_shutdown(void *dummy); static int davinci_aic33_ioctl(struct inode *inode, struct file *file,