diff mbox

[RFT] platform/x86: intel_pmc_ipc: Convert to use platform_device_register_full

Message ID 1474689248-5925-1-git-send-email-axel.lin@ingics.com (mailing list archive)
State Accepted, archived
Headers show

Commit Message

Axel Lin Sept. 24, 2016, 3:54 a.m. UTC
Use platform_device_register_full() instead of open-coded.

Signed-off-by: Axel Lin <axel.lin@ingics.com>
---
 drivers/platform/x86/intel_pmc_ipc.c | 110 +++++++++++------------------------
 1 file changed, 33 insertions(+), 77 deletions(-)

Comments

Aubrey Li Sept. 26, 2016, 11:21 p.m. UTC | #1
On 2016/9/24 11:54, Axel Lin wrote:
> Use platform_device_register_full() instead of open-coded.
> 
> Signed-off-by: Axel Lin <axel.lin@ingics.com>
> ---
>  drivers/platform/x86/intel_pmc_ipc.c | 110 +++++++++++------------------------
>  1 file changed, 33 insertions(+), 77 deletions(-)
> 
> diff --git a/drivers/platform/x86/intel_pmc_ipc.c b/drivers/platform/x86/intel_pmc_ipc.c
> index b86e1bc..665a9a1 100644
> --- a/drivers/platform/x86/intel_pmc_ipc.c
> +++ b/drivers/platform/x86/intel_pmc_ipc.c
> @@ -522,48 +522,36 @@ static struct resource telemetry_res[] = {
>  static int ipc_create_punit_device(void)
>  {
>  	struct platform_device *pdev;
> -	int ret;
> -
> -	pdev = platform_device_alloc(PUNIT_DEVICE_NAME, -1);
> -	if (!pdev) {
> -		dev_err(ipcdev.dev, "Failed to alloc punit platform device\n");
> -		return -ENOMEM;
> -	}
> -
> -	pdev->dev.parent = ipcdev.dev;
> -	ret = platform_device_add_resources(pdev, punit_res_array,
> -					    ARRAY_SIZE(punit_res_array));
> -	if (ret) {
> -		dev_err(ipcdev.dev, "Failed to add platform punit resources\n");
> -		goto err;
> -	}
> +	const struct platform_device_info pdevinfo = {
> +		.parent = ipcdev.dev,
> +		.name = PUNIT_DEVICE_NAME,
> +		.id = -1,
> +		.res = punit_res_array,
> +		.num_res = ARRAY_SIZE(punit_res_array),
> +		};
> +

Is it better to move the structure out of the routine?

Thanks,
-Aubrey



> +	pdev = platform_device_register_full(&pdevinfo);
> +	if (IS_ERR(pdev))
> +		return PTR_ERR(pdev);
>  
> -	ret = platform_device_add(pdev);
> -	if (ret) {
> -		dev_err(ipcdev.dev, "Failed to add punit platform device\n");
> -		goto err;
> -	}
>  	ipcdev.punit_dev = pdev;
>  
>  	return 0;
> -err:
> -	platform_device_put(pdev);
> -	return ret;
>  }
>  
>  static int ipc_create_tco_device(void)
>  {
>  	struct platform_device *pdev;
>  	struct resource *res;
> -	int ret;
> -
> -	pdev = platform_device_alloc(TCO_DEVICE_NAME, -1);
> -	if (!pdev) {
> -		dev_err(ipcdev.dev, "Failed to alloc tco platform device\n");
> -		return -ENOMEM;
> -	}
> -
> -	pdev->dev.parent = ipcdev.dev;
> +	const struct platform_device_info pdevinfo = {
> +		.parent = ipcdev.dev,
> +		.name = TCO_DEVICE_NAME,
> +		.id = -1,
> +		.res = tco_res,
> +		.num_res = ARRAY_SIZE(tco_res),
> +		.data = &tco_info,
> +		.size_data = sizeof(tco_info),
> +		};
>  
>  	res = tco_res + TCO_RESOURCE_ACPI_IO;
>  	res->start = ipcdev.acpi_io_base + TCO_BASE_OFFSET;
> @@ -577,45 +565,26 @@ static int ipc_create_tco_device(void)
>  	res->start = ipcdev.gcr_base + TCO_PMC_OFFSET;
>  	res->end = res->start + TCO_PMC_SIZE - 1;
>  
> -	ret = platform_device_add_resources(pdev, tco_res, ARRAY_SIZE(tco_res));
> -	if (ret) {
> -		dev_err(ipcdev.dev, "Failed to add tco platform resources\n");
> -		goto err;
> -	}
> -
> -	ret = platform_device_add_data(pdev, &tco_info, sizeof(tco_info));
> -	if (ret) {
> -		dev_err(ipcdev.dev, "Failed to add tco platform data\n");
> -		goto err;
> -	}
> +	pdev = platform_device_register_full(&pdevinfo);
> +	if (IS_ERR(pdev))
> +		return PTR_ERR(pdev);
>  
> -	ret = platform_device_add(pdev);
> -	if (ret) {
> -		dev_err(ipcdev.dev, "Failed to add tco platform device\n");
> -		goto err;
> -	}
>  	ipcdev.tco_dev = pdev;
>  
>  	return 0;
> -err:
> -	platform_device_put(pdev);
> -	return ret;
>  }
>  
>  static int ipc_create_telemetry_device(void)
>  {
>  	struct platform_device *pdev;
>  	struct resource *res;
> -	int ret;
> -
> -	pdev = platform_device_alloc(TELEMETRY_DEVICE_NAME, -1);
> -	if (!pdev) {
> -		dev_err(ipcdev.dev,
> -			"Failed to allocate telemetry platform device\n");
> -		return -ENOMEM;
> -	}
> -
> -	pdev->dev.parent = ipcdev.dev;
> +	const struct platform_device_info pdevinfo = {
> +		.parent = ipcdev.dev,
> +		.name = TELEMETRY_DEVICE_NAME,
> +		.id = -1,
> +		.res = telemetry_res,
> +		.num_res = ARRAY_SIZE(telemetry_res),
> +		};
>  
>  	res = telemetry_res + TELEMETRY_RESOURCE_PUNIT_SSRAM;
>  	res->start = ipcdev.telem_punit_ssram_base;
> @@ -625,26 +594,13 @@ static int ipc_create_telemetry_device(void)
>  	res->start = ipcdev.telem_pmc_ssram_base;
>  	res->end = res->start + ipcdev.telem_pmc_ssram_size - 1;
>  
> -	ret = platform_device_add_resources(pdev, telemetry_res,
> -					    ARRAY_SIZE(telemetry_res));
> -	if (ret) {
> -		dev_err(ipcdev.dev,
> -			"Failed to add telemetry platform resources\n");
> -		goto err;
> -	}
> +	pdev = platform_device_register_full(&pdevinfo);
> +	if (IS_ERR(pdev))
> +		return PTR_ERR(pdev);
>  
> -	ret = platform_device_add(pdev);
> -	if (ret) {
> -		dev_err(ipcdev.dev,
> -			"Failed to add telemetry platform device\n");
> -		goto err;
> -	}
>  	ipcdev.telemetry_dev = pdev;
>  
>  	return 0;
> -err:
> -	platform_device_put(pdev);
> -	return ret;
>  }
>  
>  static int ipc_create_pmc_devices(void)
> 

--
To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Axel Lin Sept. 27, 2016, 12:24 a.m. UTC | #2
2016-09-27 7:21 GMT+08:00 Li, Aubrey <aubrey.li@linux.intel.com>:
> On 2016/9/24 11:54, Axel Lin wrote:
>> Use platform_device_register_full() instead of open-coded.
>>
>> Signed-off-by: Axel Lin <axel.lin@ingics.com>
>> ---
>>  drivers/platform/x86/intel_pmc_ipc.c | 110 +++++++++++------------------------
>>  1 file changed, 33 insertions(+), 77 deletions(-)
>>
>> diff --git a/drivers/platform/x86/intel_pmc_ipc.c b/drivers/platform/x86/intel_pmc_ipc.c
>> index b86e1bc..665a9a1 100644
>> --- a/drivers/platform/x86/intel_pmc_ipc.c
>> +++ b/drivers/platform/x86/intel_pmc_ipc.c
>> @@ -522,48 +522,36 @@ static struct resource telemetry_res[] = {
>>  static int ipc_create_punit_device(void)
>>  {
>>       struct platform_device *pdev;
>> -     int ret;
>> -
>> -     pdev = platform_device_alloc(PUNIT_DEVICE_NAME, -1);
>> -     if (!pdev) {
>> -             dev_err(ipcdev.dev, "Failed to alloc punit platform device\n");
>> -             return -ENOMEM;
>> -     }
>> -
>> -     pdev->dev.parent = ipcdev.dev;
>> -     ret = platform_device_add_resources(pdev, punit_res_array,
>> -                                         ARRAY_SIZE(punit_res_array));
>> -     if (ret) {
>> -             dev_err(ipcdev.dev, "Failed to add platform punit resources\n");
>> -             goto err;
>> -     }
>> +     const struct platform_device_info pdevinfo = {
>> +             .parent = ipcdev.dev,
>> +             .name = PUNIT_DEVICE_NAME,
>> +             .id = -1,
>> +             .res = punit_res_array,
>> +             .num_res = ARRAY_SIZE(punit_res_array),
>> +             };
>> +
>
> Is it better to move the structure out of the routine?

Either is fine.

The struct platform_device_info is not very big as most of it's fields are
pointers. And this variable is for setup only so it's fine to use
local variable,
we don't need it once the function is done.
--
To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Darren Hart Sept. 28, 2016, 11:35 p.m. UTC | #3
On Sat, Sep 24, 2016 at 11:54:08AM +0800, Axel Lin wrote:
> Use platform_device_register_full() instead of open-coded.
> 

Thanks Axel. This looks good to me. My only comment would be that the change
eliminates all the dev_err calls which will reduce the debugability some. I've
queued this to testing, but Qipeng, please speak up if you have any objections.
Darren Hart Sept. 28, 2016, 11:36 p.m. UTC | #4
+LKML

Axel, please always include LKML on any patch.

Qipeng, any concerns?

On Sat, Sep 24, 2016 at 11:54:08AM +0800, Axel Lin wrote:
> Use platform_device_register_full() instead of open-coded.
> 
> Signed-off-by: Axel Lin <axel.lin@ingics.com>
> ---
>  drivers/platform/x86/intel_pmc_ipc.c | 110 +++++++++++------------------------
>  1 file changed, 33 insertions(+), 77 deletions(-)
> 
> diff --git a/drivers/platform/x86/intel_pmc_ipc.c b/drivers/platform/x86/intel_pmc_ipc.c
> index b86e1bc..665a9a1 100644
> --- a/drivers/platform/x86/intel_pmc_ipc.c
> +++ b/drivers/platform/x86/intel_pmc_ipc.c
> @@ -522,48 +522,36 @@ static struct resource telemetry_res[] = {
>  static int ipc_create_punit_device(void)
>  {
>  	struct platform_device *pdev;
> -	int ret;
> -
> -	pdev = platform_device_alloc(PUNIT_DEVICE_NAME, -1);
> -	if (!pdev) {
> -		dev_err(ipcdev.dev, "Failed to alloc punit platform device\n");
> -		return -ENOMEM;
> -	}
> -
> -	pdev->dev.parent = ipcdev.dev;
> -	ret = platform_device_add_resources(pdev, punit_res_array,
> -					    ARRAY_SIZE(punit_res_array));
> -	if (ret) {
> -		dev_err(ipcdev.dev, "Failed to add platform punit resources\n");
> -		goto err;
> -	}
> +	const struct platform_device_info pdevinfo = {
> +		.parent = ipcdev.dev,
> +		.name = PUNIT_DEVICE_NAME,
> +		.id = -1,
> +		.res = punit_res_array,
> +		.num_res = ARRAY_SIZE(punit_res_array),
> +		};
> +
> +	pdev = platform_device_register_full(&pdevinfo);
> +	if (IS_ERR(pdev))
> +		return PTR_ERR(pdev);
>  
> -	ret = platform_device_add(pdev);
> -	if (ret) {
> -		dev_err(ipcdev.dev, "Failed to add punit platform device\n");
> -		goto err;
> -	}
>  	ipcdev.punit_dev = pdev;
>  
>  	return 0;
> -err:
> -	platform_device_put(pdev);
> -	return ret;
>  }
>  
>  static int ipc_create_tco_device(void)
>  {
>  	struct platform_device *pdev;
>  	struct resource *res;
> -	int ret;
> -
> -	pdev = platform_device_alloc(TCO_DEVICE_NAME, -1);
> -	if (!pdev) {
> -		dev_err(ipcdev.dev, "Failed to alloc tco platform device\n");
> -		return -ENOMEM;
> -	}
> -
> -	pdev->dev.parent = ipcdev.dev;
> +	const struct platform_device_info pdevinfo = {
> +		.parent = ipcdev.dev,
> +		.name = TCO_DEVICE_NAME,
> +		.id = -1,
> +		.res = tco_res,
> +		.num_res = ARRAY_SIZE(tco_res),
> +		.data = &tco_info,
> +		.size_data = sizeof(tco_info),
> +		};
>  
>  	res = tco_res + TCO_RESOURCE_ACPI_IO;
>  	res->start = ipcdev.acpi_io_base + TCO_BASE_OFFSET;
> @@ -577,45 +565,26 @@ static int ipc_create_tco_device(void)
>  	res->start = ipcdev.gcr_base + TCO_PMC_OFFSET;
>  	res->end = res->start + TCO_PMC_SIZE - 1;
>  
> -	ret = platform_device_add_resources(pdev, tco_res, ARRAY_SIZE(tco_res));
> -	if (ret) {
> -		dev_err(ipcdev.dev, "Failed to add tco platform resources\n");
> -		goto err;
> -	}
> -
> -	ret = platform_device_add_data(pdev, &tco_info, sizeof(tco_info));
> -	if (ret) {
> -		dev_err(ipcdev.dev, "Failed to add tco platform data\n");
> -		goto err;
> -	}
> +	pdev = platform_device_register_full(&pdevinfo);
> +	if (IS_ERR(pdev))
> +		return PTR_ERR(pdev);
>  
> -	ret = platform_device_add(pdev);
> -	if (ret) {
> -		dev_err(ipcdev.dev, "Failed to add tco platform device\n");
> -		goto err;
> -	}
>  	ipcdev.tco_dev = pdev;
>  
>  	return 0;
> -err:
> -	platform_device_put(pdev);
> -	return ret;
>  }
>  
>  static int ipc_create_telemetry_device(void)
>  {
>  	struct platform_device *pdev;
>  	struct resource *res;
> -	int ret;
> -
> -	pdev = platform_device_alloc(TELEMETRY_DEVICE_NAME, -1);
> -	if (!pdev) {
> -		dev_err(ipcdev.dev,
> -			"Failed to allocate telemetry platform device\n");
> -		return -ENOMEM;
> -	}
> -
> -	pdev->dev.parent = ipcdev.dev;
> +	const struct platform_device_info pdevinfo = {
> +		.parent = ipcdev.dev,
> +		.name = TELEMETRY_DEVICE_NAME,
> +		.id = -1,
> +		.res = telemetry_res,
> +		.num_res = ARRAY_SIZE(telemetry_res),
> +		};
>  
>  	res = telemetry_res + TELEMETRY_RESOURCE_PUNIT_SSRAM;
>  	res->start = ipcdev.telem_punit_ssram_base;
> @@ -625,26 +594,13 @@ static int ipc_create_telemetry_device(void)
>  	res->start = ipcdev.telem_pmc_ssram_base;
>  	res->end = res->start + ipcdev.telem_pmc_ssram_size - 1;
>  
> -	ret = platform_device_add_resources(pdev, telemetry_res,
> -					    ARRAY_SIZE(telemetry_res));
> -	if (ret) {
> -		dev_err(ipcdev.dev,
> -			"Failed to add telemetry platform resources\n");
> -		goto err;
> -	}
> +	pdev = platform_device_register_full(&pdevinfo);
> +	if (IS_ERR(pdev))
> +		return PTR_ERR(pdev);
>  
> -	ret = platform_device_add(pdev);
> -	if (ret) {
> -		dev_err(ipcdev.dev,
> -			"Failed to add telemetry platform device\n");
> -		goto err;
> -	}
>  	ipcdev.telemetry_dev = pdev;
>  
>  	return 0;
> -err:
> -	platform_device_put(pdev);
> -	return ret;
>  }
>  
>  static int ipc_create_pmc_devices(void)
> -- 
> 2.7.4
> 
>
Axel Lin Sept. 29, 2016, 12:59 a.m. UTC | #5
2016-09-29 7:36 GMT+08:00 Darren Hart <dvhart@infradead.org>:
> +LKML
>
> Axel, please always include LKML on any patch.

I thought  +LKML is optional if you already have a dedicated
platform-driver-x86 maillist.
--
To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Darren Hart Sept. 29, 2016, 1:15 a.m. UTC | #6
On Thu, Sep 29, 2016 at 08:59:55AM +0800, Axel Lin wrote:
> 2016-09-29 7:36 GMT+08:00 Darren Hart <dvhart@infradead.org>:
> > +LKML
> >
> > Axel, please always include LKML on any patch.
> 
> I thought  +LKML is optional if you already have a dedicated
> platform-driver-x86 maillist.

Nope, LKML is never optional. All patches to the Linux Kernel must include LKML.
qipeng.zha Sept. 29, 2016, 1:51 a.m. UTC | #7
It's good to me, thanks.

>+LKML
>
>Axel, please always include LKML on any patch.
>
>Qipeng, any concerns?

On Sat, Sep 24, 2016 at 11:54:08AM +0800, Axel Lin wrote:
> Use platform_device_register_full() instead of open-coded.
> 
> Signed-off-by: Axel Lin <axel.lin@ingics.com>
> ---
>  drivers/platform/x86/intel_pmc_ipc.c | 110 
> +++++++++++------------------------
>  1 file changed, 33 insertions(+), 77 deletions(-)
> 
> diff --git a/drivers/platform/x86/intel_pmc_ipc.c 
> b/drivers/platform/x86/intel_pmc_ipc.c
> index b86e1bc..665a9a1 100644
> --- a/drivers/platform/x86/intel_pmc_ipc.c
> +++ b/drivers/platform/x86/intel_pmc_ipc.c
> @@ -522,48 +522,36 @@ static struct resource telemetry_res[] = {  
> static int ipc_create_punit_device(void)  {
>  	struct platform_device *pdev;
> -	int ret;
> -
> -	pdev = platform_device_alloc(PUNIT_DEVICE_NAME, -1);
> -	if (!pdev) {
> -		dev_err(ipcdev.dev, "Failed to alloc punit platform device\n");
> -		return -ENOMEM;
> -	}
> -
> -	pdev->dev.parent = ipcdev.dev;
> -	ret = platform_device_add_resources(pdev, punit_res_array,
> -					    ARRAY_SIZE(punit_res_array));
> -	if (ret) {
> -		dev_err(ipcdev.dev, "Failed to add platform punit resources\n");
> -		goto err;
> -	}
> +	const struct platform_device_info pdevinfo = {
> +		.parent = ipcdev.dev,
> +		.name = PUNIT_DEVICE_NAME,
> +		.id = -1,
> +		.res = punit_res_array,
> +		.num_res = ARRAY_SIZE(punit_res_array),
> +		};
> +
> +	pdev = platform_device_register_full(&pdevinfo);
> +	if (IS_ERR(pdev))
> +		return PTR_ERR(pdev);
>  
> -	ret = platform_device_add(pdev);
> -	if (ret) {
> -		dev_err(ipcdev.dev, "Failed to add punit platform device\n");
> -		goto err;
> -	}
>  	ipcdev.punit_dev = pdev;
>  
>  	return 0;
> -err:
> -	platform_device_put(pdev);
> -	return ret;
>  }
>  
>  static int ipc_create_tco_device(void)  {
>  	struct platform_device *pdev;
>  	struct resource *res;
> -	int ret;
> -
> -	pdev = platform_device_alloc(TCO_DEVICE_NAME, -1);
> -	if (!pdev) {
> -		dev_err(ipcdev.dev, "Failed to alloc tco platform device\n");
> -		return -ENOMEM;
> -	}
> -
> -	pdev->dev.parent = ipcdev.dev;
> +	const struct platform_device_info pdevinfo = {
> +		.parent = ipcdev.dev,
> +		.name = TCO_DEVICE_NAME,
> +		.id = -1,
> +		.res = tco_res,
> +		.num_res = ARRAY_SIZE(tco_res),
> +		.data = &tco_info,
> +		.size_data = sizeof(tco_info),
> +		};
>  
>  	res = tco_res + TCO_RESOURCE_ACPI_IO;
>  	res->start = ipcdev.acpi_io_base + TCO_BASE_OFFSET; @@ -577,45 
> +565,26 @@ static int ipc_create_tco_device(void)
>  	res->start = ipcdev.gcr_base + TCO_PMC_OFFSET;
>  	res->end = res->start + TCO_PMC_SIZE - 1;
>  
> -	ret = platform_device_add_resources(pdev, tco_res, ARRAY_SIZE(tco_res));
> -	if (ret) {
> -		dev_err(ipcdev.dev, "Failed to add tco platform resources\n");
> -		goto err;
> -	}
> -
> -	ret = platform_device_add_data(pdev, &tco_info, sizeof(tco_info));
> -	if (ret) {
> -		dev_err(ipcdev.dev, "Failed to add tco platform data\n");
> -		goto err;
> -	}
> +	pdev = platform_device_register_full(&pdevinfo);
> +	if (IS_ERR(pdev))
> +		return PTR_ERR(pdev);
>  
> -	ret = platform_device_add(pdev);
> -	if (ret) {
> -		dev_err(ipcdev.dev, "Failed to add tco platform device\n");
> -		goto err;
> -	}
>  	ipcdev.tco_dev = pdev;
>  
>  	return 0;
> -err:
> -	platform_device_put(pdev);
> -	return ret;
>  }
>  
>  static int ipc_create_telemetry_device(void)  {
>  	struct platform_device *pdev;
>  	struct resource *res;
> -	int ret;
> -
> -	pdev = platform_device_alloc(TELEMETRY_DEVICE_NAME, -1);
> -	if (!pdev) {
> -		dev_err(ipcdev.dev,
> -			"Failed to allocate telemetry platform device\n");
> -		return -ENOMEM;
> -	}
> -
> -	pdev->dev.parent = ipcdev.dev;
> +	const struct platform_device_info pdevinfo = {
> +		.parent = ipcdev.dev,
> +		.name = TELEMETRY_DEVICE_NAME,
> +		.id = -1,
> +		.res = telemetry_res,
> +		.num_res = ARRAY_SIZE(telemetry_res),
> +		};
>  
>  	res = telemetry_res + TELEMETRY_RESOURCE_PUNIT_SSRAM;
>  	res->start = ipcdev.telem_punit_ssram_base; @@ -625,26 +594,13 @@ 
> static int ipc_create_telemetry_device(void)
>  	res->start = ipcdev.telem_pmc_ssram_base;
>  	res->end = res->start + ipcdev.telem_pmc_ssram_size - 1;
>  
> -	ret = platform_device_add_resources(pdev, telemetry_res,
> -					    ARRAY_SIZE(telemetry_res));
> -	if (ret) {
> -		dev_err(ipcdev.dev,
> -			"Failed to add telemetry platform resources\n");
> -		goto err;
> -	}
> +	pdev = platform_device_register_full(&pdevinfo);
> +	if (IS_ERR(pdev))
> +		return PTR_ERR(pdev);
>  
> -	ret = platform_device_add(pdev);
> -	if (ret) {
> -		dev_err(ipcdev.dev,
> -			"Failed to add telemetry platform device\n");
> -		goto err;
> -	}
>  	ipcdev.telemetry_dev = pdev;
>  
>  	return 0;
> -err:
> -	platform_device_put(pdev);
> -	return ret;
>  }
>  
>  static int ipc_create_pmc_devices(void)
> --
> 2.7.4
> 
> 

--
Darren Hart
Intel Open Source Technology Center
--
To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/platform/x86/intel_pmc_ipc.c b/drivers/platform/x86/intel_pmc_ipc.c
index b86e1bc..665a9a1 100644
--- a/drivers/platform/x86/intel_pmc_ipc.c
+++ b/drivers/platform/x86/intel_pmc_ipc.c
@@ -522,48 +522,36 @@  static struct resource telemetry_res[] = {
 static int ipc_create_punit_device(void)
 {
 	struct platform_device *pdev;
-	int ret;
-
-	pdev = platform_device_alloc(PUNIT_DEVICE_NAME, -1);
-	if (!pdev) {
-		dev_err(ipcdev.dev, "Failed to alloc punit platform device\n");
-		return -ENOMEM;
-	}
-
-	pdev->dev.parent = ipcdev.dev;
-	ret = platform_device_add_resources(pdev, punit_res_array,
-					    ARRAY_SIZE(punit_res_array));
-	if (ret) {
-		dev_err(ipcdev.dev, "Failed to add platform punit resources\n");
-		goto err;
-	}
+	const struct platform_device_info pdevinfo = {
+		.parent = ipcdev.dev,
+		.name = PUNIT_DEVICE_NAME,
+		.id = -1,
+		.res = punit_res_array,
+		.num_res = ARRAY_SIZE(punit_res_array),
+		};
+
+	pdev = platform_device_register_full(&pdevinfo);
+	if (IS_ERR(pdev))
+		return PTR_ERR(pdev);
 
-	ret = platform_device_add(pdev);
-	if (ret) {
-		dev_err(ipcdev.dev, "Failed to add punit platform device\n");
-		goto err;
-	}
 	ipcdev.punit_dev = pdev;
 
 	return 0;
-err:
-	platform_device_put(pdev);
-	return ret;
 }
 
 static int ipc_create_tco_device(void)
 {
 	struct platform_device *pdev;
 	struct resource *res;
-	int ret;
-
-	pdev = platform_device_alloc(TCO_DEVICE_NAME, -1);
-	if (!pdev) {
-		dev_err(ipcdev.dev, "Failed to alloc tco platform device\n");
-		return -ENOMEM;
-	}
-
-	pdev->dev.parent = ipcdev.dev;
+	const struct platform_device_info pdevinfo = {
+		.parent = ipcdev.dev,
+		.name = TCO_DEVICE_NAME,
+		.id = -1,
+		.res = tco_res,
+		.num_res = ARRAY_SIZE(tco_res),
+		.data = &tco_info,
+		.size_data = sizeof(tco_info),
+		};
 
 	res = tco_res + TCO_RESOURCE_ACPI_IO;
 	res->start = ipcdev.acpi_io_base + TCO_BASE_OFFSET;
@@ -577,45 +565,26 @@  static int ipc_create_tco_device(void)
 	res->start = ipcdev.gcr_base + TCO_PMC_OFFSET;
 	res->end = res->start + TCO_PMC_SIZE - 1;
 
-	ret = platform_device_add_resources(pdev, tco_res, ARRAY_SIZE(tco_res));
-	if (ret) {
-		dev_err(ipcdev.dev, "Failed to add tco platform resources\n");
-		goto err;
-	}
-
-	ret = platform_device_add_data(pdev, &tco_info, sizeof(tco_info));
-	if (ret) {
-		dev_err(ipcdev.dev, "Failed to add tco platform data\n");
-		goto err;
-	}
+	pdev = platform_device_register_full(&pdevinfo);
+	if (IS_ERR(pdev))
+		return PTR_ERR(pdev);
 
-	ret = platform_device_add(pdev);
-	if (ret) {
-		dev_err(ipcdev.dev, "Failed to add tco platform device\n");
-		goto err;
-	}
 	ipcdev.tco_dev = pdev;
 
 	return 0;
-err:
-	platform_device_put(pdev);
-	return ret;
 }
 
 static int ipc_create_telemetry_device(void)
 {
 	struct platform_device *pdev;
 	struct resource *res;
-	int ret;
-
-	pdev = platform_device_alloc(TELEMETRY_DEVICE_NAME, -1);
-	if (!pdev) {
-		dev_err(ipcdev.dev,
-			"Failed to allocate telemetry platform device\n");
-		return -ENOMEM;
-	}
-
-	pdev->dev.parent = ipcdev.dev;
+	const struct platform_device_info pdevinfo = {
+		.parent = ipcdev.dev,
+		.name = TELEMETRY_DEVICE_NAME,
+		.id = -1,
+		.res = telemetry_res,
+		.num_res = ARRAY_SIZE(telemetry_res),
+		};
 
 	res = telemetry_res + TELEMETRY_RESOURCE_PUNIT_SSRAM;
 	res->start = ipcdev.telem_punit_ssram_base;
@@ -625,26 +594,13 @@  static int ipc_create_telemetry_device(void)
 	res->start = ipcdev.telem_pmc_ssram_base;
 	res->end = res->start + ipcdev.telem_pmc_ssram_size - 1;
 
-	ret = platform_device_add_resources(pdev, telemetry_res,
-					    ARRAY_SIZE(telemetry_res));
-	if (ret) {
-		dev_err(ipcdev.dev,
-			"Failed to add telemetry platform resources\n");
-		goto err;
-	}
+	pdev = platform_device_register_full(&pdevinfo);
+	if (IS_ERR(pdev))
+		return PTR_ERR(pdev);
 
-	ret = platform_device_add(pdev);
-	if (ret) {
-		dev_err(ipcdev.dev,
-			"Failed to add telemetry platform device\n");
-		goto err;
-	}
 	ipcdev.telemetry_dev = pdev;
 
 	return 0;
-err:
-	platform_device_put(pdev);
-	return ret;
 }
 
 static int ipc_create_pmc_devices(void)