[{"id":1778016,"web_url":"http://patchwork.ozlabs.org/comment/1778016/","msgid":"<CAHp75VdXP+R=HrbicYSWTyLMZQWf54tmgviVW7J_+hhJBPkF1A@mail.gmail.com>","list_archive_url":null,"date":"2017-10-01T14:34:41","subject":"Re: [RFC v3 1/7] platform/x86: intel_pmc_ipc: Use devm_* calls in\n\tdriver probe function","submitter":{"id":4675,"url":"http://patchwork.ozlabs.org/api/people/4675/","name":"Andy Shevchenko","email":"andy.shevchenko@gmail.com"},"content":"On Tue, Sep 5, 2017 at 8:37 AM,\n<sathyanarayanan.kuppuswamy@linux.intel.com> wrote:\n> From: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>\n>\n> This patch cleans up unnecessary free/alloc calls in ipc_plat_probe(),\n> ipc_pci_probe() and ipc_plat_get_res() functions by using devm_*\n> calls.\n>\n> This patch also adds proper error handling for failure cases in\n> ipc_pci_probe() function.\n>\n\nPushed (this patch only) to my review queue with slight style changes, thanks.\n\n> Signed-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>\n> Changes since v2:\n>  * Used pcim_* device managed functions.\n>\n> Changes since v1:\n>  * Merged devm_* related changes into a single function.\n>  * Instead of removing free_irq, use devm_free_irq function.\n>\n> diff --git a/drivers/platform/x86/intel_pmc_ipc.c b/drivers/platform/x86/intel_pmc_ipc.c\n> index 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> -       resource_size_t pci_resource;\n>         int ret;\n> -       int len;\n> +       struct intel_pmc_ipc_dev *pmc = &ipcdev;\n>\n> -       ipcdev.dev = &pci_dev_get(pdev)->dev;\n> -       ipcdev.irq_mode = IPC_TRIGGER_MODE_IRQ;\n> +       /* Only one PMC is supported */\n> +       if (pmc->dev)\n> +               return -EBUSY;\n>\n> -       ret = pci_enable_device(pdev);\n> +       pmc->irq_mode = IPC_TRIGGER_MODE_IRQ;\n> +\n> +       ret = pcim_enable_device(pdev);\n>         if (ret)\n>                 return ret;\n>\n> -       ret = pci_request_regions(pdev, \"intel_pmc_ipc\");\n> +       ret = pcim_iomap_regions(pdev, 1 << 0, pci_name(pdev));\n>         if (ret)\n>                 return ret;\n>\n> -       pci_resource = pci_resource_start(pdev, 0);\n> -       len = pci_resource_len(pdev, 0);\n> -       if (!pci_resource || !len) {\n> -               dev_err(&pdev->dev, \"Failed to get resource\\n\");\n> -               return -ENOMEM;\n> -       }\n> +       init_completion(&pmc->cmd_complete);\n>\n> -       init_completion(&ipcdev.cmd_complete);\n> +       pmc->ipc_base =  pcim_iomap_table(pdev)[0];\n>\n> -       if (request_irq(pdev->irq, ioc, 0, \"intel_pmc_ipc\", &ipcdev)) {\n> +       ret = devm_request_irq(&pdev->dev, pdev->irq, ioc, 0, \"intel_pmc_ipc\",\n> +                               pmc);\n> +       if (ret) {\n>                 dev_err(&pdev->dev, \"Failed to request irq\\n\");\n> -               return -EBUSY;\n> +               return ret;\n>         }\n>\n> -       ipcdev.ipc_base = ioremap_nocache(pci_resource, len);\n> -       if (!ipcdev.ipc_base) {\n> -               dev_err(&pdev->dev, \"Failed to ioremap ipc base\\n\");\n> -               free_irq(pdev->irq, &ipcdev);\n> -               ret = -ENOMEM;\n> -       }\n> +       pmc->dev = &pdev->dev;\n>\n> -       return ret;\n> -}\n> +       pci_set_drvdata(pdev, pmc);\n>\n> -static void ipc_pci_remove(struct pci_dev *pdev)\n> -{\n> -       free_irq(pdev->irq, &ipcdev);\n> -       pci_release_regions(pdev);\n> -       pci_dev_put(pdev);\n> -       iounmap(ipcdev.ipc_base);\n> -       ipcdev.dev = NULL;\n> +       return 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>         .name = \"intel_pmc_ipc\",\n>         .id_table = ipc_pci_ids,\n>         .probe = ipc_pci_probe,\n> -       .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>                 dev_err(&pdev->dev, \"Failed to get ipc resource\\n\");\n>                 return -ENXIO;\n>         }\n> -       size = PLAT_RESOURCE_IPC_SIZE + PLAT_RESOURCE_GCR_SIZE;\n> +       res->end = (res->start + PLAT_RESOURCE_IPC_SIZE +\n> +                   PLAT_RESOURCE_GCR_SIZE - 1);\n>\n> -       if (!request_mem_region(res->start, size, pdev->name)) {\n> -               dev_err(&pdev->dev, \"Failed to request ipc resource\\n\");\n> -               return -EBUSY;\n> -       }\n> -       addr = ioremap_nocache(res->start, size);\n> -       if (!addr) {\n> -               dev_err(&pdev->dev, \"I/O memory remapping failed\\n\");\n> -               release_mem_region(res->start, size);\n> -               return -ENOMEM;\n> +       addr = devm_ioremap_resource(&pdev->dev, res);\n> +       if (IS_ERR(addr)) {\n> +               dev_err(&pdev->dev,\n> +                       \"PMC I/O memory remapping failed\\n\");\n> +               return PTR_ERR(addr);\n>         }\n> +\n>         ipcdev.ipc_base = addr;\n>\n>         ipcdev.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> -       struct resource *res;\n>         int ret;\n>\n>         ipcdev.dev = &pdev->dev;\n> @@ -939,61 +922,42 @@ static int ipc_plat_probe(struct platform_device *pdev)\n>         ret = ipc_create_pmc_devices();\n>         if (ret) {\n>                 dev_err(&pdev->dev, \"Failed to create pmc devices\\n\");\n> -               goto err_device;\n> +               return ret;\n>         }\n>\n> -       if (request_irq(ipcdev.irq, ioc, IRQF_NO_SUSPEND,\n> -                       \"intel_pmc_ipc\", &ipcdev)) {\n> +       if (devm_request_irq(&pdev->dev, ipcdev.irq, ioc, IRQF_NO_SUSPEND,\n> +                            \"intel_pmc_ipc\", &ipcdev)) {\n>                 dev_err(&pdev->dev, \"Failed to request irq\\n\");\n>                 ret = -EBUSY;\n> -               goto err_irq;\n> +               goto unregister_devices;\n>         }\n>\n>         ret = sysfs_create_group(&pdev->dev.kobj, &intel_ipc_group);\n>         if (ret) {\n>                 dev_err(&pdev->dev, \"Failed to create sysfs group %d\\n\",\n>                         ret);\n> -               goto err_sys;\n> +               goto unregister_devices;\n>         }\n>\n>         ipcdev.has_gcr_regs = true;\n>\n>         return 0;\n> -err_sys:\n> -       free_irq(ipcdev.irq, &ipcdev);\n> -err_irq:\n> +\n> +unregister_devices:\n>         platform_device_unregister(ipcdev.tco_dev);\n>         platform_device_unregister(ipcdev.punit_dev);\n>         platform_device_unregister(ipcdev.telemetry_dev);\n> -err_device:\n> -       iounmap(ipcdev.ipc_base);\n> -       res = platform_get_resource(pdev, IORESOURCE_MEM,\n> -                                   PLAT_RESOURCE_IPC_INDEX);\n> -       if (res) {\n> -               release_mem_region(res->start,\n> -                                  PLAT_RESOURCE_IPC_SIZE +\n> -                                  PLAT_RESOURCE_GCR_SIZE);\n> -       }\n> +\n>         return ret;\n>  }\n>\n>  static int ipc_plat_remove(struct platform_device *pdev)\n>  {\n> -       struct resource *res;\n> -\n>         sysfs_remove_group(&pdev->dev.kobj, &intel_ipc_group);\n> -       free_irq(ipcdev.irq, &ipcdev);\n> +       devm_free_irq(&pdev->dev, ipcdev.irq, &ipcdev);\n>         platform_device_unregister(ipcdev.tco_dev);\n>         platform_device_unregister(ipcdev.punit_dev);\n>         platform_device_unregister(ipcdev.telemetry_dev);\n> -       iounmap(ipcdev.ipc_base);\n> -       res = platform_get_resource(pdev, IORESOURCE_MEM,\n> -                                   PLAT_RESOURCE_IPC_INDEX);\n> -       if (res) {\n> -               release_mem_region(res->start,\n> -                                  PLAT_RESOURCE_IPC_SIZE +\n> -                                  PLAT_RESOURCE_GCR_SIZE);\n> -       }\n>         ipcdev.dev = NULL;\n>         return 0;\n>  }\n> --\n> 2.7.4\n>","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>)","ozlabs.org; dkim=pass (2048-bit key;\n\tunprotected) header.d=gmail.com header.i=@gmail.com\n\theader.b=\"rCUtudaY\"; dkim-atps=neutral"],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3y4nrK4HVTz9t62\n\tfor <incoming@patchwork.ozlabs.org>;\n\tMon,  2 Oct 2017 01:34:57 +1100 (AEDT)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1752299AbdJAOeu (ORCPT <rfc822;incoming@patchwork.ozlabs.org>);\n\tSun, 1 Oct 2017 10:34:50 -0400","from mail-qt0-f196.google.com ([209.85.216.196]:45628 \"EHLO\n\tmail-qt0-f196.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1751020AbdJAOeo (ORCPT\n\t<rfc822;linux-rtc@vger.kernel.org>); Sun, 1 Oct 2017 10:34:44 -0400","by mail-qt0-f196.google.com with SMTP id t46so4613592qtj.2;\n\tSun, 01 Oct 2017 07:34:43 -0700 (PDT)","by 10.12.190.196 with HTTP; Sun, 1 Oct 2017 07:34:41 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=gmail.com; s=20161025;\n\th=mime-version:in-reply-to:references:from:date:message-id:subject:to\n\t:cc; bh=RTw1IVDS0NuHiT/z1yvdMYH7dfLL8HPFlKPDe2AJMFI=;\n\tb=rCUtudaY4NfNWPOUHwxsmj+cGvzcEYwN6a7nO3SZgwF45ANHKQfDHpa5nEpSf/X0Wo\n\tLOLewn5mhcASAMVP3FYeO2YC+9kqVAltEJawmvef/lE4jSVMCOjdOHHX42mOlST6zVjr\n\tht3EnUjbn92nhzGTS4Bg/gc7dqF2HM5A7jBw1Q0wIyvX8O6LRUrMm6EqHuBYb4mJJfFU\n\tPdsrvLuVkSxlYSOjJTQvTS/aOtCQ+9dKR4Q8NkwEgRmU+R3hStGbT2q8lCVm22FbwJ8x\n\t+0wdYFqoMXGO+UAHKiUTbjQAC6AM4/739iGNAFW2F4JpOsaLVB4HMZGzeVrszMGfqPJy\n\tZkEg==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:mime-version:in-reply-to:references:from:date\n\t:message-id:subject:to:cc;\n\tbh=RTw1IVDS0NuHiT/z1yvdMYH7dfLL8HPFlKPDe2AJMFI=;\n\tb=ZxAG6N7hCyfTdgn9jRx/Mxam0ZszB9JIbIIm3ELCGhSrJCpzo7buYqDaalrdC9MJo4\n\tN6ZHGQpV1FeW6WckeVmdCqQrHYPn7mkS6twbEoXZu4Y/7RCs1A4xapKyJb2T4gqQDGjN\n\tpRE3cfGSejGckz2ye4MdgQrjSaLnRlbosBy+u/sEvtOrVKo6h069WuxPqeNTPonHqvi5\n\tTWWjoPzpbSpvLmgupdtIfPW9y2LZKOXaJ+5VdbKVWMlJ9jz9woKwwHDAXFH4+HrwThfC\n\tB/2bmC9UtxJtxKsGdKXzpyugvnN8TKJimFMn4gUtzuZbvaestm6T3gw8greRxmT+gLvX\n\t2Gzg==","X-Gm-Message-State":"AMCzsaVnoTjT+Tl1bM7VHAjxqZc7hJhle49p3wx68uK/IlB+5LaBmC36\n\tH5kzy6t6bpeCOxAdN9ltp8CUMKGRcFIW08sAgFQ=","X-Google-Smtp-Source":"AOwi7QDBQiHaXoctq3oAnWJpxdwQn6QT1pj3oMvB9cOqE9D/lO7yQSBi/5+jRw7oJ5klpn8jvP6xM/dqRlJ3ZrTMeVw=","X-Received":"by 10.237.59.91 with SMTP id q27mr15170818qte.340.1506868482999; \n\tSun, 01 Oct 2017 07:34:42 -0700 (PDT)","MIME-Version":"1.0","In-Reply-To":"<eada94e0dfe0302b22c16c22ba2ea806e096144a.1504588701.git.sathyanarayanan.kuppuswamy@linux.intel.com>","References":"<cover.1504588701.git.sathyanarayanan.kuppuswamy@linux.intel.com>\n\t<eada94e0dfe0302b22c16c22ba2ea806e096144a.1504588701.git.sathyanarayanan.kuppuswamy@linux.intel.com>","From":"Andy Shevchenko <andy.shevchenko@gmail.com>","Date":"Sun, 1 Oct 2017 17:34:41 +0300","Message-ID":"<CAHp75VdXP+R=HrbicYSWTyLMZQWf54tmgviVW7J_+hhJBPkF1A@mail.gmail.com>","Subject":"Re: [RFC v3 1/7] platform/x86: intel_pmc_ipc: Use devm_* calls in\n\tdriver probe function","To":"Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>","Cc":"Alessandro Zummo <a.zummo@towertech.it>,\n\t\"x86@kernel.org\" <x86@kernel.org>, Wim Van Sebroeck <wim@iguana.be>,\n\tIngo Molnar <mingo@redhat.com>,\n\tAlexandre Belloni <alexandre.belloni@free-electrons.com>,\n\tZha Qipeng <qipeng.zha@intel.com>, \"H. Peter Anvin\" <hpa@zytor.com>,\n\t\"dvhart@infradead.org\" <dvhart@infradead.org>,\n\tThomas Gleixner <tglx@linutronix.de>, Lee Jones <lee.jones@linaro.org>,\n\tAndy Shevchenko <andy@infradead.org>,\n\tSouvik Kumar Chakravarty <souvik.k.chakravarty@intel.com>,\n\tlinux-rtc@vger.kernel.org, linux-watchdog@vger.kernel.org,\n\t\"linux-kernel@vger.kernel.org\" <linux-kernel@vger.kernel.org>,\n\tPlatform Driver <platform-driver-x86@vger.kernel.org>,\n\tSathyanarayanan Kuppuswamy Natarajan <sathyaosid@gmail.com>","Content-Type":"text/plain; charset=\"UTF-8\"","Sender":"linux-rtc-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<linux-rtc.vger.kernel.org>","X-Mailing-List":"linux-rtc@vger.kernel.org"}},{"id":1779335,"web_url":"http://patchwork.ozlabs.org/comment/1779335/","msgid":"<6c3580aa-1fc0-ea0a-0da3-782cb266429e@linux.intel.com>","list_archive_url":null,"date":"2017-10-04T00:55:58","subject":"Re: [RFC v3 1/7] platform/x86: intel_pmc_ipc: Use devm_* calls in\n\tdriver probe function","submitter":{"id":66129,"url":"http://patchwork.ozlabs.org/api/people/66129/","name":"Kuppuswamy Sathyanarayanan","email":"sathyanarayanan.kuppuswamy@linux.intel.com"},"content":"Hi,\n\n\nOn 10/01/2017 07:34 AM, Andy Shevchenko wrote:\n> On Tue, Sep 5, 2017 at 8:37 AM,\n> <sathyanarayanan.kuppuswamy@linux.intel.com> wrote:\n>> From: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>\n>>\n>> This patch cleans up unnecessary free/alloc calls in ipc_plat_probe(),\n>> ipc_pci_probe() and ipc_plat_get_res() functions by using devm_*\n>> calls.\n>>\n>> This patch also adds proper error handling for failure cases in\n>> ipc_pci_probe() function.\n>>\n> Pushed (this patch only) to my review queue with slight style changes, thanks.\nThanks Andy. Will rebase my rest of the patches on top of this patch.\n>\n>> Signed-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>>\n>> Changes since v2:\n>>   * Used pcim_* device managed functions.\n>>\n>> Changes since v1:\n>>   * Merged devm_* related changes into a single function.\n>>   * Instead of removing free_irq, use devm_free_irq function.\n>>\n>> diff --git a/drivers/platform/x86/intel_pmc_ipc.c b/drivers/platform/x86/intel_pmc_ipc.c\n>> index 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>> -       resource_size_t pci_resource;\n>>          int ret;\n>> -       int len;\n>> +       struct intel_pmc_ipc_dev *pmc = &ipcdev;\n>>\n>> -       ipcdev.dev = &pci_dev_get(pdev)->dev;\n>> -       ipcdev.irq_mode = IPC_TRIGGER_MODE_IRQ;\n>> +       /* Only one PMC is supported */\n>> +       if (pmc->dev)\n>> +               return -EBUSY;\n>>\n>> -       ret = pci_enable_device(pdev);\n>> +       pmc->irq_mode = IPC_TRIGGER_MODE_IRQ;\n>> +\n>> +       ret = pcim_enable_device(pdev);\n>>          if (ret)\n>>                  return ret;\n>>\n>> -       ret = pci_request_regions(pdev, \"intel_pmc_ipc\");\n>> +       ret = pcim_iomap_regions(pdev, 1 << 0, pci_name(pdev));\n>>          if (ret)\n>>                  return ret;\n>>\n>> -       pci_resource = pci_resource_start(pdev, 0);\n>> -       len = pci_resource_len(pdev, 0);\n>> -       if (!pci_resource || !len) {\n>> -               dev_err(&pdev->dev, \"Failed to get resource\\n\");\n>> -               return -ENOMEM;\n>> -       }\n>> +       init_completion(&pmc->cmd_complete);\n>>\n>> -       init_completion(&ipcdev.cmd_complete);\n>> +       pmc->ipc_base =  pcim_iomap_table(pdev)[0];\n>>\n>> -       if (request_irq(pdev->irq, ioc, 0, \"intel_pmc_ipc\", &ipcdev)) {\n>> +       ret = devm_request_irq(&pdev->dev, pdev->irq, ioc, 0, \"intel_pmc_ipc\",\n>> +                               pmc);\n>> +       if (ret) {\n>>                  dev_err(&pdev->dev, \"Failed to request irq\\n\");\n>> -               return -EBUSY;\n>> +               return ret;\n>>          }\n>>\n>> -       ipcdev.ipc_base = ioremap_nocache(pci_resource, len);\n>> -       if (!ipcdev.ipc_base) {\n>> -               dev_err(&pdev->dev, \"Failed to ioremap ipc base\\n\");\n>> -               free_irq(pdev->irq, &ipcdev);\n>> -               ret = -ENOMEM;\n>> -       }\n>> +       pmc->dev = &pdev->dev;\n>>\n>> -       return ret;\n>> -}\n>> +       pci_set_drvdata(pdev, pmc);\n>>\n>> -static void ipc_pci_remove(struct pci_dev *pdev)\n>> -{\n>> -       free_irq(pdev->irq, &ipcdev);\n>> -       pci_release_regions(pdev);\n>> -       pci_dev_put(pdev);\n>> -       iounmap(ipcdev.ipc_base);\n>> -       ipcdev.dev = NULL;\n>> +       return 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>>          .name = \"intel_pmc_ipc\",\n>>          .id_table = ipc_pci_ids,\n>>          .probe = ipc_pci_probe,\n>> -       .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>>                  dev_err(&pdev->dev, \"Failed to get ipc resource\\n\");\n>>                  return -ENXIO;\n>>          }\n>> -       size = PLAT_RESOURCE_IPC_SIZE + PLAT_RESOURCE_GCR_SIZE;\n>> +       res->end = (res->start + PLAT_RESOURCE_IPC_SIZE +\n>> +                   PLAT_RESOURCE_GCR_SIZE - 1);\n>>\n>> -       if (!request_mem_region(res->start, size, pdev->name)) {\n>> -               dev_err(&pdev->dev, \"Failed to request ipc resource\\n\");\n>> -               return -EBUSY;\n>> -       }\n>> -       addr = ioremap_nocache(res->start, size);\n>> -       if (!addr) {\n>> -               dev_err(&pdev->dev, \"I/O memory remapping failed\\n\");\n>> -               release_mem_region(res->start, size);\n>> -               return -ENOMEM;\n>> +       addr = devm_ioremap_resource(&pdev->dev, res);\n>> +       if (IS_ERR(addr)) {\n>> +               dev_err(&pdev->dev,\n>> +                       \"PMC I/O memory remapping failed\\n\");\n>> +               return PTR_ERR(addr);\n>>          }\n>> +\n>>          ipcdev.ipc_base = addr;\n>>\n>>          ipcdev.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>> -       struct resource *res;\n>>          int ret;\n>>\n>>          ipcdev.dev = &pdev->dev;\n>> @@ -939,61 +922,42 @@ static int ipc_plat_probe(struct platform_device *pdev)\n>>          ret = ipc_create_pmc_devices();\n>>          if (ret) {\n>>                  dev_err(&pdev->dev, \"Failed to create pmc devices\\n\");\n>> -               goto err_device;\n>> +               return ret;\n>>          }\n>>\n>> -       if (request_irq(ipcdev.irq, ioc, IRQF_NO_SUSPEND,\n>> -                       \"intel_pmc_ipc\", &ipcdev)) {\n>> +       if (devm_request_irq(&pdev->dev, ipcdev.irq, ioc, IRQF_NO_SUSPEND,\n>> +                            \"intel_pmc_ipc\", &ipcdev)) {\n>>                  dev_err(&pdev->dev, \"Failed to request irq\\n\");\n>>                  ret = -EBUSY;\n>> -               goto err_irq;\n>> +               goto unregister_devices;\n>>          }\n>>\n>>          ret = sysfs_create_group(&pdev->dev.kobj, &intel_ipc_group);\n>>          if (ret) {\n>>                  dev_err(&pdev->dev, \"Failed to create sysfs group %d\\n\",\n>>                          ret);\n>> -               goto err_sys;\n>> +               goto unregister_devices;\n>>          }\n>>\n>>          ipcdev.has_gcr_regs = true;\n>>\n>>          return 0;\n>> -err_sys:\n>> -       free_irq(ipcdev.irq, &ipcdev);\n>> -err_irq:\n>> +\n>> +unregister_devices:\n>>          platform_device_unregister(ipcdev.tco_dev);\n>>          platform_device_unregister(ipcdev.punit_dev);\n>>          platform_device_unregister(ipcdev.telemetry_dev);\n>> -err_device:\n>> -       iounmap(ipcdev.ipc_base);\n>> -       res = platform_get_resource(pdev, IORESOURCE_MEM,\n>> -                                   PLAT_RESOURCE_IPC_INDEX);\n>> -       if (res) {\n>> -               release_mem_region(res->start,\n>> -                                  PLAT_RESOURCE_IPC_SIZE +\n>> -                                  PLAT_RESOURCE_GCR_SIZE);\n>> -       }\n>> +\n>>          return ret;\n>>   }\n>>\n>>   static int ipc_plat_remove(struct platform_device *pdev)\n>>   {\n>> -       struct resource *res;\n>> -\n>>          sysfs_remove_group(&pdev->dev.kobj, &intel_ipc_group);\n>> -       free_irq(ipcdev.irq, &ipcdev);\n>> +       devm_free_irq(&pdev->dev, ipcdev.irq, &ipcdev);\n>>          platform_device_unregister(ipcdev.tco_dev);\n>>          platform_device_unregister(ipcdev.punit_dev);\n>>          platform_device_unregister(ipcdev.telemetry_dev);\n>> -       iounmap(ipcdev.ipc_base);\n>> -       res = platform_get_resource(pdev, IORESOURCE_MEM,\n>> -                                   PLAT_RESOURCE_IPC_INDEX);\n>> -       if (res) {\n>> -               release_mem_region(res->start,\n>> -                                  PLAT_RESOURCE_IPC_SIZE +\n>> -                                  PLAT_RESOURCE_GCR_SIZE);\n>> -       }\n>>          ipcdev.dev = NULL;\n>>          return 0;\n>>   }\n>> --\n>> 2.7.4\n>>\n>\n>","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 3y6HXG3n8pz9t2Z\n\tfor <incoming@patchwork.ozlabs.org>;\n\tWed,  4 Oct 2017 11:56:14 +1100 (AEDT)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751336AbdJDA4N (ORCPT <rfc822;incoming@patchwork.ozlabs.org>);\n\tTue, 3 Oct 2017 20:56:13 -0400","from mga07.intel.com ([134.134.136.100]:40876 \"EHLO\n\tmga07.intel.com\"\n\trhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP\n\tid S1751250AbdJDA4M (ORCPT <rfc822;linux-rtc@vger.kernel.org>);\n\tTue, 3 Oct 2017 20:56:12 -0400","from fmsmga001.fm.intel.com ([10.253.24.23])\n\tby orsmga105.jf.intel.com with ESMTP; 03 Oct 2017 17:56:11 -0700","from linux.intel.com ([10.54.29.200])\n\tby fmsmga001.fm.intel.com with ESMTP; 03 Oct 2017 17:56:10 -0700","from [10.7.198.92] (skuppusw-desk.jf.intel.com [10.7.198.92])\n\tby linux.intel.com (Postfix) with ESMTP id 59FE7580358;\n\tTue,  3 Oct 2017 17:56:10 -0700 (PDT)"],"X-ExtLoop1":"1","X-IronPort-AV":"E=Sophos;i=\"5.42,475,1500966000\"; d=\"scan'208\";a=\"1201897841\"","Reply-To":"sathyanarayanan.kuppuswamy@linux.intel.com","Subject":"Re: [RFC v3 1/7] platform/x86: intel_pmc_ipc: Use devm_* calls in\n\tdriver probe function","To":"Andy Shevchenko <andy.shevchenko@gmail.com>","Cc":"Alessandro Zummo <a.zummo@towertech.it>,\n\t\"x86@kernel.org\" <x86@kernel.org>, Wim Van Sebroeck <wim@iguana.be>,\n\tIngo Molnar <mingo@redhat.com>,\n\tAlexandre Belloni <alexandre.belloni@free-electrons.com>,\n\tZha Qipeng <qipeng.zha@intel.com>, \"H. Peter Anvin\" <hpa@zytor.com>,\n\t\"dvhart@infradead.org\" <dvhart@infradead.org>,\n\tThomas Gleixner <tglx@linutronix.de>, Lee Jones <lee.jones@linaro.org>,\n\tAndy Shevchenko <andy@infradead.org>,\n\tSouvik Kumar Chakravarty <souvik.k.chakravarty@intel.com>,\n\tlinux-rtc@vger.kernel.org, linux-watchdog@vger.kernel.org,\n\t\"linux-kernel@vger.kernel.org\" <linux-kernel@vger.kernel.org>,\n\tPlatform Driver <platform-driver-x86@vger.kernel.org>,\n\tSathyanarayanan Kuppuswamy Natarajan <sathyaosid@gmail.com>","References":"<cover.1504588701.git.sathyanarayanan.kuppuswamy@linux.intel.com>\n\t<eada94e0dfe0302b22c16c22ba2ea806e096144a.1504588701.git.sathyanarayanan.kuppuswamy@linux.intel.com>\n\t<CAHp75VdXP+R=HrbicYSWTyLMZQWf54tmgviVW7J_+hhJBPkF1A@mail.gmail.com>","From":"sathyanarayanan kuppuswamy \n\t<sathyanarayanan.kuppuswamy@linux.intel.com>","Organization":"Intel","Message-ID":"<6c3580aa-1fc0-ea0a-0da3-782cb266429e@linux.intel.com>","Date":"Tue, 3 Oct 2017 17:55:58 -0700","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101\n\tThunderbird/52.3.0","MIME-Version":"1.0","In-Reply-To":"<CAHp75VdXP+R=HrbicYSWTyLMZQWf54tmgviVW7J_+hhJBPkF1A@mail.gmail.com>","Content-Type":"text/plain; charset=utf-8; format=flowed","Content-Transfer-Encoding":"7bit","Content-Language":"en-US","Sender":"linux-rtc-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<linux-rtc.vger.kernel.org>","X-Mailing-List":"linux-rtc@vger.kernel.org"}}]