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:
commit
846f29a6af
|
@ -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
|
||||
</structfield> to zero. Additional flags may be posted in the <structfield>
|
||||
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
|
||||
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><structfield>flags</structfield></entry>
|
||||
<entry>Flags for the newly created file, currently only <constant>
|
||||
O_CLOEXEC </constant> is supported, refer to the manual of open() for more
|
||||
details.</entry>
|
||||
O_CLOEXEC </constant>, <constant>O_RDONLY</constant>, <constant>O_WRONLY
|
||||
</constant>, and <constant>O_RDWR</constant> are supported, refer to the manual
|
||||
of open() for more details.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>__s32</entry>
|
||||
|
|
|
@ -955,7 +955,7 @@ struct sms_rx_stats {
|
|||
u32 modem_state; /* from SMSHOSTLIB_DVB_MODEM_STATE_ET */
|
||||
s32 SNR; /* dB */
|
||||
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 ts_per; /* Transport stream PER,
|
||||
0xFFFFFFFF indicate N/A */
|
||||
|
@ -981,7 +981,7 @@ struct sms_rx_stats_ex {
|
|||
u32 modem_state; /* from SMSHOSTLIB_DVB_MODEM_STATE_ET */
|
||||
s32 SNR; /* dB */
|
||||
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 ts_per; /* Transport stream PER,
|
||||
0xFFFFFFFF indicate N/A */
|
||||
|
|
|
@ -95,7 +95,7 @@ struct RECEPTION_STATISTICS_PER_SLICES_S {
|
|||
u32 is_demod_locked; /* 0 - not locked, 1 - locked */
|
||||
|
||||
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_in_band_pwr; /* In band power in dBM */
|
||||
|
|
|
@ -435,7 +435,7 @@ static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf)
|
|||
dprintk_tscheck("TEI detected. "
|
||||
"PID=0x%x data1=0x%x\n",
|
||||
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 */
|
||||
if (!dvb_demux_feed_err_pkts)
|
||||
return;
|
||||
|
@ -1032,8 +1032,13 @@ static int dmx_section_feed_release_filter(struct dmx_section_feed *feed,
|
|||
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);
|
||||
mutex_lock(&dvbdmx->mutex);
|
||||
}
|
||||
|
||||
spin_lock_irq(&dvbdmx->lock);
|
||||
f = dvbdmxfeed->filter;
|
||||
|
|
|
@ -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,
|
||||
const struct reg_val *tab, int tab_len)
|
||||
{
|
||||
#define MAX_TAB_LEN 212
|
||||
int ret, i, j;
|
||||
u8 buf[MAX_XFER_SIZE];
|
||||
|
||||
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;
|
||||
}
|
||||
u8 buf[1 + MAX_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++) {
|
||||
buf[j] = tab[i].val;
|
||||
|
||||
|
|
|
@ -78,7 +78,7 @@ int cxd2820r_set_frontend_c(struct dvb_frontend *fe)
|
|||
|
||||
num = if_freq / 1000; /* Hz => kHz */
|
||||
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[1] = (if_ctl >> 0) & 0xff;
|
||||
|
||||
|
|
|
@ -3048,7 +3048,7 @@ static int dib8000_tune(struct dvb_frontend *fe)
|
|||
dib8000_set_diversity_in(state->fe[0], state->diversity_onoff);
|
||||
|
||||
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);
|
||||
*tune_state = CT_DEMOD_STEP_5;
|
||||
break;
|
||||
|
@ -3115,7 +3115,7 @@ static int dib8000_tune(struct dvb_frontend *fe)
|
|||
|
||||
case CT_DEMOD_STEP_9: /* 39 */
|
||||
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++) {
|
||||
if (c->layer[i].interleaving >= deeper_interleaver) {
|
||||
dprintk("layer%i: time interleaver = %d ", i, c->layer[i].interleaving);
|
||||
|
|
|
@ -1191,7 +1191,7 @@ static int mpegts_configure_pins(struct drxk_state *state, bool mpeg_enable)
|
|||
goto error;
|
||||
|
||||
if (state->m_enable_parallel == true) {
|
||||
/* paralel -> enable MD1 to MD7 */
|
||||
/* parallel -> enable MD1 to MD7 */
|
||||
status = write16(state, SIO_PDR_MD1_CFG__A,
|
||||
sio_pdr_mdx_cfg);
|
||||
if (status < 0)
|
||||
|
@ -1428,7 +1428,7 @@ static int mpegts_stop(struct drxk_state *state)
|
|||
|
||||
dprintk(1, "\n");
|
||||
|
||||
/* Gracefull shutdown (byte boundaries) */
|
||||
/* Graceful shutdown (byte boundaries) */
|
||||
status = read16(state, FEC_OC_SNC_MODE__A, &fec_oc_snc_mode);
|
||||
if (status < 0)
|
||||
goto error;
|
||||
|
@ -2021,7 +2021,7 @@ static int mpegts_dto_setup(struct drxk_state *state,
|
|||
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));
|
||||
if (state->m_enable_parallel == false) {
|
||||
/* MPEG data output is serial -> set ipr_mode[0] */
|
||||
|
@ -2908,7 +2908,7 @@ static int adc_synchronization(struct drxk_state *state)
|
|||
goto error;
|
||||
|
||||
if (count == 1) {
|
||||
/* Try sampling on a diffrent edge */
|
||||
/* Try sampling on a different edge */
|
||||
u16 clk_neg = 0;
|
||||
|
||||
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)
|
||||
goto error;
|
||||
|
||||
/* Retreive results parameters from SC */
|
||||
/* Retrieve results parameters from SC */
|
||||
switch (cmd) {
|
||||
/* All commands yielding 5 results */
|
||||
/* All commands yielding 4 results */
|
||||
|
@ -3849,7 +3849,7 @@ static int set_dvbt(struct drxk_state *state, u16 intermediate_freqk_hz,
|
|||
break;
|
||||
}
|
||||
#if 0
|
||||
/* No hierachical channels support in BDA */
|
||||
/* No hierarchical channels support in BDA */
|
||||
/* Priority (only for hierarchical channels) */
|
||||
switch (channel->priority) {
|
||||
case DRX_PRIORITY_LOW:
|
||||
|
@ -4081,7 +4081,7 @@ error:
|
|||
/*============================================================================*/
|
||||
|
||||
/**
|
||||
* \brief Retreive lock status .
|
||||
* \brief Retrieve lock status .
|
||||
* \param demod Pointer to demodulator instance.
|
||||
* \param lockStat Pointer to lock status structure.
|
||||
* \return DRXStatus_t.
|
||||
|
@ -6174,7 +6174,7 @@ static int init_drxk(struct drxk_state *state)
|
|||
goto error;
|
||||
|
||||
/* 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.
|
||||
Not using SCU command interface for SCU register access since no
|
||||
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);
|
||||
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->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
|
||||
p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
|
||||
|
|
|
@ -710,6 +710,7 @@ struct dvb_frontend *rtl2830_attach(const struct rtl2830_config *cfg,
|
|||
sizeof(priv->tuner_i2c_adapter.name));
|
||||
priv->tuner_i2c_adapter.algo = &rtl2830_tuner_i2c_algo;
|
||||
priv->tuner_i2c_adapter.algo_data = NULL;
|
||||
priv->tuner_i2c_adapter.dev.parent = &i2c->dev;
|
||||
i2c_set_adapdata(&priv->tuner_i2c_adapter, priv);
|
||||
if (i2c_add_adapter(&priv->tuner_i2c_adapter) < 0) {
|
||||
dev_err(&i2c->dev,
|
||||
|
|
|
@ -52,9 +52,9 @@
|
|||
#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_3 0x33 /* Vsync field control 3 */
|
||||
#define ADV7183_HS_POS_CTRL_1 0x34 /* Hsync positon control 1 */
|
||||
#define ADV7183_HS_POS_CTRL_2 0x35 /* Hsync positon control 2 */
|
||||
#define ADV7183_HS_POS_CTRL_3 0x36 /* Hsync positon control 3 */
|
||||
#define ADV7183_HS_POS_CTRL_1 0x34 /* Hsync position control 1 */
|
||||
#define ADV7183_HS_POS_CTRL_2 0x35 /* Hsync position control 2 */
|
||||
#define ADV7183_HS_POS_CTRL_3 0x36 /* Hsync position control 3 */
|
||||
#define ADV7183_POLARITY 0x37 /* Polarity */
|
||||
#define ADV7183_NTSC_COMB_CTRL 0x38 /* NTSC comb control */
|
||||
#define ADV7183_PAL_COMB_CTRL 0x39 /* PAL comb control */
|
||||
|
|
|
@ -877,7 +877,7 @@ static void configure_custom_video_timings(struct v4l2_subdev *sd,
|
|||
break;
|
||||
case ADV7604_MODE_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, 0x01, 0x06); /* prim mode */
|
||||
break;
|
||||
|
|
|
@ -1013,7 +1013,7 @@ static void configure_custom_video_timings(struct v4l2_subdev *sd,
|
|||
break;
|
||||
case ADV7842_MODE_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, 0x01, 0x06); /* prim mode */
|
||||
break;
|
||||
|
|
|
@ -394,7 +394,7 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
|||
|
||||
if (!rc) {
|
||||
/*
|
||||
* If platform_data doesn't specify rc_dev, initilize it
|
||||
* If platform_data doesn't specify rc_dev, initialize it
|
||||
* internally
|
||||
*/
|
||||
rc = rc_allocate_device();
|
||||
|
|
|
@ -544,7 +544,7 @@ int m5mols_init_controls(struct v4l2_subdev *sd)
|
|||
u16 zoom_step;
|
||||
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);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include <linux/i2c.h>
|
||||
#include <linux/log2.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
|
|
|
@ -1460,7 +1460,7 @@ static int s5c73m3_oif_registered(struct v4l2_subdev *sd)
|
|||
mutex_unlock(&state->lock);
|
||||
|
||||
v4l2_dbg(1, s5c73m3_dbg, sd, "%s: Booting %s (%d)\n",
|
||||
__func__, ret ? "failed" : "succeded", ret);
|
||||
__func__, ret ? "failed" : "succeeded", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -393,7 +393,7 @@ struct s5c73m3 {
|
|||
|
||||
/* External master clock frequency */
|
||||
u32 mclk_frequency;
|
||||
/* Video bus type - MIPI-CSI2/paralell */
|
||||
/* Video bus type - MIPI-CSI2/parallel */
|
||||
enum v4l2_mbus_type bus_type;
|
||||
|
||||
const struct s5c73m3_frame_size *sensor_pix_size[2];
|
||||
|
|
|
@ -1699,7 +1699,7 @@ static void saa711x_write_platform_data(struct saa711x_state *state,
|
|||
* the analog demod.
|
||||
* If the tuner is not found, it returns -ENODEV.
|
||||
* 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'.
|
||||
*/
|
||||
static int saa711x_detect_chip(struct i2c_client *client,
|
||||
|
|
|
@ -642,7 +642,7 @@ static const struct ov5642_datafmt
|
|||
static int reg_read(struct i2c_client *client, u16 reg, u8 *val)
|
||||
{
|
||||
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 };
|
||||
|
||||
ret = i2c_master_send(client, data, 2);
|
||||
|
|
|
@ -83,7 +83,8 @@ static int ths7303_write(struct v4l2_subdev *sd, u8 reg, u8 val)
|
|||
}
|
||||
|
||||
/* 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 ths7303_state *state = to_state(sd);
|
||||
|
|
|
@ -130,12 +130,10 @@ static int wm8775_s_routing(struct v4l2_subdev *sd,
|
|||
return -EINVAL;
|
||||
}
|
||||
state->input = input;
|
||||
if (!v4l2_ctrl_g_ctrl(state->mute))
|
||||
if (v4l2_ctrl_g_ctrl(state->mute))
|
||||
return 0;
|
||||
if (!v4l2_ctrl_g_ctrl(state->vol))
|
||||
return 0;
|
||||
if (!v4l2_ctrl_g_ctrl(state->bal))
|
||||
return 0;
|
||||
wm8775_set_audio(sd, 1);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -4182,7 +4182,8 @@ static int bttv_probe(struct pci_dev *dev, const struct pci_device_id *pci_id)
|
|||
}
|
||||
btv->std = V4L2_STD_PAL;
|
||||
init_irqreg(btv);
|
||||
v4l2_ctrl_handler_setup(hdl);
|
||||
if (!bttv_tvcards[btv->c.type].no_video)
|
||||
v4l2_ctrl_handler_setup(hdl);
|
||||
if (hdl->error) {
|
||||
result = hdl->error;
|
||||
goto fail2;
|
||||
|
|
|
@ -262,7 +262,7 @@ struct cx18_options {
|
|||
};
|
||||
|
||||
/* 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 */
|
||||
#define CX18_F_S_CLAIMED 3 /* this stream is claimed */
|
||||
|
|
|
@ -427,7 +427,7 @@ int mc417_register_read(struct cx23885_dev *dev, u16 address, u32 *value)
|
|||
cx_write(MC417_RWD, regval);
|
||||
|
||||
/* 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
|
||||
* input only...)
|
||||
*/
|
||||
|
|
|
@ -401,7 +401,7 @@ static int pluto_hw_init(struct pluto *pluto)
|
|||
/* set automatic LED control by FPGA */
|
||||
pluto_rw(pluto, REG_MISC, MISC_ALED, MISC_ALED);
|
||||
|
||||
/* set data endianess */
|
||||
/* set data endianness */
|
||||
#ifdef __LITTLE_ENDIAN
|
||||
pluto_rw(pluto, REG_PIDn(0), PID0_END, PID0_END);
|
||||
#else
|
||||
|
|
|
@ -1354,9 +1354,11 @@ static int saa7164_initdev(struct pci_dev *pci_dev,
|
|||
if (fw_debug) {
|
||||
dev->kthread = kthread_run(saa7164_thread_function, dev,
|
||||
"saa7164 debug");
|
||||
if (!dev->kthread)
|
||||
if (IS_ERR(dev->kthread)) {
|
||||
dev->kthread = NULL;
|
||||
printk(KERN_ERR "%s() Failed to create "
|
||||
"debug kernel thread\n", __func__);
|
||||
}
|
||||
}
|
||||
|
||||
} /* != BOARD_UNKNOWN */
|
||||
|
|
|
@ -1434,7 +1434,7 @@ static void coda_buf_queue(struct vb2_buffer *vb)
|
|||
if (q_data->fourcc == V4L2_PIX_FMT_H264 &&
|
||||
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
|
||||
*/
|
||||
if (vb2_get_plane_payload(vb, 0) == 0)
|
||||
|
|
|
@ -1039,7 +1039,7 @@ static int fimc_runtime_resume(struct device *dev)
|
|||
|
||||
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]);
|
||||
fimc_hw_reset(fimc);
|
||||
|
||||
|
|
|
@ -759,7 +759,7 @@ static int fimc_md_register_platform_entity(struct fimc_md *fmd,
|
|||
goto dev_unlock;
|
||||
|
||||
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) {
|
||||
switch (plat_entity) {
|
||||
case IDX_FIMC:
|
||||
|
|
|
@ -142,12 +142,6 @@ static int mmpcam_power_up(struct mcam_camera *mcam)
|
|||
struct mmp_camera *cam = mcam_to_cam(mcam);
|
||||
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.
|
||||
*/
|
||||
|
@ -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_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);
|
||||
}
|
||||
|
||||
|
@ -292,8 +280,9 @@ void mmpcam_calc_dphy(struct mcam_camera *mcam)
|
|||
return;
|
||||
|
||||
/* 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;
|
||||
|
||||
clk_disable_unprepare(cam->mipi_clk);
|
||||
/*
|
||||
* dphy[2] - CSI2_DPHY6:
|
||||
* bit 0 ~ bit 7: CK Term Enable
|
||||
|
@ -325,19 +314,6 @@ static irqreturn_t mmpcam_irq(int irq, void *data)
|
|||
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)
|
||||
{
|
||||
unsigned int i;
|
||||
|
@ -371,7 +347,6 @@ static int mmpcam_probe(struct platform_device *pdev)
|
|||
if (cam == NULL)
|
||||
return -ENOMEM;
|
||||
cam->pdev = pdev;
|
||||
cam->mipi_clk = NULL;
|
||||
INIT_LIST_HEAD(&cam->devlist);
|
||||
|
||||
mcam = &cam->mcam;
|
||||
|
@ -387,6 +362,11 @@ static int mmpcam_probe(struct platform_device *pdev)
|
|||
mcam->mclk_div = pdata->mclk_div;
|
||||
mcam->bus_type = pdata->bus_type;
|
||||
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->lane = pdata->lane;
|
||||
mcam->chip_id = MCAM_ARMADA610;
|
||||
|
@ -444,7 +424,7 @@ static int mmpcam_probe(struct platform_device *pdev)
|
|||
*/
|
||||
ret = mmpcam_power_up(mcam);
|
||||
if (ret)
|
||||
goto out_deinit_clk;
|
||||
return ret;
|
||||
ret = mccic_register(mcam);
|
||||
if (ret)
|
||||
goto out_power_down;
|
||||
|
@ -469,8 +449,6 @@ out_unregister:
|
|||
mccic_shutdown(mcam);
|
||||
out_power_down:
|
||||
mmpcam_power_down(mcam);
|
||||
out_deinit_clk:
|
||||
mcam_deinit_clk(mcam);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -478,18 +456,10 @@ out_deinit_clk:
|
|||
static int mmpcam_remove(struct mmp_camera *cam)
|
||||
{
|
||||
struct mcam_camera *mcam = &cam->mcam;
|
||||
struct mmp_camera_platform_data *pdata;
|
||||
|
||||
mmpcam_remove_device(cam);
|
||||
mccic_shutdown(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;
|
||||
}
|
||||
|
||||
|
|
|
@ -1673,7 +1673,7 @@ void omap3isp_print_status(struct isp_device *isp)
|
|||
* ISP clocks get disabled in suspend(). Similarly, the clocks are reenabled in
|
||||
* 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.
|
||||
*/
|
||||
static int isp_pm_prepare(struct device *dev)
|
||||
|
|
|
@ -339,14 +339,11 @@ __isp_video_get_format(struct isp_video *video, struct v4l2_format *format)
|
|||
if (subdev == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&video->mutex);
|
||||
|
||||
fmt.pad = pad;
|
||||
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);
|
||||
|
||||
if (ret)
|
||||
|
|
|
@ -382,7 +382,7 @@
|
|||
#define S5P_FIMV_R2H_CMD_EDFU_INIT_RET 16
|
||||
#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_R2H_CMD_FIELD_DONE_RET -1
|
||||
#define S5P_FIMV_MFC_RESET -1
|
||||
|
|
|
@ -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);
|
||||
|
||||
/* 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);
|
||||
list_for_each_entry(dst_buf, &ctx->dst_queue, list) {
|
||||
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_FINISHED:
|
||||
case MFCINST_RUNNING:
|
||||
/* It is higly probable that an error occured
|
||||
/* It is highly probable that an error occurred
|
||||
* while decoding a frame */
|
||||
clear_work_bit(ctx);
|
||||
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);
|
||||
switch (reason) {
|
||||
case S5P_MFC_R2H_CMD_ERR_RET:
|
||||
/* An error has occured */
|
||||
/* An error has occurred */
|
||||
if (ctx->state == MFCINST_RUNNING &&
|
||||
s5p_mfc_hw_call(dev->mfc_ops, err_dec, err) >=
|
||||
dev->warn_start)
|
||||
|
@ -840,7 +840,7 @@ static int s5p_mfc_open(struct file *file)
|
|||
mutex_unlock(&dev->mfc_mutex);
|
||||
mfc_debug_leave();
|
||||
return ret;
|
||||
/* Deinit when failure occured */
|
||||
/* Deinit when failure occurred */
|
||||
err_queue_init:
|
||||
if (dev->num_inst == 1)
|
||||
s5p_mfc_deinit_hw(dev);
|
||||
|
@ -881,14 +881,14 @@ static int s5p_mfc_release(struct file *file)
|
|||
/* Mark context as idle */
|
||||
clear_work_bit_irqsave(ctx);
|
||||
/* If instance was initialised then
|
||||
* return instance and free reosurces */
|
||||
* return instance and free resources */
|
||||
if (ctx->inst_no != MFC_NO_INSTANCE_SET) {
|
||||
mfc_debug(2, "Has to free instance\n");
|
||||
ctx->state = MFCINST_RETURN_INST;
|
||||
set_work_bit_irqsave(ctx);
|
||||
s5p_mfc_clean_ctx_int_flags(ctx);
|
||||
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
|
||||
(ctx, S5P_MFC_R2H_CMD_CLOSE_INSTANCE_RET, 0)) {
|
||||
s5p_mfc_clock_off();
|
||||
|
|
|
@ -69,7 +69,7 @@ int s5p_mfc_alloc_firmware(struct s5p_mfc_dev *dev)
|
|||
|
||||
} else {
|
||||
/* 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. */
|
||||
dev->bank2 = dev->bank1;
|
||||
}
|
||||
|
|
|
@ -65,7 +65,7 @@ struct mxr_format {
|
|||
int num_subframes;
|
||||
/** specifies to which subframe belong given plane */
|
||||
int plane2subframe[MXR_MAX_PLANES];
|
||||
/** internal code, driver dependant */
|
||||
/** internal code, driver dependent */
|
||||
unsigned long cookie;
|
||||
};
|
||||
|
||||
|
|
|
@ -528,7 +528,7 @@ static int mxr_s_dv_timings(struct file *file, void *fh,
|
|||
mutex_lock(&mdev->mutex);
|
||||
|
||||
/* timings change cannot be done while there is an entity
|
||||
* dependant on output configuration
|
||||
* dependent on output configuration
|
||||
*/
|
||||
if (mdev->n_output > 0) {
|
||||
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);
|
||||
|
||||
/* standard change cannot be done while there is an entity
|
||||
* dependant on output configuration
|
||||
* dependent on output configuration
|
||||
*/
|
||||
if (mdev->n_output > 0) {
|
||||
mutex_unlock(&mdev->mutex);
|
||||
|
|
|
@ -1495,7 +1495,7 @@ static int omap1_cam_set_bus_param(struct soc_camera_device *icd)
|
|||
if (ctrlclock & LCLK_EN)
|
||||
CAM_WRITE(pcdev, CTRLCLOCK, ctrlclock);
|
||||
|
||||
/* select bus endianess */
|
||||
/* select bus endianness */
|
||||
xlate = soc_camera_xlate_by_fourcc(icd, pixfmt);
|
||||
fmt = xlate->host_fmt;
|
||||
|
||||
|
|
|
@ -1108,7 +1108,7 @@ static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* timeperframe is arbitrary and continous */
|
||||
/* timeperframe is arbitrary and continuous */
|
||||
static int vidioc_enum_frameintervals(struct file *file, void *priv,
|
||||
struct v4l2_frmivalenum *fival)
|
||||
{
|
||||
|
@ -1125,7 +1125,7 @@ static int vidioc_enum_frameintervals(struct file *file, void *priv,
|
|||
|
||||
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.max = tpf_max;
|
||||
fival->stepwise.step = (struct v4l2_fract) {1, 1};
|
||||
|
|
|
@ -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
|
||||
* 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)
|
||||
{
|
||||
|
|
|
@ -1026,8 +1026,10 @@ int vsp1_video_init(struct vsp1_video *video, struct vsp1_entity *rwpf)
|
|||
|
||||
/* ... and the buffers queue... */
|
||||
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;
|
||||
}
|
||||
|
||||
video->queue.type = video->type;
|
||||
video->queue.io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF;
|
||||
|
|
|
@ -271,8 +271,7 @@ static void shark_unregister_leds(struct shark_device *shark)
|
|||
cancel_work_sync(&shark->led_work);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static void shark_resume_leds(struct shark_device *shark)
|
||||
static inline void shark_resume_leds(struct shark_device *shark)
|
||||
{
|
||||
if (test_bit(BLUE_IS_PULSE, &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);
|
||||
schedule_work(&shark->led_work);
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
static int shark_register_leds(struct shark_device *shark, struct device *dev)
|
||||
{
|
||||
|
|
|
@ -237,8 +237,7 @@ static void shark_unregister_leds(struct shark_device *shark)
|
|||
cancel_work_sync(&shark->led_work);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static void shark_resume_leds(struct shark_device *shark)
|
||||
static inline void shark_resume_leds(struct shark_device *shark)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -247,7 +246,6 @@ static void shark_resume_leds(struct shark_device *shark)
|
|||
|
||||
schedule_work(&shark->led_work);
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
static int shark_register_leds(struct shark_device *shark, struct device *dev)
|
||||
{
|
||||
|
|
|
@ -268,8 +268,8 @@ struct si476x_radio;
|
|||
*
|
||||
* @tune_freq: Tune chip to a specific frequency
|
||||
* @seek_start: Star station seeking
|
||||
* @rsq_status: Get Recieved Signal Quality(RSQ) status
|
||||
* @rds_blckcnt: Get recived RDS blocks count
|
||||
* @rsq_status: Get Received Signal Quality(RSQ) status
|
||||
* @rds_blckcnt: Get received RDS blocks count
|
||||
* @phase_diversity: Change phase diversity mode of the tuner
|
||||
* @phase_div_status: Get phase diversity mode status
|
||||
* @acf_status: Get the status of Automatically Controlled
|
||||
|
|
|
@ -356,7 +356,7 @@ static int vidioc_s_frequency(struct file *file, void *priv,
|
|||
So we keep it as-is. */
|
||||
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_tune(radio, (freq * 125) / 2);
|
||||
return 0;
|
||||
|
|
|
@ -112,7 +112,7 @@ static int tef6862_s_frequency(struct v4l2_subdev *sd, const struct v4l2_frequen
|
|||
if (f->tuner != 0)
|
||||
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;
|
||||
i2cmsg[0] = (MSA_MODE_PRESET << MSA_MODE_SHIFT) | WM_SUB_PLLM;
|
||||
i2cmsg[1] = (pll >> 8) & 0xff;
|
||||
|
|
|
@ -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
|
||||
* 0x688301b7 and the right one 0x688481b7. All other keys generate
|
||||
* 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
|
||||
* will be 0x01008000, 0x01007F00, which match the newer devices.
|
||||
*/
|
||||
|
|
|
@ -118,7 +118,7 @@ static int debug;
|
|||
#define RR3_IR_IO_LENGTH_FUZZ 0x04
|
||||
/* Timeout for end of signal detection */
|
||||
#define RR3_IR_IO_SIG_TIMEOUT 0x05
|
||||
/* Minumum value for pause recognition. */
|
||||
/* Minimum value for pause recognition. */
|
||||
#define RR3_IR_IO_MIN_PAUSE 0x06
|
||||
|
||||
/* Clock freq. of EZ-USB chip */
|
||||
|
|
|
@ -1195,7 +1195,7 @@ static u32 mt2063_set_dnc_output_enable(struct mt2063_state *state,
|
|||
* DNC Output is selected, the other is always off)
|
||||
*
|
||||
* @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
|
||||
*/
|
||||
|
@ -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.
|
||||
* 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)
|
||||
* As such, the maximum symbol rate supported by 6 MHz is given by:
|
||||
* max_symbol_rate = 6 MHz / 1.15 = 5217391 Bauds
|
||||
|
|
|
@ -119,7 +119,7 @@
|
|||
#define V4L2_STD_A2 (V4L2_STD_A2_A | V4L2_STD_A2_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
|
||||
*/
|
||||
|
||||
|
|
|
@ -1412,8 +1412,8 @@ err_v4l2:
|
|||
usb_set_intfdata(interface, NULL);
|
||||
err_if:
|
||||
usb_put_dev(udev);
|
||||
kfree(dev);
|
||||
clear_bit(dev->devno, &cx231xx_devused);
|
||||
kfree(dev);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 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)) {
|
||||
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 {
|
||||
/* I2C */
|
||||
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 };
|
||||
|
||||
if (5 + msg[0].len > sizeof(buf)) {
|
||||
dev_warn(&d->udev->dev,
|
||||
"%s: i2c xfer: len=%d is too big!\n",
|
||||
KBUILD_MODNAME, msg[0].len);
|
||||
return -EOPNOTSUPP;
|
||||
ret = -EOPNOTSUPP;
|
||||
goto unlock;
|
||||
}
|
||||
req.mbox |= ((msg[0].addr & 0x80) >> 3);
|
||||
buf[0] = msg[1].len;
|
||||
|
@ -274,14 +275,15 @@ static int af9035_i2c_master_xfer(struct i2c_adapter *adap,
|
|||
} else {
|
||||
/* I2C */
|
||||
u8 buf[MAX_XFER_SIZE];
|
||||
struct usb_req req = { CMD_I2C_WR, 0, sizeof(buf), buf,
|
||||
0, NULL };
|
||||
struct usb_req req = { CMD_I2C_WR, 0, 5 + msg[0].len,
|
||||
buf, 0, NULL };
|
||||
|
||||
if (5 + msg[0].len > sizeof(buf)) {
|
||||
dev_warn(&d->udev->dev,
|
||||
"%s: i2c xfer: len=%d is too big!\n",
|
||||
KBUILD_MODNAME, msg[0].len);
|
||||
return -EOPNOTSUPP;
|
||||
ret = -EOPNOTSUPP;
|
||||
goto unlock;
|
||||
}
|
||||
req.mbox |= ((msg[0].addr & 0x80) >> 3);
|
||||
buf[0] = msg[0].len;
|
||||
|
@ -319,6 +321,7 @@ static int af9035_i2c_master_xfer(struct i2c_adapter *adap,
|
|||
ret = -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
unlock:
|
||||
mutex_unlock(&d->i2c_mutex);
|
||||
|
||||
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 */
|
||||
{ DVB_USB_DEVICE(USB_VID_TERRATEC, 0x0099,
|
||||
&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);
|
||||
|
|
|
@ -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];
|
||||
int err;
|
||||
|
||||
/* exit if we didnt initialize the driver yet */
|
||||
/* exit if we didn't initialize the driver yet */
|
||||
if (!state->chip_id) {
|
||||
mxl_debug("driver not yet initialized, exit.");
|
||||
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];
|
||||
int err;
|
||||
|
||||
/* exit if we didnt initialize the driver yet */
|
||||
/* exit if we didn't initialize the driver yet */
|
||||
if (!state->chip_id) {
|
||||
mxl_debug("driver not yet initialized, exit.");
|
||||
goto fail;
|
||||
|
|
|
@ -102,7 +102,7 @@ static int technisat_usb2_i2c_access(struct usb_device *udev,
|
|||
if (rxlen > 62) {
|
||||
err("i2c RX buffer can't exceed 62 bytes (dev 0x%02x)",
|
||||
device_addr);
|
||||
txlen = 62;
|
||||
rxlen = 62;
|
||||
}
|
||||
|
||||
b[0] = I2C_SPEED_100KHZ_BIT;
|
||||
|
|
|
@ -1664,8 +1664,8 @@ static int em28xx_v4l2_close(struct file *filp)
|
|||
|
||||
em28xx_videodbg("users=%d\n", dev->users);
|
||||
|
||||
mutex_lock(&dev->lock);
|
||||
vb2_fop_release(filp);
|
||||
mutex_lock(&dev->lock);
|
||||
|
||||
if (dev->users == 1) {
|
||||
/* the device is already disconnect,
|
||||
|
|
|
@ -438,7 +438,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
|
|||
s32 nToSkip =
|
||||
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) {
|
||||
case 0x0202: /* End of frame, start a new one */
|
||||
gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
|
||||
|
|
|
@ -416,7 +416,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
|
|||
#if IS_ENABLED(CONFIG_INPUT)
|
||||
static int sd_int_pkt_scan(struct gspca_dev *gspca_dev,
|
||||
u8 *data, /* interrupt packet data */
|
||||
int len) /* interrput packet length */
|
||||
int len) /* interrupt packet length */
|
||||
{
|
||||
int ret = -EINVAL;
|
||||
|
||||
|
|
|
@ -874,7 +874,7 @@ static int sd_dbg_s_register(struct gspca_dev *gspca_dev,
|
|||
#if IS_ENABLED(CONFIG_INPUT)
|
||||
static int sd_int_pkt_scan(struct gspca_dev *gspca_dev,
|
||||
u8 *data, /* interrupt packet data */
|
||||
int len) /* interrput packet length */
|
||||
int len) /* interrupt packet length */
|
||||
{
|
||||
int ret = -EINVAL;
|
||||
u8 data0, data1;
|
||||
|
|
|
@ -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) */
|
||||
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)
|
||||
|
|
|
@ -139,7 +139,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
|
|||
struct sd *sd = (struct sd *) gspca_dev;
|
||||
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. */
|
||||
msleep(1000);
|
||||
|
||||
|
|
|
@ -1027,6 +1027,7 @@ static const struct usb_device_id device_table[] = {
|
|||
{USB_DEVICE(0x055f, 0xc650), BS(SPCA533, 0)},
|
||||
{USB_DEVICE(0x05da, 0x1018), BS(SPCA504B, 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, 0x1314), BS(SPCA533, 0)},
|
||||
{USB_DEVICE(0x0733, 0x2211), BS(SPCA533, 0)},
|
||||
|
|
|
@ -6905,7 +6905,7 @@ static int sd_get_jcomp(struct gspca_dev *gspca_dev,
|
|||
#if IS_ENABLED(CONFIG_INPUT)
|
||||
static int sd_int_pkt_scan(struct gspca_dev *gspca_dev,
|
||||
u8 *data, /* interrupt packet data */
|
||||
int len) /* interrput packet length */
|
||||
int len) /* interrupt packet length */
|
||||
{
|
||||
if (len == 8 && data[4] == 1) {
|
||||
input_report_key(gspca_dev->input_dev, KEY_CAMERA, 1);
|
||||
|
|
|
@ -1039,7 +1039,7 @@ static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id
|
|||
/* Set the leds off */
|
||||
pwc_set_leds(pdev, 0, 0);
|
||||
|
||||
/* Setup intial videomode */
|
||||
/* Setup initial videomode */
|
||||
rc = pwc_set_video_mode(pdev, MAX_WIDTH, MAX_HEIGHT,
|
||||
V4L2_PIX_FMT_YUV420, 30, &compression, 1);
|
||||
if (rc)
|
||||
|
|
|
@ -50,13 +50,8 @@
|
|||
#define USBTV_ISOC_TRANSFERS 16
|
||||
#define USBTV_ISOC_PACKETS 8
|
||||
|
||||
#define USBTV_WIDTH 720
|
||||
#define USBTV_HEIGHT 480
|
||||
|
||||
#define USBTV_CHUNK_SIZE 256
|
||||
#define USBTV_CHUNK 240
|
||||
#define USBTV_CHUNKS (USBTV_WIDTH * USBTV_HEIGHT \
|
||||
/ 4 / USBTV_CHUNK)
|
||||
|
||||
/* Chunk header. */
|
||||
#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_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. */
|
||||
struct usbtv_buf {
|
||||
struct vb2_buffer vb;
|
||||
|
@ -94,11 +110,38 @@ struct usbtv {
|
|||
USBTV_COMPOSITE_INPUT,
|
||||
USBTV_SVIDEO_INPUT,
|
||||
} input;
|
||||
v4l2_std_id norm;
|
||||
int width, height;
|
||||
int n_chunks;
|
||||
int iso_size;
|
||||
unsigned int sequence;
|
||||
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)
|
||||
{
|
||||
int ret;
|
||||
|
@ -158,6 +201,57 @@ static int usbtv_select_input(struct usbtv *usbtv, int input)
|
|||
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)
|
||||
{
|
||||
int ret;
|
||||
|
@ -225,26 +319,11 @@ static int usbtv_setup_capture(struct usbtv *usbtv)
|
|||
|
||||
{ USBTV_BASE + 0x0284, 0x0088 },
|
||||
{ USBTV_BASE + 0x0003, 0x0004 },
|
||||
{ USBTV_BASE + 0x001a, 0x0079 },
|
||||
{ USBTV_BASE + 0x0100, 0x00d3 },
|
||||
{ USBTV_BASE + 0x010e, 0x0068 },
|
||||
{ USBTV_BASE + 0x010f, 0x009c },
|
||||
{ USBTV_BASE + 0x0112, 0x00f0 },
|
||||
{ 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 + 0x0225, 0x0008 },
|
||||
{ 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 + 0x024f, 0x0002 },
|
||||
};
|
||||
|
@ -253,6 +332,10 @@ static int usbtv_setup_capture(struct usbtv *usbtv)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = usbtv_select_norm(usbtv, usbtv->norm);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = usbtv_select_input(usbtv, usbtv->input);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -296,7 +379,7 @@ static void usbtv_image_chunk(struct usbtv *usbtv, u32 *chunk)
|
|||
frame_id = USBTV_FRAME_ID(chunk);
|
||||
odd = USBTV_ODD(chunk);
|
||||
chunk_no = USBTV_CHUNK_NO(chunk);
|
||||
if (chunk_no >= USBTV_CHUNKS)
|
||||
if (chunk_no >= usbtv->n_chunks)
|
||||
return;
|
||||
|
||||
/* Beginning of a frame. */
|
||||
|
@ -324,10 +407,10 @@ static void usbtv_image_chunk(struct usbtv *usbtv, u32 *chunk)
|
|||
usbtv->chunks_done++;
|
||||
|
||||
/* 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);
|
||||
enum vb2_buffer_state state = usbtv->chunks_done ==
|
||||
USBTV_CHUNKS ?
|
||||
usbtv->n_chunks ?
|
||||
VB2_BUF_STATE_DONE :
|
||||
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,
|
||||
struct v4l2_input *i)
|
||||
{
|
||||
struct usbtv *dev = video_drvdata(file);
|
||||
|
||||
switch (i->index) {
|
||||
case USBTV_COMPOSITE_INPUT:
|
||||
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->std = V4L2_STD_525_60;
|
||||
i->std = dev->vdev.tvnorms;
|
||||
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,
|
||||
struct v4l2_format *f)
|
||||
{
|
||||
f->fmt.pix.width = USBTV_WIDTH;
|
||||
f->fmt.pix.height = USBTV_HEIGHT;
|
||||
struct usbtv *usbtv = video_drvdata(file);
|
||||
|
||||
f->fmt.pix.width = usbtv->width;
|
||||
f->fmt.pix.height = usbtv->height;
|
||||
f->fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
|
||||
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.colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
f->fmt.pix.priv = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
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 = {
|
||||
.vidioc_querycap = usbtv_querycap,
|
||||
.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,
|
||||
unsigned int *nplanes, unsigned int sizes[], void *alloc_ctxs[])
|
||||
{
|
||||
struct usbtv *usbtv = vb2_get_drv_priv(vq);
|
||||
|
||||
if (*nbuffers < 2)
|
||||
*nbuffers = 2;
|
||||
*nplanes = 1;
|
||||
sizes[0] = USBTV_WIDTH * USBTV_HEIGHT / 2 * sizeof(u32);
|
||||
sizes[0] = USBTV_CHUNK * usbtv->n_chunks * 2 * sizeof(u32);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -690,7 +784,11 @@ static int usbtv_probe(struct usb_interface *intf,
|
|||
return -ENOMEM;
|
||||
usbtv->dev = dev;
|
||||
usbtv->udev = usb_get_dev(interface_to_usbdev(intf));
|
||||
|
||||
usbtv->iso_size = size;
|
||||
|
||||
(void)usbtv_configure_for_norm(usbtv, V4L2_STD_525_60);
|
||||
|
||||
spin_lock_init(&usbtv->buflock);
|
||||
mutex_init(&usbtv->v4l2_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.fops = &usbtv_fops;
|
||||
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.lock = &usbtv->v4l2_lock;
|
||||
set_bit(V4L2_FL_USE_FH_PRIO, &usbtv->vdev.flags);
|
||||
|
|
|
@ -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)
|
||||
*
|
||||
* 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
|
||||
*
|
||||
* TS = ((TS2 - TS1) * PTS + TS1 * SOF2 - TS2 * SOF1) / (SOF2 - SOF1) (2)
|
||||
|
|
|
@ -420,7 +420,7 @@ const char * const *v4l2_ctrl_get_menu(u32 id)
|
|||
"Advanced Simple",
|
||||
"Core",
|
||||
"Simple Scalable",
|
||||
"Advanced Coding Efficency",
|
||||
"Advanced Coding Efficiency",
|
||||
NULL,
|
||||
};
|
||||
|
||||
|
|
|
@ -144,6 +144,25 @@ static void __vb2_buf_dmabuf_put(struct vb2_buffer *vb)
|
|||
__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
|
||||
* every buffer on the queue
|
||||
|
@ -169,7 +188,6 @@ static void __setup_offsets(struct vb2_queue *q, unsigned int n)
|
|||
continue;
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
__setup_lengths(q, buffer);
|
||||
if (memory == V4L2_MEMORY_MMAP)
|
||||
__setup_offsets(q, buffer);
|
||||
|
||||
|
@ -1824,8 +1843,8 @@ int vb2_expbuf(struct vb2_queue *q, struct v4l2_exportbuffer *eb)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (eb->flags & ~O_CLOEXEC) {
|
||||
dprintk(1, "Queue does support only O_CLOEXEC flag\n");
|
||||
if (eb->flags & ~(O_CLOEXEC | O_ACCMODE)) {
|
||||
dprintk(1, "Queue does support only O_CLOEXEC and access mode flags\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -1848,14 +1867,14 @@ int vb2_expbuf(struct vb2_queue *q, struct v4l2_exportbuffer *eb)
|
|||
|
||||
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)) {
|
||||
dprintk(1, "Failed to export buffer %d, plane %d\n",
|
||||
eb->index, eb->plane);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = dma_buf_fd(dbuf, eb->flags);
|
||||
ret = dma_buf_fd(dbuf, eb->flags & ~O_ACCMODE);
|
||||
if (ret < 0) {
|
||||
dprintk(3, "buffer %d, plane %d failed to export (%d)\n",
|
||||
eb->index, eb->plane, ret);
|
||||
|
|
|
@ -393,7 +393,7 @@ static struct sg_table *vb2_dc_get_base_sgt(struct vb2_dc_buf *buf)
|
|||
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 dma_buf *dbuf;
|
||||
|
@ -404,7 +404,7 @@ static struct dma_buf *vb2_dc_get_dmabuf(void *buf_priv)
|
|||
if (WARN_ON(!buf->sgt_base))
|
||||
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))
|
||||
return NULL;
|
||||
|
||||
|
|
|
@ -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 *),
|
||||
GFP_KERNEL);
|
||||
if (!buf->pages)
|
||||
return NULL;
|
||||
goto userptr_fail_alloc_pages;
|
||||
|
||||
num_pages_from_user = get_user_pages(current, current->mm,
|
||||
vaddr & PAGE_MASK,
|
||||
|
@ -204,6 +204,7 @@ userptr_fail_get_user_pages:
|
|||
while (--num_pages_from_user >= 0)
|
||||
put_page(buf->pages[num_pages_from_user]);
|
||||
kfree(buf->pages);
|
||||
userptr_fail_alloc_pages:
|
||||
kfree(buf);
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -83,7 +83,7 @@ struct vb2_fileio_data;
|
|||
struct vb2_mem_ops {
|
||||
void *(*alloc)(void *alloc_ctx, unsigned long size, gfp_t gfp_flags);
|
||||
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,
|
||||
unsigned long size, int write);
|
||||
|
|
Loading…
Reference in New Issue