You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6: (346 commits) ASoC: core: Don't set "(null)" as a driver name ALSA: hda - Use LPIB for ATI/AMD chipsets as default Revert "ALSA: hda - Use position_fix=3 as default for AMD chipsets" ASoC: Tegra: Fix compile when debugfs not enabled ASoC: spdif-dit: Add missing MODULE_* SOUND: OSS: Remove Au1550 driver. ALSA: hda - add Intel Panther Point HDMI codec id ALSA: emu10k1 - Add dB range to Bass and Treble for SB Live! ALSA: hda - Remove PCM mixer elements from Virtual Master of realtek ALSA: hda - Fix input-src parse in patch_analog.c ASoC: davinci-mcasp: enable ping-pong SRAM buffers ASoC: add iPAQ hx4700 machine driver ASoC: Asahi Kasei AK4641 codec driver ALSA: hda - Enable Realtek ALC269 codec input layer beep ALSA: intel8x0m: enable AMD8111 modem ALSA: HDA: Add jack detection for HDMI ALSA: sound, core, pcm_lib: fix xrun_log ASoC: Max98095: Move existing NULL check before pointer dereference. ALSA: sound, core, pcm_lib: xrun_log: log also in_interrupt ALSA: usb-audio - Add support for USB X-Fi S51 Pro ...
This commit is contained in:
@@ -1230,6 +1230,13 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||
This module supports multiple cards.
|
||||
The driver requires the firmware loader support on kernel.
|
||||
|
||||
Module snd-lola
|
||||
---------------
|
||||
|
||||
Module for Digigram Lola PCI-e boards
|
||||
|
||||
This module supports multiple cards.
|
||||
|
||||
Module snd-lx6464es
|
||||
-------------------
|
||||
|
||||
|
||||
@@ -94,7 +94,7 @@ ALC662/663/272
|
||||
3stack-dig 3-stack (2-channel) with SPDIF
|
||||
3stack-6ch 3-stack (6-channel)
|
||||
3stack-6ch-dig 3-stack (6-channel) with SPDIF
|
||||
6stack-dig 6-stack with SPDIF
|
||||
5stack-dig 5-stack with SPDIF
|
||||
lenovo-101e Lenovo laptop
|
||||
eeepc-p701 ASUS Eeepc P701
|
||||
eeepc-ep20 ASUS Eeepc EP20
|
||||
|
||||
+10
-3
@@ -4269,6 +4269,13 @@ M: Tim Hockin <thockin@hockin.org>
|
||||
S: Maintained
|
||||
F: drivers/net/natsemi.c
|
||||
|
||||
NATIVE INSTRUMENTS USB SOUND INTERFACE DRIVER
|
||||
M: Daniel Mack <zonque@gmail.com>
|
||||
S: Maintained
|
||||
L: alsa-devel@alsa-project.org
|
||||
W: http://www.native-instruments.com
|
||||
F: sound/usb/caiaq/
|
||||
|
||||
NCP FILESYSTEM
|
||||
M: Petr Vandrovec <petr@vandrovec.name>
|
||||
S: Odd Fixes
|
||||
@@ -5868,7 +5875,7 @@ F: include/sound/
|
||||
F: sound/
|
||||
|
||||
SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEMENT (ASoC)
|
||||
M: Liam Girdwood <lrg@slimlogic.co.uk>
|
||||
M: Liam Girdwood <lrg@ti.com>
|
||||
M: Mark Brown <broonie@opensource.wolfsonmicro.com>
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound-2.6.git
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
@@ -6119,7 +6126,7 @@ F: drivers/mmc/host/tifm_sd.c
|
||||
F: include/linux/tifm.h
|
||||
|
||||
TI TWL4030 SERIES SOC CODEC DRIVER
|
||||
M: Peter Ujfalusi <peter.ujfalusi@nokia.com>
|
||||
M: Peter Ujfalusi <peter.ujfalusi@ti.com>
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: sound/soc/codecs/twl4030*
|
||||
@@ -6763,7 +6770,7 @@ F: drivers/scsi/vmw_pvscsi.c
|
||||
F: drivers/scsi/vmw_pvscsi.h
|
||||
|
||||
VOLTAGE AND CURRENT REGULATOR FRAMEWORK
|
||||
M: Liam Girdwood <lrg@slimlogic.co.uk>
|
||||
M: Liam Girdwood <lrg@ti.com>
|
||||
M: Mark Brown <broonie@opensource.wolfsonmicro.com>
|
||||
W: http://opensource.wolfsonmicro.com/node/15
|
||||
W: http://www.slimlogic.co.uk/?p=48
|
||||
|
||||
@@ -27,12 +27,14 @@ comment "Tegra board type"
|
||||
|
||||
config MACH_HARMONY
|
||||
bool "Harmony board"
|
||||
select MACH_HAS_SND_SOC_TEGRA_WM8903
|
||||
help
|
||||
Support for nVidia Harmony development platform
|
||||
|
||||
config MACH_KAEN
|
||||
bool "Kaen board"
|
||||
select MACH_SEABOARD
|
||||
select MACH_HAS_SND_SOC_TEGRA_WM8903
|
||||
help
|
||||
Support for the Kaen version of Seaboard
|
||||
|
||||
@@ -43,6 +45,7 @@ config MACH_PAZ00
|
||||
|
||||
config MACH_SEABOARD
|
||||
bool "Seaboard board"
|
||||
select MACH_HAS_SND_SOC_TEGRA_WM8903
|
||||
help
|
||||
Support for nVidia Seaboard development platform. It will
|
||||
also be included for some of the derivative boards that
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
#include <asm/mach/time.h>
|
||||
#include <asm/setup.h>
|
||||
|
||||
#include <mach/harmony_audio.h>
|
||||
#include <mach/tegra_wm8903_pdata.h>
|
||||
#include <mach/iomap.h>
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/sdhci.h>
|
||||
@@ -67,15 +67,16 @@ static struct platform_device debug_uart = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct harmony_audio_platform_data harmony_audio_pdata = {
|
||||
static struct tegra_wm8903_platform_data harmony_audio_pdata = {
|
||||
.gpio_spkr_en = TEGRA_GPIO_SPKR_EN,
|
||||
.gpio_hp_det = TEGRA_GPIO_HP_DET,
|
||||
.gpio_hp_mute = -1,
|
||||
.gpio_int_mic_en = TEGRA_GPIO_INT_MIC_EN,
|
||||
.gpio_ext_mic_en = TEGRA_GPIO_EXT_MIC_EN,
|
||||
};
|
||||
|
||||
static struct platform_device harmony_audio_device = {
|
||||
.name = "tegra-snd-harmony",
|
||||
.name = "tegra-snd-wm8903",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &harmony_audio_pdata,
|
||||
|
||||
+3
-2
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* arch/arm/mach-tegra/include/mach/harmony_audio.h
|
||||
* arch/arm/mach-tegra/include/mach/tegra_wm8903_pdata.h
|
||||
*
|
||||
* Copyright 2011 NVIDIA, Inc.
|
||||
*
|
||||
@@ -14,9 +14,10 @@
|
||||
*
|
||||
*/
|
||||
|
||||
struct harmony_audio_platform_data {
|
||||
struct tegra_wm8903_platform_data {
|
||||
int gpio_spkr_en;
|
||||
int gpio_hp_det;
|
||||
int gpio_hp_mute;
|
||||
int gpio_int_mic_en;
|
||||
int gpio_ext_mic_en;
|
||||
};
|
||||
@@ -166,21 +166,6 @@ config RADIO_MAXIRADIO
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called radio-maxiradio.
|
||||
|
||||
config RADIO_MAESTRO
|
||||
tristate "Maestro on board radio"
|
||||
depends on VIDEO_V4L2 && PCI
|
||||
---help---
|
||||
Say Y here to directly support the on-board radio tuner on the
|
||||
Maestro 2 or 2E sound card.
|
||||
|
||||
In order to control your radio card, you will need to use programs
|
||||
that are compatible with the Video For Linux API. Information on
|
||||
this API and pointers to "v4l" programs may be found at
|
||||
<file:Documentation/video4linux/API.html>.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called radio-maestro.
|
||||
|
||||
config RADIO_MIROPCM20
|
||||
tristate "miroSOUND PCM20 radio"
|
||||
depends on ISA && VIDEO_V4L2 && SND
|
||||
|
||||
@@ -16,7 +16,6 @@ obj-$(CONFIG_RADIO_GEMTEK) += radio-gemtek.o
|
||||
obj-$(CONFIG_RADIO_TRUST) += radio-trust.o
|
||||
obj-$(CONFIG_I2C_SI4713) += si4713-i2c.o
|
||||
obj-$(CONFIG_RADIO_SI4713) += radio-si4713.o
|
||||
obj-$(CONFIG_RADIO_MAESTRO) += radio-maestro.o
|
||||
obj-$(CONFIG_RADIO_MIROPCM20) += radio-miropcm20.o
|
||||
obj-$(CONFIG_USB_DSBR) += dsbr100.o
|
||||
obj-$(CONFIG_RADIO_SI470X) += si470x/
|
||||
|
||||
@@ -1,452 +0,0 @@
|
||||
/* Maestro PCI sound card radio driver for Linux support
|
||||
* (c) 2000 A. Tlalka, atlka@pg.gda.pl
|
||||
* Notes on the hardware
|
||||
*
|
||||
* + Frequency control is done digitally
|
||||
* + No volume control - only mute/unmute - you have to use Aux line volume
|
||||
* control on Maestro card to set the volume
|
||||
* + Radio status (tuned/not_tuned and stereo/mono) is valid some time after
|
||||
* frequency setting (>100ms) and only when the radio is unmuted.
|
||||
* version 0.02
|
||||
* + io port is automatically detected - only the first radio is used
|
||||
* version 0.03
|
||||
* + thread access locking additions
|
||||
* version 0.04
|
||||
* + code improvements
|
||||
* + VIDEO_TUNER_LOW is permanent
|
||||
*
|
||||
* Converted to V4L2 API by Mauro Carvalho Chehab <mchehab@infradead.org>
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/version.h> /* for KERNEL_VERSION MACRO */
|
||||
#include <linux/pci.h>
|
||||
#include <linux/videodev2.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/slab.h>
|
||||
#include <media/v4l2-device.h>
|
||||
#include <media/v4l2-ioctl.h>
|
||||
|
||||
MODULE_AUTHOR("Adam Tlalka, atlka@pg.gda.pl");
|
||||
MODULE_DESCRIPTION("Radio driver for the Maestro PCI sound card radio.");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static int radio_nr = -1;
|
||||
module_param(radio_nr, int, 0);
|
||||
|
||||
#define RADIO_VERSION KERNEL_VERSION(0, 0, 6)
|
||||
#define DRIVER_VERSION "0.06"
|
||||
|
||||
#define GPIO_DATA 0x60 /* port offset from ESS_IO_BASE */
|
||||
|
||||
#define IO_MASK 4 /* mask register offset from GPIO_DATA
|
||||
bits 1=unmask write to given bit */
|
||||
#define IO_DIR 8 /* direction register offset from GPIO_DATA
|
||||
bits 0/1=read/write direction */
|
||||
|
||||
#define GPIO6 0x0040 /* mask bits for GPIO lines */
|
||||
#define GPIO7 0x0080
|
||||
#define GPIO8 0x0100
|
||||
#define GPIO9 0x0200
|
||||
|
||||
#define STR_DATA GPIO6 /* radio TEA5757 pins and GPIO bits */
|
||||
#define STR_CLK GPIO7
|
||||
#define STR_WREN GPIO8
|
||||
#define STR_MOST GPIO9
|
||||
|
||||
#define FREQ_LO 50*16000
|
||||
#define FREQ_HI 150*16000
|
||||
|
||||
#define FREQ_IF 171200 /* 10.7*16000 */
|
||||
#define FREQ_STEP 200 /* 12.5*16 */
|
||||
|
||||
#define FREQ2BITS(x) ((((unsigned int)(x)+FREQ_IF+(FREQ_STEP<<1))\
|
||||
/(FREQ_STEP<<2))<<2) /* (x==fmhz*16*1000) -> bits */
|
||||
|
||||
#define BITS2FREQ(x) ((x) * FREQ_STEP - FREQ_IF)
|
||||
|
||||
struct maestro {
|
||||
struct v4l2_device v4l2_dev;
|
||||
struct video_device vdev;
|
||||
struct pci_dev *pdev;
|
||||
struct mutex lock;
|
||||
|
||||
u16 io; /* base of Maestro card radio io (GPIO_DATA)*/
|
||||
u16 muted; /* VIDEO_AUDIO_MUTE */
|
||||
u16 stereo; /* VIDEO_TUNER_STEREO_ON */
|
||||
u16 tuned; /* signal strength (0 or 0xffff) */
|
||||
};
|
||||
|
||||
static inline struct maestro *to_maestro(struct v4l2_device *v4l2_dev)
|
||||
{
|
||||
return container_of(v4l2_dev, struct maestro, v4l2_dev);
|
||||
}
|
||||
|
||||
static u32 radio_bits_get(struct maestro *dev)
|
||||
{
|
||||
u16 io = dev->io, l, rdata;
|
||||
u32 data = 0;
|
||||
u16 omask;
|
||||
|
||||
omask = inw(io + IO_MASK);
|
||||
outw(~(STR_CLK | STR_WREN), io + IO_MASK);
|
||||
outw(0, io);
|
||||
udelay(16);
|
||||
|
||||
for (l = 24; l--;) {
|
||||
outw(STR_CLK, io); /* HI state */
|
||||
udelay(2);
|
||||
if (!l)
|
||||
dev->tuned = inw(io) & STR_MOST ? 0 : 0xffff;
|
||||
outw(0, io); /* LO state */
|
||||
udelay(2);
|
||||
data <<= 1; /* shift data */
|
||||
rdata = inw(io);
|
||||
if (!l)
|
||||
dev->stereo = (rdata & STR_MOST) ? 0 : 1;
|
||||
else if (rdata & STR_DATA)
|
||||
data++;
|
||||
udelay(2);
|
||||
}
|
||||
|
||||
if (dev->muted)
|
||||
outw(STR_WREN, io);
|
||||
|
||||
udelay(4);
|
||||
outw(omask, io + IO_MASK);
|
||||
|
||||
return data & 0x3ffe;
|
||||
}
|
||||
|
||||
static void radio_bits_set(struct maestro *dev, u32 data)
|
||||
{
|
||||
u16 io = dev->io, l, bits;
|
||||
u16 omask, odir;
|
||||
|
||||
omask = inw(io + IO_MASK);
|
||||
odir = (inw(io + IO_DIR) & ~STR_DATA) | (STR_CLK | STR_WREN);
|
||||
outw(odir | STR_DATA, io + IO_DIR);
|
||||
outw(~(STR_DATA | STR_CLK | STR_WREN), io + IO_MASK);
|
||||
udelay(16);
|
||||
for (l = 25; l; l--) {
|
||||
bits = ((data >> 18) & STR_DATA) | STR_WREN;
|
||||
data <<= 1; /* shift data */
|
||||
outw(bits, io); /* start strobe */
|
||||
udelay(2);
|
||||
outw(bits | STR_CLK, io); /* HI level */
|
||||
udelay(2);
|
||||
outw(bits, io); /* LO level */
|
||||
udelay(4);
|
||||
}
|
||||
|
||||
if (!dev->muted)
|
||||
outw(0, io);
|
||||
|
||||
udelay(4);
|
||||
outw(omask, io + IO_MASK);
|
||||
outw(odir, io + IO_DIR);
|
||||
msleep(125);
|
||||
}
|
||||
|
||||
static int vidioc_querycap(struct file *file, void *priv,
|
||||
struct v4l2_capability *v)
|
||||
{
|
||||
struct maestro *dev = video_drvdata(file);
|
||||
|
||||
strlcpy(v->driver, "radio-maestro", sizeof(v->driver));
|
||||
strlcpy(v->card, "Maestro Radio", sizeof(v->card));
|
||||
snprintf(v->bus_info, sizeof(v->bus_info), "PCI:%s", pci_name(dev->pdev));
|
||||
v->version = RADIO_VERSION;
|
||||
v->capabilities = V4L2_CAP_TUNER | V4L2_CAP_RADIO;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vidioc_g_tuner(struct file *file, void *priv,
|
||||
struct v4l2_tuner *v)
|
||||
{
|
||||
struct maestro *dev = video_drvdata(file);
|
||||
|
||||
if (v->index > 0)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&dev->lock);
|
||||
radio_bits_get(dev);
|
||||
|
||||
strlcpy(v->name, "FM", sizeof(v->name));
|
||||
v->type = V4L2_TUNER_RADIO;
|
||||
v->rangelow = FREQ_LO;
|
||||
v->rangehigh = FREQ_HI;
|
||||
v->rxsubchans = V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO;
|
||||
v->capability = V4L2_TUNER_CAP_LOW;
|
||||
if (dev->stereo)
|
||||
v->audmode = V4L2_TUNER_MODE_STEREO;
|
||||
else
|
||||
v->audmode = V4L2_TUNER_MODE_MONO;
|
||||
v->signal = dev->tuned;
|
||||
mutex_unlock(&dev->lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vidioc_s_tuner(struct file *file, void *priv,
|
||||
struct v4l2_tuner *v)
|
||||
{
|
||||
return v->index ? -EINVAL : 0;
|
||||
}
|
||||
|
||||
static int vidioc_s_frequency(struct file *file, void *priv,
|
||||
struct v4l2_frequency *f)
|
||||
{
|
||||
struct maestro *dev = video_drvdata(file);
|
||||
|
||||
if (f->tuner != 0 || f->type != V4L2_TUNER_RADIO)
|
||||
return -EINVAL;
|
||||
if (f->frequency < FREQ_LO || f->frequency > FREQ_HI)
|
||||
return -EINVAL;
|
||||
mutex_lock(&dev->lock);
|
||||
radio_bits_set(dev, FREQ2BITS(f->frequency));
|
||||
mutex_unlock(&dev->lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vidioc_g_frequency(struct file *file, void *priv,
|
||||
struct v4l2_frequency *f)
|
||||
{
|
||||
struct maestro *dev = video_drvdata(file);
|
||||
|
||||
if (f->tuner != 0)
|
||||
return -EINVAL;
|
||||
f->type = V4L2_TUNER_RADIO;
|
||||
mutex_lock(&dev->lock);
|
||||
f->frequency = BITS2FREQ(radio_bits_get(dev));
|
||||
mutex_unlock(&dev->lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vidioc_queryctrl(struct file *file, void *priv,
|
||||
struct v4l2_queryctrl *qc)
|
||||
{
|
||||
switch (qc->id) {
|
||||
case V4L2_CID_AUDIO_MUTE:
|
||||
return v4l2_ctrl_query_fill(qc, 0, 1, 1, 1);
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int vidioc_g_ctrl(struct file *file, void *priv,
|
||||
struct v4l2_control *ctrl)
|
||||
{
|
||||
struct maestro *dev = video_drvdata(file);
|
||||
|
||||
switch (ctrl->id) {
|
||||
case V4L2_CID_AUDIO_MUTE:
|
||||
ctrl->value = dev->muted;
|
||||
return 0;
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int vidioc_s_ctrl(struct file *file, void *priv,
|
||||
struct v4l2_control *ctrl)
|
||||
{
|
||||
struct maestro *dev = video_drvdata(file);
|
||||
u16 io = dev->io;
|
||||
u16 omask;
|
||||
|
||||
switch (ctrl->id) {
|
||||
case V4L2_CID_AUDIO_MUTE:
|
||||
mutex_lock(&dev->lock);
|
||||
omask = inw(io + IO_MASK);
|
||||
outw(~STR_WREN, io + IO_MASK);
|
||||
dev->muted = ctrl->value;
|
||||
outw(dev->muted ? STR_WREN : 0, io);
|
||||
udelay(4);
|
||||
outw(omask, io + IO_MASK);
|
||||
msleep(125);
|
||||
mutex_unlock(&dev->lock);
|
||||
return 0;
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int vidioc_g_input(struct file *filp, void *priv, unsigned int *i)
|
||||
{
|
||||
*i = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vidioc_s_input(struct file *filp, void *priv, unsigned int i)
|
||||
{
|
||||
return i ? -EINVAL : 0;
|
||||
}
|
||||
|
||||
static int vidioc_g_audio(struct file *file, void *priv,
|
||||
struct v4l2_audio *a)
|
||||
{
|
||||
a->index = 0;
|
||||
strlcpy(a->name, "Radio", sizeof(a->name));
|
||||
a->capability = V4L2_AUDCAP_STEREO;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vidioc_s_audio(struct file *file, void *priv,
|
||||
struct v4l2_audio *a)
|
||||
{
|
||||
return a->index ? -EINVAL : 0;
|
||||
}
|
||||
|
||||
static const struct v4l2_file_operations maestro_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.unlocked_ioctl = video_ioctl2,
|
||||
};
|
||||
|
||||
static const struct v4l2_ioctl_ops maestro_ioctl_ops = {
|
||||
.vidioc_querycap = vidioc_querycap,
|
||||
.vidioc_g_tuner = vidioc_g_tuner,
|
||||
.vidioc_s_tuner = vidioc_s_tuner,
|
||||
.vidioc_g_audio = vidioc_g_audio,
|
||||
.vidioc_s_audio = vidioc_s_audio,
|
||||
.vidioc_g_input = vidioc_g_input,
|
||||
.vidioc_s_input = vidioc_s_input,
|
||||
.vidioc_g_frequency = vidioc_g_frequency,
|
||||
.vidioc_s_frequency = vidioc_s_frequency,
|
||||
.vidioc_queryctrl = vidioc_queryctrl,
|
||||
.vidioc_g_ctrl = vidioc_g_ctrl,
|
||||
.vidioc_s_ctrl = vidioc_s_ctrl,
|
||||
};
|
||||
|
||||
static u16 __devinit radio_power_on(struct maestro *dev)
|
||||
{
|
||||
register u16 io = dev->io;
|
||||
register u32 ofreq;
|
||||
u16 omask, odir;
|
||||
|
||||
omask = inw(io + IO_MASK);
|
||||
odir = (inw(io + IO_DIR) & ~STR_DATA) | (STR_CLK | STR_WREN);
|
||||
outw(odir & ~STR_WREN, io + IO_DIR);
|
||||
dev->muted = inw(io) & STR_WREN ? 0 : 1;
|
||||
outw(odir, io + IO_DIR);
|
||||
outw(~(STR_WREN | STR_CLK), io + IO_MASK);
|
||||
outw(dev->muted ? 0 : STR_WREN, io);
|
||||
udelay(16);
|
||||
outw(omask, io + IO_MASK);
|
||||
ofreq = radio_bits_get(dev);
|
||||
|
||||
if ((ofreq < FREQ2BITS(FREQ_LO)) || (ofreq > FREQ2BITS(FREQ_HI)))
|
||||
ofreq = FREQ2BITS(FREQ_LO);
|
||||
radio_bits_set(dev, ofreq);
|
||||
|
||||
return (ofreq == radio_bits_get(dev));
|
||||
}
|
||||
|
||||
static int __devinit maestro_probe(struct pci_dev *pdev,
|
||||
const struct pci_device_id *ent)
|
||||
{
|
||||
struct maestro *dev;
|
||||
struct v4l2_device *v4l2_dev;
|
||||
int retval;
|
||||
|
||||
retval = pci_enable_device(pdev);
|
||||
if (retval) {
|
||||
dev_err(&pdev->dev, "enabling pci device failed!\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
retval = -ENOMEM;
|
||||
|
||||
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
|
||||
if (dev == NULL) {
|
||||
dev_err(&pdev->dev, "not enough memory\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
v4l2_dev = &dev->v4l2_dev;
|
||||
mutex_init(&dev->lock);
|
||||
dev->pdev = pdev;
|
||||
|
||||
strlcpy(v4l2_dev->name, "maestro", sizeof(v4l2_dev->name));
|
||||
|
||||
retval = v4l2_device_register(&pdev->dev, v4l2_dev);
|
||||
if (retval < 0) {
|
||||
v4l2_err(v4l2_dev, "Could not register v4l2_device\n");
|
||||
goto errfr;
|
||||
}
|
||||
|
||||
dev->io = pci_resource_start(pdev, 0) + GPIO_DATA;
|
||||
|
||||
strlcpy(dev->vdev.name, v4l2_dev->name, sizeof(dev->vdev.name));
|
||||
dev->vdev.v4l2_dev = v4l2_dev;
|
||||
dev->vdev.fops = &maestro_fops;
|
||||
dev->vdev.ioctl_ops = &maestro_ioctl_ops;
|
||||
dev->vdev.release = video_device_release_empty;
|
||||
video_set_drvdata(&dev->vdev, dev);
|
||||
|
||||
if (!radio_power_on(dev)) {
|
||||
retval = -EIO;
|
||||
goto errfr1;
|
||||
}
|
||||
|
||||
retval = video_register_device(&dev->vdev, VFL_TYPE_RADIO, radio_nr);
|
||||
if (retval) {
|
||||
v4l2_err(v4l2_dev, "can't register video device!\n");
|
||||
goto errfr1;
|
||||
}
|
||||
|
||||
v4l2_info(v4l2_dev, "version " DRIVER_VERSION "\n");
|
||||
|
||||
return 0;
|
||||
errfr1:
|
||||
v4l2_device_unregister(v4l2_dev);
|
||||
errfr:
|
||||
kfree(dev);
|
||||
err:
|
||||
return retval;
|
||||
|
||||
}
|
||||
|
||||
static void __devexit maestro_remove(struct pci_dev *pdev)
|
||||
{
|
||||
struct v4l2_device *v4l2_dev = dev_get_drvdata(&pdev->dev);
|
||||
struct maestro *dev = to_maestro(v4l2_dev);
|
||||
|
||||
video_unregister_device(&dev->vdev);
|
||||
v4l2_device_unregister(&dev->v4l2_dev);
|
||||
}
|
||||
|
||||
static struct pci_device_id maestro_r_pci_tbl[] = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_ESS, PCI_DEVICE_ID_ESS_ESS1968),
|
||||
.class = PCI_CLASS_MULTIMEDIA_AUDIO << 8,
|
||||
.class_mask = 0xffff00 },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_ESS, PCI_DEVICE_ID_ESS_ESS1978),
|
||||
.class = PCI_CLASS_MULTIMEDIA_AUDIO << 8,
|
||||
.class_mask = 0xffff00 },
|
||||
{ 0 }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, maestro_r_pci_tbl);
|
||||
|
||||
static struct pci_driver maestro_r_driver = {
|
||||
.name = "maestro_radio",
|
||||
.id_table = maestro_r_pci_tbl,
|
||||
.probe = maestro_probe,
|
||||
.remove = __devexit_p(maestro_remove),
|
||||
};
|
||||
|
||||
static int __init maestro_radio_init(void)
|
||||
{
|
||||
int retval = pci_register_driver(&maestro_r_driver);
|
||||
|
||||
if (retval)
|
||||
printk(KERN_ERR "error during registration pci driver\n");
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void __exit maestro_radio_exit(void)
|
||||
{
|
||||
pci_unregister_driver(&maestro_r_driver);
|
||||
}
|
||||
|
||||
module_init(maestro_radio_init);
|
||||
module_exit(maestro_radio_exit);
|
||||
@@ -508,7 +508,6 @@ int register_sst_card(struct intel_sst_card_ops *card)
|
||||
sst_drv_ctx->pmic_state = SND_MAD_INIT_DONE;
|
||||
sst_drv_ctx->rx_time_slot_status = 0; /*default AMIC*/
|
||||
card->pcm_control = sst_pmic_ops.pcm_control;
|
||||
sst_drv_ctx->scard_ops->card_status = SND_CARD_UN_INIT;
|
||||
return 0;
|
||||
} else {
|
||||
pr_err("strcmp fail %s\n", card->module_name);
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <sound/control.h>
|
||||
#include <asm/mrst.h>
|
||||
#include <sound/pcm.h>
|
||||
@@ -40,6 +41,8 @@
|
||||
#include <sound/initval.h>
|
||||
#include "intel_sst.h"
|
||||
#include "intel_sst_ioctl.h"
|
||||
#include "intel_sst_fw_ipc.h"
|
||||
#include "intel_sst_common.h"
|
||||
#include "intelmid_snd_control.h"
|
||||
#include "intelmid.h"
|
||||
|
||||
@@ -802,6 +805,7 @@ static int __devinit snd_intelmad_sst_register(
|
||||
pr_err("sst card registration failed\n");
|
||||
return ret_val;
|
||||
}
|
||||
sst_drv_ctx->scard_ops->card_status = SND_CARD_UN_INIT;
|
||||
|
||||
sst_card_vendor_id = intelmaddata->sstdrv_ops->vendor_id;
|
||||
intelmaddata->pmic_status = PMIC_UNINIT;
|
||||
|
||||
@@ -32,6 +32,10 @@ struct wm8994_ldo_pdata {
|
||||
#define WM8994_EQ_REGS 20
|
||||
#define WM8958_MBC_CUTOFF_REGS 20
|
||||
#define WM8958_MBC_COEFF_REGS 48
|
||||
#define WM8958_MBC_COMBINED_REGS 56
|
||||
#define WM8958_VSS_HPF_REGS 2
|
||||
#define WM8958_VSS_REGS 148
|
||||
#define WM8958_ENH_EQ_REGS 32
|
||||
|
||||
/**
|
||||
* DRC configurations are specified with a label and a set of register
|
||||
@@ -71,6 +75,42 @@ struct wm8958_mbc_cfg {
|
||||
const char *name;
|
||||
u16 cutoff_regs[WM8958_MBC_CUTOFF_REGS];
|
||||
u16 coeff_regs[WM8958_MBC_COEFF_REGS];
|
||||
|
||||
/* Coefficient layout when using MBC+VSS firmware */
|
||||
u16 combined_regs[WM8958_MBC_COMBINED_REGS];
|
||||
};
|
||||
|
||||
/**
|
||||
* VSS HPF configurations are specified with a label and two values to
|
||||
* write. Configurations are expected to be generated using the
|
||||
* multiband compressor configuration panel in WISCE - see
|
||||
* http://www.wolfsonmicro.com/wisce/
|
||||
*/
|
||||
struct wm8958_vss_hpf_cfg {
|
||||
const char *name;
|
||||
u16 regs[WM8958_VSS_HPF_REGS];
|
||||
};
|
||||
|
||||
/**
|
||||
* VSS configurations are specified with a label and array of values
|
||||
* to write. Configurations are expected to be generated using the
|
||||
* multiband compressor configuration panel in WISCE - see
|
||||
* http://www.wolfsonmicro.com/wisce/
|
||||
*/
|
||||
struct wm8958_vss_cfg {
|
||||
const char *name;
|
||||
u16 regs[WM8958_VSS_REGS];
|
||||
};
|
||||
|
||||
/**
|
||||
* Enhanced EQ configurations are specified with a label and array of
|
||||
* values to write. Configurations are expected to be generated using
|
||||
* the multiband compressor configuration panel in WISCE - see
|
||||
* http://www.wolfsonmicro.com/wisce/
|
||||
*/
|
||||
struct wm8958_enh_eq_cfg {
|
||||
const char *name;
|
||||
u16 regs[WM8958_ENH_EQ_REGS];
|
||||
};
|
||||
|
||||
struct wm8994_pdata {
|
||||
@@ -95,6 +135,15 @@ struct wm8994_pdata {
|
||||
int num_mbc_cfgs;
|
||||
struct wm8958_mbc_cfg *mbc_cfgs;
|
||||
|
||||
int num_vss_cfgs;
|
||||
struct wm8958_vss_cfg *vss_cfgs;
|
||||
|
||||
int num_vss_hpf_cfgs;
|
||||
struct wm8958_vss_hpf_cfg *vss_hpf_cfgs;
|
||||
|
||||
int num_enh_eq_cfgs;
|
||||
struct wm8958_enh_eq_cfg *enh_eq_cfgs;
|
||||
|
||||
/* LINEOUT can be differential or single ended */
|
||||
unsigned int lineout1_diff:1;
|
||||
unsigned int lineout2_diff:1;
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* AK4641 ALSA SoC Codec driver
|
||||
*
|
||||
* Copyright 2009 Philipp Zabel
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __AK4641_H
|
||||
#define __AK4641_H
|
||||
|
||||
/**
|
||||
* struct ak4641_platform_data - platform specific AK4641 configuration
|
||||
* @gpio_power: GPIO to control external power to AK4641
|
||||
* @gpio_npdn: GPIO connected to AK4641 nPDN pin
|
||||
*
|
||||
* Both GPIO parameters are optional.
|
||||
*/
|
||||
struct ak4641_platform_data {
|
||||
int gpio_power;
|
||||
int gpio_npdn;
|
||||
};
|
||||
|
||||
#endif /* __AK4641_H */
|
||||
@@ -113,6 +113,7 @@ struct snd_kcontrol *snd_ctl_new1(const struct snd_kcontrol_new * kcontrolnew, v
|
||||
void snd_ctl_free_one(struct snd_kcontrol * kcontrol);
|
||||
int snd_ctl_add(struct snd_card * card, struct snd_kcontrol * kcontrol);
|
||||
int snd_ctl_remove(struct snd_card * card, struct snd_kcontrol * kcontrol);
|
||||
int snd_ctl_replace(struct snd_card *card, struct snd_kcontrol *kcontrol, bool add_on_replace);
|
||||
int snd_ctl_remove_id(struct snd_card * card, struct snd_ctl_elem_id *id);
|
||||
int snd_ctl_rename_id(struct snd_card * card, struct snd_ctl_elem_id *src_id, struct snd_ctl_elem_id *dst_id);
|
||||
int snd_ctl_activate_id(struct snd_card *card, struct snd_ctl_elem_id *id,
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* Platform data for MAX98095
|
||||
*
|
||||
* Copyright 2011 Maxim Integrated Products
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __SOUND_MAX98095_PDATA_H__
|
||||
#define __SOUND_MAX98095_PDATA_H__
|
||||
|
||||
/* Equalizer filter response configuration */
|
||||
struct max98095_eq_cfg {
|
||||
const char *name;
|
||||
unsigned int rate;
|
||||
u16 band1[5];
|
||||
u16 band2[5];
|
||||
u16 band3[5];
|
||||
u16 band4[5];
|
||||
u16 band5[5];
|
||||
};
|
||||
|
||||
/* Biquad filter response configuration */
|
||||
struct max98095_biquad_cfg {
|
||||
const char *name;
|
||||
unsigned int rate;
|
||||
u16 band1[5];
|
||||
u16 band2[5];
|
||||
};
|
||||
|
||||
/* codec platform data */
|
||||
struct max98095_pdata {
|
||||
|
||||
/* Equalizers for DAI1 and DAI2 */
|
||||
struct max98095_eq_cfg *eq_cfg;
|
||||
unsigned int eq_cfgcnt;
|
||||
|
||||
/* Biquad filter for DAI1 and DAI2 */
|
||||
struct max98095_biquad_cfg *bq_cfg;
|
||||
unsigned int bq_cfgcnt;
|
||||
|
||||
/* Analog/digital microphone configuration:
|
||||
* 0 = analog microphone input (normal setting)
|
||||
* 1 = digital microphone input
|
||||
*/
|
||||
unsigned int digmic_left_mode:1;
|
||||
unsigned int digmic_right_mode:1;
|
||||
};
|
||||
|
||||
#endif
|
||||
+44
-36
@@ -24,7 +24,7 @@
|
||||
* SoC dynamic audio power management
|
||||
*
|
||||
* We can have up to 4 power domains
|
||||
* 1. Codec domain - VREF, VMID
|
||||
* 1. Codec domain - VREF, VMID
|
||||
* Usually controlled at codec probe/remove, although can be set
|
||||
* at stream time if power is not needed for sidetone, etc.
|
||||
* 2. Platform/Machine domain - physically connected inputs and outputs
|
||||
@@ -39,30 +39,30 @@
|
||||
|
||||
/* codec domain */
|
||||
#define SND_SOC_DAPM_VMID(wname) \
|
||||
{ .id = snd_soc_dapm_vmid, .name = wname, .kcontrols = NULL, \
|
||||
{ .id = snd_soc_dapm_vmid, .name = wname, .kcontrol_news = NULL, \
|
||||
.num_kcontrols = 0}
|
||||
|
||||
/* platform domain */
|
||||
#define SND_SOC_DAPM_INPUT(wname) \
|
||||
{ .id = snd_soc_dapm_input, .name = wname, .kcontrols = NULL, \
|
||||
{ .id = snd_soc_dapm_input, .name = wname, .kcontrol_news = NULL, \
|
||||
.num_kcontrols = 0, .reg = SND_SOC_NOPM }
|
||||
#define SND_SOC_DAPM_OUTPUT(wname) \
|
||||
{ .id = snd_soc_dapm_output, .name = wname, .kcontrols = NULL, \
|
||||
{ .id = snd_soc_dapm_output, .name = wname, .kcontrol_news = NULL, \
|
||||
.num_kcontrols = 0, .reg = SND_SOC_NOPM }
|
||||
#define SND_SOC_DAPM_MIC(wname, wevent) \
|
||||
{ .id = snd_soc_dapm_mic, .name = wname, .kcontrols = NULL, \
|
||||
{ .id = snd_soc_dapm_mic, .name = wname, .kcontrol_news = NULL, \
|
||||
.num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \
|
||||
.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD}
|
||||
#define SND_SOC_DAPM_HP(wname, wevent) \
|
||||
{ .id = snd_soc_dapm_hp, .name = wname, .kcontrols = NULL, \
|
||||
{ .id = snd_soc_dapm_hp, .name = wname, .kcontrol_news = NULL, \
|
||||
.num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \
|
||||
.event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD}
|
||||
#define SND_SOC_DAPM_SPK(wname, wevent) \
|
||||
{ .id = snd_soc_dapm_spk, .name = wname, .kcontrols = NULL, \
|
||||
{ .id = snd_soc_dapm_spk, .name = wname, .kcontrol_news = NULL, \
|
||||
.num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \
|
||||
.event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD}
|
||||
#define SND_SOC_DAPM_LINE(wname, wevent) \
|
||||
{ .id = snd_soc_dapm_line, .name = wname, .kcontrols = NULL, \
|
||||
{ .id = snd_soc_dapm_line, .name = wname, .kcontrol_news = NULL, \
|
||||
.num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \
|
||||
.event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD}
|
||||
|
||||
@@ -70,91 +70,91 @@
|
||||
#define SND_SOC_DAPM_PGA(wname, wreg, wshift, winvert,\
|
||||
wcontrols, wncontrols) \
|
||||
{ .id = snd_soc_dapm_pga, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols}
|
||||
.invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = wncontrols}
|
||||
#define SND_SOC_DAPM_OUT_DRV(wname, wreg, wshift, winvert,\
|
||||
wcontrols, wncontrols) \
|
||||
{ .id = snd_soc_dapm_out_drv, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols}
|
||||
.invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = wncontrols}
|
||||
#define SND_SOC_DAPM_MIXER(wname, wreg, wshift, winvert, \
|
||||
wcontrols, wncontrols)\
|
||||
{ .id = snd_soc_dapm_mixer, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols}
|
||||
.invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = wncontrols}
|
||||
#define SND_SOC_DAPM_MIXER_NAMED_CTL(wname, wreg, wshift, winvert, \
|
||||
wcontrols, wncontrols)\
|
||||
{ .id = snd_soc_dapm_mixer_named_ctl, .name = wname, .reg = wreg, \
|
||||
.shift = wshift, .invert = winvert, .kcontrols = wcontrols, \
|
||||
.shift = wshift, .invert = winvert, .kcontrol_news = wcontrols, \
|
||||
.num_kcontrols = wncontrols}
|
||||
#define SND_SOC_DAPM_MICBIAS(wname, wreg, wshift, winvert) \
|
||||
{ .id = snd_soc_dapm_micbias, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = NULL, .num_kcontrols = 0}
|
||||
.invert = winvert, .kcontrol_news = NULL, .num_kcontrols = 0}
|
||||
#define SND_SOC_DAPM_SWITCH(wname, wreg, wshift, winvert, wcontrols) \
|
||||
{ .id = snd_soc_dapm_switch, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1}
|
||||
.invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = 1}
|
||||
#define SND_SOC_DAPM_MUX(wname, wreg, wshift, winvert, wcontrols) \
|
||||
{ .id = snd_soc_dapm_mux, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1}
|
||||
.invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = 1}
|
||||
#define SND_SOC_DAPM_VIRT_MUX(wname, wreg, wshift, winvert, wcontrols) \
|
||||
{ .id = snd_soc_dapm_virt_mux, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1}
|
||||
.invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = 1}
|
||||
#define SND_SOC_DAPM_VALUE_MUX(wname, wreg, wshift, winvert, wcontrols) \
|
||||
{ .id = snd_soc_dapm_value_mux, .name = wname, .reg = wreg, \
|
||||
.shift = wshift, .invert = winvert, .kcontrols = wcontrols, \
|
||||
.shift = wshift, .invert = winvert, .kcontrol_news = wcontrols, \
|
||||
.num_kcontrols = 1}
|
||||
|
||||
/* Simplified versions of above macros, assuming wncontrols = ARRAY_SIZE(wcontrols) */
|
||||
#define SOC_PGA_ARRAY(wname, wreg, wshift, winvert,\
|
||||
wcontrols) \
|
||||
{ .id = snd_soc_dapm_pga, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = ARRAY_SIZE(wcontrols)}
|
||||
.invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = ARRAY_SIZE(wcontrols)}
|
||||
#define SOC_MIXER_ARRAY(wname, wreg, wshift, winvert, \
|
||||
wcontrols)\
|
||||
{ .id = snd_soc_dapm_mixer, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = ARRAY_SIZE(wcontrols)}
|
||||
.invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = ARRAY_SIZE(wcontrols)}
|
||||
#define SOC_MIXER_NAMED_CTL_ARRAY(wname, wreg, wshift, winvert, \
|
||||
wcontrols)\
|
||||
{ .id = snd_soc_dapm_mixer_named_ctl, .name = wname, .reg = wreg, \
|
||||
.shift = wshift, .invert = winvert, .kcontrols = wcontrols, \
|
||||
.shift = wshift, .invert = winvert, .kcontrol_news = wcontrols, \
|
||||
.num_kcontrols = ARRAY_SIZE(wcontrols)}
|
||||
|
||||
/* path domain with event - event handler must return 0 for success */
|
||||
#define SND_SOC_DAPM_PGA_E(wname, wreg, wshift, winvert, wcontrols, \
|
||||
wncontrols, wevent, wflags) \
|
||||
{ .id = snd_soc_dapm_pga, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols, \
|
||||
.invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = wncontrols, \
|
||||
.event = wevent, .event_flags = wflags}
|
||||
#define SND_SOC_DAPM_OUT_DRV_E(wname, wreg, wshift, winvert, wcontrols, \
|
||||
wncontrols, wevent, wflags) \
|
||||
{ .id = snd_soc_dapm_out_drv, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols, \
|
||||
.invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = wncontrols, \
|
||||
.event = wevent, .event_flags = wflags}
|
||||
#define SND_SOC_DAPM_MIXER_E(wname, wreg, wshift, winvert, wcontrols, \
|
||||
wncontrols, wevent, wflags) \
|
||||
{ .id = snd_soc_dapm_mixer, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols, \
|
||||
.invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = wncontrols, \
|
||||
.event = wevent, .event_flags = wflags}
|
||||
#define SND_SOC_DAPM_MIXER_NAMED_CTL_E(wname, wreg, wshift, winvert, \
|
||||
wcontrols, wncontrols, wevent, wflags) \
|
||||
{ .id = snd_soc_dapm_mixer, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, \
|
||||
.invert = winvert, .kcontrol_news = wcontrols, \
|
||||
.num_kcontrols = wncontrols, .event = wevent, .event_flags = wflags}
|
||||
#define SND_SOC_DAPM_MICBIAS_E(wname, wreg, wshift, winvert, wevent, wflags) \
|
||||
{ .id = snd_soc_dapm_micbias, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = NULL, .num_kcontrols = 0, \
|
||||
.invert = winvert, .kcontrol_news = NULL, .num_kcontrols = 0, \
|
||||
.event = wevent, .event_flags = wflags}
|
||||
#define SND_SOC_DAPM_SWITCH_E(wname, wreg, wshift, winvert, wcontrols, \
|
||||
wevent, wflags) \
|
||||
{ .id = snd_soc_dapm_switch, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1, \
|
||||
.invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = 1, \
|
||||
.event = wevent, .event_flags = wflags}
|
||||
#define SND_SOC_DAPM_MUX_E(wname, wreg, wshift, winvert, wcontrols, \
|
||||
wevent, wflags) \
|
||||
{ .id = snd_soc_dapm_mux, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1, \
|
||||
.invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = 1, \
|
||||
.event = wevent, .event_flags = wflags}
|
||||
#define SND_SOC_DAPM_VIRT_MUX_E(wname, wreg, wshift, winvert, wcontrols, \
|
||||
wevent, wflags) \
|
||||
{ .id = snd_soc_dapm_virt_mux, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1, \
|
||||
.invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = 1, \
|
||||
.event = wevent, .event_flags = wflags}
|
||||
|
||||
/* additional sequencing control within an event type */
|
||||
@@ -173,26 +173,26 @@
|
||||
#define SOC_PGA_E_ARRAY(wname, wreg, wshift, winvert, wcontrols, \
|
||||
wevent, wflags) \
|
||||
{ .id = snd_soc_dapm_pga, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = ARRAY_SIZE(wcontrols), \
|
||||
.invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = ARRAY_SIZE(wcontrols), \
|
||||
.event = wevent, .event_flags = wflags}
|
||||
#define SOC_MIXER_E_ARRAY(wname, wreg, wshift, winvert, wcontrols, \
|
||||
wevent, wflags) \
|
||||
{ .id = snd_soc_dapm_mixer, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = ARRAY_SIZE(wcontrols), \
|
||||
.invert = winvert, .kcontrol_news = wcontrols, .num_kcontrols = ARRAY_SIZE(wcontrols), \
|
||||
.event = wevent, .event_flags = wflags}
|
||||
#define SOC_MIXER_NAMED_CTL_E_ARRAY(wname, wreg, wshift, winvert, \
|
||||
wcontrols, wevent, wflags) \
|
||||
{ .id = snd_soc_dapm_mixer, .name = wname, .reg = wreg, .shift = wshift, \
|
||||
.invert = winvert, .kcontrols = wcontrols, \
|
||||
.invert = winvert, .kcontrol_news = wcontrols, \
|
||||
.num_kcontrols = ARRAY_SIZE(wcontrols), .event = wevent, .event_flags = wflags}
|
||||
|
||||
/* events that are pre and post DAPM */
|
||||
#define SND_SOC_DAPM_PRE(wname, wevent) \
|
||||
{ .id = snd_soc_dapm_pre, .name = wname, .kcontrols = NULL, \
|
||||
{ .id = snd_soc_dapm_pre, .name = wname, .kcontrol_news = NULL, \
|
||||
.num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \
|
||||
.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD}
|
||||
#define SND_SOC_DAPM_POST(wname, wevent) \
|
||||
{ .id = snd_soc_dapm_post, .name = wname, .kcontrols = NULL, \
|
||||
{ .id = snd_soc_dapm_post, .name = wname, .kcontrol_news = NULL, \
|
||||
.num_kcontrols = 0, .reg = SND_SOC_NOPM, .event = wevent, \
|
||||
.event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD}
|
||||
|
||||
@@ -232,7 +232,7 @@
|
||||
|
||||
/* generic widgets */
|
||||
#define SND_SOC_DAPM_REG(wid, wname, wreg, wshift, wmask, won_val, woff_val) \
|
||||
{ .id = wid, .name = wname, .kcontrols = NULL, .num_kcontrols = 0, \
|
||||
{ .id = wid, .name = wname, .kcontrol_news = NULL, .num_kcontrols = 0, \
|
||||
.reg = -((wreg) + 1), .shift = wshift, .mask = wmask, \
|
||||
.on_val = won_val, .off_val = woff_val, .event = dapm_reg_event, \
|
||||
.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD}
|
||||
@@ -356,7 +356,8 @@ void snd_soc_dapm_shutdown(struct snd_soc_card *card);
|
||||
|
||||
/* dapm sys fs - used by the core */
|
||||
int snd_soc_dapm_sys_add(struct device *dev);
|
||||
void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm);
|
||||
void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm,
|
||||
struct dentry *parent);
|
||||
|
||||
/* dapm audio pin control and status */
|
||||
int snd_soc_dapm_enable_pin(struct snd_soc_dapm_context *dapm,
|
||||
@@ -472,7 +473,8 @@ struct snd_soc_dapm_widget {
|
||||
|
||||
/* kcontrols that relate to this widget */
|
||||
int num_kcontrols;
|
||||
const struct snd_kcontrol_new *kcontrols;
|
||||
const struct snd_kcontrol_new *kcontrol_news;
|
||||
struct snd_kcontrol **kcontrols;
|
||||
|
||||
/* widget input and outputs */
|
||||
struct list_head sources;
|
||||
@@ -516,4 +518,10 @@ struct snd_soc_dapm_context {
|
||||
#endif
|
||||
};
|
||||
|
||||
/* A list of widgets associated with an object, typically a snd_kcontrol */
|
||||
struct snd_soc_dapm_widget_list {
|
||||
int num_widgets;
|
||||
struct snd_soc_dapm_widget *widgets[0];
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
+27
-5
@@ -248,7 +248,7 @@ typedef int (*hw_write_t)(void *,const char* ,int);
|
||||
extern struct snd_ac97_bus_ops soc_ac97_ops;
|
||||
|
||||
enum snd_soc_control_type {
|
||||
SND_SOC_CUSTOM,
|
||||
SND_SOC_CUSTOM = 1,
|
||||
SND_SOC_I2C,
|
||||
SND_SOC_SPI,
|
||||
};
|
||||
@@ -278,6 +278,10 @@ int snd_soc_register_codec(struct device *dev,
|
||||
void snd_soc_unregister_codec(struct device *dev);
|
||||
int snd_soc_codec_volatile_register(struct snd_soc_codec *codec,
|
||||
unsigned int reg);
|
||||
int snd_soc_codec_readable_register(struct snd_soc_codec *codec,
|
||||
unsigned int reg);
|
||||
int snd_soc_codec_writable_register(struct snd_soc_codec *codec,
|
||||
unsigned int reg);
|
||||
int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec,
|
||||
int addr_bits, int data_bits,
|
||||
enum snd_soc_control_type control);
|
||||
@@ -292,6 +296,8 @@ int snd_soc_default_volatile_register(struct snd_soc_codec *codec,
|
||||
unsigned int reg);
|
||||
int snd_soc_default_readable_register(struct snd_soc_codec *codec,
|
||||
unsigned int reg);
|
||||
int snd_soc_default_writable_register(struct snd_soc_codec *codec,
|
||||
unsigned int reg);
|
||||
|
||||
/* Utility functions to get clock rates from various things */
|
||||
int snd_soc_calc_frame_size(int sample_size, int channels, int tdm_slots);
|
||||
@@ -523,6 +529,7 @@ struct snd_soc_codec {
|
||||
size_t reg_size; /* reg_cache_size * reg_word_size */
|
||||
int (*volatile_register)(struct snd_soc_codec *, unsigned int);
|
||||
int (*readable_register)(struct snd_soc_codec *, unsigned int);
|
||||
int (*writable_register)(struct snd_soc_codec *, unsigned int);
|
||||
|
||||
/* runtime */
|
||||
struct snd_ac97 *ac97; /* for ad-hoc ac97 devices */
|
||||
@@ -539,10 +546,12 @@ struct snd_soc_codec {
|
||||
|
||||
/* codec IO */
|
||||
void *control_data; /* codec control (i2c/3wire) data */
|
||||
enum snd_soc_control_type control_type;
|
||||
hw_write_t hw_write;
|
||||
unsigned int (*hw_read)(struct snd_soc_codec *, unsigned int);
|
||||
unsigned int (*read)(struct snd_soc_codec *, unsigned int);
|
||||
int (*write)(struct snd_soc_codec *, unsigned int, unsigned int);
|
||||
int (*bulk_write_raw)(struct snd_soc_codec *, unsigned int, const void *, size_t);
|
||||
void *reg_cache;
|
||||
const void *reg_def_copy;
|
||||
const struct snd_soc_cache_ops *cache_ops;
|
||||
@@ -568,7 +577,9 @@ struct snd_soc_codec_driver {
|
||||
pm_message_t state);
|
||||
int (*resume)(struct snd_soc_codec *);
|
||||
|
||||
/* Default DAPM setup, added after probe() is run */
|
||||
/* Default control and setup, added after probe() is run */
|
||||
const struct snd_kcontrol_new *controls;
|
||||
int num_controls;
|
||||
const struct snd_soc_dapm_widget *dapm_widgets;
|
||||
int num_dapm_widgets;
|
||||
const struct snd_soc_dapm_route *dapm_routes;
|
||||
@@ -587,6 +598,7 @@ struct snd_soc_codec_driver {
|
||||
size_t, unsigned int);
|
||||
int (*volatile_register)(struct snd_soc_codec *, unsigned int);
|
||||
int (*readable_register)(struct snd_soc_codec *, unsigned int);
|
||||
int (*writable_register)(struct snd_soc_codec *, unsigned int);
|
||||
short reg_cache_size;
|
||||
short reg_cache_step;
|
||||
short reg_word_size;
|
||||
@@ -690,6 +702,8 @@ struct snd_soc_aux_dev {
|
||||
/* SoC card */
|
||||
struct snd_soc_card {
|
||||
const char *name;
|
||||
const char *long_name;
|
||||
const char *driver_name;
|
||||
struct device *dev;
|
||||
struct snd_card *snd_card;
|
||||
struct module *owner;
|
||||
@@ -737,12 +751,15 @@ struct snd_soc_card {
|
||||
struct snd_soc_pcm_runtime *rtd_aux;
|
||||
int num_aux_rtd;
|
||||
|
||||
const struct snd_kcontrol_new *controls;
|
||||
int num_controls;
|
||||
|
||||
/*
|
||||
* Card-specific routes and widgets.
|
||||
*/
|
||||
struct snd_soc_dapm_widget *dapm_widgets;
|
||||
const struct snd_soc_dapm_widget *dapm_widgets;
|
||||
int num_dapm_widgets;
|
||||
struct snd_soc_dapm_route *dapm_routes;
|
||||
const struct snd_soc_dapm_route *dapm_routes;
|
||||
int num_dapm_routes;
|
||||
|
||||
struct work_struct deferred_resume_work;
|
||||
@@ -805,7 +822,7 @@ struct soc_enum {
|
||||
unsigned char shift_r;
|
||||
unsigned int max;
|
||||
unsigned int mask;
|
||||
const char **texts;
|
||||
const char * const *texts;
|
||||
const unsigned int *values;
|
||||
void *dapm;
|
||||
};
|
||||
@@ -814,6 +831,8 @@ struct soc_enum {
|
||||
unsigned int snd_soc_read(struct snd_soc_codec *codec, unsigned int reg);
|
||||
unsigned int snd_soc_write(struct snd_soc_codec *codec,
|
||||
unsigned int reg, unsigned int val);
|
||||
unsigned int snd_soc_bulk_write_raw(struct snd_soc_codec *codec,
|
||||
unsigned int reg, const void *data, size_t len);
|
||||
|
||||
/* device driver data */
|
||||
|
||||
@@ -871,6 +890,9 @@ static inline void snd_soc_initialize_card_lists(struct snd_soc_card *card)
|
||||
INIT_LIST_HEAD(&card->dapm_list);
|
||||
}
|
||||
|
||||
int snd_soc_util_init(void);
|
||||
void snd_soc_util_exit(void);
|
||||
|
||||
#include <sound/soc-dai.h>
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
|
||||
@@ -26,29 +26,37 @@
|
||||
#include <media/v4l2-dev.h>
|
||||
#include <media/v4l2-ioctl.h>
|
||||
|
||||
#define TEA575X_FMIF 10700
|
||||
|
||||
#define TEA575X_DATA (1 << 0)
|
||||
#define TEA575X_CLK (1 << 1)
|
||||
#define TEA575X_WREN (1 << 2)
|
||||
#define TEA575X_MOST (1 << 3)
|
||||
|
||||
struct snd_tea575x;
|
||||
|
||||
struct snd_tea575x_ops {
|
||||
void (*write)(struct snd_tea575x *tea, unsigned int val);
|
||||
unsigned int (*read)(struct snd_tea575x *tea);
|
||||
void (*mute)(struct snd_tea575x *tea, unsigned int mute);
|
||||
void (*set_pins)(struct snd_tea575x *tea, u8 pins);
|
||||
u8 (*get_pins)(struct snd_tea575x *tea);
|
||||
void (*set_direction)(struct snd_tea575x *tea, bool output);
|
||||
};
|
||||
|
||||
struct snd_tea575x {
|
||||
struct snd_card *card;
|
||||
struct video_device *vd; /* video device */
|
||||
int dev_nr; /* requested device number + 1 */
|
||||
int tea5759; /* 5759 chip is present */
|
||||
int mute; /* Device is muted? */
|
||||
unsigned int freq_fixup; /* crystal onboard */
|
||||
bool tea5759; /* 5759 chip is present */
|
||||
bool mute; /* Device is muted? */
|
||||
bool stereo; /* receiving stereo */
|
||||
bool tuned; /* tuned to a station */
|
||||
unsigned int val; /* hw value */
|
||||
unsigned long freq; /* frequency */
|
||||
unsigned long in_use; /* set if the device is in use */
|
||||
struct snd_tea575x_ops *ops;
|
||||
void *private_data;
|
||||
u8 card[32];
|
||||
u8 bus_info[32];
|
||||
};
|
||||
|
||||
void snd_tea575x_init(struct snd_tea575x *tea);
|
||||
int snd_tea575x_init(struct snd_tea575x *tea);
|
||||
void snd_tea575x_exit(struct snd_tea575x *tea);
|
||||
|
||||
#endif /* __SOUND_TEA575X_TUNER_H */
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Platform header for Texas Instruments TLV320DAC33 codec driver
|
||||
*
|
||||
* Author: Peter Ujfalusi <peter.ujfalusi@nokia.com>
|
||||
* Author: Peter Ujfalusi <peter.ujfalusi@ti.com>
|
||||
*
|
||||
* Copyright: (C) 2009 Nokia Corporation
|
||||
*
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (C) Nokia Corporation
|
||||
*
|
||||
* Written by Peter Ujfalusi <peter.ujfalusi@nokia.com>
|
||||
* Author: Peter Ujfalusi <peter.ujfalusi@ti.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user