Commit 95bc71e1 authored by Sean Young's avatar Sean Young Committed by Mauro Carvalho Chehab

media: lirc: merge lirc_dev_fop_ioctl and ir_lirc_ioctl

Calculate lirc features when necessary, and add LIRC_{S,G}ET_REC_MODE
cases to ir_lirc_ioctl.

This makes lirc_dev_fop_ioctl() unnecessary since all cases are
already handled by ir_lirc_ioctl().
Signed-off-by: default avatarSean Young <sean@mess.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent 6b514c4a
...@@ -231,8 +231,54 @@ static long ir_lirc_ioctl(struct file *filep, unsigned int cmd, ...@@ -231,8 +231,54 @@ static long ir_lirc_ioctl(struct file *filep, unsigned int cmd,
} }
switch (cmd) { switch (cmd) {
case LIRC_GET_FEATURES:
if (dev->driver_type == RC_DRIVER_IR_RAW) {
val |= LIRC_CAN_REC_MODE2;
if (dev->rx_resolution)
val |= LIRC_CAN_GET_REC_RESOLUTION;
}
if (dev->tx_ir) {
val |= LIRC_CAN_SEND_PULSE | LIRC_CAN_SEND_SCANCODE;
if (dev->s_tx_mask)
val |= LIRC_CAN_SET_TRANSMITTER_MASK;
if (dev->s_tx_carrier)
val |= LIRC_CAN_SET_SEND_CARRIER;
if (dev->s_tx_duty_cycle)
val |= LIRC_CAN_SET_SEND_DUTY_CYCLE;
}
if (dev->s_rx_carrier_range)
val |= LIRC_CAN_SET_REC_CARRIER |
LIRC_CAN_SET_REC_CARRIER_RANGE;
if (dev->s_learning_mode)
val |= LIRC_CAN_USE_WIDEBAND_RECEIVER;
if (dev->s_carrier_report)
val |= LIRC_CAN_MEASURE_CARRIER;
if (dev->max_timeout)
val |= LIRC_CAN_SET_REC_TIMEOUT;
break;
/* mode support */ /* mode support */
case LIRC_GET_REC_MODE:
if (dev->driver_type == RC_DRIVER_IR_RAW_TX)
return -ENOTTY;
val = LIRC_MODE_MODE2;
break;
case LIRC_SET_REC_MODE:
if (dev->driver_type == RC_DRIVER_IR_RAW_TX)
return -ENOTTY;
if (val != LIRC_MODE_MODE2)
return -EINVAL;
return 0;
case LIRC_GET_SEND_MODE: case LIRC_GET_SEND_MODE:
if (!dev->tx_ir) if (!dev->tx_ir)
return -ENOTTY; return -ENOTTY;
...@@ -353,7 +399,7 @@ static long ir_lirc_ioctl(struct file *filep, unsigned int cmd, ...@@ -353,7 +399,7 @@ static long ir_lirc_ioctl(struct file *filep, unsigned int cmd,
break; break;
default: default:
return lirc_dev_fop_ioctl(filep, cmd, arg); return -ENOTTY;
} }
if (_IOC_DIR(cmd) & _IOC_READ) if (_IOC_DIR(cmd) & _IOC_READ)
...@@ -380,44 +426,13 @@ int ir_lirc_register(struct rc_dev *dev) ...@@ -380,44 +426,13 @@ int ir_lirc_register(struct rc_dev *dev)
{ {
struct lirc_dev *ldev; struct lirc_dev *ldev;
int rc = -ENOMEM; int rc = -ENOMEM;
unsigned long features = 0;
ldev = lirc_allocate_device(); ldev = lirc_allocate_device();
if (!ldev) if (!ldev)
return rc; return rc;
if (dev->driver_type != RC_DRIVER_IR_RAW_TX) {
features |= LIRC_CAN_REC_MODE2;
if (dev->rx_resolution)
features |= LIRC_CAN_GET_REC_RESOLUTION;
}
if (dev->tx_ir) {
features |= LIRC_CAN_SEND_PULSE | LIRC_CAN_SEND_SCANCODE;
if (dev->s_tx_mask)
features |= LIRC_CAN_SET_TRANSMITTER_MASK;
if (dev->s_tx_carrier)
features |= LIRC_CAN_SET_SEND_CARRIER;
if (dev->s_tx_duty_cycle)
features |= LIRC_CAN_SET_SEND_DUTY_CYCLE;
}
if (dev->s_rx_carrier_range)
features |= LIRC_CAN_SET_REC_CARRIER |
LIRC_CAN_SET_REC_CARRIER_RANGE;
if (dev->s_learning_mode)
features |= LIRC_CAN_USE_WIDEBAND_RECEIVER;
if (dev->s_carrier_report)
features |= LIRC_CAN_MEASURE_CARRIER;
if (dev->max_timeout)
features |= LIRC_CAN_SET_REC_TIMEOUT;
snprintf(ldev->name, sizeof(ldev->name), "ir-lirc-codec (%s)", snprintf(ldev->name, sizeof(ldev->name), "ir-lirc-codec (%s)",
dev->driver_name); dev->driver_name);
ldev->features = features;
ldev->buf = NULL; ldev->buf = NULL;
ldev->chunk_size = sizeof(int); ldev->chunk_size = sizeof(int);
ldev->buffer_size = LIRCBUF_SIZE; ldev->buffer_size = LIRCBUF_SIZE;
......
...@@ -109,6 +109,7 @@ EXPORT_SYMBOL(lirc_free_device); ...@@ -109,6 +109,7 @@ EXPORT_SYMBOL(lirc_free_device);
int lirc_register_device(struct lirc_dev *d) int lirc_register_device(struct lirc_dev *d)
{ {
struct rc_dev *rcdev = d->rdev;
int minor; int minor;
int err; int err;
...@@ -146,7 +147,7 @@ int lirc_register_device(struct lirc_dev *d) ...@@ -146,7 +147,7 @@ int lirc_register_device(struct lirc_dev *d)
/* some safety check 8-) */ /* some safety check 8-) */
d->name[sizeof(d->name) - 1] = '\0'; d->name[sizeof(d->name) - 1] = '\0';
if (LIRC_CAN_REC(d->features)) { if (rcdev->driver_type == RC_DRIVER_IR_RAW) {
err = lirc_allocate_buffer(d); err = lirc_allocate_buffer(d);
if (err) if (err)
return err; return err;
...@@ -290,63 +291,6 @@ unsigned int lirc_dev_fop_poll(struct file *file, poll_table *wait) ...@@ -290,63 +291,6 @@ unsigned int lirc_dev_fop_poll(struct file *file, poll_table *wait)
} }
EXPORT_SYMBOL(lirc_dev_fop_poll); EXPORT_SYMBOL(lirc_dev_fop_poll);
long lirc_dev_fop_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
struct rc_dev *rcdev = file->private_data;
struct lirc_dev *d = rcdev->lirc_dev;
__u32 mode;
int result;
dev_dbg(&d->dev, LOGHEAD "ioctl called (0x%x)\n",
d->name, d->minor, cmd);
result = mutex_lock_interruptible(&d->mutex);
if (result)
return result;
if (!d->attached) {
result = -ENODEV;
goto out;
}
switch (cmd) {
case LIRC_GET_FEATURES:
result = put_user(d->features, (__u32 __user *)arg);
break;
case LIRC_GET_REC_MODE:
if (!LIRC_CAN_REC(d->features)) {
result = -ENOTTY;
break;
}
result = put_user(LIRC_REC2MODE
(d->features & LIRC_CAN_REC_MASK),
(__u32 __user *)arg);
break;
case LIRC_SET_REC_MODE:
if (!LIRC_CAN_REC(d->features)) {
result = -ENOTTY;
break;
}
result = get_user(mode, (__u32 __user *)arg);
if (!result && !(LIRC_MODE2REC(mode) & d->features))
result = -EINVAL;
/*
* FIXME: We should actually set the mode somehow but
* for now, lirc_serial doesn't support mode changing either
*/
break;
default:
result = -ENOTTY;
}
out:
mutex_unlock(&d->mutex);
return result;
}
EXPORT_SYMBOL(lirc_dev_fop_ioctl);
ssize_t lirc_dev_fop_read(struct file *file, ssize_t lirc_dev_fop_read(struct file *file,
char __user *buffer, char __user *buffer,
size_t length, size_t length,
...@@ -375,7 +319,7 @@ ssize_t lirc_dev_fop_read(struct file *file, ...@@ -375,7 +319,7 @@ ssize_t lirc_dev_fop_read(struct file *file,
goto out_locked; goto out_locked;
} }
if (!LIRC_CAN_REC(d->features)) { if (rcdev->driver_type != RC_DRIVER_IR_RAW) {
ret = -EINVAL; ret = -EINVAL;
goto out_locked; goto out_locked;
} }
......
...@@ -115,8 +115,6 @@ static inline unsigned int lirc_buffer_write(struct lirc_buffer *buf, ...@@ -115,8 +115,6 @@ static inline unsigned int lirc_buffer_write(struct lirc_buffer *buf,
* *
* @name: used for logging * @name: used for logging
* @minor: the minor device (/dev/lircX) number for the device * @minor: the minor device (/dev/lircX) number for the device
* @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. * @buffer_size: Number of FIFO buffers with @chunk_size size.
* Only used if @rbuf is NULL. * Only used if @rbuf is NULL.
* @chunk_size: Size of each FIFO buffer. * @chunk_size: Size of each FIFO buffer.
...@@ -138,7 +136,6 @@ static inline unsigned int lirc_buffer_write(struct lirc_buffer *buf, ...@@ -138,7 +136,6 @@ static inline unsigned int lirc_buffer_write(struct lirc_buffer *buf,
struct lirc_dev { struct lirc_dev {
char name[40]; char name[40];
unsigned int minor; unsigned int minor;
__u32 features;
unsigned int buffer_size; /* in chunks holding one code each */ unsigned int buffer_size; /* in chunks holding one code each */
unsigned int chunk_size; unsigned int chunk_size;
...@@ -172,7 +169,6 @@ void lirc_unregister_device(struct lirc_dev *d); ...@@ -172,7 +169,6 @@ void lirc_unregister_device(struct lirc_dev *d);
int lirc_dev_fop_open(struct inode *inode, struct file *file); int lirc_dev_fop_open(struct inode *inode, struct file *file);
int lirc_dev_fop_close(struct inode *inode, struct file *file); int lirc_dev_fop_close(struct inode *inode, struct file *file);
unsigned int lirc_dev_fop_poll(struct file *file, poll_table *wait); unsigned int lirc_dev_fop_poll(struct file *file, poll_table *wait);
long lirc_dev_fop_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
ssize_t lirc_dev_fop_read(struct file *file, char __user *buffer, size_t length, ssize_t lirc_dev_fop_read(struct file *file, char __user *buffer, size_t length,
loff_t *ppos); loff_t *ppos);
#endif #endif
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