^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * keyboard input driver for i2c IR remote controls
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (c) 2000-2003 Gerd Knorr <kraxel@bytesex.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * modified for PixelView (BT878P+W/FM) by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Michal Kochanowicz <mkochano@pld.org.pl>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Christoph Bartelmus <lirc@bartelmus.de>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * modified for KNC ONE TV Station/Anubis Typhoon TView Tuner by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * Ulrich Mueller <ulrich.mueller42@web.de>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * modified for em2820 based USB TV tuners by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * Markus Rechberger <mrechberger@gmail.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * modified for DViCO Fusion HDTV 5 RT GOLD by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * Chaogui Zhang <czhang1974@gmail.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * modified for MSI TV@nywhere Plus by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * Henry Wong <henry@stuffedcow.net>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * Mark Schultz <n9xmj@yahoo.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * Brian Rogers <brian_rogers@comcast.net>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * modified for AVerMedia Cardbus by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * Oldrich Jedlicka <oldium.pro@seznam.cz>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * Zilog Transmitter portions/ideas were derived from GPLv2+ sources:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * - drivers/char/pctv_zilogir.[ch] from Hauppauge Broadway product
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * Copyright 2011 Hauppauge Computer works
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * - drivers/staging/media/lirc/lirc_zilog.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * Copyright (c) 2000 Gerd Knorr <kraxel@goldbach.in-berlin.de>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * Michal Kochanowicz <mkochano@pld.org.pl>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * Christoph Bartelmus <lirc@bartelmus.de>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * Ulrich Mueller <ulrich.mueller42@web.de>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * Stefan Jahn <stefan@lkcc.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * Jerome Brock <jbrock@users.sourceforge.net>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) * Thomas Reitmayr (treitmayr@yahoo.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) * Mark Weaver <mark@npsl.co.uk>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) * Jarod Wilson <jarod@redhat.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) * Copyright (C) 2011 Andy Walls <awalls@md.metrocast.net>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #include <asm/unaligned.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #include <linux/timer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #include <linux/workqueue.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #include <media/rc-core.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #include <media/i2c/ir-kbd-i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define FLAG_TX 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define FLAG_HDPVR 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) static bool enable_hdpvr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) module_param(enable_hdpvr, bool, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) static int get_key_haup_common(struct IR_i2c *ir, enum rc_proto *protocol,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) u32 *scancode, u8 *ptoggle, int size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) unsigned char buf[6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) int start, range, toggle, dev, code, ircode, vendor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) /* poll IR chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) if (size != i2c_master_recv(ir->c, buf, size))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) if (buf[0] & 0x80) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) int offset = (size == 6) ? 3 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) /* split rc5 data block ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) start = (buf[offset] >> 7) & 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) range = (buf[offset] >> 6) & 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) toggle = (buf[offset] >> 5) & 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) dev = buf[offset] & 0x1f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) code = (buf[offset+1] >> 2) & 0x3f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) /* rc5 has two start bits
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) * the first bit must be one
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) * the second bit defines the command range:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) * 1 = 0-63, 0 = 64 - 127
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) if (!start)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) /* no key pressed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) /* filter out invalid key presses */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) ircode = (start << 12) | (toggle << 11) | (dev << 6) | code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) if ((ircode & 0x1fff) == 0x1fff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) if (!range)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) code += 64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) dev_dbg(&ir->rc->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) "ir hauppauge (rc5): s%d r%d t%d dev=%d code=%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) start, range, toggle, dev, code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) *protocol = RC_PROTO_RC5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) *scancode = RC_SCANCODE_RC5(dev, code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) *ptoggle = toggle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) } else if (size == 6 && (buf[0] & 0x40)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) code = buf[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) dev = buf[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) vendor = get_unaligned_be16(buf + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) if (vendor == 0x800f) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) *ptoggle = (dev & 0x80) != 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) *protocol = RC_PROTO_RC6_MCE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) dev &= 0x7f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) dev_dbg(&ir->rc->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) "ir hauppauge (rc6-mce): t%d vendor=%d dev=%d code=%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) *ptoggle, vendor, dev, code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) *ptoggle = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) *protocol = RC_PROTO_RC6_6A_32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) dev_dbg(&ir->rc->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) "ir hauppauge (rc6-6a-32): vendor=%d dev=%d code=%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) vendor, dev, code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) *scancode = RC_SCANCODE_RC6_6A(vendor, dev, code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) static int get_key_haup(struct IR_i2c *ir, enum rc_proto *protocol,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) u32 *scancode, u8 *toggle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) return get_key_haup_common(ir, protocol, scancode, toggle, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) static int get_key_haup_xvr(struct IR_i2c *ir, enum rc_proto *protocol,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) u32 *scancode, u8 *toggle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) unsigned char buf[1] = { 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) * This is the same apparent "are you ready?" poll command observed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) * watching Windows driver traffic and implemented in lirc_zilog. With
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) * this added, we get far saner remote behavior with z8 chips on usb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) * connected devices, even with the default polling interval of 100ms.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) ret = i2c_master_send(ir->c, buf, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) if (ret != 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) return (ret < 0) ? ret : -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) return get_key_haup_common(ir, protocol, scancode, toggle, 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) static int get_key_pixelview(struct IR_i2c *ir, enum rc_proto *protocol,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) u32 *scancode, u8 *toggle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) unsigned char b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) /* poll IR chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) rc = i2c_master_recv(ir->c, &b, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) if (rc != 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) dev_dbg(&ir->rc->dev, "read error\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) if (rc < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) *protocol = RC_PROTO_OTHER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) *scancode = b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) *toggle = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) static int get_key_fusionhdtv(struct IR_i2c *ir, enum rc_proto *protocol,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) u32 *scancode, u8 *toggle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) unsigned char buf[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) /* poll IR chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) rc = i2c_master_recv(ir->c, buf, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) if (rc != 4) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) dev_dbg(&ir->rc->dev, "read error\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) if (rc < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) if (buf[0] != 0 || buf[1] != 0 || buf[2] != 0 || buf[3] != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) dev_dbg(&ir->rc->dev, "%s: %*ph\n", __func__, 4, buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) /* no key pressed or signal from other ir remote */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) if(buf[0] != 0x1 || buf[1] != 0xfe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) *protocol = RC_PROTO_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) *scancode = buf[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) *toggle = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) static int get_key_knc1(struct IR_i2c *ir, enum rc_proto *protocol,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) u32 *scancode, u8 *toggle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) unsigned char b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) /* poll IR chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) rc = i2c_master_recv(ir->c, &b, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) if (rc != 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) dev_dbg(&ir->rc->dev, "read error\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) if (rc < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) /* it seems that 0xFE indicates that a button is still hold
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) down, while 0xff indicates that no button is hold
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) down. 0xfe sequences are sometimes interrupted by 0xFF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) dev_dbg(&ir->rc->dev, "key %02x\n", b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) if (b == 0xff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) if (b == 0xfe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) /* keep old data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) *protocol = RC_PROTO_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) *scancode = b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) *toggle = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) static int get_key_avermedia_cardbus(struct IR_i2c *ir, enum rc_proto *protocol,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) u32 *scancode, u8 *toggle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) unsigned char subaddr, key, keygroup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) struct i2c_msg msg[] = { { .addr = ir->c->addr, .flags = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) .buf = &subaddr, .len = 1},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) { .addr = ir->c->addr, .flags = I2C_M_RD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) .buf = &key, .len = 1} };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) subaddr = 0x0d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) if (2 != i2c_transfer(ir->c->adapter, msg, 2)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) dev_dbg(&ir->rc->dev, "read error\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) if (key == 0xff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) subaddr = 0x0b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) msg[1].buf = &keygroup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) if (2 != i2c_transfer(ir->c->adapter, msg, 2)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) dev_dbg(&ir->rc->dev, "read error\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) if (keygroup == 0xff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) dev_dbg(&ir->rc->dev, "read key 0x%02x/0x%02x\n", key, keygroup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) if (keygroup < 2 || keygroup > 4) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) dev_warn(&ir->rc->dev, "warning: invalid key group 0x%02x for key 0x%02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) keygroup, key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) key |= (keygroup & 1) << 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) *protocol = RC_PROTO_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) *scancode = key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) if (ir->c->addr == 0x41) /* AVerMedia EM78P153 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) *scancode |= keygroup << 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) *toggle = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) /* ----------------------------------------------------------------------- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) static int ir_key_poll(struct IR_i2c *ir)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) enum rc_proto protocol;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) u32 scancode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) u8 toggle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) dev_dbg(&ir->rc->dev, "%s\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) rc = ir->get_key(ir, &protocol, &scancode, &toggle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) if (rc < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) dev_warn(&ir->rc->dev, "error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) dev_dbg(&ir->rc->dev, "%s: proto = 0x%04x, scancode = 0x%08x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) __func__, protocol, scancode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) rc_keydown(ir->rc, protocol, scancode, toggle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) static void ir_work(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) struct IR_i2c *ir = container_of(work, struct IR_i2c, work.work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) * If the transmit code is holding the lock, skip polling for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) * IR, we'll get it to it next time round
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) if (mutex_trylock(&ir->lock)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) rc = ir_key_poll(ir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) mutex_unlock(&ir->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) if (rc == -ENODEV) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) rc_unregister_device(ir->rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) ir->rc = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) schedule_delayed_work(&ir->work, msecs_to_jiffies(ir->polling_interval));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) static int ir_open(struct rc_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) struct IR_i2c *ir = dev->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) schedule_delayed_work(&ir->work, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) static void ir_close(struct rc_dev *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) struct IR_i2c *ir = dev->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) cancel_delayed_work_sync(&ir->work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) /* Zilog Transmit Interface */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) #define XTAL_FREQ 18432000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) #define ZILOG_SEND 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) #define ZILOG_UIR_END 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) #define ZILOG_INIT_END 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) #define ZILOG_LIR_END 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) #define ZILOG_STATUS_OK 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) #define ZILOG_STATUS_TX 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) #define ZILOG_STATUS_SET 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) * As you can see here, very few different lengths of pulse and space
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) * can be encoded. This means that the hardware does not work well with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) * recorded IR. It's best to work with generated IR, like from ir-ctl or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) * the in-kernel encoders.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) struct code_block {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) u8 length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) u16 pulse[7]; /* not aligned */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) u8 carrier_pulse;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) u8 carrier_space;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) u16 space[8]; /* not aligned */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) u8 codes[61];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) u8 csum[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) static int send_data_block(struct IR_i2c *ir, int cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) struct code_block *code_block)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) int i, j, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) u8 buf[5], *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) p = &code_block->length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) for (i = 0; p < code_block->csum; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) code_block->csum[i & 1] ^= *p++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) p = &code_block->length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) for (i = 0; i < sizeof(*code_block);) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) int tosend = sizeof(*code_block) - i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) if (tosend > 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) tosend = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) buf[0] = i + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) for (j = 0; j < tosend; ++j)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) buf[1 + j] = p[i + j];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) dev_dbg(&ir->rc->dev, "%*ph", tosend + 1, buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) ret = i2c_master_send(ir->tx_c, buf, tosend + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) if (ret != tosend + 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) dev_dbg(&ir->rc->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) "i2c_master_send failed with %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) return ret < 0 ? ret : -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) i += tosend;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) buf[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) buf[1] = cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) ret = i2c_master_send(ir->tx_c, buf, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) if (ret != 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) dev_err(&ir->rc->dev, "i2c_master_send failed with %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) return ret < 0 ? ret : -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) usleep_range(2000, 5000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) ret = i2c_master_send(ir->tx_c, buf, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) if (ret != 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) dev_err(&ir->rc->dev, "i2c_master_send failed with %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) return ret < 0 ? ret : -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) static int zilog_init(struct IR_i2c *ir)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) struct code_block code_block = { .length = sizeof(code_block) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) u8 buf[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) put_unaligned_be16(0x1000, &code_block.pulse[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) ret = send_data_block(ir, ZILOG_INIT_END, &code_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) ret = i2c_master_recv(ir->tx_c, buf, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) if (ret != 4) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) dev_err(&ir->c->dev, "failed to retrieve firmware version: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) return ret < 0 ? ret : -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) dev_info(&ir->c->dev, "Zilog/Hauppauge IR blaster firmware version %d.%d.%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) buf[1], buf[2], buf[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) * If the last slot for pulse is the same as the current slot for pulse,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) * then use slot no 7.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) static void copy_codes(u8 *dst, u8 *src, unsigned int count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) u8 c, last = 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) while (count--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) c = *src++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) if ((c & 0xf0) == last) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) *dst++ = 0x70 | (c & 0xf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) *dst++ = c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) last = c & 0xf0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) * When looking for repeats, we don't care about the trailing space. This
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) * is set to the shortest possible anyway.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) static int cmp_no_trail(u8 *a, u8 *b, unsigned int count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) while (--count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) if (*a++ != *b++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) return (*a & 0xf0) - (*b & 0xf0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) static int find_slot(u16 *array, unsigned int size, u16 val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) for (i = 0; i < size; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) if (get_unaligned_be16(&array[i]) == val) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) return i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) } else if (!array[i]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) put_unaligned_be16(val, &array[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) return i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) static int zilog_ir_format(struct rc_dev *rcdev, unsigned int *txbuf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) unsigned int count, struct code_block *code_block)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) struct IR_i2c *ir = rcdev->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) int rep, i, l, p = 0, s, c = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) bool repeating;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) u8 codes[174];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) code_block->carrier_pulse = DIV_ROUND_CLOSEST(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) ir->duty_cycle * XTAL_FREQ / 1000, ir->carrier);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) code_block->carrier_space = DIV_ROUND_CLOSEST(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) (100 - ir->duty_cycle) * XTAL_FREQ / 1000, ir->carrier);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) for (i = 0; i < count; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) if (c >= ARRAY_SIZE(codes) - 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) dev_warn(&rcdev->dev, "IR too long, cannot transmit\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) * Lengths more than 142220us cannot be encoded; also
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) * this checks for multiply overflow
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) if (txbuf[i] > 142220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) l = DIV_ROUND_CLOSEST((XTAL_FREQ / 1000) * txbuf[i], 40000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) if (i & 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) s = find_slot(code_block->space,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) ARRAY_SIZE(code_block->space), l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) if (s == -1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) dev_warn(&rcdev->dev, "Too many different lengths spaces, cannot transmit");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) /* We have a pulse and space */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) codes[c++] = (p << 4) | s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) p = find_slot(code_block->pulse,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) ARRAY_SIZE(code_block->pulse), l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) if (p == -1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) dev_warn(&rcdev->dev, "Too many different lengths pulses, cannot transmit");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) /* We have to encode the trailing pulse. Find the shortest space */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) s = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) for (i = 1; i < ARRAY_SIZE(code_block->space); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) u16 d = get_unaligned_be16(&code_block->space[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) if (get_unaligned_be16(&code_block->space[s]) > d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) s = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) codes[c++] = (p << 4) | s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) dev_dbg(&rcdev->dev, "generated %d codes\n", c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) * Are the last N codes (so pulse + space) repeating 3 times?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) * if so we can shorten the codes list and use code 0xc0 to repeat
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) * them.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) repeating = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) for (rep = c / 3; rep >= 1; rep--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) if (!memcmp(&codes[c - rep * 3], &codes[c - rep * 2], rep) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) !cmp_no_trail(&codes[c - rep], &codes[c - rep * 2], rep)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) repeating = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) if (repeating) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) /* first copy any leading non-repeating */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) int leading = c - rep * 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) if (leading >= ARRAY_SIZE(code_block->codes) - 3 - rep) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) dev_warn(&rcdev->dev, "IR too long, cannot transmit\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) dev_dbg(&rcdev->dev, "found trailing %d repeat\n", rep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) copy_codes(code_block->codes, codes, leading);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) code_block->codes[leading] = 0x82;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) copy_codes(code_block->codes + leading + 1, codes + leading,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) rep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) c = leading + 1 + rep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) code_block->codes[c++] = 0xc0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) if (c >= ARRAY_SIZE(code_block->codes) - 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) dev_warn(&rcdev->dev, "IR too long, cannot transmit\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) dev_dbg(&rcdev->dev, "found no trailing repeat\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) code_block->codes[0] = 0x82;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) copy_codes(code_block->codes + 1, codes, c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) c++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) code_block->codes[c++] = 0xc4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) while (c < ARRAY_SIZE(code_block->codes))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) code_block->codes[c++] = 0x83;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) static int zilog_tx(struct rc_dev *rcdev, unsigned int *txbuf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) unsigned int count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) struct IR_i2c *ir = rcdev->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) struct code_block code_block = { .length = sizeof(code_block) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) u8 buf[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) int ret, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) ret = zilog_ir_format(rcdev, txbuf, count, &code_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) ret = mutex_lock_interruptible(&ir->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) ret = send_data_block(ir, ZILOG_UIR_END, &code_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) ret = i2c_master_recv(ir->tx_c, buf, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) if (ret != 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) dev_err(&ir->rc->dev, "i2c_master_recv failed with %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) dev_dbg(&ir->rc->dev, "code set status: %02x\n", buf[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) if (buf[0] != (ZILOG_STATUS_OK | ZILOG_STATUS_SET)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) dev_err(&ir->rc->dev, "unexpected IR TX response %02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) buf[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) ret = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) buf[0] = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) buf[1] = ZILOG_SEND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) ret = i2c_master_send(ir->tx_c, buf, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) if (ret != 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) dev_err(&ir->rc->dev, "i2c_master_send failed with %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) if (ret >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) ret = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) dev_dbg(&ir->rc->dev, "send command sent\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) * This bit NAKs until the device is ready, so we retry it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) * sleeping a bit each time. This seems to be what the windows
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) * driver does, approximately.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) * Try for up to 1s.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) for (i = 0; i < 20; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) set_current_state(TASK_UNINTERRUPTIBLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) schedule_timeout(msecs_to_jiffies(50));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) ret = i2c_master_send(ir->tx_c, buf, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) if (ret == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) dev_dbg(&ir->rc->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) "NAK expected: i2c_master_send failed with %d (try %d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) ret, i + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) if (ret != 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) dev_err(&ir->rc->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) "IR TX chip never got ready: last i2c_master_send failed with %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) if (ret >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) ret = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) ret = i2c_master_recv(ir->tx_c, buf, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) if (ret != 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) dev_err(&ir->rc->dev, "i2c_master_recv failed with %d\n", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) ret = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) } else if (buf[0] != ZILOG_STATUS_OK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) dev_err(&ir->rc->dev, "unexpected IR TX response #2: %02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) buf[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) ret = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) dev_dbg(&ir->rc->dev, "transmit complete\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) /* Oh good, it worked */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) ret = count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) mutex_unlock(&ir->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) static int zilog_tx_carrier(struct rc_dev *dev, u32 carrier)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) struct IR_i2c *ir = dev->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) if (carrier > 500000 || carrier < 20000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) ir->carrier = carrier;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) static int zilog_tx_duty_cycle(struct rc_dev *dev, u32 duty_cycle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) struct IR_i2c *ir = dev->priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) ir->duty_cycle = duty_cycle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) char *ir_codes = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) const char *name = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) u64 rc_proto = RC_PROTO_BIT_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) struct IR_i2c *ir;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) struct rc_dev *rc = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) struct i2c_adapter *adap = client->adapter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) unsigned short addr = client->addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) bool probe_tx = (id->driver_data & FLAG_TX) != 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) if ((id->driver_data & FLAG_HDPVR) && !enable_hdpvr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) dev_err(&client->dev, "IR for HDPVR is known to cause problems during recording, use enable_hdpvr modparam to enable\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) ir = devm_kzalloc(&client->dev, sizeof(*ir), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) if (!ir)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) ir->c = client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) ir->polling_interval = DEFAULT_POLLING_INTERVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) i2c_set_clientdata(client, ir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) switch(addr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) case 0x64:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) name = "Pixelview";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) ir->get_key = get_key_pixelview;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) rc_proto = RC_PROTO_BIT_OTHER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) ir_codes = RC_MAP_EMPTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) case 0x18:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) case 0x1f:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) case 0x1a:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) name = "Hauppauge";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) ir->get_key = get_key_haup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) rc_proto = RC_PROTO_BIT_RC5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) ir_codes = RC_MAP_HAUPPAUGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) case 0x30:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) name = "KNC One";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) ir->get_key = get_key_knc1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) rc_proto = RC_PROTO_BIT_OTHER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) ir_codes = RC_MAP_EMPTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) case 0x6b:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) name = "FusionHDTV";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) ir->get_key = get_key_fusionhdtv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) rc_proto = RC_PROTO_BIT_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) ir_codes = RC_MAP_FUSIONHDTV_MCE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) case 0x40:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) name = "AVerMedia Cardbus remote";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) ir->get_key = get_key_avermedia_cardbus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) rc_proto = RC_PROTO_BIT_OTHER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) ir_codes = RC_MAP_AVERMEDIA_CARDBUS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) case 0x41:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) name = "AVerMedia EM78P153";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) ir->get_key = get_key_avermedia_cardbus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) rc_proto = RC_PROTO_BIT_OTHER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) /* RM-KV remote, seems to be same as RM-K6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) ir_codes = RC_MAP_AVERMEDIA_M733A_RM_K6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) case 0x71:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) name = "Hauppauge/Zilog Z8";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) ir->get_key = get_key_haup_xvr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) rc_proto = RC_PROTO_BIT_RC5 | RC_PROTO_BIT_RC6_MCE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) RC_PROTO_BIT_RC6_6A_32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) ir_codes = RC_MAP_HAUPPAUGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) ir->polling_interval = 125;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) probe_tx = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) /* Let the caller override settings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) if (client->dev.platform_data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) const struct IR_i2c_init_data *init_data =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) client->dev.platform_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) ir_codes = init_data->ir_codes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) rc = init_data->rc_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) name = init_data->name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) if (init_data->type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) rc_proto = init_data->type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) if (init_data->polling_interval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) ir->polling_interval = init_data->polling_interval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) switch (init_data->internal_get_key_func) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) case IR_KBD_GET_KEY_CUSTOM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) /* The bridge driver provided us its own function */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) ir->get_key = init_data->get_key;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) case IR_KBD_GET_KEY_PIXELVIEW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) ir->get_key = get_key_pixelview;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) case IR_KBD_GET_KEY_HAUP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) ir->get_key = get_key_haup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) case IR_KBD_GET_KEY_KNC1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) ir->get_key = get_key_knc1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) case IR_KBD_GET_KEY_FUSIONHDTV:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) ir->get_key = get_key_fusionhdtv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) case IR_KBD_GET_KEY_HAUP_XVR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) ir->get_key = get_key_haup_xvr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) case IR_KBD_GET_KEY_AVERMEDIA_CARDBUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) ir->get_key = get_key_avermedia_cardbus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) if (!rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) * If platform_data doesn't specify rc_dev, initialize it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) * internally
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) rc = rc_allocate_device(RC_DRIVER_SCANCODE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) if (!rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) ir->rc = rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) /* Make sure we are all setup before going on */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) if (!name || !ir->get_key || !rc_proto || !ir_codes) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) dev_warn(&client->dev, "Unsupported device at address 0x%02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) err = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) goto err_out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) ir->ir_codes = ir_codes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) snprintf(ir->phys, sizeof(ir->phys), "%s/%s", dev_name(&adap->dev),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) dev_name(&client->dev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) * Initialize input_dev fields
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) * It doesn't make sense to allow overriding them via platform_data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) rc->input_id.bustype = BUS_I2C;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) rc->input_phys = ir->phys;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) rc->device_name = name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) rc->dev.parent = &client->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) rc->priv = ir;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) rc->open = ir_open;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) rc->close = ir_close;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) * Initialize the other fields of rc_dev
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) rc->map_name = ir->ir_codes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) rc->allowed_protocols = rc_proto;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) if (!rc->driver_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) rc->driver_name = KBUILD_MODNAME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) mutex_init(&ir->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) INIT_DELAYED_WORK(&ir->work, ir_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) if (probe_tx) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) ir->tx_c = i2c_new_dummy_device(client->adapter, 0x70);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) if (IS_ERR(ir->tx_c)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) dev_err(&client->dev, "failed to setup tx i2c address");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) err = PTR_ERR(ir->tx_c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) goto err_out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) } else if (!zilog_init(ir)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) ir->carrier = 38000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) ir->duty_cycle = 40;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) rc->tx_ir = zilog_tx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) rc->s_tx_carrier = zilog_tx_carrier;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) rc->s_tx_duty_cycle = zilog_tx_duty_cycle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) err = rc_register_device(rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) goto err_out_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) err_out_free:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) if (!IS_ERR(ir->tx_c))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) i2c_unregister_device(ir->tx_c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) /* Only frees rc if it were allocated internally */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) rc_free_device(rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) static int ir_remove(struct i2c_client *client)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) struct IR_i2c *ir = i2c_get_clientdata(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) cancel_delayed_work_sync(&ir->work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) i2c_unregister_device(ir->tx_c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) rc_unregister_device(ir->rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) static const struct i2c_device_id ir_kbd_id[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) /* Generic entry for any IR receiver */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) { "ir_video", 0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) /* IR device specific entries should be added here */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) { "ir_z8f0811_haup", FLAG_TX },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) { "ir_z8f0811_hdpvr", FLAG_TX | FLAG_HDPVR },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) MODULE_DEVICE_TABLE(i2c, ir_kbd_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) static struct i2c_driver ir_kbd_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) .name = "ir-kbd-i2c",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) .probe = ir_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) .remove = ir_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) .id_table = ir_kbd_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) module_i2c_driver(ir_kbd_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) /* ----------------------------------------------------------------------- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) MODULE_AUTHOR("Gerd Knorr, Michal Kochanowicz, Christoph Bartelmus, Ulrich Mueller");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) MODULE_DESCRIPTION("input driver for i2c IR remote controls");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) MODULE_LICENSE("GPL");