Received: by 10.223.164.221 with SMTP id h29csp2775687wrb; Mon, 30 Oct 2017 09:23:25 -0700 (PDT) X-Google-Smtp-Source: ABhQp+Qhl++6G3hn5kMIwX/Bl4H6Z8tQ2UyEAwJ/4i/EL8lXsLgNiA8Ci1RzIQkfPcRhB+6X55vk X-Received: by 10.99.120.7 with SMTP id t7mr8099879pgc.360.1509380605600; Mon, 30 Oct 2017 09:23:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1509380605; cv=none; d=google.com; s=arc-20160816; b=mGQp+ANNHYvze59IjIdH/rbFibM9qEe8SJXmb4oNAFhHjjfFwCB4tXiIo0qleZ8c6n DSF30NBnR60lG2w0wVzsPGMAPoFle3XiwgQ+CBz6exiH/oBsWcZqn+EqrGGC3UKD8Ran 3Fbzn36ydHg1bHAyRKHavvK0WbtAQ9GvHGA4cyjEA3jo3g9OjdA/P9sBBOFtcoeE8Br3 vsP3PZK2dKmfiFQyhZbMP4yJ5g/8a2D5PmjBZtD47AqGe23z+245nLoSLXXPbTXO4WmS Ku+vSD4cxRoeLmx4hAFvHMzVJEZ9bWiyic0Z9n0/9Z07/gpIlSCZMGF9PUXtVrD1G+RE G4SQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature :arc-authentication-results; bh=kRQcPFUlWfk0j9dGOlKPaV0ZHCed7U2a6Cu/lz0jaMw=; b=zmTLBnRh5dAmhE3E2P0ZsIlAX88LDXerAjLbFRMDDI4ms0iod1+I2updsVXgOPTyD2 m01dv3de6z7Kwk35UW7YoeX0aciLGxjgniX7BMM0FGXI4KcgeuvIhH3MkW6ivDxZAsmb 5vW3nZfiR44E7h1W3Fx3poxjI9mXmn/19xyXJ3+XatnlXa+siKLWpPbuEsXLtBajyVbf rqARnotAWFpFZYUx0BQMh5gKU4t++wztxN08EllEqkRVSPMwZgq1PVfgTzIfWvC4g60o rVcl8SOnla07UpXH2yN2aMCn/7R4MkLxRw3gX0M8c8RqjHACWU1MMowA5JY8vjLfAS5+ G6SA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=ECDxNPAo; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id n2si6996785pgp.337.2017.10.30.09.23.11; Mon, 30 Oct 2017 09:23:25 -0700 (PDT) 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=@gmail.com header.s=20161025 header.b=ECDxNPAo; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932387AbdJ3QWA (ORCPT + 99 others); Mon, 30 Oct 2017 12:22:00 -0400 Received: from mail-ua0-f194.google.com ([209.85.217.194]:51342 "EHLO mail-ua0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751476AbdJ3QV6 (ORCPT ); Mon, 30 Oct 2017 12:21:58 -0400 Received: by mail-ua0-f194.google.com with SMTP id 47so9898045uas.8; Mon, 30 Oct 2017 09:21:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=kRQcPFUlWfk0j9dGOlKPaV0ZHCed7U2a6Cu/lz0jaMw=; b=ECDxNPAovU4ddhGj6fGkTd4f1bqPHCX1hubK212bri77QGfX6OPHuSdzTE8lNzSzwR dw/CSrsbNKbsEcM2cds8uP7dzjF95DPTWnB2/+HUBvA60jrWQ/V1THcs5DDXkSb7ObVN viGRp/hjE4hCklYM0VOJnNVmsYwTRvqlHV611poU5AwH1wADGz7kr/Zndkwh8PjYEqff xJs/x+xmxbEJgCWhyGIRYwUKYnNRbypwg6si3ybi8B5QU4GOooK1ehWdJzS/A/X6IVyf lCmeGtoRBIGs7RQUOM5G8Q7mxBzlGbpQGIaR8Fa0TKYiITMq9Ad+Esk+XDU4gMjXUAZy 2New== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=kRQcPFUlWfk0j9dGOlKPaV0ZHCed7U2a6Cu/lz0jaMw=; b=kR0M5N1ZkOvzFJUUHIqC5PX+ys2IDs75psLpuBmG9A0d6bLXEQeY3mHrOaioJvddce MKzil5Tje+lW0dkoUVZzVjYl+obgoczccj2pkrx0cDthpm9hIPm08cUrKooXUe0JA3wl J4yZBG0TbTgtvJVTFusXWeOnz46WJdflR6Wk5eJdXeQF8AWOSHp6F8sPhysB+RGhIViS zRuSJbGrye8XDNiZRhS7VvPa51mMsrYPJP+wkTC7A3u+eETW8PPopq+6PN72en+CFGe6 fSOSHcKhBbh0mZNZtCDFZpwuoH5KYJRLe5l901Y5hDBOUd2HeJM7qg+sAtVjL/XwKk+Z 0R/A== X-Gm-Message-State: AMCzsaUoOlIRFvHez06CG1nAPnuMz4EmJYJLcTUjM8UgiRzDDL0dWIqJ Jdpim10XV38y76DfGnIG08PksLWRQs92RIylE08= X-Received: by 10.176.28.5 with SMTP id a5mr8739180uaj.157.1509380517563; Mon, 30 Oct 2017 09:21:57 -0700 (PDT) MIME-Version: 1.0 Received: by 10.103.151.217 with HTTP; Mon, 30 Oct 2017 09:21:57 -0700 (PDT) In-Reply-To: <20171030072218.2094-1-joel@jms.id.au> References: <20171030072218.2094-1-joel@jms.id.au> From: Philipp Zabel Date: Mon, 30 Oct 2017 17:21:57 +0100 Message-ID: Subject: Re: [PATCH] iio: adc: aspeed: Deassert reset in probe To: Joel Stanley Cc: Jonathan Cameron , Rick Altherr , Rob Herring , Hartmut Knaack , Lars-Peter Clausen , Peter Meerwald-Stadler , linux-iio@vger.kernel.org, devicetree@vger.kernel.org, LKML Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Joel, On Mon, Oct 30, 2017 at 8:22 AM, Joel Stanley wrote: > The ASPEED SoC must deassert a reset in order to use the ADC peripheral. > > The device tree bindings are updated to document the resets phandle, and > the example is updated to match what is expected for both the reset and > clock phandle. > > Signed-off-by: Joel Stanley > --- > .../devicetree/bindings/iio/adc/aspeed_adc.txt | 4 +++- > drivers/iio/adc/aspeed_adc.c | 21 ++++++++++++++++----- > 2 files changed, 19 insertions(+), 6 deletions(-) > > diff --git a/Documentation/devicetree/bindings/iio/adc/aspeed_adc.txt b/Documentation/devicetree/bindings/iio/adc/aspeed_adc.txt > index 674e133b7cd7..034fc2ba100e 100644 > --- a/Documentation/devicetree/bindings/iio/adc/aspeed_adc.txt > +++ b/Documentation/devicetree/bindings/iio/adc/aspeed_adc.txt > @@ -8,6 +8,7 @@ Required properties: > - reg: memory window mapping address and length > - clocks: Input clock used to derive the sample clock. Expected to be the > SoC's APB clock. > +- resets: Reset controller phandle Adding new required properties to existing bindings would break backwards compatibility. In this case, the reset is optional anyway. > - #io-channel-cells: Must be set to <1> to indicate channels are selected > by index. > > @@ -15,6 +16,7 @@ Example: > adc@1e6e9000 { > compatible = "aspeed,ast2400-adc"; > reg = <0x1e6e9000 0xb0>; > - clocks = <&clk_apb>; > + clocks = <&syscon ASPEED_CLK_APB>; > + resets = <&syscon ASPEED_RESET_ADC>; > #io-channel-cells = <1>; > }; > diff --git a/drivers/iio/adc/aspeed_adc.c b/drivers/iio/adc/aspeed_adc.c > index 8a958d5f1905..0fc9712cdde4 100644 > --- a/drivers/iio/adc/aspeed_adc.c > +++ b/drivers/iio/adc/aspeed_adc.c > @@ -17,6 +17,7 @@ > #include > #include > #include > +#include > #include > #include > > @@ -53,11 +54,12 @@ struct aspeed_adc_model_data { > }; > > struct aspeed_adc_data { > - struct device *dev; > - void __iomem *base; > - spinlock_t clk_lock; > - struct clk_hw *clk_prescaler; > - struct clk_hw *clk_scaler; > + struct device *dev; > + void __iomem *base; > + spinlock_t clk_lock; > + struct clk_hw *clk_prescaler; > + struct clk_hw *clk_scaler; > + struct reset_control *rst; > }; > > #define ASPEED_CHAN(_idx, _data_reg_addr) { \ > @@ -217,6 +219,13 @@ static int aspeed_adc_probe(struct platform_device *pdev) > goto scaler_error; Since data->rst is initialized to NULL, this does work. It would be nicer though to add a new label for errors after reset_control_deassert below. > } > > + data->rst = devm_reset_control_get_optional_exclusive(&pdev->dev, NULL); > + if (IS_ERR(data->rst)) { > + dev_err(&pdev->dev, "invalid reset controller in device tree"); > + data->rst = NULL; > + } else > + reset_control_deassert(data->rst); I'd return an error if devm_reset_control_get_optional_exclusive fails. Then reset_control_deassert can be called unconditionally: data->rst = devm_reset_control_get_optional_exclusive(&pdev->dev, NULL); if (IS_ERR(data->rst)) { dev_err(&pdev->dev, "invalid reset controller in device tree"); ret = PTR_ERR(data->rst); goto reset_error; } reset_control_deassert(data->rst); > + > model_data = of_device_get_match_data(&pdev->dev); > > if (model_data->wait_init_sequence) { > @@ -268,6 +277,7 @@ static int aspeed_adc_probe(struct platform_device *pdev) > > scaler_error: > clk_hw_unregister_divider(data->clk_prescaler); > + reset_control_assert(data->rst); This should be done in reverse order, before clk_hw_unregister_divider, and get its own label. > return ret; > } > > @@ -282,6 +292,7 @@ static int aspeed_adc_remove(struct platform_device *pdev) > clk_disable_unprepare(data->clk_scaler->clk); > clk_hw_unregister_divider(data->clk_scaler); > clk_hw_unregister_divider(data->clk_prescaler); > + reset_control_assert(data->rst); Same here, if the reset is deasserted after registering clk_scaler, it would be cleaner to assert it before unregistering the clock. > > return 0; > } > -- > 2.14.1 > regards Philipp From 1582667043959190093@xxx Mon Oct 30 07:35:11 +0000 2017 X-GM-THRID: 1582667043959190093 X-Gmail-Labels: Inbox,Category Forums