From patchwork Tue Sep 29 09:10:40 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tomeu Vizoso X-Patchwork-Id: 7284191 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 96B9A9F32B for ; Tue, 29 Sep 2015 09:16:33 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id A70F92046F for ; Tue, 29 Sep 2015 09:16:32 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 53B3E206B8 for ; Tue, 29 Sep 2015 09:16:31 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1Zgqzi-0000h7-2L; Tue, 29 Sep 2015 09:14:42 +0000 Received: from mail-wi0-x22c.google.com ([2a00:1450:400c:c05::22c]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZgqxU-0000JT-BJ for linux-arm-kernel@lists.infradead.org; Tue, 29 Sep 2015 09:12:25 +0000 Received: by wiclk2 with SMTP id lk2so5888172wic.1 for ; Tue, 29 Sep 2015 02:12:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=RH8TGigZQwpTZXoImqobcU/CsLEb3VNoko75Bkuathw=; b=v/yjj/dGplk6xNrUDYJ4bjKuJKBAvsp6mW0/M0aFMlb5xZ4lTvlD/C+8j+VcsJ6Kpo AlIiGeFlbzzKW+1Z5YfFI8gMF0ipCKJvEP2xio0+dUJsXnXPjyHO33KFFc25j28znzEL zD/xd4a20mcVDbFPltbC+/VXQkAzSFa8HzB43g3Sjwh2TvkXRFI2RbwvVszfgl9CL6ok 9Poz8nR4vAoUUWVWBbDal9MOgLAkWFwqGP7ywlAuFTxhikUJacj5bAd35oWNtYk0nuax TPnOsJLUVHyXCMs/67KBZOIiYgxJJD/X7643g8RdxM5boLHz1foEKCCCbWDqxTt49YFP 8smw== X-Received: by 10.180.188.211 with SMTP id gc19mr25423067wic.81.1443517922811; Tue, 29 Sep 2015 02:12:02 -0700 (PDT) Received: from cizrna.lan ([109.72.12.204]) by smtp.gmail.com with ESMTPSA id lj12sm22757276wic.0.2015.09.29.02.12.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 29 Sep 2015 02:12:01 -0700 (PDT) From: Tomeu Vizoso To: linux-kernel@vger.kernel.org Subject: [PATCH v7 02/20] ARM: amba: Move reading of periphid to amba_match() Date: Tue, 29 Sep 2015 11:10:40 +0200 Message-Id: <1443517859-30376-3-git-send-email-tomeu.vizoso@collabora.com> X-Mailer: git-send-email 2.4.3 In-Reply-To: <1443517859-30376-1-git-send-email-tomeu.vizoso@collabora.com> References: <1443517859-30376-1-git-send-email-tomeu.vizoso@collabora.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20150929_021224_552958_EB231424 X-CRM114-Status: GOOD ( 23.88 ) X-Spam-Score: -2.4 (--) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Tomeu Vizoso , devicetree@vger.kernel.org, Ulf Hansson , linux-acpi@vger.kernel.org, Arnd Bergmann , Stephen Warren , Greg Kroah-Hartman , Linus Walleij , Dmitry Torokhov , "Rafael J. Wysocki" , Rob Herring , Javier Martinez Canillas , Mark Brown , Thierry Reding , Russell King , Alan Stern , linux-arm-kernel@lists.infradead.org MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED, T_DKIM_INVALID, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP 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 --- Changes in v6: - Drop bus_type.pre_probe and read the periphid in match() instead as suggested by Alan Stern. Changes in v4: - Added bus.pre_probe callback so the probes of Primecell devices can be deferred if their device IDs cannot be yet read because of the clock driver not having probed when they are registered. Maybe this goes overboard and the matching information should be in the DT if there is one. drivers/amba/bus.c | 88 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 46 insertions(+), 42 deletions(-) diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c index f0099360039e..72ebf9b1c715 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 read_periphid(struct amba_device *d, unsigned int *periphid); + static const struct amba_id * amba_lookup(const struct amba_id *table, struct amba_device *dev) { @@ -43,11 +45,22 @@ 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); + if (!pcdev->periphid) { + ret = read_periphid(pcdev, &pcdev->periphid); + 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,44 +349,22 @@ 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 read_periphid(struct amba_device *d, unsigned int *periphid) { 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 * and use this for iomap */ - size = resource_size(&dev->res); - tmp = ioremap(dev->res.start, size); - if (!tmp) { - ret = -ENOMEM; - goto err_release; - } + size = resource_size(&d->res); + tmp = ioremap(d->res.start, size); + if (!tmp) + return -ENOMEM; - ret = amba_get_enable_pclk(dev); + ret = amba_get_enable_pclk(d); if (ret == 0) { u32 pid, cid; @@ -388,37 +379,50 @@ int amba_device_add(struct amba_device *dev, struct resource *parent) cid |= (readl(tmp + size - 0x10 + 4 * i) & 255) << (i * 8); - amba_put_disable_pclk(dev); + amba_put_disable_pclk(d); if (cid == AMBA_CID || cid == CORESIGHT_CID) - dev->periphid = pid; + *periphid = pid; - if (!dev->periphid) + if (!*periphid) ret = -ENODEV; } 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);