From patchwork Thu Nov 28 08:09:41 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Krzysztof Kozlowski X-Patchwork-Id: 294799 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail-ve0-x23c.google.com (mail-ve0-x23c.google.com [IPv6:2607:f8b0:400c:c01::23c]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (not verified)) by ozlabs.org (Postfix) with ESMTPS id 19D452C00A6 for ; Thu, 28 Nov 2013 19:10:02 +1100 (EST) Received: by mail-ve0-f188.google.com with SMTP id oy12sf2202184veb.5 for ; Thu, 28 Nov 2013 00:10:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20120806; h=mime-version:from:to:cc:subject:date:message-id:in-reply-to :references:x-original-sender:x-original-authentication-results :reply-to:precedence:mailing-list:list-id:list-post:list-help :list-archive:sender:list-subscribe:list-unsubscribe:content-type; bh=Bgwo1lGfFymdyH2SFou7I5uYPavZVxEH7Liyvdp0tRk=; b=DtTAPqw4p1JSpGT4jJaFIlHoQqNqj6TNZ51d0ZT27cwcss2bHNj/9iEDXCqTXyVIAU N8kSsGR/STY4zg6lQ/EkuxB9xXCGN6U8IXXTR8ksCUaxAZ7WHfaeNHvXOknjbT+qzSeo t6AokBUkOkj1lh7vzGOrcWAMfnKkPpoBxIHpSc6FKkH8BZ1yf2FncJZDYn/a6mbE8x8P hHn8Et4R98PLYU9QID0Xg2lq2OZWRQkMgqvJnYhevkMGUbdlQFnT2vuB6DwGHuoO6Ebt Vd50cPAraV7PnFQj8mKiNvh5Sppm5z68HxjU3+6OXKX15PdCZlPUxhkPskCUwL76i4gZ hXhg== X-Received: by 10.49.88.5 with SMTP id bc5mr632030qeb.4.1385626200184; Thu, 28 Nov 2013 00:10:00 -0800 (PST) MIME-Version: 1.0 X-BeenThere: rtc-linux@googlegroups.com Received: by 10.49.12.81 with SMTP id w17ls3449250qeb.86.gmail; Thu, 28 Nov 2013 00:09:59 -0800 (PST) X-Received: by 10.236.19.36 with SMTP id m24mr18973348yhm.14.1385626199781; Thu, 28 Nov 2013 00:09:59 -0800 (PST) Received: from mailout4.w1.samsung.com (mailout4.w1.samsung.com. [210.118.77.14]) by gmr-mx.google.com with ESMTPS id ns3si6122637pbc.1.2013.11.28.00.09.59 for (version=TLSv1 cipher=RC4-MD5 bits=128/128); Thu, 28 Nov 2013 00:09:59 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of k.kozlowski@samsung.com designates 210.118.77.14 as permitted sender) client-ip=210.118.77.14; Received: from eucpsbgm2.samsung.com (unknown [203.254.199.245]) by mailout4.w1.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0MWY00966S0LX900@mailout4.w1.samsung.com> for rtc-linux@googlegroups.com; Thu, 28 Nov 2013 08:09:57 +0000 (GMT) X-AuditID: cbfec7f5-b7f706d0000017c2-ba-5296fa55fcd2 Received: from eusync2.samsung.com ( [203.254.199.212]) by eucpsbgm2.samsung.com (EUCPMTA) with SMTP id CD.39.06082.55AF6925; Thu, 28 Nov 2013 08:09:57 +0000 (GMT) Received: from AMDC1943.digital.local ([106.116.151.171]) by eusync2.samsung.com (Oracle Communications Messaging Server 7u4-23.01(7.0.4.23.0) 64bit (built Aug 10 2011)) with ESMTPA id <0MWY001TWS0GWD90@eusync2.samsung.com>; Thu, 28 Nov 2013 08:09:57 +0000 (GMT) From: Krzysztof Kozlowski To: Sangbeom Kim , Samuel Ortiz , Lee Jones , Liam Girdwood , Mark Brown , Alessandro Zummo , linux-kernel@vger.kernel.org, rtc-linux@googlegroups.com Cc: Marek Szyprowski , Geert Uytterhoeven , Kyungmin Park , Krzysztof Kozlowski Subject: [rtc-linux] [PATCH v2 3/5] rtc: s5m: Limit endless loop waiting for register update Date: Thu, 28 Nov 2013 09:09:41 +0100 Message-id: <1385626183-22990-4-git-send-email-k.kozlowski@samsung.com> X-Mailer: git-send-email 1.7.9.5 In-reply-to: <1385626183-22990-1-git-send-email-k.kozlowski@samsung.com> References: <1385626183-22990-1-git-send-email-k.kozlowski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrALMWRmVeSWpSXmKPExsVy+t/xK7qhv6YFGVx5qmSx5OJVdoupD5+w WTy7tZfJ4vULQ4uzTW/YLe5/Pcpo8e1KB5PF5V1z2CzWHrnLbrG/s4PR4nQ3q8XFFV+YHHg8 ds66y+6xZ+JJNo9NqzrZPO5c28PmcehwB6PHvJOBHn1bVjF6TJ/3k8nj8ya5AM4oLpuU1JzM stQifbsEroxjvzpYCz4JVdyf+Ji1gXEVfxcjJ4eEgInEvF0fmSFsMYkL99azdTFycQgJLGWU WP/lBCuE08ck8fBPNyNIFZuAscTm5UvAqkQE5jJJTH97lhHEYRbYxSjx9ucusCphgQCJm9O+ sIHYLAKqEnsnXgGKc3DwCrhLLHsjDGJKCChIzJlkA1LBKeAhsWf+PlYQWwio4ufnOWwTGHkX MDKsYhRNLU0uKE5KzzXSK07MLS7NS9dLzs/dxAgJ1a87GJceszrEKMDBqMTDq2A8LUiINbGs uDL3EKMEB7OSCK9CMVCINyWxsiq1KD++qDQntfgQIxMHp1QDI0st05bkj594S3o7vmVMuSi6 McZI04Xz6vFfLRfel3xrXrPlcd4qrrCaa3duHTq97Y+wmQ/7d69V0xwKsla8WyT5/RxX6/0/ Z9jrJ3hNrnvi8ribQ2/XEg55a8b1JTbdx1/8vLZykbmWZJ9IWXW9u7WNaEib3roY3YXPRWdd 5jn9t2mVdbGuiRJLcUaioRZzUXEiAKegQUYzAgAA X-Original-Sender: k.kozlowski@samsung.com X-Original-Authentication-Results: gmr-mx.google.com; spf=pass (google.com: best guess record for domain of k.kozlowski@samsung.com designates 210.118.77.14 as permitted sender) smtp.mail=k.kozlowski@samsung.com Reply-To: rtc-linux@googlegroups.com Precedence: list Mailing-list: list rtc-linux@googlegroups.com; contact rtc-linux+owners@googlegroups.com List-ID: X-Google-Group-Id: 712029733259 List-Post: , List-Help: , List-Archive: Sender: rtc-linux@googlegroups.com List-Subscribe: , List-Unsubscribe: , After setting alarm or time the driver is waiting for UDR register to be cleared indicating that registers data have been transferred. Limit the endless loop to only 5 retries. Signed-off-by: Krzysztof Kozlowski Signed-off-by: Kyungmin Park Acked-by: Sangbeom Kim --- drivers/rtc/rtc-s5m.c | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c index 66686d9..51471c1 100644 --- a/drivers/rtc/rtc-s5m.c +++ b/drivers/rtc/rtc-s5m.c @@ -28,6 +28,16 @@ #include #include +/* + * Maximum number of retries for checking changes in UDR field + * of SEC_RTC_UDR_CON register (to limit possible endless loop). + * + * After writing to RTC registers (setting time or alarm) read the UDR field + * in SEC_RTC_UDR_CON register. UDR is auto-cleared when data have + * been transferred. + */ +#define UDR_READ_RETRY_CNT 5 + struct s5m_rtc_info { struct device *dev; struct sec_pmic_dev *s5m87xx; @@ -84,6 +94,25 @@ static int s5m8767_tm_to_data(struct rtc_time *tm, u8 *data) } } +/* + * Read RTC_UDR_CON register and wait till UDR field is cleared. + * This indicates that time/alarm update ended. + */ +static inline int s5m8767_wait_for_udr_update(struct s5m_rtc_info *info) +{ + int ret, retry = UDR_READ_RETRY_CNT; + unsigned int data; + + do { + ret = regmap_read(info->regmap, SEC_RTC_UDR_CON, &data); + } while (--retry && (data & RTC_UDR_MASK) && !ret); + + if (!retry) + dev_err(info->dev, "waiting for UDR update, reached max number of retries\n"); + + return ret; +} + static inline int s5m8767_rtc_set_time_reg(struct s5m_rtc_info *info) { int ret; @@ -104,9 +133,7 @@ static inline int s5m8767_rtc_set_time_reg(struct s5m_rtc_info *info) return ret; } - do { - ret = regmap_read(info->regmap, SEC_RTC_UDR_CON, &data); - } while ((data & RTC_UDR_MASK) && !ret); + ret = s5m8767_wait_for_udr_update(info); return ret; } @@ -133,9 +160,7 @@ static inline int s5m8767_rtc_set_alarm_reg(struct s5m_rtc_info *info) return ret; } - do { - ret = regmap_read(info->regmap, SEC_RTC_UDR_CON, &data); - } while ((data & RTC_UDR_MASK) && !ret); + ret = s5m8767_wait_for_udr_update(info); return ret; }