Received: by 2002:a05:6a10:2785:0:0:0:0 with SMTP id ia5csp424494pxb; Wed, 13 Jan 2021 07:04:18 -0800 (PST) X-Google-Smtp-Source: ABdhPJxYv5xE9FF1juDPOdtwOspYx8LjGd0CBRTQB8d2rkk6qzsKOB3dD2WhhBJoxb+fukQKjtHb X-Received: by 2002:a05:6402:2292:: with SMTP id cw18mr2131533edb.336.1610550258052; Wed, 13 Jan 2021 07:04:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1610550258; cv=none; d=google.com; s=arc-20160816; b=Iqr7MhdpXE4+dqvpqP0SZTbWB6Ccc9Ldom1kAW9zhk/AjKEhr9ZU7eZymTUoi19GTO CgehIUS8mgjVLjAZvEcg9X+9mxwO9+fKWt5NDkN4R5MpL4jgW1Sca1UKDnva+sc0gYrd qXjEGAsLCwEE7TtQf2PjSiw4Iujz5lULl9htNTWF2/kzWvRZZK+twuWRDCXUwTgWpYY3 KcUg5cEEWBjpPHf53MVtFPXY4qECjxQzA5xWNq6ZteRrZA3ehdcwkBjyUPnaPie8phOW ivEsfoNe2zxlnXDiXaCEiRxMBvAFzK7EdGvtPJ44FXT4nPPItL5sJMBG8UKSb6wSmtao F05g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:content-language :in-reply-to:mime-version:user-agent:date:message-id:subject:from :references:cc:to:dkim-signature:dkim-signature; bh=kgvdwXkdpPX8T9l8I0tjCSoezf+011r+MmhPeMFMkf8=; b=t/eOjyKLJnAvlj2mmfsuZw84fgS18k34I5UcoX3ExMQUcpcMFC86AP4LWz1f8L4P/H UYKwZF9ti8QHyCopXd9I3V3ZCYSd5IVDgoEcaxX+XjizEQFICZyUrESr6e42hRghJK0w aUGNMe+ZgVGafjDUGUz/eSdAtbcFAxbfY5qjJ73Qz8wsfbhoPNjdCaR0Envstvh1FIP3 NwWL6zqokFZ7dw/E/9Wjim6bLxO0SmRKKHPEVWN/sUT8XAafJE7OBKSYCDAG9Cpg+4sx Caber4zGxR3sQXovr0BWb7l4FMj+LOjogsnYckLQyxii1kx+V7hcuoiI2xahjc3NP51C KCrA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sholland.org header.s=fm1 header.b=RNSP7TLE; dkim=pass header.i=@messagingengine.com header.s=fm1 header.b=qPDo1ogD; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id m5si1350090edb.242.2021.01.13.07.03.52; Wed, 13 Jan 2021 07:04:18 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@sholland.org header.s=fm1 header.b=RNSP7TLE; dkim=pass header.i=@messagingengine.com header.s=fm1 header.b=qPDo1ogD; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725977AbhAMPBL (ORCPT + 99 others); Wed, 13 Jan 2021 10:01:11 -0500 Received: from out3-smtp.messagingengine.com ([66.111.4.27]:53453 "EHLO out3-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725747AbhAMPBK (ORCPT ); Wed, 13 Jan 2021 10:01:10 -0500 Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) by mailout.nyi.internal (Postfix) with ESMTP id 3B1575C0121; Wed, 13 Jan 2021 10:00:23 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute5.internal (MEProxy); Wed, 13 Jan 2021 10:00:23 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sholland.org; h= to:cc:references:from:subject:message-id:date:mime-version :in-reply-to:content-type:content-transfer-encoding; s=fm1; bh=k gvdwXkdpPX8T9l8I0tjCSoezf+011r+MmhPeMFMkf8=; b=RNSP7TLEoo76nKXZ8 NjzO6IQTMwJLFXVLTBDX0W/LK5nSYEGKrACEI12K8OGb6/suFOVMpgo3adUKFKBR 7pa/TOUt0qgmHaDF2dJEmZZoDLK47dC34vtPsPWW58U94+yE9fV86XqLRMgR8Yxv 7Q7M9BjHNwEiQEd1opt50cTh4uOBoIjSHFyumOyf8hQkGKZXZ33xnHajmXCDgJ6t ZXpHQY5JPyqOXUAgozjRUj32PCR08tITrOE0Sq1mEo3nRkui06O4T7oGoQCCvLcN cF3okjcd6I3B0FNA1fiFiUAtqjTDafB5yjwQt6jFtP1W0+5HtpaDf9MPUX5J7CAL siBww== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:content-type :date:from:in-reply-to:message-id:mime-version:references :subject:to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender :x-sasl-enc; s=fm1; bh=kgvdwXkdpPX8T9l8I0tjCSoezf+011r+MmhPeMFMk f8=; b=qPDo1ogDlu1XOniwsuAg96vO3CbHVyElyGlosGyyig9XUqPk7wP5p4Jg+ iakpwDVS2PVg3F7sLIY5ZdDEj4Lt93RdJNr2A4E2UKJ1vyvBaNSjuAZB+SqXj8WR CmekFOpMGneHPkRCCGdeybKGEzS0r7S+L9IPxxahMZDrhRRM0UukScCK/wbWI/FV IzN1BPZRK7Lc339I4yuN5s/mhgasz8Rb2jXDJbxiQ+UQgJVQbaDrjKr3UI5NhrfG Cnmc18jLLVpL0/qZBmjzNwLcwV+h3XCEAqeaWJSrCrV2YBK+/aDCrVGsTN5F0E0W D/dUwyr0Glapt+B2VUcSUoNrZ4QSg== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedukedrtdefgdejtdcutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefvfhfhuffkffgfgggjtgfgsehtkeertddtfeejnecuhfhrohhmpefurghmuhgv lhcujfholhhlrghnugcuoehsrghmuhgvlhesshhhohhllhgrnhgurdhorhhgqeenucggtf frrghtthgvrhhnpedvtddtjeeiuddugfffveetkeffgeffgedutdfgfeekudevudekffeh tdefveeuvdenucfkphepjedtrddufeehrddugeekrdduhedunecuvehluhhsthgvrhfuih iivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepshgrmhhuvghlsehshhholhhlrghn ugdrohhrgh X-ME-Proxy: Received: from [70.135.148.151] (70-135-148-151.lightspeed.stlsmo.sbcglobal.net [70.135.148.151]) by mail.messagingengine.com (Postfix) with ESMTPA id 68FBE1080067; Wed, 13 Jan 2021 10:00:21 -0500 (EST) To: Sean Young Cc: Mauro Carvalho Chehab , Maxime Ripard , Chen-Yu Tsai , Jernej Skrabec , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sunxi@googlegroups.com References: <20210113045132.31430-1-samuel@sholland.org> <20210113045132.31430-4-samuel@sholland.org> <20210113143633.GB8430@gofer.mess.org> From: Samuel Holland Subject: Re: [PATCH 3/4] media: sunxi-cir: Factor out hardware initialization Message-ID: Date: Wed, 13 Jan 2021 09:00:20 -0600 User-Agent: Mozilla/5.0 (X11; Linux ppc64; rv:78.0) Gecko/20100101 Thunderbird/78.5.1 MIME-Version: 1.0 In-Reply-To: <20210113143633.GB8430@gofer.mess.org> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 1/13/21 8:36 AM, Sean Young wrote: > On Tue, Jan 12, 2021 at 10:51:31PM -0600, Samuel Holland wrote: >> In preparation for adding suspend/resume hooks, factor out the hardware >> initialization from the driver probe/remove functions. >> >> The timeout programmed during init is taken from the `struct rc_dev` so >> it is maintained across an exit/init cycle. >> >> This resolves some trivial issues with the probe function: throwing away >> the error from clk_prepare_enable and using the wrong type for the >> temporary register value. >> >> Signed-off-by: Samuel Holland >> --- >> drivers/media/rc/sunxi-cir.c | 128 ++++++++++++++++++++--------------- >> 1 file changed, 74 insertions(+), 54 deletions(-) >> >> diff --git a/drivers/media/rc/sunxi-cir.c b/drivers/media/rc/sunxi-cir.c >> index 48be400421cd..ccb9d6b4225d 100644 >> --- a/drivers/media/rc/sunxi-cir.c >> +++ b/drivers/media/rc/sunxi-cir.c >> @@ -169,10 +169,74 @@ static int sunxi_ir_set_timeout(struct rc_dev *rc_dev, unsigned int timeout) >> return 0; >> } >> >> +static int sunxi_ir_hw_init(struct device *dev) >> +{ >> + struct sunxi_ir *ir = dev_get_drvdata(dev); >> + u32 tmp; >> + int ret; >> + >> + ret = reset_control_deassert(ir->rst); >> + if (ret) >> + return ret; >> + >> + ret = clk_prepare_enable(ir->apb_clk); >> + if (ret) { >> + dev_err(dev, "failed to enable apb clk\n"); >> + goto exit_assert_reset; >> + } >> + >> + ret = clk_prepare_enable(ir->clk); >> + if (ret) { >> + dev_err(dev, "failed to enable ir clk\n"); >> + goto exit_disable_apb_clk; >> + } >> + >> + /* Enable CIR Mode */ >> + writel(REG_CTL_MD, ir->base + SUNXI_IR_CTL_REG); >> + >> + /* Set noise threshold and idle threshold */ >> + sunxi_ir_set_timeout(ir->rc, ir->rc->timeout); Initializing ir->rc->timeout in .probe is needed because of this line. As the changelog mentions, this reprograms the user-configured timeout after an exit/init (suspend/resume) cycle. It needs some default value the first time, when called from .probe. >> + >> + /* Invert Input Signal */ >> + writel(REG_RXCTL_RPPI, ir->base + SUNXI_IR_RXCTL_REG); >> + >> + /* Clear All Rx Interrupt Status */ >> + writel(REG_RXSTA_CLEARALL, ir->base + SUNXI_IR_RXSTA_REG); >> + >> + /* >> + * Enable IRQ on overflow, packet end, FIFO available with trigger >> + * level >> + */ >> + writel(REG_RXINT_ROI_EN | REG_RXINT_RPEI_EN | >> + REG_RXINT_RAI_EN | REG_RXINT_RAL(ir->fifo_size / 2 - 1), >> + ir->base + SUNXI_IR_RXINT_REG); >> + >> + /* Enable IR Module */ >> + tmp = readl(ir->base + SUNXI_IR_CTL_REG); >> + writel(tmp | REG_CTL_GEN | REG_CTL_RXEN, ir->base + SUNXI_IR_CTL_REG); >> + >> + return 0; >> + >> +exit_disable_apb_clk: >> + clk_disable_unprepare(ir->apb_clk); >> +exit_assert_reset: >> + reset_control_assert(ir->rst); >> + >> + return ret; >> +} >> + >> +static void sunxi_ir_hw_exit(struct device *dev) >> +{ >> + struct sunxi_ir *ir = dev_get_drvdata(dev); >> + >> + clk_disable_unprepare(ir->clk); >> + clk_disable_unprepare(ir->apb_clk); >> + reset_control_assert(ir->rst); >> +} >> + >> static int sunxi_ir_probe(struct platform_device *pdev) >> { >> int ret = 0; >> - unsigned long tmp = 0; >> >> struct device *dev = &pdev->dev; >> struct device_node *dn = dev->of_node; >> @@ -213,43 +277,26 @@ static int sunxi_ir_probe(struct platform_device *pdev) >> ir->rst = devm_reset_control_get_exclusive(dev, NULL); >> if (IS_ERR(ir->rst)) >> return PTR_ERR(ir->rst); >> - ret = reset_control_deassert(ir->rst); >> - if (ret) >> - return ret; >> } >> >> ret = clk_set_rate(ir->clk, b_clk_freq); >> if (ret) { >> dev_err(dev, "set ir base clock failed!\n"); >> - goto exit_reset_assert; >> + return ret; >> } >> dev_dbg(dev, "set base clock frequency to %d Hz.\n", b_clk_freq); >> >> - if (clk_prepare_enable(ir->apb_clk)) { >> - dev_err(dev, "try to enable apb_ir_clk failed\n"); >> - ret = -EINVAL; >> - goto exit_reset_assert; >> - } >> - >> - if (clk_prepare_enable(ir->clk)) { >> - dev_err(dev, "try to enable ir_clk failed\n"); >> - ret = -EINVAL; >> - goto exit_clkdisable_apb_clk; >> - } >> - >> /* IO */ >> res = platform_get_resource(pdev, IORESOURCE_MEM, 0); >> ir->base = devm_ioremap_resource(dev, res); >> if (IS_ERR(ir->base)) { >> - ret = PTR_ERR(ir->base); >> - goto exit_clkdisable_clk; >> + return PTR_ERR(ir->base); >> } >> >> ir->rc = rc_allocate_device(RC_DRIVER_IR_RAW); >> if (!ir->rc) { >> dev_err(dev, "failed to allocate device\n"); >> - ret = -ENOMEM; >> - goto exit_clkdisable_clk; >> + return -ENOMEM; >> } >> >> ir->rc->priv = ir; >> @@ -265,6 +312,7 @@ static int sunxi_ir_probe(struct platform_device *pdev) >> ir->rc->allowed_protocols = RC_PROTO_BIT_ALL_IR_DECODER; >> /* Frequency after IR internal divider with sample period in us */ >> ir->rc->rx_resolution = (USEC_PER_SEC / (b_clk_freq / 64)); >> + ir->rc->timeout = IR_DEFAULT_TIMEOUT; > > Why? This is set from sunxi_ir_set_timeout(). Because it is also sent as an argument to sunxi_ir_set_timeout(). >> ir->rc->min_timeout = sunxi_ithr_to_usec(b_clk_freq, 0); >> ir->rc->max_timeout = sunxi_ithr_to_usec(b_clk_freq, 255); >> ir->rc->s_timeout = sunxi_ir_set_timeout; >> @@ -291,41 +339,15 @@ static int sunxi_ir_probe(struct platform_device *pdev) >> goto exit_free_dev; >> } >> >> - /* Enable CIR Mode */ >> - writel(REG_CTL_MD, ir->base+SUNXI_IR_CTL_REG); >> - >> - /* Set noise threshold and idle threshold */ >> - sunxi_ir_set_timeout(ir->rc, IR_DEFAULT_TIMEOUT); This is where the default timeout was originally programmed. >> - >> - /* Invert Input Signal */ >> - writel(REG_RXCTL_RPPI, ir->base + SUNXI_IR_RXCTL_REG); >> - >> - /* Clear All Rx Interrupt Status */ >> - writel(REG_RXSTA_CLEARALL, ir->base + SUNXI_IR_RXSTA_REG); >> - >> - /* >> - * Enable IRQ on overflow, packet end, FIFO available with trigger >> - * level >> - */ >> - writel(REG_RXINT_ROI_EN | REG_RXINT_RPEI_EN | >> - REG_RXINT_RAI_EN | REG_RXINT_RAL(ir->fifo_size / 2 - 1), >> - ir->base + SUNXI_IR_RXINT_REG); >> - >> - /* Enable IR Module */ >> - tmp = readl(ir->base + SUNXI_IR_CTL_REG); >> - writel(tmp | REG_CTL_GEN | REG_CTL_RXEN, ir->base + SUNXI_IR_CTL_REG); >> + ret = sunxi_ir_hw_init(dev); >> + if (ret) >> + goto exit_free_dev; >> >> dev_info(dev, "initialized sunXi IR driver\n"); >> return 0; >> >> exit_free_dev: >> rc_free_device(ir->rc); >> -exit_clkdisable_clk: >> - clk_disable_unprepare(ir->clk); >> -exit_clkdisable_apb_clk: >> - clk_disable_unprepare(ir->apb_clk); >> -exit_reset_assert: >> - reset_control_assert(ir->rst); >> >> return ret; >> } >> @@ -334,11 +356,9 @@ static int sunxi_ir_remove(struct platform_device *pdev) >> { >> struct sunxi_ir *ir = platform_get_drvdata(pdev); >> >> - clk_disable_unprepare(ir->clk); >> - clk_disable_unprepare(ir->apb_clk); >> - reset_control_assert(ir->rst); >> - >> + sunxi_ir_hw_exit(&pdev->dev); >> rc_unregister_device(ir->rc); I can swap these lines to fix your comment on patch 1. >> + >> return 0; >> } >> >> -- >> 2.26.2