[media] media: lirc_dev: make chunk_size and buffer_size mandatory
Make setting chunk_size and buffer_size mandatory for drivers which
expect lirc_dev to allocate the lirc_buffer (i.e. ir-lirc-codec) and
don't set them in lirc-zilog (which creates its own buffer).
Also remove an unnecessary copy of chunk_size in struct irctl (the
same information is already available from struct lirc_buffer).
Signed-off-by: David Härdeman <david@hardeman.nu>
Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
diff --git a/drivers/media/rc/lirc_dev.c b/drivers/media/rc/lirc_dev.c
index ffa203e..1915ffc 100644
--- a/drivers/media/rc/lirc_dev.c
+++ b/drivers/media/rc/lirc_dev.c
@@ -41,7 +41,6 @@
struct mutex irctl_lock;
struct lirc_buffer *buf;
bool buf_internal;
- unsigned int chunk_size;
struct device dev;
struct cdev cdev;
@@ -74,16 +73,8 @@
static int lirc_allocate_buffer(struct irctl *ir)
{
int err = 0;
- int bytes_in_key;
- unsigned int chunk_size;
- unsigned int buffer_size;
struct lirc_driver *d = &ir->d;
- bytes_in_key = BITS_TO_LONGS(d->code_length) +
- (d->code_length % 8 ? 1 : 0);
- buffer_size = d->buffer_size ? d->buffer_size : BUFLEN / bytes_in_key;
- chunk_size = d->chunk_size ? d->chunk_size : bytes_in_key;
-
if (d->rbuf) {
ir->buf = d->rbuf;
ir->buf_internal = false;
@@ -94,7 +85,7 @@
goto out;
}
- err = lirc_buffer_init(ir->buf, chunk_size, buffer_size);
+ err = lirc_buffer_init(ir->buf, d->chunk_size, d->buffer_size);
if (err) {
kfree(ir->buf);
ir->buf = NULL;
@@ -104,7 +95,6 @@
ir->buf_internal = true;
d->rbuf = ir->buf;
}
- ir->chunk_size = ir->buf->chunk_size;
out:
return err;
@@ -131,6 +121,16 @@
return -EINVAL;
}
+ if (!d->rbuf && d->chunk_size < 1) {
+ pr_err("chunk_size must be set!\n");
+ return -EINVAL;
+ }
+
+ if (!d->rbuf && d->buffer_size < 1) {
+ pr_err("buffer_size must be set!\n");
+ return -EINVAL;
+ }
+
if (d->code_length < 1 || d->code_length > (BUFLEN * 8)) {
dev_err(d->dev, "code length must be less than %d bits\n",
BUFLEN * 8);
@@ -407,7 +407,7 @@
dev_dbg(ir->d.dev, LOGHEAD "read called\n", ir->d.name, ir->d.minor);
- buf = kzalloc(ir->chunk_size, GFP_KERNEL);
+ buf = kzalloc(ir->buf->chunk_size, GFP_KERNEL);
if (!buf)
return -ENOMEM;
@@ -420,7 +420,7 @@
goto out_locked;
}
- if (length % ir->chunk_size) {
+ if (length % ir->buf->chunk_size) {
ret = -EINVAL;
goto out_locked;
}
diff --git a/drivers/staging/media/lirc/lirc_zilog.c b/drivers/staging/media/lirc/lirc_zilog.c
index c4a4c2f..780b2d9 100644
--- a/drivers/staging/media/lirc/lirc_zilog.c
+++ b/drivers/staging/media/lirc/lirc_zilog.c
@@ -1348,8 +1348,6 @@
static struct lirc_driver lirc_template = {
.name = "lirc_zilog",
.code_length = 13,
- .buffer_size = BUFLEN / 2,
- .chunk_size = 2,
.fops = &lirc_fops,
.owner = THIS_MODULE,
};
@@ -1456,8 +1454,7 @@
ir->l.dev = &adap->dev;
/* This will be returned by lirc_get_pdata() */
ir->l.data = ir;
- ret = lirc_buffer_init(ir->l.rbuf,
- ir->l.chunk_size, ir->l.buffer_size);
+ ret = lirc_buffer_init(ir->l.rbuf, 2, BUFLEN / 2);
if (ret)
goto out_put_ir;
}
diff --git a/include/media/lirc_dev.h b/include/media/lirc_dev.h
index d07a532..8e3894e 100644
--- a/include/media/lirc_dev.h
+++ b/include/media/lirc_dev.h
@@ -121,13 +121,14 @@
*
* @code_length: length of the remote control key code expressed in bits.
*
- * @buffer_size: Number of FIFO buffers with @chunk_size size. If zero,
- * creates a buffer with BUFLEN size (16 bytes).
- *
* @features: lirc compatible hardware features, like LIRC_MODE_RAW,
* LIRC_CAN\_\*, as defined at include/media/lirc.h.
*
+ * @buffer_size: Number of FIFO buffers with @chunk_size size.
+ * Only used if @rbuf is NULL.
+ *
* @chunk_size: Size of each FIFO buffer.
+ * Only used if @rbuf is NULL.
*
* @data: it may point to any driver data and this pointer will
* be passed to all callback functions.
@@ -162,9 +163,9 @@
char name[40];
unsigned int minor;
__u32 code_length;
- unsigned int buffer_size; /* in chunks holding one code each */
__u32 features;
+ unsigned int buffer_size; /* in chunks holding one code each */
unsigned int chunk_size;
void *data;