Re: [PATCHv5 6/7] base: platform: name the device already during allocation

From: Vivek Gautam
Date: Mon Feb 02 2015 - 07:12:19 EST


Hi Kishon,


On Thu, Nov 20, 2014 at 2:51 PM, Kishon Vijay Abraham I <kishon@xxxxxx> wrote:
> Hi Greg,
>
> On Wednesday 19 November 2014 08:58 PM, Heikki Krogerus wrote:
>> The device name is usually required when assigning resources
>> like clocks to platform devices. The problem is that the
>> device name is not know before platform_device_add is called
>> and that can be too late as the drivers may have already
>> requested the resources when the function returns. By naming
>> the device already in platform_device_alloc, the resources
>> can be assigned before platform_device_add is called.
>>
>> This change allows different kinds of probe drivers to pass
>> forward their resources to the actual driver. The first
>> place where we need it is dwc3 controllers host glue code
>> (drivers/usb/dwc3/host.c) to pass the phy's to xhci.
>>
>> Signed-off-by: Heikki Krogerus <heikki.krogerus@xxxxxxxxxxxxxxx>
>> Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
>
> Are you fine with this change? Can it come via linux-phy tree?
>
> Thanks
> Kishon

I think this patch missed getting into 3.19 or 20 now.
Is there some other tree where it got pulled in, coz i can't see it in
linux-next also ?

>> ---
>> drivers/base/platform.c | 69 +++++++++++++++++++++++++++++--------------------
>> 1 file changed, 41 insertions(+), 28 deletions(-)
>>
>> diff --git a/drivers/base/platform.c b/drivers/base/platform.c
>> index cdb6c07..d2217f3 100644
>> --- a/drivers/base/platform.c
>> +++ b/drivers/base/platform.c
>> @@ -195,11 +195,41 @@ void platform_device_put(struct platform_device *pdev)
>> }
>> EXPORT_SYMBOL_GPL(platform_device_put);
>>
>> +static int pdev_set_name(struct platform_device *pdev)
>> +{
>> + int ret;
>> +
>> + switch (pdev->id) {
>> + default:
>> + return dev_set_name(&pdev->dev, "%s.%d", pdev->name, pdev->id);
>> + case PLATFORM_DEVID_NONE:
>> + return dev_set_name(&pdev->dev, "%s", pdev->name);
>> + case PLATFORM_DEVID_AUTO:
>> + /*
>> + * Automatically allocated device ID. We mark it as such so
>> + * that we remember it must be freed, and we append a suffix
>> + * to avoid namespace collision with explicit IDs.
>> + */
>> + ret = ida_simple_get(&platform_devid_ida, 0, 0, GFP_KERNEL);
>> + if (ret < 0)
>> + return ret;
>> + pdev->id = ret;
>> + pdev->id_auto = true;
>> + return dev_set_name(&pdev->dev, "%s.%d.auto", pdev->name,
>> + pdev->id);
>> + }
>> +
>> + return 0;
>> +}
>> +
>> static void platform_device_release(struct device *dev)
>> {
>> struct platform_object *pa = container_of(dev, struct platform_object,
>> pdev.dev);
>>
>> + if (pa->pdev.id_auto)
>> + ida_simple_remove(&platform_devid_ida, pa->pdev.id);
>> +
>> of_device_node_put(&pa->pdev.dev);
>> kfree(pa->pdev.dev.platform_data);
>> kfree(pa->pdev.mfd_cell);
>> @@ -228,6 +258,10 @@ struct platform_device *platform_device_alloc(const char *name, int id)
>> device_initialize(&pa->pdev.dev);
>> pa->pdev.dev.release = platform_device_release;
>> arch_setup_pdev_archdata(&pa->pdev);
>> + if (pdev_set_name(&pa->pdev)) {
>> + kfree(pa);
>> + return NULL;
>> + }
>> }
>>
>> return pa ? &pa->pdev : NULL;
>> @@ -308,28 +342,6 @@ int platform_device_add(struct platform_device *pdev)
>>
>> pdev->dev.bus = &platform_bus_type;
>>
>> - switch (pdev->id) {
>> - default:
>> - dev_set_name(&pdev->dev, "%s.%d", pdev->name, pdev->id);
>> - break;
>> - case PLATFORM_DEVID_NONE:
>> - dev_set_name(&pdev->dev, "%s", pdev->name);
>> - break;
>> - case PLATFORM_DEVID_AUTO:
>> - /*
>> - * Automatically allocated device ID. We mark it as such so
>> - * that we remember it must be freed, and we append a suffix
>> - * to avoid namespace collision with explicit IDs.
>> - */
>> - ret = ida_simple_get(&platform_devid_ida, 0, 0, GFP_KERNEL);
>> - if (ret < 0)
>> - goto err_out;
>> - pdev->id = ret;
>> - pdev->id_auto = true;
>> - dev_set_name(&pdev->dev, "%s.%d.auto", pdev->name, pdev->id);
>> - break;
>> - }
>> -
>> for (i = 0; i < pdev->num_resources; i++) {
>> struct resource *p, *r = &pdev->resource[i];
>>
>> @@ -372,7 +384,6 @@ int platform_device_add(struct platform_device *pdev)
>> release_resource(r);
>> }
>>
>> - err_out:
>> return ret;
>> }
>> EXPORT_SYMBOL_GPL(platform_device_add);
>> @@ -392,11 +403,6 @@ void platform_device_del(struct platform_device *pdev)
>> if (pdev) {
>> device_del(&pdev->dev);
>>
>> - if (pdev->id_auto) {
>> - ida_simple_remove(&platform_devid_ida, pdev->id);
>> - pdev->id = PLATFORM_DEVID_AUTO;
>> - }
>> -
>> for (i = 0; i < pdev->num_resources; i++) {
>> struct resource *r = &pdev->resource[i];
>> unsigned long type = resource_type(r);
>> @@ -414,8 +420,15 @@ EXPORT_SYMBOL_GPL(platform_device_del);
>> */
>> int platform_device_register(struct platform_device *pdev)
>> {
>> + int ret;
>> +
>> device_initialize(&pdev->dev);
>> arch_setup_pdev_archdata(pdev);
>> +
>> + ret = pdev_set_name(pdev);
>> + if (ret)
>> + return ret;
>> +
>> return platform_device_add(pdev);
>> }
>> EXPORT_SYMBOL_GPL(platform_device_register);
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/



--
Best Regards
Vivek Gautam
Samsung R&D Institute, Bangalore
India
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/