From patchwork Sat Dec 14 05:50:11 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Horman X-Patchwork-Id: 3345081 Return-Path: X-Original-To: patchwork-ltsi-dev@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 07536C0D4A for ; Sat, 14 Dec 2013 05:56:15 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 2DDC1203DA for ; Sat, 14 Dec 2013 05:56:14 +0000 (UTC) Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) by mail.kernel.org (Postfix) with ESMTP id 4FD9120171 for ; Sat, 14 Dec 2013 05:56:13 +0000 (UTC) Received: from mail.linux-foundation.org (localhost [IPv6:::1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 986808D5; Sat, 14 Dec 2013 05:56:06 +0000 (UTC) X-Original-To: ltsi-dev@lists.linuxfoundation.org Delivered-To: ltsi-dev@mail.linuxfoundation.org Received: from smtp2.linuxfoundation.org (smtp2.linux-foundation.org [172.17.192.36]) by mail.linuxfoundation.org (Postfix) with ESMTP id 652438D5 for ; Sat, 14 Dec 2013 05:56:05 +0000 (UTC) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from kirsty.vergenet.net (kirsty.vergenet.net [202.4.237.240]) by smtp2.linuxfoundation.org (Postfix) with ESMTP id AD4081DD5A for ; Sat, 14 Dec 2013 05:56:04 +0000 (UTC) Received: from penelope.isobedori.kobe.vergenet.net (g1-27-253-251-111.bmobile.ne.jp [27.253.251.111]) by kirsty.vergenet.net (Postfix) with ESMTP id 42F1C266CF2; Sat, 14 Dec 2013 16:55:58 +1100 (EST) Received: by penelope.isobedori.kobe.vergenet.net (Postfix, from userid 7100) id C6C197C0325; Sat, 14 Dec 2013 14:53:55 +0900 (JST) From: Simon Horman To: ltsi-dev@lists.linuxfoundation.org Date: Sat, 14 Dec 2013 14:50:11 +0900 Message-Id: <1387000406-29111-43-git-send-email-horms+renesas@verge.net.au> X-Mailer: git-send-email 1.8.4 In-Reply-To: <1387000406-29111-1-git-send-email-horms+renesas@verge.net.au> References: <1387000406-29111-1-git-send-email-horms+renesas@verge.net.au> X-Spam-Status: No, score=-2.3 required=5.0 tests=BAYES_00,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 Cc: Magnus Damm Subject: [LTSI-dev] [PATCH 042/237] [media] v4l: vsp1: Add support for RT clock X-BeenThere: ltsi-dev@lists.linuxfoundation.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: "A list to discuss patches, development, and other things related to the LTSI project" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ltsi-dev-bounces@lists.linuxfoundation.org Errors-To: ltsi-dev-bounces@lists.linuxfoundation.org X-Virus-Scanned: ClamAV using ClamSMTP From: Laurent Pinchart The VSPR and VSPS instances use two clocks, the VSP1 system clock and the VSP1 realtime clock. Both of them need to be enabled to access the VSP1 registers. Add support for an optional RT clock and enable/disable it along with the system clock. Signed-off-by: Laurent Pinchart Signed-off-by: Mauro Carvalho Chehab (cherry picked from commit f2226a33bf9a431f616b435aa10a9ad4fea1d042) Signed-off-by: Simon Horman --- drivers/media/platform/vsp1/vsp1.h | 1 + drivers/media/platform/vsp1/vsp1_drv.c | 40 +++++++++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/drivers/media/platform/vsp1/vsp1.h b/drivers/media/platform/vsp1/vsp1.h index 11ac94b..d6c6ecd 100644 --- a/drivers/media/platform/vsp1/vsp1.h +++ b/drivers/media/platform/vsp1/vsp1.h @@ -42,6 +42,7 @@ struct vsp1_device { void __iomem *mmio; struct clk *clock; + struct clk *rt_clock; struct mutex lock; int ref_count; diff --git a/drivers/media/platform/vsp1/vsp1_drv.c b/drivers/media/platform/vsp1/vsp1_drv.c index aa8b9b2..1c9e771 100644 --- a/drivers/media/platform/vsp1/vsp1_drv.c +++ b/drivers/media/platform/vsp1/vsp1_drv.c @@ -290,6 +290,33 @@ static int vsp1_device_init(struct vsp1_device *vsp1) return 0; } +static int vsp1_clocks_enable(struct vsp1_device *vsp1) +{ + int ret; + + ret = clk_prepare_enable(vsp1->clock); + if (ret < 0) + return ret; + + if (IS_ERR(vsp1->rt_clock)) + return 0; + + ret = clk_prepare_enable(vsp1->rt_clock); + if (ret < 0) { + clk_disable_unprepare(vsp1->clock); + return ret; + } + + return 0; +} + +static void vsp1_clocks_disable(struct vsp1_device *vsp1) +{ + if (!IS_ERR(vsp1->rt_clock)) + clk_disable_unprepare(vsp1->rt_clock); + clk_disable_unprepare(vsp1->clock); +} + /* * vsp1_device_get - Acquire the VSP1 device * @@ -307,7 +334,7 @@ struct vsp1_device *vsp1_device_get(struct vsp1_device *vsp1) if (vsp1->ref_count > 0) goto done; - ret = clk_prepare_enable(vsp1->clock); + ret = vsp1_clocks_enable(vsp1); if (ret < 0) { __vsp1 = NULL; goto done; @@ -315,7 +342,7 @@ struct vsp1_device *vsp1_device_get(struct vsp1_device *vsp1) ret = vsp1_device_init(vsp1); if (ret < 0) { - clk_disable_unprepare(vsp1->clock); + vsp1_clocks_disable(vsp1); __vsp1 = NULL; goto done; } @@ -339,7 +366,7 @@ void vsp1_device_put(struct vsp1_device *vsp1) mutex_lock(&vsp1->lock); if (--vsp1->ref_count == 0) - clk_disable_unprepare(vsp1->clock); + vsp1_clocks_disable(vsp1); mutex_unlock(&vsp1->lock); } @@ -358,7 +385,7 @@ static int vsp1_pm_suspend(struct device *dev) if (vsp1->ref_count == 0) return 0; - clk_disable_unprepare(vsp1->clock); + vsp1_clocks_disable(vsp1); return 0; } @@ -371,7 +398,7 @@ static int vsp1_pm_resume(struct device *dev) if (vsp1->ref_count) return 0; - return clk_prepare_enable(vsp1->clock); + return vsp1_clocks_enable(vsp1); } #endif @@ -445,6 +472,9 @@ static int vsp1_probe(struct platform_device *pdev) return PTR_ERR(vsp1->clock); } + /* The RT clock is optional */ + vsp1->rt_clock = devm_clk_get(&pdev->dev, "rt"); + irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); if (!irq) { dev_err(&pdev->dev, "missing IRQ\n");