Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp8518728ybl; Thu, 16 Jan 2020 18:38:04 -0800 (PST) X-Google-Smtp-Source: APXvYqyAXh4L98SphVoOrSc99pSlkLR9Gf466MfUsISw6L574MPLu9k68Phzl71idsR8RbyeqYwv X-Received: by 2002:aca:f305:: with SMTP id r5mr1870857oih.174.1579228684145; Thu, 16 Jan 2020 18:38:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579228684; cv=none; d=google.com; s=arc-20160816; b=qZuVUq5ESjDKa0aZ7SDPgFN/fSKmPQsT9Qp5X7UP6/JokjmzANNaEmNE033H3I2k8W d7cOvdU1jZXMRrgLViVcjQR8jcRGImSPHO6gU1yy+CZ24Wz7CSW4a41lLN8eBDEDcL2C yKHBLKHCXel2s5qMPbSf+zWPrgASOYhUh13ey9rnljSAOKP06FcahK7oXUyAdlCJPcRY TJSOGXUPAb6Uv+3Ir3s8AXtchy1BctrT3tRHGmBIcfQ4XubpmA5CbAsc9FhiXtkAMQ4T iBCG+Sy4Roo/TiULegZId6awPOUhij0TwK4fa97n5g/Q6p5hBOfN0sUsOBHU24136lZ5 NuAA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=5EDprlW8u5G6UW4ix0q7ED6tNzjs9ZVlcG0lf1FpKK8=; b=ssEayhFp9Y8Y+LM8OaVln59FRvapSJfBtuY/RAKTcsZH5u4BT5p95wMwFiNu0Qnl0x LJtUKPkxYZSCRGh2F9kyO5mHlPCNGcEly4w63ZWm23i8SpX/UxAABlrT5qjrWhxozZS6 pLGnsW5u3087xCIR/olaSq+CCsbwuxxL5ELMXFBbhcpYeWfUnMUoDuN5h09CXoUb3TkD 7H1kuqHjH25RI6pHKWXONIkTrNChXKiuTQI5dCSwtIkiV7WCxurLaGXvP9gUQHWqjOXw RIgZivAqwy2OqW3mwNvhPHHKRGtKNgPDQpjt3KwytTe26nzaWcNk9OyEwyrudmp20Tym pYkQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=j4qzHjHi; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b4si12810007oiy.97.2020.01.16.18.37.52; Thu, 16 Jan 2020 18:38:04 -0800 (PST) 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=@kernel.org header.s=default header.b=j4qzHjHi; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389938AbgAPX2B (ORCPT + 99 others); Thu, 16 Jan 2020 18:28:01 -0500 Received: from mail.kernel.org ([198.145.29.99]:60308 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2390379AbgAPX17 (ORCPT ); Thu, 16 Jan 2020 18:27:59 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 837A4206D9; Thu, 16 Jan 2020 23:27:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1579217277; bh=KeMuUU1uohJ1StY+/CmAWDNzajPxBmntrU56E74dvHo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=j4qzHjHiu8PyMahtfkYQ4FNGO6p3LBfOM/2h6iUzKAD7HObvu06yjPoF4lfVgxgsj D2ZZVQ94s4LCX5cU0rIfhgN1oW161bfKaVgHiwuCkuAiDX9msaDbR5j/MqPTQiyZoF E7dWGup6Kq1GH/jifN83fsielta4sSbXjUqOD9K8= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Ran Bi , Hsin-Hsiung Wang , Alexandre Belloni Subject: [PATCH 4.19 17/84] rtc: mt6397: fix alarm register overwrite Date: Fri, 17 Jan 2020 00:17:51 +0100 Message-Id: <20200116231715.667078333@linuxfoundation.org> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200116231713.087649517@linuxfoundation.org> References: <20200116231713.087649517@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Ran Bi commit 653997eeecef95c3ead4fba1b2d27e6a5854d6cd upstream. Alarm registers high byte was reserved for other functions. This add mask in alarm registers operation functions. This also fix error condition in interrupt handler. Fixes: fc2979118f3f ("rtc: mediatek: Add MT6397 RTC driver") Signed-off-by: Ran Bi Signed-off-by: Hsin-Hsiung Wang Link: https://lore.kernel.org/r/1576057435-3561-6-git-send-email-hsin-hsiung.wang@mediatek.com Signed-off-by: Alexandre Belloni Signed-off-by: Greg Kroah-Hartman --- drivers/rtc/rtc-mt6397.c | 47 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 14 deletions(-) --- a/drivers/rtc/rtc-mt6397.c +++ b/drivers/rtc/rtc-mt6397.c @@ -55,6 +55,14 @@ #define RTC_AL_SEC 0x0018 +#define RTC_AL_SEC_MASK 0x003f +#define RTC_AL_MIN_MASK 0x003f +#define RTC_AL_HOU_MASK 0x001f +#define RTC_AL_DOM_MASK 0x001f +#define RTC_AL_DOW_MASK 0x0007 +#define RTC_AL_MTH_MASK 0x000f +#define RTC_AL_YEA_MASK 0x007f + #define RTC_PDN2 0x002e #define RTC_PDN2_PWRON_ALARM BIT(4) @@ -111,7 +119,7 @@ static irqreturn_t mtk_rtc_irq_handler_t irqen = irqsta & ~RTC_IRQ_EN_AL; mutex_lock(&rtc->lock); if (regmap_write(rtc->regmap, rtc->addr_base + RTC_IRQ_EN, - irqen) < 0) + irqen) == 0) mtk_rtc_write_trigger(rtc); mutex_unlock(&rtc->lock); @@ -233,12 +241,12 @@ static int mtk_rtc_read_alarm(struct dev alm->pending = !!(pdn2 & RTC_PDN2_PWRON_ALARM); mutex_unlock(&rtc->lock); - tm->tm_sec = data[RTC_OFFSET_SEC]; - tm->tm_min = data[RTC_OFFSET_MIN]; - tm->tm_hour = data[RTC_OFFSET_HOUR]; - tm->tm_mday = data[RTC_OFFSET_DOM]; - tm->tm_mon = data[RTC_OFFSET_MTH]; - tm->tm_year = data[RTC_OFFSET_YEAR]; + tm->tm_sec = data[RTC_OFFSET_SEC] & RTC_AL_SEC_MASK; + tm->tm_min = data[RTC_OFFSET_MIN] & RTC_AL_MIN_MASK; + tm->tm_hour = data[RTC_OFFSET_HOUR] & RTC_AL_HOU_MASK; + tm->tm_mday = data[RTC_OFFSET_DOM] & RTC_AL_DOM_MASK; + tm->tm_mon = data[RTC_OFFSET_MTH] & RTC_AL_MTH_MASK; + tm->tm_year = data[RTC_OFFSET_YEAR] & RTC_AL_YEA_MASK; tm->tm_year += RTC_MIN_YEAR_OFFSET; tm->tm_mon--; @@ -259,14 +267,25 @@ static int mtk_rtc_set_alarm(struct devi tm->tm_year -= RTC_MIN_YEAR_OFFSET; tm->tm_mon++; - data[RTC_OFFSET_SEC] = tm->tm_sec; - data[RTC_OFFSET_MIN] = tm->tm_min; - data[RTC_OFFSET_HOUR] = tm->tm_hour; - data[RTC_OFFSET_DOM] = tm->tm_mday; - data[RTC_OFFSET_MTH] = tm->tm_mon; - data[RTC_OFFSET_YEAR] = tm->tm_year; - mutex_lock(&rtc->lock); + ret = regmap_bulk_read(rtc->regmap, rtc->addr_base + RTC_AL_SEC, + data, RTC_OFFSET_COUNT); + if (ret < 0) + goto exit; + + data[RTC_OFFSET_SEC] = ((data[RTC_OFFSET_SEC] & ~(RTC_AL_SEC_MASK)) | + (tm->tm_sec & RTC_AL_SEC_MASK)); + data[RTC_OFFSET_MIN] = ((data[RTC_OFFSET_MIN] & ~(RTC_AL_MIN_MASK)) | + (tm->tm_min & RTC_AL_MIN_MASK)); + data[RTC_OFFSET_HOUR] = ((data[RTC_OFFSET_HOUR] & ~(RTC_AL_HOU_MASK)) | + (tm->tm_hour & RTC_AL_HOU_MASK)); + data[RTC_OFFSET_DOM] = ((data[RTC_OFFSET_DOM] & ~(RTC_AL_DOM_MASK)) | + (tm->tm_mday & RTC_AL_DOM_MASK)); + data[RTC_OFFSET_MTH] = ((data[RTC_OFFSET_MTH] & ~(RTC_AL_MTH_MASK)) | + (tm->tm_mon & RTC_AL_MTH_MASK)); + data[RTC_OFFSET_YEAR] = ((data[RTC_OFFSET_YEAR] & ~(RTC_AL_YEA_MASK)) | + (tm->tm_year & RTC_AL_YEA_MASK)); + if (alm->enabled) { ret = regmap_bulk_write(rtc->regmap, rtc->addr_base + RTC_AL_SEC,