mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 06:02:05 +00:00
Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
Pull media fixes from Mauro Carvalho Chehab: "For 4 fixes for 3.3 (all trivial): - uvc video driver: fixes a division by zero; - davinci: add module.h to fix compilation; - smsusb: fix the delivery system setting; - smsdvb: the get_frontend implementation there is broken. The smsdvb patch has 127 lines, but it is trivial: instead of returning a cache of the set_frontend (with is wrong, as it doesn't have the updated values for the data, and the implementation there is buggy), it copies the information of the detected DVB parameters from the smsdvb private structures into the corresponding DVBv5 struct fields." * 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: [media] smsdvb: fix get_frontend [media] smsusb: fix the default delivery system setting [media] media: davinci: added module.h to resolve unresolved macros [media] [FOR,v3.3] uvcvideo: Avoid division by 0 in timestamp calculation
This commit is contained in:
commit
72c79bdbda
@ -49,9 +49,6 @@ struct smsdvb_client_t {
|
||||
|
||||
struct completion tune_done;
|
||||
|
||||
/* todo: save freq/band instead whole struct */
|
||||
struct dtv_frontend_properties fe_params;
|
||||
|
||||
struct SMSHOSTLIB_STATISTICS_DVB_S sms_stat_dvb;
|
||||
int event_fe_state;
|
||||
int event_unc_state;
|
||||
@ -744,12 +741,124 @@ static int smsdvb_get_frontend(struct dvb_frontend *fe)
|
||||
struct dtv_frontend_properties *fep = &fe->dtv_property_cache;
|
||||
struct smsdvb_client_t *client =
|
||||
container_of(fe, struct smsdvb_client_t, frontend);
|
||||
struct smscore_device_t *coredev = client->coredev;
|
||||
struct TRANSMISSION_STATISTICS_S *td =
|
||||
&client->sms_stat_dvb.TransmissionData;
|
||||
|
||||
sms_debug("");
|
||||
switch (smscore_get_device_mode(coredev)) {
|
||||
case DEVICE_MODE_DVBT:
|
||||
case DEVICE_MODE_DVBT_BDA:
|
||||
fep->frequency = td->Frequency;
|
||||
|
||||
/* todo: */
|
||||
memcpy(fep, &client->fe_params,
|
||||
sizeof(struct dtv_frontend_properties));
|
||||
switch (td->Bandwidth) {
|
||||
case 6:
|
||||
fep->bandwidth_hz = 6000000;
|
||||
break;
|
||||
case 7:
|
||||
fep->bandwidth_hz = 7000000;
|
||||
break;
|
||||
case 8:
|
||||
fep->bandwidth_hz = 8000000;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (td->TransmissionMode) {
|
||||
case 2:
|
||||
fep->transmission_mode = TRANSMISSION_MODE_2K;
|
||||
break;
|
||||
case 8:
|
||||
fep->transmission_mode = TRANSMISSION_MODE_8K;
|
||||
}
|
||||
|
||||
switch (td->GuardInterval) {
|
||||
case 0:
|
||||
fep->guard_interval = GUARD_INTERVAL_1_32;
|
||||
break;
|
||||
case 1:
|
||||
fep->guard_interval = GUARD_INTERVAL_1_16;
|
||||
break;
|
||||
case 2:
|
||||
fep->guard_interval = GUARD_INTERVAL_1_8;
|
||||
break;
|
||||
case 3:
|
||||
fep->guard_interval = GUARD_INTERVAL_1_4;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (td->CodeRate) {
|
||||
case 0:
|
||||
fep->code_rate_HP = FEC_1_2;
|
||||
break;
|
||||
case 1:
|
||||
fep->code_rate_HP = FEC_2_3;
|
||||
break;
|
||||
case 2:
|
||||
fep->code_rate_HP = FEC_3_4;
|
||||
break;
|
||||
case 3:
|
||||
fep->code_rate_HP = FEC_5_6;
|
||||
break;
|
||||
case 4:
|
||||
fep->code_rate_HP = FEC_7_8;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (td->LPCodeRate) {
|
||||
case 0:
|
||||
fep->code_rate_LP = FEC_1_2;
|
||||
break;
|
||||
case 1:
|
||||
fep->code_rate_LP = FEC_2_3;
|
||||
break;
|
||||
case 2:
|
||||
fep->code_rate_LP = FEC_3_4;
|
||||
break;
|
||||
case 3:
|
||||
fep->code_rate_LP = FEC_5_6;
|
||||
break;
|
||||
case 4:
|
||||
fep->code_rate_LP = FEC_7_8;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (td->Constellation) {
|
||||
case 0:
|
||||
fep->modulation = QPSK;
|
||||
break;
|
||||
case 1:
|
||||
fep->modulation = QAM_16;
|
||||
break;
|
||||
case 2:
|
||||
fep->modulation = QAM_64;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (td->Hierarchy) {
|
||||
case 0:
|
||||
fep->hierarchy = HIERARCHY_NONE;
|
||||
break;
|
||||
case 1:
|
||||
fep->hierarchy = HIERARCHY_1;
|
||||
break;
|
||||
case 2:
|
||||
fep->hierarchy = HIERARCHY_2;
|
||||
break;
|
||||
case 3:
|
||||
fep->hierarchy = HIERARCHY_4;
|
||||
break;
|
||||
}
|
||||
|
||||
fep->inversion = INVERSION_AUTO;
|
||||
break;
|
||||
case DEVICE_MODE_ISDBT:
|
||||
case DEVICE_MODE_ISDBT_BDA:
|
||||
fep->frequency = td->Frequency;
|
||||
fep->bandwidth_hz = 6000000;
|
||||
/* todo: retrive the other parameters */
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -872,11 +981,11 @@ static int smsdvb_hotplug(struct smscore_device_t *coredev,
|
||||
switch (smscore_get_device_mode(coredev)) {
|
||||
case DEVICE_MODE_DVBT:
|
||||
case DEVICE_MODE_DVBT_BDA:
|
||||
smsdvb_fe_ops.delsys[0] = SYS_DVBT;
|
||||
client->frontend.ops.delsys[0] = SYS_DVBT;
|
||||
break;
|
||||
case DEVICE_MODE_ISDBT:
|
||||
case DEVICE_MODE_ISDBT_BDA:
|
||||
smsdvb_fe_ops.delsys[0] = SYS_ISDBT;
|
||||
client->frontend.ops.delsys[0] = SYS_ISDBT;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include <linux/videodev2.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <mach/mux.h>
|
||||
|
||||
|
@ -611,9 +611,11 @@ void uvc_video_clock_update(struct uvc_streaming *stream,
|
||||
delta_stc = buf->pts - (1UL << 31);
|
||||
x1 = first->dev_stc - delta_stc;
|
||||
x2 = last->dev_stc - delta_stc;
|
||||
if (x1 == x2)
|
||||
goto done;
|
||||
|
||||
y1 = (first->dev_sof + 2048) << 16;
|
||||
y2 = (last->dev_sof + 2048) << 16;
|
||||
|
||||
if (y2 < y1)
|
||||
y2 += 2048 << 16;
|
||||
|
||||
@ -631,14 +633,16 @@ void uvc_video_clock_update(struct uvc_streaming *stream,
|
||||
x1, x2, y1, y2, clock->sof_offset);
|
||||
|
||||
/* Second step, SOF to host clock conversion. */
|
||||
ts = timespec_sub(last->host_ts, first->host_ts);
|
||||
x1 = (uvc_video_clock_host_sof(first) + 2048) << 16;
|
||||
x2 = (uvc_video_clock_host_sof(last) + 2048) << 16;
|
||||
y1 = NSEC_PER_SEC;
|
||||
y2 = (ts.tv_sec + 1) * NSEC_PER_SEC + ts.tv_nsec;
|
||||
|
||||
if (x2 < x1)
|
||||
x2 += 2048 << 16;
|
||||
if (x1 == x2)
|
||||
goto done;
|
||||
|
||||
ts = timespec_sub(last->host_ts, first->host_ts);
|
||||
y1 = NSEC_PER_SEC;
|
||||
y2 = (ts.tv_sec + 1) * NSEC_PER_SEC + ts.tv_nsec;
|
||||
|
||||
/* Interpolated and host SOF timestamps can wrap around at slightly
|
||||
* different times. Handle this by adding or removing 2048 to or from
|
||||
|
Loading…
Reference in New Issue
Block a user