From patchwork Thu Nov 26 12:49:49 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Szyprowski X-Patchwork-Id: 7706561 Return-Path: X-Original-To: patchwork-linux-samsung-soc@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id BE2D2C05CA for ; Thu, 26 Nov 2015 12:50:57 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id CFEB020603 for ; Thu, 26 Nov 2015 12:50:56 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id D1D272060E for ; Thu, 26 Nov 2015 12:50:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751165AbbKZMuz (ORCPT ); Thu, 26 Nov 2015 07:50:55 -0500 Received: from mailout2.w1.samsung.com ([210.118.77.12]:56621 "EHLO mailout2.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751173AbbKZMuF (ORCPT ); Thu, 26 Nov 2015 07:50:05 -0500 Received: from eucpsbgm1.samsung.com (unknown [203.254.199.244]) by mailout2.w1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0NYF00GY0ABDSPA0@mailout2.w1.samsung.com>; Thu, 26 Nov 2015 12:50:02 +0000 (GMT) X-AuditID: cbfec7f4-f79026d00000418a-02-5656fff9871b Received: from eusync3.samsung.com ( [203.254.199.213]) by eucpsbgm1.samsung.com (EUCPMTA) with SMTP id 77.5C.16778.9FFF6565; Thu, 26 Nov 2015 12:50:01 +0000 (GMT) Received: from amdc1339.digital.local ([106.116.147.30]) by eusync3.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0NYF00CQ1AB8M710@eusync3.samsung.com>; Thu, 26 Nov 2015 12:50:01 +0000 (GMT) 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 v2 3/4] ARM: amba: Move reading of periphid to amba_match() Date: Thu, 26 Nov 2015 13:49:49 +0100 Message-id: <1448542190-19498-4-git-send-email-m.szyprowski@samsung.com> X-Mailer: git-send-email 1.9.2 In-reply-to: <1448542190-19498-1-git-send-email-m.szyprowski@samsung.com> References: <1448542190-19498-1-git-send-email-m.szyprowski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrMLMWRmVeSWpSXmKPExsVy+t/xq7o//4eFGex/ZWKxccZ6VovmxevZ LF6/MLTof/ya2WLT42usFpd3zWGzmHF+H5PF7cu8FmuP3GW36Ft7ic3i+NpwB26PluYeNo8d d5cwemxa1cnmcefaHjaP/XPXsHtsXlLv0bdlFaPH501yARxRXDYpqTmZZalF+nYJXBlXl1xn KfilXLHl+h2WBsbDMl2MnBwSAiYSx1ffYYewxSQu3FvP1sXIxSEksJRR4mj/URYIp4lJ4vCH L8wgVWwChhJdb7vYQGwRgWyJ+Xu7wbqZBb4wSTRtcQOxhQW8JT5PucsIYrMIqErcuHqEBcTm FfCQWPJ1GSvENjmJ/y9XMIHYnAKeEtP+bwCrFwKqmdRzmXUCI+8CRoZVjKKppckFxUnpuYZ6 xYm5xaV56XrJ+bmbGCFB+WUH4+JjVocYBTgYlXh4C2zDwoRYE8uKK3MPMUpwMCuJ8H55CBTi TUmsrEotyo8vKs1JLT7EKM3BoiTOO3fX+xAhgfTEktTs1NSC1CKYLBMHp1QDI7vzSQ/VwJxV XSJHZOSXFV60+3etw173iKUlx9z4X47PQk9snLNyBfNNWcmIy78iF3L0TL4+6fLHqocH+E49 +s92VWjfz/cx0z4+iK9tzzzwNFxyu0JEYuzKK1P+yms9Nmz/81FRgGFfp5GRrJqgH1/56y3L /11c/6/ltsrnow6Bd3gfRNrE7FRiKc5INNRiLipOBAAkvYbURgIAAA== Sender: linux-samsung-soc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-samsung-soc@vger.kernel.org X-Spam-Status: No, score=-7.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, 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 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 Signed-off-by: Marek Szyprowski --- 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 f009936..72ebf9b 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);