Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755878AbcKBKmB (ORCPT ); Wed, 2 Nov 2016 06:42:01 -0400 Received: from mailout4.samsung.com ([203.254.224.34]:49863 "EHLO mailout4.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752535AbcKBKkr (ORCPT ); Wed, 2 Nov 2016 06:40:47 -0400 X-AuditID: cbfee61b-f793d6d000005a2a-8f-5819c2a56b81 From: Andi Shyti To: Mauro Carvalho Chehab , Sean Young , Rob Herring , Mark Rutland , Richard Purdie , Jacek Anaszewski Cc: linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-leds@vger.kernel.org, linux-kernel@vger.kernel.org, Andi Shyti , Andi Shyti Subject: [PATCH v3 2/6] [media] rc-main: split setup and unregister functions Date: Wed, 02 Nov 2016 19:40:06 +0900 Message-id: <20161102104010.26959-3-andi.shyti@samsung.com> X-Mailer: git-send-email 2.10.1 In-reply-to: <20161102104010.26959-1-andi.shyti@samsung.com> References: <20161102104010.26959-1-andi.shyti@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprMIsWRmVeSWpSXmKPExsVy+t9jAd2lhyQjDKafNbPYfuQZq8XiH8+Z LOYfOcdq0Xv1OaPF5V1z2Cy2vlnHaNGzYSurxdLrF5ksVj+rsGjde4TdYveup6wWC59+Z3Hg 8Vgzbw2jx/Uln5g9Nq3qZPNY8sbaY0v/XXaPPfN/sHr0bVnF6PF5k1wAR5SbTUZqYkpqkUJq XnJ+SmZeuq1SaIibroWSQl5ibqqtUoSub0iQkkJZYk4pkGdkgAYcnAPcg5X07RLcMrp23Wcs aNOvOLKzvoHxrWoXIyeHhICJRG/nfzYIW0ziwr31QDYXh5DAUkaJ338WQDkfGSUm7v0BVsUm oCnRdPsHWEJE4C2jxKHprxhBEswCexkl9n70AbGFBXwlum8vYQKxWQRUJTofzQer4RWwlrg8 YQ47xDp5iQtXT7GA2JwCNhJ/Gx+DxYWAag5c388+gZF3ASPDKkaJ1ILkguKk9FyjvNRyveLE 3OLSvHS95PzcTYzgCHkmvYPx8C73Q4wCHIxKPLwFlyUihFgTy4orcw8xSnAwK4nwftsnGSHE m5JYWZValB9fVJqTWnyI0RTosInMUqLJ+cDozSuJNzQxNzE3NrAwt7Q0MVIS522c/SxcSCA9 sSQ1OzW1ILUIpo+Jg1OqgdHvs/ada9E5wQte77q24OuivJaUJy/Mpz60TNHrO3vxVYZWeuf2 ro7JAvzt/tmW2wQfbZ+5ueVd87QnEfZBs8/zVDk+uTDPOrvyjv0q7uK3xXvuzPT+07E6caPc wbXLn281Xrx78Tn7DQYyB5bsEa2aME9WPumZXfJWKY2Hn4OaN6sYneJaeY1DiaU4I9FQi7mo OBEAcjqwRqYCAAA= X-MTR: 20000000000000000@CPGS Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5804 Lines: 216 Move the input device allocation, map and protocol handling to different functions. Signed-off-by: Andi Shyti --- drivers/media/rc/rc-main.c | 143 +++++++++++++++++++++++++-------------------- 1 file changed, 81 insertions(+), 62 deletions(-) diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c index 9e19b73e..7ab1b32 100644 --- a/drivers/media/rc/rc-main.c +++ b/drivers/media/rc/rc-main.c @@ -1405,16 +1405,12 @@ void rc_free_device(struct rc_dev *dev) } EXPORT_SYMBOL_GPL(rc_free_device); -int rc_register_device(struct rc_dev *dev) +static int rc_setup_rx_device(struct rc_dev *dev) { - static bool raw_init = false; /* raw decoders loaded? */ - struct rc_map *rc_map; - const char *path; - int attr = 0; - int minor; int rc; + struct rc_map *rc_map; - if (!dev || !dev->map_name) + if (!dev->map_name) return -EINVAL; rc_map = rc_map_get(dev->map_name); @@ -1423,6 +1419,19 @@ int rc_register_device(struct rc_dev *dev) if (!rc_map || !rc_map->scan || rc_map->size == 0) return -EINVAL; + rc = ir_setkeytable(dev, rc_map); + if (rc) + return rc; + + if (dev->change_protocol) { + u64 rc_type = (1ll << rc_map->rc_type); + + rc = dev->change_protocol(dev, &rc_type); + if (rc < 0) + goto out_table; + dev->enabled_protocols = rc_type; + } + set_bit(EV_KEY, dev->input_dev->evbit); set_bit(EV_REP, dev->input_dev->evbit); set_bit(EV_MSC, dev->input_dev->evbit); @@ -1432,6 +1441,61 @@ int rc_register_device(struct rc_dev *dev) if (dev->close) dev->input_dev->close = ir_close; + /* + * Default delay of 250ms is too short for some protocols, especially + * since the timeout is currently set to 250ms. Increase it to 500ms, + * to avoid wrong repetition of the keycodes. Note that this must be + * set after the call to input_register_device(). + */ + dev->input_dev->rep[REP_DELAY] = 500; + + /* + * As a repeat event on protocols like RC-5 and NEC take as long as + * 110/114ms, using 33ms as a repeat period is not the right thing + * to do. + */ + dev->input_dev->rep[REP_PERIOD] = 125; + + /* rc_open will be called here */ + rc = input_register_device(dev->input_dev); + if (rc) + goto out_table; + + dev->input_dev->dev.parent = &dev->dev; + memcpy(&dev->input_dev->id, &dev->input_id, sizeof(dev->input_id)); + dev->input_dev->phys = dev->input_phys; + dev->input_dev->name = dev->input_name; + + return 0; + +out_table: + ir_free_table(&dev->rc_map); + + return rc; +} + +static void rc_free_rx_device(struct rc_dev *dev) +{ + if (!dev) + return; + + ir_free_table(&dev->rc_map); + + input_unregister_device(dev->input_dev); + dev->input_dev = NULL; +} + +int rc_register_device(struct rc_dev *dev) +{ + static bool raw_init = false; /* raw decoders loaded? */ + const char *path; + int attr = 0; + int minor; + int rc; + + if (!dev) + return -EINVAL; + minor = ida_simple_get(&rc_ida, 0, RC_DEV_MAX, GFP_KERNEL); if (minor < 0) return minor; @@ -1455,39 +1519,15 @@ int rc_register_device(struct rc_dev *dev) if (rc) goto out_unlock; - rc = ir_setkeytable(dev, rc_map); - if (rc) - goto out_dev; - - dev->input_dev->dev.parent = &dev->dev; - memcpy(&dev->input_dev->id, &dev->input_id, sizeof(dev->input_id)); - dev->input_dev->phys = dev->input_phys; - dev->input_dev->name = dev->input_name; - - rc = input_register_device(dev->input_dev); - if (rc) - goto out_table; - - /* - * Default delay of 250ms is too short for some protocols, especially - * since the timeout is currently set to 250ms. Increase it to 500ms, - * to avoid wrong repetition of the keycodes. Note that this must be - * set after the call to input_register_device(). - */ - dev->input_dev->rep[REP_DELAY] = 500; - - /* - * As a repeat event on protocols like RC-5 and NEC take as long as - * 110/114ms, using 33ms as a repeat period is not the right thing - * to do. - */ - dev->input_dev->rep[REP_PERIOD] = 125; - path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL); dev_info(&dev->dev, "%s as %s\n", dev->input_name ?: "Unspecified device", path ?: "N/A"); kfree(path); + rc = rc_setup_rx_device(dev); + if (rc) + goto out_dev; + if (dev->driver_type == RC_DRIVER_IR_RAW) { if (!raw_init) { request_module_nowait("ir-lirc-codec"); @@ -1495,36 +1535,20 @@ int rc_register_device(struct rc_dev *dev) } rc = ir_raw_event_register(dev); if (rc < 0) - goto out_input; - } - - if (dev->change_protocol) { - u64 rc_type = (1ll << rc_map->rc_type); - rc = dev->change_protocol(dev, &rc_type); - if (rc < 0) - goto out_raw; - dev->enabled_protocols = rc_type; + goto out_rx; } /* Allow the RC sysfs nodes to be accessible */ atomic_set(&dev->initialized, 1); - IR_dprintk(1, "Registered rc%u (driver: %s, remote: %s, mode %s)\n", + IR_dprintk(1, "Registered rc%u (driver: %s)\n", dev->minor, - dev->driver_name ? dev->driver_name : "unknown", - rc_map->name ? rc_map->name : "unknown", - dev->driver_type == RC_DRIVER_IR_RAW ? "raw" : "cooked"); + dev->driver_name ? dev->driver_name : "unknown"); return 0; -out_raw: - if (dev->driver_type == RC_DRIVER_IR_RAW) - ir_raw_event_unregister(dev); -out_input: - input_unregister_device(dev->input_dev); - dev->input_dev = NULL; -out_table: - ir_free_table(&dev->rc_map); +out_rx: + rc_free_rx_device(dev); out_dev: device_del(&dev->dev); out_unlock: @@ -1543,12 +1567,7 @@ void rc_unregister_device(struct rc_dev *dev) if (dev->driver_type == RC_DRIVER_IR_RAW) ir_raw_event_unregister(dev); - /* Freeing the table should also call the stop callback */ - ir_free_table(&dev->rc_map); - IR_dprintk(1, "Freed keycode table\n"); - - input_unregister_device(dev->input_dev); - dev->input_dev = NULL; + rc_free_rx_device(dev); device_del(&dev->dev); -- 2.10.1