| OLD | NEW |
| 1 /* sound/soc/s3c24xx/s3c-pcm.c | 1 /* sound/soc/samsung/pcm.c |
| 2 * | 2 * |
| 3 * ALSA SoC Audio Layer - S3C PCM-Controller driver | 3 * ALSA SoC Audio Layer - S3C PCM-Controller driver |
| 4 * | 4 * |
| 5 * Copyright (c) 2009 Samsung Electronics Co. Ltd | 5 * Copyright (c) 2009 Samsung Electronics Co. Ltd |
| 6 * Author: Jaswinder Singh <jassi.brar@samsung.com> | 6 * Author: Jaswinder Singh <jassi.brar@samsung.com> |
| 7 * based upon I2S drivers by Ben Dooks. | 7 * based upon I2S drivers by Ben Dooks. |
| 8 * | 8 * |
| 9 * This program is free software; you can redistribute it and/or modify | 9 * This program is free software; you can redistribute it and/or modify |
| 10 * it under the terms of the GNU General Public License version 2 as | 10 * it under the terms of the GNU General Public License version 2 as |
| 11 * published by the Free Software Foundation. | 11 * published by the Free Software Foundation. |
| 12 */ | 12 */ |
| 13 | 13 |
| 14 #include <linux/init.h> | |
| 15 #include <linux/module.h> | |
| 16 #include <linux/device.h> | |
| 17 #include <linux/delay.h> | |
| 18 #include <linux/clk.h> | 14 #include <linux/clk.h> |
| 19 #include <linux/kernel.h> | |
| 20 #include <linux/gpio.h> | |
| 21 #include <linux/io.h> | 15 #include <linux/io.h> |
| 22 | 16 |
| 23 #include <sound/core.h> | 17 #include <sound/soc.h> |
| 24 #include <sound/pcm.h> | |
| 25 #include <sound/pcm_params.h> | 18 #include <sound/pcm_params.h> |
| 26 #include <sound/initval.h> | |
| 27 #include <sound/soc.h> | |
| 28 | 19 |
| 29 #include <plat/audio.h> | 20 #include <plat/audio.h> |
| 30 #include <plat/dma.h> | 21 #include <plat/dma.h> |
| 31 | 22 |
| 32 #include "s3c-dma.h" | 23 #include "dma.h" |
| 33 #include "s3c-pcm.h" | 24 #include "pcm.h" |
| 25 |
| 26 /*Register Offsets */ |
| 27 #define S3C_PCM_CTL» » 0x00 |
| 28 #define S3C_PCM_CLKCTL» » 0x04 |
| 29 #define S3C_PCM_TXFIFO» » 0x08 |
| 30 #define S3C_PCM_RXFIFO» » 0x0C |
| 31 #define S3C_PCM_IRQCTL» » 0x10 |
| 32 #define S3C_PCM_IRQSTAT»» 0x14 |
| 33 #define S3C_PCM_FIFOSTAT» 0x18 |
| 34 #define S3C_PCM_CLRINT» » 0x20 |
| 35 |
| 36 /* PCM_CTL Bit-Fields */ |
| 37 #define S3C_PCM_CTL_TXDIPSTICK_MASK» 0x3f |
| 38 #define S3C_PCM_CTL_TXDIPSTICK_SHIFT» 13 |
| 39 #define S3C_PCM_CTL_RXDIPSTICK_MASK» 0x3f |
| 40 #define S3C_PCM_CTL_RXDIPSTICK_SHIFT» 7 |
| 41 #define S3C_PCM_CTL_TXDMA_EN» » (0x1 << 6) |
| 42 #define S3C_PCM_CTL_RXDMA_EN» » (0x1 << 5) |
| 43 #define S3C_PCM_CTL_TXMSB_AFTER_FSYNC» (0x1 << 4) |
| 44 #define S3C_PCM_CTL_RXMSB_AFTER_FSYNC» (0x1 << 3) |
| 45 #define S3C_PCM_CTL_TXFIFO_EN» » (0x1 << 2) |
| 46 #define S3C_PCM_CTL_RXFIFO_EN» » (0x1 << 1) |
| 47 #define S3C_PCM_CTL_ENABLE» » (0x1 << 0) |
| 48 |
| 49 /* PCM_CLKCTL Bit-Fields */ |
| 50 #define S3C_PCM_CLKCTL_SERCLK_EN» (0x1 << 19) |
| 51 #define S3C_PCM_CLKCTL_SERCLKSEL_PCLK» (0x1 << 18) |
| 52 #define S3C_PCM_CLKCTL_SCLKDIV_MASK» 0x1ff |
| 53 #define S3C_PCM_CLKCTL_SYNCDIV_MASK» 0x1ff |
| 54 #define S3C_PCM_CLKCTL_SCLKDIV_SHIFT» 9 |
| 55 #define S3C_PCM_CLKCTL_SYNCDIV_SHIFT» 0 |
| 56 |
| 57 /* PCM_TXFIFO Bit-Fields */ |
| 58 #define S3C_PCM_TXFIFO_DVALID» (0x1 << 16) |
| 59 #define S3C_PCM_TXFIFO_DATA_MSK»(0xffff << 0) |
| 60 |
| 61 /* PCM_RXFIFO Bit-Fields */ |
| 62 #define S3C_PCM_RXFIFO_DVALID» (0x1 << 16) |
| 63 #define S3C_PCM_RXFIFO_DATA_MSK»(0xffff << 0) |
| 64 |
| 65 /* PCM_IRQCTL Bit-Fields */ |
| 66 #define S3C_PCM_IRQCTL_IRQEN» » (0x1 << 14) |
| 67 #define S3C_PCM_IRQCTL_WRDEN» » (0x1 << 12) |
| 68 #define S3C_PCM_IRQCTL_TXEMPTYEN» (0x1 << 11) |
| 69 #define S3C_PCM_IRQCTL_TXALMSTEMPTYEN» (0x1 << 10) |
| 70 #define S3C_PCM_IRQCTL_TXFULLEN»» (0x1 << 9) |
| 71 #define S3C_PCM_IRQCTL_TXALMSTFULLEN» (0x1 << 8) |
| 72 #define S3C_PCM_IRQCTL_TXSTARVEN» (0x1 << 7) |
| 73 #define S3C_PCM_IRQCTL_TXERROVRFLEN» (0x1 << 6) |
| 74 #define S3C_PCM_IRQCTL_RXEMPTEN»» (0x1 << 5) |
| 75 #define S3C_PCM_IRQCTL_RXALMSTEMPTEN» (0x1 << 4) |
| 76 #define S3C_PCM_IRQCTL_RXFULLEN»» (0x1 << 3) |
| 77 #define S3C_PCM_IRQCTL_RXALMSTFULLEN» (0x1 << 2) |
| 78 #define S3C_PCM_IRQCTL_RXSTARVEN» (0x1 << 1) |
| 79 #define S3C_PCM_IRQCTL_RXERROVRFLEN» (0x1 << 0) |
| 80 |
| 81 /* PCM_IRQSTAT Bit-Fields */ |
| 82 #define S3C_PCM_IRQSTAT_IRQPND» » (0x1 << 13) |
| 83 #define S3C_PCM_IRQSTAT_WRD_XFER» (0x1 << 12) |
| 84 #define S3C_PCM_IRQSTAT_TXEMPTY»» (0x1 << 11) |
| 85 #define S3C_PCM_IRQSTAT_TXALMSTEMPTY» (0x1 << 10) |
| 86 #define S3C_PCM_IRQSTAT_TXFULL» » (0x1 << 9) |
| 87 #define S3C_PCM_IRQSTAT_TXALMSTFULL» (0x1 << 8) |
| 88 #define S3C_PCM_IRQSTAT_TXSTARV»» (0x1 << 7) |
| 89 #define S3C_PCM_IRQSTAT_TXERROVRFL» (0x1 << 6) |
| 90 #define S3C_PCM_IRQSTAT_RXEMPT» » (0x1 << 5) |
| 91 #define S3C_PCM_IRQSTAT_RXALMSTEMPT» (0x1 << 4) |
| 92 #define S3C_PCM_IRQSTAT_RXFULL» » (0x1 << 3) |
| 93 #define S3C_PCM_IRQSTAT_RXALMSTFULL» (0x1 << 2) |
| 94 #define S3C_PCM_IRQSTAT_RXSTARV»» (0x1 << 1) |
| 95 #define S3C_PCM_IRQSTAT_RXERROVRFL» (0x1 << 0) |
| 96 |
| 97 /* PCM_FIFOSTAT Bit-Fields */ |
| 98 #define S3C_PCM_FIFOSTAT_TXCNT_MSK» » (0x3f << 14) |
| 99 #define S3C_PCM_FIFOSTAT_TXFIFOEMPTY» » (0x1 << 13) |
| 100 #define S3C_PCM_FIFOSTAT_TXFIFOALMSTEMPTY» (0x1 << 12) |
| 101 #define S3C_PCM_FIFOSTAT_TXFIFOFULL» » (0x1 << 11) |
| 102 #define S3C_PCM_FIFOSTAT_TXFIFOALMSTFULL» (0x1 << 10) |
| 103 #define S3C_PCM_FIFOSTAT_RXCNT_MSK» » (0x3f << 4) |
| 104 #define S3C_PCM_FIFOSTAT_RXFIFOEMPTY» » (0x1 << 3) |
| 105 #define S3C_PCM_FIFOSTAT_RXFIFOALMSTEMPTY» (0x1 << 2) |
| 106 #define S3C_PCM_FIFOSTAT_RXFIFOFULL» » (0x1 << 1) |
| 107 #define S3C_PCM_FIFOSTAT_RXFIFOALMSTFULL» (0x1 << 0) |
| 108 |
| 109 /** |
| 110 * struct s3c_pcm_info - S3C PCM Controller information |
| 111 * @dev: The parent device passed to use from the probe. |
| 112 * @regs: The pointer to the device register block. |
| 113 * @dma_playback: DMA information for playback channel. |
| 114 * @dma_capture: DMA information for capture channel. |
| 115 */ |
| 116 struct s3c_pcm_info { |
| 117 » spinlock_t lock; |
| 118 » struct device» *dev; |
| 119 » void __iomem» *regs; |
| 120 |
| 121 » unsigned int sclk_per_fs; |
| 122 |
| 123 » /* Whether to keep PCMSCLK enabled even when idle(no active xfer) */ |
| 124 » unsigned int idleclk; |
| 125 |
| 126 » struct clk» *pclk; |
| 127 » struct clk» *cclk; |
| 128 |
| 129 » struct s3c_dma_params» *dma_playback; |
| 130 » struct s3c_dma_params» *dma_capture; |
| 131 }; |
| 34 | 132 |
| 35 static struct s3c2410_dma_client s3c_pcm_dma_client_out = { | 133 static struct s3c2410_dma_client s3c_pcm_dma_client_out = { |
| 36 .name = "PCM Stereo out" | 134 .name = "PCM Stereo out" |
| 37 }; | 135 }; |
| 38 | 136 |
| 39 static struct s3c2410_dma_client s3c_pcm_dma_client_in = { | 137 static struct s3c2410_dma_client s3c_pcm_dma_client_in = { |
| 40 .name = "PCM Stereo in" | 138 .name = "PCM Stereo in" |
| 41 }; | 139 }; |
| 42 | 140 |
| 43 static struct s3c_dma_params s3c_pcm_stereo_out[] = { | 141 static struct s3c_dma_params s3c_pcm_stereo_out[] = { |
| (...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 543 { | 641 { |
| 544 platform_driver_unregister(&s3c_pcm_driver); | 642 platform_driver_unregister(&s3c_pcm_driver); |
| 545 } | 643 } |
| 546 module_exit(s3c_pcm_exit); | 644 module_exit(s3c_pcm_exit); |
| 547 | 645 |
| 548 /* Module information */ | 646 /* Module information */ |
| 549 MODULE_AUTHOR("Jaswinder Singh, <jassi.brar@samsung.com>"); | 647 MODULE_AUTHOR("Jaswinder Singh, <jassi.brar@samsung.com>"); |
| 550 MODULE_DESCRIPTION("S3C PCM Controller Driver"); | 648 MODULE_DESCRIPTION("S3C PCM Controller Driver"); |
| 551 MODULE_LICENSE("GPL"); | 649 MODULE_LICENSE("GPL"); |
| 552 MODULE_ALIAS("platform:samsung-pcm"); | 650 MODULE_ALIAS("platform:samsung-pcm"); |
| OLD | NEW |