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:
 "A dvb core deadlock fix, a couple videobuf2 fixes an a series of media
  driver fixes"

* 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (30 commits)
  [media] videobuf2-dma-sg: fix possible memory leak
  [media] vb2: regression fix: always set length field.
  [media] mt9p031: Include linux/of.h header
  [media] rtl2830: add parent for I2C adapter
  [media] media: marvell-ccic: use devm to release clk
  [media] ths7303: Declare as static a private function
  [media] em28xx-video: Swap release order to avoid lock nesting
  [media] usbtv: Add support for PAL video source
  [media] media_tree: Fix spelling errors
  [media] videobuf2: Add support for file access mode flags for DMABUF exporting
  [media] radio-shark2: Mark shark_resume_leds() inline to kill compiler warning
  [media] radio-shark: Mark shark_resume_leds() inline to kill compiler warning
  [media] af9035: unlock on error in af9035_i2c_master_xfer()
  [media] af9033: fix broken I2C
  [media] v4l: omap3isp: Don't check for missing get_fmt op on remote subdev
  [media] af9035: fix broken I2C and USB I/O
  [media] wm8775: fix broken audio routing
  [media] marvell-ccic: drop resource free in driver remove
  [media] tef6862/radio-tea5764: actually assign clamp result
  [media] cx231xx: use after free on error path in probe
  ...
This commit is contained in:
Linus Torvalds 2013-12-12 11:06:13 -08:00
commit 846f29a6af
70 changed files with 295 additions and 192 deletions

View File

@ -73,7 +73,8 @@ range from zero to the maximal number of valid planes for the currently active
format. For the single-planar API, applications must set <structfield> plane format. For the single-planar API, applications must set <structfield> plane
</structfield> to zero. Additional flags may be posted in the <structfield> </structfield> to zero. Additional flags may be posted in the <structfield>
flags </structfield> field. Refer to a manual for open() for details. flags </structfield> field. Refer to a manual for open() for details.
Currently only O_CLOEXEC is supported. All other fields must be set to zero. Currently only O_CLOEXEC, O_RDONLY, O_WRONLY, and O_RDWR are supported. All
other fields must be set to zero.
In the case of multi-planar API, every plane is exported separately using In the case of multi-planar API, every plane is exported separately using
multiple <constant> VIDIOC_EXPBUF </constant> calls. </para> multiple <constant> VIDIOC_EXPBUF </constant> calls. </para>
@ -170,8 +171,9 @@ multi-planar API. Otherwise this value must be set to zero. </entry>
<entry>__u32</entry> <entry>__u32</entry>
<entry><structfield>flags</structfield></entry> <entry><structfield>flags</structfield></entry>
<entry>Flags for the newly created file, currently only <constant> <entry>Flags for the newly created file, currently only <constant>
O_CLOEXEC </constant> is supported, refer to the manual of open() for more O_CLOEXEC </constant>, <constant>O_RDONLY</constant>, <constant>O_WRONLY
details.</entry> </constant>, and <constant>O_RDWR</constant> are supported, refer to the manual
of open() for more details.</entry>
</row> </row>
<row> <row>
<entry>__s32</entry> <entry>__s32</entry>

View File

@ -955,7 +955,7 @@ struct sms_rx_stats {
u32 modem_state; /* from SMSHOSTLIB_DVB_MODEM_STATE_ET */ u32 modem_state; /* from SMSHOSTLIB_DVB_MODEM_STATE_ET */
s32 SNR; /* dB */ s32 SNR; /* dB */
u32 ber; /* Post Viterbi ber [1E-5] */ u32 ber; /* Post Viterbi ber [1E-5] */
u32 ber_error_count; /* Number of erronous SYNC bits. */ u32 ber_error_count; /* Number of erroneous SYNC bits. */
u32 ber_bit_count; /* Total number of SYNC bits. */ u32 ber_bit_count; /* Total number of SYNC bits. */
u32 ts_per; /* Transport stream PER, u32 ts_per; /* Transport stream PER,
0xFFFFFFFF indicate N/A */ 0xFFFFFFFF indicate N/A */
@ -981,7 +981,7 @@ struct sms_rx_stats_ex {
u32 modem_state; /* from SMSHOSTLIB_DVB_MODEM_STATE_ET */ u32 modem_state; /* from SMSHOSTLIB_DVB_MODEM_STATE_ET */
s32 SNR; /* dB */ s32 SNR; /* dB */
u32 ber; /* Post Viterbi ber [1E-5] */ u32 ber; /* Post Viterbi ber [1E-5] */
u32 ber_error_count; /* Number of erronous SYNC bits. */ u32 ber_error_count; /* Number of erroneous SYNC bits. */
u32 ber_bit_count; /* Total number of SYNC bits. */ u32 ber_bit_count; /* Total number of SYNC bits. */
u32 ts_per; /* Transport stream PER, u32 ts_per; /* Transport stream PER,
0xFFFFFFFF indicate N/A */ 0xFFFFFFFF indicate N/A */

View File

@ -95,7 +95,7 @@ struct RECEPTION_STATISTICS_PER_SLICES_S {
u32 is_demod_locked; /* 0 - not locked, 1 - locked */ u32 is_demod_locked; /* 0 - not locked, 1 - locked */
u32 ber_bit_count; /* Total number of SYNC bits. */ u32 ber_bit_count; /* Total number of SYNC bits. */
u32 ber_error_count; /* Number of erronous SYNC bits. */ u32 ber_error_count; /* Number of erroneous SYNC bits. */
s32 MRC_SNR; /* dB */ s32 MRC_SNR; /* dB */
s32 mrc_in_band_pwr; /* In band power in dBM */ s32 mrc_in_band_pwr; /* In band power in dBM */

View File

@ -435,7 +435,7 @@ static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf)
dprintk_tscheck("TEI detected. " dprintk_tscheck("TEI detected. "
"PID=0x%x data1=0x%x\n", "PID=0x%x data1=0x%x\n",
pid, buf[1]); pid, buf[1]);
/* data in this packet cant be trusted - drop it unless /* data in this packet can't be trusted - drop it unless
* module option dvb_demux_feed_err_pkts is set */ * module option dvb_demux_feed_err_pkts is set */
if (!dvb_demux_feed_err_pkts) if (!dvb_demux_feed_err_pkts)
return; return;
@ -1032,8 +1032,13 @@ static int dmx_section_feed_release_filter(struct dmx_section_feed *feed,
return -EINVAL; return -EINVAL;
} }
if (feed->is_filtering) if (feed->is_filtering) {
/* release dvbdmx->mutex as far as it is
acquired by stop_filtering() itself */
mutex_unlock(&dvbdmx->mutex);
feed->stop_filtering(feed); feed->stop_filtering(feed);
mutex_lock(&dvbdmx->mutex);
}
spin_lock_irq(&dvbdmx->lock); spin_lock_irq(&dvbdmx->lock);
f = dvbdmxfeed->filter; f = dvbdmxfeed->filter;

View File

@ -170,18 +170,18 @@ static int af9033_rd_reg_mask(struct af9033_state *state, u32 reg, u8 *val,
static int af9033_wr_reg_val_tab(struct af9033_state *state, static int af9033_wr_reg_val_tab(struct af9033_state *state,
const struct reg_val *tab, int tab_len) const struct reg_val *tab, int tab_len)
{ {
#define MAX_TAB_LEN 212
int ret, i, j; int ret, i, j;
u8 buf[MAX_XFER_SIZE]; u8 buf[1 + MAX_TAB_LEN];
if (tab_len > sizeof(buf)) {
dev_warn(&state->i2c->dev,
"%s: i2c wr len=%d is too big!\n",
KBUILD_MODNAME, tab_len);
return -EINVAL;
}
dev_dbg(&state->i2c->dev, "%s: tab_len=%d\n", __func__, tab_len); dev_dbg(&state->i2c->dev, "%s: tab_len=%d\n", __func__, tab_len);
if (tab_len > sizeof(buf)) {
dev_warn(&state->i2c->dev, "%s: tab len %d is too big\n",
KBUILD_MODNAME, tab_len);
return -EINVAL;
}
for (i = 0, j = 0; i < tab_len; i++) { for (i = 0, j = 0; i < tab_len; i++) {
buf[j] = tab[i].val; buf[j] = tab[i].val;

View File

@ -78,7 +78,7 @@ int cxd2820r_set_frontend_c(struct dvb_frontend *fe)
num = if_freq / 1000; /* Hz => kHz */ num = if_freq / 1000; /* Hz => kHz */
num *= 0x4000; num *= 0x4000;
if_ctl = cxd2820r_div_u64_round_closest(num, 41000); if_ctl = 0x4000 - cxd2820r_div_u64_round_closest(num, 41000);
buf[0] = (if_ctl >> 8) & 0x3f; buf[0] = (if_ctl >> 8) & 0x3f;
buf[1] = (if_ctl >> 0) & 0xff; buf[1] = (if_ctl >> 0) & 0xff;

View File

@ -3048,7 +3048,7 @@ static int dib8000_tune(struct dvb_frontend *fe)
dib8000_set_diversity_in(state->fe[0], state->diversity_onoff); dib8000_set_diversity_in(state->fe[0], state->diversity_onoff);
locks = (dib8000_read_word(state, 180) >> 6) & 0x3f; /* P_coff_winlen ? */ locks = (dib8000_read_word(state, 180) >> 6) & 0x3f; /* P_coff_winlen ? */
/* coff should lock over P_coff_winlen ofdm symbols : give 3 times this lenght to lock */ /* coff should lock over P_coff_winlen ofdm symbols : give 3 times this length to lock */
*timeout = dib8000_get_timeout(state, 2 * locks, SYMBOL_DEPENDENT_ON); *timeout = dib8000_get_timeout(state, 2 * locks, SYMBOL_DEPENDENT_ON);
*tune_state = CT_DEMOD_STEP_5; *tune_state = CT_DEMOD_STEP_5;
break; break;
@ -3115,7 +3115,7 @@ static int dib8000_tune(struct dvb_frontend *fe)
case CT_DEMOD_STEP_9: /* 39 */ case CT_DEMOD_STEP_9: /* 39 */
if ((state->revision == 0x8090) || ((dib8000_read_word(state, 1291) >> 9) & 0x1)) { /* fe capable of deinterleaving : esram */ if ((state->revision == 0x8090) || ((dib8000_read_word(state, 1291) >> 9) & 0x1)) { /* fe capable of deinterleaving : esram */
/* defines timeout for mpeg lock depending on interleaver lenght of longest layer */ /* defines timeout for mpeg lock depending on interleaver length of longest layer */
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
if (c->layer[i].interleaving >= deeper_interleaver) { if (c->layer[i].interleaving >= deeper_interleaver) {
dprintk("layer%i: time interleaver = %d ", i, c->layer[i].interleaving); dprintk("layer%i: time interleaver = %d ", i, c->layer[i].interleaving);

View File

@ -1191,7 +1191,7 @@ static int mpegts_configure_pins(struct drxk_state *state, bool mpeg_enable)
goto error; goto error;
if (state->m_enable_parallel == true) { if (state->m_enable_parallel == true) {
/* paralel -> enable MD1 to MD7 */ /* parallel -> enable MD1 to MD7 */
status = write16(state, SIO_PDR_MD1_CFG__A, status = write16(state, SIO_PDR_MD1_CFG__A,
sio_pdr_mdx_cfg); sio_pdr_mdx_cfg);
if (status < 0) if (status < 0)
@ -1428,7 +1428,7 @@ static int mpegts_stop(struct drxk_state *state)
dprintk(1, "\n"); dprintk(1, "\n");
/* Gracefull shutdown (byte boundaries) */ /* Graceful shutdown (byte boundaries) */
status = read16(state, FEC_OC_SNC_MODE__A, &fec_oc_snc_mode); status = read16(state, FEC_OC_SNC_MODE__A, &fec_oc_snc_mode);
if (status < 0) if (status < 0)
goto error; goto error;
@ -2021,7 +2021,7 @@ static int mpegts_dto_setup(struct drxk_state *state,
fec_oc_dto_burst_len = 204; fec_oc_dto_burst_len = 204;
} }
/* Check serial or parrallel output */ /* Check serial or parallel output */
fec_oc_reg_ipr_mode &= (~(FEC_OC_IPR_MODE_SERIAL__M)); fec_oc_reg_ipr_mode &= (~(FEC_OC_IPR_MODE_SERIAL__M));
if (state->m_enable_parallel == false) { if (state->m_enable_parallel == false) {
/* MPEG data output is serial -> set ipr_mode[0] */ /* MPEG data output is serial -> set ipr_mode[0] */
@ -2908,7 +2908,7 @@ static int adc_synchronization(struct drxk_state *state)
goto error; goto error;
if (count == 1) { if (count == 1) {
/* Try sampling on a diffrent edge */ /* Try sampling on a different edge */
u16 clk_neg = 0; u16 clk_neg = 0;
status = read16(state, IQM_AF_CLKNEG__A, &clk_neg); status = read16(state, IQM_AF_CLKNEG__A, &clk_neg);
@ -3306,7 +3306,7 @@ static int dvbt_sc_command(struct drxk_state *state,
if (status < 0) if (status < 0)
goto error; goto error;
/* Retreive results parameters from SC */ /* Retrieve results parameters from SC */
switch (cmd) { switch (cmd) {
/* All commands yielding 5 results */ /* All commands yielding 5 results */
/* All commands yielding 4 results */ /* All commands yielding 4 results */
@ -3849,7 +3849,7 @@ static int set_dvbt(struct drxk_state *state, u16 intermediate_freqk_hz,
break; break;
} }
#if 0 #if 0
/* No hierachical channels support in BDA */ /* No hierarchical channels support in BDA */
/* Priority (only for hierarchical channels) */ /* Priority (only for hierarchical channels) */
switch (channel->priority) { switch (channel->priority) {
case DRX_PRIORITY_LOW: case DRX_PRIORITY_LOW:
@ -4081,7 +4081,7 @@ error:
/*============================================================================*/ /*============================================================================*/
/** /**
* \brief Retreive lock status . * \brief Retrieve lock status .
* \param demod Pointer to demodulator instance. * \param demod Pointer to demodulator instance.
* \param lockStat Pointer to lock status structure. * \param lockStat Pointer to lock status structure.
* \return DRXStatus_t. * \return DRXStatus_t.
@ -6174,7 +6174,7 @@ static int init_drxk(struct drxk_state *state)
goto error; goto error;
/* Stamp driver version number in SCU data RAM in BCD code /* Stamp driver version number in SCU data RAM in BCD code
Done to enable field application engineers to retreive drxdriver version Done to enable field application engineers to retrieve drxdriver version
via I2C from SCU RAM. via I2C from SCU RAM.
Not using SCU command interface for SCU register access since no Not using SCU command interface for SCU register access since no
microcode may be present. microcode may be present.
@ -6399,7 +6399,7 @@ static int drxk_set_parameters(struct dvb_frontend *fe)
fe->ops.tuner_ops.get_if_frequency(fe, &IF); fe->ops.tuner_ops.get_if_frequency(fe, &IF);
start(state, 0, IF); start(state, 0, IF);
/* After set_frontend, stats aren't avaliable */ /* After set_frontend, stats aren't available */
p->strength.stat[0].scale = FE_SCALE_RELATIVE; p->strength.stat[0].scale = FE_SCALE_RELATIVE;
p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;

View File

@ -710,6 +710,7 @@ struct dvb_frontend *rtl2830_attach(const struct rtl2830_config *cfg,
sizeof(priv->tuner_i2c_adapter.name)); sizeof(priv->tuner_i2c_adapter.name));
priv->tuner_i2c_adapter.algo = &rtl2830_tuner_i2c_algo; priv->tuner_i2c_adapter.algo = &rtl2830_tuner_i2c_algo;
priv->tuner_i2c_adapter.algo_data = NULL; priv->tuner_i2c_adapter.algo_data = NULL;
priv->tuner_i2c_adapter.dev.parent = &i2c->dev;
i2c_set_adapdata(&priv->tuner_i2c_adapter, priv); i2c_set_adapdata(&priv->tuner_i2c_adapter, priv);
if (i2c_add_adapter(&priv->tuner_i2c_adapter) < 0) { if (i2c_add_adapter(&priv->tuner_i2c_adapter) < 0) {
dev_err(&i2c->dev, dev_err(&i2c->dev,

View File

@ -52,9 +52,9 @@
#define ADV7183_VS_FIELD_CTRL_1 0x31 /* Vsync field control 1 */ #define ADV7183_VS_FIELD_CTRL_1 0x31 /* Vsync field control 1 */
#define ADV7183_VS_FIELD_CTRL_2 0x32 /* Vsync field control 2 */ #define ADV7183_VS_FIELD_CTRL_2 0x32 /* Vsync field control 2 */
#define ADV7183_VS_FIELD_CTRL_3 0x33 /* Vsync field control 3 */ #define ADV7183_VS_FIELD_CTRL_3 0x33 /* Vsync field control 3 */
#define ADV7183_HS_POS_CTRL_1 0x34 /* Hsync positon control 1 */ #define ADV7183_HS_POS_CTRL_1 0x34 /* Hsync position control 1 */
#define ADV7183_HS_POS_CTRL_2 0x35 /* Hsync positon control 2 */ #define ADV7183_HS_POS_CTRL_2 0x35 /* Hsync position control 2 */
#define ADV7183_HS_POS_CTRL_3 0x36 /* Hsync positon control 3 */ #define ADV7183_HS_POS_CTRL_3 0x36 /* Hsync position control 3 */
#define ADV7183_POLARITY 0x37 /* Polarity */ #define ADV7183_POLARITY 0x37 /* Polarity */
#define ADV7183_NTSC_COMB_CTRL 0x38 /* NTSC comb control */ #define ADV7183_NTSC_COMB_CTRL 0x38 /* NTSC comb control */
#define ADV7183_PAL_COMB_CTRL 0x39 /* PAL comb control */ #define ADV7183_PAL_COMB_CTRL 0x39 /* PAL comb control */

View File

@ -877,7 +877,7 @@ static void configure_custom_video_timings(struct v4l2_subdev *sd,
break; break;
case ADV7604_MODE_HDMI: case ADV7604_MODE_HDMI:
/* set default prim_mode/vid_std for HDMI /* set default prim_mode/vid_std for HDMI
accoring to [REF_03, c. 4.2] */ according to [REF_03, c. 4.2] */
io_write(sd, 0x00, 0x02); /* video std */ io_write(sd, 0x00, 0x02); /* video std */
io_write(sd, 0x01, 0x06); /* prim mode */ io_write(sd, 0x01, 0x06); /* prim mode */
break; break;

View File

@ -1013,7 +1013,7 @@ static void configure_custom_video_timings(struct v4l2_subdev *sd,
break; break;
case ADV7842_MODE_HDMI: case ADV7842_MODE_HDMI:
/* set default prim_mode/vid_std for HDMI /* set default prim_mode/vid_std for HDMI
accoring to [REF_03, c. 4.2] */ according to [REF_03, c. 4.2] */
io_write(sd, 0x00, 0x02); /* video std */ io_write(sd, 0x00, 0x02); /* video std */
io_write(sd, 0x01, 0x06); /* prim mode */ io_write(sd, 0x01, 0x06); /* prim mode */
break; break;

View File

@ -394,7 +394,7 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id)
if (!rc) { if (!rc) {
/* /*
* If platform_data doesn't specify rc_dev, initilize it * If platform_data doesn't specify rc_dev, initialize it
* internally * internally
*/ */
rc = rc_allocate_device(); rc = rc_allocate_device();

View File

@ -544,7 +544,7 @@ int m5mols_init_controls(struct v4l2_subdev *sd)
u16 zoom_step; u16 zoom_step;
int ret; int ret;
/* Determine the firmware dependant control range and step values */ /* Determine the firmware dependent control range and step values */
ret = m5mols_read_u16(sd, AE_MAX_GAIN_MON, &exposure_max); ret = m5mols_read_u16(sd, AE_MAX_GAIN_MON, &exposure_max);
if (ret < 0) if (ret < 0)
return ret; return ret;

View File

@ -19,6 +19,7 @@
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/log2.h> #include <linux/log2.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/of.h>
#include <linux/of_gpio.h> #include <linux/of_gpio.h>
#include <linux/pm.h> #include <linux/pm.h>
#include <linux/regulator/consumer.h> #include <linux/regulator/consumer.h>

View File

@ -1460,7 +1460,7 @@ static int s5c73m3_oif_registered(struct v4l2_subdev *sd)
mutex_unlock(&state->lock); mutex_unlock(&state->lock);
v4l2_dbg(1, s5c73m3_dbg, sd, "%s: Booting %s (%d)\n", v4l2_dbg(1, s5c73m3_dbg, sd, "%s: Booting %s (%d)\n",
__func__, ret ? "failed" : "succeded", ret); __func__, ret ? "failed" : "succeeded", ret);
return ret; return ret;
} }

View File

@ -393,7 +393,7 @@ struct s5c73m3 {
/* External master clock frequency */ /* External master clock frequency */
u32 mclk_frequency; u32 mclk_frequency;
/* Video bus type - MIPI-CSI2/paralell */ /* Video bus type - MIPI-CSI2/parallel */
enum v4l2_mbus_type bus_type; enum v4l2_mbus_type bus_type;
const struct s5c73m3_frame_size *sensor_pix_size[2]; const struct s5c73m3_frame_size *sensor_pix_size[2];

View File

@ -1699,7 +1699,7 @@ static void saa711x_write_platform_data(struct saa711x_state *state,
* the analog demod. * the analog demod.
* If the tuner is not found, it returns -ENODEV. * If the tuner is not found, it returns -ENODEV.
* If auto-detection is disabled and the tuner doesn't match what it was * If auto-detection is disabled and the tuner doesn't match what it was
* requred, it returns -EINVAL and fills 'name'. * required, it returns -EINVAL and fills 'name'.
* If the chip is found, it returns the chip ID and fills 'name'. * If the chip is found, it returns the chip ID and fills 'name'.
*/ */
static int saa711x_detect_chip(struct i2c_client *client, static int saa711x_detect_chip(struct i2c_client *client,

View File

@ -642,7 +642,7 @@ static const struct ov5642_datafmt
static int reg_read(struct i2c_client *client, u16 reg, u8 *val) static int reg_read(struct i2c_client *client, u16 reg, u8 *val)
{ {
int ret; int ret;
/* We have 16-bit i2c addresses - care for endianess */ /* We have 16-bit i2c addresses - care for endianness */
unsigned char data[2] = { reg >> 8, reg & 0xff }; unsigned char data[2] = { reg >> 8, reg & 0xff };
ret = i2c_master_send(client, data, 2); ret = i2c_master_send(client, data, 2);

View File

@ -83,7 +83,8 @@ static int ths7303_write(struct v4l2_subdev *sd, u8 reg, u8 val)
} }
/* following function is used to set ths7303 */ /* following function is used to set ths7303 */
int ths7303_setval(struct v4l2_subdev *sd, enum ths7303_filter_mode mode) static int ths7303_setval(struct v4l2_subdev *sd,
enum ths7303_filter_mode mode)
{ {
struct i2c_client *client = v4l2_get_subdevdata(sd); struct i2c_client *client = v4l2_get_subdevdata(sd);
struct ths7303_state *state = to_state(sd); struct ths7303_state *state = to_state(sd);

View File

@ -130,12 +130,10 @@ static int wm8775_s_routing(struct v4l2_subdev *sd,
return -EINVAL; return -EINVAL;
} }
state->input = input; state->input = input;
if (!v4l2_ctrl_g_ctrl(state->mute)) if (v4l2_ctrl_g_ctrl(state->mute))
return 0; return 0;
if (!v4l2_ctrl_g_ctrl(state->vol)) if (!v4l2_ctrl_g_ctrl(state->vol))
return 0; return 0;
if (!v4l2_ctrl_g_ctrl(state->bal))
return 0;
wm8775_set_audio(sd, 1); wm8775_set_audio(sd, 1);
return 0; return 0;
} }

View File

@ -4182,7 +4182,8 @@ static int bttv_probe(struct pci_dev *dev, const struct pci_device_id *pci_id)
} }
btv->std = V4L2_STD_PAL; btv->std = V4L2_STD_PAL;
init_irqreg(btv); init_irqreg(btv);
v4l2_ctrl_handler_setup(hdl); if (!bttv_tvcards[btv->c.type].no_video)
v4l2_ctrl_handler_setup(hdl);
if (hdl->error) { if (hdl->error) {
result = hdl->error; result = hdl->error;
goto fail2; goto fail2;

View File

@ -262,7 +262,7 @@ struct cx18_options {
}; };
/* per-mdl bit flags */ /* per-mdl bit flags */
#define CX18_F_M_NEED_SWAP 0 /* mdl buffer data must be endianess swapped */ #define CX18_F_M_NEED_SWAP 0 /* mdl buffer data must be endianness swapped */
/* per-stream, s_flags */ /* per-stream, s_flags */
#define CX18_F_S_CLAIMED 3 /* this stream is claimed */ #define CX18_F_S_CLAIMED 3 /* this stream is claimed */

View File

@ -427,7 +427,7 @@ int mc417_register_read(struct cx23885_dev *dev, u16 address, u32 *value)
cx_write(MC417_RWD, regval); cx_write(MC417_RWD, regval);
/* Transition RD to effect read transaction across bus. /* Transition RD to effect read transaction across bus.
* Transtion 0x5000 -> 0x9000 correct (RD/RDY -> WR/RDY)? * Transition 0x5000 -> 0x9000 correct (RD/RDY -> WR/RDY)?
* Should it be 0x9000 -> 0xF000 (also why is RDY being set, its * Should it be 0x9000 -> 0xF000 (also why is RDY being set, its
* input only...) * input only...)
*/ */

View File

@ -401,7 +401,7 @@ static int pluto_hw_init(struct pluto *pluto)
/* set automatic LED control by FPGA */ /* set automatic LED control by FPGA */
pluto_rw(pluto, REG_MISC, MISC_ALED, MISC_ALED); pluto_rw(pluto, REG_MISC, MISC_ALED, MISC_ALED);
/* set data endianess */ /* set data endianness */
#ifdef __LITTLE_ENDIAN #ifdef __LITTLE_ENDIAN
pluto_rw(pluto, REG_PIDn(0), PID0_END, PID0_END); pluto_rw(pluto, REG_PIDn(0), PID0_END, PID0_END);
#else #else

View File

@ -1354,9 +1354,11 @@ static int saa7164_initdev(struct pci_dev *pci_dev,
if (fw_debug) { if (fw_debug) {
dev->kthread = kthread_run(saa7164_thread_function, dev, dev->kthread = kthread_run(saa7164_thread_function, dev,
"saa7164 debug"); "saa7164 debug");
if (!dev->kthread) if (IS_ERR(dev->kthread)) {
dev->kthread = NULL;
printk(KERN_ERR "%s() Failed to create " printk(KERN_ERR "%s() Failed to create "
"debug kernel thread\n", __func__); "debug kernel thread\n", __func__);
}
} }
} /* != BOARD_UNKNOWN */ } /* != BOARD_UNKNOWN */

View File

@ -1434,7 +1434,7 @@ static void coda_buf_queue(struct vb2_buffer *vb)
if (q_data->fourcc == V4L2_PIX_FMT_H264 && if (q_data->fourcc == V4L2_PIX_FMT_H264 &&
vb->vb2_queue->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) { vb->vb2_queue->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) {
/* /*
* For backwards compatiblity, queuing an empty buffer marks * For backwards compatibility, queuing an empty buffer marks
* the stream end * the stream end
*/ */
if (vb2_get_plane_payload(vb, 0) == 0) if (vb2_get_plane_payload(vb, 0) == 0)

View File

@ -1039,7 +1039,7 @@ static int fimc_runtime_resume(struct device *dev)
dbg("fimc%d: state: 0x%lx", fimc->id, fimc->state); dbg("fimc%d: state: 0x%lx", fimc->id, fimc->state);
/* Enable clocks and perform basic initalization */ /* Enable clocks and perform basic initialization */
clk_enable(fimc->clock[CLK_GATE]); clk_enable(fimc->clock[CLK_GATE]);
fimc_hw_reset(fimc); fimc_hw_reset(fimc);

View File

@ -759,7 +759,7 @@ static int fimc_md_register_platform_entity(struct fimc_md *fmd,
goto dev_unlock; goto dev_unlock;
drvdata = dev_get_drvdata(dev); drvdata = dev_get_drvdata(dev);
/* Some subdev didn't probe succesfully id drvdata is NULL */ /* Some subdev didn't probe successfully id drvdata is NULL */
if (drvdata) { if (drvdata) {
switch (plat_entity) { switch (plat_entity) {
case IDX_FIMC: case IDX_FIMC:

View File

@ -142,12 +142,6 @@ static int mmpcam_power_up(struct mcam_camera *mcam)
struct mmp_camera *cam = mcam_to_cam(mcam); struct mmp_camera *cam = mcam_to_cam(mcam);
struct mmp_camera_platform_data *pdata; struct mmp_camera_platform_data *pdata;
if (mcam->bus_type == V4L2_MBUS_CSI2) {
cam->mipi_clk = devm_clk_get(mcam->dev, "mipi");
if ((IS_ERR(cam->mipi_clk) && mcam->dphy[2] == 0))
return PTR_ERR(cam->mipi_clk);
}
/* /*
* Turn on power and clocks to the controller. * Turn on power and clocks to the controller.
*/ */
@ -186,12 +180,6 @@ static void mmpcam_power_down(struct mcam_camera *mcam)
gpio_set_value(pdata->sensor_power_gpio, 0); gpio_set_value(pdata->sensor_power_gpio, 0);
gpio_set_value(pdata->sensor_reset_gpio, 0); gpio_set_value(pdata->sensor_reset_gpio, 0);
if (mcam->bus_type == V4L2_MBUS_CSI2 && !IS_ERR(cam->mipi_clk)) {
if (cam->mipi_clk)
devm_clk_put(mcam->dev, cam->mipi_clk);
cam->mipi_clk = NULL;
}
mcam_clk_disable(mcam); mcam_clk_disable(mcam);
} }
@ -292,8 +280,9 @@ void mmpcam_calc_dphy(struct mcam_camera *mcam)
return; return;
/* get the escape clk, this is hard coded */ /* get the escape clk, this is hard coded */
clk_prepare_enable(cam->mipi_clk);
tx_clk_esc = (clk_get_rate(cam->mipi_clk) / 1000000) / 12; tx_clk_esc = (clk_get_rate(cam->mipi_clk) / 1000000) / 12;
clk_disable_unprepare(cam->mipi_clk);
/* /*
* dphy[2] - CSI2_DPHY6: * dphy[2] - CSI2_DPHY6:
* bit 0 ~ bit 7: CK Term Enable * bit 0 ~ bit 7: CK Term Enable
@ -325,19 +314,6 @@ static irqreturn_t mmpcam_irq(int irq, void *data)
return IRQ_RETVAL(handled); return IRQ_RETVAL(handled);
} }
static void mcam_deinit_clk(struct mcam_camera *mcam)
{
unsigned int i;
for (i = 0; i < NR_MCAM_CLK; i++) {
if (!IS_ERR(mcam->clk[i])) {
if (mcam->clk[i])
devm_clk_put(mcam->dev, mcam->clk[i]);
}
mcam->clk[i] = NULL;
}
}
static void mcam_init_clk(struct mcam_camera *mcam) static void mcam_init_clk(struct mcam_camera *mcam)
{ {
unsigned int i; unsigned int i;
@ -371,7 +347,6 @@ static int mmpcam_probe(struct platform_device *pdev)
if (cam == NULL) if (cam == NULL)
return -ENOMEM; return -ENOMEM;
cam->pdev = pdev; cam->pdev = pdev;
cam->mipi_clk = NULL;
INIT_LIST_HEAD(&cam->devlist); INIT_LIST_HEAD(&cam->devlist);
mcam = &cam->mcam; mcam = &cam->mcam;
@ -387,6 +362,11 @@ static int mmpcam_probe(struct platform_device *pdev)
mcam->mclk_div = pdata->mclk_div; mcam->mclk_div = pdata->mclk_div;
mcam->bus_type = pdata->bus_type; mcam->bus_type = pdata->bus_type;
mcam->dphy = pdata->dphy; mcam->dphy = pdata->dphy;
if (mcam->bus_type == V4L2_MBUS_CSI2) {
cam->mipi_clk = devm_clk_get(mcam->dev, "mipi");
if ((IS_ERR(cam->mipi_clk) && mcam->dphy[2] == 0))
return PTR_ERR(cam->mipi_clk);
}
mcam->mipi_enabled = false; mcam->mipi_enabled = false;
mcam->lane = pdata->lane; mcam->lane = pdata->lane;
mcam->chip_id = MCAM_ARMADA610; mcam->chip_id = MCAM_ARMADA610;
@ -444,7 +424,7 @@ static int mmpcam_probe(struct platform_device *pdev)
*/ */
ret = mmpcam_power_up(mcam); ret = mmpcam_power_up(mcam);
if (ret) if (ret)
goto out_deinit_clk; return ret;
ret = mccic_register(mcam); ret = mccic_register(mcam);
if (ret) if (ret)
goto out_power_down; goto out_power_down;
@ -469,8 +449,6 @@ out_unregister:
mccic_shutdown(mcam); mccic_shutdown(mcam);
out_power_down: out_power_down:
mmpcam_power_down(mcam); mmpcam_power_down(mcam);
out_deinit_clk:
mcam_deinit_clk(mcam);
return ret; return ret;
} }
@ -478,18 +456,10 @@ out_deinit_clk:
static int mmpcam_remove(struct mmp_camera *cam) static int mmpcam_remove(struct mmp_camera *cam)
{ {
struct mcam_camera *mcam = &cam->mcam; struct mcam_camera *mcam = &cam->mcam;
struct mmp_camera_platform_data *pdata;
mmpcam_remove_device(cam); mmpcam_remove_device(cam);
mccic_shutdown(mcam); mccic_shutdown(mcam);
mmpcam_power_down(mcam); mmpcam_power_down(mcam);
pdata = cam->pdev->dev.platform_data;
gpio_free(pdata->sensor_reset_gpio);
gpio_free(pdata->sensor_power_gpio);
mcam_deinit_clk(mcam);
iounmap(cam->power_regs);
iounmap(mcam->regs);
kfree(cam);
return 0; return 0;
} }

View File

@ -1673,7 +1673,7 @@ void omap3isp_print_status(struct isp_device *isp)
* ISP clocks get disabled in suspend(). Similarly, the clocks are reenabled in * ISP clocks get disabled in suspend(). Similarly, the clocks are reenabled in
* resume(), and the the pipelines are restarted in complete(). * resume(), and the the pipelines are restarted in complete().
* *
* TODO: PM dependencies between the ISP and sensors are not modeled explicitly * TODO: PM dependencies between the ISP and sensors are not modelled explicitly
* yet. * yet.
*/ */
static int isp_pm_prepare(struct device *dev) static int isp_pm_prepare(struct device *dev)

View File

@ -339,14 +339,11 @@ __isp_video_get_format(struct isp_video *video, struct v4l2_format *format)
if (subdev == NULL) if (subdev == NULL)
return -EINVAL; return -EINVAL;
mutex_lock(&video->mutex);
fmt.pad = pad; fmt.pad = pad;
fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE; fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
ret = v4l2_subdev_call(subdev, pad, get_fmt, NULL, &fmt);
if (ret == -ENOIOCTLCMD)
ret = -EINVAL;
mutex_lock(&video->mutex);
ret = v4l2_subdev_call(subdev, pad, get_fmt, NULL, &fmt);
mutex_unlock(&video->mutex); mutex_unlock(&video->mutex);
if (ret) if (ret)

View File

@ -382,7 +382,7 @@
#define S5P_FIMV_R2H_CMD_EDFU_INIT_RET 16 #define S5P_FIMV_R2H_CMD_EDFU_INIT_RET 16
#define S5P_FIMV_R2H_CMD_ERR_RET 32 #define S5P_FIMV_R2H_CMD_ERR_RET 32
/* Dummy definition for MFCv6 compatibilty */ /* Dummy definition for MFCv6 compatibility */
#define S5P_FIMV_CODEC_H264_MVC_DEC -1 #define S5P_FIMV_CODEC_H264_MVC_DEC -1
#define S5P_FIMV_R2H_CMD_FIELD_DONE_RET -1 #define S5P_FIMV_R2H_CMD_FIELD_DONE_RET -1
#define S5P_FIMV_MFC_RESET -1 #define S5P_FIMV_MFC_RESET -1

View File

@ -239,7 +239,7 @@ static void s5p_mfc_handle_frame_copy_time(struct s5p_mfc_ctx *ctx)
frame_type = s5p_mfc_hw_call(dev->mfc_ops, get_dec_frame_type, dev); frame_type = s5p_mfc_hw_call(dev->mfc_ops, get_dec_frame_type, dev);
/* Copy timestamp / timecode from decoded src to dst and set /* Copy timestamp / timecode from decoded src to dst and set
appropraite flags */ appropriate flags */
src_buf = list_entry(ctx->src_queue.next, struct s5p_mfc_buf, list); src_buf = list_entry(ctx->src_queue.next, struct s5p_mfc_buf, list);
list_for_each_entry(dst_buf, &ctx->dst_queue, list) { list_for_each_entry(dst_buf, &ctx->dst_queue, list) {
if (vb2_dma_contig_plane_dma_addr(dst_buf->b, 0) == dec_y_addr) { if (vb2_dma_contig_plane_dma_addr(dst_buf->b, 0) == dec_y_addr) {
@ -428,7 +428,7 @@ static void s5p_mfc_handle_error(struct s5p_mfc_dev *dev,
case MFCINST_FINISHING: case MFCINST_FINISHING:
case MFCINST_FINISHED: case MFCINST_FINISHED:
case MFCINST_RUNNING: case MFCINST_RUNNING:
/* It is higly probable that an error occured /* It is highly probable that an error occurred
* while decoding a frame */ * while decoding a frame */
clear_work_bit(ctx); clear_work_bit(ctx);
ctx->state = MFCINST_ERROR; ctx->state = MFCINST_ERROR;
@ -611,7 +611,7 @@ static irqreturn_t s5p_mfc_irq(int irq, void *priv)
mfc_debug(1, "Int reason: %d (err: %08x)\n", reason, err); mfc_debug(1, "Int reason: %d (err: %08x)\n", reason, err);
switch (reason) { switch (reason) {
case S5P_MFC_R2H_CMD_ERR_RET: case S5P_MFC_R2H_CMD_ERR_RET:
/* An error has occured */ /* An error has occurred */
if (ctx->state == MFCINST_RUNNING && if (ctx->state == MFCINST_RUNNING &&
s5p_mfc_hw_call(dev->mfc_ops, err_dec, err) >= s5p_mfc_hw_call(dev->mfc_ops, err_dec, err) >=
dev->warn_start) dev->warn_start)
@ -840,7 +840,7 @@ static int s5p_mfc_open(struct file *file)
mutex_unlock(&dev->mfc_mutex); mutex_unlock(&dev->mfc_mutex);
mfc_debug_leave(); mfc_debug_leave();
return ret; return ret;
/* Deinit when failure occured */ /* Deinit when failure occurred */
err_queue_init: err_queue_init:
if (dev->num_inst == 1) if (dev->num_inst == 1)
s5p_mfc_deinit_hw(dev); s5p_mfc_deinit_hw(dev);
@ -881,14 +881,14 @@ static int s5p_mfc_release(struct file *file)
/* Mark context as idle */ /* Mark context as idle */
clear_work_bit_irqsave(ctx); clear_work_bit_irqsave(ctx);
/* If instance was initialised then /* If instance was initialised then
* return instance and free reosurces */ * return instance and free resources */
if (ctx->inst_no != MFC_NO_INSTANCE_SET) { if (ctx->inst_no != MFC_NO_INSTANCE_SET) {
mfc_debug(2, "Has to free instance\n"); mfc_debug(2, "Has to free instance\n");
ctx->state = MFCINST_RETURN_INST; ctx->state = MFCINST_RETURN_INST;
set_work_bit_irqsave(ctx); set_work_bit_irqsave(ctx);
s5p_mfc_clean_ctx_int_flags(ctx); s5p_mfc_clean_ctx_int_flags(ctx);
s5p_mfc_hw_call(dev->mfc_ops, try_run, dev); s5p_mfc_hw_call(dev->mfc_ops, try_run, dev);
/* Wait until instance is returned or timeout occured */ /* Wait until instance is returned or timeout occurred */
if (s5p_mfc_wait_for_done_ctx if (s5p_mfc_wait_for_done_ctx
(ctx, S5P_MFC_R2H_CMD_CLOSE_INSTANCE_RET, 0)) { (ctx, S5P_MFC_R2H_CMD_CLOSE_INSTANCE_RET, 0)) {
s5p_mfc_clock_off(); s5p_mfc_clock_off();

View File

@ -69,7 +69,7 @@ int s5p_mfc_alloc_firmware(struct s5p_mfc_dev *dev)
} else { } else {
/* In this case bank2 can point to the same address as bank1. /* In this case bank2 can point to the same address as bank1.
* Firmware will always occupy the beggining of this area so it is * Firmware will always occupy the beginning of this area so it is
* impossible having a video frame buffer with zero address. */ * impossible having a video frame buffer with zero address. */
dev->bank2 = dev->bank1; dev->bank2 = dev->bank1;
} }

View File

@ -65,7 +65,7 @@ struct mxr_format {
int num_subframes; int num_subframes;
/** specifies to which subframe belong given plane */ /** specifies to which subframe belong given plane */
int plane2subframe[MXR_MAX_PLANES]; int plane2subframe[MXR_MAX_PLANES];
/** internal code, driver dependant */ /** internal code, driver dependent */
unsigned long cookie; unsigned long cookie;
}; };

View File

@ -528,7 +528,7 @@ static int mxr_s_dv_timings(struct file *file, void *fh,
mutex_lock(&mdev->mutex); mutex_lock(&mdev->mutex);
/* timings change cannot be done while there is an entity /* timings change cannot be done while there is an entity
* dependant on output configuration * dependent on output configuration
*/ */
if (mdev->n_output > 0) { if (mdev->n_output > 0) {
mutex_unlock(&mdev->mutex); mutex_unlock(&mdev->mutex);
@ -585,7 +585,7 @@ static int mxr_s_std(struct file *file, void *fh, v4l2_std_id norm)
mutex_lock(&mdev->mutex); mutex_lock(&mdev->mutex);
/* standard change cannot be done while there is an entity /* standard change cannot be done while there is an entity
* dependant on output configuration * dependent on output configuration
*/ */
if (mdev->n_output > 0) { if (mdev->n_output > 0) {
mutex_unlock(&mdev->mutex); mutex_unlock(&mdev->mutex);

View File

@ -1495,7 +1495,7 @@ static int omap1_cam_set_bus_param(struct soc_camera_device *icd)
if (ctrlclock & LCLK_EN) if (ctrlclock & LCLK_EN)
CAM_WRITE(pcdev, CTRLCLOCK, ctrlclock); CAM_WRITE(pcdev, CTRLCLOCK, ctrlclock);
/* select bus endianess */ /* select bus endianness */
xlate = soc_camera_xlate_by_fourcc(icd, pixfmt); xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
fmt = xlate->host_fmt; fmt = xlate->host_fmt;

View File

@ -1108,7 +1108,7 @@ static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
return 0; return 0;
} }
/* timeperframe is arbitrary and continous */ /* timeperframe is arbitrary and continuous */
static int vidioc_enum_frameintervals(struct file *file, void *priv, static int vidioc_enum_frameintervals(struct file *file, void *priv,
struct v4l2_frmivalenum *fival) struct v4l2_frmivalenum *fival)
{ {
@ -1125,7 +1125,7 @@ static int vidioc_enum_frameintervals(struct file *file, void *priv,
fival->type = V4L2_FRMIVAL_TYPE_CONTINUOUS; fival->type = V4L2_FRMIVAL_TYPE_CONTINUOUS;
/* fill in stepwise (step=1.0 is requred by V4L2 spec) */ /* fill in stepwise (step=1.0 is required by V4L2 spec) */
fival->stepwise.min = tpf_min; fival->stepwise.min = tpf_min;
fival->stepwise.max = tpf_max; fival->stepwise.max = tpf_max;
fival->stepwise.step = (struct v4l2_fract) {1, 1}; fival->stepwise.step = (struct v4l2_fract) {1, 1};

View File

@ -323,7 +323,7 @@ static void vsp1_clocks_disable(struct vsp1_device *vsp1)
* Increment the VSP1 reference count and initialize the device if the first * Increment the VSP1 reference count and initialize the device if the first
* reference is taken. * reference is taken.
* *
* Return a pointer to the VSP1 device or NULL if an error occured. * Return a pointer to the VSP1 device or NULL if an error occurred.
*/ */
struct vsp1_device *vsp1_device_get(struct vsp1_device *vsp1) struct vsp1_device *vsp1_device_get(struct vsp1_device *vsp1)
{ {

View File

@ -1026,8 +1026,10 @@ int vsp1_video_init(struct vsp1_video *video, struct vsp1_entity *rwpf)
/* ... and the buffers queue... */ /* ... and the buffers queue... */
video->alloc_ctx = vb2_dma_contig_init_ctx(video->vsp1->dev); video->alloc_ctx = vb2_dma_contig_init_ctx(video->vsp1->dev);
if (IS_ERR(video->alloc_ctx)) if (IS_ERR(video->alloc_ctx)) {
ret = PTR_ERR(video->alloc_ctx);
goto error; goto error;
}
video->queue.type = video->type; video->queue.type = video->type;
video->queue.io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF; video->queue.io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF;

View File

@ -271,8 +271,7 @@ static void shark_unregister_leds(struct shark_device *shark)
cancel_work_sync(&shark->led_work); cancel_work_sync(&shark->led_work);
} }
#ifdef CONFIG_PM static inline void shark_resume_leds(struct shark_device *shark)
static void shark_resume_leds(struct shark_device *shark)
{ {
if (test_bit(BLUE_IS_PULSE, &shark->brightness_new)) if (test_bit(BLUE_IS_PULSE, &shark->brightness_new))
set_bit(BLUE_PULSE_LED, &shark->brightness_new); set_bit(BLUE_PULSE_LED, &shark->brightness_new);
@ -281,7 +280,6 @@ static void shark_resume_leds(struct shark_device *shark)
set_bit(RED_LED, &shark->brightness_new); set_bit(RED_LED, &shark->brightness_new);
schedule_work(&shark->led_work); schedule_work(&shark->led_work);
} }
#endif
#else #else
static int shark_register_leds(struct shark_device *shark, struct device *dev) static int shark_register_leds(struct shark_device *shark, struct device *dev)
{ {

View File

@ -237,8 +237,7 @@ static void shark_unregister_leds(struct shark_device *shark)
cancel_work_sync(&shark->led_work); cancel_work_sync(&shark->led_work);
} }
#ifdef CONFIG_PM static inline void shark_resume_leds(struct shark_device *shark)
static void shark_resume_leds(struct shark_device *shark)
{ {
int i; int i;
@ -247,7 +246,6 @@ static void shark_resume_leds(struct shark_device *shark)
schedule_work(&shark->led_work); schedule_work(&shark->led_work);
} }
#endif
#else #else
static int shark_register_leds(struct shark_device *shark, struct device *dev) static int shark_register_leds(struct shark_device *shark, struct device *dev)
{ {

View File

@ -268,8 +268,8 @@ struct si476x_radio;
* *
* @tune_freq: Tune chip to a specific frequency * @tune_freq: Tune chip to a specific frequency
* @seek_start: Star station seeking * @seek_start: Star station seeking
* @rsq_status: Get Recieved Signal Quality(RSQ) status * @rsq_status: Get Received Signal Quality(RSQ) status
* @rds_blckcnt: Get recived RDS blocks count * @rds_blckcnt: Get received RDS blocks count
* @phase_diversity: Change phase diversity mode of the tuner * @phase_diversity: Change phase diversity mode of the tuner
* @phase_div_status: Get phase diversity mode status * @phase_div_status: Get phase diversity mode status
* @acf_status: Get the status of Automatically Controlled * @acf_status: Get the status of Automatically Controlled

View File

@ -356,7 +356,7 @@ static int vidioc_s_frequency(struct file *file, void *priv,
So we keep it as-is. */ So we keep it as-is. */
return -EINVAL; return -EINVAL;
} }
clamp(freq, FREQ_MIN * FREQ_MUL, FREQ_MAX * FREQ_MUL); freq = clamp(freq, FREQ_MIN * FREQ_MUL, FREQ_MAX * FREQ_MUL);
tea5764_power_up(radio); tea5764_power_up(radio);
tea5764_tune(radio, (freq * 125) / 2); tea5764_tune(radio, (freq * 125) / 2);
return 0; return 0;

View File

@ -112,7 +112,7 @@ static int tef6862_s_frequency(struct v4l2_subdev *sd, const struct v4l2_frequen
if (f->tuner != 0) if (f->tuner != 0)
return -EINVAL; return -EINVAL;
clamp(freq, TEF6862_LO_FREQ, TEF6862_HI_FREQ); freq = clamp(freq, TEF6862_LO_FREQ, TEF6862_HI_FREQ);
pll = 1964 + ((freq - TEF6862_LO_FREQ) * 20) / FREQ_MUL; pll = 1964 + ((freq - TEF6862_LO_FREQ) * 20) / FREQ_MUL;
i2cmsg[0] = (MSA_MODE_PRESET << MSA_MODE_SHIFT) | WM_SUB_PLLM; i2cmsg[0] = (MSA_MODE_PRESET << MSA_MODE_SHIFT) | WM_SUB_PLLM;
i2cmsg[1] = (pll >> 8) & 0xff; i2cmsg[1] = (pll >> 8) & 0xff;

View File

@ -1370,7 +1370,7 @@ static void imon_pad_to_keys(struct imon_context *ictx, unsigned char *buf)
* 0x68nnnnB7 to 0x6AnnnnB7, the left mouse button generates * 0x68nnnnB7 to 0x6AnnnnB7, the left mouse button generates
* 0x688301b7 and the right one 0x688481b7. All other keys generate * 0x688301b7 and the right one 0x688481b7. All other keys generate
* 0x2nnnnnnn. Position coordinate is encoded in buf[1] and buf[2] with * 0x2nnnnnnn. Position coordinate is encoded in buf[1] and buf[2] with
* reversed endianess. Extract direction from buffer, rotate endianess, * reversed endianness. Extract direction from buffer, rotate endianness,
* adjust sign and feed the values into stabilize(). The resulting codes * adjust sign and feed the values into stabilize(). The resulting codes
* will be 0x01008000, 0x01007F00, which match the newer devices. * will be 0x01008000, 0x01007F00, which match the newer devices.
*/ */

View File

@ -118,7 +118,7 @@ static int debug;
#define RR3_IR_IO_LENGTH_FUZZ 0x04 #define RR3_IR_IO_LENGTH_FUZZ 0x04
/* Timeout for end of signal detection */ /* Timeout for end of signal detection */
#define RR3_IR_IO_SIG_TIMEOUT 0x05 #define RR3_IR_IO_SIG_TIMEOUT 0x05
/* Minumum value for pause recognition. */ /* Minimum value for pause recognition. */
#define RR3_IR_IO_MIN_PAUSE 0x06 #define RR3_IR_IO_MIN_PAUSE 0x06
/* Clock freq. of EZ-USB chip */ /* Clock freq. of EZ-USB chip */

View File

@ -1195,7 +1195,7 @@ static u32 mt2063_set_dnc_output_enable(struct mt2063_state *state,
* DNC Output is selected, the other is always off) * DNC Output is selected, the other is always off)
* *
* @state: ptr to mt2063_state structure * @state: ptr to mt2063_state structure
* @Mode: desired reciever delivery system * @Mode: desired receiver delivery system
* *
* Note: Register cache must be valid for it to work * Note: Register cache must be valid for it to work
*/ */
@ -2119,7 +2119,7 @@ static int mt2063_set_analog_params(struct dvb_frontend *fe,
/* /*
* As defined on EN 300 429, the DVB-C roll-off factor is 0.15. * As defined on EN 300 429, the DVB-C roll-off factor is 0.15.
* So, the amount of the needed bandwith is given by: * So, the amount of the needed bandwidth is given by:
* Bw = Symbol_rate * (1 + 0.15) * Bw = Symbol_rate * (1 + 0.15)
* As such, the maximum symbol rate supported by 6 MHz is given by: * As such, the maximum symbol rate supported by 6 MHz is given by:
* max_symbol_rate = 6 MHz / 1.15 = 5217391 Bauds * max_symbol_rate = 6 MHz / 1.15 = 5217391 Bauds

View File

@ -119,7 +119,7 @@
#define V4L2_STD_A2 (V4L2_STD_A2_A | V4L2_STD_A2_B) #define V4L2_STD_A2 (V4L2_STD_A2_A | V4L2_STD_A2_B)
#define V4L2_STD_NICAM (V4L2_STD_NICAM_A | V4L2_STD_NICAM_B) #define V4L2_STD_NICAM (V4L2_STD_NICAM_A | V4L2_STD_NICAM_B)
/* To preserve backward compatibilty, /* To preserve backward compatibility,
(std & V4L2_STD_AUDIO) = 0 means that ALL audio stds are supported (std & V4L2_STD_AUDIO) = 0 means that ALL audio stds are supported
*/ */

View File

@ -1412,8 +1412,8 @@ err_v4l2:
usb_set_intfdata(interface, NULL); usb_set_intfdata(interface, NULL);
err_if: err_if:
usb_put_dev(udev); usb_put_dev(udev);
kfree(dev);
clear_bit(dev->devno, &cx231xx_devused); clear_bit(dev->devno, &cx231xx_devused);
kfree(dev);
return retval; return retval;
} }

View File

@ -131,7 +131,7 @@ static int af9035_wr_regs(struct dvb_usb_device *d, u32 reg, u8 *val, int len)
{ {
u8 wbuf[MAX_XFER_SIZE]; u8 wbuf[MAX_XFER_SIZE];
u8 mbox = (reg >> 16) & 0xff; u8 mbox = (reg >> 16) & 0xff;
struct usb_req req = { CMD_MEM_WR, mbox, sizeof(wbuf), wbuf, 0, NULL }; struct usb_req req = { CMD_MEM_WR, mbox, 6 + len, wbuf, 0, NULL };
if (6 + len > sizeof(wbuf)) { if (6 + len > sizeof(wbuf)) {
dev_warn(&d->udev->dev, "%s: i2c wr: len=%d is too big!\n", dev_warn(&d->udev->dev, "%s: i2c wr: len=%d is too big!\n",
@ -238,14 +238,15 @@ static int af9035_i2c_master_xfer(struct i2c_adapter *adap,
} else { } else {
/* I2C */ /* I2C */
u8 buf[MAX_XFER_SIZE]; u8 buf[MAX_XFER_SIZE];
struct usb_req req = { CMD_I2C_RD, 0, sizeof(buf), struct usb_req req = { CMD_I2C_RD, 0, 5 + msg[0].len,
buf, msg[1].len, msg[1].buf }; buf, msg[1].len, msg[1].buf };
if (5 + msg[0].len > sizeof(buf)) { if (5 + msg[0].len > sizeof(buf)) {
dev_warn(&d->udev->dev, dev_warn(&d->udev->dev,
"%s: i2c xfer: len=%d is too big!\n", "%s: i2c xfer: len=%d is too big!\n",
KBUILD_MODNAME, msg[0].len); KBUILD_MODNAME, msg[0].len);
return -EOPNOTSUPP; ret = -EOPNOTSUPP;
goto unlock;
} }
req.mbox |= ((msg[0].addr & 0x80) >> 3); req.mbox |= ((msg[0].addr & 0x80) >> 3);
buf[0] = msg[1].len; buf[0] = msg[1].len;
@ -274,14 +275,15 @@ static int af9035_i2c_master_xfer(struct i2c_adapter *adap,
} else { } else {
/* I2C */ /* I2C */
u8 buf[MAX_XFER_SIZE]; u8 buf[MAX_XFER_SIZE];
struct usb_req req = { CMD_I2C_WR, 0, sizeof(buf), buf, struct usb_req req = { CMD_I2C_WR, 0, 5 + msg[0].len,
0, NULL }; buf, 0, NULL };
if (5 + msg[0].len > sizeof(buf)) { if (5 + msg[0].len > sizeof(buf)) {
dev_warn(&d->udev->dev, dev_warn(&d->udev->dev,
"%s: i2c xfer: len=%d is too big!\n", "%s: i2c xfer: len=%d is too big!\n",
KBUILD_MODNAME, msg[0].len); KBUILD_MODNAME, msg[0].len);
return -EOPNOTSUPP; ret = -EOPNOTSUPP;
goto unlock;
} }
req.mbox |= ((msg[0].addr & 0x80) >> 3); req.mbox |= ((msg[0].addr & 0x80) >> 3);
buf[0] = msg[0].len; buf[0] = msg[0].len;
@ -319,6 +321,7 @@ static int af9035_i2c_master_xfer(struct i2c_adapter *adap,
ret = -EOPNOTSUPP; ret = -EOPNOTSUPP;
} }
unlock:
mutex_unlock(&d->i2c_mutex); mutex_unlock(&d->i2c_mutex);
if (ret < 0) if (ret < 0)
@ -1534,6 +1537,8 @@ static const struct usb_device_id af9035_id_table[] = {
/* XXX: that same ID [0ccd:0099] is used by af9015 driver too */ /* XXX: that same ID [0ccd:0099] is used by af9015 driver too */
{ DVB_USB_DEVICE(USB_VID_TERRATEC, 0x0099, { DVB_USB_DEVICE(USB_VID_TERRATEC, 0x0099,
&af9035_props, "TerraTec Cinergy T Stick Dual RC (rev. 2)", NULL) }, &af9035_props, "TerraTec Cinergy T Stick Dual RC (rev. 2)", NULL) },
{ DVB_USB_DEVICE(USB_VID_LEADTEK, 0x6a05,
&af9035_props, "Leadtek WinFast DTV Dongle Dual", NULL) },
{ } { }
}; };
MODULE_DEVICE_TABLE(usb, af9035_id_table); MODULE_DEVICE_TABLE(usb, af9035_id_table);

View File

@ -266,7 +266,7 @@ static int mxl111sf_adap_fe_init(struct dvb_frontend *fe)
struct mxl111sf_adap_state *adap_state = &state->adap_state[fe->id]; struct mxl111sf_adap_state *adap_state = &state->adap_state[fe->id];
int err; int err;
/* exit if we didnt initialize the driver yet */ /* exit if we didn't initialize the driver yet */
if (!state->chip_id) { if (!state->chip_id) {
mxl_debug("driver not yet initialized, exit."); mxl_debug("driver not yet initialized, exit.");
goto fail; goto fail;
@ -322,7 +322,7 @@ static int mxl111sf_adap_fe_sleep(struct dvb_frontend *fe)
struct mxl111sf_adap_state *adap_state = &state->adap_state[fe->id]; struct mxl111sf_adap_state *adap_state = &state->adap_state[fe->id];
int err; int err;
/* exit if we didnt initialize the driver yet */ /* exit if we didn't initialize the driver yet */
if (!state->chip_id) { if (!state->chip_id) {
mxl_debug("driver not yet initialized, exit."); mxl_debug("driver not yet initialized, exit.");
goto fail; goto fail;

View File

@ -102,7 +102,7 @@ static int technisat_usb2_i2c_access(struct usb_device *udev,
if (rxlen > 62) { if (rxlen > 62) {
err("i2c RX buffer can't exceed 62 bytes (dev 0x%02x)", err("i2c RX buffer can't exceed 62 bytes (dev 0x%02x)",
device_addr); device_addr);
txlen = 62; rxlen = 62;
} }
b[0] = I2C_SPEED_100KHZ_BIT; b[0] = I2C_SPEED_100KHZ_BIT;

View File

@ -1664,8 +1664,8 @@ static int em28xx_v4l2_close(struct file *filp)
em28xx_videodbg("users=%d\n", dev->users); em28xx_videodbg("users=%d\n", dev->users);
mutex_lock(&dev->lock);
vb2_fop_release(filp); vb2_fop_release(filp);
mutex_lock(&dev->lock);
if (dev->users == 1) { if (dev->users == 1) {
/* the device is already disconnect, /* the device is already disconnect,

View File

@ -438,7 +438,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
s32 nToSkip = s32 nToSkip =
sd->swapRB * (gspca_dev->cam.cam_mode[mode].bytesperline + 1); sd->swapRB * (gspca_dev->cam.cam_mode[mode].bytesperline + 1);
/* Test only against 0202h, so endianess does not matter */ /* Test only against 0202h, so endianness does not matter */
switch (*(s16 *) data) { switch (*(s16 *) data) {
case 0x0202: /* End of frame, start a new one */ case 0x0202: /* End of frame, start a new one */
gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0); gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);

View File

@ -416,7 +416,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
#if IS_ENABLED(CONFIG_INPUT) #if IS_ENABLED(CONFIG_INPUT)
static int sd_int_pkt_scan(struct gspca_dev *gspca_dev, static int sd_int_pkt_scan(struct gspca_dev *gspca_dev,
u8 *data, /* interrupt packet data */ u8 *data, /* interrupt packet data */
int len) /* interrput packet length */ int len) /* interrupt packet length */
{ {
int ret = -EINVAL; int ret = -EINVAL;

View File

@ -874,7 +874,7 @@ static int sd_dbg_s_register(struct gspca_dev *gspca_dev,
#if IS_ENABLED(CONFIG_INPUT) #if IS_ENABLED(CONFIG_INPUT)
static int sd_int_pkt_scan(struct gspca_dev *gspca_dev, static int sd_int_pkt_scan(struct gspca_dev *gspca_dev,
u8 *data, /* interrupt packet data */ u8 *data, /* interrupt packet data */
int len) /* interrput packet length */ int len) /* interrupt packet length */
{ {
int ret = -EINVAL; int ret = -EINVAL;
u8 data0, data1; u8 data0, data1;

View File

@ -361,6 +361,9 @@ static void stk1135_configure_clock(struct gspca_dev *gspca_dev)
/* set serial interface clock divider (30MHz/0x1f*16+2) = 60240 kHz) */ /* set serial interface clock divider (30MHz/0x1f*16+2) = 60240 kHz) */
reg_w(gspca_dev, STK1135_REG_SICTL + 2, 0x1f); reg_w(gspca_dev, STK1135_REG_SICTL + 2, 0x1f);
/* wait a while for sensor to catch up */
udelay(1000);
} }
static void stk1135_camera_disable(struct gspca_dev *gspca_dev) static void stk1135_camera_disable(struct gspca_dev *gspca_dev)

View File

@ -139,7 +139,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
struct cam *cam = &gspca_dev->cam; struct cam *cam = &gspca_dev->cam;
/* Give the camera some time to settle, otherwise initalization will /* Give the camera some time to settle, otherwise initialization will
fail on hotplug, and yes it really needs a full second. */ fail on hotplug, and yes it really needs a full second. */
msleep(1000); msleep(1000);

View File

@ -1027,6 +1027,7 @@ static const struct usb_device_id device_table[] = {
{USB_DEVICE(0x055f, 0xc650), BS(SPCA533, 0)}, {USB_DEVICE(0x055f, 0xc650), BS(SPCA533, 0)},
{USB_DEVICE(0x05da, 0x1018), BS(SPCA504B, 0)}, {USB_DEVICE(0x05da, 0x1018), BS(SPCA504B, 0)},
{USB_DEVICE(0x06d6, 0x0031), BS(SPCA533, 0)}, {USB_DEVICE(0x06d6, 0x0031), BS(SPCA533, 0)},
{USB_DEVICE(0x06d6, 0x0041), BS(SPCA504B, 0)},
{USB_DEVICE(0x0733, 0x1311), BS(SPCA533, 0)}, {USB_DEVICE(0x0733, 0x1311), BS(SPCA533, 0)},
{USB_DEVICE(0x0733, 0x1314), BS(SPCA533, 0)}, {USB_DEVICE(0x0733, 0x1314), BS(SPCA533, 0)},
{USB_DEVICE(0x0733, 0x2211), BS(SPCA533, 0)}, {USB_DEVICE(0x0733, 0x2211), BS(SPCA533, 0)},

View File

@ -6905,7 +6905,7 @@ static int sd_get_jcomp(struct gspca_dev *gspca_dev,
#if IS_ENABLED(CONFIG_INPUT) #if IS_ENABLED(CONFIG_INPUT)
static int sd_int_pkt_scan(struct gspca_dev *gspca_dev, static int sd_int_pkt_scan(struct gspca_dev *gspca_dev,
u8 *data, /* interrupt packet data */ u8 *data, /* interrupt packet data */
int len) /* interrput packet length */ int len) /* interrupt packet length */
{ {
if (len == 8 && data[4] == 1) { if (len == 8 && data[4] == 1) {
input_report_key(gspca_dev->input_dev, KEY_CAMERA, 1); input_report_key(gspca_dev->input_dev, KEY_CAMERA, 1);

View File

@ -1039,7 +1039,7 @@ static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id
/* Set the leds off */ /* Set the leds off */
pwc_set_leds(pdev, 0, 0); pwc_set_leds(pdev, 0, 0);
/* Setup intial videomode */ /* Setup initial videomode */
rc = pwc_set_video_mode(pdev, MAX_WIDTH, MAX_HEIGHT, rc = pwc_set_video_mode(pdev, MAX_WIDTH, MAX_HEIGHT,
V4L2_PIX_FMT_YUV420, 30, &compression, 1); V4L2_PIX_FMT_YUV420, 30, &compression, 1);
if (rc) if (rc)

View File

@ -50,13 +50,8 @@
#define USBTV_ISOC_TRANSFERS 16 #define USBTV_ISOC_TRANSFERS 16
#define USBTV_ISOC_PACKETS 8 #define USBTV_ISOC_PACKETS 8
#define USBTV_WIDTH 720
#define USBTV_HEIGHT 480
#define USBTV_CHUNK_SIZE 256 #define USBTV_CHUNK_SIZE 256
#define USBTV_CHUNK 240 #define USBTV_CHUNK 240
#define USBTV_CHUNKS (USBTV_WIDTH * USBTV_HEIGHT \
/ 4 / USBTV_CHUNK)
/* Chunk header. */ /* Chunk header. */
#define USBTV_MAGIC_OK(chunk) ((be32_to_cpu(chunk[0]) & 0xff000000) \ #define USBTV_MAGIC_OK(chunk) ((be32_to_cpu(chunk[0]) & 0xff000000) \
@ -65,6 +60,27 @@
#define USBTV_ODD(chunk) ((be32_to_cpu(chunk[0]) & 0x0000f000) >> 15) #define USBTV_ODD(chunk) ((be32_to_cpu(chunk[0]) & 0x0000f000) >> 15)
#define USBTV_CHUNK_NO(chunk) (be32_to_cpu(chunk[0]) & 0x00000fff) #define USBTV_CHUNK_NO(chunk) (be32_to_cpu(chunk[0]) & 0x00000fff)
#define USBTV_TV_STD (V4L2_STD_525_60 | V4L2_STD_PAL)
/* parameters for supported TV norms */
struct usbtv_norm_params {
v4l2_std_id norm;
int cap_width, cap_height;
};
static struct usbtv_norm_params norm_params[] = {
{
.norm = V4L2_STD_525_60,
.cap_width = 720,
.cap_height = 480,
},
{
.norm = V4L2_STD_PAL,
.cap_width = 720,
.cap_height = 576,
}
};
/* A single videobuf2 frame buffer. */ /* A single videobuf2 frame buffer. */
struct usbtv_buf { struct usbtv_buf {
struct vb2_buffer vb; struct vb2_buffer vb;
@ -94,11 +110,38 @@ struct usbtv {
USBTV_COMPOSITE_INPUT, USBTV_COMPOSITE_INPUT,
USBTV_SVIDEO_INPUT, USBTV_SVIDEO_INPUT,
} input; } input;
v4l2_std_id norm;
int width, height;
int n_chunks;
int iso_size; int iso_size;
unsigned int sequence; unsigned int sequence;
struct urb *isoc_urbs[USBTV_ISOC_TRANSFERS]; struct urb *isoc_urbs[USBTV_ISOC_TRANSFERS];
}; };
static int usbtv_configure_for_norm(struct usbtv *usbtv, v4l2_std_id norm)
{
int i, ret = 0;
struct usbtv_norm_params *params = NULL;
for (i = 0; i < ARRAY_SIZE(norm_params); i++) {
if (norm_params[i].norm & norm) {
params = &norm_params[i];
break;
}
}
if (params) {
usbtv->width = params->cap_width;
usbtv->height = params->cap_height;
usbtv->n_chunks = usbtv->width * usbtv->height
/ 4 / USBTV_CHUNK;
usbtv->norm = params->norm;
} else
ret = -EINVAL;
return ret;
}
static int usbtv_set_regs(struct usbtv *usbtv, const u16 regs[][2], int size) static int usbtv_set_regs(struct usbtv *usbtv, const u16 regs[][2], int size)
{ {
int ret; int ret;
@ -158,6 +201,57 @@ static int usbtv_select_input(struct usbtv *usbtv, int input)
return ret; return ret;
} }
static int usbtv_select_norm(struct usbtv *usbtv, v4l2_std_id norm)
{
int ret;
static const u16 pal[][2] = {
{ USBTV_BASE + 0x001a, 0x0068 },
{ USBTV_BASE + 0x010e, 0x0072 },
{ USBTV_BASE + 0x010f, 0x00a2 },
{ USBTV_BASE + 0x0112, 0x00b0 },
{ USBTV_BASE + 0x0117, 0x0001 },
{ USBTV_BASE + 0x0118, 0x002c },
{ USBTV_BASE + 0x012d, 0x0010 },
{ USBTV_BASE + 0x012f, 0x0020 },
{ USBTV_BASE + 0x024f, 0x0002 },
{ USBTV_BASE + 0x0254, 0x0059 },
{ USBTV_BASE + 0x025a, 0x0016 },
{ USBTV_BASE + 0x025b, 0x0035 },
{ USBTV_BASE + 0x0263, 0x0017 },
{ USBTV_BASE + 0x0266, 0x0016 },
{ USBTV_BASE + 0x0267, 0x0036 }
};
static const u16 ntsc[][2] = {
{ USBTV_BASE + 0x001a, 0x0079 },
{ USBTV_BASE + 0x010e, 0x0068 },
{ USBTV_BASE + 0x010f, 0x009c },
{ USBTV_BASE + 0x0112, 0x00f0 },
{ USBTV_BASE + 0x0117, 0x0000 },
{ USBTV_BASE + 0x0118, 0x00fc },
{ USBTV_BASE + 0x012d, 0x0004 },
{ USBTV_BASE + 0x012f, 0x0008 },
{ USBTV_BASE + 0x024f, 0x0001 },
{ USBTV_BASE + 0x0254, 0x005f },
{ USBTV_BASE + 0x025a, 0x0012 },
{ USBTV_BASE + 0x025b, 0x0001 },
{ USBTV_BASE + 0x0263, 0x001c },
{ USBTV_BASE + 0x0266, 0x0011 },
{ USBTV_BASE + 0x0267, 0x0005 }
};
ret = usbtv_configure_for_norm(usbtv, norm);
if (!ret) {
if (norm & V4L2_STD_525_60)
ret = usbtv_set_regs(usbtv, ntsc, ARRAY_SIZE(ntsc));
else if (norm & V4L2_STD_PAL)
ret = usbtv_set_regs(usbtv, pal, ARRAY_SIZE(pal));
}
return ret;
}
static int usbtv_setup_capture(struct usbtv *usbtv) static int usbtv_setup_capture(struct usbtv *usbtv)
{ {
int ret; int ret;
@ -225,26 +319,11 @@ static int usbtv_setup_capture(struct usbtv *usbtv)
{ USBTV_BASE + 0x0284, 0x0088 }, { USBTV_BASE + 0x0284, 0x0088 },
{ USBTV_BASE + 0x0003, 0x0004 }, { USBTV_BASE + 0x0003, 0x0004 },
{ USBTV_BASE + 0x001a, 0x0079 },
{ USBTV_BASE + 0x0100, 0x00d3 }, { USBTV_BASE + 0x0100, 0x00d3 },
{ USBTV_BASE + 0x010e, 0x0068 },
{ USBTV_BASE + 0x010f, 0x009c },
{ USBTV_BASE + 0x0112, 0x00f0 },
{ USBTV_BASE + 0x0115, 0x0015 }, { USBTV_BASE + 0x0115, 0x0015 },
{ USBTV_BASE + 0x0117, 0x0000 },
{ USBTV_BASE + 0x0118, 0x00fc },
{ USBTV_BASE + 0x012d, 0x0004 },
{ USBTV_BASE + 0x012f, 0x0008 },
{ USBTV_BASE + 0x0220, 0x002e }, { USBTV_BASE + 0x0220, 0x002e },
{ USBTV_BASE + 0x0225, 0x0008 }, { USBTV_BASE + 0x0225, 0x0008 },
{ USBTV_BASE + 0x024e, 0x0002 }, { USBTV_BASE + 0x024e, 0x0002 },
{ USBTV_BASE + 0x024f, 0x0001 },
{ USBTV_BASE + 0x0254, 0x005f },
{ USBTV_BASE + 0x025a, 0x0012 },
{ USBTV_BASE + 0x025b, 0x0001 },
{ USBTV_BASE + 0x0263, 0x001c },
{ USBTV_BASE + 0x0266, 0x0011 },
{ USBTV_BASE + 0x0267, 0x0005 },
{ USBTV_BASE + 0x024e, 0x0002 }, { USBTV_BASE + 0x024e, 0x0002 },
{ USBTV_BASE + 0x024f, 0x0002 }, { USBTV_BASE + 0x024f, 0x0002 },
}; };
@ -253,6 +332,10 @@ static int usbtv_setup_capture(struct usbtv *usbtv)
if (ret) if (ret)
return ret; return ret;
ret = usbtv_select_norm(usbtv, usbtv->norm);
if (ret)
return ret;
ret = usbtv_select_input(usbtv, usbtv->input); ret = usbtv_select_input(usbtv, usbtv->input);
if (ret) if (ret)
return ret; return ret;
@ -296,7 +379,7 @@ static void usbtv_image_chunk(struct usbtv *usbtv, u32 *chunk)
frame_id = USBTV_FRAME_ID(chunk); frame_id = USBTV_FRAME_ID(chunk);
odd = USBTV_ODD(chunk); odd = USBTV_ODD(chunk);
chunk_no = USBTV_CHUNK_NO(chunk); chunk_no = USBTV_CHUNK_NO(chunk);
if (chunk_no >= USBTV_CHUNKS) if (chunk_no >= usbtv->n_chunks)
return; return;
/* Beginning of a frame. */ /* Beginning of a frame. */
@ -324,10 +407,10 @@ static void usbtv_image_chunk(struct usbtv *usbtv, u32 *chunk)
usbtv->chunks_done++; usbtv->chunks_done++;
/* Last chunk in a frame, signalling an end */ /* Last chunk in a frame, signalling an end */
if (odd && chunk_no == USBTV_CHUNKS-1) { if (odd && chunk_no == usbtv->n_chunks-1) {
int size = vb2_plane_size(&buf->vb, 0); int size = vb2_plane_size(&buf->vb, 0);
enum vb2_buffer_state state = usbtv->chunks_done == enum vb2_buffer_state state = usbtv->chunks_done ==
USBTV_CHUNKS ? usbtv->n_chunks ?
VB2_BUF_STATE_DONE : VB2_BUF_STATE_DONE :
VB2_BUF_STATE_ERROR; VB2_BUF_STATE_ERROR;
@ -500,6 +583,8 @@ static int usbtv_querycap(struct file *file, void *priv,
static int usbtv_enum_input(struct file *file, void *priv, static int usbtv_enum_input(struct file *file, void *priv,
struct v4l2_input *i) struct v4l2_input *i)
{ {
struct usbtv *dev = video_drvdata(file);
switch (i->index) { switch (i->index) {
case USBTV_COMPOSITE_INPUT: case USBTV_COMPOSITE_INPUT:
strlcpy(i->name, "Composite", sizeof(i->name)); strlcpy(i->name, "Composite", sizeof(i->name));
@ -512,7 +597,7 @@ static int usbtv_enum_input(struct file *file, void *priv,
} }
i->type = V4L2_INPUT_TYPE_CAMERA; i->type = V4L2_INPUT_TYPE_CAMERA;
i->std = V4L2_STD_525_60; i->std = dev->vdev.tvnorms;
return 0; return 0;
} }
@ -531,23 +616,37 @@ static int usbtv_enum_fmt_vid_cap(struct file *file, void *priv,
static int usbtv_fmt_vid_cap(struct file *file, void *priv, static int usbtv_fmt_vid_cap(struct file *file, void *priv,
struct v4l2_format *f) struct v4l2_format *f)
{ {
f->fmt.pix.width = USBTV_WIDTH; struct usbtv *usbtv = video_drvdata(file);
f->fmt.pix.height = USBTV_HEIGHT;
f->fmt.pix.width = usbtv->width;
f->fmt.pix.height = usbtv->height;
f->fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; f->fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
f->fmt.pix.field = V4L2_FIELD_INTERLACED; f->fmt.pix.field = V4L2_FIELD_INTERLACED;
f->fmt.pix.bytesperline = USBTV_WIDTH * 2; f->fmt.pix.bytesperline = usbtv->width * 2;
f->fmt.pix.sizeimage = (f->fmt.pix.bytesperline * f->fmt.pix.height); f->fmt.pix.sizeimage = (f->fmt.pix.bytesperline * f->fmt.pix.height);
f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
f->fmt.pix.priv = 0;
return 0; return 0;
} }
static int usbtv_g_std(struct file *file, void *priv, v4l2_std_id *norm) static int usbtv_g_std(struct file *file, void *priv, v4l2_std_id *norm)
{ {
*norm = V4L2_STD_525_60; struct usbtv *usbtv = video_drvdata(file);
*norm = usbtv->norm;
return 0; return 0;
} }
static int usbtv_s_std(struct file *file, void *priv, v4l2_std_id norm)
{
int ret = -EINVAL;
struct usbtv *usbtv = video_drvdata(file);
if ((norm & V4L2_STD_525_60) || (norm & V4L2_STD_PAL))
ret = usbtv_select_norm(usbtv, norm);
return ret;
}
static int usbtv_g_input(struct file *file, void *priv, unsigned int *i) static int usbtv_g_input(struct file *file, void *priv, unsigned int *i)
{ {
struct usbtv *usbtv = video_drvdata(file); struct usbtv *usbtv = video_drvdata(file);
@ -561,13 +660,6 @@ static int usbtv_s_input(struct file *file, void *priv, unsigned int i)
return usbtv_select_input(usbtv, i); return usbtv_select_input(usbtv, i);
} }
static int usbtv_s_std(struct file *file, void *priv, v4l2_std_id norm)
{
if (norm & V4L2_STD_525_60)
return 0;
return -EINVAL;
}
struct v4l2_ioctl_ops usbtv_ioctl_ops = { struct v4l2_ioctl_ops usbtv_ioctl_ops = {
.vidioc_querycap = usbtv_querycap, .vidioc_querycap = usbtv_querycap,
.vidioc_enum_input = usbtv_enum_input, .vidioc_enum_input = usbtv_enum_input,
@ -604,10 +696,12 @@ static int usbtv_queue_setup(struct vb2_queue *vq,
const struct v4l2_format *v4l_fmt, unsigned int *nbuffers, const struct v4l2_format *v4l_fmt, unsigned int *nbuffers,
unsigned int *nplanes, unsigned int sizes[], void *alloc_ctxs[]) unsigned int *nplanes, unsigned int sizes[], void *alloc_ctxs[])
{ {
struct usbtv *usbtv = vb2_get_drv_priv(vq);
if (*nbuffers < 2) if (*nbuffers < 2)
*nbuffers = 2; *nbuffers = 2;
*nplanes = 1; *nplanes = 1;
sizes[0] = USBTV_WIDTH * USBTV_HEIGHT / 2 * sizeof(u32); sizes[0] = USBTV_CHUNK * usbtv->n_chunks * 2 * sizeof(u32);
return 0; return 0;
} }
@ -690,7 +784,11 @@ static int usbtv_probe(struct usb_interface *intf,
return -ENOMEM; return -ENOMEM;
usbtv->dev = dev; usbtv->dev = dev;
usbtv->udev = usb_get_dev(interface_to_usbdev(intf)); usbtv->udev = usb_get_dev(interface_to_usbdev(intf));
usbtv->iso_size = size; usbtv->iso_size = size;
(void)usbtv_configure_for_norm(usbtv, V4L2_STD_525_60);
spin_lock_init(&usbtv->buflock); spin_lock_init(&usbtv->buflock);
mutex_init(&usbtv->v4l2_lock); mutex_init(&usbtv->v4l2_lock);
mutex_init(&usbtv->vb2q_lock); mutex_init(&usbtv->vb2q_lock);
@ -727,7 +825,7 @@ static int usbtv_probe(struct usb_interface *intf,
usbtv->vdev.release = video_device_release_empty; usbtv->vdev.release = video_device_release_empty;
usbtv->vdev.fops = &usbtv_fops; usbtv->vdev.fops = &usbtv_fops;
usbtv->vdev.ioctl_ops = &usbtv_ioctl_ops; usbtv->vdev.ioctl_ops = &usbtv_ioctl_ops;
usbtv->vdev.tvnorms = V4L2_STD_525_60; usbtv->vdev.tvnorms = USBTV_TV_STD;
usbtv->vdev.queue = &usbtv->vb2q; usbtv->vdev.queue = &usbtv->vb2q;
usbtv->vdev.lock = &usbtv->v4l2_lock; usbtv->vdev.lock = &usbtv->v4l2_lock;
set_bit(V4L2_FL_USE_FH_PRIO, &usbtv->vdev.flags); set_bit(V4L2_FL_USE_FH_PRIO, &usbtv->vdev.flags);

View File

@ -556,7 +556,7 @@ static u16 uvc_video_clock_host_sof(const struct uvc_clock_sample *sample)
* *
* SOF = ((SOF2 - SOF1) * PTS + SOF1 * STC2 - SOF2 * STC1) / (STC2 - STC1) (1) * SOF = ((SOF2 - SOF1) * PTS + SOF1 * STC2 - SOF2 * STC1) / (STC2 - STC1) (1)
* *
* to avoid loosing precision in the division. Similarly, the host timestamp is * to avoid losing precision in the division. Similarly, the host timestamp is
* computed with * computed with
* *
* TS = ((TS2 - TS1) * PTS + TS1 * SOF2 - TS2 * SOF1) / (SOF2 - SOF1) (2) * TS = ((TS2 - TS1) * PTS + TS1 * SOF2 - TS2 * SOF1) / (SOF2 - SOF1) (2)

View File

@ -420,7 +420,7 @@ const char * const *v4l2_ctrl_get_menu(u32 id)
"Advanced Simple", "Advanced Simple",
"Core", "Core",
"Simple Scalable", "Simple Scalable",
"Advanced Coding Efficency", "Advanced Coding Efficiency",
NULL, NULL,
}; };

View File

@ -144,6 +144,25 @@ static void __vb2_buf_dmabuf_put(struct vb2_buffer *vb)
__vb2_plane_dmabuf_put(q, &vb->planes[plane]); __vb2_plane_dmabuf_put(q, &vb->planes[plane]);
} }
/**
* __setup_lengths() - setup initial lengths for every plane in
* every buffer on the queue
*/
static void __setup_lengths(struct vb2_queue *q, unsigned int n)
{
unsigned int buffer, plane;
struct vb2_buffer *vb;
for (buffer = q->num_buffers; buffer < q->num_buffers + n; ++buffer) {
vb = q->bufs[buffer];
if (!vb)
continue;
for (plane = 0; plane < vb->num_planes; ++plane)
vb->v4l2_planes[plane].length = q->plane_sizes[plane];
}
}
/** /**
* __setup_offsets() - setup unique offsets ("cookies") for every plane in * __setup_offsets() - setup unique offsets ("cookies") for every plane in
* every buffer on the queue * every buffer on the queue
@ -169,7 +188,6 @@ static void __setup_offsets(struct vb2_queue *q, unsigned int n)
continue; continue;
for (plane = 0; plane < vb->num_planes; ++plane) { for (plane = 0; plane < vb->num_planes; ++plane) {
vb->v4l2_planes[plane].length = q->plane_sizes[plane];
vb->v4l2_planes[plane].m.mem_offset = off; vb->v4l2_planes[plane].m.mem_offset = off;
dprintk(3, "Buffer %d, plane %d offset 0x%08lx\n", dprintk(3, "Buffer %d, plane %d offset 0x%08lx\n",
@ -241,6 +259,7 @@ static int __vb2_queue_alloc(struct vb2_queue *q, enum v4l2_memory memory,
q->bufs[q->num_buffers + buffer] = vb; q->bufs[q->num_buffers + buffer] = vb;
} }
__setup_lengths(q, buffer);
if (memory == V4L2_MEMORY_MMAP) if (memory == V4L2_MEMORY_MMAP)
__setup_offsets(q, buffer); __setup_offsets(q, buffer);
@ -1824,8 +1843,8 @@ int vb2_expbuf(struct vb2_queue *q, struct v4l2_exportbuffer *eb)
return -EINVAL; return -EINVAL;
} }
if (eb->flags & ~O_CLOEXEC) { if (eb->flags & ~(O_CLOEXEC | O_ACCMODE)) {
dprintk(1, "Queue does support only O_CLOEXEC flag\n"); dprintk(1, "Queue does support only O_CLOEXEC and access mode flags\n");
return -EINVAL; return -EINVAL;
} }
@ -1848,14 +1867,14 @@ int vb2_expbuf(struct vb2_queue *q, struct v4l2_exportbuffer *eb)
vb_plane = &vb->planes[eb->plane]; vb_plane = &vb->planes[eb->plane];
dbuf = call_memop(q, get_dmabuf, vb_plane->mem_priv); dbuf = call_memop(q, get_dmabuf, vb_plane->mem_priv, eb->flags & O_ACCMODE);
if (IS_ERR_OR_NULL(dbuf)) { if (IS_ERR_OR_NULL(dbuf)) {
dprintk(1, "Failed to export buffer %d, plane %d\n", dprintk(1, "Failed to export buffer %d, plane %d\n",
eb->index, eb->plane); eb->index, eb->plane);
return -EINVAL; return -EINVAL;
} }
ret = dma_buf_fd(dbuf, eb->flags); ret = dma_buf_fd(dbuf, eb->flags & ~O_ACCMODE);
if (ret < 0) { if (ret < 0) {
dprintk(3, "buffer %d, plane %d failed to export (%d)\n", dprintk(3, "buffer %d, plane %d failed to export (%d)\n",
eb->index, eb->plane, ret); eb->index, eb->plane, ret);

View File

@ -393,7 +393,7 @@ static struct sg_table *vb2_dc_get_base_sgt(struct vb2_dc_buf *buf)
return sgt; return sgt;
} }
static struct dma_buf *vb2_dc_get_dmabuf(void *buf_priv) static struct dma_buf *vb2_dc_get_dmabuf(void *buf_priv, unsigned long flags)
{ {
struct vb2_dc_buf *buf = buf_priv; struct vb2_dc_buf *buf = buf_priv;
struct dma_buf *dbuf; struct dma_buf *dbuf;
@ -404,7 +404,7 @@ static struct dma_buf *vb2_dc_get_dmabuf(void *buf_priv)
if (WARN_ON(!buf->sgt_base)) if (WARN_ON(!buf->sgt_base))
return NULL; return NULL;
dbuf = dma_buf_export(buf, &vb2_dc_dmabuf_ops, buf->size, 0); dbuf = dma_buf_export(buf, &vb2_dc_dmabuf_ops, buf->size, flags);
if (IS_ERR(dbuf)) if (IS_ERR(dbuf))
return NULL; return NULL;

View File

@ -178,7 +178,7 @@ static void *vb2_dma_sg_get_userptr(void *alloc_ctx, unsigned long vaddr,
buf->pages = kzalloc(buf->num_pages * sizeof(struct page *), buf->pages = kzalloc(buf->num_pages * sizeof(struct page *),
GFP_KERNEL); GFP_KERNEL);
if (!buf->pages) if (!buf->pages)
return NULL; goto userptr_fail_alloc_pages;
num_pages_from_user = get_user_pages(current, current->mm, num_pages_from_user = get_user_pages(current, current->mm,
vaddr & PAGE_MASK, vaddr & PAGE_MASK,
@ -204,6 +204,7 @@ userptr_fail_get_user_pages:
while (--num_pages_from_user >= 0) while (--num_pages_from_user >= 0)
put_page(buf->pages[num_pages_from_user]); put_page(buf->pages[num_pages_from_user]);
kfree(buf->pages); kfree(buf->pages);
userptr_fail_alloc_pages:
kfree(buf); kfree(buf);
return NULL; return NULL;
} }

View File

@ -83,7 +83,7 @@ struct vb2_fileio_data;
struct vb2_mem_ops { struct vb2_mem_ops {
void *(*alloc)(void *alloc_ctx, unsigned long size, gfp_t gfp_flags); void *(*alloc)(void *alloc_ctx, unsigned long size, gfp_t gfp_flags);
void (*put)(void *buf_priv); void (*put)(void *buf_priv);
struct dma_buf *(*get_dmabuf)(void *buf_priv); struct dma_buf *(*get_dmabuf)(void *buf_priv, unsigned long flags);
void *(*get_userptr)(void *alloc_ctx, unsigned long vaddr, void *(*get_userptr)(void *alloc_ctx, unsigned long vaddr,
unsigned long size, int write); unsigned long size, int write);