From patchwork Mon Aug 13 14:50:14 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thierry Reding X-Patchwork-Id: 957006 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="mCLvrts5"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41pzDT736Kz9s9l for ; Tue, 14 Aug 2018 00:50:33 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729479AbeHMRdI (ORCPT ); Mon, 13 Aug 2018 13:33:08 -0400 Received: from mail-wm0-f65.google.com ([74.125.82.65]:40357 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728455AbeHMRdH (ORCPT ); Mon, 13 Aug 2018 13:33:07 -0400 Received: by mail-wm0-f65.google.com with SMTP id y9-v6so9156252wma.5; Mon, 13 Aug 2018 07:50:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=KHe8/PwxOQLW9WoOgIew5iCP7cTie3eNqs43MXG4ubE=; b=mCLvrts5AhjIuxD9ZYbSPS0EmcEpPU8yTF7O4IKABP1l4N7KiMevOHqOJv1yNHZdkS FDprOHc3edlSOHixduGhnA8j1ONiI4JvEmZcQa9RMmkSPXXBW3FsvZWTekFJQpnJsi29 5lMKrvec07+G5faPwmSDUVE+PKxu8tcXrYknsGVwQicQvw19Dxeivsv/B93L7OEwq5uq rLkGcrdjqDPq70cxJvjw2RPZYHgYvsID5VZsRsi19dmwifMHHUyzmsee2HI3Y8obE0ZH 8TILguLEdiCuMS0YzTFKgpDE9fMXzprbBfdnliKAy5i8QFFig9412yx28mKd9Zm1SGaI 6o4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=KHe8/PwxOQLW9WoOgIew5iCP7cTie3eNqs43MXG4ubE=; b=mYszdtB4DjPToEX0CsPLmQuHNlyYXfmzrUcVzAi+DiZ5ELFnMNIHYHrwu3rvBhl4Yb I7G+J+vT7aVCmTbz1Huh/Mj++NmH3sDQ8rMnuRVAoRJsaVS4WPlMUXnriS4R/rznuL+r EFWXi/h7nmdzihNQn0b7nAPGiTtaeTurq/niSsCCfP10li6S+3F1sN1cWgaZFSs658ox RbMMXBQN8u9FN6iF9i/ljr1Ap9mHCzxW2CRnyVZWX91F8Jj2ela8TeUu6tIMyEK80t3B CnI+E+icEgk2vVlTKXHm+Iy3QSxfvOMxUdImGUZxw1+4JVB+QNjEMz1YXADuH2ZFjvd0 BkJQ== X-Gm-Message-State: AOUpUlFGZH+Qiddrfo4d+Ky2xxsjz8dFSj/msdxL0U/dY6B0PoWoUJ65 Aa1N6xUm6kUnjE3GyT1zrZ0= X-Google-Smtp-Source: AA+uWPysTX+othxSUkaojnmxY5aSm0AdLgum1hL5RwHCJvx23pr0YWs7dM1UOf2i9zm+DEEfhHCa2w== X-Received: by 2002:a1c:a703:: with SMTP id q3-v6mr8512003wme.28.1534171830894; Mon, 13 Aug 2018 07:50:30 -0700 (PDT) Received: from localhost (pD9E51C80.dip0.t-ipconnect.de. [217.229.28.128]) by smtp.gmail.com with ESMTPSA id e133-v6sm24172251wma.33.2018.08.13.07.50.29 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 13 Aug 2018 07:50:29 -0700 (PDT) From: Thierry Reding To: Mauro Carvalho Chehab , Thierry Reding Cc: Greg Kroah-Hartman , Dmitry Osipenko , Jonathan Hunter , linux-media@vger.kernel.org, linux-tegra@vger.kernel.org, devel@driverdev.osuosl.org Subject: [PATCH 01/14] staging: media: tegra-vde: Support BSEV clock and reset Date: Mon, 13 Aug 2018 16:50:14 +0200 Message-Id: <20180813145027.16346-2-thierry.reding@gmail.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180813145027.16346-1-thierry.reding@gmail.com> References: <20180813145027.16346-1-thierry.reding@gmail.com> Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org From: Thierry Reding The BSEV clock has a separate gate bit and can not be assumed to be always enabled. Add explicit handling for the BSEV clock and reset. This fixes an issue on Tegra124 where the BSEV clock is not enabled by default and therefore accessing the BSEV registers will hang the CPU if the BSEV clock is not enabled and the reset not deasserted. Signed-off-by: Thierry Reding --- drivers/staging/media/tegra-vde/tegra-vde.c | 35 +++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/drivers/staging/media/tegra-vde/tegra-vde.c b/drivers/staging/media/tegra-vde/tegra-vde.c index 6f06061a40d9..9d8f833744db 100644 --- a/drivers/staging/media/tegra-vde/tegra-vde.c +++ b/drivers/staging/media/tegra-vde/tegra-vde.c @@ -74,9 +74,11 @@ struct tegra_vde { struct miscdevice miscdev; struct reset_control *rst; struct reset_control *rst_mc; + struct reset_control *rst_bsev; struct gen_pool *iram_pool; struct completion decode_completion; struct clk *clk; + struct clk *clk_bsev; dma_addr_t iram_lists_addr; u32 *iram; }; @@ -979,6 +981,11 @@ static int tegra_vde_runtime_suspend(struct device *dev) return err; } + reset_control_assert(vde->rst_bsev); + + usleep_range(2000, 4000); + + clk_disable_unprepare(vde->clk_bsev); clk_disable_unprepare(vde->clk); return 0; @@ -996,6 +1003,16 @@ static int tegra_vde_runtime_resume(struct device *dev) return err; } + err = clk_prepare_enable(vde->clk_bsev); + if (err < 0) + return err; + + err = reset_control_deassert(vde->rst_bsev); + if (err < 0) + return err; + + usleep_range(2000, 4000); + return 0; } @@ -1084,14 +1101,21 @@ static int tegra_vde_probe(struct platform_device *pdev) if (IS_ERR(vde->frameid)) return PTR_ERR(vde->frameid); - vde->clk = devm_clk_get(dev, NULL); + vde->clk = devm_clk_get(dev, "vde"); if (IS_ERR(vde->clk)) { err = PTR_ERR(vde->clk); dev_err(dev, "Could not get VDE clk %d\n", err); return err; } - vde->rst = devm_reset_control_get(dev, NULL); + vde->clk_bsev = devm_clk_get(dev, "bsev"); + if (IS_ERR(vde->clk_bsev)) { + err = PTR_ERR(vde->clk_bsev); + dev_err(dev, "failed to get BSEV clock: %d\n", err); + return err; + } + + vde->rst = devm_reset_control_get(dev, "vde"); if (IS_ERR(vde->rst)) { err = PTR_ERR(vde->rst); dev_err(dev, "Could not get VDE reset %d\n", err); @@ -1105,6 +1129,13 @@ static int tegra_vde_probe(struct platform_device *pdev) return err; } + vde->rst_bsev = devm_reset_control_get(dev, "bsev"); + if (IS_ERR(vde->rst_bsev)) { + err = PTR_ERR(vde->rst_bsev); + dev_err(dev, "failed to get BSEV reset: %d\n", err); + return err; + } + irq = platform_get_irq_byname(pdev, "sync-token"); if (irq < 0) return irq;