From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754313AbdEIC1z convert rfc822-to-8bit (ORCPT ); Mon, 8 May 2017 22:27:55 -0400 Received: from mail1.bemta8.messagelabs.com ([216.82.243.200]:45300 "EHLO mail1.bemta8.messagelabs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751958AbdEIC1x (ORCPT ); Mon, 8 May 2017 22:27:53 -0400 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprCKsWRWlGSWpSXmKPExsVyvPzgdF01TcF Ig90LFC3+TjrGbvHkQDujRfPi9WwWC9uWsFhc3jWHzYHV4/evSYwe++euYfdY3DeZ1ePzJrkA lijWzLyk/IoE1oyfU1azFTwQq3jdxd/AeEC4i5GLQ0jgKKPEh6bpbBDOVUaJqUenATmcHGwCh hJnV00Bs0UEHCV2HPwKVsQssJ5R4vqE60wgCWEBY4ljR65AFVlIfLn/hRnC1pPoa1kOFmcRUJ HY9OsVSxcjBwevgI/E4rV6IGFGATGJ76fWgI1hFhCXuPVkPpgtISAgsWTPeWYIW1Ti5eN/rBC 2jsTZ608YIWwDia1L97FA2AoSSw5OZYWYoydxYyrEzcwC2hLLFr4Gm8MrIChxcuYTlgmMIrOQ rJuFpGUWkpZZSFoWMLKsYtQoTi0qSy3SNTTSSyrKTM8oyU3MzNE1NLDQy00tLk5MT81JTCrWS 87P3cQIjC0GINjBOGGW8yFGSQ4mJVFen2KBSCG+pPyUyozE4oz4otKc1OJDjDIcHEoSvBfVBS OFBItS01Mr0jJzgFEOk5bg4FES4f0CkuYtLkjMLc5Mh0idYlSUEue9DZIQAElklObBtcESyyV GWSlhXkagQ4R4ClKLcjNLUOVfMYpzMCoJ8/4EmcKTmVcCN/0V0GImoMWBDAIgi0sSEVJSDYx7 Dgk7xTxNlXqjEL99Vz3b4YXHdt94PkE3cLrElV/u50zmCuz5+y34lOFsST3W+DN2jJd0/rWaM Bs/7gxew10+q3jjRylP4a/FsiJPajpXNVSFyK+a93kh97P62dd/G/2cKmZgMEdhk4Gg2u/jFa /4IvQTItYkb2hvskyefW7Wtgarzqakbc+UWIozEg21mIuKEwHTxTmCJwMAAA== X-Env-Sender: Gregory.Fong@virginorbit.com X-Msg-Ref: server-16.tower-132.messagelabs.com!1494296870!53301706!1 X-Originating-IP: [199.119.193.151] X-StarScan-Received: X-StarScan-Version: 9.4.12; banners=-,-,- X-VirusChecked: Checked From: Gregory Fong To: "linux-kernel@vger.kernel.org" CC: Greg Kroah-Hartman , Arnd Bergmann , Jonathan Corbet , "linux-doc@vger.kernel.org" Subject: [PATCH] misc: Implement devm_misc_register Thread-Topic: [PATCH] misc: Implement devm_misc_register Thread-Index: AQHSyGvZPrmZ962Veki7u69EtxXoQw== Date: Tue, 9 May 2017 02:27:48 +0000 Message-ID: <1494296848-91232-1-git-send-email-gregory.fong@virginorbit.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-exchange-messagesentrepresentingtype: 1 x-ms-exchange-transport-fromentityheader: Hosted x-originating-ip: [12.38.142.86] Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8BIT MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add device managed devm_misc_register() to allow simplifying some miscdevice code. Signed-off-by: Gregory Fong --- This seemed like it would be handy for removing a large chunk of the cleanup code in various miscdevice users. Let me know whether you think it'd be worth going ahead changing this throughout the codebase where appropriate. Documentation/driver-model/devres.txt | 5 ++++- drivers/char/misc.c | 37 +++++++++++++++++++++++++++++++++++ include/linux/miscdevice.h | 2 ++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/Documentation/driver-model/devres.txt b/Documentation/driver-model/devres.txt index bf34d5b..3b193f0 100644 --- a/Documentation/driver-model/devres.txt +++ b/Documentation/driver-model/devres.txt @@ -335,7 +335,10 @@ MEM devm_kzalloc() MFD - devm_mfd_add_devices() + devm_mfd_add_devices() + +MISC + devm_misc_register() PER-CPU MEM devm_alloc_percpu() diff --git a/drivers/char/misc.c b/drivers/char/misc.c index c9cd1ea..b7f653a 100644 --- a/drivers/char/misc.c +++ b/drivers/char/misc.c @@ -265,6 +265,43 @@ void misc_deregister(struct miscdevice *misc) EXPORT_SYMBOL(misc_register); EXPORT_SYMBOL(misc_deregister); +static void devm_misc_dereg(struct device *dev, void *res) +{ + misc_deregister(*(struct miscdevice **)res); +} + +/** + * devm_misc_register - Resource-managed misc_register + * @dev: Device to allocate miscdevice for + * @misc: Device structure filled by the device driver + * + * Managed misc_register. The miscdevice registered with this function is + * automatically unregistered on driver detach. This function calls + * misc_register() internally; refer to its documentation for more information. + * + * RETURNS: + * 0 on success, negative error number on failure. + */ +int devm_misc_register(struct device *dev, struct miscdevice *misc) +{ + struct miscdevice **misc_ptr; + int ret; + + misc_ptr = devres_alloc(devm_misc_dereg, sizeof(*misc_ptr), GFP_KERNEL); + if (!misc_ptr) + return -ENOMEM; + + *misc_ptr = misc; + ret = misc_register(misc); + if (!ret) + devres_add(dev, misc_ptr); + else + devres_free(misc_ptr); + + return ret; +} +EXPORT_SYMBOL(devm_misc_register); + static char *misc_devnode(struct device *dev, umode_t *mode) { struct miscdevice *c = dev_get_drvdata(dev); diff --git a/include/linux/miscdevice.h b/include/linux/miscdevice.h index 762b5fe..5289b3f 100644 --- a/include/linux/miscdevice.h +++ b/include/linux/miscdevice.h @@ -74,6 +74,8 @@ struct miscdevice { extern int misc_register(struct miscdevice *misc); extern void misc_deregister(struct miscdevice *misc); +int devm_misc_register(struct device *dev, struct miscdevice *misc); + /* * Helper macro for drivers that don't do anything special in the initcall. * This helps in eleminating of boilerplate code. -- 1.9.1