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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux