From patchwork Mon Apr 11 14:58:35 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Georgi Djakov X-Patchwork-Id: 65530 Delivered-To: patch@linaro.org Received: by 10.112.43.237 with SMTP id z13csp1522765lbl; Mon, 11 Apr 2016 07:58:43 -0700 (PDT) X-Received: by 10.98.67.139 with SMTP id l11mr33345623pfi.112.1460386722949; Mon, 11 Apr 2016 07:58:42 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id hl6si4045308pad.188.2016.04.11.07.58.42; Mon, 11 Apr 2016 07:58:42 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-arm-msm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org; spf=pass (google.com: best guess record for domain of linux-arm-msm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-arm-msm-owner@vger.kernel.org; dmarc=fail (p=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752303AbcDKO6l (ORCPT + 8 others); Mon, 11 Apr 2016 10:58:41 -0400 Received: from mail-wm0-f46.google.com ([74.125.82.46]:37922 "EHLO mail-wm0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752613AbcDKO6k (ORCPT ); Mon, 11 Apr 2016 10:58:40 -0400 Received: by mail-wm0-f46.google.com with SMTP id u206so108246123wme.1 for ; Mon, 11 Apr 2016 07:58:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=M38TVSZzh+fu0zYPWlfq7fZd8B6K/ud/FRmzktI+qpQ=; b=eb0v++ZydamPnE5UdhScbbin8gs4vL5I/AyKUicTUNg55SbKMXuapy5nmJ9Fwfx5wj qCQFgRVRXd6Ax5vJlk9tXWZABlOl24r7HWBQpGqmg5t14PacOSxN8WXWytJhbRB5pSzZ mqXW6OXcgDBMg+l1DRgH4NhkularckVU66p4A= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=M38TVSZzh+fu0zYPWlfq7fZd8B6K/ud/FRmzktI+qpQ=; b=isGa45S2SbGgKHqlXOn+6ryu4AtMpOj6NBa98ZJNURHVafoI1VXUmnw2CZTOXEgaXz GeTIqJNM97TX2Xn2m5LzRjWMcTe2gGsAvdvNNe7zLzRhDAVkMtT25NoyHdTttbTEkgQT jNxpvNcC4rv3i/j6Y6DWzrEvuG5NAvXl7EoQaSA72W0CUuF8l82gxE+P2GFaZM5pzWM8 /pJVi9/Rz5HnsmwttoVQIBK00LARnm+m4budLw37GWm4IRgV/lWjDFv7YRV8ZnFtW2wU lmURih1AQUokTHHS2+bAO+2NUqjt9mtpinQ1kZEV6kHxI5vqZpfjUcGSo58Ke4E14FDa K0sQ== X-Gm-Message-State: AD7BkJIFprTUXQgN9YJgUN7MpJmIwUnBdPxPy8GAhQqo8+DcPkGeQ8/4j2ZodhULOwtjuF73 X-Received: by 10.28.27.73 with SMTP id b70mr18885295wmb.19.1460386718974; Mon, 11 Apr 2016 07:58:38 -0700 (PDT) Received: from mms.qualcomm.mm-sol.com ([37.157.136.206]) by smtp.googlemail.com with ESMTPSA id qb8sm28332926wjc.24.2016.04.11.07.58.37 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 11 Apr 2016 07:58:37 -0700 (PDT) From: Georgi Djakov To: linux@arm.linux.org.uk Cc: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, iivanov.xz@gmail.com, georgi.djakov@linaro.org Subject: [PATCH v1 1/2] amba: Defer device peripheral ID read Date: Mon, 11 Apr 2016 17:58:35 +0300 Message-Id: <1460386716-23262-1-git-send-email-georgi.djakov@linaro.org> X-Mailer: git-send-email 1.7.9.5 Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org From: "Ivan T. Ivanov" To be able to read peripheral ID during device create time bus code have turn on device interface clock, but this clock could be unavailable at this time. Fix this by defer device ID read until driver match time. Signed-off-by: Ivan T. Ivanov Signed-off-by: Georgi Djakov --- drivers/amba/bus.c | 138 ++++++++++++++++++++++++++-------------------------- 1 file changed, 69 insertions(+), 69 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c index f0099360039e..a32a43dbaccc 100644 --- a/drivers/amba/bus.c +++ b/drivers/amba/bus.c @@ -24,11 +24,79 @@ #define to_amba_driver(d) container_of(d, struct amba_driver, drv) +static int amba_get_enable_pclk(struct amba_device *pcdev) +{ + int ret; + + pcdev->pclk = clk_get(&pcdev->dev, "apb_pclk"); + if (IS_ERR(pcdev->pclk)) + return PTR_ERR(pcdev->pclk); + + ret = clk_prepare_enable(pcdev->pclk); + if (ret) + clk_put(pcdev->pclk); + + return ret; +} + +static void amba_put_disable_pclk(struct amba_device *pcdev) +{ + clk_disable_unprepare(pcdev->pclk); + clk_put(pcdev->pclk); +} + +static int amba_read_periphid(struct amba_device *adev) +{ + resource_size_t size; + void __iomem *tmp; + int r, i; + + if (adev->periphid) + return 0; + + /* + * Dynamically calculate the size of the resource + * and use this for iomap + */ + size = resource_size(&adev->res); + tmp = ioremap(adev->res.start, size); + if (!tmp) + return -ENODEV; + + r = amba_get_enable_pclk(adev); + if (r == 0) { + u32 pid, cid; + + /* + * Read pid and cid based on size of resource + * they are located at end of region + */ + for (pid = 0, i = 0; i < 4; i++) + pid |= (readl(tmp + size - 0x20 + 4 * i) & 255) << + (i * 8); + for (cid = 0, i = 0; i < 4; i++) + cid |= (readl(tmp + size - 0x10 + 4 * i) & 255) << + (i * 8); + + amba_put_disable_pclk(adev); + + if (cid == AMBA_CID || cid == CORESIGHT_CID) + adev->periphid = pid; + } + + iounmap(tmp); + + return adev->periphid ? 0 : -ENODEV; +} + static const struct amba_id * amba_lookup(const struct amba_id *table, struct amba_device *dev) { int ret = 0; + if (amba_read_periphid(dev)) + return NULL; + while (table->mask) { ret = (dev->periphid & table->mask) == table->id; if (ret) @@ -204,27 +272,6 @@ static int __init amba_init(void) postcore_initcall(amba_init); -static int amba_get_enable_pclk(struct amba_device *pcdev) -{ - int ret; - - pcdev->pclk = clk_get(&pcdev->dev, "apb_pclk"); - if (IS_ERR(pcdev->pclk)) - return PTR_ERR(pcdev->pclk); - - ret = clk_prepare_enable(pcdev->pclk); - if (ret) - clk_put(pcdev->pclk); - - return ret; -} - -static void amba_put_disable_pclk(struct amba_device *pcdev) -{ - clk_disable_unprepare(pcdev->pclk); - clk_put(pcdev->pclk); -} - /* * These are the device model conversion veneers; they convert the * device model structures to our more specific structures. @@ -347,9 +394,7 @@ static void amba_device_release(struct device *dev) */ int amba_device_add(struct amba_device *dev, struct resource *parent) { - u32 size; - void __iomem *tmp; - int i, ret; + int ret; WARN_ON(dev->irq[0] == (unsigned int)-1); WARN_ON(dev->irq[1] == (unsigned int)-1); @@ -358,51 +403,6 @@ int amba_device_add(struct amba_device *dev, struct resource *parent) if (ret) goto err_out; - /* Hard-coded primecell ID instead of plug-n-play */ - if (dev->periphid != 0) - goto skip_probe; - - /* - * 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; - } - - ret = amba_get_enable_pclk(dev); - if (ret == 0) { - u32 pid, cid; - - /* - * Read pid and cid based on size of resource - * they are located at end of region - */ - for (pid = 0, i = 0; i < 4; i++) - pid |= (readl(tmp + size - 0x20 + 4 * i) & 255) << - (i * 8); - for (cid = 0, i = 0; i < 4; i++) - cid |= (readl(tmp + size - 0x10 + 4 * i) & 255) << - (i * 8); - - amba_put_disable_pclk(dev); - - if (cid == AMBA_CID || cid == CORESIGHT_CID) - dev->periphid = pid; - - if (!dev->periphid) - ret = -ENODEV; - } - - iounmap(tmp); - - if (ret) - goto err_release; - - skip_probe: ret = device_add(&dev->dev); if (ret) goto err_release;