From patchwork Wed Jun 22 06:27:17 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Linus Walleij X-Patchwork-Id: 70608 Delivered-To: patch@linaro.org Received: by 10.140.28.4 with SMTP id 4csp2387404qgy; Tue, 21 Jun 2016 23:28:05 -0700 (PDT) X-Received: by 10.107.17.31 with SMTP id z31mr38410130ioi.150.1466576885798; Tue, 21 Jun 2016 23:28:05 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x185si12259230pfx.31.2016.06.21.23.28.05; Tue, 21 Jun 2016 23:28:05 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of stable-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org; spf=pass (google.com: best guess record for domain of stable-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=stable-owner@vger.kernel.org; dmarc=fail (p=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750833AbcFVG2E (ORCPT + 3 others); Wed, 22 Jun 2016 02:28:04 -0400 Received: from mail-lf0-f43.google.com ([209.85.215.43]:35806 "EHLO mail-lf0-f43.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751198AbcFVG2C (ORCPT ); Wed, 22 Jun 2016 02:28:02 -0400 Received: by mail-lf0-f43.google.com with SMTP id l188so60250194lfe.2 for ; Tue, 21 Jun 2016 23:27:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=MZ5wQ1gMvkL53GK5PfMHp6W6wsQ9wMTwtx1KM7B1qhs=; b=R+JU/8Rss0gC8+hHTpW6eTRmabLb8FwgWlgUk8e+bnimJwZ0MQ0tphphC0QH8aFc7y jp+Ix4EjeInu4RCxVPLs6bIMgPfR7wORjsHWyoViukktKWdbRbb2usk1QRNv3JYWg+to JiFCTX8hBapEwdxWe+NepUI3tPsiLBNpF3orU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=MZ5wQ1gMvkL53GK5PfMHp6W6wsQ9wMTwtx1KM7B1qhs=; b=i2C+HCPWxxm9OhB65JRWD207ArMoLsS1k653NIxkjhMq5IhHjSd+tCtJElEtQabcvR KOuGbQkha4aN+ic8kWf1kuwEOG35OlV6T/mTve3WtIs0bIlP0iP2uy51J1EAgVk0KmsK RkwN8K6OegKT0XLf+ZvLeKKQ7BACk9pabYg5bl0Tz5JZPQI+850zG9EjKpW97biMzWhO vaU5tV4JgBAdWnfYpRIO/52/MD8KV+lgAifAZfdgfx+Z63hAqKj6PBcNVZY3SDMMBRaP rxTEX4FKZGcIOQxFBvkPvNyqG69bbl16bsyhi8N/VVhzXh3NaPQt531HF+m7Kf529PCj hiCA== X-Gm-Message-State: ALyK8tLarvRsVd+CcQ6RPB21RaKhwsxpADQRAjMgsU57ips59fDEVMkMSXzbXrAPnxbIeb2/ X-Received: by 10.46.33.227 with SMTP id h96mr7973886lji.50.1466576845651; Tue, 21 Jun 2016 23:27:25 -0700 (PDT) Received: from localhost.localdomain.localdomain (c-cc7c71d5.014-348-6c756e10.cust.bredbandsbolaget.se. [213.113.124.204]) by smtp.gmail.com with ESMTPSA id f17sm7403816lfg.35.2016.06.21.23.27.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 21 Jun 2016 23:27:24 -0700 (PDT) From: Linus Walleij To: , linux-kernel@vger.kernel.org, Bjorn Andersson , Stephen Boyd Cc: Neil Armstrong , Linus Walleij , stable@vger.kernel.org Subject: [PATCH] mfd: qcom_rpm: parametrize also ack selector size Date: Wed, 22 Jun 2016 08:27:17 +0200 Message-Id: <1466576837-21995-1-git-send-email-linus.walleij@linaro.org> X-Mailer: git-send-email 2.4.11 MIME-Version: 1.0 Sender: stable-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: stable@vger.kernel.org The RPM has two sets of selectors (IPC bit fields): request and acknowledge. Apparently, some models use 4*32 bit words for select and some use 7*32 bit words for request, but all use 7*32 words for acknowledge bits. So apparently you can on the models with requests of 4*32 select bits send 4*32 messages and get 7*32 different replies, so on ACK interrupt, 7*32 bit words need to be read. This is how the vendor code apparently works. Cc: stable@vger.kernel.org Cc: Stephen Boyd Cc: Björn Andersson Reported-by: Stephen Boyd Signed-off-by: Linus Walleij --- Lee: this patch goes on top of the previous patch I sent: "mfd: qcom_rpm: fix offset error for msm8660" You can also squash them, if you prefer. --- drivers/mfd/qcom_rpm.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) -- 2.4.11 -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/mfd/qcom_rpm.c b/drivers/mfd/qcom_rpm.c index 9364f88264e5..880d4699bcb0 100644 --- a/drivers/mfd/qcom_rpm.c +++ b/drivers/mfd/qcom_rpm.c @@ -39,7 +39,8 @@ struct qcom_rpm_data { unsigned int req_sel_off; unsigned int ack_ctx_off; unsigned int ack_sel_off; - unsigned int sel_size; + unsigned int req_sel_size; + unsigned int ack_sel_size; }; struct qcom_rpm { @@ -162,7 +163,8 @@ static const struct qcom_rpm_data apq8064_template = { .req_sel_off = 11, .ack_ctx_off = 15, .ack_sel_off = 23, - .sel_size = 4, + .req_sel_size = 4, + .ack_sel_size = 7, }; static const struct qcom_rpm_resource msm8660_rpm_resource_table[] = { @@ -250,7 +252,8 @@ static const struct qcom_rpm_data msm8660_template = { .req_sel_off = 11, .ack_ctx_off = 19, .ack_sel_off = 27, - .sel_size = 7, + .req_sel_size = 7, + .ack_sel_size = 7, }; static const struct qcom_rpm_resource msm8960_rpm_resource_table[] = { @@ -337,7 +340,8 @@ static const struct qcom_rpm_data msm8960_template = { .req_sel_off = 11, .ack_ctx_off = 15, .ack_sel_off = 23, - .sel_size = 4, + .req_sel_size = 4, + .ack_sel_size = 7, }; static const struct qcom_rpm_resource ipq806x_rpm_resource_table[] = { @@ -382,7 +386,8 @@ static const struct qcom_rpm_data ipq806x_template = { .req_sel_off = 11, .ack_ctx_off = 15, .ack_sel_off = 23, - .sel_size = 4, + .req_sel_size = 4, + .ack_sel_size = 7, }; static const struct of_device_id qcom_rpm_of_match[] = { @@ -419,7 +424,7 @@ int qcom_rpm_write(struct qcom_rpm *rpm, writel_relaxed(buf[i], RPM_REQ_REG(rpm, res->target_id + i)); bitmap_set((unsigned long *)sel_mask, res->select_id, 1); - for (i = 0; i < rpm->data->sel_size; i++) { + for (i = 0; i < rpm->data->req_sel_size; i++) { writel_relaxed(sel_mask[i], RPM_CTRL_REG(rpm, rpm->data->req_sel_off + i)); } @@ -448,7 +453,7 @@ static irqreturn_t qcom_rpm_ack_interrupt(int irq, void *dev) int i; ack = readl_relaxed(RPM_CTRL_REG(rpm, rpm->data->ack_ctx_off)); - for (i = 0; i < rpm->data->sel_size; i++) + for (i = 0; i < rpm->data->ack_sel_size; i++) writel_relaxed(0, RPM_CTRL_REG(rpm, rpm->data->ack_sel_off + i)); writel(0, RPM_CTRL_REG(rpm, rpm->data->ack_ctx_off));