Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp441249imu; Wed, 19 Dec 2018 22:41:25 -0800 (PST) X-Google-Smtp-Source: AFSGD/UORaVg4mCSZJh1f97E+wBly6XMJD3oxCmsZyULVMVVlsBhieD2wfw/QqjEzFnpa3E+qIi/ X-Received: by 2002:a63:f34b:: with SMTP id t11mr5581108pgj.341.1545288084968; Wed, 19 Dec 2018 22:41:24 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1545288084; cv=none; d=google.com; s=arc-20160816; b=nW9tC6mTMMuJZj56dnDoMK0NNS0TGyNm4ucTLWh3nwuIiuic+QVtHf2W2yyQMj8LZl m5irw//NJCPhNk6vd5nsElr3BQRSPUrOQlb9gn2JYPPTSHQeF6m6aCJ+6vaMaFiDli/X 1y/TepNxUlDBWtQJbE76OkKN66CUFXRg8cB6k0QmTYfWaVAQDev33bZ/WJurz1m3GXtJ 09oSk0s1iBxBafFQNTcfqLmciOGJ0tXsEKCofyLcOUP9tLlJTNThUaMOsg0BI9UPo3qc 5sR9wylV6Yqffu5+wnDe2WueJcoJ/eeZD8njUU82yxl2exMECQf5LuNhqyiIRiLKuf6A i1cQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:message-id:references :in-reply-to:subject:cc:to:from:date:content-transfer-encoding :mime-version:dkim-signature:dkim-signature; bh=7DethAYkvEJtyYqtytN9cS+yj6CzSae1PtPFWLE+PYc=; b=OgFoGio3S1ylvGN4zgWKVqT8IRTyEuvaUx1cmzhz9dGLoW0jq90diA6ERkQyA3yGLr T58TN5NZRytoCh2XPoA5i5spp+sg44Vp2GqZgrhylBgqsaAo+0Er6rSD4d4vLKmjhA+5 AFMoxBbXUFQkesIpoHMAzjXvyT4g0xKyXsBKs31cbnQLMI0LniB+iSuvErurVIqM2Yur zuBZUmTBVo1nWoNc4W6AqYfPofuSxWi/TEUNvyjoyIgI1dysU1V6oYjV+fhdFif+UOzh lAdNZGosXFhBCbKxbLm0HXfZ9O+r9l4JFbhYk4CWQaRp1lGmHEzdXeT3+xUQjQg3ail+ G8WQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=UgusZdKE; dkim=pass header.i=@codeaurora.org header.s=default header.b=FH3IEsiN; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p3si17965300pgi.0.2018.12.19.22.41.09; Wed, 19 Dec 2018 22:41:24 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=UgusZdKE; dkim=pass header.i=@codeaurora.org header.s=default header.b=FH3IEsiN; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729738AbeLTEDp (ORCPT + 99 others); Wed, 19 Dec 2018 23:03:45 -0500 Received: from smtp.codeaurora.org ([198.145.29.96]:47730 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727694AbeLTEDp (ORCPT ); Wed, 19 Dec 2018 23:03:45 -0500 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 488B6607CA; Thu, 20 Dec 2018 04:03:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1545278624; bh=6wy6dkCowRS5htXWl0qOm0vaFR1/mK46y9nAOy+y44Y=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=UgusZdKESW8sgqlcuYKFLiEXoAfgIrN99kb0iG05G9+YdNCmm7DCVgpjT2bcDNQ7V 5eay5zGvXe+yg6aOxjisKBb7QpOS/ziRV/X6hhtH8VyE/YTov3W2IGeLeFIwDDLbLa 7PU1Sf9P2V2HkkTLCbfYzPaMtJ+/UEsfRyZwlIYQ= X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_INVALID,DKIM_SIGNED autolearn=no autolearn_force=no version=3.4.0 Received: from mail.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.codeaurora.org (Postfix) with ESMTP id 5958F6014B; Thu, 20 Dec 2018 04:03:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1545278623; bh=6wy6dkCowRS5htXWl0qOm0vaFR1/mK46y9nAOy+y44Y=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=FH3IEsiNrhoVfJMB5CeojYVymHsh68+EBKZ5/52MZ1AbqSJKvr8KBPv2u04IhiFiY 06I4TLf/hWk8iUHw0l1Zis8E7zUJgkZ9A9TRIZWeks7rFlzOcAkO6SbVe61V1OR4D1 HAzcDn6SMc1iiZ7V9YMsiQbCK/xwjQYBU5S3itMg= MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Date: Thu, 20 Dec 2018 09:33:43 +0530 From: mgautam@codeaurora.org To: Shawn Guo Cc: Kishon Vijay Abraham I , Rob Herring , Sriharsha Allenki , Anu Ramanathan , Bjorn Andersson , Vinod Koul , Jack Pham , linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm-owner@vger.kernel.org Subject: Re: [PATCH v6 2/2] phy: qualcomm: Add Synopsys High-Speed USB PHY driver In-Reply-To: <20181220010112.16824-3-shawn.guo@linaro.org> References: <20181220010112.16824-1-shawn.guo@linaro.org> <20181220010112.16824-3-shawn.guo@linaro.org> Message-ID: X-Sender: mgautam@codeaurora.org User-Agent: Roundcube Webmail/1.2.5 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Shawn, On 2018-12-20 06:31, Shawn Guo wrote: > It adds Synopsys 28nm Femto High-Speed USB PHY driver support, which > is usually paired with Synopsys DWC3 USB controllers on Qualcomm SoCs. > > Signed-off-by: Shawn Guo > --- .... > + > +/* PHY register and bit definitions */ > +#define PHY_CTRL_COMMON0 0x078 > +#define SIDDQ BIT(2) > +#define PHY_IRQ_CMD 0x0d0 > +#define PHY_INTR_MASK0 0x0d4 > +#define PHY_INTR_CLEAR0 0x0dc > +#define DPDM_MASK 0x1e > +#define DP_1_0 BIT(4) > +#define DP_0_1 BIT(3) > +#define DM_1_0 BIT(2) > +#define DM_0_1 BIT(1) Can we rename these to something more readable? e.g.: #define DP_FALL_INT_EN BIT(4) #define DP_RISE_INT_EN BIT(3) ... > + > +enum hsphy_voltage { > + VOL_NONE, > + VOL_MIN, > + VOL_MAX, > + VOL_NUM, > +}; > + > +enum hsphy_vreg { > + VDD, > + VDDA_1P8, > + VDDA_3P3, > + VREG_NUM, > +}; > + > +struct hsphy_init_seq { > + int offset; > + int val; > + int delay; > +}; > + > +struct hsphy_data { > + const struct hsphy_init_seq *init_seq; > + unsigned int init_seq_num; > +}; > + > +struct hsphy_priv { nit-pick - indentation for following structure members? > + void __iomem *base; > + struct clk_bulk_data *clks; > + int num_clks; > + struct reset_control *phy_reset; > + struct reset_control *por_reset; > + struct regulator_bulk_data vregs[VREG_NUM]; > + unsigned int voltages[VREG_NUM][VOL_NUM]; > + const struct hsphy_data *data; > + bool cable_connected; You can get cable-connected state from "enum phy_mode mode" which is present in this driver. E.g. cable_connected is false if mode is neither HOST nor DEVICE. > + struct extcon_dev *vbus_edev; > + struct notifier_block vbus_notify; extcons not needed if you use "mode" for the same purpose. > + enum phy_mode mode; > +}; > + > + > +static int qcom_snps_hsphy_vbus_notifier(struct notifier_block *nb, > + unsigned long event, void *ptr) > +{ > + struct hsphy_priv *priv = container_of(nb, struct hsphy_priv, > + vbus_notify); > + priv->cable_connected = !!event; > + return 0; > +} > + > +static int qcom_snps_hsphy_power_on(struct phy *phy) Can you instead merge this power_on function with phy_init? > +{ > + struct hsphy_priv *priv = phy_get_drvdata(phy); > + int ret; > + > + if (priv->cable_connected) { Why distinguish between cable connected vs not-connected? > + ret = clk_bulk_prepare_enable(priv->num_clks, priv->clks); > + if (ret) > + return ret; > + qcom_snps_hsphy_disable_hv_interrupts(priv); > + } else { > + ret = qcom_snps_hsphy_enable_regulators(priv); > + if (ret) > + return ret; > + ret = clk_bulk_prepare_enable(priv->num_clks, priv->clks); > + if (ret) > + return ret; > + qcom_snps_hsphy_exit_retention(priv); > + } > + > + return 0; > +} > + > +static int qcom_snps_hsphy_power_off(struct phy *phy) > +{ > + struct hsphy_priv *priv = phy_get_drvdata(phy); > + > + if (priv->cable_connected) { > + qcom_snps_hsphy_enable_hv_interrupts(priv); > + clk_bulk_disable_unprepare(priv->num_clks, priv->clks); > + } else { > + qcom_snps_hsphy_enter_retention(priv); > + clk_bulk_disable_unprepare(priv->num_clks, priv->clks); > + qcom_snps_hsphy_disable_regulators(priv); > + } > + > + return 0; > +} > + .. > +static const struct phy_ops qcom_snps_hsphy_ops = { > + .init = qcom_snps_hsphy_init, > + .power_on = qcom_snps_hsphy_power_on, > + .power_off = qcom_snps_hsphy_power_off, > + .set_mode = qcom_snps_hsphy_set_mode, .phy_exit()? I believe that is needed as dwc3 core driver performs phy_exit/phy_init across pm_suspend/resume. > + .owner = THIS_MODULE, > +}; > +