Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/809933/?format=api
{ "id": 809933, "url": "http://patchwork.ozlabs.org/api/patches/809933/?format=api", "web_url": "http://patchwork.ozlabs.org/project/rtc-linux/patch/3e7a05561840a7dd4fa945e4969edb834d9870b6.1504588701.git.sathyanarayanan.kuppuswamy@linux.intel.com/", "project": { "id": 9, "url": "http://patchwork.ozlabs.org/api/projects/9/?format=api", "name": "Linux RTC development", "link_name": "rtc-linux", "list_id": "linux-rtc.vger.kernel.org", "list_email": "linux-rtc@vger.kernel.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<3e7a05561840a7dd4fa945e4969edb834d9870b6.1504588701.git.sathyanarayanan.kuppuswamy@linux.intel.com>", "list_archive_url": null, "date": "2017-09-05T05:37:22", "name": "[RFC,v3,2/7] platform/x86: intel_pmc_ipc: Use MFD framework to create dependent devices", "commit_ref": null, "pull_url": null, "state": "not-applicable", "archived": false, "hash": "4903ca1e9e873afe21f3d795ab490593ba34e4e4", "submitter": { "id": 66129, "url": "http://patchwork.ozlabs.org/api/people/66129/?format=api", "name": "Kuppuswamy Sathyanarayanan", "email": "sathyanarayanan.kuppuswamy@linux.intel.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/rtc-linux/patch/3e7a05561840a7dd4fa945e4969edb834d9870b6.1504588701.git.sathyanarayanan.kuppuswamy@linux.intel.com/mbox/", "series": [ { "id": 1490, "url": "http://patchwork.ozlabs.org/api/series/1490/?format=api", "web_url": "http://patchwork.ozlabs.org/project/rtc-linux/list/?series=1490", "date": "2017-09-05T05:37:20", "name": "PMC/PUNIT IPC driver cleanup", "version": 3, "mbox": "http://patchwork.ozlabs.org/series/1490/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/809933/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/809933/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<linux-rtc-owner@vger.kernel.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org", "Authentication-Results": "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=linux-rtc-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)", "Received": [ "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xmbCG4v2vz9sNq\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue, 5 Sep 2017 15:40:10 +1000 (AEST)", "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1754249AbdIEFjm (ORCPT <rfc822;incoming@patchwork.ozlabs.org>);\n\tTue, 5 Sep 2017 01:39:42 -0400", "from mga01.intel.com ([192.55.52.88]:3891 \"EHLO mga01.intel.com\"\n\trhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP\n\tid S1751176AbdIEFiO (ORCPT <rfc822;linux-rtc@vger.kernel.org>);\n\tTue, 5 Sep 2017 01:38:14 -0400", "from orsmga005.jf.intel.com ([10.7.209.41])\n\tby fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t04 Sep 2017 22:38:13 -0700", "from skuppusw-desk.jf.intel.com ([10.7.198.92])\n\tby orsmga005.jf.intel.com with ESMTP; 04 Sep 2017 22:38:12 -0700" ], "X-ExtLoop1": "1", "X-IronPort-AV": "E=Sophos;i=\"5.41,478,1498546800\"; d=\"scan'208\";a=\"145505094\"", "From": "sathyanarayanan.kuppuswamy@linux.intel.com", "To": "a.zummo@towertech.it, x86@kernel.org, wim@iguana.be,\n\tmingo@redhat.com, alexandre.belloni@free-electrons.com,\n\tqipeng.zha@intel.com, hpa@zytor.com, dvhart@infradead.org,\n\ttglx@linutronix.de, lee.jones@linaro.org, andy@infradead.org,\n\tsouvik.k.chakravarty@intel.com", "Cc": "linux-rtc@vger.kernel.org, linux-watchdog@vger.kernel.org,\n\tlinux-kernel@vger.kernel.org, platform-driver-x86@vger.kernel.org,\n\tsathyaosid@gmail.com, Kuppuswamy Sathyanarayanan \n\t<sathyanarayanan.kuppuswamy@linux.intel.com>", "Subject": "[RFC v3 2/7] platform/x86: intel_pmc_ipc: Use MFD framework to\n\tcreate dependent devices", "Date": "Mon, 4 Sep 2017 22:37:22 -0700", "Message-Id": "<3e7a05561840a7dd4fa945e4969edb834d9870b6.1504588701.git.sathyanarayanan.kuppuswamy@linux.intel.com>", "X-Mailer": "git-send-email 2.7.4", "In-Reply-To": "<cover.1504588701.git.sathyanarayanan.kuppuswamy@linux.intel.com>", "References": "<cover.1504588701.git.sathyanarayanan.kuppuswamy@linux.intel.com>", "Sender": "linux-rtc-owner@vger.kernel.org", "Precedence": "bulk", "List-ID": "<linux-rtc.vger.kernel.org>", "X-Mailing-List": "linux-rtc@vger.kernel.org" }, "content": "From: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>\n\nCurrently, we have lot of repetitive code in dependent device resource\nallocation and device creation handling code. This logic can be improved if\nwe use MFD framework for dependent device creation. This patch adds this\nsupport.\n\nSigned-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>\n---\n drivers/platform/x86/intel_pmc_ipc.c | 397 +++++++++++++----------------------\n 1 file changed, 142 insertions(+), 255 deletions(-)", "diff": "diff --git a/drivers/platform/x86/intel_pmc_ipc.c b/drivers/platform/x86/intel_pmc_ipc.c\nindex 5eef649..021dcf6 100644\n--- a/drivers/platform/x86/intel_pmc_ipc.c\n+++ b/drivers/platform/x86/intel_pmc_ipc.c\n@@ -33,6 +33,7 @@\n #include <linux/suspend.h>\n #include <linux/acpi.h>\n #include <linux/io-64-nonatomic-lo-hi.h>\n+#include <linux/mfd/core.h>\n \n #include <asm/intel_pmc_ipc.h>\n \n@@ -87,6 +88,7 @@\n #define PLAT_RESOURCE_ISP_IFACE_INDEX\t5\n #define PLAT_RESOURCE_GTD_DATA_INDEX\t6\n #define PLAT_RESOURCE_GTD_IFACE_INDEX\t7\n+#define PLAT_RESOURCE_MEM_MAX_INDEX\t8\n #define PLAT_RESOURCE_ACPI_IO_INDEX\t0\n \n /*\n@@ -105,8 +107,6 @@\n #define TELEM_SSRAM_SIZE\t\t240\n #define TELEM_PMC_SSRAM_OFFSET\t\t0x1B00\n #define TELEM_PUNIT_SSRAM_OFFSET\t0x1A00\n-#define TCO_PMC_OFFSET\t\t\t0x8\n-#define TCO_PMC_SIZE\t\t\t0x4\n \n /* PMC register bit definitions */\n \n@@ -123,25 +123,12 @@ static struct intel_pmc_ipc_dev {\n \tint cmd;\n \tstruct completion cmd_complete;\n \n-\t/* The following PMC BARs share the same ACPI device with the IPC */\n-\tresource_size_t acpi_io_base;\n-\tint acpi_io_size;\n-\tstruct platform_device *tco_dev;\n-\n \t/* gcr */\n \tvoid __iomem *gcr_mem_base;\n \tbool has_gcr_regs;\n \n-\t/* punit */\n-\tstruct platform_device *punit_dev;\n-\n \t/* Telemetry */\n-\tresource_size_t telem_pmc_ssram_base;\n-\tresource_size_t telem_punit_ssram_base;\n-\tint telem_pmc_ssram_size;\n-\tint telem_punit_ssram_size;\n \tu8 telem_res_inval;\n-\tstruct platform_device *telemetry_dev;\n } ipcdev;\n \n static char *ipc_err_sources[] = {\n@@ -589,44 +576,6 @@ static const struct attribute_group intel_ipc_group = {\n \t.attrs = intel_ipc_attrs,\n };\n \n-static struct resource punit_res_array[] = {\n-\t/* Punit BIOS */\n-\t{\n-\t\t.flags = IORESOURCE_MEM,\n-\t},\n-\t{\n-\t\t.flags = IORESOURCE_MEM,\n-\t},\n-\t/* Punit ISP */\n-\t{\n-\t\t.flags = IORESOURCE_MEM,\n-\t},\n-\t{\n-\t\t.flags = IORESOURCE_MEM,\n-\t},\n-\t/* Punit GTD */\n-\t{\n-\t\t.flags = IORESOURCE_MEM,\n-\t},\n-\t{\n-\t\t.flags = IORESOURCE_MEM,\n-\t},\n-};\n-\n-#define TCO_RESOURCE_ACPI_IO\t\t0\n-#define TCO_RESOURCE_SMI_EN_IO\t\t1\n-#define TCO_RESOURCE_GCR_MEM\t\t2\n-static struct resource tco_res[] = {\n-\t/* ACPI - TCO */\n-\t{\n-\t\t.flags = IORESOURCE_IO,\n-\t},\n-\t/* ACPI - SMI */\n-\t{\n-\t\t.flags = IORESOURCE_IO,\n-\t},\n-};\n-\n static struct itco_wdt_platform_data tco_info = {\n \t.name = \"Apollo Lake SoC\",\n \t.version = 5,\n@@ -634,237 +583,186 @@ static struct itco_wdt_platform_data tco_info = {\n \t.update_no_reboot_bit = update_no_reboot_bit,\n };\n \n-#define TELEMETRY_RESOURCE_PUNIT_SSRAM\t0\n-#define TELEMETRY_RESOURCE_PMC_SSRAM\t1\n-static struct resource telemetry_res[] = {\n-\t/*Telemetry*/\n-\t{\n-\t\t.flags = IORESOURCE_MEM,\n-\t},\n-\t{\n-\t\t.flags = IORESOURCE_MEM,\n-\t},\n-};\n-\n-static int ipc_create_punit_device(void)\n+static int ipc_create_punit_device(struct platform_device *pdev)\n {\n-\tstruct platform_device *pdev;\n-\tconst struct platform_device_info pdevinfo = {\n-\t\t.parent = ipcdev.dev,\n-\t\t.name = PUNIT_DEVICE_NAME,\n-\t\t.id = -1,\n-\t\t.res = punit_res_array,\n-\t\t.num_res = ARRAY_SIZE(punit_res_array),\n+\tstruct resource *res;\n+\tstatic struct resource punit_res[PLAT_RESOURCE_MEM_MAX_INDEX];\n+\tstatic struct mfd_cell punit_cell;\n+\tint mindex, pindex = 0;\n+\n+\tfor (mindex = 0; mindex <= PLAT_RESOURCE_MEM_MAX_INDEX; mindex++) {\n+\n+\t\tres = platform_get_resource(pdev, IORESOURCE_MEM, mindex);\n+\n+\t\tswitch (mindex) {\n+\t\t/* Get PUNIT resources */\n+\t\tcase PLAT_RESOURCE_BIOS_DATA_INDEX:\n+\t\tcase PLAT_RESOURCE_BIOS_IFACE_INDEX:\n+\t\t\t/* BIOS resources are required, so return error if not\n+\t\t\t * available */\n+\t\t\tif (!res) {\n+\t\t\t\tdev_err(&pdev->dev,\n+\t\t\t\t\t\"Failed to get punit mem resource %d\\n\",\n+\t\t\t\t\tpindex);\n+\t\t\t\treturn -ENXIO;\n+\t\t\t}\n+\t\tcase PLAT_RESOURCE_ISP_DATA_INDEX:\n+\t\tcase PLAT_RESOURCE_ISP_IFACE_INDEX:\n+\t\tcase PLAT_RESOURCE_GTD_DATA_INDEX:\n+\t\tcase PLAT_RESOURCE_GTD_IFACE_INDEX:\n+\t\t\t/* if not valid resource, skip the rest of steps */\n+\t\t\tif (!res) {\n+\t\t\t\tpindex++;\n+\t\t\t\tcontinue;\n+\t\t\t}\n+\t\t\tmemcpy(&punit_res[pindex], res, sizeof(*res));\n+\t\t\tpunit_res[pindex].flags = IORESOURCE_MEM;\n+\t\t\tdev_info(&pdev->dev, \"PUNIT memory res: %pR\\n\",\n+\t\t\t\t\t&punit_res[pindex]);\n+\t\t\tpindex++;\n+\t\t\tbreak;\n \t\t};\n+\t}\n \n-\tpdev = platform_device_register_full(&pdevinfo);\n-\tif (IS_ERR(pdev))\n-\t\treturn PTR_ERR(pdev);\n-\n-\tipcdev.punit_dev = pdev;\n+\t/* Create PUNIT IPC MFD cell */\n+\tpunit_cell.name = PUNIT_DEVICE_NAME;\n+\tpunit_cell.id = -1;\n+\tpunit_cell.num_resources = ARRAY_SIZE(punit_res);\n+\tpunit_cell.resources = punit_res;\n+\tpunit_cell.ignore_resource_conflicts = 1;\n \n-\treturn 0;\n+\treturn devm_mfd_add_devices(&pdev->dev, PLATFORM_DEVID_AUTO,\n+\t\t\t&punit_cell, 1, NULL, 0, NULL);\n }\n \n-static int ipc_create_tco_device(void)\n+static int ipc_create_wdt_device(struct platform_device *pdev)\n {\n-\tstruct platform_device *pdev;\n+\tstatic struct resource wdt_ipc_res[2];\n \tstruct resource *res;\n-\tconst struct platform_device_info pdevinfo = {\n-\t\t.parent = ipcdev.dev,\n-\t\t.name = TCO_DEVICE_NAME,\n-\t\t.id = -1,\n-\t\t.res = tco_res,\n-\t\t.num_res = ARRAY_SIZE(tco_res),\n-\t\t.data = &tco_info,\n-\t\t.size_data = sizeof(tco_info),\n-\t\t};\n-\n-\tres = tco_res + TCO_RESOURCE_ACPI_IO;\n-\tres->start = ipcdev.acpi_io_base + TCO_BASE_OFFSET;\n-\tres->end = res->start + TCO_REGS_SIZE - 1;\n+\tstatic struct mfd_cell wdt_cell;\n \n-\tres = tco_res + TCO_RESOURCE_SMI_EN_IO;\n-\tres->start = ipcdev.acpi_io_base + SMI_EN_OFFSET;\n-\tres->end = res->start + SMI_EN_SIZE - 1;\n+\t/* If we have ACPI based watchdog use that instead, othewise create\n+\t * a MFD cell for iTCO watchdog*/\n+\tif (acpi_has_watchdog())\n+\t\treturn 0;\n \n-\tpdev = platform_device_register_full(&pdevinfo);\n-\tif (IS_ERR(pdev))\n-\t\treturn PTR_ERR(pdev);\n-\n-\tipcdev.tco_dev = pdev;\n+\t/* Get iTCO watchdog resources */\n+\tres = platform_get_resource(pdev, IORESOURCE_IO,\n+\t\t\t\t PLAT_RESOURCE_ACPI_IO_INDEX);\n+\tif (!res) {\n+\t\tdev_err(&pdev->dev, \"Failed to get wdt resource\\n\");\n+\t\treturn -ENXIO;\n+\t}\n \n-\treturn 0;\n+\twdt_ipc_res[0].start = res->start + TCO_BASE_OFFSET;\n+\twdt_ipc_res[0].end = res->start + TCO_BASE_OFFSET +\n+\t\tTCO_REGS_SIZE - 1;\n+\twdt_ipc_res[0].flags = IORESOURCE_IO;\n+\twdt_ipc_res[1].start = res->start + SMI_EN_OFFSET;\n+\twdt_ipc_res[1].end = res->start +\n+\t\tSMI_EN_OFFSET + SMI_EN_SIZE - 1;\n+\twdt_ipc_res[1].flags = IORESOURCE_IO;\n+\n+\tdev_info(&pdev->dev, \"watchdog res 0: %pR\\n\",\n+\t\t\t&wdt_ipc_res[0]);\n+\tdev_info(&pdev->dev, \"watchdog res 1: %pR\\n\",\n+\t\t\t&wdt_ipc_res[1]);\n+\n+\twdt_cell.name = TCO_DEVICE_NAME;\n+\twdt_cell.id = -1;\n+\twdt_cell.platform_data = &tco_info;\n+\twdt_cell.pdata_size = sizeof(tco_info);\n+\twdt_cell.num_resources = ARRAY_SIZE(wdt_ipc_res);\n+\twdt_cell.resources = wdt_ipc_res;\n+\twdt_cell.ignore_resource_conflicts = 1;\n+\n+\treturn devm_mfd_add_devices(&pdev->dev, PLATFORM_DEVID_AUTO,\n+\t\t\t&wdt_cell, 1, NULL, 0, NULL);\n }\n \n-static int ipc_create_telemetry_device(void)\n+static int ipc_create_telemetry_device(struct platform_device *pdev)\n {\n-\tstruct platform_device *pdev;\n+\tstatic struct resource telemetry_ipc_res[2];\n \tstruct resource *res;\n-\tconst struct platform_device_info pdevinfo = {\n-\t\t.parent = ipcdev.dev,\n-\t\t.name = TELEMETRY_DEVICE_NAME,\n-\t\t.id = -1,\n-\t\t.res = telemetry_res,\n-\t\t.num_res = ARRAY_SIZE(telemetry_res),\n-\t\t};\n-\n-\tres = telemetry_res + TELEMETRY_RESOURCE_PUNIT_SSRAM;\n-\tres->start = ipcdev.telem_punit_ssram_base;\n-\tres->end = res->start + ipcdev.telem_punit_ssram_size - 1;\n+\tstatic struct mfd_cell telemetry_cell;\n \n-\tres = telemetry_res + TELEMETRY_RESOURCE_PMC_SSRAM;\n-\tres->start = ipcdev.telem_pmc_ssram_base;\n-\tres->end = res->start + ipcdev.telem_pmc_ssram_size - 1;\n-\n-\tpdev = platform_device_register_full(&pdevinfo);\n-\tif (IS_ERR(pdev))\n-\t\treturn PTR_ERR(pdev);\n-\n-\tipcdev.telemetry_dev = pdev;\n+\t/* Get telemetry resources */\n+\tres = platform_get_resource(pdev, IORESOURCE_MEM,\n+\t\t\t\t PLAT_RESOURCE_TELEM_SSRAM_INDEX);\n+\tif (!res) {\n+\t\tdev_err(&pdev->dev, \"Failed to get telemetry resource\\n\");\n+\t\treturn -ENXIO;\n+\t}\n \n-\treturn 0;\n+\ttelemetry_ipc_res[0].start = res->start +\n+\t\tTELEM_PUNIT_SSRAM_OFFSET;\n+\ttelemetry_ipc_res[0].end = res->start +\n+\t\tTELEM_PUNIT_SSRAM_OFFSET + TELEM_SSRAM_SIZE - 1;\n+\ttelemetry_ipc_res[0].flags = IORESOURCE_MEM;\n+\ttelemetry_ipc_res[1].start = res->start + TELEM_PMC_SSRAM_OFFSET;\n+\ttelemetry_ipc_res[1].end = res->start +\n+\t\tTELEM_PMC_SSRAM_OFFSET + TELEM_SSRAM_SIZE - 1;\n+\ttelemetry_ipc_res[1].flags = IORESOURCE_MEM;\n+\n+\tdev_info(&pdev->dev, \"Telemetry res 0: %pR\\n\",\n+\t\t\t&telemetry_ipc_res[0]);\n+\tdev_info(&pdev->dev, \"Telemetry res 1: %pR\\n\",\n+\t\t\t&telemetry_ipc_res[1]);\n+\n+\ttelemetry_cell.name = TELEMETRY_DEVICE_NAME;\n+\ttelemetry_cell.id = -1;\n+\ttelemetry_cell.num_resources = ARRAY_SIZE(telemetry_ipc_res);\n+\ttelemetry_cell.resources = telemetry_ipc_res;\n+\ttelemetry_cell.ignore_resource_conflicts = 1;\n+\n+\treturn devm_mfd_add_devices(&pdev->dev, PLATFORM_DEVID_AUTO,\n+\t\t\t&telemetry_cell, 1, NULL, 0, NULL);\n }\n \n-static int ipc_create_pmc_devices(void)\n+static int ipc_create_pmc_devices(struct platform_device *pdev)\n {\n \tint ret;\n \n-\t/* If we have ACPI based watchdog use that instead */\n-\tif (!acpi_has_watchdog()) {\n-\t\tret = ipc_create_tco_device();\n-\t\tif (ret) {\n-\t\t\tdev_err(ipcdev.dev, \"Failed to add tco platform device\\n\");\n-\t\t\treturn ret;\n-\t\t}\n-\t}\n+\tret = ipc_create_punit_device(pdev);\n+\tif (ret < 0)\n+\t\treturn ret;\n \n-\tret = ipc_create_punit_device();\n-\tif (ret) {\n-\t\tdev_err(ipcdev.dev, \"Failed to add punit platform device\\n\");\n-\t\tplatform_device_unregister(ipcdev.tco_dev);\n-\t}\n+\tret = ipc_create_wdt_device(pdev);\n+\tif (ret < 0)\n+\t\treturn ret;\n \n-\tif (!ipcdev.telem_res_inval) {\n-\t\tret = ipc_create_telemetry_device();\n-\t\tif (ret)\n-\t\t\tdev_warn(ipcdev.dev,\n-\t\t\t\t\"Failed to add telemetry platform device\\n\");\n-\t}\n+\tret = ipc_create_telemetry_device(pdev);\n+\tif (ret < 0)\n+\t\treturn ret;\n \n-\treturn ret;\n+\treturn 0;\n }\n \n static int ipc_plat_get_res(struct platform_device *pdev)\n {\n-\tstruct resource *res, *punit_res;\n+\tstruct resource *res;\n \tvoid __iomem *addr;\n-\tint size;\n-\n-\tres = platform_get_resource(pdev, IORESOURCE_IO,\n-\t\t\t\t PLAT_RESOURCE_ACPI_IO_INDEX);\n-\tif (!res) {\n-\t\tdev_err(&pdev->dev, \"Failed to get io resource\\n\");\n-\t\treturn -ENXIO;\n-\t}\n-\tsize = resource_size(res);\n-\tipcdev.acpi_io_base = res->start;\n-\tipcdev.acpi_io_size = size;\n-\tdev_info(&pdev->dev, \"io res: %pR\\n\", res);\n-\n-\tpunit_res = punit_res_array;\n-\t/* This is index 0 to cover BIOS data register */\n-\tres = platform_get_resource(pdev, IORESOURCE_MEM,\n-\t\t\t\t PLAT_RESOURCE_BIOS_DATA_INDEX);\n-\tif (!res) {\n-\t\tdev_err(&pdev->dev, \"Failed to get res of punit BIOS data\\n\");\n-\t\treturn -ENXIO;\n-\t}\n-\t*punit_res = *res;\n-\tdev_info(&pdev->dev, \"punit BIOS data res: %pR\\n\", res);\n \n-\t/* This is index 1 to cover BIOS interface register */\n+\t/* Get IPC resources */\n \tres = platform_get_resource(pdev, IORESOURCE_MEM,\n-\t\t\t\t PLAT_RESOURCE_BIOS_IFACE_INDEX);\n+\t\t\tPLAT_RESOURCE_IPC_INDEX);\n \tif (!res) {\n-\t\tdev_err(&pdev->dev, \"Failed to get res of punit BIOS iface\\n\");\n+\t\tdev_err(&pdev->dev, \"Failed to get IPC resources\\n\");\n \t\treturn -ENXIO;\n \t}\n-\t*++punit_res = *res;\n-\tdev_info(&pdev->dev, \"punit BIOS interface res: %pR\\n\", res);\n-\n-\t/* This is index 2 to cover ISP data register, optional */\n-\tres = platform_get_resource(pdev, IORESOURCE_MEM,\n-\t\t\t\t PLAT_RESOURCE_ISP_DATA_INDEX);\n-\t++punit_res;\n-\tif (res) {\n-\t\t*punit_res = *res;\n-\t\tdev_info(&pdev->dev, \"punit ISP data res: %pR\\n\", res);\n-\t}\n-\n-\t/* This is index 3 to cover ISP interface register, optional */\n-\tres = platform_get_resource(pdev, IORESOURCE_MEM,\n-\t\t\t\t PLAT_RESOURCE_ISP_IFACE_INDEX);\n-\t++punit_res;\n-\tif (res) {\n-\t\t*punit_res = *res;\n-\t\tdev_info(&pdev->dev, \"punit ISP interface res: %pR\\n\", res);\n-\t}\n \n-\t/* This is index 4 to cover GTD data register, optional */\n-\tres = platform_get_resource(pdev, IORESOURCE_MEM,\n-\t\t\t\t PLAT_RESOURCE_GTD_DATA_INDEX);\n-\t++punit_res;\n-\tif (res) {\n-\t\t*punit_res = *res;\n-\t\tdev_info(&pdev->dev, \"punit GTD data res: %pR\\n\", res);\n-\t}\n-\n-\t/* This is index 5 to cover GTD interface register, optional */\n-\tres = platform_get_resource(pdev, IORESOURCE_MEM,\n-\t\t\t\t PLAT_RESOURCE_GTD_IFACE_INDEX);\n-\t++punit_res;\n-\tif (res) {\n-\t\t*punit_res = *res;\n-\t\tdev_info(&pdev->dev, \"punit GTD interface res: %pR\\n\", res);\n-\t}\n-\n-\tres = platform_get_resource(pdev, IORESOURCE_MEM,\n-\t\t\t\t PLAT_RESOURCE_IPC_INDEX);\n-\tif (!res) {\n-\t\tdev_err(&pdev->dev, \"Failed to get ipc resource\\n\");\n-\t\treturn -ENXIO;\n-\t}\n \tres->end = (res->start + PLAT_RESOURCE_IPC_SIZE +\n-\t\t PLAT_RESOURCE_GCR_SIZE - 1);\n+\t\t\tPLAT_RESOURCE_GCR_SIZE - 1);\n \n \taddr = devm_ioremap_resource(&pdev->dev, res);\n \tif (IS_ERR(addr)) {\n-\t\tdev_err(&pdev->dev,\n-\t\t\t\"PMC I/O memory remapping failed\\n\");\n-\t\treturn PTR_ERR(addr);\n+\t\tdev_err(&pdev->dev, \"PMC I/O memory remapping failed\\n\");\n+\t\t\treturn PTR_ERR(addr);\n \t}\n \n \tipcdev.ipc_base = addr;\n-\n \tipcdev.gcr_mem_base = addr + PLAT_RESOURCE_GCR_OFFSET;\n-\tdev_info(&pdev->dev, \"ipc res: %pR\\n\", res);\n-\n-\tipcdev.telem_res_inval = 0;\n-\tres = platform_get_resource(pdev, IORESOURCE_MEM,\n-\t\t\t\t PLAT_RESOURCE_TELEM_SSRAM_INDEX);\n-\tif (!res) {\n-\t\tdev_err(&pdev->dev, \"Failed to get telemetry ssram resource\\n\");\n-\t\tipcdev.telem_res_inval = 1;\n-\t} else {\n-\t\tipcdev.telem_punit_ssram_base = res->start +\n-\t\t\t\t\t\tTELEM_PUNIT_SSRAM_OFFSET;\n-\t\tipcdev.telem_punit_ssram_size = TELEM_SSRAM_SIZE;\n-\t\tipcdev.telem_pmc_ssram_base = res->start +\n-\t\t\t\t\t\tTELEM_PMC_SSRAM_OFFSET;\n-\t\tipcdev.telem_pmc_ssram_size = TELEM_SSRAM_SIZE;\n-\t\tdev_info(&pdev->dev, \"telemetry ssram res: %pR\\n\", res);\n-\t}\n+\tdev_info(&pdev->dev, \"PMC IPC resource %pR\\n\", res);\n \n \treturn 0;\n }\n@@ -919,7 +817,7 @@ static int ipc_plat_probe(struct platform_device *pdev)\n \t\treturn ret;\n \t}\n \n-\tret = ipc_create_pmc_devices();\n+\tret = ipc_create_pmc_devices(pdev);\n \tif (ret) {\n \t\tdev_err(&pdev->dev, \"Failed to create pmc devices\\n\");\n \t\treturn ret;\n@@ -928,37 +826,26 @@ static int ipc_plat_probe(struct platform_device *pdev)\n \tif (devm_request_irq(&pdev->dev, ipcdev.irq, ioc, IRQF_NO_SUSPEND,\n \t\t\t \"intel_pmc_ipc\", &ipcdev)) {\n \t\tdev_err(&pdev->dev, \"Failed to request irq\\n\");\n-\t\tret = -EBUSY;\n-\t\tgoto unregister_devices;\n+\t\treturn -EBUSY;\n \t}\n \n \tret = sysfs_create_group(&pdev->dev.kobj, &intel_ipc_group);\n \tif (ret) {\n \t\tdev_err(&pdev->dev, \"Failed to create sysfs group %d\\n\",\n \t\t\tret);\n-\t\tgoto unregister_devices;\n+\t\treturn ret;\n \t}\n \n \tipcdev.has_gcr_regs = true;\n \n \treturn 0;\n-\n-unregister_devices:\n-\tplatform_device_unregister(ipcdev.tco_dev);\n-\tplatform_device_unregister(ipcdev.punit_dev);\n-\tplatform_device_unregister(ipcdev.telemetry_dev);\n-\n-\treturn ret;\n }\n \n static int ipc_plat_remove(struct platform_device *pdev)\n {\n \tsysfs_remove_group(&pdev->dev.kobj, &intel_ipc_group);\n-\tdevm_free_irq(&pdev->dev, ipcdev.irq, &ipcdev);\n-\tplatform_device_unregister(ipcdev.tco_dev);\n-\tplatform_device_unregister(ipcdev.punit_dev);\n-\tplatform_device_unregister(ipcdev.telemetry_dev);\n \tipcdev.dev = NULL;\n+\n \treturn 0;\n }\n \n", "prefixes": [ "RFC", "v3", "2/7" ] }