Commit bd403b67 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] dvb: av7110 driver splitup

From: Michael Hunold <hunold@linuxtv.org>

- after the firmware removal, split av7110.c into separate modules:

  - av7110.c: initialization and demux stuff

  - av7110_hw.c: lowlevel hardware access and firmware interface

  - av7110_ca.c: CI and ECD

  - av7110_av.c: audio/video MPEG decoder and remuxing stuff

  - av7110_v4l.c: v4l interface

- av7110 fixes that were notcies during splitup

  - rename some non-static functions to enhance readability

  - lots of coding style & whitespace fixes

  - return -ERESTARTSYS from ci_ll_read/write() if interrupted

  - use time_after() for timeouts

  - added some comments about firmware interface

  - removed some unused fields from struct av7110, retabbing

- follow driver splitup in Makefile
parent 485237d6
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
# and the AV7110 DVB device driver # and the AV7110 DVB device driver
# #
dvb-ttpci-objs := av7110.o av7110_ipack.o av7110_ir.o dvb-ttpci-objs := av7110_hw.o av7110_v4l.o av7110_av.o av7110_ca.o av7110.o av7110_ipack.o av7110_ir.o
obj-$(CONFIG_DVB_BUDGET) += budget-core.o budget.o ttpci-eeprom.o obj-$(CONFIG_DVB_BUDGET) += budget-core.o budget.o ttpci-eeprom.o
obj-$(CONFIG_DVB_BUDGET_AV) += budget-core.o budget-av.o ttpci-eeprom.o obj-$(CONFIG_DVB_BUDGET_AV) += budget-core.o budget-av.o ttpci-eeprom.o
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
#ifndef _AV7110_AV_H_
#define _AV7110_AV_H_
struct av7110;
extern void av7110_set_vidmode(struct av7110 *av7110, int mode);
extern int av7110_record_cb(struct dvb_filter_pes2ts *p2t, u8 *buf, size_t len);
extern int av7110_pes_play(void *dest, struct dvb_ringbuffer *buf, int dlen);
extern int av7110_write_to_decoder(struct dvb_demux_feed *feed, const u8 *buf, size_t len);
extern int av7110_set_volume(struct av7110 *av7110, int volleft, int volright);
extern void av7110_av_stop(struct av7110 *av7110, int av);
extern int av7110_av_start_record(struct av7110 *av7110, int av,
struct dvb_demux_feed *dvbdmxfeed);
extern int av7110_av_start_play(struct av7110 *av7110, int av);
extern void dvb_video_add_event(struct av7110 *av7110, struct video_event *event);
extern void av7110_p2t_init(struct av7110_p2t *p, struct dvb_demux_feed *feed);
extern void av7110_p2t_write(u8 const *buf, long int length, u16 pid, struct av7110_p2t *p);
extern int av7110_av_register(struct av7110 *av7110);
extern void av7110_av_unregister(struct av7110 *av7110);
extern int av7110_av_init(struct av7110 *av7110);
extern int av7110_av_exit(struct av7110 *av7110);
#endif /* _AV7110_AV_H_ */
/*
* av7110_ca.c: CA and CI stuff
*
* Copyright (C) 1999-2002 Ralph Metzler
* & Marcus Metzler for convergence integrated media GmbH
*
* originally based on code by:
* Copyright (C) 1998,1999 Christian Theiss <mistert@rz.fh-augsburg.de>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* Or, point your browser to http://www.gnu.org/copyleft/gpl.html
*
*
* the project's page is at http://www.linuxtv.org/dvb/
*/
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/fs.h>
#include <linux/timer.h>
#include <linux/poll.h>
#include <linux/byteorder/swabb.h>
#include <linux/smp_lock.h>
#define DEBUG_VARIABLE av7110_debug
extern int av7110_debug;
#include "dvb_i2c.h"
#include "av7110.h"
#include "av7110_hw.h"
#include "dvb_functions.h"
void CI_handle(struct av7110 *av7110, u8 *data, u16 len)
{
DEB_EE(("av7110: %p\n", av7110));
if (len < 3)
return;
switch (data[0]) {
case CI_MSG_CI_INFO:
if (data[2] != 1 && data[2] != 2)
break;
switch (data[1]) {
case 0:
av7110->ci_slot[data[2] - 1].flags = 0;
break;
case 1:
av7110->ci_slot[data[2] - 1].flags |= CA_CI_MODULE_PRESENT;
break;
case 2:
av7110->ci_slot[data[2] - 1].flags |= CA_CI_MODULE_READY;
break;
}
break;
case CI_SWITCH_PRG_REPLY:
//av7110->ci_stat=data[1];
break;
default:
break;
}
}
void ci_get_data(struct dvb_ringbuffer *cibuf, u8 *data, int len)
{
if (dvb_ringbuffer_free(cibuf) < len + 2)
return;
DVB_RINGBUFFER_WRITE_BYTE(cibuf, len >> 8);
DVB_RINGBUFFER_WRITE_BYTE(cibuf, len & 0xff);
dvb_ringbuffer_write(cibuf, data, len, 0);
wake_up_interruptible(&cibuf->queue);
}
/******************************************************************************
* CI link layer file ops
******************************************************************************/
int ci_ll_init(struct dvb_ringbuffer *cirbuf, struct dvb_ringbuffer *ciwbuf, int size)
{
dvb_ringbuffer_init(cirbuf, vmalloc(size), size);
dvb_ringbuffer_init(ciwbuf, vmalloc(size), size);
return 0;
}
void ci_ll_flush(struct dvb_ringbuffer *cirbuf, struct dvb_ringbuffer *ciwbuf)
{
dvb_ringbuffer_flush_spinlock_wakeup(cirbuf);
dvb_ringbuffer_flush_spinlock_wakeup(ciwbuf);
}
void ci_ll_release(struct dvb_ringbuffer *cirbuf, struct dvb_ringbuffer *ciwbuf)
{
vfree(cirbuf->data);
cirbuf->data = 0;
vfree(ciwbuf->data);
ciwbuf->data = 0;
}
int ci_ll_reset(struct dvb_ringbuffer *cibuf, struct file *file,
int slots, ca_slot_info_t *slot)
{
int i;
int len = 0;
u8 msg[8] = { 0x00, 0x06, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00 };
for (i = 0; i < 2; i++) {
if (slots & (1 << i))
len += 8;
}
if (dvb_ringbuffer_free(cibuf) < len)
return -EBUSY;
for (i = 0; i < 2; i++) {
if (slots & (1 << i)) {
msg[2] = i;
dvb_ringbuffer_write(cibuf, msg, 8, 0);
slot[i].flags = 0;
}
}
return 0;
}
static ssize_t ci_ll_write(struct dvb_ringbuffer *cibuf, struct file *file,
const char *buf, size_t count, loff_t *ppos)
{
int free;
int non_blocking = file->f_flags & O_NONBLOCK;
if (count > 2048)
return -EINVAL;
free = dvb_ringbuffer_free(cibuf);
if (count + 2 > free) {
if (non_blocking)
return -EWOULDBLOCK;
if (wait_event_interruptible(cibuf->queue,
(dvb_ringbuffer_free(cibuf) >= count + 2)))
return -ERESTARTSYS;
}
DVB_RINGBUFFER_WRITE_BYTE(cibuf, count >> 8);
DVB_RINGBUFFER_WRITE_BYTE(cibuf, count & 0xff);
return dvb_ringbuffer_write(cibuf, buf, count, 1);
}
static ssize_t ci_ll_read(struct dvb_ringbuffer *cibuf, struct file *file,
char *buf, size_t count, loff_t *ppos)
{
int avail;
int non_blocking = file->f_flags & O_NONBLOCK;
ssize_t len;
if (!cibuf->data || !count)
return 0;
if (non_blocking && (dvb_ringbuffer_empty(cibuf)))
return -EWOULDBLOCK;
if (wait_event_interruptible(cibuf->queue,
!dvb_ringbuffer_empty(cibuf)))
return -ERESTARTSYS;
avail = dvb_ringbuffer_avail(cibuf);
if (avail < 4)
return 0;
len = DVB_RINGBUFFER_PEEK(cibuf, 0) << 8;
len |= DVB_RINGBUFFER_PEEK(cibuf, 1);
if (avail < len + 2 || count < len)
return -EINVAL;
DVB_RINGBUFFER_SKIP(cibuf, 2);
return dvb_ringbuffer_read(cibuf, buf, len, 1);
}
static int dvb_ca_open(struct inode *inode, struct file *file)
{
struct dvb_device *dvbdev = (struct dvb_device *) file->private_data;
struct av7110 *av7110 = (struct av7110 *) dvbdev->priv;
int err = dvb_generic_open(inode, file);
DEB_EE(("av7110: %p\n", av7110));
if (err < 0)
return err;
ci_ll_flush(&av7110->ci_rbuffer, &av7110->ci_wbuffer);
return 0;
}
static unsigned int dvb_ca_poll (struct file *file, poll_table *wait)
{
struct dvb_device *dvbdev = (struct dvb_device *) file->private_data;
struct av7110 *av7110 = (struct av7110 *) dvbdev->priv;
struct dvb_ringbuffer *rbuf = &av7110->ci_rbuffer;
struct dvb_ringbuffer *wbuf = &av7110->ci_wbuffer;
unsigned int mask = 0;
DEB_EE(("av7110: %p\n", av7110));
poll_wait(file, &rbuf->queue, wait);
if (!dvb_ringbuffer_empty(rbuf))
mask |= POLLIN;
if (dvb_ringbuffer_avail(wbuf) > 1024)
mask |= POLLOUT;
return mask;
}
static int dvb_ca_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, void *parg)
{
struct dvb_device *dvbdev = (struct dvb_device *) file->private_data;
struct av7110 *av7110 = (struct av7110 *) dvbdev->priv;
unsigned long arg = (unsigned long) parg;
DEB_EE(("av7110: %p\n", av7110));
switch (cmd) {
case CA_RESET:
return ci_ll_reset(&av7110->ci_wbuffer, file, arg, &av7110->ci_slot[0]);
break;
case CA_GET_CAP:
{
ca_caps_t cap;
cap.slot_num = 2;
cap.slot_type = (FW_CI_LL_SUPPORT(av7110->arm_app) ?
CA_CI_LINK : CA_CI) | CA_DESCR;
cap.descr_num = 16;
cap.descr_type = CA_ECD;
memcpy(parg, &cap, sizeof(cap));
break;
}
case CA_GET_SLOT_INFO:
{
ca_slot_info_t *info=(ca_slot_info_t *)parg;
if (info->num > 1)
return -EINVAL;
av7110->ci_slot[info->num].num = info->num;
av7110->ci_slot[info->num].type = FW_CI_LL_SUPPORT(av7110->arm_app) ?
CA_CI_LINK : CA_CI;
memcpy(info, &av7110->ci_slot[info->num], sizeof(ca_slot_info_t));
break;
}
case CA_GET_MSG:
break;
case CA_SEND_MSG:
break;
case CA_GET_DESCR_INFO:
{
ca_descr_info_t info;
info.num = 16;
info.type = CA_ECD;
memcpy(parg, &info, sizeof (info));
break;
}
case CA_SET_DESCR:
{
ca_descr_t *descr = (ca_descr_t*) parg;
if (descr->index >= 16)
return -EINVAL;
if (descr->parity > 1)
return -EINVAL;
av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, SetDescr, 5,
(descr->index<<8)|descr->parity,
(descr->cw[0]<<8)|descr->cw[1],
(descr->cw[2]<<8)|descr->cw[3],
(descr->cw[4]<<8)|descr->cw[5],
(descr->cw[6]<<8)|descr->cw[7]);
break;
}
default:
return -EINVAL;
}
return 0;
}
static ssize_t dvb_ca_write(struct file *file, const char *buf,
size_t count, loff_t *ppos)
{
struct dvb_device *dvbdev = (struct dvb_device *) file->private_data;
struct av7110 *av7110 = (struct av7110 *) dvbdev->priv;
DEB_EE(("av7110: %p\n", av7110));
return ci_ll_write(&av7110->ci_wbuffer, file, buf, count, ppos);
}
static ssize_t dvb_ca_read(struct file *file, char *buf,
size_t count, loff_t *ppos)
{
struct dvb_device *dvbdev = (struct dvb_device *) file->private_data;
struct av7110 *av7110 = (struct av7110 *) dvbdev->priv;
DEB_EE(("av7110: %p\n", av7110));
return ci_ll_read(&av7110->ci_rbuffer, file, buf, count, ppos);
}
static struct file_operations dvb_ca_fops = {
.owner = THIS_MODULE,
.read = dvb_ca_read,
.write = dvb_ca_write,
.ioctl = dvb_generic_ioctl,
.open = dvb_ca_open,
.release = dvb_generic_release,
.poll = dvb_ca_poll,
};
static struct dvb_device dvbdev_ca = {
.priv = 0,
.users = 1,
.writers = 1,
.fops = &dvb_ca_fops,
.kernel_ioctl = dvb_ca_ioctl,
};
int av7110_ca_register(struct av7110 *av7110)
{
return dvb_register_device(av7110->dvb_adapter, &av7110->ca_dev,
&dvbdev_ca, av7110, DVB_DEVICE_CA);
}
void av7110_ca_unregister(struct av7110 *av7110)
{
dvb_unregister_device(av7110->ca_dev);
}
void av7110_ca_init(struct av7110* av7110)
{
ci_ll_init(&av7110->ci_rbuffer, &av7110->ci_wbuffer, 8192);
}
void av7110_ca_exit(struct av7110* av7110)
{
ci_ll_release(&av7110->ci_rbuffer, &av7110->ci_wbuffer);
}
#ifndef _AV7110_CA_H_
#define _AV7110_CA_H_
struct av7110;
extern void CI_handle(struct av7110 *av7110, u8 *data, u16 len);
extern void ci_get_data(struct dvb_ringbuffer *cibuf, u8 *data, int len);
extern int av7110_ca_register(struct av7110 *av7110);
extern void av7110_ca_unregister(struct av7110 *av7110);
extern void av7110_ca_init(struct av7110* av7110);
extern void av7110_ca_exit(struct av7110* av7110);
#endif /* _AV7110_CA_H_ */
This diff is collapsed.
This diff is collapsed.
...@@ -20,16 +20,18 @@ void av7110_ipack_reset(struct ipack *p) ...@@ -20,16 +20,18 @@ void av7110_ipack_reset(struct ipack *p)
} }
void av7110_ipack_init(struct ipack *p, int size, int av7110_ipack_init(struct ipack *p, int size,
void (*func)(u8 *buf, int size, void *priv)) void (*func)(u8 *buf, int size, void *priv))
{ {
if ( !(p->buf = vmalloc(size*sizeof(u8))) ){ if ( !(p->buf = vmalloc(size*sizeof(u8))) ){
printk ("Couldn't allocate memory for ipack\n"); printk ("Couldn't allocate memory for ipack\n");
return -ENOMEM;
} }
p->size = size; p->size = size;
p->func = func; p->func = func;
p->repack_subids = 0; p->repack_subids = 0;
av7110_ipack_reset(p); av7110_ipack_reset(p);
return 0;
} }
...@@ -51,16 +53,15 @@ static void send_ipack(struct ipack *p) ...@@ -51,16 +53,15 @@ static void send_ipack(struct ipack *p)
switch ( p->mpeg ){ switch ( p->mpeg ){
case 2: case 2:
if (p->count < 10) return; if (p->count < 10)
return;
p->buf[3] = p->cid; p->buf[3] = p->cid;
p->buf[4] = (u8)(((p->count - 6) & 0xff00) >> 8);
p->buf[4] = (u8)(((p->count-6) & 0xFF00) >> 8); p->buf[5] = (u8)((p->count - 6) & 0x00ff);
p->buf[5] = (u8)((p->count-6) & 0x00FF);
if (p->repack_subids && p->cid == PRIVATE_STREAM1){ if (p->repack_subids && p->cid == PRIVATE_STREAM1){
off = 9+p->buf[8]; off = 9+p->buf[8];
streamid = p->buf[off]; streamid = p->buf[off];
if ((streamid & 0xF8) == 0x80){ if ((streamid & 0xf8) == 0x80) {
ai.off = 0; ai.off = 0;
ac3_off = ((p->buf[off+2] << 8)| ac3_off = ((p->buf[off+2] << 8)|
p->buf[off+3]); p->buf[off+3]);
...@@ -70,12 +71,10 @@ static void send_ipack(struct ipack *p) ...@@ -70,12 +71,10 @@ static void send_ipack(struct ipack *p)
if ( !f ){ if ( !f ){
nframes = (p->count-off-3-ac3_off)/ nframes = (p->count-off-3-ac3_off)/
ai.framesize + 1; ai.framesize + 1;
p->buf[off+2] = (ac3_off >> 8)& 0xFF; p->buf[off + 2] = (ac3_off >> 8) & 0xff;
p->buf[off+3] = (ac3_off)& 0xFF; p->buf[off + 3] = (ac3_off) & 0xff;
p->buf[off+1] = nframes; p->buf[off+1] = nframes;
ac3_off += nframes * ai.framesize - p->count;
ac3_off += nframes * ai.framesize -
p->count;
} }
} }
} }
...@@ -86,24 +85,24 @@ static void send_ipack(struct ipack *p) ...@@ -86,24 +85,24 @@ static void send_ipack(struct ipack *p)
p->buf[8] = 0x00; p->buf[8] = 0x00;
p->count = 9; p->count = 9;
if (p->repack_subids && p->cid == PRIVATE_STREAM1 if (p->repack_subids && p->cid == PRIVATE_STREAM1
&& (streamid & 0xF8)==0x80 ){ && (streamid & 0xf8) == 0x80) {
p->count += 4; p->count += 4;
p->buf[9] = streamid; p->buf[9] = streamid;
p->buf[10] = (ac3_off >> 8)& 0xFF; p->buf[10] = (ac3_off >> 8) & 0xff;
p->buf[11] = (ac3_off)& 0xFF; p->buf[11] = (ac3_off) & 0xff;
p->buf[12] = 0; p->buf[12] = 0;
} }
break; break;
case 1: case 1:
if (p->count < 8) return; if (p->count < 8)
return;
p->buf[3] = p->cid; p->buf[3] = p->cid;
p->buf[4] = (u8)(((p->count - 6) & 0xff00) >> 8);
p->buf[4] = (u8)(((p->count-6) & 0xFF00) >> 8); p->buf[5] = (u8)((p->count - 6) & 0x00ff);
p->buf[5] = (u8)((p->count-6) & 0x00FF);
p->func(p->buf, p->count, p->data); p->func(p->buf, p->count, p->data);
p->buf[6] = 0x0F; p->buf[6] = 0x0f;
p->count = 7; p->count = 7;
break; break;
} }
...@@ -156,15 +155,19 @@ int av7110_ipack_instant_repack (const u8 *buf, int count, struct ipack *p) ...@@ -156,15 +155,19 @@ int av7110_ipack_instant_repack (const u8 *buf, int count, struct ipack *p)
switch ( p->found ){ switch ( p->found ){
case 0: case 0:
case 1: case 1:
if (buf[c] == 0x00) p->found++; if (buf[c] == 0x00)
else p->found = 0; p->found++;
else
p->found = 0;
c++; c++;
break; break;
case 2: case 2:
if (buf[c] == 0x01) p->found++; if (buf[c] == 0x01)
else if (buf[c] == 0) { p->found++;
else if (buf[c] == 0)
p->found = 2; p->found = 2;
} else p->found = 0; else
p->found = 0;
c++; c++;
break; break;
case 3: case 3:
...@@ -179,6 +182,7 @@ int av7110_ipack_instant_repack (const u8 *buf, int count, struct ipack *p) ...@@ -179,6 +182,7 @@ int av7110_ipack_instant_repack (const u8 *buf, int count, struct ipack *p)
case DSM_CC_STREAM : case DSM_CC_STREAM :
case ISO13522_STREAM: case ISO13522_STREAM:
p->done = 1; p->done = 1;
/* fall through */
case PRIVATE_STREAM1: case PRIVATE_STREAM1:
case VIDEO_STREAM_S ... VIDEO_STREAM_E: case VIDEO_STREAM_S ... VIDEO_STREAM_E:
case AUDIO_STREAM_S ... AUDIO_STREAM_E: case AUDIO_STREAM_S ... AUDIO_STREAM_E:
...@@ -217,7 +221,8 @@ int av7110_ipack_instant_repack (const u8 *buf, int count, struct ipack *p) ...@@ -217,7 +221,8 @@ int av7110_ipack_instant_repack (const u8 *buf, int count, struct ipack *p)
p->flag1 = buf[c]; p->flag1 = buf[c];
c++; c++;
p->found++; p->found++;
if ( (p->flag1 & 0xC0) == 0x80 ) p->mpeg = 2; if ((p->flag1 & 0xc0) == 0x80)
p->mpeg = 2;
else { else {
p->hlength = 0; p->hlength = 0;
p->which = 0; p->which = 0;
...@@ -242,16 +247,14 @@ int av7110_ipack_instant_repack (const u8 *buf, int count, struct ipack *p) ...@@ -242,16 +247,14 @@ int av7110_ipack_instant_repack (const u8 *buf, int count, struct ipack *p)
p->found++; p->found++;
} }
break; break;
default:
break;
} }
} }
if (c == count) return count; if (c == count)
return count;
if (!p->plength) p->plength = MMAX_PLENGTH-6; if (!p->plength)
p->plength = MMAX_PLENGTH - 6;
if ( p->done || ((p->mpeg == 2 && p->found >= 9) || if ( p->done || ((p->mpeg == 2 && p->found >= 9) ||
(p->mpeg == 1 && p->found >= 7)) ){ (p->mpeg == 1 && p->found >= 7)) ){
...@@ -278,7 +281,8 @@ int av7110_ipack_instant_repack (const u8 *buf, int count, struct ipack *p) ...@@ -278,7 +281,8 @@ int av7110_ipack_instant_repack (const u8 *buf, int count, struct ipack *p)
c++; c++;
p->found++; p->found++;
} }
if (c == count) return count; if (c == count)
return count;
} }
if (p->mpeg == 1 && p->which < 2000) { if (p->mpeg == 1 && p->which < 2000) {
...@@ -289,7 +293,7 @@ int av7110_ipack_instant_repack (const u8 *buf, int count, struct ipack *p) ...@@ -289,7 +293,7 @@ int av7110_ipack_instant_repack (const u8 *buf, int count, struct ipack *p)
} }
while (!p->which && c < count && while (!p->which && c < count &&
p->check == 0xFF){ p->check == 0xff){
p->check = buf[c]; p->check = buf[c];
write_ipack(p, buf+c, 1); write_ipack(p, buf+c, 1);
c++; c++;
...@@ -297,9 +301,10 @@ int av7110_ipack_instant_repack (const u8 *buf, int count, struct ipack *p) ...@@ -297,9 +301,10 @@ int av7110_ipack_instant_repack (const u8 *buf, int count, struct ipack *p)
p->hlength++; p->hlength++;
} }
if ( c == count) return count; if (c == count)
return count;
if ( (p->check & 0xC0) == 0x40 && !p->which){ if ((p->check & 0xc0) == 0x40 && !p->which) {
p->check = buf[c]; p->check = buf[c];
write_ipack(p, buf+c, 1); write_ipack(p, buf+c, 1);
c++; c++;
...@@ -307,14 +312,16 @@ int av7110_ipack_instant_repack (const u8 *buf, int count, struct ipack *p) ...@@ -307,14 +312,16 @@ int av7110_ipack_instant_repack (const u8 *buf, int count, struct ipack *p)
p->hlength++; p->hlength++;
p->which = 1; p->which = 1;
if ( c == count) return count; if (c == count)
return count;
p->check = buf[c]; p->check = buf[c];
write_ipack(p, buf+c, 1); write_ipack(p, buf+c, 1);
c++; c++;
p->found++; p->found++;
p->hlength++; p->hlength++;
p->which = 2; p->which = 2;
if ( c == count) return count; if (c == count)
return count;
} }
if (p->which == 1){ if (p->which == 1){
...@@ -324,45 +331,42 @@ int av7110_ipack_instant_repack (const u8 *buf, int count, struct ipack *p) ...@@ -324,45 +331,42 @@ int av7110_ipack_instant_repack (const u8 *buf, int count, struct ipack *p)
p->found++; p->found++;
p->hlength++; p->hlength++;
p->which = 2; p->which = 2;
if ( c == count) return count; if (c == count)
return count;
} }
if ( (p->check & 0x30) && p->check != 0xFF){ if ((p->check & 0x30) && p->check != 0xff) {
p->flag2 = (p->check & 0xF0) << 2; p->flag2 = (p->check & 0xf0) << 2;
p->pts[0] = p->check; p->pts[0] = p->check;
p->which = 3; p->which = 3;
} }
if ( c == count) return count; if (c == count)
return count;
if (p->which > 2){ if (p->which > 2){
if ((p->flag2 & PTS_DTS_FLAGS) if ((p->flag2 & PTS_DTS_FLAGS) == PTS_ONLY) {
== PTS_ONLY){ while (c < count && p->which < 7) {
while (c < count && p->pts[p->which - 2] = buf[c];
p->which < 7){
p->pts[p->which-2] =
buf[c];
write_ipack(p,buf+c,1); write_ipack(p,buf+c,1);
c++; c++;
p->found++; p->found++;
p->which++; p->which++;
p->hlength++; p->hlength++;
} }
if ( c == count) return count; if (c == count)
} else if ((p->flag2 & PTS_DTS_FLAGS) return count;
== PTS_DTS){ } else if ((p->flag2 & PTS_DTS_FLAGS) == PTS_DTS) {
while (c < count && while (c < count && p->which < 12) {
p->which< 12){
if (p->which< 7) if (p->which< 7)
p->pts[p->which p->pts[p->which - 2] = buf[c];
-2] =
buf[c];
write_ipack(p,buf+c,1); write_ipack(p,buf+c,1);
c++; c++;
p->found++; p->found++;
p->which++; p->which++;
p->hlength++; p->hlength++;
} }
if ( c == count) return count; if (c == count)
return count;
} }
p->which = 2000; p->which = 2000;
} }
......
#ifndef _AV7110_IPACK_H_ #ifndef _AV7110_IPACK_H_
#define _AV7110_IPACK_H_ #define _AV7110_IPACK_H_
extern void av7110_ipack_init(struct ipack *p, int size, extern int av7110_ipack_init(struct ipack *p, int size,
void (*func)(u8 *buf, int size, void *priv)); void (*func)(u8 *buf, int size, void *priv));
extern void av7110_ipack_reset(struct ipack *p); extern void av7110_ipack_reset(struct ipack *p);
......
...@@ -7,6 +7,11 @@ ...@@ -7,6 +7,11 @@
#include "av7110.h" #include "av7110.h"
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
#include "input_fake.h"
#endif
#define UP_TIMEOUT (HZ/4) #define UP_TIMEOUT (HZ/4)
static int av7110_ir_debug = 0; static int av7110_ir_debug = 0;
...@@ -51,7 +56,7 @@ static void av7110_emit_keyup (unsigned long data) ...@@ -51,7 +56,7 @@ static void av7110_emit_keyup (unsigned long data)
} }
static struct timer_list keyup_timer = { function: av7110_emit_keyup }; static struct timer_list keyup_timer = { .function = av7110_emit_keyup };
static void av7110_emit_key (u32 ircom) static void av7110_emit_key (u32 ircom)
...@@ -84,8 +89,7 @@ static void av7110_emit_key (u32 ircom) ...@@ -84,8 +89,7 @@ static void av7110_emit_key (u32 ircom)
return; return;
if (!keycode) { if (!keycode) {
printk ("%s: unknown key 0x%02x!!\n", printk ("%s: unknown key 0x%02x!!\n", __FUNCTION__, data);
__FUNCTION__, data);
return; return;
} }
...@@ -144,9 +148,8 @@ static int av7110_ir_write_proc (struct file *file, const char *buffer, ...@@ -144,9 +148,8 @@ static int av7110_ir_write_proc (struct file *file, const char *buffer,
return -EINVAL; return -EINVAL;
page = (char *)vmalloc(size); page = (char *)vmalloc(size);
if( NULL == page ) { if (!page)
return -ENOMEM; return -ENOMEM;
}
if (copy_from_user(page, buffer, size)) { if (copy_from_user(page, buffer, size)) {
vfree(page); vfree(page);
......
This diff is collapsed.
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "budget.h" #include "budget.h"
#include "av7110.h" #include "av7110.h"
#include "av7110_hw.h"
#define budget_patch budget #define budget_patch budget
...@@ -46,7 +47,7 @@ static struct pci_device_id pci_tbl[] = { ...@@ -46,7 +47,7 @@ static struct pci_device_id pci_tbl[] = {
} }
}; };
static int wdebi(struct budget_patch *budget, u32 config, int addr, u32 val, int count) static int budget_wdebi(struct budget_patch *budget, u32 config, int addr, u32 val, int count)
{ {
struct saa7146_dev *dev=budget->dev; struct saa7146_dev *dev=budget->dev;
...@@ -66,21 +67,21 @@ static int wdebi(struct budget_patch *budget, u32 config, int addr, u32 val, int ...@@ -66,21 +67,21 @@ static int wdebi(struct budget_patch *budget, u32 config, int addr, u32 val, int
} }
static int SOutCommand(struct budget_patch *budget, u16* buf, int length) static int budget_av7110_send_fw_cmd(struct budget_patch *budget, u16* buf, int length)
{ {
int i; int i;
DEB_EE(("budget: %p\n", budget)); DEB_EE(("budget: %p\n", budget));
for (i = 2; i < length; i++) for (i = 2; i < length; i++)
wdebi(budget, DEBINOSWAP, COMMAND + 2*i, (u32) buf[i], 2); budget_wdebi(budget, DEBINOSWAP, COMMAND + 2*i, (u32) buf[i], 2);
if (length) if (length)
wdebi(budget, DEBINOSWAP, COMMAND + 2, (u32) buf[1], 2); budget_wdebi(budget, DEBINOSWAP, COMMAND + 2, (u32) buf[1], 2);
else else
wdebi(budget, DEBINOSWAP, COMMAND + 2, 0, 2); budget_wdebi(budget, DEBINOSWAP, COMMAND + 2, 0, 2);
wdebi(budget, DEBINOSWAP, COMMAND, (u32) buf[0], 2); budget_wdebi(budget, DEBINOSWAP, COMMAND, (u32) buf[0], 2);
return 0; return 0;
} }
...@@ -90,7 +91,7 @@ static void av7110_set22k(struct budget_patch *budget, int state) ...@@ -90,7 +91,7 @@ static void av7110_set22k(struct budget_patch *budget, int state)
u16 buf[2] = {( COMTYPE_AUDIODAC << 8) | (state ? ON22K : OFF22K), 0}; u16 buf[2] = {( COMTYPE_AUDIODAC << 8) | (state ? ON22K : OFF22K), 0};
DEB_EE(("budget: %p\n", budget)); DEB_EE(("budget: %p\n", budget));
SOutCommand(budget, buf, 2); budget_av7110_send_fw_cmd(budget, buf, 2);
} }
...@@ -116,7 +117,7 @@ static int av7110_send_diseqc_msg(struct budget_patch *budget, int len, u8 *msg, ...@@ -116,7 +117,7 @@ static int av7110_send_diseqc_msg(struct budget_patch *budget, int len, u8 *msg,
for (i=0; i<len; i++) for (i=0; i<len; i++)
buf[i+4]=msg[i]; buf[i+4]=msg[i];
SOutCommand(budget, buf, 18); budget_av7110_send_fw_cmd(budget, buf, 18);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment