Commit 72c79bdb authored by Linus Torvalds's avatar Linus Torvalds

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
parents fe83558a d138210f
...@@ -49,9 +49,6 @@ struct smsdvb_client_t { ...@@ -49,9 +49,6 @@ struct smsdvb_client_t {
struct completion tune_done; 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; struct SMSHOSTLIB_STATISTICS_DVB_S sms_stat_dvb;
int event_fe_state; int event_fe_state;
int event_unc_state; int event_unc_state;
...@@ -744,12 +741,124 @@ static int smsdvb_get_frontend(struct dvb_frontend *fe) ...@@ -744,12 +741,124 @@ static int smsdvb_get_frontend(struct dvb_frontend *fe)
struct dtv_frontend_properties *fep = &fe->dtv_property_cache; struct dtv_frontend_properties *fep = &fe->dtv_property_cache;
struct smsdvb_client_t *client = struct smsdvb_client_t *client =
container_of(fe, struct smsdvb_client_t, frontend); 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;
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;
}
/* todo: */ fep->inversion = INVERSION_AUTO;
memcpy(fep, &client->fe_params, break;
sizeof(struct dtv_frontend_properties)); 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; return 0;
} }
...@@ -872,11 +981,11 @@ static int smsdvb_hotplug(struct smscore_device_t *coredev, ...@@ -872,11 +981,11 @@ static int smsdvb_hotplug(struct smscore_device_t *coredev,
switch (smscore_get_device_mode(coredev)) { switch (smscore_get_device_mode(coredev)) {
case DEVICE_MODE_DVBT: case DEVICE_MODE_DVBT:
case DEVICE_MODE_DVBT_BDA: case DEVICE_MODE_DVBT_BDA:
smsdvb_fe_ops.delsys[0] = SYS_DVBT; client->frontend.ops.delsys[0] = SYS_DVBT;
break; break;
case DEVICE_MODE_ISDBT: case DEVICE_MODE_ISDBT:
case DEVICE_MODE_ISDBT_BDA: case DEVICE_MODE_ISDBT_BDA:
smsdvb_fe_ops.delsys[0] = SYS_ISDBT; client->frontend.ops.delsys[0] = SYS_ISDBT;
break; break;
} }
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#include <linux/videodev2.h> #include <linux/videodev2.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/module.h>
#include <mach/mux.h> #include <mach/mux.h>
......
...@@ -611,9 +611,11 @@ void uvc_video_clock_update(struct uvc_streaming *stream, ...@@ -611,9 +611,11 @@ void uvc_video_clock_update(struct uvc_streaming *stream,
delta_stc = buf->pts - (1UL << 31); delta_stc = buf->pts - (1UL << 31);
x1 = first->dev_stc - delta_stc; x1 = first->dev_stc - delta_stc;
x2 = last->dev_stc - delta_stc; x2 = last->dev_stc - delta_stc;
if (x1 == x2)
goto done;
y1 = (first->dev_sof + 2048) << 16; y1 = (first->dev_sof + 2048) << 16;
y2 = (last->dev_sof + 2048) << 16; y2 = (last->dev_sof + 2048) << 16;
if (y2 < y1) if (y2 < y1)
y2 += 2048 << 16; y2 += 2048 << 16;
...@@ -631,14 +633,16 @@ void uvc_video_clock_update(struct uvc_streaming *stream, ...@@ -631,14 +633,16 @@ void uvc_video_clock_update(struct uvc_streaming *stream,
x1, x2, y1, y2, clock->sof_offset); x1, x2, y1, y2, clock->sof_offset);
/* Second step, SOF to host clock conversion. */ /* 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; x1 = (uvc_video_clock_host_sof(first) + 2048) << 16;
x2 = (uvc_video_clock_host_sof(last) + 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) if (x2 < x1)
x2 += 2048 << 16; 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 /* Interpolated and host SOF timestamps can wrap around at slightly
* different times. Handle this by adding or removing 2048 to or from * different times. Handle this by adding or removing 2048 to or from
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment