From patchwork Mon Dec 12 11:44:45 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Venkat Reddy Talla X-Patchwork-Id: 705000 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail-yw0-x23a.google.com (mail-yw0-x23a.google.com [IPv6:2607:f8b0:4002:c05::23a]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3tchBH6xNCz9t0w for ; Mon, 12 Dec 2016 22:56:07 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=googlegroups.com header.i=@googlegroups.com header.b="AIF9uakK"; dkim-atps=neutral Received: by mail-yw0-x23a.google.com with SMTP id s68sf13296581ywg.0 for ; Mon, 12 Dec 2016 03:56:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20120806; h=sender:from:to:cc:subject:date:message-id:mime-version :x-original-sender:x-original-authentication-results:reply-to :precedence:mailing-list:list-id:x-spam-checked-in-group:list-post :list-help:list-archive:list-subscribe:list-unsubscribe; bh=Ownv99glgREh7DciqBuuf1yASlbsMTNlteQff5hHzEA=; b=AIF9uakK3AIBcoyLHXmTjtkRvf3Zg8glPBhp4pLcCujd2lf0zza2erTAqUQgltiEcN 4cJNDz05eXaba8HPIV/FiFE38nMngPe4TsdisfxyPlH5HgrXy3KOfS+5BrSJRA3xSjhl ndHVvTtQxIaZPldOR+M/LnGB5DPNnA4K/W2l3LaDeoRRvE3/WvaDwQPbRzSgvdu8EdJK 3OriWUyB05g8mVTB83BpWuLjpNg1/Ynq9bP3R458bWHpSpMpZDKrdjs6Ub0dWjAs/sdb ab5wGL05yb3QEDnNiQjBztkRlrKZk/j/8MJxd0Wtfgpa4yUWWd11ecReiIA2wksChXwB JQ5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=sender:x-gm-message-state:from:to:cc:subject:date:message-id :mime-version:x-original-sender:x-original-authentication-results :reply-to:precedence:mailing-list:list-id:x-spam-checked-in-group :list-post:list-help:list-archive:list-subscribe:list-unsubscribe; bh=Ownv99glgREh7DciqBuuf1yASlbsMTNlteQff5hHzEA=; b=j+G33V1bOvl6lJm3/m6Q2BNIoZUYDXBhyyrFfvcnzm+flVbToWTjrTAAvAu6e2iDfd Y5SKFcDV1kGlUAIfi6KLAnp9dIsKi3UAxVqLxEQ+K1ENpOzLFsmHnZhmeCwa4fCkhJBU +MS8FIMqz8nmIaBMX/FcFtxRmcYHLkm9bSTeqWvrjtm5/VQdkA6oksLyQcKAhnfSe2KO Rxgi2Km7L8tOpRl8pRHcZhGYyeBRZhxLOzoC6r/gydwcWBDtXMvjCaQoG8ue/TUy5iHU oxde1W32+rKybWszr0+8gSNook++Dk614JoGCO/2a4/hpH2sRmjpEoryTFQjjm4I5vGv 7iig== Sender: rtc-linux@googlegroups.com X-Gm-Message-State: AKaTC01pT4Fx9z26SpqjLBKhyhtvA/CT4gxPVy+6y2V22bzUXGk0pPmvbGevN+D1HfRB5Q== X-Received: by 10.157.48.39 with SMTP id d36mr5952970otc.1.1481543763308; Mon, 12 Dec 2016 03:56:03 -0800 (PST) X-BeenThere: rtc-linux@googlegroups.com Received: by 10.157.56.209 with SMTP id k17ls13455437ote.14.gmail; Mon, 12 Dec 2016 03:56:03 -0800 (PST) X-Received: by 10.157.35.197 with SMTP id t63mr20274523otb.22.1481543763094; Mon, 12 Dec 2016 03:56:03 -0800 (PST) Received: from hkmmgate102.nvidia.com (nat-hk.nvidia.com. [203.18.50.4]) by gmr-mx.google.com with ESMTPS id r1si8502346pfg.4.2016.12.12.03.56.02 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 12 Dec 2016 03:56:03 -0800 (PST) Received-SPF: pass (google.com: domain of vreddytalla@nvidia.com designates 203.18.50.4 as permitted sender) client-ip=203.18.50.4; Received: from hkpgpgate102.nvidia.com (Not Verified[10.18.92.9]) by hkmmgate102.nvidia.com id ; Mon, 12 Dec 2016 19:56:01 +0800 Received: from HKMAIL103.nvidia.com ([10.18.67.137]) by hkpgpgate102.nvidia.com (PGP Universal service); Mon, 12 Dec 2016 03:55:59 -0800 X-PGP-Universal: processed; by hkpgpgate102.nvidia.com on Mon, 12 Dec 2016 03:55:59 -0800 Received: from DRBGMAIL102.nvidia.com (10.18.16.21) by HKMAIL103.nvidia.com (10.18.16.12) with Microsoft SMTP Server (TLS) id 15.0.1210.3; Mon, 12 Dec 2016 11:44:55 +0000 Received: from HQMAIL105.nvidia.com (172.20.187.12) by DRBGMAIL102.nvidia.com (10.18.16.21) with Microsoft SMTP Server (TLS) id 15.0.1210.3; Mon, 12 Dec 2016 11:44:54 +0000 Received: from vreddytalla-dt.nvidia.com (172.20.13.39) by HQMAIL105.nvidia.com (172.20.187.12) with Microsoft SMTP Server (TLS) id 15.0.1210.3 via Frontend Transport; Mon, 12 Dec 2016 11:44:50 +0000 From: Venkat Reddy Talla To: , , , , , , CC: , Subject: [rtc-linux] [PATCH] rtc: max77683: avoid regmap bulk write for max77620 Date: Mon, 12 Dec 2016 17:14:45 +0530 Message-ID: <1481543085-19540-1-git-send-email-vreddytalla@nvidia.com> X-Mailer: git-send-email 2.1.4 MIME-Version: 1.0 X-Original-Sender: vreddytalla@nvidia.com X-Original-Authentication-Results: gmr-mx.google.com; spf=pass (google.com: domain of vreddytalla@nvidia.com designates 203.18.50.4 as permitted sender) smtp.mailfrom=vreddytalla@nvidia.com; dmarc=pass (p=NONE dis=NONE) header.from=nvidia.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-Spam-Checked-In-Group: rtc-linux@googlegroups.com X-Google-Group-Id: 712029733259 List-Post: , List-Help: , List-Archive: , List-Unsubscribe: , Adding support to avoid regmap bulk write for the devices which are not supported register bulk write. Max77620 RTC device does not support register bulk write so disabling regmap bulk write for max77620 rtc device and enabling only for max77683. Signed-off-by: Venkat Reddy Talla --- drivers/rtc/rtc-max77686.c | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/drivers/rtc/rtc-max77686.c b/drivers/rtc/rtc-max77686.c index 182fdd0..401ab25 100644 --- a/drivers/rtc/rtc-max77686.c +++ b/drivers/rtc/rtc-max77686.c @@ -84,6 +84,7 @@ struct max77686_rtc_driver_data { int alarm_pending_status_reg; /* RTC IRQ CHIP for regmap */ const struct regmap_irq_chip *rtc_irq_chip; + bool avoid_rtc_bulk_write; }; struct max77686_rtc_info { @@ -197,6 +198,7 @@ static const struct max77686_rtc_driver_data max77686_drv_data = { .alarm_pending_status_reg = MAX77686_REG_STATUS2, .rtc_i2c_addr = MAX77686_I2C_ADDR_RTC, .rtc_irq_chip = &max77686_rtc_irq_chip, + .avoid_rtc_bulk_write = false, }; static const struct max77686_rtc_driver_data max77620_drv_data = { @@ -208,6 +210,7 @@ static const struct max77686_rtc_driver_data max77620_drv_data = { .alarm_pending_status_reg = MAX77686_INVALID_REG, .rtc_i2c_addr = MAX77620_I2C_ADDR_RTC, .rtc_irq_chip = &max77686_rtc_irq_chip, + .avoid_rtc_bulk_write = true, }; static const unsigned int max77802_map[REG_RTC_END] = { @@ -259,6 +262,32 @@ static const struct max77686_rtc_driver_data max77802_drv_data = { .rtc_irq_chip = &max77802_rtc_irq_chip, }; +static inline int _regmap_bulk_write(struct max77686_rtc_info *info, + unsigned int reg, void *val, int len) +{ + int ret = 0; + + if (!info->drv_data->avoid_rtc_bulk_write) { + /* RTC registers support sequential writing */ + ret = regmap_bulk_write(info->rtc_regmap, reg, val, len); + } else { + /* Power registers support register-data pair writing */ + u8 *src = (u8 *)val; + int i; + + for (i = 0; i < len; i++) { + ret = regmap_write(info->rtc_regmap, reg, *src++); + if (ret < 0) + break; + reg++; + } + } + if (ret < 0) + dev_err(info->dev, "%s() failed, e %d\n", __func__, ret); + + return ret; +} + static void max77686_rtc_data_to_tm(u8 *data, struct rtc_time *tm, struct max77686_rtc_info *info) { @@ -383,7 +412,7 @@ static int max77686_rtc_set_time(struct device *dev, struct rtc_time *tm) mutex_lock(&info->lock); - ret = regmap_bulk_write(info->rtc_regmap, + ret = _regmap_bulk_write(info, info->drv_data->map[REG_RTC_SEC], data, ARRAY_SIZE(data)); if (ret < 0) { @@ -506,7 +535,7 @@ static int max77686_rtc_stop_alarm(struct max77686_rtc_info *info) for (i = 0; i < ARRAY_SIZE(data); i++) data[i] &= ~ALARM_ENABLE_MASK; - ret = regmap_bulk_write(info->rtc_regmap, map[REG_ALARM1_SEC], + ret = _regmap_bulk_write(info, map[REG_ALARM1_SEC], data, ARRAY_SIZE(data)); } @@ -558,7 +587,7 @@ static int max77686_rtc_start_alarm(struct max77686_rtc_info *info) if (data[RTC_DATE] & 0x1f) data[RTC_DATE] |= (1 << ALARM_ENABLE_SHIFT); - ret = regmap_bulk_write(info->rtc_regmap, map[REG_ALARM1_SEC], + ret = _regmap_bulk_write(info, map[REG_ALARM1_SEC], data, ARRAY_SIZE(data)); } @@ -588,7 +617,7 @@ static int max77686_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) if (ret < 0) goto out; - ret = regmap_bulk_write(info->rtc_regmap, + ret = _regmap_bulk_write(info, info->drv_data->map[REG_ALARM1_SEC], data, ARRAY_SIZE(data)); @@ -654,7 +683,7 @@ static int max77686_rtc_init_reg(struct max77686_rtc_info *info) info->rtc_24hr_mode = 1; - ret = regmap_bulk_write(info->rtc_regmap, + ret = _regmap_bulk_write(info, info->drv_data->map[REG_RTC_CONTROLM], data, ARRAY_SIZE(data)); if (ret < 0) {