Release 4.7 sound/soc/samsung/s3c24xx-i2s.c
/*
* s3c24xx-i2s.c -- ALSA Soc Audio Layer
*
* (c) 2006 Wolfson Microelectronics PLC.
* Graeme Gregory graeme.gregory@wolfsonmicro.com or linux@wolfsonmicro.com
*
* Copyright 2004-2005 Simtec Electronics
* http://armlinux.simtec.co.uk/
* Ben Dooks <ben@simtec.co.uk>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*/
#include <linux/delay.h>
#include <linux/clk.h>
#include <linux/io.h>
#include <linux/gpio.h>
#include <linux/module.h>
#include <sound/soc.h>
#include <sound/pcm_params.h>
#include <mach/gpio-samsung.h>
#include <plat/gpio-cfg.h>
#include "regs-iis.h"
#include "dma.h"
#include "s3c24xx-i2s.h"
#include <linux/platform_data/asoc-s3c.h>
static struct s3c_dma_params s3c24xx_i2s_pcm_stereo_out = {
.ch_name = "tx",
.dma_size = 2,
};
static struct s3c_dma_params s3c24xx_i2s_pcm_stereo_in = {
.ch_name = "rx",
.dma_size = 2,
};
struct s3c24xx_i2s_info {
void __iomem *regs;
struct clk *iis_clk;
u32 iiscon;
u32 iismod;
u32 iisfcon;
u32 iispsr;
};
static struct s3c24xx_i2s_info s3c24xx_i2s;
static void s3c24xx_snd_txctrl(int on)
{
u32 iisfcon;
u32 iiscon;
u32 iismod;
pr_debug("Entered %s\n", __func__);
iisfcon = readl(s3c24xx_i2s.regs + S3C2410_IISFCON);
iiscon = readl(s3c24xx_i2s.regs + S3C2410_IISCON);
iismod = readl(s3c24xx_i2s.regs + S3C2410_IISMOD);
pr_debug("r: IISCON: %x IISMOD: %x IISFCON: %x\n", iiscon, iismod, iisfcon);
if (on) {
iisfcon |= S3C2410_IISFCON_TXDMA | S3C2410_IISFCON_TXENABLE;
iiscon |= S3C2410_IISCON_TXDMAEN | S3C2410_IISCON_IISEN;
iiscon &= ~S3C2410_IISCON_TXIDLE;
iismod |= S3C2410_IISMOD_TXMODE;
writel(iismod, s3c24xx_i2s.regs + S3C2410_IISMOD);
writel(iisfcon, s3c24xx_i2s.regs + S3C2410_IISFCON);
writel(iiscon, s3c24xx_i2s.regs + S3C2410_IISCON);
} else {
/* note, we have to disable the FIFOs otherwise bad things
* seem to happen when the DMA stops. According to the
* Samsung supplied kernel, this should allow the DMA
* engine and FIFOs to reset. If this isn't allowed, the
* DMA engine will simply freeze randomly.
*/
iisfcon &= ~S3C2410_IISFCON_TXENABLE;
iisfcon &= ~S3C2410_IISFCON_TXDMA;
iiscon |= S3C2410_IISCON_TXIDLE;
iiscon &= ~S3C2410_IISCON_TXDMAEN;
iismod &= ~S3C2410_IISMOD_TXMODE;
writel(iiscon, s3c24xx_i2s.regs + S3C2410_IISCON);
writel(iisfcon, s3c24xx_i2s.regs + S3C2410_IISFCON);
writel(iismod, s3c24xx_i2s.regs + S3C2410_IISMOD);
}
pr_debug("w: IISCON: %x IISMOD: %x IISFCON: %x\n", iiscon, iismod, iisfcon);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
ben dooks | ben dooks | 195 | 97.01% | 1 | 25.00% |
mark brown | mark brown | 5 | 2.49% | 2 | 50.00% |
harvey harrison | harvey harrison | 1 | 0.50% | 1 | 25.00% |
| Total | 201 | 100.00% | 4 | 100.00% |
static void s3c24xx_snd_rxctrl(int on)
{
u32 iisfcon;
u32 iiscon;
u32 iismod;
pr_debug("Entered %s\n", __func__);
iisfcon = readl(s3c24xx_i2s.regs + S3C2410_IISFCON);
iiscon = readl(s3c24xx_i2s.regs + S3C2410_IISCON);
iismod = readl(s3c24xx_i2s.regs + S3C2410_IISMOD);
pr_debug("r: IISCON: %x IISMOD: %x IISFCON: %x\n", iiscon, iismod, iisfcon);
if (on) {
iisfcon |= S3C2410_IISFCON_RXDMA | S3C2410_IISFCON_RXENABLE;
iiscon |= S3C2410_IISCON_RXDMAEN | S3C2410_IISCON_IISEN;
iiscon &= ~S3C2410_IISCON_RXIDLE;
iismod |= S3C2410_IISMOD_RXMODE;
writel(iismod, s3c24xx_i2s.regs + S3C2410_IISMOD);
writel(iisfcon, s3c24xx_i2s.regs + S3C2410_IISFCON);
writel(iiscon, s3c24xx_i2s.regs + S3C2410_IISCON);
} else {
/* note, we have to disable the FIFOs otherwise bad things
* seem to happen when the DMA stops. According to the
* Samsung supplied kernel, this should allow the DMA
* engine and FIFOs to reset. If this isn't allowed, the
* DMA engine will simply freeze randomly.
*/
iisfcon &= ~S3C2410_IISFCON_RXENABLE;
iisfcon &= ~S3C2410_IISFCON_RXDMA;
iiscon |= S3C2410_IISCON_RXIDLE;
iiscon &= ~S3C2410_IISCON_RXDMAEN;
iismod &= ~S3C2410_IISMOD_RXMODE;
writel(iisfcon, s3c24xx_i2s.regs + S3C2410_IISFCON);
writel(iiscon, s3c24xx_i2s.regs + S3C2410_IISCON);
writel(iismod, s3c24xx_i2s.regs + S3C2410_IISMOD);
}
pr_debug("w: IISCON: %x IISMOD: %x IISFCON: %x\n", iiscon, iismod, iisfcon);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
ben dooks | ben dooks | 195 | 97.01% | 1 | 25.00% |
mark brown | mark brown | 5 | 2.49% | 2 | 50.00% |
harvey harrison | harvey harrison | 1 | 0.50% | 1 | 25.00% |
| Total | 201 | 100.00% | 4 | 100.00% |
/*
* Wait for the LR signal to allow synchronisation to the L/R clock
* from the codec. May only be needed for slave mode.
*/
static int s3c24xx_snd_lrsync(void)
{
u32 iiscon;
int timeout = 50; /* 5ms */
pr_debug("Entered %s\n", __func__);
while (1) {
iiscon = readl(s3c24xx_i2s.regs + S3C2410_IISCON);
if (iiscon & S3C2410_IISCON_LRINDEX)
break;
if (!timeout--)
return -ETIMEDOUT;
udelay(100);
}
return 0;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
ben dooks | ben dooks | 53 | 80.30% | 1 | 20.00% |
werner almesberger | werner almesberger | 10 | 15.15% | 1 | 20.00% |
mark brown | mark brown | 1 | 1.52% | 1 | 20.00% |
harvey harrison | harvey harrison | 1 | 1.52% | 1 | 20.00% |
julia lawall | julia lawall | 1 | 1.52% | 1 | 20.00% |
| Total | 66 | 100.00% | 5 | 100.00% |
/*
* Check whether CPU is the master or slave
*/
static inline int s3c24xx_snd_is_clkmaster(void)
{
pr_debug("Entered %s\n", __func__);
return (readl(s3c24xx_i2s.regs + S3C2410_IISMOD) & S3C2410_IISMOD_SLAVE) ? 0:1;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
ben dooks | ben dooks | 32 | 94.12% | 1 | 33.33% |
mark brown | mark brown | 1 | 2.94% | 1 | 33.33% |
harvey harrison | harvey harrison | 1 | 2.94% | 1 | 33.33% |
| Total | 34 | 100.00% | 3 | 100.00% |
/*
* Set S3C24xx I2S DAI format
*/
static int s3c24xx_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
unsigned int fmt)
{
u32 iismod;
pr_debug("Entered %s\n", __func__);
iismod = readl(s3c24xx_i2s.regs + S3C2410_IISMOD);
pr_debug("hw_params r: IISMOD: %x \n", iismod);
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
case SND_SOC_DAIFMT_CBM_CFM:
iismod |= S3C2410_IISMOD_SLAVE;
break;
case SND_SOC_DAIFMT_CBS_CFS:
iismod &= ~S3C2410_IISMOD_SLAVE;
break;
default:
return -EINVAL;
}
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
case SND_SOC_DAIFMT_LEFT_J:
iismod |= S3C2410_IISMOD_MSB;
break;
case SND_SOC_DAIFMT_I2S:
iismod &= ~S3C2410_IISMOD_MSB;
break;
default:
return -EINVAL;
}
writel(iismod, s3c24xx_i2s.regs + S3C2410_IISMOD);
pr_debug("hw_params w: IISMOD: %x \n", iismod);
return 0;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
ben dooks | ben dooks | 107 | 86.29% | 1 | 16.67% |
davide rizzo | davide rizzo | 10 | 8.06% | 1 | 16.67% |
mark brown | mark brown | 5 | 4.03% | 2 | 33.33% |
liam girdwood | liam girdwood | 1 | 0.81% | 1 | 16.67% |
harvey harrison | harvey harrison | 1 | 0.81% | 1 | 16.67% |
| Total | 124 | 100.00% | 6 | 100.00% |
static int s3c24xx_i2s_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai)
{
struct snd_dmaengine_dai_dma_data *dma_data;
u32 iismod;
pr_debug("Entered %s\n", __func__);
dma_data = snd_soc_dai_get_dma_data(dai, substream);
/* Working copies of register */
iismod = readl(s3c24xx_i2s.regs + S3C2410_IISMOD);
pr_debug("hw_params r: IISMOD: %x\n", iismod);
switch (params_width(params)) {
case 8:
iismod &= ~S3C2410_IISMOD_16BIT;
dma_data->addr_width = 1;
break;
case 16:
iismod |= S3C2410_IISMOD_16BIT;
dma_data->addr_width = 2;
break;
default:
return -EINVAL;
}
writel(iismod, s3c24xx_i2s.regs + S3C2410_IISMOD);
pr_debug("hw_params w: IISMOD: %x\n", iismod);
return 0;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
ben dooks | ben dooks | 80 | 62.50% | 1 | 11.11% |
christian pellegrin | christian pellegrin | 20 | 15.62% | 1 | 11.11% |
mark brown | mark brown | 10 | 7.81% | 3 | 33.33% |
daniel mack | daniel mack | 9 | 7.03% | 1 | 11.11% |
vasily khoruzhick | vasily khoruzhick | 5 | 3.91% | 1 | 11.11% |
tushar behera | tushar behera | 3 | 2.34% | 1 | 11.11% |
harvey harrison | harvey harrison | 1 | 0.78% | 1 | 11.11% |
| Total | 128 | 100.00% | 9 | 100.00% |
static int s3c24xx_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
struct snd_soc_dai *dai)
{
int ret = 0;
pr_debug("Entered %s\n", __func__);
switch (cmd) {
case SNDRV_PCM_TRIGGER_START:
case SNDRV_PCM_TRIGGER_RESUME:
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
if (!s3c24xx_snd_is_clkmaster()) {
ret = s3c24xx_snd_lrsync();
if (ret)
goto exit_err;
}
if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
s3c24xx_snd_rxctrl(1);
else
s3c24xx_snd_txctrl(1);
break;
case SNDRV_PCM_TRIGGER_STOP:
case SNDRV_PCM_TRIGGER_SUSPEND:
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
s3c24xx_snd_rxctrl(0);
else
s3c24xx_snd_txctrl(0);
break;
default:
ret = -EINVAL;
break;
}
exit_err:
return ret;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
ben dooks | ben dooks | 120 | 94.49% | 1 | 25.00% |
mark brown | mark brown | 6 | 4.72% | 2 | 50.00% |
harvey harrison | harvey harrison | 1 | 0.79% | 1 | 25.00% |
| Total | 127 | 100.00% | 4 | 100.00% |
/*
* Set S3C24xx Clock source
*/
static int s3c24xx_i2s_set_sysclk(struct snd_soc_dai *cpu_dai,
int clk_id, unsigned int freq, int dir)
{
u32 iismod = readl(s3c24xx_i2s.regs + S3C2410_IISMOD);
pr_debug("Entered %s\n", __func__);
iismod &= ~S3C2440_IISMOD_MPLL;
switch (clk_id) {
case S3C24XX_CLKSRC_PCLK:
break;
case S3C24XX_CLKSRC_MPLL:
iismod |= S3C2440_IISMOD_MPLL;
break;
default:
return -EINVAL;
}
writel(iismod, s3c24xx_i2s.regs + S3C2410_IISMOD);
return 0;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
ben dooks | ben dooks | 79 | 96.34% | 1 | 25.00% |
liam girdwood | liam girdwood | 1 | 1.22% | 1 | 25.00% |
mark brown | mark brown | 1 | 1.22% | 1 | 25.00% |
harvey harrison | harvey harrison | 1 | 1.22% | 1 | 25.00% |
| Total | 82 | 100.00% | 4 | 100.00% |
/*
* Set S3C24xx Clock dividers
*/
static int s3c24xx_i2s_set_clkdiv(struct snd_soc_dai *cpu_dai,
int div_id, int div)
{
u32 reg;
pr_debug("Entered %s\n", __func__);
switch (div_id) {
case S3C24XX_DIV_BCLK:
reg = readl(s3c24xx_i2s.regs + S3C2410_IISMOD) & ~S3C2410_IISMOD_FS_MASK;
writel(reg | div, s3c24xx_i2s.regs + S3C2410_IISMOD);
break;
case S3C24XX_DIV_MCLK:
reg = readl(s3c24xx_i2s.regs + S3C2410_IISMOD) & ~(S3C2410_IISMOD_384FS);
writel(reg | div, s3c24xx_i2s.regs + S3C2410_IISMOD);
break;
case S3C24XX_DIV_PRESCALER:
writel(div, s3c24xx_i2s.regs + S3C2410_IISPSR);
reg = readl(s3c24xx_i2s.regs + S3C2410_IISCON);
writel(reg | S3C2410_IISCON_PSCEN, s3c24xx_i2s.regs + S3C2410_IISCON);
break;
default:
return -EINVAL;
}
return 0;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
ben dooks | ben dooks | 139 | 96.53% | 1 | 20.00% |
matt reimer | matt reimer | 2 | 1.39% | 1 | 20.00% |
harvey harrison | harvey harrison | 1 | 0.69% | 1 | 20.00% |
liam girdwood | liam girdwood | 1 | 0.69% | 1 | 20.00% |
mark brown | mark brown | 1 | 0.69% | 1 | 20.00% |
| Total | 144 | 100.00% | 5 | 100.00% |
/*
* To avoid duplicating clock code, allow machine driver to
* get the clockrate from here.
*/
u32 s3c24xx_i2s_get_clockrate(void)
{
return clk_get_rate(s3c24xx_i2s.iis_clk);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
ben dooks | ben dooks | 15 | 100.00% | 1 | 100.00% |
| Total | 15 | 100.00% | 1 | 100.00% |
EXPORT_SYMBOL_GPL(s3c24xx_i2s_get_clockrate);
static int s3c24xx_i2s_probe(struct snd_soc_dai *dai)
{
pr_debug("Entered %s\n", __func__);
samsung_asoc_init_dma_data(dai, &s3c24xx_i2s_pcm_stereo_out,
&s3c24xx_i2s_pcm_stereo_in);
s3c24xx_i2s.iis_clk = devm_clk_get(dai->dev, "iis");
if (IS_ERR(s3c24xx_i2s.iis_clk)) {
pr_err("failed to get iis_clock\n");
return PTR_ERR(s3c24xx_i2s.iis_clk);
}
clk_prepare_enable(s3c24xx_i2s.iis_clk);
/* Configure the I2S pins (GPE0...GPE4) in correct mode */
s3c_gpio_cfgall_range(S3C2410_GPE(0), 5, S3C_GPIO_SFN(2),
S3C_GPIO_PULL_NONE);
writel(S3C2410_IISCON_IISEN, s3c24xx_i2s.regs + S3C2410_IISCON);
s3c24xx_snd_txctrl(0);
s3c24xx_snd_rxctrl(0);
return 0;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
ben dooks | ben dooks | 81 | 70.43% | 1 | 9.09% |
axel lin | axel lin | 9 | 7.83% | 1 | 9.09% |
vasily khoruzhick | vasily khoruzhick | 9 | 7.83% | 2 | 18.18% |
sylwester nawrocki | sylwester nawrocki | 9 | 7.83% | 1 | 9.09% |
mark brown | mark brown | 4 | 3.48% | 3 | 27.27% |
liam girdwood | liam girdwood | 2 | 1.74% | 2 | 18.18% |
harvey harrison | harvey harrison | 1 | 0.87% | 1 | 9.09% |
| Total | 115 | 100.00% | 11 | 100.00% |
#ifdef CONFIG_PM
static int s3c24xx_i2s_suspend(struct snd_soc_dai *cpu_dai)
{
pr_debug("Entered %s\n", __func__);
s3c24xx_i2s.iiscon = readl(s3c24xx_i2s.regs + S3C2410_IISCON);
s3c24xx_i2s.iismod = readl(s3c24xx_i2s.regs + S3C2410_IISMOD);
s3c24xx_i2s.iisfcon = readl(s3c24xx_i2s.regs + S3C2410_IISFCON);
s3c24xx_i2s.iispsr = readl(s3c24xx_i2s.regs + S3C2410_IISPSR);
clk_disable_unprepare(s3c24xx_i2s.iis_clk);
return 0;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
graeme gregory | graeme gregory | 70 | 87.50% | 1 | 16.67% |
tim niemeyer | tim niemeyer | 6 | 7.50% | 1 | 16.67% |
mark brown | mark brown | 2 | 2.50% | 2 | 33.33% |
vasily khoruzhick | vasily khoruzhick | 1 | 1.25% | 1 | 16.67% |
liam girdwood | liam girdwood | 1 | 1.25% | 1 | 16.67% |
| Total | 80 | 100.00% | 6 | 100.00% |
static int s3c24xx_i2s_resume(struct snd_soc_dai *cpu_dai)
{
pr_debug("Entered %s\n", __func__);
clk_prepare_enable(s3c24xx_i2s.iis_clk);
writel(s3c24xx_i2s.iiscon, s3c24xx_i2s.regs + S3C2410_IISCON);
writel(s3c24xx_i2s.iismod, s3c24xx_i2s.regs + S3C2410_IISMOD);
writel(s3c24xx_i2s.iisfcon, s3c24xx_i2s.regs + S3C2410_IISFCON);
writel(s3c24xx_i2s.iispsr, s3c24xx_i2s.regs + S3C2410_IISPSR);
return 0;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
graeme gregory | graeme gregory | 70 | 87.50% | 1 | 16.67% |
tim niemeyer | tim niemeyer | 6 | 7.50% | 1 | 16.67% |
mark brown | mark brown | 2 | 2.50% | 2 | 33.33% |
liam girdwood | liam girdwood | 1 | 1.25% | 1 | 16.67% |
vasily khoruzhick | vasily khoruzhick | 1 | 1.25% | 1 | 16.67% |
| Total | 80 | 100.00% | 6 | 100.00% |
#else
#define s3c24xx_i2s_suspend NULL
#define s3c24xx_i2s_resume NULL
#endif
#define S3C24XX_I2S_RATES \
(SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)
static const struct snd_soc_dai_ops s3c24xx_i2s_dai_ops = {
.trigger = s3c24xx_i2s_trigger,
.hw_params = s3c24xx_i2s_hw_params,
.set_fmt = s3c24xx_i2s_set_fmt,
.set_clkdiv = s3c24xx_i2s_set_clkdiv,
.set_sysclk = s3c24xx_i2s_set_sysclk,
};
static struct snd_soc_dai_driver s3c24xx_i2s_dai = {
.probe = s3c24xx_i2s_probe,
.suspend = s3c24xx_i2s_suspend,
.resume = s3c24xx_i2s_resume,
.playback = {
.channels_min = 2,
.channels_max = 2,
.rates = S3C24XX_I2S_RATES,
.formats = SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE,},
.capture = {
.channels_min = 2,
.channels_max = 2,
.rates = S3C24XX_I2S_RATES,
.formats = SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE,},
.ops = &s3c24xx_i2s_dai_ops,
};
static const struct snd_soc_component_driver s3c24xx_i2s_component = {
.name = "s3c24xx-i2s",
};
static int s3c24xx_iis_dev_probe(struct platform_device *pdev)
{
int ret = 0;
struct resource *res;
struct s3c_audio_pdata *pdata = dev_get_platdata(&pdev->dev);
if (!pdata) {
dev_err(&pdev->dev, "missing platform data");
return -ENXIO;
}
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) {
dev_err(&pdev->dev, "Can't get IO resource.\n");
return -ENOENT;
}
s3c24xx_i2s.regs = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(s3c24xx_i2s.regs))
return PTR_ERR(s3c24xx_i2s.regs);
s3c24xx_i2s_pcm_stereo_out.dma_addr = res->start + S3C2410_IISFIFO;
s3c24xx_i2s_pcm_stereo_out.slave = pdata->dma_playback;
s3c24xx_i2s_pcm_stereo_in.dma_addr = res->start + S3C2410_IISFIFO;
s3c24xx_i2s_pcm_stereo_in.slave = pdata->dma_capture;
ret = devm_snd_soc_register_component(&pdev->dev,
&s3c24xx_i2s_component, &s3c24xx_i2s_dai, 1);
if (ret) {
pr_err("failed to register the dai\n");
return ret;
}
ret = samsung_asoc_dma_platform_register(&pdev->dev,
pdata->dma_filter);
if (ret)
pr_err("failed to register the dma: %d\n", ret);
return ret;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
vasily khoruzhick | vasily khoruzhick | 79 | 36.92% | 1 | 9.09% |
arnd bergmann | arnd bergmann | 54 | 25.23% | 2 | 18.18% |
padmavathi venna | padmavathi venna | 45 | 21.03% | 1 | 9.09% |
liam girdwood | liam girdwood | 18 | 8.41% | 1 | 9.09% |
wei yongjun | wei yongjun | 9 | 4.21% | 1 | 9.09% |
kuninori morimoto | kuninori morimoto | 5 | 2.34% | 1 | 9.09% |
tushar behera | tushar behera | 2 | 0.93% | 2 | 18.18% |
alexey galakhov | alexey galakhov | 1 | 0.47% | 1 | 9.09% |
ben dooks | ben dooks | 1 | 0.47% | 1 | 9.09% |
| Total | 214 | 100.00% | 11 | 100.00% |
static struct platform_driver s3c24xx_iis_driver = {
.probe = s3c24xx_iis_dev_probe,
.driver = {
.name = "s3c24xx-iis",
},
};
module_platform_driver(s3c24xx_iis_driver);
/* Module information */
MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>");
MODULE_DESCRIPTION("s3c24xx I2S SoC Interface");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:s3c24xx-iis");
Overall Contributors
| Person | Tokens | Prop | Commits | CommitProp |
ben dooks | ben dooks | 1253 | 65.12% | 3 | 6.38% |
graeme gregory | graeme gregory | 189 | 9.82% | 2 | 4.26% |
vasily khoruzhick | vasily khoruzhick | 99 | 5.15% | 2 | 4.26% |
arnd bergmann | arnd bergmann | 58 | 3.01% | 3 | 6.38% |
mark brown | mark brown | 55 | 2.86% | 10 | 21.28% |
liam girdwood | liam girdwood | 50 | 2.60% | 2 | 4.26% |
padmavathi venna | padmavathi venna | 45 | 2.34% | 1 | 2.13% |
eric miao | eric miao | 34 | 1.77% | 1 | 2.13% |
christian pellegrin | christian pellegrin | 20 | 1.04% | 1 | 2.13% |
kuninori morimoto | kuninori morimoto | 18 | 0.94% | 1 | 2.13% |
tim niemeyer | tim niemeyer | 12 | 0.62% | 1 | 2.13% |
harvey harrison | harvey harrison | 10 | 0.52% | 1 | 2.13% |
davide rizzo | davide rizzo | 10 | 0.52% | 1 | 2.13% |
werner almesberger | werner almesberger | 10 | 0.52% | 1 | 2.13% |
axel lin | axel lin | 9 | 0.47% | 1 | 2.13% |
wei yongjun | wei yongjun | 9 | 0.47% | 1 | 2.13% |
sylwester nawrocki | sylwester nawrocki | 9 | 0.47% | 1 | 2.13% |
daniel mack | daniel mack | 9 | 0.47% | 1 | 2.13% |
sachin kamat | sachin kamat | 6 | 0.31% | 1 | 2.13% |
tushar behera | tushar behera | 5 | 0.26% | 3 | 6.38% |
jassi brar | jassi brar | 3 | 0.16% | 2 | 4.26% |
paul gortmaker | paul gortmaker | 3 | 0.16% | 1 | 2.13% |
matt reimer | matt reimer | 2 | 0.10% | 1 | 2.13% |
harald welte | harald welte | 2 | 0.10% | 1 | 2.13% |
julia lawall | julia lawall | 1 | 0.05% | 1 | 2.13% |
alexey galakhov | alexey galakhov | 1 | 0.05% | 1 | 2.13% |
lars-peter clausen | lars-peter clausen | 1 | 0.05% | 1 | 2.13% |
seungwhan youn | seungwhan youn | 1 | 0.05% | 1 | 2.13% |
| Total | 1924 | 100.00% | 47 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.