From patchwork Sun Jun 26 07:28:31 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Boyd X-Patchwork-Id: 70865 Delivered-To: patch@linaro.org Received: by 10.140.28.4 with SMTP id 4csp555144qgy; Sun, 26 Jun 2016 00:30:58 -0700 (PDT) X-Received: by 10.66.54.35 with SMTP id g3mr23338410pap.30.1466926258631; Sun, 26 Jun 2016 00:30:58 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d3si18120976pay.44.2016.06.26.00.30.58; Sun, 26 Jun 2016 00:30:58 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-usb-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-usb-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-usb-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 S1752308AbcFZH3T (ORCPT + 5 others); Sun, 26 Jun 2016 03:29:19 -0400 Received: from mail-pf0-f182.google.com ([209.85.192.182]:36863 "EHLO mail-pf0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752133AbcFZH3A (ORCPT ); Sun, 26 Jun 2016 03:29:00 -0400 Received: by mail-pf0-f182.google.com with SMTP id t190so51885398pfb.3 for ; Sun, 26 Jun 2016 00:29:00 -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:in-reply-to:references; bh=Ag7fT85NyQV8pS25hdbLGcSgHk9ekd+hDKGdxSneEW0=; b=F0p0xzsZL27Gov+eRwuhxykuv1OCNl7IeeuyRCsk7pvXj0lGM1wlKBRXFVsWqYLqu0 t89VFbSQnSzaB5Id959Gb0mMWoqZ8Upa461hOsFt1Svv/IssMdDc0L+tW7O6+vSiN3io HtFST0qyDe94Zg3lVl+toBd1RyyV3qIZFlZV4= 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:in-reply-to :references; bh=Ag7fT85NyQV8pS25hdbLGcSgHk9ekd+hDKGdxSneEW0=; b=JRm2jO5sEys7Glg8uedJMFyTEBO39j2VPmiwuagg0GN6oECnrPNZSusTPapqsjVsj4 ZUJ3AK+F0qoYpahrIgkoba9FzucptLLKX0fShQwz3PA8aQauwtAVPQjAjZMbFPEpF0j0 HkhICckshpCvm5KStJqaxcNaKAlaEyzbQ7om/LmLhTf619X3Dg4GP2JsoM+wd3hDJjSr H0IJU2yIWHETQL0TVz4CL7wQT6uTunLq4m5H2Ivyo45NX05peHOuSIzliTb83Xg7nK7g BPzcqFpHKXhMBFzgrp3XbytwPyBJzG1Dxku3P6b5+BcKTbZwXvQ3PSqMhxxsvPQTyh3U 2b2w== X-Gm-Message-State: ALyK8tI2bvdWPJ8Nv4ccYLM/O41922fc4XMp48/CZC6o8eqeHG+qlYaFPu4TlPnNnt+wbgcq X-Received: by 10.98.101.198 with SMTP id z189mr21987613pfb.53.1466926139890; Sun, 26 Jun 2016 00:28:59 -0700 (PDT) Received: from localhost.localdomain (ip68-101-172-78.sd.sd.cox.net. [68.101.172.78]) by smtp.gmail.com with ESMTPSA id f138sm3790495pfa.17.2016.06.26.00.28.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 26 Jun 2016 00:28:59 -0700 (PDT) From: Stephen Boyd To: linux-usb@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, Andy Gross , Bjorn Andersson , Neil Armstrong , Arnd Bergmann , Felipe Balbi , Peter Chen , Greg Kroah-Hartman Subject: [PATCH 14/21] usb: chipidea: msm: Add proper clk and reset support Date: Sun, 26 Jun 2016 00:28:31 -0700 Message-Id: <20160626072838.28082-15-stephen.boyd@linaro.org> X-Mailer: git-send-email 2.9.0.rc2.8.ga28705d In-Reply-To: <20160626072838.28082-1-stephen.boyd@linaro.org> References: <20160626072838.28082-1-stephen.boyd@linaro.org> Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org The msm chipidea controller uses two main clks, an AHB clk to read/write the MMIO registers and a core clk called the system clk that drives the controller itself. Add support for these clks as they're required in all designs. Also add support for an optional third clk that we need to turn on to read/write the ULPI phy registers. Some ULPI phys drive this clk themselves and so it isn't necessary to turn on to probe a ULPI device, but the HSIC phy doesn't provide one itself, so we must turn it on here. Cc: Peter Chen Cc: Greg Kroah-Hartman Signed-off-by: Stephen Boyd --- drivers/usb/chipidea/ci_hdrc_msm.c | 58 +++++++++++++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 4 deletions(-) -- 2.9.0.rc2.8.ga28705d -- To unsubscribe from this list: send the line "unsubscribe linux-usb" 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/usb/chipidea/ci_hdrc_msm.c b/drivers/usb/chipidea/ci_hdrc_msm.c index 07cccd24a87f..40249b0e3e93 100644 --- a/drivers/usb/chipidea/ci_hdrc_msm.c +++ b/drivers/usb/chipidea/ci_hdrc_msm.c @@ -10,11 +10,19 @@ #include #include #include +#include +#include #include "ci.h" #define HS_PHY_AHB_MODE 0x0098 +struct ci_hdrc_msm { + struct platform_device *ci; + struct clk *core_clk; + struct clk *iface_clk; +}; + static void ci_hdrc_msm_notify_event(struct ci_hdrc *ci, unsigned event) { struct device *dev = ci->gadget.dev.parent; @@ -43,34 +51,76 @@ static struct ci_hdrc_platform_data ci_hdrc_msm_platdata = { static int ci_hdrc_msm_probe(struct platform_device *pdev) { + struct ci_hdrc_msm *ci; struct platform_device *plat_ci; + struct clk *clk; + struct reset_control *reset; + int ret; dev_dbg(&pdev->dev, "ci_hdrc_msm_probe\n"); + ci = devm_kzalloc(&pdev->dev, sizeof(*ci), GFP_KERNEL); + if (!ci) + return -ENOMEM; + platform_set_drvdata(pdev, ci); + + reset = devm_reset_control_get(&pdev->dev, "core"); + if (IS_ERR(reset)) + return PTR_ERR(reset); + + ci->core_clk = clk = devm_clk_get(&pdev->dev, "core"); + if (IS_ERR(clk)) + return PTR_ERR(clk); + + ci->iface_clk = clk = devm_clk_get(&pdev->dev, "iface"); + if (IS_ERR(clk)) + return PTR_ERR(clk); + + reset_control_assert(reset); + usleep_range(10000, 12000); + reset_control_deassert(reset); + + ret = clk_prepare_enable(ci->core_clk); + if (ret) + return ret; + + ret = clk_prepare_enable(ci->iface_clk); + if (ret) + goto err_iface; + plat_ci = ci_hdrc_add_device(&pdev->dev, pdev->resource, pdev->num_resources, &ci_hdrc_msm_platdata); if (IS_ERR(plat_ci)) { dev_err(&pdev->dev, "ci_hdrc_add_device failed!\n"); - return PTR_ERR(plat_ci); + ret = PTR_ERR(plat_ci); + goto err_mux; } - platform_set_drvdata(pdev, plat_ci); + ci->ci = plat_ci; pm_runtime_no_callbacks(&pdev->dev); pm_runtime_enable(&pdev->dev); pm_runtime_get(&pdev->dev); return 0; + +err_mux: + clk_disable_unprepare(ci->iface_clk); +err_iface: + clk_disable_unprepare(ci->core_clk); + return ret; } static int ci_hdrc_msm_remove(struct platform_device *pdev) { - struct platform_device *plat_ci = platform_get_drvdata(pdev); + struct ci_hdrc_msm *ci = platform_get_drvdata(pdev); pm_runtime_put(&pdev->dev); pm_runtime_disable(&pdev->dev); - ci_hdrc_remove_device(plat_ci); + ci_hdrc_remove_device(ci->ci); + clk_disable_unprepare(ci->iface_clk); + clk_disable_unprepare(ci->core_clk); return 0; }