From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933839AbcIAV13 (ORCPT ); Thu, 1 Sep 2016 17:27:29 -0400 Received: from mailout2.samsung.com ([203.254.224.25]:56696 "EHLO mailout2.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751372AbcIAV1U (ORCPT ); Thu, 1 Sep 2016 17:27:20 -0400 X-AuditID: cbfee68e-f79cb6d000006cfe-eb-57c86276fec2 From: Andi Shyti To: Mauro Carvalho Chehab , Sean Young , Rob Herring , Mark Rutland Cc: linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Andi Shyti , Andi Shyti Subject: [PATCH v2 2/7] [media] rc-main: split setup and unregister functions Date: Fri, 02 Sep 2016 02:16:24 +0900 Message-id: <20160901171629.15422-3-andi.shyti@samsung.com> X-Mailer: git-send-email 2.9.3 In-reply-to: <20160901171629.15422-1-andi.shyti@samsung.com> References: <20160901171629.15422-1-andi.shyti@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrPLMWRmVeSWpSXmKPExsWyRsSkQLcs6US4wZUTIhbbjzxjtVj84zmT xfwj51gtLu+aw2bRs2Erq8XS6xeZLFY/q7Bo3XuE3WLh0+8sDpwea+atYfS4vuQTs8emVZ1s HkveWHts6b/L7tG3ZRWjx+dNcgHsUVw2Kak5mWWpRfp2CVwZN/69ZixYqV+xvu81cwNju1oX IyeHhICJxOSTS9ggbDGJC/fWA9lcHEICKxglfq3ZxQ5T9PzjQlaIxFJGiVNnWtghnI+MEmuv PwRrZxPQlGi6/QOsXURgFqPE66k/mEESzAILGSU2fFYGsYUFfCW2zGljAbFZBFQl/rw+wQhi 8wpYS+zcdpARYp2cxKVtX8B6OQVsJCafvswKYgsB1RxYPxlsgYTALnaJFefWsUMMEpD4NvkQ 0FAOoISsxKYDzBBzJCUOrrjBMoFReAEjwypG0dSC5ILipPQiI73ixNzi0rx0veT83E2MwHg4 /e9Z3w7GmwesDzEKcDAq8fByGJ0IF2JNLCuuzD3EaAq0YSKzlGhyPjDq8kriDY3NjCxMTUyN jcwtzZTEeROkfgYLCaQnlqRmp6YWpBbFF5XmpBYfYmTi4JRqYPQ4kOQkfNfoLmu86c255wPC LCesUbn5W27rxQPSMvVnZLynvynauTyvWrj9zI68hcwrU2PvNLw6FL3Z6ViE5Vc7riMGClfK A0JXPlFz2zgzceXLFeffmK2aqFGVXDZnSo7X9EiJ2+oVUk2y2w0e1ZSXC2bIp/+Kfmr3jE3S 65+PZtCrczdnmCmxFGckGmoxFxUnAgCr/pUaggIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrDIsWRmVeSWpSXmKPExsVy+t9jAd3SpBPhBrsnGFlsP/KM1WLxj+dM FvOPnGO1uLxrDptFz4atrBZLr19kslj9rMKide8RdouFT7+zOHB6rJm3htHj+pJPzB6bVnWy eSx5Y+2xpf8uu0ffllWMHp83yQWwRzUw2mSkJqakFimk5iXnp2TmpdsqeQfHO8ebmhkY6hpa WpgrKeQl5qbaKrn4BOi6ZeYAXaakUJaYUwoUCkgsLlbSt8M0ITTETdcCpjFC1zckCK7HyAAN JKxhzLjx7zVjwUr9ivV9r5kbGNvVuhg5OSQETCSef1zICmGLSVy4t56ti5GLQ0hgKaPEqTMt 7BDOR0aJtdcfsoFUsQloSjTd/gFWJSIwi1Hi9dQfzCAJZoGFjBIbPiuD2MICvhJb5rSxgNgs AqoSf16fYASxeQWsJXZuO8gIsU5O4tK2L2C9nAI2EpNPXwY7Qwio5sD6yWwTGHkXMDKsYpRI LUguKE5KzzXKSy3XK07MLS7NS9dLzs/dxAiOuWfSOxgP73I/xCjAwajEw9sQcCJciDWxrLgy 9xCjBAezkggvWzxQiDclsbIqtSg/vqg0J7X4EKMp0GETmaVEk/OB6SCvJN7Q2MTMyNLI3NDC yNhcSZz38f91YUIC6YklqdmpqQWpRTB9TBycUg2MQixMnKl8zq9Tk20k68Jvpi24K7x6lTOj 5RmWEPuaqtPlrku3seq2PdpSdflU18nM0H+Ra9QiZGb+X9OpvPj2nUOHazZ8jmhsuKB66lT5 9rssese+hPJPTL8iJd7HktqTIq59j/1nd3/57F0BzwxWp8oGKigJ9/m6P3uhw8FQc+Z1/NKd za+UWIozEg21mIuKEwFFMEW6zwIAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Move the input device allocation, map and protocol handling to different functions. Signed-off-by: Andi Shyti --- drivers/media/rc/rc-main.c | 144 +++++++++++++++++++++++++-------------------- 1 file changed, 81 insertions(+), 63 deletions(-) diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c index b28a8d1..7961083 100644 --- a/drivers/media/rc/rc-main.c +++ b/drivers/media/rc/rc-main.c @@ -1403,16 +1403,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); @@ -1421,6 +1417,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); @@ -1430,6 +1439,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; @@ -1453,40 +1517,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; - - /* - * 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; - 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"); @@ -1494,36 +1533,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: @@ -1542,12 +1565,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.9.3