Merge branch 'patchwork' into v4l_for_linus
* patchwork: (544 commits) [media] ir-hix5hd2: fix build on c6x arch [media] pt3: fix DTV FE I2C driver load error paths Revert "[media] media: em28xx - remove reset_resume interface" [media] exynos4-is: fix some warnings when compiling on arm64 [media] usb drivers: use %zu instead of %zd [media] pci drivers: use %zu instead of %zd [media] dvb-frontends: use %zu instead of %zd [media] s5p-mfc: Fix several printk warnings [media] s5p_mfc_opr: Fix warnings [media] ti-vpe: Fix typecast [media] s3c-camif: fix dma_addr_t printks [media] s5p_mfc_opr_v6: get rid of warnings when compiled with 64 bits [media] s5p_mfc_opr_v5: Fix lots of warnings on x86_64 [media] em28xx: Fix identation [media] drxd: remove a dead code [media] saa7146: remove return after BUG() [media] cx88: remove return after BUG() [media] cx88: fix cards table CodingStyle [media] radio-sf16fmr2: declare some structs as static [media] radio-sf16fmi: declare pnp_attached as static ... Conflicts: Documentation/DocBook/media/v4l/compat.xml
This commit is contained in:
@@ -268,7 +268,7 @@ static int snd_em28xx_capture_open(struct snd_pcm_substream *substream)
|
||||
nonblock = !!(substream->f_flags & O_NONBLOCK);
|
||||
if (nonblock) {
|
||||
if (!mutex_trylock(&dev->lock))
|
||||
return -EAGAIN;
|
||||
return -EAGAIN;
|
||||
} else
|
||||
mutex_lock(&dev->lock);
|
||||
|
||||
@@ -893,7 +893,7 @@ static int em28xx_audio_init(struct em28xx *dev)
|
||||
static int devnr;
|
||||
int err;
|
||||
|
||||
if (!dev->has_alsa_audio) {
|
||||
if (dev->usb_audio_type != EM28XX_USB_AUDIO_VENDOR) {
|
||||
/* This device does not support the extension (in this case
|
||||
the device is expecting the snd-usb-audio module or
|
||||
doesn't have analog audio support at all) */
|
||||
@@ -975,7 +975,7 @@ static int em28xx_audio_fini(struct em28xx *dev)
|
||||
if (dev == NULL)
|
||||
return 0;
|
||||
|
||||
if (!dev->has_alsa_audio) {
|
||||
if (dev->usb_audio_type != EM28XX_USB_AUDIO_VENDOR) {
|
||||
/* This device does not support the extension (in this case
|
||||
the device is expecting the snd-usb-audio module or
|
||||
doesn't have analog audio support at all) */
|
||||
@@ -1003,7 +1003,7 @@ static int em28xx_audio_suspend(struct em28xx *dev)
|
||||
if (dev == NULL)
|
||||
return 0;
|
||||
|
||||
if (!dev->has_alsa_audio)
|
||||
if (dev->usb_audio_type != EM28XX_USB_AUDIO_VENDOR)
|
||||
return 0;
|
||||
|
||||
em28xx_info("Suspending audio extension");
|
||||
@@ -1017,7 +1017,7 @@ static int em28xx_audio_resume(struct em28xx *dev)
|
||||
if (dev == NULL)
|
||||
return 0;
|
||||
|
||||
if (!dev->has_alsa_audio)
|
||||
if (dev->usb_audio_type != EM28XX_USB_AUDIO_VENDOR)
|
||||
return 0;
|
||||
|
||||
em28xx_info("Resuming audio extension");
|
||||
|
@@ -2246,7 +2246,7 @@ struct em28xx_board em28xx_boards[] = {
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(em28xx_boards);
|
||||
|
||||
const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
|
||||
static const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
|
||||
|
||||
/* table of devices that work with this driver */
|
||||
struct usb_device_id em28xx_id_table[] = {
|
||||
@@ -2931,9 +2931,9 @@ static void request_module_async(struct work_struct *work)
|
||||
#if defined(CONFIG_MODULES) && defined(MODULE)
|
||||
if (dev->has_video)
|
||||
request_module("em28xx-v4l");
|
||||
if (dev->has_audio_class)
|
||||
if (dev->usb_audio_type == EM28XX_USB_AUDIO_CLASS)
|
||||
request_module("snd-usb-audio");
|
||||
else if (dev->has_alsa_audio)
|
||||
else if (dev->usb_audio_type == EM28XX_USB_AUDIO_VENDOR)
|
||||
request_module("em28xx-alsa");
|
||||
if (dev->board.has_dvb)
|
||||
request_module("em28xx-dvb");
|
||||
@@ -3098,16 +3098,6 @@ static int em28xx_init_dev(struct em28xx *dev, struct usb_device *udev,
|
||||
}
|
||||
}
|
||||
|
||||
if (dev->chip_id == CHIP_ID_EM2870 ||
|
||||
dev->chip_id == CHIP_ID_EM2874 ||
|
||||
dev->chip_id == CHIP_ID_EM28174 ||
|
||||
dev->chip_id == CHIP_ID_EM28178) {
|
||||
/* Digital only device - don't load any alsa module */
|
||||
dev->audio_mode.has_audio = false;
|
||||
dev->has_audio_class = false;
|
||||
dev->has_alsa_audio = false;
|
||||
}
|
||||
|
||||
if (chip_name != default_chip_name)
|
||||
printk(KERN_INFO DRIVER_NAME
|
||||
": chip ID is %s\n", chip_name);
|
||||
@@ -3190,7 +3180,7 @@ static int em28xx_usb_probe(struct usb_interface *interface,
|
||||
struct usb_device *udev;
|
||||
struct em28xx *dev = NULL;
|
||||
int retval;
|
||||
bool has_audio = false, has_video = false, has_dvb = false;
|
||||
bool has_vendor_audio = false, has_video = false, has_dvb = false;
|
||||
int i, nr, try_bulk;
|
||||
const int ifnum = interface->altsetting[0].desc.bInterfaceNumber;
|
||||
char *speed;
|
||||
@@ -3272,7 +3262,7 @@ static int em28xx_usb_probe(struct usb_interface *interface,
|
||||
break;
|
||||
case 0x83:
|
||||
if (usb_endpoint_xfer_isoc(e)) {
|
||||
has_audio = true;
|
||||
has_vendor_audio = true;
|
||||
} else {
|
||||
printk(KERN_INFO DRIVER_NAME
|
||||
": error: skipping audio endpoint 0x83, because it uses bulk transfers !\n");
|
||||
@@ -3328,7 +3318,7 @@ static int em28xx_usb_probe(struct usb_interface *interface,
|
||||
}
|
||||
}
|
||||
|
||||
if (!(has_audio || has_video || has_dvb)) {
|
||||
if (!(has_vendor_audio || has_video || has_dvb)) {
|
||||
retval = -ENODEV;
|
||||
goto err_free;
|
||||
}
|
||||
@@ -3375,26 +3365,27 @@ static int em28xx_usb_probe(struct usb_interface *interface,
|
||||
dev->devno = nr;
|
||||
dev->model = id->driver_info;
|
||||
dev->alt = -1;
|
||||
dev->is_audio_only = has_audio && !(has_video || has_dvb);
|
||||
dev->has_alsa_audio = has_audio;
|
||||
dev->audio_mode.has_audio = has_audio;
|
||||
dev->is_audio_only = has_vendor_audio && !(has_video || has_dvb);
|
||||
dev->has_video = has_video;
|
||||
dev->ifnum = ifnum;
|
||||
|
||||
/* Checks if audio is provided by some interface */
|
||||
if (has_vendor_audio) {
|
||||
printk(KERN_INFO DRIVER_NAME ": Audio interface %i found %s\n",
|
||||
ifnum, "(Vendor Class)");
|
||||
dev->usb_audio_type = EM28XX_USB_AUDIO_VENDOR;
|
||||
}
|
||||
/* Checks if audio is provided by a USB Audio Class interface */
|
||||
for (i = 0; i < udev->config->desc.bNumInterfaces; i++) {
|
||||
struct usb_interface *uif = udev->config->interface[i];
|
||||
if (uif->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
|
||||
dev->has_audio_class = 1;
|
||||
if (has_vendor_audio)
|
||||
em28xx_err("em28xx: device seems to have vendor AND usb audio class interfaces !\n"
|
||||
"\t\tThe vendor interface will be ignored. Please contact the developers <linux-media@vger.kernel.org>\n");
|
||||
dev->usb_audio_type = EM28XX_USB_AUDIO_CLASS;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (has_audio)
|
||||
printk(KERN_INFO DRIVER_NAME
|
||||
": Audio interface %i found %s\n",
|
||||
ifnum,
|
||||
dev->has_audio_class ? "(USB Audio Class)" : "(Vendor Class)");
|
||||
if (has_video)
|
||||
printk(KERN_INFO DRIVER_NAME
|
||||
": Video interface %i found:%s%s\n",
|
||||
|
@@ -279,7 +279,7 @@ int em28xx_read_ac97(struct em28xx *dev, u8 reg)
|
||||
{
|
||||
int ret;
|
||||
u8 addr = (reg & 0x7f) | 0x80;
|
||||
u16 val;
|
||||
__le16 val;
|
||||
|
||||
ret = em28xx_is_ac97_ready(dev);
|
||||
if (ret < 0)
|
||||
@@ -433,7 +433,7 @@ int em28xx_audio_analog_set(struct em28xx *dev)
|
||||
int ret, i;
|
||||
u8 xclk;
|
||||
|
||||
if (!dev->audio_mode.has_audio)
|
||||
if (dev->int_audio_type == EM28XX_INT_AUDIO_NONE)
|
||||
return 0;
|
||||
|
||||
/* It is assumed that all devices use master volume for output.
|
||||
@@ -505,37 +505,48 @@ int em28xx_audio_setup(struct em28xx *dev)
|
||||
{
|
||||
int vid1, vid2, feat, cfg;
|
||||
u32 vid;
|
||||
u8 i2s_samplerates;
|
||||
|
||||
if (!dev->audio_mode.has_audio)
|
||||
if (dev->chip_id == CHIP_ID_EM2870 ||
|
||||
dev->chip_id == CHIP_ID_EM2874 ||
|
||||
dev->chip_id == CHIP_ID_EM28174 ||
|
||||
dev->chip_id == CHIP_ID_EM28178) {
|
||||
/* Digital only device - don't load any alsa module */
|
||||
dev->int_audio_type = EM28XX_INT_AUDIO_NONE;
|
||||
dev->usb_audio_type = EM28XX_USB_AUDIO_NONE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* See how this device is configured */
|
||||
cfg = em28xx_read_reg(dev, EM28XX_R00_CHIPCFG);
|
||||
em28xx_info("Config register raw data: 0x%02x\n", cfg);
|
||||
if (cfg < 0) {
|
||||
/* Register read error? */
|
||||
cfg = EM28XX_CHIPCFG_AC97; /* Be conservative */
|
||||
if (cfg < 0) { /* Register read error */
|
||||
/* Be conservative */
|
||||
dev->int_audio_type = EM28XX_INT_AUDIO_AC97;
|
||||
} else if ((cfg & EM28XX_CHIPCFG_AUDIOMASK) == 0x00) {
|
||||
/* The device doesn't have vendor audio at all */
|
||||
dev->has_alsa_audio = false;
|
||||
dev->audio_mode.has_audio = false;
|
||||
dev->int_audio_type = EM28XX_INT_AUDIO_NONE;
|
||||
dev->usb_audio_type = EM28XX_USB_AUDIO_NONE;
|
||||
return 0;
|
||||
} else if ((cfg & EM28XX_CHIPCFG_AUDIOMASK) != EM28XX_CHIPCFG_AC97) {
|
||||
dev->int_audio_type = EM28XX_INT_AUDIO_I2S;
|
||||
if (dev->chip_id < CHIP_ID_EM2860 &&
|
||||
(cfg & EM28XX_CHIPCFG_AUDIOMASK) ==
|
||||
EM2820_CHIPCFG_I2S_1_SAMPRATE)
|
||||
dev->audio_mode.i2s_samplerates = 1;
|
||||
i2s_samplerates = 1;
|
||||
else if (dev->chip_id >= CHIP_ID_EM2860 &&
|
||||
(cfg & EM28XX_CHIPCFG_AUDIOMASK) ==
|
||||
EM2860_CHIPCFG_I2S_5_SAMPRATES)
|
||||
dev->audio_mode.i2s_samplerates = 5;
|
||||
i2s_samplerates = 5;
|
||||
else
|
||||
dev->audio_mode.i2s_samplerates = 3;
|
||||
i2s_samplerates = 3;
|
||||
em28xx_info("I2S Audio (%d sample rate(s))\n",
|
||||
dev->audio_mode.i2s_samplerates);
|
||||
i2s_samplerates);
|
||||
/* Skip the code that does AC97 vendor detection */
|
||||
dev->audio_mode.ac97 = EM28XX_NO_AC97;
|
||||
goto init_audio;
|
||||
} else {
|
||||
dev->int_audio_type = EM28XX_INT_AUDIO_AC97;
|
||||
}
|
||||
|
||||
dev->audio_mode.ac97 = EM28XX_AC97_OTHER;
|
||||
@@ -549,8 +560,9 @@ int em28xx_audio_setup(struct em28xx *dev)
|
||||
*/
|
||||
em28xx_warn("AC97 chip type couldn't be determined\n");
|
||||
dev->audio_mode.ac97 = EM28XX_NO_AC97;
|
||||
dev->has_alsa_audio = false;
|
||||
dev->audio_mode.has_audio = false;
|
||||
if (dev->usb_audio_type == EM28XX_USB_AUDIO_VENDOR)
|
||||
dev->usb_audio_type = EM28XX_USB_AUDIO_NONE;
|
||||
dev->int_audio_type = EM28XX_INT_AUDIO_NONE;
|
||||
goto init_audio;
|
||||
}
|
||||
|
||||
@@ -559,15 +571,12 @@ int em28xx_audio_setup(struct em28xx *dev)
|
||||
goto init_audio;
|
||||
|
||||
vid = vid1 << 16 | vid2;
|
||||
|
||||
dev->audio_mode.ac97_vendor_id = vid;
|
||||
em28xx_warn("AC97 vendor ID = 0x%08x\n", vid);
|
||||
|
||||
feat = em28xx_read_ac97(dev, AC97_RESET);
|
||||
if (feat < 0)
|
||||
goto init_audio;
|
||||
|
||||
dev->audio_mode.ac97_feat = feat;
|
||||
em28xx_warn("AC97 features = 0x%04x\n", feat);
|
||||
|
||||
/* Try to identify what audio processor we have */
|
||||
@@ -586,8 +595,8 @@ init_audio:
|
||||
em28xx_info("Empia 202 AC97 audio processor detected\n");
|
||||
break;
|
||||
case EM28XX_AC97_SIGMATEL:
|
||||
em28xx_info("Sigmatel audio processor detected(stac 97%02x)\n",
|
||||
dev->audio_mode.ac97_vendor_id & 0xff);
|
||||
em28xx_info("Sigmatel audio processor detected (stac 97%02x)\n",
|
||||
vid & 0xff);
|
||||
break;
|
||||
case EM28XX_AC97_OTHER:
|
||||
em28xx_warn("Unknown AC97 audio processor detected!\n");
|
||||
|
@@ -373,7 +373,6 @@ static struct tda18271_config kworld_ub435q_v2_config = {
|
||||
};
|
||||
|
||||
static struct tda18212_config kworld_ub435q_v3_config = {
|
||||
.i2c_address = 0x60,
|
||||
.if_atsc_vsb = 3600,
|
||||
.if_atsc_qam = 3600,
|
||||
};
|
||||
@@ -856,7 +855,9 @@ static const struct m88ds3103_config pctv_461e_m88ds3103_config = {
|
||||
.clock = 27000000,
|
||||
.i2c_wr_max = 33,
|
||||
.clock_out = 0,
|
||||
.ts_mode = M88DS3103_TS_PARALLEL_16,
|
||||
.ts_mode = M88DS3103_TS_PARALLEL,
|
||||
.ts_clk = 16000,
|
||||
.ts_clk_pol = 1,
|
||||
.agc = 0x99,
|
||||
};
|
||||
|
||||
@@ -1435,6 +1436,15 @@ static int em28xx_dvb_init(struct em28xx *dev)
|
||||
}
|
||||
break;
|
||||
case EM2874_BOARD_KWORLD_UB435Q_V3:
|
||||
{
|
||||
struct i2c_client *client;
|
||||
struct i2c_adapter *adapter = &dev->i2c_adap[dev->def_i2c_bus];
|
||||
struct i2c_board_info board_info = {
|
||||
.type = "tda18212",
|
||||
.addr = 0x60,
|
||||
.platform_data = &kworld_ub435q_v3_config,
|
||||
};
|
||||
|
||||
dvb->fe[0] = dvb_attach(lgdt3305_attach,
|
||||
&em2874_lgdt3305_nogate_dev,
|
||||
&dev->i2c_adap[dev->def_i2c_bus]);
|
||||
@@ -1443,14 +1453,26 @@ static int em28xx_dvb_init(struct em28xx *dev)
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
/* Attach the demodulator. */
|
||||
if (!dvb_attach(tda18212_attach, dvb->fe[0],
|
||||
&dev->i2c_adap[dev->def_i2c_bus],
|
||||
&kworld_ub435q_v3_config)) {
|
||||
result = -EINVAL;
|
||||
/* attach tuner */
|
||||
kworld_ub435q_v3_config.fe = dvb->fe[0];
|
||||
request_module("tda18212");
|
||||
client = i2c_new_device(adapter, &board_info);
|
||||
if (client == NULL || client->dev.driver == NULL) {
|
||||
dvb_frontend_detach(dvb->fe[0]);
|
||||
result = -ENODEV;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
if (!try_module_get(client->dev.driver->owner)) {
|
||||
i2c_unregister_device(client);
|
||||
dvb_frontend_detach(dvb->fe[0]);
|
||||
result = -ENODEV;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
dvb->i2c_client_tuner = client;
|
||||
break;
|
||||
}
|
||||
case EM2874_BOARD_PCTV_HD_MINI_80E:
|
||||
dvb->fe[0] = dvb_attach(drx39xxj_attach, &dev->i2c_adap[dev->def_i2c_bus]);
|
||||
if (dvb->fe[0] != NULL) {
|
||||
@@ -1533,6 +1555,7 @@ static int em28xx_dvb_init(struct em28xx *dev)
|
||||
/* attach demod */
|
||||
si2168_config.i2c_adapter = &adapter;
|
||||
si2168_config.fe = &dvb->fe[0];
|
||||
si2168_config.ts_mode = SI2168_TS_PARALLEL;
|
||||
memset(&info, 0, sizeof(struct i2c_board_info));
|
||||
strlcpy(info.type, "si2168", I2C_NAME_SIZE);
|
||||
info.addr = 0x64;
|
||||
|
@@ -71,8 +71,7 @@ struct em28xx_IR {
|
||||
unsigned int last_readcount;
|
||||
u64 rc_type;
|
||||
|
||||
/* i2c slave address of external device (if used) */
|
||||
u16 i2c_dev_addr;
|
||||
struct i2c_client *i2c_client;
|
||||
|
||||
int (*get_key_i2c)(struct i2c_client *ir, enum rc_type *protocol, u32 *scancode);
|
||||
int (*get_key)(struct em28xx_IR *, struct em28xx_ir_poll_result *);
|
||||
@@ -294,16 +293,11 @@ static int em2874_polling_getkey(struct em28xx_IR *ir,
|
||||
|
||||
static int em28xx_i2c_ir_handle_key(struct em28xx_IR *ir)
|
||||
{
|
||||
struct em28xx *dev = ir->dev;
|
||||
static u32 scancode;
|
||||
enum rc_type protocol;
|
||||
int rc;
|
||||
struct i2c_client client;
|
||||
|
||||
client.adapter = &ir->dev->i2c_adap[dev->def_i2c_bus];
|
||||
client.addr = ir->i2c_dev_addr;
|
||||
|
||||
rc = ir->get_key_i2c(&client, &protocol, &scancode);
|
||||
rc = ir->get_key_i2c(ir->i2c_client, &protocol, &scancode);
|
||||
if (rc < 0) {
|
||||
dprintk("ir->get_key_i2c() failed: %d\n", rc);
|
||||
return rc;
|
||||
@@ -361,7 +355,7 @@ static void em28xx_ir_work(struct work_struct *work)
|
||||
{
|
||||
struct em28xx_IR *ir = container_of(work, struct em28xx_IR, work.work);
|
||||
|
||||
if (ir->i2c_dev_addr) /* external i2c device */
|
||||
if (ir->i2c_client) /* external i2c device */
|
||||
em28xx_i2c_ir_handle_key(ir);
|
||||
else /* internal device */
|
||||
em28xx_ir_handle_key(ir);
|
||||
@@ -609,17 +603,17 @@ static int em28xx_register_snapshot_button(struct em28xx *dev)
|
||||
static void em28xx_init_buttons(struct em28xx *dev)
|
||||
{
|
||||
u8 i = 0, j = 0;
|
||||
bool addr_new = 0;
|
||||
bool addr_new = false;
|
||||
|
||||
dev->button_polling_interval = EM28XX_BUTTONS_DEBOUNCED_QUERY_INTERVAL;
|
||||
while (dev->board.buttons[i].role >= 0 &&
|
||||
dev->board.buttons[i].role < EM28XX_NUM_BUTTON_ROLES) {
|
||||
struct em28xx_button *button = &dev->board.buttons[i];
|
||||
/* Check if polling address is already on the list */
|
||||
addr_new = 1;
|
||||
addr_new = true;
|
||||
for (j = 0; j < dev->num_button_polling_addresses; j++) {
|
||||
if (button->reg_r == dev->button_polling_addresses[j]) {
|
||||
addr_new = 0;
|
||||
addr_new = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -756,7 +750,13 @@ static int em28xx_ir_init(struct em28xx *dev)
|
||||
goto error;
|
||||
}
|
||||
|
||||
ir->i2c_dev_addr = i2c_rc_dev_addr;
|
||||
ir->i2c_client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
|
||||
if (!ir->i2c_client)
|
||||
goto error;
|
||||
ir->i2c_client->adapter = &ir->dev->i2c_adap[dev->def_i2c_bus];
|
||||
ir->i2c_client->addr = i2c_rc_dev_addr;
|
||||
ir->i2c_client->flags = 0;
|
||||
/* NOTE: all other fields of i2c_client are unused */
|
||||
} else { /* internal device */
|
||||
switch (dev->chip_id) {
|
||||
case CHIP_ID_EM2860:
|
||||
@@ -815,6 +815,7 @@ static int em28xx_ir_init(struct em28xx *dev)
|
||||
return 0;
|
||||
|
||||
error:
|
||||
kfree(ir->i2c_client);
|
||||
dev->ir = NULL;
|
||||
rc_free_device(rc);
|
||||
kfree(ir);
|
||||
@@ -841,6 +842,8 @@ static int em28xx_ir_fini(struct em28xx *dev)
|
||||
if (ir->rc)
|
||||
rc_unregister_device(ir->rc);
|
||||
|
||||
kfree(ir->i2c_client);
|
||||
|
||||
/* done */
|
||||
kfree(ir);
|
||||
dev->ir = NULL;
|
||||
|
@@ -29,17 +29,6 @@
|
||||
#include "em28xx.h"
|
||||
#include "em28xx-v4l.h"
|
||||
|
||||
static unsigned int vbibufs = 5;
|
||||
module_param(vbibufs, int, 0644);
|
||||
MODULE_PARM_DESC(vbibufs, "number of vbi buffers, range 2-32");
|
||||
|
||||
static unsigned int vbi_debug;
|
||||
module_param(vbi_debug, int, 0644);
|
||||
MODULE_PARM_DESC(vbi_debug, "enable debug messages [vbi]");
|
||||
|
||||
#define dprintk(level, fmt, arg...) if (vbi_debug >= level) \
|
||||
printk(KERN_DEBUG "%s: " fmt, dev->core->name , ## arg)
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
static int vbi_queue_setup(struct vb2_queue *vq, const struct v4l2_format *fmt,
|
||||
|
@@ -435,7 +435,10 @@ static inline void finish_buffer(struct em28xx *dev,
|
||||
em28xx_isocdbg("[%p/%d] wakeup\n", buf, buf->top_field);
|
||||
|
||||
buf->vb.v4l2_buf.sequence = dev->v4l2->field_count++;
|
||||
buf->vb.v4l2_buf.field = V4L2_FIELD_INTERLACED;
|
||||
if (dev->v4l2->progressive)
|
||||
buf->vb.v4l2_buf.field = V4L2_FIELD_NONE;
|
||||
else
|
||||
buf->vb.v4l2_buf.field = V4L2_FIELD_INTERLACED;
|
||||
v4l2_get_timestamp(&buf->vb.v4l2_buf.timestamp);
|
||||
|
||||
vb2_buffer_done(&buf->vb, VB2_BUF_STATE_DONE);
|
||||
@@ -478,7 +481,7 @@ static void em28xx_copy_video(struct em28xx *dev,
|
||||
lencopy = lencopy > remain ? remain : lencopy;
|
||||
|
||||
if ((char *)startwrite + lencopy > (char *)buf->vb_buf + buf->length) {
|
||||
em28xx_isocdbg("Overflow of %zi bytes past buffer end (1)\n",
|
||||
em28xx_isocdbg("Overflow of %zu bytes past buffer end (1)\n",
|
||||
((char *)startwrite + lencopy) -
|
||||
((char *)buf->vb_buf + buf->length));
|
||||
remain = (char *)buf->vb_buf + buf->length -
|
||||
@@ -504,7 +507,7 @@ static void em28xx_copy_video(struct em28xx *dev,
|
||||
|
||||
if ((char *)startwrite + lencopy > (char *)buf->vb_buf +
|
||||
buf->length) {
|
||||
em28xx_isocdbg("Overflow of %zi bytes past buffer end"
|
||||
em28xx_isocdbg("Overflow of %zu bytes past buffer end"
|
||||
"(2)\n",
|
||||
((char *)startwrite + lencopy) -
|
||||
((char *)buf->vb_buf + buf->length));
|
||||
@@ -718,7 +721,7 @@ static inline void process_frame_data_em25xx(struct em28xx *dev,
|
||||
struct em28xx_buffer *buf = dev->usb_ctl.vid_buf;
|
||||
struct em28xx_dmaqueue *dmaq = &dev->vidq;
|
||||
struct em28xx_v4l2 *v4l2 = dev->v4l2;
|
||||
bool frame_end = 0;
|
||||
bool frame_end = false;
|
||||
|
||||
/* Check for header */
|
||||
/* NOTE: at least with bulk transfers, only the first packet
|
||||
@@ -994,13 +997,16 @@ static void em28xx_stop_streaming(struct vb2_queue *vq)
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&dev->slock, flags);
|
||||
if (dev->usb_ctl.vid_buf != NULL) {
|
||||
vb2_buffer_done(&dev->usb_ctl.vid_buf->vb, VB2_BUF_STATE_ERROR);
|
||||
dev->usb_ctl.vid_buf = NULL;
|
||||
}
|
||||
while (!list_empty(&vidq->active)) {
|
||||
struct em28xx_buffer *buf;
|
||||
buf = list_entry(vidq->active.next, struct em28xx_buffer, list);
|
||||
list_del(&buf->list);
|
||||
vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR);
|
||||
}
|
||||
dev->usb_ctl.vid_buf = NULL;
|
||||
spin_unlock_irqrestore(&dev->slock, flags);
|
||||
}
|
||||
|
||||
@@ -1021,13 +1027,16 @@ void em28xx_stop_vbi_streaming(struct vb2_queue *vq)
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&dev->slock, flags);
|
||||
if (dev->usb_ctl.vbi_buf != NULL) {
|
||||
vb2_buffer_done(&dev->usb_ctl.vbi_buf->vb, VB2_BUF_STATE_ERROR);
|
||||
dev->usb_ctl.vbi_buf = NULL;
|
||||
}
|
||||
while (!list_empty(&vbiq->active)) {
|
||||
struct em28xx_buffer *buf;
|
||||
buf = list_entry(vbiq->active.next, struct em28xx_buffer, list);
|
||||
list_del(&buf->list);
|
||||
vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR);
|
||||
}
|
||||
dev->usb_ctl.vbi_buf = NULL;
|
||||
spin_unlock_irqrestore(&dev->slock, flags);
|
||||
}
|
||||
|
||||
@@ -1711,7 +1720,7 @@ static int vidioc_querycap(struct file *file, void *priv,
|
||||
else
|
||||
cap->device_caps = V4L2_CAP_READWRITE | V4L2_CAP_VBI_CAPTURE;
|
||||
|
||||
if (dev->audio_mode.has_audio)
|
||||
if (dev->int_audio_type != EM28XX_INT_AUDIO_NONE)
|
||||
cap->device_caps |= V4L2_CAP_AUDIO;
|
||||
|
||||
if (dev->tuner_type != TUNER_ABSENT)
|
||||
@@ -2296,7 +2305,7 @@ static int em28xx_v4l2_init(struct em28xx *dev)
|
||||
v4l2->v4l2_dev.ctrl_handler = hdl;
|
||||
|
||||
if (dev->board.is_webcam)
|
||||
v4l2->progressive = 1;
|
||||
v4l2->progressive = true;
|
||||
|
||||
/*
|
||||
* Default format, used for tvp5150 or saa711x output formats
|
||||
@@ -2502,7 +2511,7 @@ static int em28xx_v4l2_init(struct em28xx *dev)
|
||||
v4l2_disable_ioctl(v4l2->vdev, VIDIOC_G_FREQUENCY);
|
||||
v4l2_disable_ioctl(v4l2->vdev, VIDIOC_S_FREQUENCY);
|
||||
}
|
||||
if (!dev->audio_mode.has_audio) {
|
||||
if (dev->int_audio_type == EM28XX_INT_AUDIO_NONE) {
|
||||
v4l2_disable_ioctl(v4l2->vdev, VIDIOC_G_AUDIO);
|
||||
v4l2_disable_ioctl(v4l2->vdev, VIDIOC_S_AUDIO);
|
||||
}
|
||||
@@ -2532,7 +2541,7 @@ static int em28xx_v4l2_init(struct em28xx *dev)
|
||||
v4l2_disable_ioctl(v4l2->vbi_dev, VIDIOC_G_FREQUENCY);
|
||||
v4l2_disable_ioctl(v4l2->vbi_dev, VIDIOC_S_FREQUENCY);
|
||||
}
|
||||
if (!dev->audio_mode.has_audio) {
|
||||
if (dev->int_audio_type == EM28XX_INT_AUDIO_NONE) {
|
||||
v4l2_disable_ioctl(v4l2->vbi_dev, VIDIOC_G_AUDIO);
|
||||
v4l2_disable_ioctl(v4l2->vbi_dev, VIDIOC_S_AUDIO);
|
||||
}
|
||||
|
@@ -309,13 +309,18 @@ enum em28xx_ac97_mode {
|
||||
|
||||
struct em28xx_audio_mode {
|
||||
enum em28xx_ac97_mode ac97;
|
||||
};
|
||||
|
||||
u16 ac97_feat;
|
||||
u32 ac97_vendor_id;
|
||||
enum em28xx_int_audio_type {
|
||||
EM28XX_INT_AUDIO_NONE = 0,
|
||||
EM28XX_INT_AUDIO_AC97,
|
||||
EM28XX_INT_AUDIO_I2S,
|
||||
};
|
||||
|
||||
unsigned int has_audio:1;
|
||||
|
||||
u8 i2s_samplerates;
|
||||
enum em28xx_usb_audio_type {
|
||||
EM28XX_USB_AUDIO_NONE = 0,
|
||||
EM28XX_USB_AUDIO_CLASS,
|
||||
EM28XX_USB_AUDIO_VENDOR,
|
||||
};
|
||||
|
||||
/* em28xx has two audio inputs: tuner and line in.
|
||||
@@ -608,9 +613,9 @@ struct em28xx {
|
||||
unsigned int is_em25xx:1; /* em25xx/em276x/7x/8x family bridge */
|
||||
unsigned char disconnected:1; /* device has been diconnected */
|
||||
unsigned int has_video:1;
|
||||
unsigned int has_audio_class:1;
|
||||
unsigned int has_alsa_audio:1;
|
||||
unsigned int is_audio_only:1;
|
||||
enum em28xx_int_audio_type int_audio_type;
|
||||
enum em28xx_usb_audio_type usb_audio_type;
|
||||
|
||||
struct em28xx_board board;
|
||||
|
||||
|
Reference in New Issue
Block a user