forked from luck/tmp_suning_uos_patched
Merge branch 'work'
This commit is contained in:
commit
d04ae27bae
@ -33,7 +33,7 @@
|
|||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/cdev.h>
|
#include <linux/cdev.h>
|
||||||
|
#include <linux/mutex.h>
|
||||||
#include "dvbdev.h"
|
#include "dvbdev.h"
|
||||||
|
|
||||||
static int dvbdev_debug;
|
static int dvbdev_debug;
|
||||||
@ -44,7 +44,7 @@ MODULE_PARM_DESC(dvbdev_debug, "Turn on/off device debugging (default:off).");
|
|||||||
#define dprintk if (dvbdev_debug) printk
|
#define dprintk if (dvbdev_debug) printk
|
||||||
|
|
||||||
static LIST_HEAD(dvb_adapter_list);
|
static LIST_HEAD(dvb_adapter_list);
|
||||||
static DECLARE_MUTEX(dvbdev_register_lock);
|
static DEFINE_MUTEX(dvbdev_register_lock);
|
||||||
|
|
||||||
static const char * const dnames[] = {
|
static const char * const dnames[] = {
|
||||||
"video", "audio", "sec", "frontend", "demux", "dvr", "ca",
|
"video", "audio", "sec", "frontend", "demux", "dvr", "ca",
|
||||||
@ -202,11 +202,11 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
|||||||
struct dvb_device *dvbdev;
|
struct dvb_device *dvbdev;
|
||||||
int id;
|
int id;
|
||||||
|
|
||||||
if (down_interruptible (&dvbdev_register_lock))
|
if (mutex_lock_interruptible(&dvbdev_register_lock))
|
||||||
return -ERESTARTSYS;
|
return -ERESTARTSYS;
|
||||||
|
|
||||||
if ((id = dvbdev_get_free_id (adap, type)) < 0) {
|
if ((id = dvbdev_get_free_id (adap, type)) < 0) {
|
||||||
up (&dvbdev_register_lock);
|
mutex_unlock(&dvbdev_register_lock);
|
||||||
*pdvbdev = NULL;
|
*pdvbdev = NULL;
|
||||||
printk ("%s: could get find free device id...\n", __FUNCTION__);
|
printk ("%s: could get find free device id...\n", __FUNCTION__);
|
||||||
return -ENFILE;
|
return -ENFILE;
|
||||||
@ -215,11 +215,11 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
|||||||
*pdvbdev = dvbdev = kmalloc(sizeof(struct dvb_device), GFP_KERNEL);
|
*pdvbdev = dvbdev = kmalloc(sizeof(struct dvb_device), GFP_KERNEL);
|
||||||
|
|
||||||
if (!dvbdev) {
|
if (!dvbdev) {
|
||||||
up(&dvbdev_register_lock);
|
mutex_unlock(&dvbdev_register_lock);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
up (&dvbdev_register_lock);
|
mutex_unlock(&dvbdev_register_lock);
|
||||||
|
|
||||||
memcpy(dvbdev, template, sizeof(struct dvb_device));
|
memcpy(dvbdev, template, sizeof(struct dvb_device));
|
||||||
dvbdev->type = type;
|
dvbdev->type = type;
|
||||||
@ -289,11 +289,11 @@ int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct modu
|
|||||||
{
|
{
|
||||||
int num;
|
int num;
|
||||||
|
|
||||||
if (down_interruptible (&dvbdev_register_lock))
|
if (mutex_lock_interruptible(&dvbdev_register_lock))
|
||||||
return -ERESTARTSYS;
|
return -ERESTARTSYS;
|
||||||
|
|
||||||
if ((num = dvbdev_get_free_adapter_num ()) < 0) {
|
if ((num = dvbdev_get_free_adapter_num ()) < 0) {
|
||||||
up (&dvbdev_register_lock);
|
mutex_unlock(&dvbdev_register_lock);
|
||||||
return -ENFILE;
|
return -ENFILE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -309,7 +309,7 @@ int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct modu
|
|||||||
|
|
||||||
list_add_tail (&adap->list_head, &dvb_adapter_list);
|
list_add_tail (&adap->list_head, &dvb_adapter_list);
|
||||||
|
|
||||||
up (&dvbdev_register_lock);
|
mutex_unlock(&dvbdev_register_lock);
|
||||||
|
|
||||||
return num;
|
return num;
|
||||||
}
|
}
|
||||||
@ -320,10 +320,10 @@ int dvb_unregister_adapter(struct dvb_adapter *adap)
|
|||||||
{
|
{
|
||||||
devfs_remove("dvb/adapter%d", adap->num);
|
devfs_remove("dvb/adapter%d", adap->num);
|
||||||
|
|
||||||
if (down_interruptible (&dvbdev_register_lock))
|
if (mutex_lock_interruptible(&dvbdev_register_lock))
|
||||||
return -ERESTARTSYS;
|
return -ERESTARTSYS;
|
||||||
list_del (&adap->list_head);
|
list_del (&adap->list_head);
|
||||||
up (&dvbdev_register_lock);
|
mutex_unlock(&dvbdev_register_lock);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(dvb_unregister_adapter);
|
EXPORT_SYMBOL(dvb_unregister_adapter);
|
||||||
|
@ -146,52 +146,52 @@ static int load_dram(struct av7110 *av7110, u32 *data, int len)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int blocks, rest;
|
int blocks, rest;
|
||||||
u32 base, bootblock = BOOT_BLOCK;
|
u32 base, bootblock = AV7110_BOOT_BLOCK;
|
||||||
|
|
||||||
dprintk(4, "%p\n", av7110);
|
dprintk(4, "%p\n", av7110);
|
||||||
|
|
||||||
blocks = len / BOOT_MAX_SIZE;
|
blocks = len / AV7110_BOOT_MAX_SIZE;
|
||||||
rest = len % BOOT_MAX_SIZE;
|
rest = len % AV7110_BOOT_MAX_SIZE;
|
||||||
base = DRAM_START_CODE;
|
base = DRAM_START_CODE;
|
||||||
|
|
||||||
for (i = 0; i < blocks; i++) {
|
for (i = 0; i < blocks; i++) {
|
||||||
if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) {
|
if (waitdebi(av7110, AV7110_BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) {
|
||||||
printk(KERN_ERR "dvb-ttpci: load_dram(): timeout at block %d\n", i);
|
printk(KERN_ERR "dvb-ttpci: load_dram(): timeout at block %d\n", i);
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
dprintk(4, "writing DRAM block %d\n", i);
|
dprintk(4, "writing DRAM block %d\n", i);
|
||||||
mwdebi(av7110, DEBISWAB, bootblock,
|
mwdebi(av7110, DEBISWAB, bootblock,
|
||||||
((char*)data) + i * BOOT_MAX_SIZE, BOOT_MAX_SIZE);
|
((char*)data) + i * AV7110_BOOT_MAX_SIZE, AV7110_BOOT_MAX_SIZE);
|
||||||
bootblock ^= 0x1400;
|
bootblock ^= 0x1400;
|
||||||
iwdebi(av7110, DEBISWAB, BOOT_BASE, swab32(base), 4);
|
iwdebi(av7110, DEBISWAB, AV7110_BOOT_BASE, swab32(base), 4);
|
||||||
iwdebi(av7110, DEBINOSWAP, BOOT_SIZE, BOOT_MAX_SIZE, 2);
|
iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_SIZE, AV7110_BOOT_MAX_SIZE, 2);
|
||||||
iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
|
iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
|
||||||
base += BOOT_MAX_SIZE;
|
base += AV7110_BOOT_MAX_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rest > 0) {
|
if (rest > 0) {
|
||||||
if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) {
|
if (waitdebi(av7110, AV7110_BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) {
|
||||||
printk(KERN_ERR "dvb-ttpci: load_dram(): timeout at last block\n");
|
printk(KERN_ERR "dvb-ttpci: load_dram(): timeout at last block\n");
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
if (rest > 4)
|
if (rest > 4)
|
||||||
mwdebi(av7110, DEBISWAB, bootblock,
|
mwdebi(av7110, DEBISWAB, bootblock,
|
||||||
((char*)data) + i * BOOT_MAX_SIZE, rest);
|
((char*)data) + i * AV7110_BOOT_MAX_SIZE, rest);
|
||||||
else
|
else
|
||||||
mwdebi(av7110, DEBISWAB, bootblock,
|
mwdebi(av7110, DEBISWAB, bootblock,
|
||||||
((char*)data) + i * BOOT_MAX_SIZE - 4, rest + 4);
|
((char*)data) + i * AV7110_BOOT_MAX_SIZE - 4, rest + 4);
|
||||||
|
|
||||||
iwdebi(av7110, DEBISWAB, BOOT_BASE, swab32(base), 4);
|
iwdebi(av7110, DEBISWAB, AV7110_BOOT_BASE, swab32(base), 4);
|
||||||
iwdebi(av7110, DEBINOSWAP, BOOT_SIZE, rest, 2);
|
iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_SIZE, rest, 2);
|
||||||
iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
|
iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
|
||||||
}
|
}
|
||||||
if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) {
|
if (waitdebi(av7110, AV7110_BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) {
|
||||||
printk(KERN_ERR "dvb-ttpci: load_dram(): timeout after last block\n");
|
printk(KERN_ERR "dvb-ttpci: load_dram(): timeout after last block\n");
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
iwdebi(av7110, DEBINOSWAP, BOOT_SIZE, 0, 2);
|
iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_SIZE, 0, 2);
|
||||||
iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
|
iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
|
||||||
if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BOOT_COMPLETE) < 0) {
|
if (waitdebi(av7110, AV7110_BOOT_STATE, BOOTSTATE_AV7110_BOOT_COMPLETE) < 0) {
|
||||||
printk(KERN_ERR "dvb-ttpci: load_dram(): final handshake timeout\n");
|
printk(KERN_ERR "dvb-ttpci: load_dram(): final handshake timeout\n");
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
@ -262,7 +262,7 @@ int av7110_bootarm(struct av7110 *av7110)
|
|||||||
//saa7146_setgpio(dev, 3, SAA7146_GPIO_INPUT);
|
//saa7146_setgpio(dev, 3, SAA7146_GPIO_INPUT);
|
||||||
|
|
||||||
mwdebi(av7110, DEBISWAB, DPRAM_BASE, bootcode, sizeof(bootcode));
|
mwdebi(av7110, DEBISWAB, DPRAM_BASE, bootcode, sizeof(bootcode));
|
||||||
iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
|
iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
|
||||||
|
|
||||||
if (saa7146_wait_for_debi_done(av7110->dev, 1)) {
|
if (saa7146_wait_for_debi_done(av7110->dev, 1)) {
|
||||||
printk(KERN_ERR "dvb-ttpci: av7110_bootarm(): "
|
printk(KERN_ERR "dvb-ttpci: av7110_bootarm(): "
|
||||||
|
@ -18,7 +18,7 @@ enum av7110_bootstate
|
|||||||
{
|
{
|
||||||
BOOTSTATE_BUFFER_EMPTY = 0,
|
BOOTSTATE_BUFFER_EMPTY = 0,
|
||||||
BOOTSTATE_BUFFER_FULL = 1,
|
BOOTSTATE_BUFFER_FULL = 1,
|
||||||
BOOTSTATE_BOOT_COMPLETE = 2
|
BOOTSTATE_AV7110_BOOT_COMPLETE = 2
|
||||||
};
|
};
|
||||||
|
|
||||||
enum av7110_type_rec_play_format
|
enum av7110_type_rec_play_format
|
||||||
@ -295,11 +295,11 @@ enum av7110_command_type {
|
|||||||
#define DPRAM_BASE 0x4000
|
#define DPRAM_BASE 0x4000
|
||||||
|
|
||||||
/* boot protocol area */
|
/* boot protocol area */
|
||||||
#define BOOT_STATE (DPRAM_BASE + 0x3F8)
|
#define AV7110_BOOT_STATE (DPRAM_BASE + 0x3F8)
|
||||||
#define BOOT_SIZE (DPRAM_BASE + 0x3FA)
|
#define AV7110_BOOT_SIZE (DPRAM_BASE + 0x3FA)
|
||||||
#define BOOT_BASE (DPRAM_BASE + 0x3FC)
|
#define AV7110_BOOT_BASE (DPRAM_BASE + 0x3FC)
|
||||||
#define BOOT_BLOCK (DPRAM_BASE + 0x400)
|
#define AV7110_BOOT_BLOCK (DPRAM_BASE + 0x400)
|
||||||
#define BOOT_MAX_SIZE 0xc00
|
#define AV7110_BOOT_MAX_SIZE 0xc00
|
||||||
|
|
||||||
/* firmware command protocol area */
|
/* firmware command protocol area */
|
||||||
#define IRQ_STATE (DPRAM_BASE + 0x0F4)
|
#define IRQ_STATE (DPRAM_BASE + 0x0F4)
|
||||||
|
@ -43,7 +43,7 @@ MODULE_LICENSE("GPL");
|
|||||||
static unsigned short normal_i2c[] = { 0x88 >> 1, I2C_CLIENT_END };
|
static unsigned short normal_i2c[] = { 0x88 >> 1, I2C_CLIENT_END };
|
||||||
|
|
||||||
|
|
||||||
int cx25840_debug;
|
static int cx25840_debug;
|
||||||
|
|
||||||
module_param_named(debug,cx25840_debug, int, 0644);
|
module_param_named(debug,cx25840_debug, int, 0644);
|
||||||
|
|
||||||
|
@ -31,8 +31,7 @@ config VIDEO_CX88_DVB
|
|||||||
|
|
||||||
config VIDEO_CX88_ALSA
|
config VIDEO_CX88_ALSA
|
||||||
tristate "ALSA DMA audio support"
|
tristate "ALSA DMA audio support"
|
||||||
depends on VIDEO_CX88 && SND
|
depends on VIDEO_CX88 && SND && EXPERIMENTAL
|
||||||
select SND_PCM_OSS
|
|
||||||
---help---
|
---help---
|
||||||
This is a video4linux driver for direct (DMA) audio on
|
This is a video4linux driver for direct (DMA) audio on
|
||||||
Conexant 2388x based TV cards.
|
Conexant 2388x based TV cards.
|
||||||
|
@ -805,7 +805,6 @@ static struct pci_driver cx88_audio_pci_driver = {
|
|||||||
.id_table = cx88_audio_pci_tbl,
|
.id_table = cx88_audio_pci_tbl,
|
||||||
.probe = cx88_audio_initdev,
|
.probe = cx88_audio_initdev,
|
||||||
.remove = cx88_audio_finidev,
|
.remove = cx88_audio_finidev,
|
||||||
SND_PCI_PM_CALLBACKS
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/videodev2.h>
|
#include <linux/videodev2.h>
|
||||||
|
#include <linux/mutex.h>
|
||||||
|
|
||||||
#include "cx88.h"
|
#include "cx88.h"
|
||||||
#include <media/v4l2-common.h>
|
#include <media/v4l2-common.h>
|
||||||
@ -75,7 +76,7 @@ MODULE_PARM_DESC(nocomb,"disable comb filter");
|
|||||||
|
|
||||||
static unsigned int cx88_devcount;
|
static unsigned int cx88_devcount;
|
||||||
static LIST_HEAD(cx88_devlist);
|
static LIST_HEAD(cx88_devlist);
|
||||||
static DECLARE_MUTEX(devlist);
|
static DEFINE_MUTEX(devlist);
|
||||||
|
|
||||||
#define NO_SYNC_LINE (-1U)
|
#define NO_SYNC_LINE (-1U)
|
||||||
|
|
||||||
@ -1036,7 +1037,7 @@ struct cx88_core* cx88_core_get(struct pci_dev *pci)
|
|||||||
struct list_head *item;
|
struct list_head *item;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
down(&devlist);
|
mutex_lock(&devlist);
|
||||||
list_for_each(item,&cx88_devlist) {
|
list_for_each(item,&cx88_devlist) {
|
||||||
core = list_entry(item, struct cx88_core, devlist);
|
core = list_entry(item, struct cx88_core, devlist);
|
||||||
if (pci->bus->number != core->pci_bus)
|
if (pci->bus->number != core->pci_bus)
|
||||||
@ -1047,7 +1048,7 @@ struct cx88_core* cx88_core_get(struct pci_dev *pci)
|
|||||||
if (0 != get_ressources(core,pci))
|
if (0 != get_ressources(core,pci))
|
||||||
goto fail_unlock;
|
goto fail_unlock;
|
||||||
atomic_inc(&core->refcount);
|
atomic_inc(&core->refcount);
|
||||||
up(&devlist);
|
mutex_unlock(&devlist);
|
||||||
return core;
|
return core;
|
||||||
}
|
}
|
||||||
core = kzalloc(sizeof(*core),GFP_KERNEL);
|
core = kzalloc(sizeof(*core),GFP_KERNEL);
|
||||||
@ -1122,13 +1123,13 @@ struct cx88_core* cx88_core_get(struct pci_dev *pci)
|
|||||||
cx88_card_setup(core);
|
cx88_card_setup(core);
|
||||||
cx88_ir_init(core,pci);
|
cx88_ir_init(core,pci);
|
||||||
|
|
||||||
up(&devlist);
|
mutex_unlock(&devlist);
|
||||||
return core;
|
return core;
|
||||||
|
|
||||||
fail_free:
|
fail_free:
|
||||||
kfree(core);
|
kfree(core);
|
||||||
fail_unlock:
|
fail_unlock:
|
||||||
up(&devlist);
|
mutex_unlock(&devlist);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1140,14 +1141,14 @@ void cx88_core_put(struct cx88_core *core, struct pci_dev *pci)
|
|||||||
if (!atomic_dec_and_test(&core->refcount))
|
if (!atomic_dec_and_test(&core->refcount))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
down(&devlist);
|
mutex_lock(&devlist);
|
||||||
cx88_ir_fini(core);
|
cx88_ir_fini(core);
|
||||||
if (0 == core->i2c_rc)
|
if (0 == core->i2c_rc)
|
||||||
i2c_bit_del_bus(&core->i2c_adap);
|
i2c_bit_del_bus(&core->i2c_adap);
|
||||||
list_del(&core->devlist);
|
list_del(&core->devlist);
|
||||||
iounmap(core->lmmio);
|
iounmap(core->lmmio);
|
||||||
cx88_devcount--;
|
cx88_devcount--;
|
||||||
up(&devlist);
|
mutex_unlock(&devlist);
|
||||||
kfree(core);
|
kfree(core);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,6 +60,11 @@ static unsigned int audio_debug = 0;
|
|||||||
module_param(audio_debug, int, 0644);
|
module_param(audio_debug, int, 0644);
|
||||||
MODULE_PARM_DESC(audio_debug, "enable debug messages [audio]");
|
MODULE_PARM_DESC(audio_debug, "enable debug messages [audio]");
|
||||||
|
|
||||||
|
static unsigned int always_analog = 0;
|
||||||
|
module_param(always_analog,int,0644);
|
||||||
|
MODULE_PARM_DESC(always_analog,"force analog audio out");
|
||||||
|
|
||||||
|
|
||||||
#define dprintk(fmt, arg...) if (audio_debug) \
|
#define dprintk(fmt, arg...) if (audio_debug) \
|
||||||
printk(KERN_DEBUG "%s/0: " fmt, core->name , ## arg)
|
printk(KERN_DEBUG "%s/0: " fmt, core->name , ## arg)
|
||||||
|
|
||||||
@ -155,7 +160,8 @@ static void set_audio_finish(struct cx88_core *core, u32 ctl)
|
|||||||
cx_write(AUD_I2SOUTPUTCNTL, 1);
|
cx_write(AUD_I2SOUTPUTCNTL, 1);
|
||||||
cx_write(AUD_I2SCNTL, 0);
|
cx_write(AUD_I2SCNTL, 0);
|
||||||
/* cx_write(AUD_APB_IN_RATE_ADJ, 0); */
|
/* cx_write(AUD_APB_IN_RATE_ADJ, 0); */
|
||||||
} else {
|
}
|
||||||
|
if ((always_analog) || (!cx88_boards[core->board].blackbird)) {
|
||||||
ctl |= EN_DAC_ENABLE;
|
ctl |= EN_DAC_ENABLE;
|
||||||
cx_write(AUD_CTL, ctl);
|
cx_write(AUD_CTL, ctl);
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#include <linux/i2c.h>
|
#include <linux/i2c.h>
|
||||||
#include <linux/version.h>
|
#include <linux/version.h>
|
||||||
#include <linux/video_decoder.h>
|
#include <linux/video_decoder.h>
|
||||||
|
#include <linux/mutex.h>
|
||||||
|
|
||||||
#include "em28xx.h"
|
#include "em28xx.h"
|
||||||
#include <media/tuner.h>
|
#include <media/tuner.h>
|
||||||
@ -191,7 +192,7 @@ static struct v4l2_queryctrl saa711x_qctrl[] = {
|
|||||||
|
|
||||||
static struct usb_driver em28xx_usb_driver;
|
static struct usb_driver em28xx_usb_driver;
|
||||||
|
|
||||||
static DECLARE_MUTEX(em28xx_sysfs_lock);
|
static DEFINE_MUTEX(em28xx_sysfs_lock);
|
||||||
static DECLARE_RWSEM(em28xx_disconnect);
|
static DECLARE_RWSEM(em28xx_disconnect);
|
||||||
|
|
||||||
/********************* v4l2 interface ******************************************/
|
/********************* v4l2 interface ******************************************/
|
||||||
@ -394,7 +395,7 @@ static int em28xx_v4l2_open(struct inode *inode, struct file *filp)
|
|||||||
*/
|
*/
|
||||||
static void em28xx_release_resources(struct em28xx *dev)
|
static void em28xx_release_resources(struct em28xx *dev)
|
||||||
{
|
{
|
||||||
down(&em28xx_sysfs_lock);
|
mutex_lock(&em28xx_sysfs_lock);
|
||||||
|
|
||||||
em28xx_info("V4L2 device /dev/video%d deregistered\n",
|
em28xx_info("V4L2 device /dev/video%d deregistered\n",
|
||||||
dev->vdev->minor);
|
dev->vdev->minor);
|
||||||
@ -403,7 +404,7 @@ static void em28xx_release_resources(struct em28xx *dev)
|
|||||||
/* video_unregister_device(dev->vbi_dev); */
|
/* video_unregister_device(dev->vbi_dev); */
|
||||||
em28xx_i2c_unregister(dev);
|
em28xx_i2c_unregister(dev);
|
||||||
usb_put_dev(dev->udev);
|
usb_put_dev(dev->udev);
|
||||||
up(&em28xx_sysfs_lock);
|
mutex_unlock(&em28xx_sysfs_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2515,6 +2515,7 @@ struct saa7134_board saa7134_boards[] = {
|
|||||||
.tuner_addr = ADDR_UNSET,
|
.tuner_addr = ADDR_UNSET,
|
||||||
.radio_addr = ADDR_UNSET,
|
.radio_addr = ADDR_UNSET,
|
||||||
.mpeg = SAA7134_MPEG_DVB,
|
.mpeg = SAA7134_MPEG_DVB,
|
||||||
|
.gpiomask = 1 << 21,
|
||||||
.inputs = {{
|
.inputs = {{
|
||||||
.name = name_tv,
|
.name = name_tv,
|
||||||
.vmux = 1,
|
.vmux = 1,
|
||||||
@ -2529,6 +2530,11 @@ struct saa7134_board saa7134_boards[] = {
|
|||||||
.vmux = 8,
|
.vmux = 8,
|
||||||
.amux = LINE1,
|
.amux = LINE1,
|
||||||
}},
|
}},
|
||||||
|
.radio = {
|
||||||
|
.name = name_radio,
|
||||||
|
.amux = TV,
|
||||||
|
.gpio = 0x0200000,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
[SAA7134_BOARD_MSI_TVATANYWHERE_PLUS] = {
|
[SAA7134_BOARD_MSI_TVATANYWHERE_PLUS] = {
|
||||||
.name = "MSI TV@Anywhere plus",
|
.name = "MSI TV@Anywhere plus",
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
#include <linux/sound.h>
|
#include <linux/sound.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
#include <linux/mutex.h>
|
||||||
|
|
||||||
#include "saa7134-reg.h"
|
#include "saa7134-reg.h"
|
||||||
#include "saa7134.h"
|
#include "saa7134.h"
|
||||||
@ -84,7 +85,7 @@ MODULE_PARM_DESC(radio_nr, "radio device number");
|
|||||||
MODULE_PARM_DESC(tuner, "tuner type");
|
MODULE_PARM_DESC(tuner, "tuner type");
|
||||||
MODULE_PARM_DESC(card, "card type");
|
MODULE_PARM_DESC(card, "card type");
|
||||||
|
|
||||||
static DECLARE_MUTEX(devlist_lock);
|
static DEFINE_MUTEX(devlist_lock);
|
||||||
LIST_HEAD(saa7134_devlist);
|
LIST_HEAD(saa7134_devlist);
|
||||||
static LIST_HEAD(mops_list);
|
static LIST_HEAD(mops_list);
|
||||||
static unsigned int saa7134_devcount;
|
static unsigned int saa7134_devcount;
|
||||||
@ -969,13 +970,13 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
|
|||||||
pci_set_drvdata(pci_dev,dev);
|
pci_set_drvdata(pci_dev,dev);
|
||||||
saa7134_devcount++;
|
saa7134_devcount++;
|
||||||
|
|
||||||
down(&devlist_lock);
|
mutex_lock(&devlist_lock);
|
||||||
list_for_each(item,&mops_list) {
|
list_for_each(item,&mops_list) {
|
||||||
mops = list_entry(item, struct saa7134_mpeg_ops, next);
|
mops = list_entry(item, struct saa7134_mpeg_ops, next);
|
||||||
mpeg_ops_attach(mops, dev);
|
mpeg_ops_attach(mops, dev);
|
||||||
}
|
}
|
||||||
list_add_tail(&dev->devlist,&saa7134_devlist);
|
list_add_tail(&dev->devlist,&saa7134_devlist);
|
||||||
up(&devlist_lock);
|
mutex_unlock(&devlist_lock);
|
||||||
|
|
||||||
/* check for signal */
|
/* check for signal */
|
||||||
saa7134_irq_video_intl(dev);
|
saa7134_irq_video_intl(dev);
|
||||||
@ -1031,13 +1032,13 @@ static void __devexit saa7134_finidev(struct pci_dev *pci_dev)
|
|||||||
saa7134_hwfini(dev);
|
saa7134_hwfini(dev);
|
||||||
|
|
||||||
/* unregister */
|
/* unregister */
|
||||||
down(&devlist_lock);
|
mutex_lock(&devlist_lock);
|
||||||
list_del(&dev->devlist);
|
list_del(&dev->devlist);
|
||||||
list_for_each(item,&mops_list) {
|
list_for_each(item,&mops_list) {
|
||||||
mops = list_entry(item, struct saa7134_mpeg_ops, next);
|
mops = list_entry(item, struct saa7134_mpeg_ops, next);
|
||||||
mpeg_ops_detach(mops, dev);
|
mpeg_ops_detach(mops, dev);
|
||||||
}
|
}
|
||||||
up(&devlist_lock);
|
mutex_unlock(&devlist_lock);
|
||||||
saa7134_devcount--;
|
saa7134_devcount--;
|
||||||
|
|
||||||
saa7134_i2c_unregister(dev);
|
saa7134_i2c_unregister(dev);
|
||||||
@ -1071,13 +1072,13 @@ int saa7134_ts_register(struct saa7134_mpeg_ops *ops)
|
|||||||
struct list_head *item;
|
struct list_head *item;
|
||||||
struct saa7134_dev *dev;
|
struct saa7134_dev *dev;
|
||||||
|
|
||||||
down(&devlist_lock);
|
mutex_lock(&devlist_lock);
|
||||||
list_for_each(item,&saa7134_devlist) {
|
list_for_each(item,&saa7134_devlist) {
|
||||||
dev = list_entry(item, struct saa7134_dev, devlist);
|
dev = list_entry(item, struct saa7134_dev, devlist);
|
||||||
mpeg_ops_attach(ops, dev);
|
mpeg_ops_attach(ops, dev);
|
||||||
}
|
}
|
||||||
list_add_tail(&ops->next,&mops_list);
|
list_add_tail(&ops->next,&mops_list);
|
||||||
up(&devlist_lock);
|
mutex_unlock(&devlist_lock);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1086,13 +1087,13 @@ void saa7134_ts_unregister(struct saa7134_mpeg_ops *ops)
|
|||||||
struct list_head *item;
|
struct list_head *item;
|
||||||
struct saa7134_dev *dev;
|
struct saa7134_dev *dev;
|
||||||
|
|
||||||
down(&devlist_lock);
|
mutex_lock(&devlist_lock);
|
||||||
list_del(&ops->next);
|
list_del(&ops->next);
|
||||||
list_for_each(item,&saa7134_devlist) {
|
list_for_each(item,&saa7134_devlist) {
|
||||||
dev = list_entry(item, struct saa7134_dev, devlist);
|
dev = list_entry(item, struct saa7134_dev, devlist);
|
||||||
mpeg_ops_detach(ops, dev);
|
mpeg_ops_detach(ops, dev);
|
||||||
}
|
}
|
||||||
up(&devlist_lock);
|
mutex_unlock(&devlist_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(saa7134_ts_register);
|
EXPORT_SYMBOL(saa7134_ts_register);
|
||||||
|
@ -180,8 +180,8 @@ static void tvaudio_init(struct saa7134_dev *dev)
|
|||||||
saa_writeb(SAA7134_AUDIO_CLOCK0, clock & 0xff);
|
saa_writeb(SAA7134_AUDIO_CLOCK0, clock & 0xff);
|
||||||
saa_writeb(SAA7134_AUDIO_CLOCK1, (clock >> 8) & 0xff);
|
saa_writeb(SAA7134_AUDIO_CLOCK1, (clock >> 8) & 0xff);
|
||||||
saa_writeb(SAA7134_AUDIO_CLOCK2, (clock >> 16) & 0xff);
|
saa_writeb(SAA7134_AUDIO_CLOCK2, (clock >> 16) & 0xff);
|
||||||
// frame locked audio was reported not to be reliable
|
/* frame locked audio is mandatory for NICAM */
|
||||||
saa_writeb(SAA7134_AUDIO_PLL_CTRL, 0x02);
|
saa_writeb(SAA7134_AUDIO_PLL_CTRL, 0x01);
|
||||||
|
|
||||||
saa_writeb(SAA7134_NICAM_ERROR_LOW, 0x14);
|
saa_writeb(SAA7134_NICAM_ERROR_LOW, 0x14);
|
||||||
saa_writeb(SAA7134_NICAM_ERROR_HIGH, 0x50);
|
saa_writeb(SAA7134_NICAM_ERROR_HIGH, 0x50);
|
||||||
@ -809,7 +809,12 @@ static int tvaudio_thread_ddep(void *data)
|
|||||||
dprintk("ddep override: %s\n",stdres[audio_ddep]);
|
dprintk("ddep override: %s\n",stdres[audio_ddep]);
|
||||||
} else if (&card(dev).radio == dev->input) {
|
} else if (&card(dev).radio == dev->input) {
|
||||||
dprintk("FM Radio\n");
|
dprintk("FM Radio\n");
|
||||||
norms = (0x0f << 2) | 0x01;
|
if (dev->tuner_type == TUNER_PHILIPS_TDA8290) {
|
||||||
|
norms = (0x11 << 2) | 0x01;
|
||||||
|
saa_dsp_writel(dev, 0x42c >> 2, 0x729555);
|
||||||
|
} else {
|
||||||
|
norms = (0x0f << 2) | 0x01;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/* (let chip) scan for sound carrier */
|
/* (let chip) scan for sound carrier */
|
||||||
norms = 0;
|
norms = 0;
|
||||||
|
@ -634,7 +634,7 @@ struct i2c_vbi_ram_value {
|
|||||||
unsigned char values[26];
|
unsigned char values[26];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct i2c_vbi_ram_value vbi_ram_default[] =
|
static struct i2c_vbi_ram_value vbi_ram_default[] =
|
||||||
{
|
{
|
||||||
{0x010, /* WST SECAM 6 */
|
{0x010, /* WST SECAM 6 */
|
||||||
{ 0xaa, 0xaa, 0xff, 0xff , 0xe7, 0x2e, 0x20, 0x26, 0xe6, 0xb4, 0x0e, 0x0, 0x0, 0x0, 0x10, 0x0 }
|
{ 0xaa, 0xaa, 0xff, 0xff , 0xe7, 0x2e, 0x20, 0x26, 0xe6, 0xb4, 0x0e, 0x0, 0x0, 0x0, 0x10, 0x0 }
|
||||||
|
@ -29,7 +29,6 @@
|
|||||||
#include <linux/devfs_fs_kernel.h>
|
#include <linux/devfs_fs_kernel.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
#include <asm/semaphore.h>
|
|
||||||
|
|
||||||
#include <linux/videodev.h>
|
#include <linux/videodev.h>
|
||||||
|
|
||||||
@ -83,7 +82,7 @@ static struct class video_class = {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static struct video_device *video_device[VIDEO_NUM_DEVICES];
|
static struct video_device *video_device[VIDEO_NUM_DEVICES];
|
||||||
static DECLARE_MUTEX(videodev_lock);
|
static DEFINE_MUTEX(videodev_lock);
|
||||||
|
|
||||||
struct video_device* video_devdata(struct file *file)
|
struct video_device* video_devdata(struct file *file)
|
||||||
{
|
{
|
||||||
@ -102,15 +101,15 @@ static int video_open(struct inode *inode, struct file *file)
|
|||||||
|
|
||||||
if(minor>=VIDEO_NUM_DEVICES)
|
if(minor>=VIDEO_NUM_DEVICES)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
down(&videodev_lock);
|
mutex_lock(&videodev_lock);
|
||||||
vfl=video_device[minor];
|
vfl=video_device[minor];
|
||||||
if(vfl==NULL) {
|
if(vfl==NULL) {
|
||||||
up(&videodev_lock);
|
mutex_unlock(&videodev_lock);
|
||||||
request_module("char-major-%d-%d", VIDEO_MAJOR, minor);
|
request_module("char-major-%d-%d", VIDEO_MAJOR, minor);
|
||||||
down(&videodev_lock);
|
mutex_lock(&videodev_lock);
|
||||||
vfl=video_device[minor];
|
vfl=video_device[minor];
|
||||||
if (vfl==NULL) {
|
if (vfl==NULL) {
|
||||||
up(&videodev_lock);
|
mutex_unlock(&videodev_lock);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -123,7 +122,7 @@ static int video_open(struct inode *inode, struct file *file)
|
|||||||
file->f_op = fops_get(old_fops);
|
file->f_op = fops_get(old_fops);
|
||||||
}
|
}
|
||||||
fops_put(old_fops);
|
fops_put(old_fops);
|
||||||
up(&videodev_lock);
|
mutex_unlock(&videodev_lock);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -304,12 +303,12 @@ int video_register_device(struct video_device *vfd, int type, int nr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* pick a minor number */
|
/* pick a minor number */
|
||||||
down(&videodev_lock);
|
mutex_lock(&videodev_lock);
|
||||||
if (nr >= 0 && nr < end-base) {
|
if (nr >= 0 && nr < end-base) {
|
||||||
/* use the one the driver asked for */
|
/* use the one the driver asked for */
|
||||||
i = base+nr;
|
i = base+nr;
|
||||||
if (NULL != video_device[i]) {
|
if (NULL != video_device[i]) {
|
||||||
up(&videodev_lock);
|
mutex_unlock(&videodev_lock);
|
||||||
return -ENFILE;
|
return -ENFILE;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -318,13 +317,13 @@ int video_register_device(struct video_device *vfd, int type, int nr)
|
|||||||
if (NULL == video_device[i])
|
if (NULL == video_device[i])
|
||||||
break;
|
break;
|
||||||
if (i == end) {
|
if (i == end) {
|
||||||
up(&videodev_lock);
|
mutex_unlock(&videodev_lock);
|
||||||
return -ENFILE;
|
return -ENFILE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
video_device[i]=vfd;
|
video_device[i]=vfd;
|
||||||
vfd->minor=i;
|
vfd->minor=i;
|
||||||
up(&videodev_lock);
|
mutex_unlock(&videodev_lock);
|
||||||
|
|
||||||
sprintf(vfd->devfs_name, "v4l/%s%d", name_base, i - base);
|
sprintf(vfd->devfs_name, "v4l/%s%d", name_base, i - base);
|
||||||
devfs_mk_cdev(MKDEV(VIDEO_MAJOR, vfd->minor),
|
devfs_mk_cdev(MKDEV(VIDEO_MAJOR, vfd->minor),
|
||||||
@ -362,14 +361,14 @@ int video_register_device(struct video_device *vfd, int type, int nr)
|
|||||||
|
|
||||||
void video_unregister_device(struct video_device *vfd)
|
void video_unregister_device(struct video_device *vfd)
|
||||||
{
|
{
|
||||||
down(&videodev_lock);
|
mutex_lock(&videodev_lock);
|
||||||
if(video_device[vfd->minor]!=vfd)
|
if(video_device[vfd->minor]!=vfd)
|
||||||
panic("videodev: bad unregister");
|
panic("videodev: bad unregister");
|
||||||
|
|
||||||
devfs_remove(vfd->devfs_name);
|
devfs_remove(vfd->devfs_name);
|
||||||
video_device[vfd->minor]=NULL;
|
video_device[vfd->minor]=NULL;
|
||||||
class_device_unregister(&vfd->class_dev);
|
class_device_unregister(&vfd->class_dev);
|
||||||
up(&videodev_lock);
|
mutex_unlock(&videodev_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -104,6 +104,10 @@
|
|||||||
#define I2C_DRIVERID_AKITAIOEXP 74 /* IO Expander on Sharp SL-C1000 */
|
#define I2C_DRIVERID_AKITAIOEXP 74 /* IO Expander on Sharp SL-C1000 */
|
||||||
#define I2C_DRIVERID_INFRARED 75 /* I2C InfraRed on Video boards */
|
#define I2C_DRIVERID_INFRARED 75 /* I2C InfraRed on Video boards */
|
||||||
#define I2C_DRIVERID_TVP5150 76 /* TVP5150 video decoder */
|
#define I2C_DRIVERID_TVP5150 76 /* TVP5150 video decoder */
|
||||||
|
#define I2C_DRIVERID_WM8739 77 /* wm8739 audio processor */
|
||||||
|
#define I2C_DRIVERID_UPD64083 78 /* upd64083 video processor */
|
||||||
|
#define I2C_DRIVERID_UPD64031A 79 /* upd64031a video processor */
|
||||||
|
#define I2C_DRIVERID_SAA717X 80 /* saa717x video encoder */
|
||||||
|
|
||||||
#define I2C_DRIVERID_I2CDEV 900
|
#define I2C_DRIVERID_I2CDEV 900
|
||||||
#define I2C_DRIVERID_ARP 902 /* SMBus ARP Client */
|
#define I2C_DRIVERID_ARP 902 /* SMBus ARP Client */
|
||||||
|
Loading…
Reference in New Issue
Block a user