From patchwork Fri Jul 10 15:50:56 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jagan Teki X-Patchwork-Id: 1481 Return-Path: X-Original-To: linux-amarula@patchwork.amarulasolutions.com Delivered-To: linux-amarula@patchwork.amarulasolutions.com Received: from mail-pj1-f70.google.com (mail-pj1-f70.google.com [209.85.216.70]) by ganimede.amarulasolutions.com (Postfix) with ESMTPS id 1737D3F06D for ; Fri, 10 Jul 2020 17:51:50 +0200 (CEST) Received: by mail-pj1-f70.google.com with SMTP id q89sf4232057pjk.5 for ; Fri, 10 Jul 2020 08:51:50 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1594396309; cv=pass; d=google.com; s=arc-20160816; b=RePLowhaI7OE6NDF+ECR1E+t8Q/iQQUlEL66Hs37C5dCDYOiTAog7Z+8t/KmmmPrc+ z5vbUtMlXgXOwC5vHUycJksUtZ8ICwJVXFlKxNLzmNipuHkEpU/4UVbCn9RLla9SrupY XMU6TzGnriVdDd7XjXAjKbZEU3senJqu+Nq9PYjxKMsXobCKZqJBqaOOMMWV3ee5tvip LEuWjJoQOEpFxeFGQT1+5jA4WfpuEhcv91wQ4zdwFKLjcqgsW8QLYkWbSA7xsXzMwjAL hvA7bx/S6utLOvkRRof4xQ5DYJtzbRBIUTUcGRLrR3g3lFL8c4E03b84Ttrpvu15qHt1 uzvQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-unsubscribe:list-archive:list-help:list-post:list-id :mailing-list:precedence:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=eU+i3FTb5zD8d6ylzF+hP4Bqcbwqqq1kA6yTFXJE4bs=; b=w8aJvDIQCMIefUI2beIf00OxHVcm5puCFrrhihpSrDXDeTqBNCSb69chxIfaMEKbXc q6hOngC3eLuPyuNMbav4DOeaLeyaWX/jebzLSbDTgpQcswWMvLe7IES+Y/4mv20Jf0ev RzX4EISXvpG/ILjRoCJGrrrhh+f8pnLsbisL52ovFjYn/UK5pyfcISvYrdwsQJWSIKPk /rhUEI2ONu2ECJnyagwybSoN3uKSn2k/9pV/nPL4W7BILO13FGSE4Drc1dAkGdKq/pkE eOzzSU56EhI3gdmbPX7uXPOr/c6Y4HNwC+i1S88n1QlFavSOJgB6D2OAXVBUsvwjZqzE Wn1A== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=Fa2M0CVe; spf=pass (google.com: domain of jagan@amarulasolutions.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=jagan@amarulasolutions.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:x-original-sender:x-original-authentication-results :precedence:mailing-list:list-id:list-post:list-help:list-archive :list-unsubscribe; bh=eU+i3FTb5zD8d6ylzF+hP4Bqcbwqqq1kA6yTFXJE4bs=; b=LEw8Go0BOaO965drC9iFjWTCOdM5nHVkfstoOwu9L62vdfoxVcEEO8oApfVYBNYtf4 Odp+btJRi5Q8bxLc0DlOe59bkNoeYc1P0C7HmLRx8t1eH0J1Zz64w0BDj7TpdoeK8THZ pTJpFcwv5IZ+Q06LcGc17Un09jC/l3bbM1ttw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:x-original-sender :x-original-authentication-results:precedence:mailing-list:list-id :x-spam-checked-in-group:list-post:list-help:list-archive :list-unsubscribe; bh=eU+i3FTb5zD8d6ylzF+hP4Bqcbwqqq1kA6yTFXJE4bs=; b=K3fB/YcV89i9WERG8KbOvNw2jAyceH0pbtc4MTqAhvZ9SUy0ycWr2wZhYrYExz8XGm pcNnaOgdjG/2WkGdNM+AIhXhctUCBu0NbBNEaDs6Uw5U9XGylhJmpW48rShx6/aoeEP2 t+4u1bkcH9ZVvcHQd5Yw9T/hfeXBGndMqxC6i+f2gN9IB/S4XxzEGvut+MnBm4gHHXnP +Aw1ghLYLVFdC1ET/Qu9aWZaC0csEgXKnZ6DQxaVPELy09VLVNZFiUK4xV80jdB/ggFU DBt9TDY9euMPMZTGCR2QnUNBtKfaNSO0cAK1njfyWwfKGtj//T+qPbbi0Zxn+vdYR2hh p7Aw== X-Gm-Message-State: AOAM530hxj+qp3TdRJU3EY1gV1x4XEkbXkDO2B+AdG31lZDtFYPxuJC7 Y4gsaHDSr/KnqUVttgj60K7PV1hB X-Google-Smtp-Source: ABdhPJzXURnCEZTc9A8zbcMFbq1F9nrwdn9NVTNxj1r6b+vj7kUKPvnSiRtrXju/EO22pnKV1MHsbQ== X-Received: by 2002:a17:90a:17ad:: with SMTP id q42mr6715552pja.31.1594396308882; Fri, 10 Jul 2020 08:51:48 -0700 (PDT) X-BeenThere: linux-amarula@amarulasolutions.com Received: by 2002:a17:90b:380c:: with SMTP id mq12ls4363387pjb.1.gmail; Fri, 10 Jul 2020 08:51:48 -0700 (PDT) X-Received: by 2002:a17:902:e901:: with SMTP id k1mr53936090pld.130.1594396308305; Fri, 10 Jul 2020 08:51:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1594396308; cv=none; d=google.com; s=arc-20160816; b=Sksd/XOfsk02nxha/3boYRrXLELUvMC+CeoRwLYgciDRW2C89J4ppU8LMqHtaYoaDn 2SsXZMjPzL+URAwkUrILkw6r5KQ3VZ6Ox3Y14bsIWjXdOFXeFzEIKPnV3CP7gSREI7OP GLmB5aLuKRt0fGhhXtveZDxH8XYQAzXICroD3mC3fiWTS5VTuok+sXtO3t9asmtDZi6a YYC98Ws+a4nK6TpToPlHD/Hop8WGbY+eqiv1KmdCACKFfS48U7I9MHmOlZF6ARZV2ljX DjFH9skoktGkhj5xB6F3hOee9o2Se1pyZg69kmRZ1dOW6k3Y/dL8CeWPTtyHeCmfMu3n sm9w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=FSewoexwVyBwrPVuoElI4BFd+yaXthXy6Cp0PRRDxzg=; b=P2JBl3Z4bEXLSZo0ZBghFK5Q6CssUYfVYhHP5IQq2BThepBkwPk8uxakshGz5h2+mV olMlhozjfa5vx+x2HcYRar2e0FozjklWQRToC1PhiEKbh0kJZn7VHMjHy3oHdp8Pg8AW Rgcu3hDkNjvxbOBzFbZBOpS1ce4O1OGul3oX+MFrB4UP/HQEbWWxVtVqLYsTVrdZ7bKe csJ4O7vuQVdCv4M9ksEhG9ibkuZJqCi3VmUVsx2KcVUiN58I1ZjtRYkedMnpj44TpP9l acM/PC80A81J3MzrWY/2CF5ip8tf8yjVltalfpSwCdw0tlALtwMyfKKiEgUNxOlkL2IE kj0Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=Fa2M0CVe; spf=pass (google.com: domain of jagan@amarulasolutions.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=jagan@amarulasolutions.com Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id kb18sor8563689pjb.22.2020.07.10.08.51.48 for (Google Transport Security); Fri, 10 Jul 2020 08:51:48 -0700 (PDT) Received-SPF: pass (google.com: domain of jagan@amarulasolutions.com designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; X-Received: by 2002:a17:90a:a608:: with SMTP id c8mr6092496pjq.114.1594396307866; Fri, 10 Jul 2020 08:51:47 -0700 (PDT) Received: from localhost.localdomain ([2405:201:c809:c7d5:a1d6:54e3:577a:ace0]) by smtp.gmail.com with ESMTPSA id lx2sm6398917pjb.16.2020.07.10.08.51.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 10 Jul 2020 08:51:47 -0700 (PDT) From: Jagan Teki To: Kever Yang , Philipp Tomsich , Simon Glass Cc: Suniel Mahesh , U-Boot-Denx , linux-rockchip@lists.infradead.org, linux-amarula , Jagan Teki Subject: [PATCH v4 3/4] rtc: rk8xx: Add base support for the RK808 PMIC RTC Date: Fri, 10 Jul 2020 21:20:56 +0530 Message-Id: <20200710155057.310168-4-jagan@amarulasolutions.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200710155057.310168-1-jagan@amarulasolutions.com> References: <20200710155057.310168-1-jagan@amarulasolutions.com> MIME-Version: 1.0 X-Original-Sender: jagan@amarulasolutions.com X-Original-Authentication-Results: mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=Fa2M0CVe; spf=pass (google.com: domain of jagan@amarulasolutions.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=jagan@amarulasolutions.com Content-Type: text/plain; charset="UTF-8" Precedence: list Mailing-list: list linux-amarula@amarulasolutions.com; contact linux-amarula+owners@amarulasolutions.com List-ID: X-Spam-Checked-In-Group: linux-amarula@amarulasolutions.com X-Google-Group-Id: 476853432473 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , From: Suniel Mahesh Rockchip RK808 PMIC provides an integrated RTC module. It is commonly used with Rockchip SoCs. Add basic support to access date and time. Signed-off-by: Jagan Teki Signed-off-by: Suniel Mahesh --- Change for v4: - rebase - style fixes - warning fixes drivers/rtc/Kconfig | 8 ++ drivers/rtc/Makefile | 1 + drivers/rtc/rk808-rtc.c | 173 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 182 insertions(+) create mode 100644 drivers/rtc/rk808-rtc.c diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 59e2fc44ba..a754d1b4f1 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig @@ -75,6 +75,14 @@ config RTC_ISL1208 This driver supports reading and writing the RTC/calendar and detects total power failures. +config RTC_RK808 + bool "Enable Rockchip RK8XX RTC driver" + depends on DM_RTC && PMIC_RK8XX + default y + help + Basic support for Rockchip RK808 PMIC Real Time Clock devices for + time and date. + config RTC_RV3029 bool "Enable RV3029 driver" depends on DM_RTC diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index 12eb449583..63e2c3413d 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile @@ -44,6 +44,7 @@ obj-$(CONFIG_RTC_PCF8563) += pcf8563.o obj-$(CONFIG_RTC_PCF2127) += pcf2127.o obj-$(CONFIG_RTC_PL031) += pl031.o obj-$(CONFIG_RTC_PT7C4338) += pt7c4338.o +obj-$(CONFIG_RTC_RK808) += rk808-rtc.o obj-$(CONFIG_RTC_RS5C372A) += rs5c372.o obj-$(CONFIG_RTC_RV3029) += rv3029.o obj-$(CONFIG_RTC_RV8803) += rv8803.o diff --git a/drivers/rtc/rk808-rtc.c b/drivers/rtc/rk808-rtc.c new file mode 100644 index 0000000000..50cca4dd4b --- /dev/null +++ b/drivers/rtc/rk808-rtc.c @@ -0,0 +1,173 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * RTC driver for Rockchip RK808 PMIC. + * + * Copyright (C) 2020 Amarula Solutions(India). + * Suniel Mahesh + * + * Based on code from Linux kernel: + * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd + * Author: Chris Zhong + * Author: Zhang Qing + * + * Date & Time support (no alarms and interrupts) + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* RTC_CTRL_REG bitfields */ +#define BIT_RTC_CTRL_REG_STOP_RTC_M BIT(0) + +/* RK808 has a shadowed register for saving a "frozen" RTC time. + * When user setting "GET_TIME" to 1, the time will save in this shadowed + * register. If set "READSEL" to 1, user read rtc time register, actually + * get the time of that moment. If we need the real time, clr this bit. + */ + +#define BIT_RTC_CTRL_REG_RTC_GET_TIME BIT(6) +#define BIT_RTC_CTRL_REG_RTC_READSEL_M BIT(7) +#define RTC_STATUS_MASK 0xFE + +#define SECONDS_REG_MSK 0x7F +#define MINUTES_REG_MAK 0x7F +#define HOURS_REG_MSK 0x3F +#define DAYS_REG_MSK 0x3F +#define MONTHS_REG_MSK 0x1F +#define YEARS_REG_MSK 0xFF +#define WEEKS_REG_MSK 0x7 + +/* REG_SECONDS_REG through REG_YEARS_REG is how many registers? */ + +#define NUM_TIME_REGS (REG_WEEKS - REG_SECONDS + 1) + +static int rk808_rtc_set(struct udevice *dev, const struct rtc_time *tm) +{ + u8 rtc_data[NUM_TIME_REGS]; + + debug("RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n", + tm->tm_year, tm->tm_mon, tm->tm_mday, + tm->tm_wday, tm->tm_hour, tm->tm_min, tm->tm_sec); + + rtc_data[0] = bin2bcd(tm->tm_sec); + rtc_data[1] = bin2bcd(tm->tm_min); + rtc_data[2] = bin2bcd(tm->tm_hour); + rtc_data[3] = bin2bcd(tm->tm_mday); + rtc_data[4] = bin2bcd(tm->tm_mon); + rtc_data[5] = bin2bcd(tm->tm_year - 2000); + rtc_data[6] = bin2bcd(tm->tm_wday); + + /* Stop RTC while updating the RTC registers */ + pmic_clrsetbits(dev->parent, REG_RTC_CTRL, 0, + BIT_RTC_CTRL_REG_STOP_RTC_M); + pmic_write(dev->parent, REG_SECONDS, rtc_data, NUM_TIME_REGS); + + /* Start RTC again */ + pmic_clrsetbits(dev->parent, REG_RTC_CTRL, + BIT_RTC_CTRL_REG_STOP_RTC_M, 0); + + return 0; +} + +static int rk808_rtc_get(struct udevice *dev, struct rtc_time *tm) +{ + u8 rtc_data[NUM_TIME_REGS]; + + /* Force an update of the shadowed registers right now */ + pmic_clrsetbits(dev->parent, REG_RTC_CTRL, 0, + BIT_RTC_CTRL_REG_RTC_GET_TIME); + + /* + * After we set the GET_TIME bit, the rtc time can't be read + * immediately. So we should wait up to 31.25 us, about one cycle of + * 32khz. If we clear the GET_TIME bit here, the time of i2c transfer + * certainly more than 31.25us: 16 * 2.5us at 400kHz bus frequency. + */ + pmic_clrsetbits(dev->parent, REG_RTC_CTRL, + BIT_RTC_CTRL_REG_RTC_GET_TIME, 0); + pmic_read(dev->parent, REG_SECONDS, rtc_data, NUM_TIME_REGS); + + tm->tm_sec = bcd2bin(rtc_data[0] & SECONDS_REG_MSK); + tm->tm_min = bcd2bin(rtc_data[1] & MINUTES_REG_MAK); + tm->tm_hour = bcd2bin(rtc_data[2] & HOURS_REG_MSK); + tm->tm_mday = bcd2bin(rtc_data[3] & DAYS_REG_MSK); + tm->tm_mon = (bcd2bin(rtc_data[4] & MONTHS_REG_MSK)); + tm->tm_year = (bcd2bin(rtc_data[5] & YEARS_REG_MSK)) + 2000; + tm->tm_wday = bcd2bin(rtc_data[6] & WEEKS_REG_MSK); + + /* + * RK808 PMIC RTC h/w counts/has 31 days in november. This is corrected + * when date cmd is invoked on prompt. checks for the current day and + * if it is 31 November, then adjusts it to 1 December. + * + * h/w also has weeks register which counts from 0 to 7(0(sun)-6(sat)). + * 7 is an unknown state, reset it back to 0(sun). + */ + if (tm->tm_mon == 11 && tm->tm_mday == 31) { + debug("correcting Nov 31st to Dec 1st (HW bug)\n"); + tm->tm_mon += 1; + tm->tm_mday = 1; + if (tm->tm_wday == 7) + tm->tm_wday = 0; + rk808_rtc_set(dev, tm); + } + + if (tm->tm_wday == 7) { + tm->tm_wday = 0; + rk808_rtc_set(dev, tm); + } + + debug("RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n", + tm->tm_year, tm->tm_mon, tm->tm_mday, + tm->tm_wday, tm->tm_hour, tm->tm_min, tm->tm_sec); + + return 0; +} + +static int rk808_rtc_reset(struct udevice *dev) +{ +/* Not needed */ + return 0; +} + +static int rk808_rtc_init(struct udevice *dev) +{ + struct rtc_time tm; + + /* start rtc running by default, and use shadowed timer. */ + pmic_clrsetbits(dev->parent, REG_RTC_CTRL, 0, + BIT_RTC_CTRL_REG_RTC_READSEL_M); + pmic_reg_write(dev->parent, REG_RTC_STATUS, RTC_STATUS_MASK); + + /* set init time */ + rk808_rtc_get(dev, &tm); + + return 0; +} + +static int rk808_rtc_probe(struct udevice *dev) +{ + rk808_rtc_init(dev); + + return 0; +} + +static const struct rtc_ops rk808_rtc_ops = { + .get = rk808_rtc_get, + .set = rk808_rtc_set, + .reset = rk808_rtc_reset, +}; + +U_BOOT_DRIVER(rk808_rtc) = { + .name = "rk808_rtc", + .id = UCLASS_RTC, + .ops = &rk808_rtc_ops, + .probe = rk808_rtc_probe, +};