mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 11:26:02 +09:00
UPSTREAM: [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>
(cherry picked from commit b145ef94f6)
Signed-off-by: Ziyuan Xu <xzy.xu@rock-chips.com>
This commit is contained in:
committed by
Tao Huang
parent
6f62f1f22f
commit
e883d1aca1
@@ -47,7 +47,6 @@ struct irctl {
|
||||
struct mutex irctl_lock;
|
||||
struct lirc_buffer *buf;
|
||||
bool buf_internal;
|
||||
unsigned int chunk_size;
|
||||
|
||||
struct device dev;
|
||||
struct cdev cdev;
|
||||
@@ -80,16 +79,8 @@ static void lirc_release(struct device *ld)
|
||||
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;
|
||||
@@ -100,7 +91,7 @@ static int lirc_allocate_buffer(struct irctl *ir)
|
||||
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;
|
||||
@@ -110,7 +101,6 @@ static int lirc_allocate_buffer(struct irctl *ir)
|
||||
ir->buf_internal = true;
|
||||
d->rbuf = ir->buf;
|
||||
}
|
||||
ir->chunk_size = ir->buf->chunk_size;
|
||||
|
||||
out:
|
||||
return err;
|
||||
@@ -137,6 +127,16 @@ int lirc_register_driver(struct lirc_driver *d)
|
||||
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);
|
||||
@@ -413,7 +413,7 @@ ssize_t lirc_dev_fop_read(struct file *file,
|
||||
|
||||
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;
|
||||
|
||||
@@ -426,7 +426,7 @@ ssize_t lirc_dev_fop_read(struct file *file,
|
||||
goto out_locked;
|
||||
}
|
||||
|
||||
if (length % ir->chunk_size) {
|
||||
if (length % ir->buf->chunk_size) {
|
||||
ret = -EINVAL;
|
||||
goto out_locked;
|
||||
}
|
||||
|
||||
@@ -128,13 +128,14 @@ static inline unsigned int lirc_buffer_write(struct lirc_buffer *buf,
|
||||
*
|
||||
* @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.
|
||||
@@ -169,9 +170,9 @@ struct lirc_driver {
|
||||
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;
|
||||
|
||||
Reference in New Issue
Block a user