Received: by 10.223.185.116 with SMTP id b49csp5124500wrg; Tue, 27 Feb 2018 08:09:05 -0800 (PST) X-Google-Smtp-Source: AH8x227W9veq+/XY5BtSicWW4KIzQLYSkg0NhXnXLK86l0xEu995Isg+TkGnLlIjzLkJV3ELkKCl X-Received: by 10.99.43.67 with SMTP id r64mr11630722pgr.403.1519747745258; Tue, 27 Feb 2018 08:09:05 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519747745; cv=none; d=google.com; s=arc-20160816; b=IWqmAJh0Fqtwwmw+pPErjJrZILhy/JV6ictlNSoLskTWkubbJ1YAvM4ISPYSAj0DCX iCE3rs6wpduxIKf0948quuWSumQVylka01MnknzA/jy+P3zYkDo7FVo/HRStgbuWCtAU 7OBK81YuL7h1J6KoidmB1FrcH3wMVpMwAzT/o9uO4u4nO9SQrWeedSdkkTT2dZgpZwWw TP2PLG5rtoFv91K1gtiEvO2sOVbkE6H/pP/8wZKYByFiRipvBryZGel9wZOdI74UzDrb HDufEkBzmVMq6wOnyjD6w0HjOqzQrVxCQYFOHxLFXtexaZ37mBoQZlzmW6sQH39zUuOM t5Zw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:to:from :dkim-signature:arc-authentication-results; bh=o7aYtfpGGE3t6Uf7ftJoHlfGDoFdZl8Xbs8LfP4pzWw=; b=bhKmo1DG8Ypmj1MedWaxmsyszU1+Pc4WUGK1gzP9/FAtlFg69cPmgtYr63hzogQ7uO VE2Uda/4pXJ1xNQ61SF/C6X+L/YPUGi0tJDzyn+XC/yjnf6Gty0rqOVoNeSJZKSQF7nO G5HIsE7mMd9aJzcHKsbDVhPE1M3xSLOnBvL8iqWxnja3ZvoXxCL9LY2h/2TdovcyYDuu yD94uwjN6fwrvRt21YfnSPVLSTgV1/9xMuKtcQ06jF5tUdSSQiDc/fRzDIBvTrFamu6I ahcawNLthtyuigXc6KRJHbUJMbH+vjeFzNw5dofSPaDxeyZJFR6MHzUNACQvdOunubSW ULPg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gateworks-com.20150623.gappssmtp.com header.s=20150623 header.b=OH78jukF; 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 u36si7186603pgn.702.2018.02.27.08.08.49; Tue, 27 Feb 2018 08:09:05 -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=@gateworks-com.20150623.gappssmtp.com header.s=20150623 header.b=OH78jukF; 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 S1752084AbeB0QGc (ORCPT + 99 others); Tue, 27 Feb 2018 11:06:32 -0500 Received: from mail-pf0-f195.google.com ([209.85.192.195]:39129 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750746AbeB0QGb (ORCPT ); Tue, 27 Feb 2018 11:06:31 -0500 Received: by mail-pf0-f195.google.com with SMTP id u5so1371863pfh.6 for ; Tue, 27 Feb 2018 08:06:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gateworks-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id; bh=o7aYtfpGGE3t6Uf7ftJoHlfGDoFdZl8Xbs8LfP4pzWw=; b=OH78jukFNuBktMCuL3bhxq7rwcsBnVYaGFq7Snw5WD92fI62yZBnQm5y9IT1jH78t8 ZHv13PIQCgYht2aRYOLYM+UjNYEHMHSvFG41jpkyGiZDpH45tbzh9lrLR04boVUp2E+W 3dOnE5y4crCWsJveXTdUlL8nvgWXcIKke1d327onlGANSchtYVvA34waM1mDSIjM/Ao6 YqV8Idz717/VOoLJhiJC1civvttDjzCNH18URyxlkHvDvhlKIv+Q+v5o9e4yyoQwoBSO h3b2s0VMX4Vo8bl3NgL4QopzTk4h5aw2vf0c+GqOr+TWAvWnk9RxbD9kIkDz6eEsvtfM 4UIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=o7aYtfpGGE3t6Uf7ftJoHlfGDoFdZl8Xbs8LfP4pzWw=; b=qO+JU0QJ5MMIt+02eKQCML8/UCOOXQmThw6atGSL7DP6G5zws+X67OQglQPRrUAHpI 6eDpj9lGr5jPPgp6gse8Hzr10HYeBVmInVAFtROaxAwS1i6Kh5NB8lJvxD4ofgZdZc6+ d34FaDUWhBoUPiAd6SqxtWAFB2H5sx5/KjNS+K+mX0TsfB8vYyvQza3PoCYjUi3Ip++5 GCQMgIEno2IvKbLbKOnhhvv/S8GLpaeL+2/GQzAwedl9uSXL8pY0Wa/nlMPE3bicEuaT 3u0IJUktRKZHPVua4LEL8kzWpWl6YMLwa5OTUjjeBcikl2SSYXGd/RUx+nsJOE0076zZ TMow== X-Gm-Message-State: APf1xPBwBWf7D6xwk5o4I2jN99hRmMRqyPY5S4L9+cSOLLRwwFjEMoSH yM7JJZodkvIL0oXcSYiTyn42tXLd X-Received: by 10.101.85.71 with SMTP id t7mr11672028pgr.386.1519747589870; Tue, 27 Feb 2018 08:06:29 -0800 (PST) Received: from tharvey.pdc.gateworks.com (68-189-91-139.static.snlo.ca.charter.com. [68.189.91.139]) by smtp.gmail.com with ESMTPSA id g9sm21438830pfh.153.2018.02.27.08.06.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 27 Feb 2018 08:06:28 -0800 (PST) From: Tim Harvey To: linux-kernel@vger.kernel.org, Mark Brown , Benjamin Gaignard , Lee Jones , Tony Lindgren Subject: [PATCH] regmap: irq: fix ack-invert Date: Tue, 27 Feb 2018 08:05:58 -0800 Message-Id: <1519747558-17257-1-git-send-email-tharvey@gateworks.com> X-Mailer: git-send-email 2.7.4 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When acking irqs we need to take into account the ack-invert case. Without this chips that require 0's to ACK interrupts will never clear the interrupt. I am working on an mfd driver that will use ack-invert and discovered this issue. The only user of ack_invert currently appears to be the motorola-cpcap driver. I'm not clear why that driver doesn't appear affected so I'm cc'ing those involved with that driver for review and testing. Cc: Benjamin Gaignard Cc: Lee Jones Cc: Tony Lindgren Signed-off-by: Tim Harvey --- drivers/base/regmap/regmap-irq.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/drivers/base/regmap/regmap-irq.c b/drivers/base/regmap/regmap-irq.c index 429ca8e..abfed41 100644 --- a/drivers/base/regmap/regmap-irq.c +++ b/drivers/base/regmap/regmap-irq.c @@ -355,16 +355,25 @@ static irqreturn_t regmap_irq_thread(int irq, void *d) * doing a write per register. */ for (i = 0; i < data->chip->num_regs; i++) { - data->status_buf[i] &= ~data->mask_buf[i]; - - if (data->status_buf[i] && (chip->ack_base || chip->use_ack)) { + if ( (data->status_buf[i] & ~data->mask_buf[i]) && + (chip->ack_base || chip->use_ack) ) { reg = chip->ack_base + (i * map->reg_stride * data->irq_reg_stride); - ret = regmap_write(map, reg, data->status_buf[i]); + /* some chips ack by write 0 */ + if (chip->ack_invert) + ret = regmap_write(map, reg, + ~data->status_buf[i] & + ~data->mask_buf[i]); + + else + ret = regmap_write(map, reg, + data->status_buf[i] & + ~data->mask_buf[i]); if (ret != 0) dev_err(map->dev, "Failed to ack 0x%x: %d\n", reg, ret); } + data->status_buf[i] &= ~data->mask_buf[i]; } for (i = 0; i < chip->num_irqs; i++) { -- 2.7.4