hulk inclusion category: bugfix bugzilla: https://atomgit.com/src-openeuler/kernel/issues/14259 CVE: NA -------------------------------- This reverts commit 9b2f4d280b165327f2266447a58491137d0aa1fc. Fixes: 9b2f4d280b16 ("driver core: platform: use generic driver_override infrastructure") Signed-off-by: Lin Ruifeng <linruifeng4@huawei.com> --- drivers/base/platform.c | 57 ++++++++++++++++++++++++++++++--- drivers/slimbus/qcom-ngd-ctrl.c | 12 +------ include/linux/platform_device.h | 1 + 3 files changed, 54 insertions(+), 16 deletions(-) diff --git a/drivers/base/platform.c b/drivers/base/platform.c index 4a2e15e74a06..e332579744fb 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c @@ -268,6 +268,7 @@ static void platform_device_release(struct device *dev) kfree(pa->pdev.dev.platform_data); kfree(pa->pdev.mfd_cell); kfree(pa->pdev.resource); + kfree(pa->pdev.driver_override); kfree(pa); } @@ -881,8 +882,57 @@ static ssize_t modalias_show(struct device *dev, } static DEVICE_ATTR_RO(modalias); +static ssize_t driver_override_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct platform_device *pdev = to_platform_device(dev); + char *driver_override, *old, *cp; + + /* We need to keep extra room for a newline */ + if (count >= (PAGE_SIZE - 1)) + return -EINVAL; + + driver_override = kstrndup(buf, count, GFP_KERNEL); + if (!driver_override) + return -ENOMEM; + + cp = strchr(driver_override, '\n'); + if (cp) + *cp = '\0'; + + device_lock(dev); + old = pdev->driver_override; + if (strlen(driver_override)) { + pdev->driver_override = driver_override; + } else { + kfree(driver_override); + pdev->driver_override = NULL; + } + device_unlock(dev); + + kfree(old); + + return count; +} + +static ssize_t driver_override_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct platform_device *pdev = to_platform_device(dev); + ssize_t len; + + device_lock(dev); + len = sysfs_emit(buf, "%s\n", pdev->driver_override); + device_unlock(dev); + return len; +} +static DEVICE_ATTR_RW(driver_override); + + static struct attribute *platform_dev_attrs[] = { &dev_attr_modalias.attr, + &dev_attr_driver_override.attr, NULL, }; ATTRIBUTE_GROUPS(platform_dev); @@ -937,12 +987,10 @@ static int platform_match(struct device *dev, struct device_driver *drv) { struct platform_device *pdev = to_platform_device(dev); struct platform_driver *pdrv = to_platform_driver(drv); - int ret; /* When driver_override is set, only bind to the matching driver */ - ret = device_match_driver_override(dev, drv); - if (ret >= 0) - return ret; + if (pdev->driver_override) + return !strcmp(pdev->driver_override, drv->name); /* Attempt an OF style match first */ if (of_driver_match_device(dev, drv)) @@ -1129,7 +1177,6 @@ static const struct dev_pm_ops platform_dev_pm_ops = { struct bus_type platform_bus_type = { .name = "platform", .dev_groups = platform_dev_groups, - .driver_override = true, .match = platform_match, .uevent = platform_uevent, .dma_configure = platform_dma_configure, diff --git a/drivers/slimbus/qcom-ngd-ctrl.c b/drivers/slimbus/qcom-ngd-ctrl.c index 6d2c0d2f5696..9221ba7b7863 100644 --- a/drivers/slimbus/qcom-ngd-ctrl.c +++ b/drivers/slimbus/qcom-ngd-ctrl.c @@ -1329,7 +1329,6 @@ static int of_qcom_slim_ngd_register(struct device *parent, const struct of_device_id *match; struct device_node *node; u32 id; - int ret; match = of_match_node(qcom_slim_ngd_dt_match, parent->of_node); data = match->data; @@ -1346,18 +1345,9 @@ static int of_qcom_slim_ngd_register(struct device *parent, kfree(ngd); return -ENOMEM; } - - ret = device_set_driver_override(&ngd->pdev->dev, - QCOM_SLIM_NGD_DRV_NAME); - if (ret) { - platform_device_put(ngd->pdev); - kfree(ngd); - of_node_put(node); - return ret; - } - ngd->id = id; ngd->pdev->dev.parent = parent; + ngd->pdev->driver_override = QCOM_SLIM_NGD_DRV_NAME; ngd->pdev->dev.of_node = node; ctrl->ngd = ngd; platform_set_drvdata(ngd->pdev, ctrl); diff --git a/include/linux/platform_device.h b/include/linux/platform_device.h index eef1e77eb43b..9e5c98fcea8c 100644 --- a/include/linux/platform_device.h +++ b/include/linux/platform_device.h @@ -29,6 +29,7 @@ struct platform_device { struct resource *resource; const struct platform_device_id *id_entry; + char *driver_override; /* Driver name to force a match */ /* MFD cell pointer */ struct mfd_cell *mfd_cell; -- 2.43.0