Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/809931/?format=api
{ "id": 809931, "url": "http://patchwork.ozlabs.org/api/patches/809931/?format=api", "web_url": "http://patchwork.ozlabs.org/project/rtc-linux/patch/eada94e0dfe0302b22c16c22ba2ea806e096144a.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": "<eada94e0dfe0302b22c16c22ba2ea806e096144a.1504588701.git.sathyanarayanan.kuppuswamy@linux.intel.com>", "list_archive_url": null, "date": "2017-09-05T05:37:21", "name": "[RFC,v3,1/7] platform/x86: intel_pmc_ipc: Use devm_* calls in driver probe function", "commit_ref": null, "pull_url": null, "state": "not-applicable", "archived": false, "hash": "0c697c5a6c87127181658921424484eecb495c7b", "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/eada94e0dfe0302b22c16c22ba2ea806e096144a.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/809931/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/809931/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 3xmbBh5fsGz9sNq\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue, 5 Sep 2017 15:39:40 +1000 (AEST)", "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1754110AbdIEFiP (ORCPT <rfc822;incoming@patchwork.ozlabs.org>);\n\tTue, 5 Sep 2017 01:38:15 -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 S1751126AbdIEFiO (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=\"145505091\"", "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 1/7] platform/x86: intel_pmc_ipc: Use devm_* calls in\n\tdriver probe function", "Date": "Mon, 4 Sep 2017 22:37:21 -0700", "Message-Id": "<eada94e0dfe0302b22c16c22ba2ea806e096144a.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\nThis patch cleans up unnecessary free/alloc calls in ipc_plat_probe(),\nipc_pci_probe() and ipc_plat_get_res() functions by using devm_*\ncalls.\n\nThis patch also adds proper error handling for failure cases in\nipc_pci_probe() function.\n\nSigned-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>\n---\n drivers/platform/x86/intel_pmc_ipc.c | 104 ++++++++++++-----------------------\n 1 file changed, 34 insertions(+), 70 deletions(-)\n\nChanges since v2:\n * Used pcim_* device managed functions.\n\nChanges since v1:\n * Merged devm_* related changes into a single function.\n * Instead of removing free_irq, use devm_free_irq function.", "diff": "diff --git a/drivers/platform/x86/intel_pmc_ipc.c b/drivers/platform/x86/intel_pmc_ipc.c\nindex bb792a5..5eef649 100644\n--- a/drivers/platform/x86/intel_pmc_ipc.c\n+++ b/drivers/platform/x86/intel_pmc_ipc.c\n@@ -480,52 +480,39 @@ static irqreturn_t ioc(int irq, void *dev_id)\n \n static int ipc_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)\n {\n-\tresource_size_t pci_resource;\n \tint ret;\n-\tint len;\n+\tstruct intel_pmc_ipc_dev *pmc = &ipcdev;\n \n-\tipcdev.dev = &pci_dev_get(pdev)->dev;\n-\tipcdev.irq_mode = IPC_TRIGGER_MODE_IRQ;\n+\t/* Only one PMC is supported */\n+\tif (pmc->dev)\n+\t\treturn -EBUSY;\n \n-\tret = pci_enable_device(pdev);\n+\tpmc->irq_mode = IPC_TRIGGER_MODE_IRQ;\n+\n+\tret = pcim_enable_device(pdev);\n \tif (ret)\n \t\treturn ret;\n \n-\tret = pci_request_regions(pdev, \"intel_pmc_ipc\");\n+\tret = pcim_iomap_regions(pdev, 1 << 0, pci_name(pdev));\n \tif (ret)\n \t\treturn ret;\n \n-\tpci_resource = pci_resource_start(pdev, 0);\n-\tlen = pci_resource_len(pdev, 0);\n-\tif (!pci_resource || !len) {\n-\t\tdev_err(&pdev->dev, \"Failed to get resource\\n\");\n-\t\treturn -ENOMEM;\n-\t}\n+\tinit_completion(&pmc->cmd_complete);\n \n-\tinit_completion(&ipcdev.cmd_complete);\n+\tpmc->ipc_base = pcim_iomap_table(pdev)[0];\n \n-\tif (request_irq(pdev->irq, ioc, 0, \"intel_pmc_ipc\", &ipcdev)) {\n+\tret = devm_request_irq(&pdev->dev, pdev->irq, ioc, 0, \"intel_pmc_ipc\",\n+\t\t\t\tpmc);\n+\tif (ret) {\n \t\tdev_err(&pdev->dev, \"Failed to request irq\\n\");\n-\t\treturn -EBUSY;\n+\t\treturn ret;\n \t}\n \n-\tipcdev.ipc_base = ioremap_nocache(pci_resource, len);\n-\tif (!ipcdev.ipc_base) {\n-\t\tdev_err(&pdev->dev, \"Failed to ioremap ipc base\\n\");\n-\t\tfree_irq(pdev->irq, &ipcdev);\n-\t\tret = -ENOMEM;\n-\t}\n+\tpmc->dev = &pdev->dev;\n \n-\treturn ret;\n-}\n+\tpci_set_drvdata(pdev, pmc);\n \n-static void ipc_pci_remove(struct pci_dev *pdev)\n-{\n-\tfree_irq(pdev->irq, &ipcdev);\n-\tpci_release_regions(pdev);\n-\tpci_dev_put(pdev);\n-\tiounmap(ipcdev.ipc_base);\n-\tipcdev.dev = NULL;\n+\treturn 0;\n }\n \n static const struct pci_device_id ipc_pci_ids[] = {\n@@ -540,7 +527,6 @@ static struct pci_driver ipc_pci_driver = {\n \t.name = \"intel_pmc_ipc\",\n \t.id_table = ipc_pci_ids,\n \t.probe = ipc_pci_probe,\n-\t.remove = ipc_pci_remove,\n };\n \n static ssize_t intel_pmc_ipc_simple_cmd_store(struct device *dev,\n@@ -849,18 +835,16 @@ static int ipc_plat_get_res(struct platform_device *pdev)\n \t\tdev_err(&pdev->dev, \"Failed to get ipc resource\\n\");\n \t\treturn -ENXIO;\n \t}\n-\tsize = PLAT_RESOURCE_IPC_SIZE + PLAT_RESOURCE_GCR_SIZE;\n+\tres->end = (res->start + PLAT_RESOURCE_IPC_SIZE +\n+\t\t PLAT_RESOURCE_GCR_SIZE - 1);\n \n-\tif (!request_mem_region(res->start, size, pdev->name)) {\n-\t\tdev_err(&pdev->dev, \"Failed to request ipc resource\\n\");\n-\t\treturn -EBUSY;\n-\t}\n-\taddr = ioremap_nocache(res->start, size);\n-\tif (!addr) {\n-\t\tdev_err(&pdev->dev, \"I/O memory remapping failed\\n\");\n-\t\trelease_mem_region(res->start, size);\n-\t\treturn -ENOMEM;\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}\n+\n \tipcdev.ipc_base = addr;\n \n \tipcdev.gcr_mem_base = addr + PLAT_RESOURCE_GCR_OFFSET;\n@@ -917,7 +901,6 @@ MODULE_DEVICE_TABLE(acpi, ipc_acpi_ids);\n \n static int ipc_plat_probe(struct platform_device *pdev)\n {\n-\tstruct resource *res;\n \tint ret;\n \n \tipcdev.dev = &pdev->dev;\n@@ -939,61 +922,42 @@ static int ipc_plat_probe(struct platform_device *pdev)\n \tret = ipc_create_pmc_devices();\n \tif (ret) {\n \t\tdev_err(&pdev->dev, \"Failed to create pmc devices\\n\");\n-\t\tgoto err_device;\n+\t\treturn ret;\n \t}\n \n-\tif (request_irq(ipcdev.irq, ioc, IRQF_NO_SUSPEND,\n-\t\t\t\"intel_pmc_ipc\", &ipcdev)) {\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 err_irq;\n+\t\tgoto unregister_devices;\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 err_sys;\n+\t\tgoto unregister_devices;\n \t}\n \n \tipcdev.has_gcr_regs = true;\n \n \treturn 0;\n-err_sys:\n-\tfree_irq(ipcdev.irq, &ipcdev);\n-err_irq:\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-err_device:\n-\tiounmap(ipcdev.ipc_base);\n-\tres = platform_get_resource(pdev, IORESOURCE_MEM,\n-\t\t\t\t PLAT_RESOURCE_IPC_INDEX);\n-\tif (res) {\n-\t\trelease_mem_region(res->start,\n-\t\t\t\t PLAT_RESOURCE_IPC_SIZE +\n-\t\t\t\t PLAT_RESOURCE_GCR_SIZE);\n-\t}\n+\n \treturn ret;\n }\n \n static int ipc_plat_remove(struct platform_device *pdev)\n {\n-\tstruct resource *res;\n-\n \tsysfs_remove_group(&pdev->dev.kobj, &intel_ipc_group);\n-\tfree_irq(ipcdev.irq, &ipcdev);\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-\tiounmap(ipcdev.ipc_base);\n-\tres = platform_get_resource(pdev, IORESOURCE_MEM,\n-\t\t\t\t PLAT_RESOURCE_IPC_INDEX);\n-\tif (res) {\n-\t\trelease_mem_region(res->start,\n-\t\t\t\t PLAT_RESOURCE_IPC_SIZE +\n-\t\t\t\t PLAT_RESOURCE_GCR_SIZE);\n-\t}\n \tipcdev.dev = NULL;\n \treturn 0;\n }\n", "prefixes": [ "RFC", "v3", "1/7" ] }