From patchwork Sat Apr 21 22:23:16 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hans-Frieder Vogt X-Patchwork-Id: 10796 Received: from mail.tu-berlin.de ([130.149.7.33]) by www.linuxtv.org with esmtp (Exim 4.72) (envelope-from ) id 1SLiiI-0002RA-R6 for patchwork@linuxtv.org; Sun, 22 Apr 2012 00:23:30 +0200 X-tubIT-Incoming-IP: 209.132.180.67 Received: from vger.kernel.org ([209.132.180.67]) by mail.tu-berlin.de (exim-4.75/mailfrontend-2) with esmtp for id 1SLiiH-0001ni-Iz; Sun, 22 Apr 2012 00:23:30 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751621Ab2DUWX1 (ORCPT ); Sat, 21 Apr 2012 18:23:27 -0400 Received: from mailout-de.gmx.net ([213.165.64.22]:38604 "HELO mailout-de.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1751022Ab2DUWX1 (ORCPT ); Sat, 21 Apr 2012 18:23:27 -0400 Received: (qmail invoked by alias); 21 Apr 2012 22:23:24 -0000 Received: from p4FC098B3.dip0.t-ipconnect.de (EHLO maximilian.localnet) [79.192.152.179] by mail.gmx.net (mp032) with SMTP; 22 Apr 2012 00:23:24 +0200 X-Authenticated: #24390674 X-Provags-ID: V01U2FsdGVkX1+7Z7EH6we7F9LOY/e0nHWt+ZQIMYbJ4Lxtm3c8Ie wfptnvelHfzN3N From: "Hans-Frieder Vogt" To: Antti Palosaari , Mauro Carvalho Chehab Subject: [PATCH v2] af9035: add remote control support Date: Sun, 22 Apr 2012 00:23:16 +0200 User-Agent: KMail/1.13.7 (Linux/3.3.2-a64; KDE/4.7.4; x86_64; ; ) Cc: linux-media@vger.kernel.org, Michael =?iso-8859-1?q?B=FCsch?= , Gianluca Gennari MIME-Version: 1.0 Message-Id: <201204220023.16452.hfvogt@gmx.net> X-Y-GMX-Trusted: 0 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-PMX-Version: 5.6.1.2065439, Antispam-Engine: 2.7.2.376379, Antispam-Data: 2012.4.21.221225 X-PMX-Spam: Gauge=IIIIIIII, Probability=8%, Report=' MULTIPLE_RCPTS 0.1, HTML_00_01 0.05, HTML_00_10 0.05, BODY_SIZE_3000_3999 0, BODY_SIZE_5000_LESS 0, BODY_SIZE_7000_LESS 0, URI_ENDS_IN_HTML 0, __ANY_URI 0, __CP_URI_IN_BODY 0, __CT 0, __CTE 0, __CT_TEXT_PLAIN 0, __HAS_MSGID 0, __HAS_X_MAILING_LIST 0, __MIME_TEXT_ONLY 0, __MIME_VERSION 0, __MULTIPLE_RCPTS_CC_X2 0, __SANE_MSGID 0, __STOCK_PHRASE_7 0, __SUBJ_ALPHA_END 0, __TO_MALFORMED_2 0, __URI_NO_WWW 0, __URI_NS , __USER_AGENT 0' af9035: support remote controls, version 2 of patch (Currently, no key maps are loaded). This version of the patch addresses comments from Antti and Mauro. Thank very much for your comments! Compared to the first version of the patch, the remote control is only activated after the EEPROM has been read and confirmed that the remote is not working in the HID mode. In addition, config variables are no longer needed and unnecessary checks have been removed. Signed-off-by: Hans-Frieder Vogt af9035.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ af9035.h | 1 2 files changed, 66 insertions(+) Hans-Frieder Vogt e-mail: hfvogt gmx .dot. net --- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff -Nupr a/drivers/media/dvb/dvb-usb/af9035.c b/drivers/media/dvb/dvb-usb/af9035.c --- a/drivers/media/dvb/dvb-usb/af9035.c 2012-04-10 05:45:26.000000000 +0200 +++ b/drivers/media/dvb/dvb-usb/af9035.c 2012-04-22 00:11:29.288907184 +0200 @@ -314,6 +314,37 @@ static struct i2c_algorithm af9035_i2c_a .functionality = af9035_i2c_functionality, }; +#define AF9035_POLL 250 +static int af9035_rc_query(struct dvb_usb_device *d) +{ + unsigned int key; + unsigned char b[4]; + int ret; + struct usb_req req = { CMD_IR_GET, 0, 0, NULL, 4, b }; + + ret = af9035_ctrl_msg(d->udev, &req); + if (ret < 0) + goto err; + + if ((b[2] + b[3]) == 0xff) { + if ((b[0] + b[1]) == 0xff) { + /* NEC */ + key = b[0] << 8 | b[2]; + } else { + /* ext. NEC */ + key = b[0] << 16 | b[1] << 8 | b[2]; + } + } else { + key = b[0] << 24 | b[1] << 16 | b[2] << 8 | b[3]; + } + + rc_keydown(d->rc_dev, key, 0); + +err: + /* ignore errors */ + return 0; +} + static int af9035_init(struct dvb_usb_device *d) { int ret, i; @@ -628,6 +659,32 @@ static int af9035_read_mac_address(struc for (i = 0; i < af9035_properties[0].num_adapters; i++) af9035_af9033_config[i].clock = clock_lut[tmp]; + ret = af9035_rd_reg(d, EEPROM_IR_MODE, &tmp); + if (ret < 0) + goto err; + pr_debug("%s: ir_mode=%02x\n", __func__, tmp); + + /* don't activate rc if in HID mode or if not available */ + if (tmp == 5) { + ret = af9035_rd_reg(d, EEPROM_IR_TYPE, &tmp); + if (ret < 0) + goto err; + pr_debug("%s: ir_type=%02x\n", __func__, tmp); + + switch (tmp) { + case 0: /* NEC */ + default: + d->props.rc.core.protocol = RC_TYPE_NEC; + d->props.rc.core.allowed_protos = RC_TYPE_NEC; + break; + case 1: /* RC6 */ + d->props.rc.core.protocol = RC_TYPE_RC6; + d->props.rc.core.allowed_protos = RC_TYPE_RC6; + break; + } + d->props.rc.core.rc_query = af9035_rc_query; + } + return 0; err: @@ -1004,6 +1061,14 @@ static struct dvb_usb_device_properties .i2c_algo = &af9035_i2c_algo, + .rc.core = { + .protocol = RC_TYPE_UNKNOWN, + .module_name = "af9035", + .rc_query = NULL, + .rc_interval = AF9035_POLL, + .allowed_protos = RC_TYPE_UNKNOWN, + .rc_codes = RC_MAP_EMPTY, + }, .num_device_descs = 5, .devices = { { diff -Nupr a/drivers/media/dvb/dvb-usb/af9035.h b/drivers/media/dvb/dvb-usb/af9035.h --- a/drivers/media/dvb/dvb-usb/af9035.h 2012-04-10 05:45:26.000000000 +0200 +++ b/drivers/media/dvb/dvb-usb/af9035.h 2012-04-21 17:07:49.201161565 +0200 @@ -110,6 +110,7 @@ u32 clock_lut_it9135[] = { #define CMD_MEM_WR 0x01 #define CMD_I2C_RD 0x02 #define CMD_I2C_WR 0x03 +#define CMD_IR_GET 0x18 #define CMD_FW_DL 0x21 #define CMD_FW_QUERYINFO 0x22 #define CMD_FW_BOOT 0x23