Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
Pull media updates from Mauro Carvalho Chehab: - Some cleanups at V4L2 documentation - new drivers: ts2020 frontend, ov9650 sensor, s5c73m3 sensor, sh-mobile veu mem2mem driver, radio-ma901, davinci_vpfe staging driver - Lots of missing MAINTAINERS entries added - several em28xx driver improvements, including its conversion to videobuf2 - several fixups on drivers to make them to better comply with the API - DVB core: add support for DVBv5 stats, allowing the implementation of statistics for new standards like ISDB - mb86a20s: add statistics to the driver - lots of new board additions, cleanups, and driver improvements. * 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (596 commits) [media] media: Add 0x3009 USB PID to ttusb2 driver (fixed diff) [media] rtl28xxu: Add USB IDs for Compro VideoMate U620F [media] em28xx: add usb id for terratec h5 rev. 3 [media] media: rc: gpio-ir-recv: add support for device tree parsing [media] mceusb: move check earlier to make smatch happy [media] radio-si470x doc: add info about v4l2-ctl and sox+alsa [media] staging: media: Remove unnecessary OOM messages [media] sh_vou: Use vou_dev instead of vou_file wherever possible [media] sh_vou: Use video_drvdata() [media] drivers/media/platform/soc_camera/pxa_camera.c: use devm_ functions [media] mt9t112: mt9t111 format set up differs from mt9t112 [media] sh-mobile-ceu-camera: fix SHARPNESS control default Revert "[media] fc0011: Return early, if the frequency is already tuned" [media] cx18/ivtv: fix regression: remove __init from a non-init function [media] em28xx: fix analog streaming with USB bulk transfers [media] stv0900: remove unnecessary null pointer check [media] fc0011: Return early, if the frequency is already tuned [media] fc0011: Add some sanity checks and cleanups [media] fc0011: Fix xin value clamping Revert "[media] [PATH,1/2] mxl5007 move reset to attach" ...
This commit is contained in:
@@ -172,6 +172,7 @@
|
||||
#define USB_PID_TWINHAN_VP7045_WARM 0x3206
|
||||
#define USB_PID_TWINHAN_VP7021_COLD 0x3207
|
||||
#define USB_PID_TWINHAN_VP7021_WARM 0x3208
|
||||
#define USB_PID_TWINHAN_VP7049 0x3219
|
||||
#define USB_PID_TINYTWIN 0x3226
|
||||
#define USB_PID_TINYTWIN_2 0xe402
|
||||
#define USB_PID_TINYTWIN_3 0x9016
|
||||
@@ -233,10 +234,15 @@
|
||||
#define USB_PID_AVERMEDIA_A815M 0x815a
|
||||
#define USB_PID_AVERMEDIA_A835 0xa835
|
||||
#define USB_PID_AVERMEDIA_B835 0xb835
|
||||
#define USB_PID_AVERMEDIA_A835B_1835 0x1835
|
||||
#define USB_PID_AVERMEDIA_A835B_2835 0x2835
|
||||
#define USB_PID_AVERMEDIA_A835B_3835 0x3835
|
||||
#define USB_PID_AVERMEDIA_A835B_4835 0x4835
|
||||
#define USB_PID_AVERMEDIA_1867 0x1867
|
||||
#define USB_PID_AVERMEDIA_A867 0xa867
|
||||
#define USB_PID_AVERMEDIA_TWINSTAR 0x0825
|
||||
#define USB_PID_TECHNOTREND_CONNECT_S2400 0x3006
|
||||
#define USB_PID_TECHNOTREND_CONNECT_S2400_8KEEPROM 0x3009
|
||||
#define USB_PID_TECHNOTREND_CONNECT_CT3650 0x300d
|
||||
#define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY 0x005a
|
||||
#define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2 0x0081
|
||||
|
@@ -156,6 +156,9 @@ struct dvb_ca_private {
|
||||
|
||||
/* Slot to start looking for data to read from in the next user-space read operation */
|
||||
int next_read_slot;
|
||||
|
||||
/* mutex serializing ioctls */
|
||||
struct mutex ioctl_mutex;
|
||||
};
|
||||
|
||||
static void dvb_ca_en50221_thread_wakeup(struct dvb_ca_private *ca);
|
||||
@@ -1191,6 +1194,9 @@ static int dvb_ca_en50221_io_do_ioctl(struct file *file,
|
||||
|
||||
dprintk("%s\n", __func__);
|
||||
|
||||
if (mutex_lock_interruptible(&ca->ioctl_mutex))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
switch (cmd) {
|
||||
case CA_RESET:
|
||||
for (slot = 0; slot < ca->slot_count; slot++) {
|
||||
@@ -1221,8 +1227,10 @@ static int dvb_ca_en50221_io_do_ioctl(struct file *file,
|
||||
case CA_GET_SLOT_INFO: {
|
||||
struct ca_slot_info *info = parg;
|
||||
|
||||
if ((info->num > ca->slot_count) || (info->num < 0))
|
||||
return -EINVAL;
|
||||
if ((info->num > ca->slot_count) || (info->num < 0)) {
|
||||
err = -EINVAL;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
info->type = CA_CI_LINK;
|
||||
info->flags = 0;
|
||||
@@ -1241,6 +1249,8 @@ static int dvb_ca_en50221_io_do_ioctl(struct file *file,
|
||||
break;
|
||||
}
|
||||
|
||||
out_unlock:
|
||||
mutex_unlock(&ca->ioctl_mutex);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -1695,6 +1705,8 @@ int dvb_ca_en50221_init(struct dvb_adapter *dvb_adapter,
|
||||
mutex_init(&ca->slot_info[i].slot_lock);
|
||||
}
|
||||
|
||||
mutex_init(&ca->ioctl_mutex);
|
||||
|
||||
if (signal_pending(current)) {
|
||||
ret = -EINTR;
|
||||
goto error;
|
||||
|
@@ -603,6 +603,7 @@ static int dvb_frontend_thread(void *data)
|
||||
enum dvbfe_algo algo;
|
||||
|
||||
bool re_tune = false;
|
||||
bool semheld = false;
|
||||
|
||||
dev_dbg(fe->dvb->device, "%s:\n", __func__);
|
||||
|
||||
@@ -626,6 +627,8 @@ restart:
|
||||
|
||||
if (kthread_should_stop() || dvb_frontend_is_exiting(fe)) {
|
||||
/* got signal or quitting */
|
||||
if (!down_interruptible(&fepriv->sem))
|
||||
semheld = true;
|
||||
fepriv->exit = DVB_FE_NORMAL_EXIT;
|
||||
break;
|
||||
}
|
||||
@@ -741,6 +744,8 @@ restart:
|
||||
fepriv->exit = DVB_FE_NO_EXIT;
|
||||
mb();
|
||||
|
||||
if (semheld)
|
||||
up(&fepriv->sem);
|
||||
dvb_frontend_wakeup(fe);
|
||||
return 0;
|
||||
}
|
||||
@@ -1048,6 +1053,16 @@ static struct dtv_cmds_h dtv_cmds[DTV_MAX_COMMAND + 1] = {
|
||||
_DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_B, 0, 0),
|
||||
_DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_C, 0, 0),
|
||||
_DTV_CMD(DTV_ATSCMH_SCCC_CODE_MODE_D, 0, 0),
|
||||
|
||||
/* Statistics API */
|
||||
_DTV_CMD(DTV_STAT_SIGNAL_STRENGTH, 0, 0),
|
||||
_DTV_CMD(DTV_STAT_CNR, 0, 0),
|
||||
_DTV_CMD(DTV_STAT_PRE_ERROR_BIT_COUNT, 0, 0),
|
||||
_DTV_CMD(DTV_STAT_PRE_TOTAL_BIT_COUNT, 0, 0),
|
||||
_DTV_CMD(DTV_STAT_POST_ERROR_BIT_COUNT, 0, 0),
|
||||
_DTV_CMD(DTV_STAT_POST_TOTAL_BIT_COUNT, 0, 0),
|
||||
_DTV_CMD(DTV_STAT_ERROR_BLOCK_COUNT, 0, 0),
|
||||
_DTV_CMD(DTV_STAT_TOTAL_BLOCK_COUNT, 0, 0),
|
||||
};
|
||||
|
||||
static void dtv_property_dump(struct dvb_frontend *fe, struct dtv_property *tvp)
|
||||
@@ -1438,7 +1453,35 @@ static int dtv_property_process_get(struct dvb_frontend *fe,
|
||||
tvp->u.data = c->lna;
|
||||
break;
|
||||
|
||||
/* Fill quality measures */
|
||||
case DTV_STAT_SIGNAL_STRENGTH:
|
||||
tvp->u.st = c->strength;
|
||||
break;
|
||||
case DTV_STAT_CNR:
|
||||
tvp->u.st = c->cnr;
|
||||
break;
|
||||
case DTV_STAT_PRE_ERROR_BIT_COUNT:
|
||||
tvp->u.st = c->pre_bit_error;
|
||||
break;
|
||||
case DTV_STAT_PRE_TOTAL_BIT_COUNT:
|
||||
tvp->u.st = c->pre_bit_count;
|
||||
break;
|
||||
case DTV_STAT_POST_ERROR_BIT_COUNT:
|
||||
tvp->u.st = c->post_bit_error;
|
||||
break;
|
||||
case DTV_STAT_POST_TOTAL_BIT_COUNT:
|
||||
tvp->u.st = c->post_bit_count;
|
||||
break;
|
||||
case DTV_STAT_ERROR_BLOCK_COUNT:
|
||||
tvp->u.st = c->block_error;
|
||||
break;
|
||||
case DTV_STAT_TOTAL_BLOCK_COUNT:
|
||||
tvp->u.st = c->block_count;
|
||||
break;
|
||||
default:
|
||||
dev_dbg(fe->dvb->device,
|
||||
"%s: FE property %d doesn't exist\n",
|
||||
__func__, tvp->cmd);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -1823,16 +1866,20 @@ static int dvb_frontend_ioctl(struct file *file,
|
||||
int err = -EOPNOTSUPP;
|
||||
|
||||
dev_dbg(fe->dvb->device, "%s: (%d)\n", __func__, _IOC_NR(cmd));
|
||||
if (fepriv->exit != DVB_FE_NO_EXIT)
|
||||
if (down_interruptible(&fepriv->sem))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
if (fepriv->exit != DVB_FE_NO_EXIT) {
|
||||
up(&fepriv->sem);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if ((file->f_flags & O_ACCMODE) == O_RDONLY &&
|
||||
(_IOC_DIR(cmd) != _IOC_READ || cmd == FE_GET_EVENT ||
|
||||
cmd == FE_DISEQC_RECV_SLAVE_REPLY))
|
||||
cmd == FE_DISEQC_RECV_SLAVE_REPLY)) {
|
||||
up(&fepriv->sem);
|
||||
return -EPERM;
|
||||
|
||||
if (down_interruptible (&fepriv->sem))
|
||||
return -ERESTARTSYS;
|
||||
}
|
||||
|
||||
if ((cmd == FE_SET_PROPERTY) || (cmd == FE_GET_PROPERTY))
|
||||
err = dvb_frontend_ioctl_properties(file, cmd, parg);
|
||||
@@ -2246,7 +2293,7 @@ static int dvb_frontend_ioctl_legacy(struct file *file,
|
||||
printk("%s switch command: 0x%04lx\n", __func__, swcmd);
|
||||
do_gettimeofday(&nexttime);
|
||||
if (dvb_frontend_debug)
|
||||
memcpy(&tv[0], &nexttime, sizeof(struct timeval));
|
||||
tv[0] = nexttime;
|
||||
/* before sending a command, initialize by sending
|
||||
* a 32ms 18V to the switch
|
||||
*/
|
||||
|
@@ -393,6 +393,16 @@ struct dtv_frontend_properties {
|
||||
u8 atscmh_sccc_code_mode_d;
|
||||
|
||||
u32 lna;
|
||||
|
||||
/* statistics data */
|
||||
struct dtv_fe_stats strength;
|
||||
struct dtv_fe_stats cnr;
|
||||
struct dtv_fe_stats pre_bit_error;
|
||||
struct dtv_fe_stats pre_bit_count;
|
||||
struct dtv_fe_stats post_bit_error;
|
||||
struct dtv_fe_stats post_bit_count;
|
||||
struct dtv_fe_stats block_error;
|
||||
struct dtv_fe_stats block_count;
|
||||
};
|
||||
|
||||
struct dvb_frontend {
|
||||
|
@@ -1345,26 +1345,35 @@ static int dvb_net_do_ioctl(struct file *file,
|
||||
{
|
||||
struct dvb_device *dvbdev = file->private_data;
|
||||
struct dvb_net *dvbnet = dvbdev->priv;
|
||||
int ret = 0;
|
||||
|
||||
if (((file->f_flags&O_ACCMODE)==O_RDONLY))
|
||||
return -EPERM;
|
||||
|
||||
if (mutex_lock_interruptible(&dvbnet->ioctl_mutex))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
switch (cmd) {
|
||||
case NET_ADD_IF:
|
||||
{
|
||||
struct dvb_net_if *dvbnetif = parg;
|
||||
int result;
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
if (!capable(CAP_SYS_ADMIN)) {
|
||||
ret = -EPERM;
|
||||
goto ioctl_error;
|
||||
}
|
||||
|
||||
if (!try_module_get(dvbdev->adapter->module))
|
||||
return -EPERM;
|
||||
if (!try_module_get(dvbdev->adapter->module)) {
|
||||
ret = -EPERM;
|
||||
goto ioctl_error;
|
||||
}
|
||||
|
||||
result=dvb_net_add_if(dvbnet, dvbnetif->pid, dvbnetif->feedtype);
|
||||
if (result<0) {
|
||||
module_put(dvbdev->adapter->module);
|
||||
return result;
|
||||
ret = result;
|
||||
goto ioctl_error;
|
||||
}
|
||||
dvbnetif->if_num=result;
|
||||
break;
|
||||
@@ -1376,8 +1385,10 @@ static int dvb_net_do_ioctl(struct file *file,
|
||||
struct dvb_net_if *dvbnetif = parg;
|
||||
|
||||
if (dvbnetif->if_num >= DVB_NET_DEVICES_MAX ||
|
||||
!dvbnet->state[dvbnetif->if_num])
|
||||
return -EINVAL;
|
||||
!dvbnet->state[dvbnetif->if_num]) {
|
||||
ret = -EINVAL;
|
||||
goto ioctl_error;
|
||||
}
|
||||
|
||||
netdev = dvbnet->device[dvbnetif->if_num];
|
||||
|
||||
@@ -1388,16 +1399,18 @@ static int dvb_net_do_ioctl(struct file *file,
|
||||
}
|
||||
case NET_REMOVE_IF:
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
if ((unsigned long) parg >= DVB_NET_DEVICES_MAX)
|
||||
return -EINVAL;
|
||||
if (!capable(CAP_SYS_ADMIN)) {
|
||||
ret = -EPERM;
|
||||
goto ioctl_error;
|
||||
}
|
||||
if ((unsigned long) parg >= DVB_NET_DEVICES_MAX) {
|
||||
ret = -EINVAL;
|
||||
goto ioctl_error;
|
||||
}
|
||||
ret = dvb_net_remove_if(dvbnet, (unsigned long) parg);
|
||||
if (!ret)
|
||||
module_put(dvbdev->adapter->module);
|
||||
return ret;
|
||||
break;
|
||||
}
|
||||
|
||||
/* binary compatibility cruft */
|
||||
@@ -1406,16 +1419,21 @@ static int dvb_net_do_ioctl(struct file *file,
|
||||
struct __dvb_net_if_old *dvbnetif = parg;
|
||||
int result;
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
if (!capable(CAP_SYS_ADMIN)) {
|
||||
ret = -EPERM;
|
||||
goto ioctl_error;
|
||||
}
|
||||
|
||||
if (!try_module_get(dvbdev->adapter->module))
|
||||
return -EPERM;
|
||||
if (!try_module_get(dvbdev->adapter->module)) {
|
||||
ret = -EPERM;
|
||||
goto ioctl_error;
|
||||
}
|
||||
|
||||
result=dvb_net_add_if(dvbnet, dvbnetif->pid, DVB_NET_FEEDTYPE_MPE);
|
||||
if (result<0) {
|
||||
module_put(dvbdev->adapter->module);
|
||||
return result;
|
||||
ret = result;
|
||||
goto ioctl_error;
|
||||
}
|
||||
dvbnetif->if_num=result;
|
||||
break;
|
||||
@@ -1427,8 +1445,10 @@ static int dvb_net_do_ioctl(struct file *file,
|
||||
struct __dvb_net_if_old *dvbnetif = parg;
|
||||
|
||||
if (dvbnetif->if_num >= DVB_NET_DEVICES_MAX ||
|
||||
!dvbnet->state[dvbnetif->if_num])
|
||||
return -EINVAL;
|
||||
!dvbnet->state[dvbnetif->if_num]) {
|
||||
ret = -EINVAL;
|
||||
goto ioctl_error;
|
||||
}
|
||||
|
||||
netdev = dvbnet->device[dvbnetif->if_num];
|
||||
|
||||
@@ -1437,9 +1457,13 @@ static int dvb_net_do_ioctl(struct file *file,
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return -ENOTTY;
|
||||
ret = -ENOTTY;
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
|
||||
ioctl_error:
|
||||
mutex_unlock(&dvbnet->ioctl_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static long dvb_net_ioctl(struct file *file,
|
||||
@@ -1505,6 +1529,7 @@ int dvb_net_init (struct dvb_adapter *adap, struct dvb_net *dvbnet,
|
||||
{
|
||||
int i;
|
||||
|
||||
mutex_init(&dvbnet->ioctl_mutex);
|
||||
dvbnet->demux = dmx;
|
||||
|
||||
for (i=0; i<DVB_NET_DEVICES_MAX; i++)
|
||||
|
@@ -40,6 +40,7 @@ struct dvb_net {
|
||||
int state[DVB_NET_DEVICES_MAX];
|
||||
unsigned int exit:1;
|
||||
struct dmx_demux *demux;
|
||||
struct mutex ioctl_mutex;
|
||||
};
|
||||
|
||||
void dvb_net_release(struct dvb_net *);
|
||||
|
@@ -418,10 +418,8 @@ int dvb_usercopy(struct file *file,
|
||||
}
|
||||
|
||||
/* call driver */
|
||||
mutex_lock(&dvbdev_mutex);
|
||||
if ((err = func(file, cmd, parg)) == -ENOIOCTLCMD)
|
||||
err = -ENOTTY;
|
||||
mutex_unlock(&dvbdev_mutex);
|
||||
|
||||
if (err < 0)
|
||||
goto out;
|
||||
|
Reference in New Issue
Block a user