From 9fef4ae190f7279a55e72e554361e56154ed01de Mon Sep 17 00:00:00 2001 From: Eduardo Valentin Date: Fri, 18 Apr 2008 04:00:48 -0400 Subject: [PATCH] Update audio driver for H2 board This patch updates the audio driver based on tsc2101 chip for H2 board. tsc2101 driver was updated against new spi framework, but its audio driver for H2 wasn't. Signed-off-by: Eduardo Valentin Signed-off-by: Tony Lindgren --- arch/arm/mach-omap1/board-h2.c | 71 ++++++++++++------------ sound/arm/omap/omap-alsa-tsc2101-mixer.c | 7 ++- sound/arm/omap/omap-alsa-tsc2101-mixer.h | 2 + sound/arm/omap/omap-alsa-tsc2101.c | 28 ++++++++-- sound/arm/omap/omap-alsa-tsc2101.h | 5 ++ 5 files changed, 70 insertions(+), 43 deletions(-) diff --git a/arch/arm/mach-omap1/board-h2.c b/arch/arm/mach-omap1/board-h2.c index aa1f8af57c5..4f8e6da78f8 100644 --- a/arch/arm/mach-omap1/board-h2.c +++ b/arch/arm/mach-omap1/board-h2.c @@ -320,6 +320,40 @@ static void h2_lcd_dev_init(struct spi_device *tsc2101) platform_device_register(&h2_lcd_device); } +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(1), + .rcr1 = RFRLEN1(OMAP_MCBSP_WORD_8) | RWDLEN1(OMAP_MCBSP_WORD_16), + .xcr2 = XPHASE | XFRLEN2(OMAP_MCBSP_WORD_8) | + XWDLEN2(OMAP_MCBSP_WORD_16) | XDATDLY(1) | XFIG, + .xcr1 = XFRLEN1(OMAP_MCBSP_WORD_8) | XWDLEN1(OMAP_MCBSP_WORD_16), + .srgr1 = FWID(15), + .srgr2 = GSYNC | CLKSP | FSGM | FPER(31), + .pcr0 = CLKXM | CLKRM | FSXP | FSRP | CLKXP | CLKRP, + /*.pcr0 = CLKXP | CLKRP,*/ /* mcbsp: slave */ +}; + +static struct omap_alsa_codec_config alsa_config = { + .name = "H2 TSC2101", + .mcbsp_regs_alsa = &mcbsp_regs, +}; + +static struct platform_device h2_mcbsp1_device = { + .name = "omap_alsa_mcbsp", + .id = 1, + .dev = { + .platform_data = &alsa_config, + }, +}; + +static void h2_audio_dev_init(struct spi_device *tsc2101) +{ + h2_mcbsp1_device.dev.platform_data = tsc2101; + platform_device_register(&h2_mcbsp1_device); +} + static int h2_tsc2101_init(struct spi_device *spi) { int r; @@ -344,6 +378,7 @@ static int h2_tsc2101_init(struct spi_device *spi) omap_cfg_reg(N15_1610_UWIRE_CS1); h2_lcd_dev_init(spi); + h2_audio_dev_init(spi); return 0; err: @@ -386,48 +421,12 @@ static struct spi_board_info h2_spi_board_info[] __initdata = { }, }; -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(1), - .rcr1 = RFRLEN1(OMAP_MCBSP_WORD_8) | RWDLEN1(OMAP_MCBSP_WORD_16), - .xcr2 = XPHASE | XFRLEN2(OMAP_MCBSP_WORD_8) | - XWDLEN2(OMAP_MCBSP_WORD_16) | XDATDLY(1) | XFIG, - .xcr1 = XFRLEN1(OMAP_MCBSP_WORD_8) | XWDLEN1(OMAP_MCBSP_WORD_16), - .srgr1 = FWID(15), - .srgr2 = GSYNC | CLKSP | FSGM | FPER(31), - - .pcr0 = CLKXM | CLKRM | FSXP | FSRP | CLKXP | CLKRP, - /*.pcr0 = CLKXP | CLKRP,*/ /* mcbsp: slave */ -}; - -static struct omap_alsa_codec_config alsa_config = { - .name = "H2 TSC2101", - .mcbsp_regs_alsa = &mcbsp_regs, - .codec_configure_dev = NULL, /* tsc2101_configure, */ - .codec_set_samplerate = NULL, /* tsc2101_set_samplerate, */ - .codec_clock_setup = NULL, /* tsc2101_clock_setup, */ - .codec_clock_on = NULL, /* tsc2101_clock_on, */ - .codec_clock_off = NULL, /* tsc2101_clock_off, */ - .get_default_samplerate = NULL, /* tsc2101_get_default_samplerate, */ -}; - -static struct platform_device h2_mcbsp1_device = { - .name = "omap_alsa_mcbsp", - .id = 1, - .dev = { - .platform_data = &alsa_config, - }, -}; - static struct platform_device *h2_devices[] __initdata = { &h2_nor_device, &h2_nand_device, &h2_smc91x_device, &h2_irda_device, &h2_kp_device, - &h2_mcbsp1_device, }; static void __init h2_init_smc91x(void) diff --git a/sound/arm/omap/omap-alsa-tsc2101-mixer.c b/sound/arm/omap/omap-alsa-tsc2101-mixer.c index 8faba957352..09257d7e614 100644 --- a/sound/arm/omap/omap-alsa-tsc2101-mixer.c +++ b/sound/arm/omap/omap-alsa-tsc2101-mixer.c @@ -43,6 +43,7 @@ #include "omap-alsa-tsc2101.h" #include "omap-alsa-tsc2101-mixer.h" +#include #include #include #include @@ -68,7 +69,8 @@ static int current_rec_src = REC_SRC_SINGLE_ENDED_MICIN_HED; */ inline void omap_tsc2101_audio_write(u8 address, u16 data) { - omap_tsc2101_write(PAGE2_AUDIO_CODEC_REGISTERS, address, data); + tsc2101_write_sync(mcbsp_dev.tsc2101_dev, PAGE2_AUDIO_CODEC_REGISTERS, + address, data); } /* @@ -76,7 +78,8 @@ inline void omap_tsc2101_audio_write(u8 address, u16 data) */ inline u16 omap_tsc2101_audio_read(u8 address) { - return (omap_tsc2101_read(PAGE2_AUDIO_CODEC_REGISTERS, address)); + return (tsc2101_read_sync(mcbsp_dev.tsc2101_dev, + PAGE2_AUDIO_CODEC_REGISTERS, address)); } /* diff --git a/sound/arm/omap/omap-alsa-tsc2101-mixer.h b/sound/arm/omap/omap-alsa-tsc2101-mixer.h index 513614c7b6f..b110b3640f1 100644 --- a/sound/arm/omap/omap-alsa-tsc2101-mixer.h +++ b/sound/arm/omap/omap-alsa-tsc2101-mixer.h @@ -76,4 +76,6 @@ #define TSC2101_AUDIO_CODEC_REGISTERS_PAGE2 (2) +extern struct mcbsp_dev_info mcbsp_dev; + #endif /*OMAPALSATSC2101MIXER_H_*/ diff --git a/sound/arm/omap/omap-alsa-tsc2101.c b/sound/arm/omap/omap-alsa-tsc2101.c index 88ed04654f5..1d8adc1e69f 100644 --- a/sound/arm/omap/omap-alsa-tsc2101.c +++ b/sound/arm/omap/omap-alsa-tsc2101.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -38,6 +39,8 @@ #include #include "omap-alsa-tsc2101.h" +struct mcbsp_dev_info mcbsp_dev; + static struct clk *tsc2101_mclk = 0; //#define DUMP_TSC2101_AUDIO_REGISTERS @@ -143,7 +146,8 @@ static struct snd_pcm_hardware tsc2101_snd_omap_alsa_capture = { */ inline void tsc2101_audio_write(u8 address, u16 data) { - omap_tsc2101_write(PAGE2_AUDIO_CODEC_REGISTERS, address, data); + tsc2101_write_sync(mcbsp_dev.tsc2101_dev, PAGE2_AUDIO_CODEC_REGISTERS, + address, data); } /* @@ -151,7 +155,8 @@ inline void tsc2101_audio_write(u8 address, u16 data) */ inline u16 tsc2101_audio_read(u8 address) { - return (omap_tsc2101_read(PAGE2_AUDIO_CODEC_REGISTERS, address)); + return (tsc2101_read_sync(mcbsp_dev.tsc2101_dev, + PAGE2_AUDIO_CODEC_REGISTERS, address)); } #ifdef DUMP_TSC2101_AUDIO_REGISTERS @@ -341,9 +346,9 @@ int tsc2101_clock_on(void) err); // Now turn the audio on - omap_tsc2101_write(PAGE2_AUDIO_CODEC_REGISTERS, - TSC2101_CODEC_POWER_CTRL, - 0x0000); + tsc2101_write_sync(mcbsp_dev.tsc2101_dev, PAGE2_AUDIO_CODEC_REGISTERS, + TSC2101_CODEC_POWER_CTRL, + 0x0000); return 0; } @@ -382,9 +387,22 @@ int tsc2101_get_default_samplerate(void) static int __devinit snd_omap_alsa_tsc2101_probe(struct platform_device *pdev) { + struct spi_device *tsc2101; int ret; struct omap_alsa_codec_config *codec_cfg; + tsc2101 = dev_get_drvdata(&pdev->dev); + if (tsc2101 == NULL) { + dev_err(&pdev->dev, "no platform data\n"); + return -ENODEV; + } + if (strncmp(tsc2101->modalias, "tsc2101", 8) != 0) { + dev_err(&pdev->dev, "tsc2101 not found\n"); + return -EINVAL; + } + mcbsp_dev.mcbsp_dev = pdev; + mcbsp_dev.tsc2101_dev = tsc2101; + codec_cfg = pdev->dev.platform_data; if (codec_cfg != NULL) { codec_cfg->hw_constraints_rates = &tsc2101_hw_constraints_rates; diff --git a/sound/arm/omap/omap-alsa-tsc2101.h b/sound/arm/omap/omap-alsa-tsc2101.h index 85dccbb8242..73999a072a6 100644 --- a/sound/arm/omap/omap-alsa-tsc2101.h +++ b/sound/arm/omap/omap-alsa-tsc2101.h @@ -42,6 +42,11 @@ #define PAGE2_AUDIO_CODEC_REGISTERS (2) +struct mcbsp_dev_info { + struct platform_device *mcbsp_dev; + struct spi_device *tsc2101_dev; +}; + struct tsc2101_samplerate_reg_info { u16 sample_rate; u8 divisor; -- 2.41.3