From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755149AbbFMTQg (ORCPT ); Sat, 13 Jun 2015 15:16:36 -0400 Received: from mga01.intel.com ([192.55.52.88]:8172 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751970AbbFMTNO (ORCPT ); Sat, 13 Jun 2015 15:13:14 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.13,608,1427785200"; d="scan'208";a="710414795" From: Tomas Winkler To: gregkh@linuxfoundation.org Cc: arnd@arndb.de, linux-kernel@vger.kernel.org, Tomas Winkler Subject: [char-misc-next 16/17] mei: bus: also unregister the driver when removing the device Date: Sat, 13 Jun 2015 22:11:48 +0300 Message-Id: <1434222709-10966-17-git-send-email-tomas.winkler@intel.com> X-Mailer: git-send-email 2.4.2 In-Reply-To: <1434222709-10966-1-git-send-email-tomas.winkler@intel.com> References: <1434222709-10966-1-git-send-email-tomas.winkler@intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Signed-off-by: Tomas Winkler --- drivers/misc/mei/bus.c | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c index fa3eff216eff..33898bed6209 100644 --- a/drivers/misc/mei/bus.c +++ b/drivers/misc/mei/bus.c @@ -767,11 +767,43 @@ struct mei_cl_device *mei_cl_add_device(struct mei_device *bus, } EXPORT_SYMBOL_GPL(mei_cl_add_device); +/** + * mei_cl_bus_dev_stop - stop the driver + * + * @cldev: me client device + */ +static void mei_cl_bus_dev_stop(struct mei_cl_device *cldev) +{ + if (cldev->is_added) + device_release_driver(&cldev->dev); +} + +/** + * mei_cl_bus_dev_destroy - destroy me client devices object + * + * @cldev: me client device + */ +static void mei_cl_bus_dev_destroy(struct mei_cl_device *cldev) +{ + if (!cldev->is_added) + return; + + device_del(&cldev->dev); + + cldev->is_added = 0; + put_device(&cldev->dev); +} + +/** + * mei_cl_remove_device - remove a devices form the bus + * + * @cldev: me client device + */ void mei_cl_remove_device(struct mei_cl_device *cldev) { - device_unregister(&cldev->dev); + mei_cl_bus_dev_stop(cldev); + mei_cl_bus_dev_destroy(cldev); } -EXPORT_SYMBOL_GPL(mei_cl_remove_device); int __mei_cl_driver_register(struct mei_cl_driver *cldrv, struct module *owner) { -- 2.4.2