Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754589AbbLANeq (ORCPT ); Tue, 1 Dec 2015 08:34:46 -0500 Received: from mailout3.w1.samsung.com ([210.118.77.13]:43225 "EHLO mailout3.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753918AbbLANem (ORCPT ); Tue, 1 Dec 2015 08:34:42 -0500 X-AuditID: cbfec7f5-f79b16d000005389-d2-565da1ed9913 From: Marek Szyprowski To: linux-samsung-soc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Cc: Marek Szyprowski , Russell King - ARM Linux , Ulf Hansson , Tomeu Vizoso , Greg Kroah-Hartman , Kukjin Kim , Krzysztof Kozlowski , Bartlomiej Zolnierkiewicz Subject: [PATCH v3 2/3] ARM: amba: Move reading of periphid to amba_match() Date: Tue, 01 Dec 2015 14:34:25 +0100 Message-id: <1448976866-7892-3-git-send-email-m.szyprowski@samsung.com> X-Mailer: git-send-email 1.9.2 In-reply-to: <1448976866-7892-1-git-send-email-m.szyprowski@samsung.com> References: <1448976866-7892-1-git-send-email-m.szyprowski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrILMWRmVeSWpSXmKPExsVy+t/xy7pvF8aGGWzvkbDYOGM9q0Xz4vVs Fq9fGFr0P37NbLHp8TVWi8u75rBZzDi/j8ni9mVei7VH7rJb9K29xGZxfG24A7dHS3MPm8eO u0sYPTat6mTzuHNtD5vH/rlr2D02L6n36NuyitHj8ya5AI4oLpuU1JzMstQifbsErozOyZOZ Cy4oVrRfW8bWwPhXqouRg0NCwETi/R+NLkZOIFNM4sK99WxdjFwcQgJLGSV2fLjLBOE0MUn8 WzeDCaSKTcBQouttFxuILSKQLTF/bzc7iM0s8IVJommLG4gtLOAt0fDjFFgNi4CqxP+53Ywg y3gF3CU6/9RBLJOT+P9yBdhITgEPiWk7zoGNEQIqWbtmJusERt4FjAyrGEVTS5MLipPSc430 ihNzi0vz0vWS83M3MUIC8usOxqXHrA4xCnAwKvHwSqyNCRNiTSwrrsw9xCjBwawkwitdHRsm xJuSWFmVWpQfX1Sak1p8iFGag0VJnHfmrvchQgLpiSWp2ampBalFMFkmDk6pBkb+9uBqrlXq fVzqGbaSvvYCAiE7Iz6a8Rbsc9iw4M903uP7cjs9uM4/6ktasmyVU9MdNf9NW9f1stQL82T9 K3X+Wf3z8V+TN5PlzxVNX8W5vGu/VpZz1s0PfJqOC7zWeNW9EY3asTUi58WtpjRNHu6D/cZq JcfYYyyDmdZ0fQwRW6Oxyef9YyWW4oxEQy3mouJEALK/ut1EAgAA Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4396 Lines: 158 From: Tomeu Vizoso Reading the periphid when the Primecell device is registered means that the apb pclk must be available by then or the device won't be registered at all. By reading the periphid in amba_match() we can return -EPROBE_DEFER if the apb pclk isn't there yet and the device will be retried later. Signed-off-by: Tomeu Vizoso [minor code adjustments, added missing comment] Signed-off-by: Marek Szyprowski --- drivers/amba/bus.c | 77 +++++++++++++++++++++++++++++------------------------- 1 file changed, 41 insertions(+), 36 deletions(-) diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c index f009936..879a421 100644 --- a/drivers/amba/bus.c +++ b/drivers/amba/bus.c @@ -24,6 +24,8 @@ #define to_amba_driver(d) container_of(d, struct amba_driver, drv) +static int amba_read_periphid(struct amba_device *dev); + static const struct amba_id * amba_lookup(const struct amba_id *table, struct amba_device *dev) { @@ -43,11 +45,23 @@ static int amba_match(struct device *dev, struct device_driver *drv) { struct amba_device *pcdev = to_amba_device(dev); struct amba_driver *pcdrv = to_amba_driver(drv); + int ret; /* When driver_override is set, only bind to the matching driver */ if (pcdev->driver_override) return !strcmp(pcdev->driver_override, drv->name); + /* Do plug-n-play if no hard-coded primecell ID has been provided */ + if (!pcdev->periphid) { + ret = amba_read_periphid(pcdev); + if (ret) { + if (ret != -EPROBE_DEFER) + dev_err(dev, "Failed to read periphid: %d", + ret); + return ret; + } + } + return amba_lookup(pcdrv->id_table, pcdev) != NULL; } @@ -336,31 +350,11 @@ static void amba_device_release(struct device *dev) kfree(d); } -/** - * amba_device_add - add a previously allocated AMBA device structure - * @dev: AMBA device allocated by amba_device_alloc - * @parent: resource parent for this devices resources - * - * Claim the resource, and read the device cell ID if not already - * initialized. Register the AMBA device with the Linux device - * manager. - */ -int amba_device_add(struct amba_device *dev, struct resource *parent) +static int amba_read_periphid(struct amba_device *dev) { u32 size; void __iomem *tmp; - int i, ret; - - WARN_ON(dev->irq[0] == (unsigned int)-1); - WARN_ON(dev->irq[1] == (unsigned int)-1); - - ret = request_resource(parent, &dev->res); - if (ret) - goto err_out; - - /* Hard-coded primecell ID instead of plug-n-play */ - if (dev->periphid != 0) - goto skip_probe; + int i, ret = 0; /* * Dynamically calculate the size of the resource @@ -368,10 +362,8 @@ int amba_device_add(struct amba_device *dev, struct resource *parent) */ size = resource_size(&dev->res); tmp = ioremap(dev->res.start, size); - if (!tmp) { - ret = -ENOMEM; - goto err_release; - } + if (!tmp) + return -ENOMEM; ret = amba_get_enable_pclk(dev); if (ret == 0) { @@ -399,26 +391,39 @@ int amba_device_add(struct amba_device *dev, struct resource *parent) iounmap(tmp); + return ret; +} + +/** + * amba_device_add - add a previously allocated AMBA device structure + * @dev: AMBA device allocated by amba_device_alloc + * @parent: resource parent for this devices resources + * + * Claim the resource, and register the AMBA device with the Linux device + * manager. + */ +int amba_device_add(struct amba_device *dev, struct resource *parent) +{ + int ret; + + WARN_ON(dev->irq[0] == (unsigned int)-1); + WARN_ON(dev->irq[1] == (unsigned int)-1); + + ret = request_resource(parent, &dev->res); if (ret) - goto err_release; + return ret; - skip_probe: ret = device_add(&dev->dev); if (ret) - goto err_release; + return ret; if (dev->irq[0]) ret = device_create_file(&dev->dev, &dev_attr_irq0); if (ret == 0 && dev->irq[1]) ret = device_create_file(&dev->dev, &dev_attr_irq1); - if (ret == 0) - return ret; - - device_unregister(&dev->dev); + if (ret) + device_unregister(&dev->dev); - err_release: - release_resource(&dev->res); - err_out: return ret; } EXPORT_SYMBOL_GPL(amba_device_add); -- 1.9.2 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/