Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp1169410pxv; Fri, 23 Jul 2021 01:18:49 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxULLlR+Bsgx7Ux12oFgcaeqhuTcYQNaVL5VnRtd+eukXKM2P83ZtmYxfMJdlpdF6OzUTmu X-Received: by 2002:a02:cc4e:: with SMTP id i14mr3123721jaq.125.1627028329708; Fri, 23 Jul 2021 01:18:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627028329; cv=none; d=google.com; s=arc-20160816; b=G0TFE1+winio7z2yz9uMigXxCSJi99Vz09c//9h1AyAhuHgcNz5D/8xP9kOqzX/dkV +E3LQkRxFEiNusZ51pCnrqxd/wAwWDDWpt+W7mpWGvH5zDwuoko/RY339Ow100ElDrMO 7fLbNbiuLWzQgc1DgfC1wyev4ncLumRQg6B23hHS1KxJCDERMQH3+tNjr/weRbfWaLdV tELgfK7SoWhBwO3vJy33r+BZLXYRBTpgfeJvrfayKlVmDtYQSv0wc/E9i/aNOkitaWzB QSXxDdPpsR1C9dslhaFlluqhYS8FRqXiILMdk6Fbkg1W3f6sD4VZ6clcmjI9H/AUJFSh QrxA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=t9Lg4e0MNKv1atpREXaIbiWObJAbXR7G+bWbq8GB6TQ=; b=YPmmxaJNtUVrCxq6UKUZIywhMQ8+LNUzqIBiMoqj1QglFHDI+oL1/ESWOy8i0vol9l MX5hzutZRsKHbPBNLsSymCn/mC/0I1ryzD5U3nkORCRWxLCze5DwSYkTbXYEwcipuHDg NhHlvnDMG9QOvzWL6lksfWGE+575XFnWOsOCQAHSE0Uxs3iJ2NED9k6zLT0rcpGPBFzC iDlFQAIf909HVffrgKkmaKQ/wvsPO8x7WQW4ovpSrr0IIAW6MfKQQSGidNmuG8i3glcu W5pBpk/DaX8M9sa5wd4JGr8T1ugRoxUjwbQ32dvFOhx+bInwONP0seXc/RykdzKht429 RADg== ARC-Authentication-Results: i=1; mx.google.com; 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 b16si34014319ile.135.2021.07.23.01.18.38; Fri, 23 Jul 2021 01:18:49 -0700 (PDT) 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; 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 S234540AbhGWHga (ORCPT + 99 others); Fri, 23 Jul 2021 03:36:30 -0400 Received: from twspam01.aspeedtech.com ([211.20.114.71]:30091 "EHLO twspam01.aspeedtech.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234535AbhGWHg3 (ORCPT ); Fri, 23 Jul 2021 03:36:29 -0400 Received: from mail.aspeedtech.com ([192.168.0.24]) by twspam01.aspeedtech.com with ESMTP id 16N7x6Wf041952; Fri, 23 Jul 2021 15:59:06 +0800 (GMT-8) (envelope-from billy_tsai@aspeedtech.com) Received: from BillyTsai-pc.aspeed.com (192.168.2.149) by TWMBX02.aspeed.com (192.168.0.24) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Fri, 23 Jul 2021 16:15:41 +0800 From: Billy Tsai To: , , , , , , , , , , , CC: Subject: [v2 7/8] iio: adc: aspeed: Fix the calculate error of clock. Date: Fri, 23 Jul 2021 16:16:20 +0800 Message-ID: <20210723081621.29477-8-billy_tsai@aspeedtech.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210723081621.29477-1-billy_tsai@aspeedtech.com> References: <20210723081621.29477-1-billy_tsai@aspeedtech.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7BIT Content-Type: text/plain; charset=US-ASCII X-Originating-IP: [192.168.2.149] X-ClientProxiedBy: TWMBX02.aspeed.com (192.168.0.24) To TWMBX02.aspeed.com (192.168.0.24) X-DNSRBL: X-MAIL: twspam01.aspeedtech.com 16N7x6Wf041952 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The adc clcok formula is ast2400/2500: ADC clock period = PCLK * 2 * (ADC0C[31:17] + 1) * (ADC0C[9:0] + 1) ast2600: ADC clock period = PCLK * 2 * (ADC0C[15:0] + 1) They all have one fixed divided 2 and the legacy driver didn't handle it. This patch register the fixed factory clock device as the parent of adc clock scaler to fix this issue. Signed-off-by: Billy Tsai --- drivers/iio/adc/aspeed_adc.c | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/drivers/iio/adc/aspeed_adc.c b/drivers/iio/adc/aspeed_adc.c index 0153b28b83b7..7e674b607e36 100644 --- a/drivers/iio/adc/aspeed_adc.c +++ b/drivers/iio/adc/aspeed_adc.c @@ -80,6 +80,7 @@ struct aspeed_adc_data { struct device *dev; void __iomem *base; spinlock_t clk_lock; + struct clk_hw *fixed_div_clk; struct clk_hw *clk_prescaler; struct clk_hw *clk_scaler; struct reset_control *rst; @@ -310,6 +311,7 @@ static int aspeed_adc_probe(struct platform_device *pdev) int ret; u32 adc_engine_control_reg_val; char scaler_clk_name[32]; + char fixed_div_clk_name[32]; model_data = of_device_get_match_data(&pdev->dev); indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*data)); @@ -328,10 +330,15 @@ static int aspeed_adc_probe(struct platform_device *pdev) spin_lock_init(&data->clk_lock); clk_parent_name = of_clk_get_parent_name(pdev->dev.of_node, 0); if (model_data->version <= aspeed_adc_ast2500) { + /* ADC clock period = PCLK * 2 * (ADC0C[31:17] + 1) * (ADC0C[9:0] + 1) */ + data->fixed_div_clk = clk_hw_register_fixed_factor( + &pdev->dev, "fixed-div", clk_parent_name, 0, 1, 2); + if (IS_ERR(data->fixed_div_clk)) + return PTR_ERR(data->fixed_div_clk); data->clk_prescaler = clk_hw_register_divider( - &pdev->dev, "prescaler", clk_parent_name, 0, - data->base + ASPEED_REG_CLOCK_CONTROL, - 17, 15, 0, &data->clk_lock); + &pdev->dev, "prescaler", "fixed-div", 0, + data->base + ASPEED_REG_CLOCK_CONTROL, 17, 15, 0, + &data->clk_lock); if (IS_ERR(data->clk_prescaler)) return PTR_ERR(data->clk_prescaler); @@ -349,14 +356,23 @@ static int aspeed_adc_probe(struct platform_device *pdev) goto scaler_error; } } else { + /* ADC clock period = period of PCLK * 2 * (ADC0C[15:0] + 1) */ + snprintf(fixed_div_clk_name, sizeof(fixed_div_clk_name), "fixed-div-%s", + pdev->name); + data->fixed_div_clk = clk_hw_register_fixed_factor( + &pdev->dev, fixed_div_clk_name, clk_parent_name, 0, 1, 2); + if (IS_ERR(data->fixed_div_clk)) + return PTR_ERR(data->fixed_div_clk); snprintf(scaler_clk_name, sizeof(scaler_clk_name), "scaler-%s", pdev->name); data->clk_scaler = clk_hw_register_divider( &pdev->dev, scaler_clk_name, clk_parent_name, 0, data->base + ASPEED_REG_CLOCK_CONTROL, 0, 16, 0, &data->clk_lock); - if (IS_ERR(data->clk_scaler)) - return PTR_ERR(data->clk_scaler); + if (IS_ERR(data->clk_scaler)) { + ret = PTR_ERR(data->clk_scaler); + goto scaler_error; + } } data->rst = devm_reset_control_get_shared(&pdev->dev, NULL); @@ -430,6 +446,7 @@ static int aspeed_adc_probe(struct platform_device *pdev) scaler_error: if (model_data->version <= aspeed_adc_ast2500) clk_hw_unregister_divider(data->clk_prescaler); + clk_hw_unregister_fixed_factor(data->fixed_div_clk); return ret; } @@ -448,6 +465,7 @@ static int aspeed_adc_remove(struct platform_device *pdev) clk_hw_unregister_divider(data->clk_scaler); if (model_data->version <= aspeed_adc_ast2500) clk_hw_unregister_divider(data->clk_prescaler); + clk_hw_unregister_fixed_factor(data->fixed_div_clk); return 0; } -- 2.25.1