From patchwork Sun Aug 11 11:04:30 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josh Wu X-Patchwork-Id: 2842702 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 481449F239 for ; Sun, 11 Aug 2013 11:08:39 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 684B020204 for ; Sun, 11 Aug 2013 11:08:38 +0000 (UTC) Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 5A58A201CE for ; Sun, 11 Aug 2013 11:08:37 +0000 (UTC) Received: from merlin.infradead.org ([2001:4978:20e::2]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1V8TVB-00046s-SU; Sun, 11 Aug 2013 11:08:02 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1V8TV0-0001yg-Ib; Sun, 11 Aug 2013 11:07:50 +0000 Received: from newsmtp5.atmel.com ([204.2.163.5] helo=sjogate2.atmel.com) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1V8TUa-0001vk-8G for linux-arm-kernel@lists.infradead.org; Sun, 11 Aug 2013 11:07:26 +0000 Received: from bamboo.corp.atmel.com ([10.217.3.88]) by sjogate2.atmel.com (8.13.6/8.13.6) with ESMTP id r7BB01V2011067; Sun, 11 Aug 2013 04:00:43 -0700 (PDT) From: Josh Wu To: jic23@cam.ac.uk Subject: [PATCH v2 3/4] iio: at91: ADC start-up time calculation changed since at91sam9x5 Date: Sun, 11 Aug 2013 19:04:30 +0800 Message-Id: <1376219071-29946-4-git-send-email-josh.wu@atmel.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1376219071-29946-1-git-send-email-josh.wu@atmel.com> References: <1376219071-29946-1-git-send-email-josh.wu@atmel.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20130811_070724_651896_7601A01C X-CRM114-Status: GOOD ( 14.61 ) X-Spam-Score: -4.6 (----) Cc: thomas.petazzoni@free-electrons.com, mark.rutland@arm.com, linux-iio@vger.kernel.org, nicolas.ferre@atmel.com, b.brezillon@overkiz.com, Josh Wu , maxime.ripard@free-electrons.com, plagnioj@jcrosoft.com, linux-arm-kernel@lists.infradead.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Since in at91sam9x5, sama5d3x chip. the start up time calucation is changed. This patch can choose different start up time calculation formula for different chips. Signed-off-by: Josh Wu --- v1 --> v2: add a new variable for different start_time calculation. drivers/iio/adc/at91_adc.c | 42 +++++++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/drivers/iio/adc/at91_adc.c b/drivers/iio/adc/at91_adc.c index b41eb60..9b0ffff 100644 --- a/drivers/iio/adc/at91_adc.c +++ b/drivers/iio/adc/at91_adc.c @@ -40,6 +40,7 @@ (writel_relaxed(val, st->reg_base + reg)) struct at91_adc_caps { + bool start_time_use_lookup_tab; u32 mr_prescal_mask; u32 mr_startup_mask; }; @@ -700,13 +701,39 @@ static int at91_adc_probe(struct platform_device *pdev) goto error_disable_adc_clk; } - /* - * Number of ticks needed to cover the startup time of the ADC as - * defined in the electrical characteristics of the board, divided by 8. - * The formula thus is : Startup Time = (ticks + 1) * 8 / ADC Clock - */ - ticks = round_up((st->startup_time * adc_clk_khz / - 1000) - 1, 8) / 8; + if (!st->caps->start_time_use_lookup_tab) { + /* + * Number of ticks needed to cover the startup time of the ADC + * as defined in the electrical characteristics of the board, + * divided by 8. The formula thus is : + * Startup Time = (ticks + 1) * 8 / ADC Clock + */ + ticks = round_up((st->startup_time * adc_clk_khz / + 1000) - 1, 8) / 8; + } else { + /* + * For sama5d3x and at91sam9x5, the formula changes to: + * Startup Time = / ADC Clock + */ + const int startup_lookup[] = { + 0 , 8 , 16 , 24 , + 64 , 80 , 96 , 112, + 512, 576, 640, 704, + 768, 832, 896, 960 + }; + + int i, size = ARRAY_SIZE(startup_lookup); + ticks = st->startup_time * adc_clk_khz / 1000; + for (i = 0; i < size; i++) + if (ticks < startup_lookup[i]) + break; + + ticks = i; + if (ticks == size) + /* Reach the end of lookup table */ + ticks = size - 1; + } + /* * a minimal Sample and Hold Time is necessary for the ADC to guarantee * the best converted final value between two channels selection @@ -798,6 +825,7 @@ static struct at91_adc_caps at91sam9g45_caps = { }; static struct at91_adc_caps at91sam9x5_caps = { + .start_time_use_lookup_tab = true, .mr_prescal_mask = AT91_ADC_PRESCAL_9G45, /* same as 9G45 */ .mr_startup_mask = AT91_ADC_STARTUP_9X5, };