From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754058AbbFMTOZ (ORCPT ); Sat, 13 Jun 2015 15:14:25 -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 S1752066AbbFMTNE (ORCPT ); Sat, 13 Jun 2015 15:13:04 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.13,608,1427785200"; d="scan'208";a="710414709" From: Tomas Winkler To: gregkh@linuxfoundation.org Cc: arnd@arndb.de, linux-kernel@vger.kernel.org, Tomas Winkler Subject: [char-misc-next 10/17] mei: bus: revamp probe and remove functions Date: Sat, 13 Jun 2015 22:11:42 +0300 Message-Id: <1434222709-10966-11-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 Instead of generating device id on the fly during probing we find the matching id entry on the device id table. Get bus the module reference counter so it cannot be unloaded after the driver has bounded to the client device Signed-off-by: Tomas Winkler --- drivers/misc/mei/bus.c | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c index 1a9c8d7906c9..ee0a9e50ac76 100644 --- a/drivers/misc/mei/bus.c +++ b/drivers/misc/mei/bus.c @@ -445,30 +445,49 @@ static int mei_cl_device_match(struct device *dev, struct device_driver *drv) return 0; } +/** + * mei_cl_device_probe - bus probe function + * + * @dev: device + * + * Return: 0 on success; < 0 otherwise + */ static int mei_cl_device_probe(struct device *dev) { - struct mei_cl_device *cldev = to_mei_cl_device(dev); + struct mei_cl_device *cldev; struct mei_cl_driver *cldrv; - struct mei_cl_device_id id; + const struct mei_cl_device_id *id; + + cldev = to_mei_cl_device(dev); + cldrv = to_mei_cl_driver(dev->driver); if (!cldev) return 0; - cldrv = to_mei_cl_driver(dev->driver); if (!cldrv || !cldrv->probe) return -ENODEV; - dev_dbg(dev, "Device probe\n"); + id = mei_cl_device_find(cldev, cldrv); + if (!id) + return -ENODEV; - strlcpy(id.name, cldev->name, sizeof(id.name)); + __module_get(THIS_MODULE); - return cldrv->probe(cldev, &id); + return cldrv->probe(cldev, id); } +/** + * mei_cl_device_remove - remove device from the bus + * + * @dev: device + * + * Return: 0 on success; < 0 otherwise + */ static int mei_cl_device_remove(struct device *dev) { struct mei_cl_device *cldev = to_mei_cl_device(dev); struct mei_cl_driver *cldrv; + int ret = 0; if (!cldev || !dev->driver) return 0; @@ -479,13 +498,13 @@ static int mei_cl_device_remove(struct device *dev) } cldrv = to_mei_cl_driver(dev->driver); - if (!cldrv->remove) { - dev->driver = NULL; + if (cldrv->remove) + ret = cldrv->remove(cldev); - return 0; - } + module_put(THIS_MODULE); + dev->driver = NULL; + return ret; - return cldrv->remove(cldev); } /** -- 2.4.2