Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
Pull media updates from Mauro Carvalho Chehab: - Missing MAINTAINERS entries were added for several drivers - Adds V4L2 support for DMABUF handling, allowing zero-copy buffer sharing between V4L2 devices and GPU - Got rid of all warnings when compiling with W=1 on x86 - Add a new driver for Exynos hardware (s3c-camif) - Several bug fixes, cleanups and driver improvements * 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (243 commits) [media] omap3isp: Replace cpu_is_omap3630() with ISP revision check [media] omap3isp: Prepare/unprepare clocks before/after enable/disable [media] omap3isp: preview: Add support for 8-bit formats at the sink pad [media] omap3isp: Replace printk with dev_* [media] omap3isp: Find source pad from external entity [media] omap3isp: Configure CSI-2 phy based on platform data [media] omap3isp: Add PHY routing configuration [media] omap3isp: Add CSI configuration registers from control block to ISP resources [media] omap3isp: Remove unneeded module memory address definitions [media] omap3isp: Use monotonic timestamps for statistics buffers [media] uvcvideo: Fix control value clamping for unsigned integer controls [media] uvcvideo: Mark first output terminal as default video node [media] uvcvideo: Add VIDIOC_[GS]_PRIORITY support [media] uvcvideo: Return -ENOTTY for unsupported ioctls [media] uvcvideo: Set device_caps in VIDIOC_QUERYCAP [media] uvcvideo: Don't fail when an unsupported format is requested [media] uvcvideo: Return -EACCES when trying to access a read/write-only control [media] uvcvideo: Set error_idx properly for extended controls API failures [media] rtl28xxu: add NOXON DAB/DAB+ USB dongle rev 2 [media] fc2580: write some registers conditionally ...
This commit is contained in:
@@ -784,7 +784,7 @@ static void ati_remote_rc_init(struct ati_remote *ati_remote)
|
||||
|
||||
rdev->priv = ati_remote;
|
||||
rdev->driver_type = RC_DRIVER_SCANCODE;
|
||||
rdev->allowed_protos = RC_TYPE_OTHER;
|
||||
rdev->allowed_protos = RC_BIT_OTHER;
|
||||
rdev->driver_name = "ati_remote";
|
||||
|
||||
rdev->open = ati_remote_rc_open;
|
||||
|
@@ -329,7 +329,7 @@ static int ene_rx_get_sample_reg(struct ene_device *dev)
|
||||
}
|
||||
|
||||
/* Sense current received carrier */
|
||||
void ene_rx_sense_carrier(struct ene_device *dev)
|
||||
static void ene_rx_sense_carrier(struct ene_device *dev)
|
||||
{
|
||||
DEFINE_IR_RAW_EVENT(ev);
|
||||
|
||||
@@ -1003,7 +1003,7 @@ static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id)
|
||||
dev = kzalloc(sizeof(struct ene_device), GFP_KERNEL);
|
||||
rdev = rc_allocate_device();
|
||||
if (!dev || !rdev)
|
||||
goto error1;
|
||||
goto failure;
|
||||
|
||||
/* validate resources */
|
||||
error = -ENODEV;
|
||||
@@ -1014,10 +1014,10 @@ static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id)
|
||||
|
||||
if (!pnp_port_valid(pnp_dev, 0) ||
|
||||
pnp_port_len(pnp_dev, 0) < ENE_IO_SIZE)
|
||||
goto error;
|
||||
goto failure;
|
||||
|
||||
if (!pnp_irq_valid(pnp_dev, 0))
|
||||
goto error;
|
||||
goto failure;
|
||||
|
||||
spin_lock_init(&dev->hw_lock);
|
||||
|
||||
@@ -1033,7 +1033,7 @@ static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id)
|
||||
/* detect hardware version and features */
|
||||
error = ene_hw_detect(dev);
|
||||
if (error)
|
||||
goto error;
|
||||
goto failure;
|
||||
|
||||
if (!dev->hw_learning_and_tx_capable && txsim) {
|
||||
dev->hw_learning_and_tx_capable = true;
|
||||
@@ -1046,7 +1046,7 @@ static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id)
|
||||
learning_mode_force = false;
|
||||
|
||||
rdev->driver_type = RC_DRIVER_IR_RAW;
|
||||
rdev->allowed_protos = RC_TYPE_ALL;
|
||||
rdev->allowed_protos = RC_BIT_ALL;
|
||||
rdev->priv = dev;
|
||||
rdev->open = ene_open;
|
||||
rdev->close = ene_close;
|
||||
@@ -1078,30 +1078,27 @@ static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id)
|
||||
/* claim the resources */
|
||||
error = -EBUSY;
|
||||
if (!request_region(dev->hw_io, ENE_IO_SIZE, ENE_DRIVER_NAME)) {
|
||||
dev->hw_io = -1;
|
||||
dev->irq = -1;
|
||||
goto error;
|
||||
goto failure;
|
||||
}
|
||||
|
||||
dev->irq = pnp_irq(pnp_dev, 0);
|
||||
if (request_irq(dev->irq, ene_isr,
|
||||
IRQF_SHARED, ENE_DRIVER_NAME, (void *)dev)) {
|
||||
dev->irq = -1;
|
||||
goto error;
|
||||
goto failure2;
|
||||
}
|
||||
|
||||
error = rc_register_device(rdev);
|
||||
if (error < 0)
|
||||
goto error;
|
||||
goto failure3;
|
||||
|
||||
pr_notice("driver has been successfully loaded\n");
|
||||
return 0;
|
||||
error:
|
||||
if (dev && dev->irq >= 0)
|
||||
free_irq(dev->irq, dev);
|
||||
if (dev && dev->hw_io >= 0)
|
||||
release_region(dev->hw_io, ENE_IO_SIZE);
|
||||
error1:
|
||||
|
||||
failure3:
|
||||
free_irq(dev->irq, dev);
|
||||
failure2:
|
||||
release_region(dev->hw_io, ENE_IO_SIZE);
|
||||
failure:
|
||||
rc_free_device(rdev);
|
||||
kfree(dev);
|
||||
return error;
|
||||
|
@@ -541,7 +541,7 @@ static int fintek_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id
|
||||
/* Set up the rc device */
|
||||
rdev->priv = fintek;
|
||||
rdev->driver_type = RC_DRIVER_IR_RAW;
|
||||
rdev->allowed_protos = RC_TYPE_ALL;
|
||||
rdev->allowed_protos = RC_BIT_ALL;
|
||||
rdev->open = fintek_open;
|
||||
rdev->close = fintek_close;
|
||||
rdev->input_name = FINTEK_DESCRIPTION;
|
||||
@@ -684,12 +684,12 @@ static struct pnp_driver fintek_driver = {
|
||||
.shutdown = fintek_shutdown,
|
||||
};
|
||||
|
||||
int fintek_init(void)
|
||||
static int fintek_init(void)
|
||||
{
|
||||
return pnp_register_driver(&fintek_driver);
|
||||
}
|
||||
|
||||
void fintek_exit(void)
|
||||
static void fintek_exit(void)
|
||||
{
|
||||
pnp_unregister_driver(&fintek_driver);
|
||||
}
|
||||
|
@@ -95,7 +95,7 @@ static int __devinit gpio_ir_recv_probe(struct platform_device *pdev)
|
||||
if (pdata->allowed_protos)
|
||||
rcdev->allowed_protos = pdata->allowed_protos;
|
||||
else
|
||||
rcdev->allowed_protos = RC_TYPE_ALL;
|
||||
rcdev->allowed_protos = RC_BIT_ALL;
|
||||
rcdev->map_name = pdata->map_name ?: RC_MAP_EMPTY;
|
||||
|
||||
gpio_dev->rcdev = rcdev;
|
||||
|
@@ -499,7 +499,7 @@ static int __devinit iguanair_probe(struct usb_interface *intf,
|
||||
usb_to_input_id(ir->udev, &rc->input_id);
|
||||
rc->dev.parent = &intf->dev;
|
||||
rc->driver_type = RC_DRIVER_IR_RAW;
|
||||
rc->allowed_protos = RC_TYPE_ALL;
|
||||
rc->allowed_protos = RC_BIT_ALL;
|
||||
rc->priv = ir;
|
||||
rc->open = iguanair_open;
|
||||
rc->close = iguanair_close;
|
||||
|
@@ -1001,7 +1001,7 @@ static void imon_touch_display_timeout(unsigned long data)
|
||||
* it is not, so we must acquire it prior to calling send_packet, which
|
||||
* requires that the lock is held.
|
||||
*/
|
||||
static int imon_ir_change_protocol(struct rc_dev *rc, u64 rc_type)
|
||||
static int imon_ir_change_protocol(struct rc_dev *rc, u64 *rc_type)
|
||||
{
|
||||
int retval;
|
||||
struct imon_context *ictx = rc->priv;
|
||||
@@ -1010,31 +1010,27 @@ static int imon_ir_change_protocol(struct rc_dev *rc, u64 rc_type)
|
||||
unsigned char ir_proto_packet[] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86 };
|
||||
|
||||
if (rc_type && !(rc_type & rc->allowed_protos))
|
||||
if (*rc_type && !(*rc_type & rc->allowed_protos))
|
||||
dev_warn(dev, "Looks like you're trying to use an IR protocol "
|
||||
"this device does not support\n");
|
||||
|
||||
switch (rc_type) {
|
||||
case RC_TYPE_RC6:
|
||||
if (*rc_type & RC_BIT_RC6_MCE) {
|
||||
dev_dbg(dev, "Configuring IR receiver for MCE protocol\n");
|
||||
ir_proto_packet[0] = 0x01;
|
||||
break;
|
||||
case RC_TYPE_UNKNOWN:
|
||||
case RC_TYPE_OTHER:
|
||||
*rc_type = RC_BIT_RC6_MCE;
|
||||
} else if (*rc_type & RC_BIT_OTHER) {
|
||||
dev_dbg(dev, "Configuring IR receiver for iMON protocol\n");
|
||||
if (!pad_stabilize)
|
||||
dev_dbg(dev, "PAD stabilize functionality disabled\n");
|
||||
/* ir_proto_packet[0] = 0x00; // already the default */
|
||||
rc_type = RC_TYPE_OTHER;
|
||||
break;
|
||||
default:
|
||||
*rc_type = RC_BIT_OTHER;
|
||||
} else {
|
||||
dev_warn(dev, "Unsupported IR protocol specified, overriding "
|
||||
"to iMON IR protocol\n");
|
||||
if (!pad_stabilize)
|
||||
dev_dbg(dev, "PAD stabilize functionality disabled\n");
|
||||
/* ir_proto_packet[0] = 0x00; // already the default */
|
||||
rc_type = RC_TYPE_OTHER;
|
||||
break;
|
||||
*rc_type = RC_BIT_OTHER;
|
||||
}
|
||||
|
||||
memcpy(ictx->usb_tx_buf, &ir_proto_packet, sizeof(ir_proto_packet));
|
||||
@@ -1048,7 +1044,7 @@ static int imon_ir_change_protocol(struct rc_dev *rc, u64 rc_type)
|
||||
if (retval)
|
||||
goto out;
|
||||
|
||||
ictx->rc_type = rc_type;
|
||||
ictx->rc_type = *rc_type;
|
||||
ictx->pad_mouse = false;
|
||||
|
||||
out:
|
||||
@@ -1323,7 +1319,7 @@ static void imon_pad_to_keys(struct imon_context *ictx, unsigned char *buf)
|
||||
rel_x = buf[2];
|
||||
rel_y = buf[3];
|
||||
|
||||
if (ictx->rc_type == RC_TYPE_OTHER && pad_stabilize) {
|
||||
if (ictx->rc_type == RC_BIT_OTHER && pad_stabilize) {
|
||||
if ((buf[1] == 0) && ((rel_x != 0) || (rel_y != 0))) {
|
||||
dir = stabilize((int)rel_x, (int)rel_y,
|
||||
timeout, threshold);
|
||||
@@ -1390,7 +1386,7 @@ static void imon_pad_to_keys(struct imon_context *ictx, unsigned char *buf)
|
||||
buf[0] = 0x01;
|
||||
buf[1] = buf[4] = buf[5] = buf[6] = buf[7] = 0;
|
||||
|
||||
if (ictx->rc_type == RC_TYPE_OTHER && pad_stabilize) {
|
||||
if (ictx->rc_type == RC_BIT_OTHER && pad_stabilize) {
|
||||
dir = stabilize((int)rel_x, (int)rel_y,
|
||||
timeout, threshold);
|
||||
if (!dir) {
|
||||
@@ -1511,7 +1507,7 @@ static void imon_incoming_packet(struct imon_context *ictx,
|
||||
kc = imon_panel_key_lookup(scancode);
|
||||
} else {
|
||||
scancode = be32_to_cpu(*((u32 *)buf));
|
||||
if (ictx->rc_type == RC_TYPE_RC6) {
|
||||
if (ictx->rc_type == RC_BIT_RC6_MCE) {
|
||||
ktype = IMON_KEY_IMON;
|
||||
if (buf[0] == 0x80)
|
||||
ktype = IMON_KEY_MCE;
|
||||
@@ -1744,7 +1740,7 @@ static void imon_get_ffdc_type(struct imon_context *ictx)
|
||||
{
|
||||
u8 ffdc_cfg_byte = ictx->usb_rx_buf[6];
|
||||
u8 detected_display_type = IMON_DISPLAY_TYPE_NONE;
|
||||
u64 allowed_protos = RC_TYPE_OTHER;
|
||||
u64 allowed_protos = RC_BIT_OTHER;
|
||||
|
||||
switch (ffdc_cfg_byte) {
|
||||
/* iMON Knob, no display, iMON IR + vol knob */
|
||||
@@ -1775,13 +1771,13 @@ static void imon_get_ffdc_type(struct imon_context *ictx)
|
||||
case 0x9e:
|
||||
dev_info(ictx->dev, "0xffdc iMON VFD, MCE IR");
|
||||
detected_display_type = IMON_DISPLAY_TYPE_VFD;
|
||||
allowed_protos = RC_TYPE_RC6;
|
||||
allowed_protos = RC_BIT_RC6_MCE;
|
||||
break;
|
||||
/* iMON LCD, MCE IR */
|
||||
case 0x9f:
|
||||
dev_info(ictx->dev, "0xffdc iMON LCD, MCE IR");
|
||||
detected_display_type = IMON_DISPLAY_TYPE_LCD;
|
||||
allowed_protos = RC_TYPE_RC6;
|
||||
allowed_protos = RC_BIT_RC6_MCE;
|
||||
break;
|
||||
default:
|
||||
dev_info(ictx->dev, "Unknown 0xffdc device, "
|
||||
@@ -1789,7 +1785,7 @@ static void imon_get_ffdc_type(struct imon_context *ictx)
|
||||
detected_display_type = IMON_DISPLAY_TYPE_VFD;
|
||||
/* We don't know which one it is, allow user to set the
|
||||
* RC6 one from userspace if OTHER wasn't correct. */
|
||||
allowed_protos |= RC_TYPE_RC6;
|
||||
allowed_protos |= RC_BIT_RC6_MCE;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1875,7 +1871,7 @@ static struct rc_dev *imon_init_rdev(struct imon_context *ictx)
|
||||
|
||||
rdev->priv = ictx;
|
||||
rdev->driver_type = RC_DRIVER_SCANCODE;
|
||||
rdev->allowed_protos = RC_TYPE_OTHER | RC_TYPE_RC6; /* iMON PAD or MCE */
|
||||
rdev->allowed_protos = RC_BIT_OTHER | RC_BIT_RC6_MCE; /* iMON PAD or MCE */
|
||||
rdev->change_protocol = imon_ir_change_protocol;
|
||||
rdev->driver_name = MOD_NAME;
|
||||
|
||||
@@ -1893,7 +1889,7 @@ static struct rc_dev *imon_init_rdev(struct imon_context *ictx)
|
||||
|
||||
imon_set_display_type(ictx);
|
||||
|
||||
if (ictx->rc_type == RC_TYPE_RC6)
|
||||
if (ictx->rc_type == RC_BIT_RC6_MCE)
|
||||
rdev->map_name = RC_MAP_IMON_MCE;
|
||||
else
|
||||
rdev->map_name = RC_MAP_IMON_PAD;
|
||||
|
@@ -47,7 +47,7 @@ static int ir_jvc_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
{
|
||||
struct jvc_dec *data = &dev->raw->jvc;
|
||||
|
||||
if (!(dev->raw->enabled_protocols & RC_TYPE_JVC))
|
||||
if (!(dev->raw->enabled_protocols & RC_BIT_JVC))
|
||||
return 0;
|
||||
|
||||
if (!is_timing_event(ev)) {
|
||||
@@ -174,7 +174,7 @@ out:
|
||||
}
|
||||
|
||||
static struct ir_raw_handler jvc_handler = {
|
||||
.protocols = RC_TYPE_JVC,
|
||||
.protocols = RC_BIT_JVC,
|
||||
.decode = ir_jvc_decode,
|
||||
};
|
||||
|
||||
|
@@ -35,7 +35,7 @@ static int ir_lirc_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
struct lirc_codec *lirc = &dev->raw->lirc;
|
||||
int sample;
|
||||
|
||||
if (!(dev->raw->enabled_protocols & RC_TYPE_LIRC))
|
||||
if (!(dev->raw->enabled_protocols & RC_BIT_LIRC))
|
||||
return 0;
|
||||
|
||||
if (!dev->raw->lirc.drv || !dev->raw->lirc.drv->rbuf)
|
||||
@@ -408,7 +408,7 @@ static int ir_lirc_unregister(struct rc_dev *dev)
|
||||
}
|
||||
|
||||
static struct ir_raw_handler lirc_handler = {
|
||||
.protocols = RC_TYPE_LIRC,
|
||||
.protocols = RC_BIT_LIRC,
|
||||
.decode = ir_lirc_decode,
|
||||
.raw_register = ir_lirc_register,
|
||||
.raw_unregister = ir_lirc_unregister,
|
||||
|
@@ -216,7 +216,7 @@ static int ir_mce_kbd_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
u32 scancode;
|
||||
unsigned long delay;
|
||||
|
||||
if (!(dev->raw->enabled_protocols & RC_TYPE_MCE_KBD))
|
||||
if (!(dev->raw->enabled_protocols & RC_BIT_MCE_KBD))
|
||||
return 0;
|
||||
|
||||
if (!is_timing_event(ev)) {
|
||||
@@ -422,7 +422,7 @@ static int ir_mce_kbd_unregister(struct rc_dev *dev)
|
||||
}
|
||||
|
||||
static struct ir_raw_handler mce_kbd_handler = {
|
||||
.protocols = RC_TYPE_MCE_KBD,
|
||||
.protocols = RC_BIT_MCE_KBD,
|
||||
.decode = ir_mce_kbd_decode,
|
||||
.raw_register = ir_mce_kbd_register,
|
||||
.raw_unregister = ir_mce_kbd_unregister,
|
||||
|
@@ -52,7 +52,7 @@ static int ir_nec_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
u8 address, not_address, command, not_command;
|
||||
bool send_32bits = false;
|
||||
|
||||
if (!(dev->raw->enabled_protocols & RC_TYPE_NEC))
|
||||
if (!(dev->raw->enabled_protocols & RC_BIT_NEC))
|
||||
return 0;
|
||||
|
||||
if (!is_timing_event(ev)) {
|
||||
@@ -201,7 +201,7 @@ static int ir_nec_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
}
|
||||
|
||||
static struct ir_raw_handler nec_handler = {
|
||||
.protocols = RC_TYPE_NEC,
|
||||
.protocols = RC_BIT_NEC,
|
||||
.decode = ir_nec_decode,
|
||||
};
|
||||
|
||||
|
@@ -52,8 +52,8 @@ static int ir_rc5_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
u8 toggle;
|
||||
u32 scancode;
|
||||
|
||||
if (!(dev->raw->enabled_protocols & RC_TYPE_RC5))
|
||||
return 0;
|
||||
if (!(dev->raw->enabled_protocols & (RC_BIT_RC5 | RC_BIT_RC5X)))
|
||||
return 0;
|
||||
|
||||
if (!is_timing_event(ev)) {
|
||||
if (ev.reset)
|
||||
@@ -128,6 +128,10 @@ again:
|
||||
if (data->wanted_bits == RC5X_NBITS) {
|
||||
/* RC5X */
|
||||
u8 xdata, command, system;
|
||||
if (!(dev->raw->enabled_protocols & RC_BIT_RC5X)) {
|
||||
data->state = STATE_INACTIVE;
|
||||
return 0;
|
||||
}
|
||||
xdata = (data->bits & 0x0003F) >> 0;
|
||||
command = (data->bits & 0x00FC0) >> 6;
|
||||
system = (data->bits & 0x1F000) >> 12;
|
||||
@@ -141,6 +145,10 @@ again:
|
||||
} else {
|
||||
/* RC5 */
|
||||
u8 command, system;
|
||||
if (!(dev->raw->enabled_protocols & RC_BIT_RC5)) {
|
||||
data->state = STATE_INACTIVE;
|
||||
return 0;
|
||||
}
|
||||
command = (data->bits & 0x0003F) >> 0;
|
||||
system = (data->bits & 0x007C0) >> 6;
|
||||
toggle = (data->bits & 0x00800) ? 1 : 0;
|
||||
@@ -164,7 +172,7 @@ out:
|
||||
}
|
||||
|
||||
static struct ir_raw_handler rc5_handler = {
|
||||
.protocols = RC_TYPE_RC5,
|
||||
.protocols = RC_BIT_RC5 | RC_BIT_RC5X,
|
||||
.decode = ir_rc5_decode,
|
||||
};
|
||||
|
||||
|
@@ -48,8 +48,8 @@ static int ir_rc5_sz_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
u8 toggle, command, system;
|
||||
u32 scancode;
|
||||
|
||||
if (!(dev->raw->enabled_protocols & RC_TYPE_RC5_SZ))
|
||||
return 0;
|
||||
if (!(dev->raw->enabled_protocols & RC_BIT_RC5_SZ))
|
||||
return 0;
|
||||
|
||||
if (!is_timing_event(ev)) {
|
||||
if (ev.reset)
|
||||
@@ -128,7 +128,7 @@ out:
|
||||
}
|
||||
|
||||
static struct ir_raw_handler rc5_sz_handler = {
|
||||
.protocols = RC_TYPE_RC5_SZ,
|
||||
.protocols = RC_BIT_RC5_SZ,
|
||||
.decode = ir_rc5_sz_decode,
|
||||
};
|
||||
|
||||
|
@@ -89,7 +89,9 @@ static int ir_rc6_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
u32 scancode;
|
||||
u8 toggle;
|
||||
|
||||
if (!(dev->raw->enabled_protocols & RC_TYPE_RC6))
|
||||
if (!(dev->raw->enabled_protocols &
|
||||
(RC_BIT_RC6_0 | RC_BIT_RC6_6A_20 | RC_BIT_RC6_6A_24 |
|
||||
RC_BIT_RC6_6A_32 | RC_BIT_RC6_MCE)))
|
||||
return 0;
|
||||
|
||||
if (!is_timing_event(ev)) {
|
||||
@@ -271,7 +273,9 @@ out:
|
||||
}
|
||||
|
||||
static struct ir_raw_handler rc6_handler = {
|
||||
.protocols = RC_TYPE_RC6,
|
||||
.protocols = RC_BIT_RC6_0 | RC_BIT_RC6_6A_20 |
|
||||
RC_BIT_RC6_6A_24 | RC_BIT_RC6_6A_32 |
|
||||
RC_BIT_RC6_MCE,
|
||||
.decode = ir_rc6_decode,
|
||||
};
|
||||
|
||||
|
@@ -479,18 +479,7 @@ struct platform_driver lirc_rx51_platform_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init lirc_rx51_init(void)
|
||||
{
|
||||
return platform_driver_register(&lirc_rx51_platform_driver);
|
||||
}
|
||||
module_init(lirc_rx51_init);
|
||||
|
||||
static void __exit lirc_rx51_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&lirc_rx51_platform_driver);
|
||||
}
|
||||
module_exit(lirc_rx51_exit);
|
||||
module_platform_driver(lirc_rx51_platform_driver);
|
||||
|
||||
MODULE_DESCRIPTION("LIRC TX driver for Nokia RX51");
|
||||
MODULE_AUTHOR("Nokia Corporation");
|
||||
|
@@ -58,7 +58,7 @@ static int ir_sanyo_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
u32 scancode;
|
||||
u8 address, command, not_command;
|
||||
|
||||
if (!(dev->raw->enabled_protocols & RC_TYPE_SANYO))
|
||||
if (!(dev->raw->enabled_protocols & RC_BIT_SANYO))
|
||||
return 0;
|
||||
|
||||
if (!is_timing_event(ev)) {
|
||||
@@ -179,7 +179,7 @@ static int ir_sanyo_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
}
|
||||
|
||||
static struct ir_raw_handler sanyo_handler = {
|
||||
.protocols = RC_TYPE_SANYO,
|
||||
.protocols = RC_BIT_SANYO,
|
||||
.decode = ir_sanyo_decode,
|
||||
};
|
||||
|
||||
|
@@ -45,7 +45,8 @@ static int ir_sony_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
u32 scancode;
|
||||
u8 device, subdevice, function;
|
||||
|
||||
if (!(dev->raw->enabled_protocols & RC_TYPE_SONY))
|
||||
if (!(dev->raw->enabled_protocols &
|
||||
(RC_BIT_SONY12 | RC_BIT_SONY15 | RC_BIT_SONY20)))
|
||||
return 0;
|
||||
|
||||
if (!is_timing_event(ev)) {
|
||||
@@ -123,16 +124,28 @@ static int ir_sony_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
||||
|
||||
switch (data->count) {
|
||||
case 12:
|
||||
if (!(dev->raw->enabled_protocols & RC_BIT_SONY12)) {
|
||||
data->state = STATE_INACTIVE;
|
||||
return 0;
|
||||
}
|
||||
device = bitrev8((data->bits << 3) & 0xF8);
|
||||
subdevice = 0;
|
||||
function = bitrev8((data->bits >> 4) & 0xFE);
|
||||
break;
|
||||
case 15:
|
||||
if (!(dev->raw->enabled_protocols & RC_BIT_SONY15)) {
|
||||
data->state = STATE_INACTIVE;
|
||||
return 0;
|
||||
}
|
||||
device = bitrev8((data->bits >> 0) & 0xFF);
|
||||
subdevice = 0;
|
||||
function = bitrev8((data->bits >> 7) & 0xFE);
|
||||
break;
|
||||
case 20:
|
||||
if (!(dev->raw->enabled_protocols & RC_BIT_SONY20)) {
|
||||
data->state = STATE_INACTIVE;
|
||||
return 0;
|
||||
}
|
||||
device = bitrev8((data->bits >> 5) & 0xF8);
|
||||
subdevice = bitrev8((data->bits >> 0) & 0xFF);
|
||||
function = bitrev8((data->bits >> 12) & 0xFE);
|
||||
@@ -157,7 +170,7 @@ out:
|
||||
}
|
||||
|
||||
static struct ir_raw_handler sony_handler = {
|
||||
.protocols = RC_TYPE_SONY,
|
||||
.protocols = RC_BIT_SONY12 | RC_BIT_SONY15 | RC_BIT_SONY20,
|
||||
.decode = ir_sony_decode,
|
||||
};
|
||||
|
||||
|
@@ -1563,7 +1563,7 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id
|
||||
/* set up ir-core props */
|
||||
rdev->priv = itdev;
|
||||
rdev->driver_type = RC_DRIVER_IR_RAW;
|
||||
rdev->allowed_protos = RC_TYPE_ALL;
|
||||
rdev->allowed_protos = RC_BIT_ALL;
|
||||
rdev->open = ite_open;
|
||||
rdev->close = ite_close;
|
||||
rdev->s_idle = ite_s_idle;
|
||||
@@ -1708,12 +1708,12 @@ static struct pnp_driver ite_driver = {
|
||||
.shutdown = ite_shutdown,
|
||||
};
|
||||
|
||||
int ite_init(void)
|
||||
static int ite_init(void)
|
||||
{
|
||||
return pnp_register_driver(&ite_driver);
|
||||
}
|
||||
|
||||
void ite_exit(void)
|
||||
static void ite_exit(void)
|
||||
{
|
||||
pnp_unregister_driver(&ite_driver);
|
||||
}
|
||||
|
@@ -121,7 +121,7 @@ static struct rc_map_list imon_mce_map = {
|
||||
.scan = imon_mce,
|
||||
.size = ARRAY_SIZE(imon_mce),
|
||||
/* its RC6, but w/a hardware decoder */
|
||||
.rc_type = RC_TYPE_RC6,
|
||||
.rc_type = RC_TYPE_RC6_MCE,
|
||||
.name = RC_MAP_IMON_MCE,
|
||||
}
|
||||
};
|
||||
|
@@ -97,7 +97,7 @@ static struct rc_map_list rc6_mce_map = {
|
||||
.map = {
|
||||
.scan = rc6_mce,
|
||||
.size = ARRAY_SIZE(rc6_mce),
|
||||
.rc_type = RC_TYPE_RC6,
|
||||
.rc_type = RC_TYPE_RC6_MCE,
|
||||
.name = RC_MAP_RC6_MCE,
|
||||
}
|
||||
};
|
||||
|
@@ -1205,7 +1205,7 @@ static struct rc_dev *mceusb_init_rc_dev(struct mceusb_dev *ir)
|
||||
rc->dev.parent = dev;
|
||||
rc->priv = ir;
|
||||
rc->driver_type = RC_DRIVER_IR_RAW;
|
||||
rc->allowed_protos = RC_TYPE_ALL;
|
||||
rc->allowed_protos = RC_BIT_ALL;
|
||||
rc->timeout = MS_TO_NS(100);
|
||||
if (!ir->flags.no_tx) {
|
||||
rc->s_tx_mask = mceusb_set_tx_mask;
|
||||
|
@@ -472,6 +472,7 @@ static void nvt_enable_wake(struct nvt_dev *nvt)
|
||||
nvt_cir_wake_reg_write(nvt, 0, CIR_WAKE_IREN);
|
||||
}
|
||||
|
||||
#if 0 /* Currently unused */
|
||||
/* rx carrier detect only works in learning mode, must be called w/nvt_lock */
|
||||
static u32 nvt_rx_carrier_detect(struct nvt_dev *nvt)
|
||||
{
|
||||
@@ -504,7 +505,7 @@ static u32 nvt_rx_carrier_detect(struct nvt_dev *nvt)
|
||||
|
||||
return carrier;
|
||||
}
|
||||
|
||||
#endif
|
||||
/*
|
||||
* set carrier frequency
|
||||
*
|
||||
@@ -620,7 +621,6 @@ static void nvt_dump_rx_buf(struct nvt_dev *nvt)
|
||||
static void nvt_process_rx_ir_data(struct nvt_dev *nvt)
|
||||
{
|
||||
DEFINE_IR_RAW_EVENT(rawir);
|
||||
u32 carrier;
|
||||
u8 sample;
|
||||
int i;
|
||||
|
||||
@@ -629,9 +629,6 @@ static void nvt_process_rx_ir_data(struct nvt_dev *nvt)
|
||||
if (debug)
|
||||
nvt_dump_rx_buf(nvt);
|
||||
|
||||
if (nvt->carrier_detect_enabled)
|
||||
carrier = nvt_rx_carrier_detect(nvt);
|
||||
|
||||
nvt_dbg_verbose("Processing buffer of len %d", nvt->pkts);
|
||||
|
||||
init_ir_raw_event(&rawir);
|
||||
@@ -1045,7 +1042,7 @@ static int nvt_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id)
|
||||
/* Set up the rc device */
|
||||
rdev->priv = nvt;
|
||||
rdev->driver_type = RC_DRIVER_IR_RAW;
|
||||
rdev->allowed_protos = RC_TYPE_ALL;
|
||||
rdev->allowed_protos = RC_BIT_ALL;
|
||||
rdev->open = nvt_open;
|
||||
rdev->close = nvt_close;
|
||||
rdev->tx_ir = nvt_tx_ir;
|
||||
@@ -1220,12 +1217,12 @@ static struct pnp_driver nvt_driver = {
|
||||
.shutdown = nvt_shutdown,
|
||||
};
|
||||
|
||||
int nvt_init(void)
|
||||
static int nvt_init(void)
|
||||
{
|
||||
return pnp_register_driver(&nvt_driver);
|
||||
}
|
||||
|
||||
void nvt_exit(void)
|
||||
static void nvt_exit(void)
|
||||
{
|
||||
pnp_unregister_driver(&nvt_driver);
|
||||
}
|
||||
|
@@ -103,7 +103,6 @@ struct nvt_dev {
|
||||
|
||||
/* rx settings */
|
||||
bool learning_enabled;
|
||||
bool carrier_detect_enabled;
|
||||
|
||||
/* track cir wake state */
|
||||
u8 wake_state;
|
||||
|
@@ -195,7 +195,7 @@ static int __init loop_init(void)
|
||||
rc->map_name = RC_MAP_EMPTY;
|
||||
rc->priv = &loopdev;
|
||||
rc->driver_type = RC_DRIVER_IR_RAW;
|
||||
rc->allowed_protos = RC_TYPE_ALL;
|
||||
rc->allowed_protos = RC_BIT_ALL;
|
||||
rc->timeout = 100 * 1000 * 1000; /* 100 ms */
|
||||
rc->min_timeout = 1;
|
||||
rc->max_timeout = UINT_MAX;
|
||||
|
@@ -725,25 +725,36 @@ static struct class ir_input_class = {
|
||||
.devnode = ir_devnode,
|
||||
};
|
||||
|
||||
/*
|
||||
* These are the protocol textual descriptions that are
|
||||
* used by the sysfs protocols file. Note that the order
|
||||
* of the entries is relevant.
|
||||
*/
|
||||
static struct {
|
||||
u64 type;
|
||||
char *name;
|
||||
} proto_names[] = {
|
||||
{ RC_TYPE_UNKNOWN, "unknown" },
|
||||
{ RC_TYPE_RC5, "rc-5" },
|
||||
{ RC_TYPE_NEC, "nec" },
|
||||
{ RC_TYPE_RC6, "rc-6" },
|
||||
{ RC_TYPE_JVC, "jvc" },
|
||||
{ RC_TYPE_SONY, "sony" },
|
||||
{ RC_TYPE_RC5_SZ, "rc-5-sz" },
|
||||
{ RC_TYPE_SANYO, "sanyo" },
|
||||
{ RC_TYPE_MCE_KBD, "mce_kbd" },
|
||||
{ RC_TYPE_LIRC, "lirc" },
|
||||
{ RC_TYPE_OTHER, "other" },
|
||||
{ RC_BIT_NONE, "none" },
|
||||
{ RC_BIT_OTHER, "other" },
|
||||
{ RC_BIT_UNKNOWN, "unknown" },
|
||||
{ RC_BIT_RC5 |
|
||||
RC_BIT_RC5X, "rc-5" },
|
||||
{ RC_BIT_NEC, "nec" },
|
||||
{ RC_BIT_RC6_0 |
|
||||
RC_BIT_RC6_6A_20 |
|
||||
RC_BIT_RC6_6A_24 |
|
||||
RC_BIT_RC6_6A_32 |
|
||||
RC_BIT_RC6_MCE, "rc-6" },
|
||||
{ RC_BIT_JVC, "jvc" },
|
||||
{ RC_BIT_SONY12 |
|
||||
RC_BIT_SONY15 |
|
||||
RC_BIT_SONY20, "sony" },
|
||||
{ RC_BIT_RC5_SZ, "rc-5-sz" },
|
||||
{ RC_BIT_SANYO, "sanyo" },
|
||||
{ RC_BIT_MCE_KBD, "mce_kbd" },
|
||||
{ RC_BIT_LIRC, "lirc" },
|
||||
};
|
||||
|
||||
#define PROTO_NONE "none"
|
||||
|
||||
/**
|
||||
* show_protocols() - shows the current IR protocol(s)
|
||||
* @device: the device descriptor
|
||||
@@ -790,6 +801,9 @@ static ssize_t show_protocols(struct device *device,
|
||||
tmp += sprintf(tmp, "[%s] ", proto_names[i].name);
|
||||
else if (allowed & proto_names[i].type)
|
||||
tmp += sprintf(tmp, "%s ", proto_names[i].name);
|
||||
|
||||
if (allowed & proto_names[i].type)
|
||||
allowed &= ~proto_names[i].type;
|
||||
}
|
||||
|
||||
if (tmp != buf)
|
||||
@@ -867,26 +881,20 @@ static ssize_t store_protocols(struct device *device,
|
||||
disable = false;
|
||||
}
|
||||
|
||||
if (!enable && !disable && !strncasecmp(tmp, PROTO_NONE, sizeof(PROTO_NONE))) {
|
||||
tmp += sizeof(PROTO_NONE);
|
||||
mask = 0;
|
||||
count++;
|
||||
} else {
|
||||
for (i = 0; i < ARRAY_SIZE(proto_names); i++) {
|
||||
if (!strcasecmp(tmp, proto_names[i].name)) {
|
||||
tmp += strlen(proto_names[i].name);
|
||||
mask = proto_names[i].type;
|
||||
break;
|
||||
}
|
||||
for (i = 0; i < ARRAY_SIZE(proto_names); i++) {
|
||||
if (!strcasecmp(tmp, proto_names[i].name)) {
|
||||
mask = proto_names[i].type;
|
||||
break;
|
||||
}
|
||||
if (i == ARRAY_SIZE(proto_names)) {
|
||||
IR_dprintk(1, "Unknown protocol: '%s'\n", tmp);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
count++;
|
||||
}
|
||||
|
||||
if (i == ARRAY_SIZE(proto_names)) {
|
||||
IR_dprintk(1, "Unknown protocol: '%s'\n", tmp);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
count++;
|
||||
|
||||
if (enable)
|
||||
type |= mask;
|
||||
else if (disable)
|
||||
@@ -902,7 +910,7 @@ static ssize_t store_protocols(struct device *device,
|
||||
}
|
||||
|
||||
if (dev->change_protocol) {
|
||||
rc = dev->change_protocol(dev, type);
|
||||
rc = dev->change_protocol(dev, &type);
|
||||
if (rc < 0) {
|
||||
IR_dprintk(1, "Error setting protocols to 0x%llx\n",
|
||||
(long long)type);
|
||||
@@ -1117,7 +1125,8 @@ int rc_register_device(struct rc_dev *dev)
|
||||
}
|
||||
|
||||
if (dev->change_protocol) {
|
||||
rc = dev->change_protocol(dev, rc_map->rc_type);
|
||||
u64 rc_type = (1 << rc_map->rc_type);
|
||||
rc = dev->change_protocol(dev, &rc_type);
|
||||
if (rc < 0)
|
||||
goto out_raw;
|
||||
}
|
||||
|
@@ -1082,7 +1082,7 @@ static struct rc_dev *redrat3_init_rc_dev(struct redrat3_dev *rr3)
|
||||
rc->dev.parent = dev;
|
||||
rc->priv = rr3;
|
||||
rc->driver_type = RC_DRIVER_IR_RAW;
|
||||
rc->allowed_protos = RC_TYPE_ALL;
|
||||
rc->allowed_protos = RC_BIT_ALL;
|
||||
rc->timeout = US_TO_NS(2750);
|
||||
rc->tx_ir = redrat3_transmit_ir;
|
||||
rc->s_tx_carrier = redrat3_set_tx_carrier;
|
||||
|
@@ -322,7 +322,7 @@ static struct rc_dev *streamzap_init_rc_dev(struct streamzap_ir *sz)
|
||||
rdev->dev.parent = dev;
|
||||
rdev->priv = sz;
|
||||
rdev->driver_type = RC_DRIVER_IR_RAW;
|
||||
rdev->allowed_protos = RC_TYPE_ALL;
|
||||
rdev->allowed_protos = RC_BIT_ALL;
|
||||
rdev->driver_name = DRIVER_NAME;
|
||||
rdev->map_name = RC_MAP_STREAMZAP;
|
||||
|
||||
|
@@ -316,7 +316,7 @@ static int __devinit ttusbir_probe(struct usb_interface *intf,
|
||||
usb_to_input_id(tt->udev, &rc->input_id);
|
||||
rc->dev.parent = &intf->dev;
|
||||
rc->driver_type = RC_DRIVER_IR_RAW;
|
||||
rc->allowed_protos = RC_TYPE_ALL;
|
||||
rc->allowed_protos = RC_BIT_ALL;
|
||||
rc->priv = tt;
|
||||
rc->driver_name = DRIVER_NAME;
|
||||
rc->map_name = RC_MAP_TT_1500;
|
||||
|
@@ -7,6 +7,7 @@
|
||||
* with minor modifications.
|
||||
*
|
||||
* Original Author: David Härdeman <david@hardeman.nu>
|
||||
* Copyright (C) 2012 Sean Young <sean@mess.org>
|
||||
* Copyright (C) 2009 - 2011 David Härdeman <david@hardeman.nu>
|
||||
*
|
||||
* Dedicated to my daughter Matilda, without whose loving attention this
|
||||
@@ -22,9 +23,7 @@
|
||||
* o IR Receive
|
||||
* o IR Transmit
|
||||
* o Wake-On-CIR functionality
|
||||
*
|
||||
* To do:
|
||||
* o Learning
|
||||
* o Carrier detection
|
||||
*
|
||||
* 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
|
||||
@@ -149,6 +148,12 @@
|
||||
#define WBCIR_REGSEL_MASK 0x20
|
||||
/* Starting address of selected register in WBCIR_REG_WCEIR_INDEX */
|
||||
#define WBCIR_REG_ADDR0 0x00
|
||||
/* Enable carrier counter */
|
||||
#define WBCIR_CNTR_EN 0x01
|
||||
/* Reset carrier counter */
|
||||
#define WBCIR_CNTR_R 0x02
|
||||
/* Invert TX */
|
||||
#define WBCIR_IRTX_INV 0x04
|
||||
|
||||
/* Valid banks for the SP3 UART */
|
||||
enum wbcir_bank {
|
||||
@@ -184,7 +189,7 @@ enum wbcir_txstate {
|
||||
};
|
||||
|
||||
/* Misc */
|
||||
#define WBCIR_NAME "winbond-cir"
|
||||
#define WBCIR_NAME "Winbond CIR"
|
||||
#define WBCIR_ID_FAMILY 0xF1 /* Family ID for the WPCD376I */
|
||||
#define WBCIR_ID_CHIP 0x04 /* Chip ID for the WPCD376I */
|
||||
#define INVALID_SCANCODE 0x7FFFFFFF /* Invalid with all protos */
|
||||
@@ -207,7 +212,8 @@ struct wbcir_data {
|
||||
/* RX state */
|
||||
enum wbcir_rxstate rxstate;
|
||||
struct led_trigger *rxtrigger;
|
||||
struct ir_raw_event rxev;
|
||||
int carrier_report_enabled;
|
||||
u32 pulse_duration;
|
||||
|
||||
/* TX state */
|
||||
enum wbcir_txstate txstate;
|
||||
@@ -329,6 +335,30 @@ wbcir_to_rc6cells(u8 val)
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
static void
|
||||
wbcir_carrier_report(struct wbcir_data *data)
|
||||
{
|
||||
unsigned counter = inb(data->ebase + WBCIR_REG_ECEIR_CNT_LO) |
|
||||
inb(data->ebase + WBCIR_REG_ECEIR_CNT_HI) << 8;
|
||||
|
||||
if (counter > 0 && counter < 0xffff) {
|
||||
DEFINE_IR_RAW_EVENT(ev);
|
||||
|
||||
ev.carrier_report = 1;
|
||||
ev.carrier = DIV_ROUND_CLOSEST(counter * 1000000u,
|
||||
data->pulse_duration);
|
||||
|
||||
ir_raw_event_store(data->dev, &ev);
|
||||
}
|
||||
|
||||
/* reset and restart the counter */
|
||||
data->pulse_duration = 0;
|
||||
wbcir_set_bits(data->ebase + WBCIR_REG_ECEIR_CCTL, WBCIR_CNTR_R,
|
||||
WBCIR_CNTR_EN | WBCIR_CNTR_R);
|
||||
wbcir_set_bits(data->ebase + WBCIR_REG_ECEIR_CCTL, WBCIR_CNTR_EN,
|
||||
WBCIR_CNTR_EN | WBCIR_CNTR_R);
|
||||
}
|
||||
|
||||
static void
|
||||
wbcir_idle_rx(struct rc_dev *dev, bool idle)
|
||||
{
|
||||
@@ -339,9 +369,16 @@ wbcir_idle_rx(struct rc_dev *dev, bool idle)
|
||||
led_trigger_event(data->rxtrigger, LED_FULL);
|
||||
}
|
||||
|
||||
if (idle && data->rxstate != WBCIR_RXSTATE_INACTIVE)
|
||||
if (idle && data->rxstate != WBCIR_RXSTATE_INACTIVE) {
|
||||
data->rxstate = WBCIR_RXSTATE_INACTIVE;
|
||||
led_trigger_event(data->rxtrigger, LED_OFF);
|
||||
|
||||
if (data->carrier_report_enabled)
|
||||
wbcir_carrier_report(data);
|
||||
|
||||
/* Tell hardware to go idle by setting RXINACTIVE */
|
||||
outb(WBCIR_RX_DISABLE, data->sbase + WBCIR_REG_SP3_ASCR);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -349,21 +386,22 @@ wbcir_irq_rx(struct wbcir_data *data, struct pnp_dev *device)
|
||||
{
|
||||
u8 irdata;
|
||||
DEFINE_IR_RAW_EVENT(rawir);
|
||||
unsigned duration;
|
||||
|
||||
/* Since RXHDLEV is set, at least 8 bytes are in the FIFO */
|
||||
while (inb(data->sbase + WBCIR_REG_SP3_LSR) & WBCIR_RX_AVAIL) {
|
||||
irdata = inb(data->sbase + WBCIR_REG_SP3_RXDATA);
|
||||
if (data->rxstate == WBCIR_RXSTATE_ERROR)
|
||||
continue;
|
||||
rawir.pulse = irdata & 0x80 ? false : true;
|
||||
rawir.duration = US_TO_NS(((irdata & 0x7F) + 1) * 10);
|
||||
ir_raw_event_store_with_filter(data->dev, &rawir);
|
||||
}
|
||||
|
||||
/* Check if we should go idle */
|
||||
if (data->dev->idle) {
|
||||
led_trigger_event(data->rxtrigger, LED_OFF);
|
||||
data->rxstate = WBCIR_RXSTATE_INACTIVE;
|
||||
duration = ((irdata & 0x7F) + 1) * 2;
|
||||
rawir.pulse = irdata & 0x80 ? false : true;
|
||||
rawir.duration = US_TO_NS(duration);
|
||||
|
||||
if (rawir.pulse)
|
||||
data->pulse_duration += duration;
|
||||
|
||||
ir_raw_event_store_with_filter(data->dev, &rawir);
|
||||
}
|
||||
|
||||
ir_raw_event_handle(data->dev);
|
||||
@@ -491,6 +529,33 @@ wbcir_irq_handler(int irqno, void *cookie)
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
static int
|
||||
wbcir_set_carrier_report(struct rc_dev *dev, int enable)
|
||||
{
|
||||
struct wbcir_data *data = dev->priv;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&data->spinlock, flags);
|
||||
|
||||
if (data->carrier_report_enabled == enable) {
|
||||
spin_unlock_irqrestore(&data->spinlock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
data->pulse_duration = 0;
|
||||
wbcir_set_bits(data->ebase + WBCIR_REG_ECEIR_CCTL, WBCIR_CNTR_R,
|
||||
WBCIR_CNTR_EN | WBCIR_CNTR_R);
|
||||
|
||||
if (enable && data->dev->idle)
|
||||
wbcir_set_bits(data->ebase + WBCIR_REG_ECEIR_CCTL,
|
||||
WBCIR_CNTR_EN, WBCIR_CNTR_EN | WBCIR_CNTR_R);
|
||||
|
||||
data->carrier_report_enabled = enable;
|
||||
spin_unlock_irqrestore(&data->spinlock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
wbcir_txcarrier(struct rc_dev *dev, u32 carrier)
|
||||
{
|
||||
@@ -837,7 +902,7 @@ wbcir_init_hw(struct wbcir_data *data)
|
||||
|
||||
/* Set IRTX_INV */
|
||||
if (invert)
|
||||
outb(0x04, data->ebase + WBCIR_REG_ECEIR_CCTL);
|
||||
outb(WBCIR_IRTX_INV, data->ebase + WBCIR_REG_ECEIR_CCTL);
|
||||
else
|
||||
outb(0x00, data->ebase + WBCIR_REG_ECEIR_CCTL);
|
||||
|
||||
@@ -866,8 +931,8 @@ wbcir_init_hw(struct wbcir_data *data)
|
||||
/* prescaler 1.0, tx/rx fifo lvl 16 */
|
||||
outb(0x30, data->sbase + WBCIR_REG_SP3_EXCR2);
|
||||
|
||||
/* Set baud divisor to sample every 10 us */
|
||||
outb(0x0F, data->sbase + WBCIR_REG_SP3_BGDL);
|
||||
/* Set baud divisor to sample every 2 ns */
|
||||
outb(0x03, data->sbase + WBCIR_REG_SP3_BGDL);
|
||||
outb(0x00, data->sbase + WBCIR_REG_SP3_BGDH);
|
||||
|
||||
/* Set CEIR mode */
|
||||
@@ -876,9 +941,12 @@ wbcir_init_hw(struct wbcir_data *data)
|
||||
inb(data->sbase + WBCIR_REG_SP3_LSR); /* Clear LSR */
|
||||
inb(data->sbase + WBCIR_REG_SP3_MSR); /* Clear MSR */
|
||||
|
||||
/* Disable RX demod, enable run-length enc/dec, set freq span */
|
||||
/*
|
||||
* Disable RX demod, enable run-length enc/dec, set freq span and
|
||||
* enable over-sampling
|
||||
*/
|
||||
wbcir_select_bank(data, WBCIR_BANK_7);
|
||||
outb(0x90, data->sbase + WBCIR_REG_SP3_RCCFG);
|
||||
outb(0xd0, data->sbase + WBCIR_REG_SP3_RCCFG);
|
||||
|
||||
/* Disable timer */
|
||||
wbcir_select_bank(data, WBCIR_BANK_4);
|
||||
@@ -915,9 +983,8 @@ wbcir_init_hw(struct wbcir_data *data)
|
||||
|
||||
/* Clear RX state */
|
||||
data->rxstate = WBCIR_RXSTATE_INACTIVE;
|
||||
data->rxev.duration = 0;
|
||||
ir_raw_event_reset(data->dev);
|
||||
ir_raw_event_handle(data->dev);
|
||||
ir_raw_event_set_idle(data->dev, true);
|
||||
|
||||
/* Clear TX state */
|
||||
if (data->txstate == WBCIR_TXSTATE_ACTIVE) {
|
||||
@@ -1007,7 +1074,7 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id)
|
||||
}
|
||||
|
||||
data->dev->driver_type = RC_DRIVER_IR_RAW;
|
||||
data->dev->driver_name = WBCIR_NAME;
|
||||
data->dev->driver_name = DRVNAME;
|
||||
data->dev->input_name = WBCIR_NAME;
|
||||
data->dev->input_phys = "wbcir/cir0";
|
||||
data->dev->input_id.bustype = BUS_HOST;
|
||||
@@ -1016,13 +1083,15 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id)
|
||||
data->dev->input_id.version = WBCIR_ID_CHIP;
|
||||
data->dev->map_name = RC_MAP_RC6_MCE;
|
||||
data->dev->s_idle = wbcir_idle_rx;
|
||||
data->dev->s_carrier_report = wbcir_set_carrier_report;
|
||||
data->dev->s_tx_mask = wbcir_txmask;
|
||||
data->dev->s_tx_carrier = wbcir_txcarrier;
|
||||
data->dev->tx_ir = wbcir_tx;
|
||||
data->dev->priv = data;
|
||||
data->dev->dev.parent = &device->dev;
|
||||
data->dev->timeout = MS_TO_NS(100);
|
||||
data->dev->allowed_protos = RC_TYPE_ALL;
|
||||
data->dev->rx_resolution = US_TO_NS(2);
|
||||
data->dev->allowed_protos = RC_BIT_ALL;
|
||||
|
||||
if (!request_region(data->wbase, WAKEUP_IOMEM_LEN, DRVNAME)) {
|
||||
dev_err(dev, "Region 0x%lx-0x%lx already in use!\n",
|
||||
|
مرجع در شماره جدید
Block a user