Merge tag 'media/v5.1-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
Pull media updates from Mauro Carvalho Chehab: - remove sensor drivers that got converted from soc_camera - remaining soc_camera drivers got moved to staging - some documentation cleanups and improvements - the imx staging driver now supports imx7 - the ov9640, mt9m001 and mt9m111 got converted from soc_camera - the vim2m driver now does what a m2m convert driver expects to do - epoll() fixes on media subsystems - several drivers fixes, typos, cleanups and improvements * tag 'media/v5.1-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (346 commits) media: dvb/earth-pt1: fix wrong initialization for demod blocks media: vim2m: Address some coding style issues media: vim2m: don't use BUG() media: vim2m: speedup passthrough copy media: vim2m: add an horizontal scaler media: vim2m: don't accept YUYV anymore as output format media: vim2m: add vertical linear scaler media: vim2m: better handle cap/out buffers with different sizes media: vim2m: use different framesizes for bayer formats media: vim2m: add support for VIDIOC_ENUM_FRAMESIZES media: vim2m: ensure that width is multiple of two media: vim2m: improve debug messages media: vim2m: add bayer capture formats media: a few more typos at staging, pci, platform, radio and usb media: Documentation: fix several typos media: staging: fix several typos media: include: fix several typos media: common: fix several typos media: v4l2-core: fix several typos media: usb: fix several typos ...
Этот коммит содержится в:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Handlers for board audio hooks, splitted from bttv-cards
|
||||
* Handlers for board audio hooks, split from bttv-cards
|
||||
*
|
||||
* Copyright (c) 2006 Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||
* This code is placed under the terms of the GNU General Public License
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Handlers for board audio hooks, splitted from bttv-cards
|
||||
* Handlers for board audio hooks, split from bttv-cards
|
||||
*
|
||||
* Copyright (c) 2006 Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||
* This code is placed under the terms of the GNU General Public License
|
||||
|
@@ -2,7 +2,7 @@
|
||||
|
||||
bttv-cards.c
|
||||
|
||||
this file has configuration informations - card-specific stuff
|
||||
this file has configuration information - card-specific stuff
|
||||
like the big tvcards array for the most part
|
||||
|
||||
Copyright (C) 1996,97,98 Ralph Metzler (rjkm@thp.uni-koeln.de)
|
||||
@@ -1391,7 +1391,7 @@ struct tvcard bttv_tvcards[] = {
|
||||
.gpiomux = {0x947fff, 0x987fff,0x947fff,0x947fff },
|
||||
.gpiomute = 0x947fff,
|
||||
/* tvtuner, radio, external,internal, mute, stereo
|
||||
* tuner, Composit, SVid, Composit-on-Svid-adapter */
|
||||
* tuner, Composite, SVid, Composite-on-Svid-adapter */
|
||||
.muxsel = MUXSEL(2, 3, 0, 1),
|
||||
.tuner_type = TUNER_MT2032,
|
||||
.tuner_addr = ADDR_UNSET,
|
||||
@@ -1411,7 +1411,7 @@ struct tvcard bttv_tvcards[] = {
|
||||
.gpiomux = {0x947fff, 0x987fff,0x947fff,0x947fff },
|
||||
.gpiomute = 0x947fff,
|
||||
/* tvtuner, radio, external,internal, mute, stereo
|
||||
* tuner, Composit, SVid, Composit-on-Svid-adapter */
|
||||
* tuner, Composite, SVid, Composite-on-Svid-adapter */
|
||||
.muxsel = MUXSEL(2, 3, 0, 1),
|
||||
.tuner_type = TUNER_MT2032,
|
||||
.tuner_addr = ADDR_UNSET,
|
||||
@@ -4180,7 +4180,7 @@ static void init_PXC200(struct bttv *btv)
|
||||
bttv_I2CWrite(btv,0x5E,0,0x80,1);
|
||||
|
||||
/* Initialise 12C508 PIC */
|
||||
/* The I2CWrite and I2CRead commmands are actually to the
|
||||
/* The I2CWrite and I2CRead commands are actually to the
|
||||
* same chips - but the R/W bit is included in the address
|
||||
* argument so the numbers are different */
|
||||
|
||||
@@ -4289,7 +4289,7 @@ init_RTV24 (struct bttv *btv)
|
||||
/* ----------------------------------------------------------------------- */
|
||||
/*
|
||||
* The PCI-8604PW contains a CPLD, probably an ispMACH 4A, that filters
|
||||
* the PCI REQ signals comming from the four BT878 chips. After power
|
||||
* the PCI REQ signals coming from the four BT878 chips. After power
|
||||
* up, the CPLD does not forward requests to the bus, which prevents
|
||||
* the BT878 from fetching RISC instructions from memory. While the
|
||||
* CPLD is connected to most of the GPIOs of PCI device 0xD, only
|
||||
@@ -4405,7 +4405,7 @@ static void rv605_muxsel(struct bttv *btv, unsigned int input)
|
||||
|
||||
gpio_bits(0x07f, muxgpio[input]);
|
||||
|
||||
/* reset all conections */
|
||||
/* reset all connections */
|
||||
gpio_bits(0x200,0x200);
|
||||
mdelay(1);
|
||||
gpio_bits(0x200,0x000);
|
||||
|
@@ -2435,7 +2435,7 @@ static int bttv_s_fmt_vid_cap(struct file *file, void *priv,
|
||||
|
||||
f->fmt.pix.field = field;
|
||||
|
||||
/* update our state informations */
|
||||
/* update our state information */
|
||||
fh->fmt = fmt;
|
||||
fh->cap.field = f->fmt.pix.field;
|
||||
fh->cap.last = V4L2_FIELD_NONE;
|
||||
@@ -3064,7 +3064,7 @@ static int bttv_open(struct file *file)
|
||||
V4L2 apps we now reset the cropping parameters as seen through
|
||||
this fh, which is to say VIDIOC_G_SELECTION and scaling limit checks
|
||||
will use btv->crop[0], the default cropping parameters for the
|
||||
current video standard, and VIDIOC_S_FMT will not implicitely
|
||||
current video standard, and VIDIOC_S_FMT will not implicitly
|
||||
change the cropping parameters until VIDIOC_S_SELECTION has been
|
||||
called. */
|
||||
fh->do_crop = !reset_crop; /* module parameter */
|
||||
@@ -3600,9 +3600,7 @@ static void
|
||||
bttv_irq_wakeup_video(struct bttv *btv, struct bttv_buffer_set *wakeup,
|
||||
struct bttv_buffer_set *curr, unsigned int state)
|
||||
{
|
||||
struct timeval ts;
|
||||
|
||||
v4l2_get_timestamp(&ts);
|
||||
u64 ts = ktime_get_ns();
|
||||
|
||||
if (wakeup->top == wakeup->bottom) {
|
||||
if (NULL != wakeup->top && curr->top != wakeup->top) {
|
||||
@@ -3643,7 +3641,7 @@ bttv_irq_wakeup_vbi(struct bttv *btv, struct bttv_buffer *wakeup,
|
||||
if (NULL == wakeup)
|
||||
return;
|
||||
|
||||
v4l2_get_timestamp(&wakeup->vb.ts);
|
||||
wakeup->vb.ts = ktime_get_ns();
|
||||
wakeup->vb.field_count = btv->field_count;
|
||||
wakeup->vb.state = state;
|
||||
wake_up(&wakeup->vb.done);
|
||||
@@ -3713,7 +3711,7 @@ bttv_irq_wakeup_top(struct bttv *btv)
|
||||
btv->curr.top = NULL;
|
||||
bttv_risc_hook(btv, RISC_SLOT_O_FIELD, NULL, 0);
|
||||
|
||||
v4l2_get_timestamp(&wakeup->vb.ts);
|
||||
wakeup->vb.ts = ktime_get_ns();
|
||||
wakeup->vb.field_count = btv->field_count;
|
||||
wakeup->vb.state = VIDEOBUF_DONE;
|
||||
wake_up(&wakeup->vb.done);
|
||||
|
@@ -93,7 +93,7 @@ bttv_risc_packed(struct bttv *btv, struct btcx_riscmem *risc,
|
||||
*(rp++)=cpu_to_le32(sg_dma_address(sg)+offset);
|
||||
offset+=bpl;
|
||||
} else {
|
||||
/* scanline needs to be splitted */
|
||||
/* scanline needs to be split */
|
||||
todo = bpl;
|
||||
*(rp++)=cpu_to_le32(BT848_RISC_WRITE|BT848_RISC_SOL|
|
||||
(sg_dma_len(sg)-offset));
|
||||
|
@@ -288,7 +288,7 @@ extern void bttv_init_card1(struct bttv *btv);
|
||||
extern void bttv_init_card2(struct bttv *btv);
|
||||
extern void bttv_init_tuner(struct bttv *btv);
|
||||
|
||||
/* card-specific funtions */
|
||||
/* card-specific functions */
|
||||
extern void tea5757_set_freq(struct bttv *btv, unsigned short freq);
|
||||
extern u32 bttv_tda9880_setnorm(struct bttv *btv, u32 gpiobits);
|
||||
|
||||
|
@@ -1295,15 +1295,15 @@ static int dst_get_signal(struct dst_state *state)
|
||||
|
||||
static int dst_tone_power_cmd(struct dst_state *state)
|
||||
{
|
||||
u8 paket[8] = { 0x00, 0x09, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00 };
|
||||
u8 packet[8] = { 0x00, 0x09, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00 };
|
||||
|
||||
if (state->dst_type != DST_TYPE_IS_SAT)
|
||||
return -EOPNOTSUPP;
|
||||
paket[4] = state->tx_tuna[4];
|
||||
paket[2] = state->tx_tuna[2];
|
||||
paket[3] = state->tx_tuna[3];
|
||||
paket[7] = dst_check_sum (paket, 7);
|
||||
return dst_command(state, paket, 8);
|
||||
packet[4] = state->tx_tuna[4];
|
||||
packet[2] = state->tx_tuna[2];
|
||||
packet[3] = state->tx_tuna[3];
|
||||
packet[7] = dst_check_sum (packet, 7);
|
||||
return dst_command(state, packet, 8);
|
||||
}
|
||||
|
||||
static int dst_get_tuna(struct dst_state *state)
|
||||
@@ -1429,18 +1429,18 @@ error:
|
||||
static int dst_set_diseqc(struct dvb_frontend *fe, struct dvb_diseqc_master_cmd *cmd)
|
||||
{
|
||||
struct dst_state *state = fe->demodulator_priv;
|
||||
u8 paket[8] = { 0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf0, 0xec };
|
||||
u8 packet[8] = { 0x00, 0x08, 0x04, 0xe0, 0x10, 0x38, 0xf0, 0xec };
|
||||
|
||||
if (state->dst_type != DST_TYPE_IS_SAT)
|
||||
return -EOPNOTSUPP;
|
||||
if (cmd->msg_len > 0 && cmd->msg_len < 5)
|
||||
memcpy(&paket[3], cmd->msg, cmd->msg_len);
|
||||
memcpy(&packet[3], cmd->msg, cmd->msg_len);
|
||||
else if (cmd->msg_len == 5 && state->dst_hw_cap & DST_TYPE_HAS_DISEQC5)
|
||||
memcpy(&paket[2], cmd->msg, cmd->msg_len);
|
||||
memcpy(&packet[2], cmd->msg, cmd->msg_len);
|
||||
else
|
||||
return -EINVAL;
|
||||
paket[7] = dst_check_sum(&paket[0], 7);
|
||||
return dst_command(state, paket, 8);
|
||||
packet[7] = dst_check_sum(&packet[0], 7);
|
||||
return dst_command(state, packet, 8);
|
||||
}
|
||||
|
||||
static int dst_set_voltage(struct dvb_frontend *fe, enum fe_sec_voltage voltage)
|
||||
|
@@ -375,7 +375,7 @@ static void cobalt_dma_stop_streaming(struct cobalt_stream *s)
|
||||
}
|
||||
spin_unlock_irqrestore(&s->irqlock, flags);
|
||||
|
||||
/* Wait 100 milisecond for DMA to finish, abort on timeout. */
|
||||
/* Wait 100 millisecond for DMA to finish, abort on timeout. */
|
||||
if (!wait_event_timeout(s->q.done_wq, is_dma_done(s),
|
||||
msecs_to_jiffies(timeout_msec))) {
|
||||
omni_sg_dma_abort_channel(s);
|
||||
|
@@ -83,7 +83,7 @@ struct cx18_gpio_i2c_slave_reset {
|
||||
u32 active_hi_mask; /* GPIO outputs that reset i2c chips when high */
|
||||
int msecs_asserted; /* time period reset must remain asserted */
|
||||
int msecs_recovery; /* time after deassert for chips to be ready */
|
||||
u32 ir_reset_mask; /* GPIO to reset the Zilog Z8F0811 IR contoller */
|
||||
u32 ir_reset_mask; /* GPIO to reset the Zilog Z8F0811 IR controller */
|
||||
};
|
||||
|
||||
struct cx18_gpio_audio_input { /* select tuner/line in input */
|
||||
|
@@ -120,8 +120,8 @@ static struct zl10353_config leadtek_dvr3100h_demod = {
|
||||
/*
|
||||
* Due to
|
||||
*
|
||||
* 1. an absence of information on how to prgram the MT352
|
||||
* 2. the Linux mt352 module pushing MT352 initialzation off onto us here
|
||||
* 1. an absence of information on how to program the MT352
|
||||
* 2. the Linux mt352 module pushing MT352 initialization off onto us here
|
||||
*
|
||||
* We have to use an init sequence that *you* must extract from the Windows
|
||||
* driver (yuanrap.sys) and which we load as a firmware.
|
||||
@@ -458,7 +458,7 @@ void cx18_dvb_unregister(struct cx18_stream *stream)
|
||||
dvb_unregister_adapter(dvb_adapter);
|
||||
}
|
||||
|
||||
/* All the DVB attach calls go here, this function get's modified
|
||||
/* All the DVB attach calls go here, this function gets modified
|
||||
* for each new card. cx18_dvb_start_feed() will also need changes.
|
||||
*/
|
||||
static int dvb_register(struct cx18_stream *stream)
|
||||
|
@@ -403,7 +403,7 @@ static size_t cx18_copy_mdl_to_user(struct cx18_stream *s,
|
||||
tot_written += rc;
|
||||
|
||||
if (stop || /* Forced stopping point for VBI insertion */
|
||||
tot_written >= ucount || /* Reader request statisfied */
|
||||
tot_written >= ucount || /* Reader request satisfied */
|
||||
mdl->curr_buf->readpos < mdl->curr_buf->bytesused ||
|
||||
mdl->readpos >= mdl->bytesused) /* MDL buffers drained */
|
||||
break;
|
||||
|
@@ -23,7 +23,7 @@
|
||||
/*
|
||||
* Readback and retry of MMIO access for reliability:
|
||||
* The concept was suggested by Steve Toth <stoth@linuxtv.org>.
|
||||
* The implmentation is the fault of Andy Walls <awalls@md.metrocast.net>.
|
||||
* The implementation is the fault of Andy Walls <awalls@md.metrocast.net>.
|
||||
*
|
||||
* *write* functions are implied to retry the mmio unless suffixed with _noretry
|
||||
* *read* functions never retry the mmio (it never helps to do so)
|
||||
|
@@ -197,7 +197,7 @@ static void cx18_mdl_send_to_videobuf(struct cx18_stream *s,
|
||||
}
|
||||
|
||||
if (dispatch) {
|
||||
v4l2_get_timestamp(&vb_buf->vb.ts);
|
||||
vb_buf->vb.ts = ktime_get_ns();
|
||||
list_del(&vb_buf->vb.queue);
|
||||
vb_buf->vb.state = VIDEOBUF_DONE;
|
||||
wake_up(&vb_buf->vb.done);
|
||||
|
@@ -24,7 +24,7 @@
|
||||
/*
|
||||
* Raster Reference/Protection (RP) bytes, used in Start/End Active
|
||||
* Video codes emitted from the digitzer in VIP 1.x mode, that flag the start
|
||||
* of VBI sample or VBI ancillary data regions in the digitial ratser line.
|
||||
* of VBI sample or VBI ancillary data regions in the digital ratser line.
|
||||
*
|
||||
* Task FieldEven VerticalBlank HorizontalBlank 0 0 0 0
|
||||
*/
|
||||
|
@@ -439,7 +439,7 @@
|
||||
/* Error in I2C data xfer (but I2C device is present) */
|
||||
#define CXERR_I2CDEV_XFERERR 0x000011
|
||||
|
||||
/* Chanel changing component not ready */
|
||||
/* Channel changing component not ready */
|
||||
#define CXERR_CHANNELNOTREADY 0x000012
|
||||
|
||||
/* PPU (Presensation/Decoder) mail box is corrupted */
|
||||
|
@@ -1561,7 +1561,7 @@ int cx23885_417_register(struct cx23885_dev *dev)
|
||||
pr_info("%s: registered device %s [mpeg]\n",
|
||||
dev->name, video_device_node_name(dev->v4l_device));
|
||||
|
||||
/* ST: Configure the encoder paramaters, but don't begin
|
||||
/* ST: Configure the encoder parameters, but don't begin
|
||||
* encoding, this resolves an issue where the first time the
|
||||
* encoder is started video can be choppy.
|
||||
*/
|
||||
|
@@ -59,7 +59,7 @@ module_param(audio_debug, int, 0644);
|
||||
MODULE_PARM_DESC(audio_debug, "enable debug messages [analog audio]");
|
||||
|
||||
/****************************************************************************
|
||||
Board specific funtions
|
||||
Board specific functions
|
||||
****************************************************************************/
|
||||
|
||||
/* Constants taken from cx88-reg.h */
|
||||
|
@@ -1996,9 +1996,9 @@ static inline int encoder_on_portc(struct cx23885_dev *dev)
|
||||
* and report errors if we think we're tampering with a GPIo that might
|
||||
* be assigned to the encoder (and used for the host bus).
|
||||
*
|
||||
* GPIO 2 thru 0 - On the cx23885 bridge
|
||||
* GPIO 18 thru 3 - On the cx23417 host bus interface
|
||||
* GPIO 23 thru 19 - On the cx25840 a/v core
|
||||
* GPIO 2 through 0 - On the cx23885 bridge
|
||||
* GPIO 18 through 3 - On the cx23417 host bus interface
|
||||
* GPIO 23 through 19 - On the cx25840 a/v core
|
||||
*/
|
||||
void cx23885_gpio_set(struct cx23885_dev *dev, u32 mask)
|
||||
{
|
||||
|
@@ -246,7 +246,7 @@ struct cx23885_i2c {
|
||||
struct i2c_client i2c_client;
|
||||
u32 i2c_rc;
|
||||
|
||||
/* 885 registers used for raw addess */
|
||||
/* 885 registers used for raw address */
|
||||
u32 i2c_period;
|
||||
u32 reg_ctrl;
|
||||
u32 reg_stat;
|
||||
|
@@ -548,7 +548,7 @@ static int cx23888_ir_irq_handler(struct v4l2_subdev *sd, u32 status,
|
||||
ror = stats & STATS_ROR; /* Rx FIFO Over Run */
|
||||
|
||||
tse = irqen & IRQEN_TSE; /* Tx FIFO Service Request IRQ Enable */
|
||||
rse = irqen & IRQEN_RSE; /* Rx FIFO Service Reuqest IRQ Enable */
|
||||
rse = irqen & IRQEN_RSE; /* Rx FIFO Service Request IRQ Enable */
|
||||
rte = irqen & IRQEN_RTE; /* Rx Pulse Width Timer Time Out IRQ Enable */
|
||||
roe = irqen & IRQEN_ROE; /* Rx FIFO Over Run IRQ Enable */
|
||||
|
||||
@@ -638,7 +638,7 @@ static int cx23888_ir_irq_handler(struct v4l2_subdev *sd, u32 status,
|
||||
events |= V4L2_SUBDEV_IR_RX_END_OF_RX_DETECTED;
|
||||
}
|
||||
if (v) {
|
||||
/* Clear STATS_ROR & STATS_RTO as needed by reseting hardware */
|
||||
/* Clear STATS_ROR & STATS_RTO as needed by resetting hardware */
|
||||
cx23888_ir_write4(dev, CX23888_IR_CNTRL_REG, cntrl & ~v);
|
||||
cx23888_ir_write4(dev, CX23888_IR_CNTRL_REG, cntrl);
|
||||
*handled = true;
|
||||
|
@@ -120,7 +120,7 @@ module_param(debug, int, 0644);
|
||||
MODULE_PARM_DESC(debug, "enable debug messages");
|
||||
|
||||
/****************************************************************************
|
||||
Module specific funtions
|
||||
Module specific functions
|
||||
****************************************************************************/
|
||||
/* Constants taken from cx88-reg.h */
|
||||
#define AUD_INT_DN_RISCI1 (1 << 0)
|
||||
|
@@ -24,7 +24,7 @@
|
||||
#define AUDIO_CMDS_SIZE 80 /* AUDIO CMDS size in bytes */
|
||||
#define MBIF_CMDS_SIZE 80 /* MBIF CMDS size in bytes */
|
||||
|
||||
/* #define RX_SRAM_POOL_START_SIZE = 0; // Start of useable RX SRAM for buffers */
|
||||
/* #define RX_SRAM_POOL_START_SIZE = 0; // Start of usable RX SRAM for buffers */
|
||||
#define VID_IQ_SIZE 64 /* VID instruction queue size in bytes */
|
||||
#define MBIF_IQ_SIZE 64
|
||||
#define AUDIO_IQ_SIZE 64 /* AUD instruction queue size in bytes */
|
||||
|
@@ -156,7 +156,7 @@ struct cx25821_i2c {
|
||||
struct i2c_client i2c_client;
|
||||
u32 i2c_rc;
|
||||
|
||||
/* cx25821 registers used for raw addess */
|
||||
/* cx25821 registers used for raw address */
|
||||
u32 i2c_period;
|
||||
u32 reg_ctrl;
|
||||
u32 reg_stat;
|
||||
|
@@ -517,7 +517,7 @@ static int dm1105_i2c_xfer(struct i2c_adapter *i2c_adap,
|
||||
msgs[i].buf[byte] = rc;
|
||||
}
|
||||
} else if ((msgs[i].buf[0] == 0xf7) && (msgs[i].addr == 0x55)) {
|
||||
/* prepaired for cx24116 firmware */
|
||||
/* prepared for cx24116 firmware */
|
||||
/* Write in small blocks */
|
||||
len = msgs[i].len - 1;
|
||||
k = 1;
|
||||
|
@@ -264,7 +264,7 @@ static void cio2_fbpt_exit(struct cio2_queue *q, struct device *dev)
|
||||
*/
|
||||
|
||||
/*
|
||||
* shift for keeping value range suitable for 32-bit integer arithmetics
|
||||
* shift for keeping value range suitable for 32-bit integer arithmetic
|
||||
*/
|
||||
#define LIMIT_SHIFT 8
|
||||
|
||||
@@ -1810,7 +1810,8 @@ static int cio2_pci_probe(struct pci_dev *pci_dev,
|
||||
|
||||
/* Register notifier for subdevices we care */
|
||||
r = cio2_notifier_init(cio2);
|
||||
if (r)
|
||||
/* Proceed without sensors connected to allow the device to suspend. */
|
||||
if (r && r != -ENODEV)
|
||||
goto fail_cio2_queue_exit;
|
||||
|
||||
r = devm_request_irq(&pci_dev->dev, pci_dev->irq, cio2_irq,
|
||||
@@ -2047,7 +2048,7 @@ module_pci_driver(cio2_pci_driver);
|
||||
|
||||
MODULE_AUTHOR("Tuukka Toivonen <tuukka.toivonen@intel.com>");
|
||||
MODULE_AUTHOR("Tianshu Qiu <tian.shu.qiu@intel.com>");
|
||||
MODULE_AUTHOR("Jian Xu Zheng <jian.xu.zheng@intel.com>");
|
||||
MODULE_AUTHOR("Jian Xu Zheng");
|
||||
MODULE_AUTHOR("Yuning Pu <yuning.pu@intel.com>");
|
||||
MODULE_AUTHOR("Yong Zhi <yong.zhi@intel.com>");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@@ -70,8 +70,25 @@ config VIDEO_FB_IVTV
|
||||
This is used in the Hauppauge PVR-350 card. There is a driver
|
||||
homepage at <http://www.ivtvdriver.org>.
|
||||
|
||||
In order to use this module, you will need to boot with PAT disabled
|
||||
on x86 systems, using the nopat kernel parameter.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called ivtvfb.
|
||||
|
||||
config VIDEO_FB_IVTV_FORCE_PAT
|
||||
bool "force cx23415 framebuffer init with x86 PAT enabled"
|
||||
depends on VIDEO_FB_IVTV && X86_PAT
|
||||
default n
|
||||
---help---
|
||||
With PAT enabled, the cx23415 framebuffer driver does not
|
||||
utilize write-combined caching on the framebuffer memory.
|
||||
For this reason, the driver will by default disable itself
|
||||
when initializied on a kernel with PAT enabled (i.e. not
|
||||
using the nopat kernel parameter).
|
||||
|
||||
The driver is not easily upgradable to the PAT-aware
|
||||
ioremap_wc() API since the firmware hides the address
|
||||
ranges that should be marked write-combined from the driver.
|
||||
|
||||
With this setting enabled, the framebuffer will initialize on
|
||||
PAT-enabled systems but the framebuffer memory will be uncached.
|
||||
|
||||
If unsure, say N.
|
||||
|
@@ -110,7 +110,7 @@ static int ivtv_yuv_prep_user_dma(struct ivtv *itv, struct ivtv_user_dma *dma,
|
||||
/*
|
||||
* Inherit the -EFAULT from rc's
|
||||
* initialization, but allow it to be
|
||||
* overriden by uv_pages above if it was an
|
||||
* overridden by uv_pages above if it was an
|
||||
* actual errno.
|
||||
*/
|
||||
} else {
|
||||
|
@@ -55,6 +55,7 @@
|
||||
/* card parameters */
|
||||
static int ivtvfb_card_id = -1;
|
||||
static int ivtvfb_debug = 0;
|
||||
static bool ivtvfb_force_pat = IS_ENABLED(CONFIG_VIDEO_FB_IVTV_FORCE_PAT);
|
||||
static bool osd_laced;
|
||||
static int osd_depth;
|
||||
static int osd_upper;
|
||||
@@ -64,6 +65,7 @@ static int osd_xres;
|
||||
|
||||
module_param(ivtvfb_card_id, int, 0444);
|
||||
module_param_named(debug,ivtvfb_debug, int, 0644);
|
||||
module_param_named(force_pat, ivtvfb_force_pat, bool, 0644);
|
||||
module_param(osd_laced, bool, 0444);
|
||||
module_param(osd_depth, int, 0444);
|
||||
module_param(osd_upper, int, 0444);
|
||||
@@ -79,6 +81,9 @@ MODULE_PARM_DESC(debug,
|
||||
"Debug level (bitmask). Default: errors only\n"
|
||||
"\t\t\t(debug = 3 gives full debugging)");
|
||||
|
||||
MODULE_PARM_DESC(force_pat,
|
||||
"Force initialization on x86 PAT-enabled systems (bool).\n");
|
||||
|
||||
/* Why upper, left, xres, yres, depth, laced ? To match terminology used
|
||||
by fbset.
|
||||
Why start at 1 for left & upper coordinate ? Because X doesn't allow 0 */
|
||||
@@ -1167,8 +1172,15 @@ static int ivtvfb_init_card(struct ivtv *itv)
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
if (pat_enabled()) {
|
||||
pr_warn("ivtvfb needs PAT disabled, boot with nopat kernel parameter\n");
|
||||
return -ENODEV;
|
||||
if (ivtvfb_force_pat) {
|
||||
pr_info("PAT is enabled. Write-combined framebuffer caching will be disabled.\n");
|
||||
pr_info("To enable caching, boot with nopat kernel parameter\n");
|
||||
} else {
|
||||
pr_warn("ivtvfb needs PAT disabled for write-combined framebuffer caching.\n");
|
||||
pr_warn("Boot with nopat kernel parameter to use caching, or use the\n");
|
||||
pr_warn("force_pat module parameter to run with caching disabled\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@@ -805,7 +805,7 @@ again:
|
||||
mchip_hsize() * mchip_vsize() * 2);
|
||||
meye.grab_buffer[reqnr].size = mchip_hsize() * mchip_vsize() * 2;
|
||||
meye.grab_buffer[reqnr].state = MEYE_BUF_DONE;
|
||||
v4l2_get_timestamp(&meye.grab_buffer[reqnr].timestamp);
|
||||
meye.grab_buffer[reqnr].ts = ktime_get_ns();
|
||||
meye.grab_buffer[reqnr].sequence = sequence++;
|
||||
kfifo_in_locked(&meye.doneq, (unsigned char *)&reqnr,
|
||||
sizeof(int), &meye.doneq_lock);
|
||||
@@ -826,7 +826,7 @@ again:
|
||||
size);
|
||||
meye.grab_buffer[reqnr].size = size;
|
||||
meye.grab_buffer[reqnr].state = MEYE_BUF_DONE;
|
||||
v4l2_get_timestamp(&meye.grab_buffer[reqnr].timestamp);
|
||||
meye.grab_buffer[reqnr].ts = ktime_get_ns();
|
||||
meye.grab_buffer[reqnr].sequence = sequence++;
|
||||
kfifo_in_locked(&meye.doneq, (unsigned char *)&reqnr,
|
||||
sizeof(int), &meye.doneq_lock);
|
||||
@@ -1283,7 +1283,7 @@ static int vidioc_querybuf(struct file *file, void *fh, struct v4l2_buffer *buf)
|
||||
buf->flags |= V4L2_BUF_FLAG_DONE;
|
||||
|
||||
buf->field = V4L2_FIELD_NONE;
|
||||
buf->timestamp = meye.grab_buffer[index].timestamp;
|
||||
buf->timestamp = ns_to_timeval(meye.grab_buffer[index].ts);
|
||||
buf->sequence = meye.grab_buffer[index].sequence;
|
||||
buf->memory = V4L2_MEMORY_MMAP;
|
||||
buf->m.offset = index * gbufsize;
|
||||
@@ -1349,7 +1349,7 @@ static int vidioc_dqbuf(struct file *file, void *fh, struct v4l2_buffer *buf)
|
||||
buf->bytesused = meye.grab_buffer[reqnr].size;
|
||||
buf->flags = V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
|
||||
buf->field = V4L2_FIELD_NONE;
|
||||
buf->timestamp = meye.grab_buffer[reqnr].timestamp;
|
||||
buf->timestamp = ns_to_timeval(meye.grab_buffer[reqnr].ts);
|
||||
buf->sequence = meye.grab_buffer[reqnr].sequence;
|
||||
buf->memory = V4L2_MEMORY_MMAP;
|
||||
buf->m.offset = reqnr * gbufsize;
|
||||
|
@@ -277,11 +277,11 @@
|
||||
struct meye_grab_buffer {
|
||||
int state; /* state of buffer */
|
||||
unsigned long size; /* size of jpg frame */
|
||||
struct timeval timestamp; /* timestamp */
|
||||
u64 ts; /* timestamp */
|
||||
unsigned long sequence; /* sequence number */
|
||||
};
|
||||
|
||||
/* size of kfifos containings buffer indices */
|
||||
/* size of kfifos containing buffer indices */
|
||||
#define MEYE_QUEUE_SIZE MEYE_MAX_BUFNBRS
|
||||
|
||||
/* Motion Eye device structure */
|
||||
|
@@ -1014,7 +1014,7 @@ static int FillTSIdleBuffer(struct SRingBufferDescriptor *pIdleBuffer,
|
||||
/* Point to first buffer entry */
|
||||
struct SBufferHeader *Cur = pRingBuffer->Head;
|
||||
int i;
|
||||
/* Loop thru all buffer and set Buffer 2 pointers to TSIdlebuffer */
|
||||
/* Loop through all buffer and set Buffer 2 pointers to TSIdlebuffer */
|
||||
for (i = 0; i < n; i++) {
|
||||
Cur->Buffer2 = pIdleBuffer->Head->Buffer1;
|
||||
Cur->scList2 = pIdleBuffer->Head->scList1;
|
||||
|
@@ -200,16 +200,10 @@ static const u8 va1j5jf8007t_25mhz_configs[][2] = {
|
||||
static int config_demod(struct i2c_client *cl, enum pt1_fe_clk clk)
|
||||
{
|
||||
int ret;
|
||||
u8 buf[2] = {0x01, 0x80};
|
||||
bool is_sat;
|
||||
const u8 (*cfg_data)[2];
|
||||
int i, len;
|
||||
|
||||
ret = i2c_master_send(cl, buf, 2);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
usleep_range(30000, 50000);
|
||||
|
||||
is_sat = !strncmp(cl->name, TC90522_I2C_DEV_SAT,
|
||||
strlen(TC90522_I2C_DEV_SAT));
|
||||
if (is_sat) {
|
||||
@@ -260,6 +254,46 @@ static int config_demod(struct i2c_client *cl, enum pt1_fe_clk clk)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Init registers for (each pair of) terrestrial/satellite block in demod.
|
||||
* Note that resetting terr. block also resets its peer sat. block as well.
|
||||
* This function must be called before configuring any demod block
|
||||
* (before pt1_wakeup(), fe->ops.init()).
|
||||
*/
|
||||
static int pt1_demod_block_init(struct pt1 *pt1)
|
||||
{
|
||||
struct i2c_client *cl;
|
||||
u8 buf[2] = {0x01, 0x80};
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
/* reset all terr. & sat. pairs first */
|
||||
for (i = 0; i < PT1_NR_ADAPS; i++) {
|
||||
cl = pt1->adaps[i]->demod_i2c_client;
|
||||
if (strncmp(cl->name, TC90522_I2C_DEV_TER,
|
||||
strlen(TC90522_I2C_DEV_TER)))
|
||||
continue;
|
||||
|
||||
ret = i2c_master_send(cl, buf, 2);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
usleep_range(30000, 50000);
|
||||
}
|
||||
|
||||
for (i = 0; i < PT1_NR_ADAPS; i++) {
|
||||
cl = pt1->adaps[i]->demod_i2c_client;
|
||||
if (strncmp(cl->name, TC90522_I2C_DEV_SAT,
|
||||
strlen(TC90522_I2C_DEV_SAT)))
|
||||
continue;
|
||||
|
||||
ret = i2c_master_send(cl, buf, 2);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
usleep_range(30000, 50000);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void pt1_write_reg(struct pt1 *pt1, int reg, u32 data)
|
||||
{
|
||||
writel(data, pt1->regs + reg * 4);
|
||||
@@ -987,6 +1021,10 @@ static int pt1_init_frontends(struct pt1 *pt1)
|
||||
goto tuner_release;
|
||||
}
|
||||
|
||||
ret = pt1_demod_block_init(pt1);
|
||||
if (ret < 0)
|
||||
goto fe_unregister;
|
||||
|
||||
return 0;
|
||||
|
||||
tuner_release:
|
||||
@@ -1245,6 +1283,10 @@ static int pt1_resume(struct device *dev)
|
||||
pt1_update_power(pt1);
|
||||
usleep_range(1000, 2000);
|
||||
|
||||
ret = pt1_demod_block_init(pt1);
|
||||
if (ret < 0)
|
||||
goto resume_err;
|
||||
|
||||
for (i = 0; i < PT1_NR_ADAPS; i++)
|
||||
dvb_frontend_reinitialise(pt1->adaps[i]->fe);
|
||||
|
||||
|
@@ -76,7 +76,7 @@ struct xfer_desc {
|
||||
u32 addr_l; /* bus address of target data buffer */
|
||||
u32 addr_h;
|
||||
u32 size;
|
||||
u32 next_l; /* bus adddress of the next xfer_desc */
|
||||
u32 next_l; /* bus address of the next xfer_desc */
|
||||
u32 next_h;
|
||||
};
|
||||
|
||||
|
@@ -6423,7 +6423,7 @@ struct pci_device_id saa7134_pci_tbl[] = {
|
||||
.vendor = PCI_VENDOR_ID_PHILIPS,
|
||||
.device = PCI_DEVICE_ID_PHILIPS_SAA7133,
|
||||
.subvendor = 0x5168,
|
||||
.subdevice = 0x3502, /* whats the difference to 0x3306 ?*/
|
||||
.subdevice = 0x3502, /* what's the difference to 0x3306 ?*/
|
||||
.driver_data = SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS,
|
||||
},{
|
||||
.vendor = PCI_VENDOR_ID_PHILIPS,
|
||||
|
@@ -399,7 +399,7 @@ static int mxb_init_done(struct saa7146_dev* dev)
|
||||
|
||||
/* check if the saa7740 (aka 'sound arena module') is present
|
||||
on the mxb. if so, we must initialize it. due to lack of
|
||||
informations about the saa7740, the values were reverse
|
||||
information about the saa7740, the values were reverse
|
||||
engineered. */
|
||||
msg.addr = 0x1b;
|
||||
msg.flags = 0;
|
||||
@@ -495,7 +495,7 @@ static int vidioc_s_input(struct file *file, void *fh, unsigned int input)
|
||||
input_port_selection[input].hps_sync);
|
||||
|
||||
/* prepare switching of tea6415c and saa7111a;
|
||||
have a look at the 'background'-file for further informations */
|
||||
have a look at the 'background'-file for further information */
|
||||
switch (input) {
|
||||
case TUNER:
|
||||
i = SAA7115_COMPOSITE0;
|
||||
|
@@ -749,7 +749,7 @@ int saa7164_api_initialize_dif(struct saa7164_port *port)
|
||||
if (port->type == SAA7164_MPEG_ENCODER) {
|
||||
/* Pick any analog standard to init the diff.
|
||||
* we'll come back during encoder_init'
|
||||
* and set the correct standard if requried.
|
||||
* and set the correct standard if required.
|
||||
*/
|
||||
std = V4L2_STD_NTSC;
|
||||
} else
|
||||
|
@@ -685,7 +685,7 @@ struct saa7164_subid saa7164_subids[] = {
|
||||
.subvendor = 0x0070,
|
||||
.subdevice = 0xf111,
|
||||
.card = SAA7164_BOARD_HAUPPAUGE_HVR2255,
|
||||
/* Prototype card left here for documenation purposes.
|
||||
/* Prototype card left here for documentation purposes.
|
||||
.card = SAA7164_BOARD_HAUPPAUGE_HVR2255proto,
|
||||
*/
|
||||
}, {
|
||||
@@ -866,7 +866,7 @@ void saa7164_card_setup(struct saa7164_dev *dev)
|
||||
* access to I2C. Instead we have to communicate through the device f/w for
|
||||
* register access to 'processing units'. Each unit has a unique
|
||||
* id, regardless of how the physical implementation occurs across
|
||||
* the three physical i2c busses. The being said if we want leverge of
|
||||
* the three physical i2c buses. The being said if we want leverge of
|
||||
* the existing kernel drivers for tuners and demods we have to 'speak i2c',
|
||||
* to this bridge implements 3 virtual i2c buses. This is a helper function
|
||||
* for those.
|
||||
|
@@ -157,7 +157,7 @@ static void saa7164_ts_verifier(struct saa7164_buffer *buf)
|
||||
|
||||
}
|
||||
|
||||
/* Only report errors if we've been through this function atleast
|
||||
/* Only report errors if we've been through this function at least
|
||||
* once already and the cached cc values are primed. First time through
|
||||
* always generates errors.
|
||||
*/
|
||||
@@ -1020,7 +1020,7 @@ static int saa7164_dev_setup(struct saa7164_dev *dev)
|
||||
dev->bmmio = (u8 __iomem *)dev->lmmio;
|
||||
dev->bmmio2 = (u8 __iomem *)dev->lmmio2;
|
||||
|
||||
/* Inerrupt and ack register locations offset of bmmio */
|
||||
/* Interrupt and ack register locations offset of bmmio */
|
||||
dev->int_status = 0x183000 + 0xf80;
|
||||
dev->int_ack = 0x183000 + 0xf90;
|
||||
|
||||
|
@@ -529,7 +529,7 @@ int saa7164_dvb_unregister(struct saa7164_port *port)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* All the DVB attach calls go here, this function get's modified
|
||||
/* All the DVB attach calls go here, this function gets modified
|
||||
* for each new card.
|
||||
*/
|
||||
int saa7164_dvb_register(struct saa7164_port *port)
|
||||
|
@@ -409,7 +409,7 @@ int saa7164_downloadfirmware(struct saa7164_dev *dev)
|
||||
(version & 0x0000001f),
|
||||
(version & 0xffff0000) >> 16);
|
||||
|
||||
/* Load the firmwware from the disk if required */
|
||||
/* Load the firmware from the disk if required */
|
||||
if (version == 0) {
|
||||
|
||||
printk(KERN_INFO "%s() Waiting for firmware upload (%s)\n",
|
||||
|
@@ -16,6 +16,9 @@
|
||||
|
||||
#include "smipcie.h"
|
||||
|
||||
#define SMI_SAMPLE_PERIOD 83
|
||||
#define SMI_SAMPLE_IDLEMIN (10000 / SMI_SAMPLE_PERIOD)
|
||||
|
||||
static void smi_ir_enableInterrupt(struct smi_rc *ir)
|
||||
{
|
||||
struct smi_dev *dev = ir->dev;
|
||||
@@ -42,114 +45,64 @@ static void smi_ir_stop(struct smi_rc *ir)
|
||||
struct smi_dev *dev = ir->dev;
|
||||
|
||||
smi_ir_disableInterrupt(ir);
|
||||
smi_clear(IR_Init_Reg, 0x80);
|
||||
smi_clear(IR_Init_Reg, rbIRen);
|
||||
}
|
||||
|
||||
#define BITS_PER_COMMAND 14
|
||||
#define GROUPS_PER_BIT 2
|
||||
#define IR_RC5_MIN_BIT 36
|
||||
#define IR_RC5_MAX_BIT 52
|
||||
static u32 smi_decode_rc5(u8 *pData, u8 size)
|
||||
static void smi_raw_process(struct rc_dev *rc_dev, const u8 *buffer,
|
||||
const u8 length)
|
||||
{
|
||||
u8 index, current_bit, bit_count;
|
||||
u8 group_array[BITS_PER_COMMAND * GROUPS_PER_BIT + 4];
|
||||
u8 group_index = 0;
|
||||
u32 command = 0xFFFFFFFF;
|
||||
struct ir_raw_event rawir = {};
|
||||
int cnt;
|
||||
|
||||
group_array[group_index++] = 1;
|
||||
|
||||
for (index = 0; index < size; index++) {
|
||||
|
||||
current_bit = (pData[index] & 0x80) ? 1 : 0;
|
||||
bit_count = pData[index] & 0x7f;
|
||||
|
||||
if ((current_bit == 1) && (bit_count >= 2*IR_RC5_MAX_BIT + 1)) {
|
||||
goto process_code;
|
||||
} else if ((bit_count >= IR_RC5_MIN_BIT) &&
|
||||
(bit_count <= IR_RC5_MAX_BIT)) {
|
||||
group_array[group_index++] = current_bit;
|
||||
} else if ((bit_count > IR_RC5_MAX_BIT) &&
|
||||
(bit_count <= 2*IR_RC5_MAX_BIT)) {
|
||||
group_array[group_index++] = current_bit;
|
||||
group_array[group_index++] = current_bit;
|
||||
} else {
|
||||
goto invalid_timing;
|
||||
}
|
||||
if (group_index >= BITS_PER_COMMAND*GROUPS_PER_BIT)
|
||||
goto process_code;
|
||||
|
||||
if ((group_index == BITS_PER_COMMAND*GROUPS_PER_BIT - 1)
|
||||
&& (group_array[group_index-1] == 0)) {
|
||||
group_array[group_index++] = 1;
|
||||
goto process_code;
|
||||
for (cnt = 0; cnt < length; cnt++) {
|
||||
if (buffer[cnt] & 0x7f) {
|
||||
rawir.pulse = (buffer[cnt] & 0x80) == 0;
|
||||
rawir.duration = ((buffer[cnt] & 0x7f) +
|
||||
(rawir.pulse ? 0 : -1)) *
|
||||
rc_dev->rx_resolution;
|
||||
ir_raw_event_store_with_filter(rc_dev, &rawir);
|
||||
}
|
||||
}
|
||||
|
||||
process_code:
|
||||
if (group_index == (BITS_PER_COMMAND*GROUPS_PER_BIT-1))
|
||||
group_array[group_index++] = 1;
|
||||
|
||||
if (group_index == BITS_PER_COMMAND*GROUPS_PER_BIT) {
|
||||
command = 0;
|
||||
for (index = 0; index < (BITS_PER_COMMAND*GROUPS_PER_BIT);
|
||||
index = index + 2) {
|
||||
if ((group_array[index] == 1) &&
|
||||
(group_array[index+1] == 0)) {
|
||||
command |= (1 << (BITS_PER_COMMAND -
|
||||
(index/2) - 1));
|
||||
} else if ((group_array[index] == 0) &&
|
||||
(group_array[index+1] == 1)) {
|
||||
/* */
|
||||
} else {
|
||||
command = 0xFFFFFFFF;
|
||||
goto invalid_timing;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
invalid_timing:
|
||||
return command;
|
||||
}
|
||||
|
||||
static void smi_ir_decode(struct work_struct *work)
|
||||
static void smi_ir_decode(struct smi_rc *ir)
|
||||
{
|
||||
struct smi_rc *ir = container_of(work, struct smi_rc, work);
|
||||
struct smi_dev *dev = ir->dev;
|
||||
struct rc_dev *rc_dev = ir->rc_dev;
|
||||
u32 dwIRControl, dwIRData, dwIRCode, scancode;
|
||||
u8 index, ucIRCount, readLoop, rc5_command, rc5_system, toggle;
|
||||
u32 dwIRControl, dwIRData;
|
||||
u8 index, ucIRCount, readLoop;
|
||||
|
||||
dwIRControl = smi_read(IR_Init_Reg);
|
||||
|
||||
if (dwIRControl & rbIRVld) {
|
||||
ucIRCount = (u8) smi_read(IR_Data_Cnt);
|
||||
|
||||
if (ucIRCount < 4)
|
||||
goto end_ir_decode;
|
||||
|
||||
readLoop = ucIRCount/4;
|
||||
if (ucIRCount % 4)
|
||||
readLoop += 1;
|
||||
for (index = 0; index < readLoop; index++) {
|
||||
dwIRData = smi_read(IR_DATA_BUFFER_BASE + (index*4));
|
||||
dwIRData = smi_read(IR_DATA_BUFFER_BASE + (index * 4));
|
||||
|
||||
ir->irData[index*4 + 0] = (u8)(dwIRData);
|
||||
ir->irData[index*4 + 1] = (u8)(dwIRData >> 8);
|
||||
ir->irData[index*4 + 2] = (u8)(dwIRData >> 16);
|
||||
ir->irData[index*4 + 3] = (u8)(dwIRData >> 24);
|
||||
}
|
||||
dwIRCode = smi_decode_rc5(ir->irData, ucIRCount);
|
||||
|
||||
if (dwIRCode != 0xFFFFFFFF) {
|
||||
rc5_command = dwIRCode & 0x3F;
|
||||
rc5_system = (dwIRCode & 0x7C0) >> 6;
|
||||
toggle = (dwIRCode & 0x800) ? 1 : 0;
|
||||
scancode = rc5_system << 8 | rc5_command;
|
||||
rc_keydown(rc_dev, RC_PROTO_RC5, scancode, toggle);
|
||||
}
|
||||
smi_raw_process(rc_dev, ir->irData, ucIRCount);
|
||||
smi_set(IR_Init_Reg, rbIRVld);
|
||||
}
|
||||
end_ir_decode:
|
||||
smi_set(IR_Init_Reg, 0x04);
|
||||
smi_ir_enableInterrupt(ir);
|
||||
|
||||
if (dwIRControl & rbIRhighidle) {
|
||||
struct ir_raw_event rawir = {};
|
||||
|
||||
rawir.pulse = 0;
|
||||
rawir.duration = US_TO_NS(SMI_SAMPLE_PERIOD *
|
||||
SMI_SAMPLE_IDLEMIN);
|
||||
ir_raw_event_store_with_filter(rc_dev, &rawir);
|
||||
smi_set(IR_Init_Reg, rbIRhighidle);
|
||||
}
|
||||
|
||||
ir_raw_event_handle(rc_dev);
|
||||
}
|
||||
|
||||
/* ir functions call by main driver.*/
|
||||
@@ -160,7 +113,8 @@ int smi_ir_irq(struct smi_rc *ir, u32 int_status)
|
||||
if (int_status & IR_X_INT) {
|
||||
smi_ir_disableInterrupt(ir);
|
||||
smi_ir_clearInterrupt(ir);
|
||||
schedule_work(&ir->work);
|
||||
smi_ir_decode(ir);
|
||||
smi_ir_enableInterrupt(ir);
|
||||
handled = 1;
|
||||
}
|
||||
return handled;
|
||||
@@ -170,9 +124,11 @@ void smi_ir_start(struct smi_rc *ir)
|
||||
{
|
||||
struct smi_dev *dev = ir->dev;
|
||||
|
||||
smi_write(IR_Idle_Cnt_Low, 0x00140070);
|
||||
smi_write(IR_Idle_Cnt_Low,
|
||||
(((SMI_SAMPLE_PERIOD - 1) & 0xFFFF) << 16) |
|
||||
(SMI_SAMPLE_IDLEMIN & 0xFFFF));
|
||||
msleep(20);
|
||||
smi_set(IR_Init_Reg, 0x90);
|
||||
smi_set(IR_Init_Reg, rbIRen | rbIRhighidle);
|
||||
|
||||
smi_ir_enableInterrupt(ir);
|
||||
}
|
||||
@@ -183,7 +139,7 @@ int smi_ir_init(struct smi_dev *dev)
|
||||
struct rc_dev *rc_dev;
|
||||
struct smi_rc *ir = &dev->ir;
|
||||
|
||||
rc_dev = rc_allocate_device(RC_DRIVER_SCANCODE);
|
||||
rc_dev = rc_allocate_device(RC_DRIVER_IR_RAW);
|
||||
if (!rc_dev)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -193,6 +149,7 @@ int smi_ir_init(struct smi_dev *dev)
|
||||
snprintf(ir->input_phys, sizeof(ir->input_phys), "pci-%s/ir0",
|
||||
pci_name(dev->pci_dev));
|
||||
|
||||
rc_dev->allowed_protocols = RC_PROTO_BIT_ALL_IR_DECODER;
|
||||
rc_dev->driver_name = "SMI_PCIe";
|
||||
rc_dev->input_phys = ir->input_phys;
|
||||
rc_dev->device_name = ir->device_name;
|
||||
@@ -203,11 +160,12 @@ int smi_ir_init(struct smi_dev *dev)
|
||||
rc_dev->dev.parent = &dev->pci_dev->dev;
|
||||
|
||||
rc_dev->map_name = dev->info->rc_map;
|
||||
rc_dev->timeout = MS_TO_NS(100);
|
||||
rc_dev->rx_resolution = US_TO_NS(SMI_SAMPLE_PERIOD);
|
||||
|
||||
ir->rc_dev = rc_dev;
|
||||
ir->dev = dev;
|
||||
|
||||
INIT_WORK(&ir->work, smi_ir_decode);
|
||||
smi_ir_disableInterrupt(ir);
|
||||
|
||||
ret = rc_register_device(rc_dev);
|
||||
|
@@ -241,7 +241,6 @@ struct smi_rc {
|
||||
struct rc_dev *rc_dev;
|
||||
char input_phys[64];
|
||||
char device_name[64];
|
||||
struct work_struct work;
|
||||
u8 irData[256];
|
||||
|
||||
int users;
|
||||
|
@@ -71,7 +71,7 @@ static void solo_vin_config(struct solo_dev *solo_dev)
|
||||
solo_reg_write(solo_dev, SOLO_VI_CH_FORMAT,
|
||||
SOLO_VI_FD_SEL_MASK(0) | SOLO_VI_PROG_MASK(0));
|
||||
|
||||
/* On 6110, initialize mozaic darkness stength */
|
||||
/* On 6110, initialize mozaic darkness strength */
|
||||
if (solo_dev->type == SOLO_DEV_6010)
|
||||
solo_reg_write(solo_dev, SOLO_VI_FMT_CFG, 0);
|
||||
else
|
||||
@@ -230,7 +230,7 @@ int solo_set_motion_block(struct solo_dev *solo_dev, u8 ch,
|
||||
}
|
||||
|
||||
/* First 8k is motion flag (512 bytes * 16). Following that is an 8k+8k
|
||||
* threshold and working table for each channel. Atleast that's what the
|
||||
* threshold and working table for each channel. At least that's what the
|
||||
* spec says. However, this code (taken from rdk) has some mystery 8k
|
||||
* block right after the flag area, before the first thresh table. */
|
||||
static void solo_motion_config(struct solo_dev *solo_dev)
|
||||
|
@@ -110,7 +110,7 @@ static inline struct vip_buffer *to_vip_buffer(struct vb2_v4l2_buffer *vb2)
|
||||
* @std: video standard (e.g. PAL/NTSC)
|
||||
* @input: input line for video signal ( 0 or 1 )
|
||||
* @disabled: Device is in power down state
|
||||
* @slock: for excluse acces of registers
|
||||
* @slock: for excluse access of registers
|
||||
* @vb_vidq: queue maintained by videobuf2 layer
|
||||
* @buffer_list: list of buffer in use
|
||||
* @sequence: sequence number of acquired buffer
|
||||
|
@@ -2313,7 +2313,7 @@ static int frontend_init(struct av7110 *av7110)
|
||||
* (n in defined in the RPS_THRESH1 counter threshold)
|
||||
* I think HS is raised high on the beginning of the n-th line
|
||||
* and remains high until this n-th line that triggered
|
||||
* it is completely received. When the receiption of n-th line
|
||||
* it is completely received. When the reception of n-th line
|
||||
* ends, HS is lowered.
|
||||
*
|
||||
* To transmit data over DMA, 7146 needs changing state at
|
||||
@@ -2347,7 +2347,7 @@ static int frontend_init(struct av7110 *av7110)
|
||||
* hardware debug note: a working budget card (including budget patch)
|
||||
* with vpeirq() interrupt setup in mode "0x90" (every 64K) will
|
||||
* generate 3 interrupts per 25-Hz DMA frame of 2*188*512 bytes
|
||||
* and that means 3*25=75 Hz of interrupt freqency, as seen by
|
||||
* and that means 3*25=75 Hz of interrupt frequency, as seen by
|
||||
* watch cat /proc/interrupts
|
||||
*
|
||||
* If this frequency is 3x lower (and data received in the DMA
|
||||
@@ -2356,7 +2356,7 @@ static int frontend_init(struct av7110 *av7110)
|
||||
* this means VSYNC line is not connected in the hardware.
|
||||
* (check soldering pcb and pins)
|
||||
* The same behaviour of missing VSYNC can be duplicated on budget
|
||||
* cards, by seting DD1_INIT trigger mode 7 in 3rd nibble.
|
||||
* cards, by setting DD1_INIT trigger mode 7 in 3rd nibble.
|
||||
*/
|
||||
static int av7110_attach(struct saa7146_dev* dev,
|
||||
struct saa7146_pci_extension_data *pci_ext)
|
||||
|
@@ -446,7 +446,7 @@ static void tw68_buf_queue(struct vb2_buffer *vb)
|
||||
/*
|
||||
* buffer_prepare
|
||||
*
|
||||
* Set the ancilliary information into the buffer structure. This
|
||||
* Set the ancillary information into the buffer structure. This
|
||||
* includes generating the necessary risc program if it hasn't already
|
||||
* been done for the current buffer format.
|
||||
* The structure fh contains the details of the format requested by the
|
||||
|
Ссылка в новой задаче
Block a user