From patchwork Fri Sep 9 20:10:45 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 101818 Delivered-To: patch@linaro.org Received: by 10.140.106.11 with SMTP id d11csp523975qgf; Fri, 9 Sep 2016 13:13:17 -0700 (PDT) X-Received: by 10.66.124.197 with SMTP id mk5mr9799892pab.4.1473451997431; Fri, 09 Sep 2016 13:13:17 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e62si4884453pfk.29.2016.09.09.13.13.17; Fri, 09 Sep 2016 13:13:17 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753756AbcIIUNP (ORCPT + 7 others); Fri, 9 Sep 2016 16:13:15 -0400 Received: from mout.kundenserver.de ([217.72.192.74]:56554 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753192AbcIIUNO (ORCPT ); Fri, 9 Sep 2016 16:13:14 -0400 Received: from wuerfel.localnet ([78.43.20.153]) by mrelayeu.kundenserver.de (mreue102) with ESMTPSA (Nemesis) id 0MIv6n-1bkNwR01vt-002Vbk; Fri, 09 Sep 2016 22:10:50 +0200 From: Arnd Bergmann To: Hoan Tran Cc: Guenter Roeck , Jean Delvare , Jonathan Corbet , Rob Herring , Jassi Brar , Ashwin Chaugule , Duc Dang , Loc Ho , linux-hwmon@vger.kernel.org, linux-doc@vger.kernel.org, lkml , linux-arm-kernel@lists.infradead.org, Devicetree List Subject: [PATCH v2] hwmon: xgene: access mailbox as RAM Date: Fri, 09 Sep 2016 22:10:45 +0200 Message-ID: <3475893.910N1IvcYZ@wuerfel> User-Agent: KMail/5.1.3 (Linux/4.4.0-34-generic; KDE/5.18.0; x86_64; ; ) In-Reply-To: <2852054.37zytD0HIa@wuerfel> References: <1469134557-26869-1-git-send-email-hotran@apm.com> <2852054.37zytD0HIa@wuerfel> MIME-Version: 1.0 X-Provags-ID: V03:K0:yU7DY9PrNyabIDH9KjxjzH6HsemDusbROpr9qqajzkd0K3rZ4pI AsZNcYrGKXiNUqHY0YjaHtBEcFY2HescawQw3FfesOG8L165Uh1diWhYJEPYzDKr4UE5nFX Qm7DEV3QerH6Vo3qLU3YdHsFfRktjCxmzLjcAJ03zTm2iW2BQ01Ygj+yjka8N5NY7Tzr+Ke B1HOUDY9Sd32p26El+lbA== X-UI-Out-Filterresults: notjunk:1; V01:K0:GL4LkHcX6bs=:RV8+a6IurZCDqJxcpChv7c NcCrlWZ8Mr+t4y7K6PDZyvmO9moxPf/ku8vklt7MuWlvNLu3wTgH611GE3c0FZreCVVakrNfH fMf9PRbRTWMK134rkKT4J3s9ibLmfNl75UNbCBKmXGBE9YyOOjJV+cUa8yiEywvEfV4odHI0R cVcF9qnZT+yBBPyjWGnMmh0B0VMKB2R7Bhix1lawAkfxlajnj0nBaQ7xGAVvEATryg9z45VVr zHyLJ/ukpEzPp8g5MdhhXn04341i4wnw6Lyqzwpw1LIIyH2XaoZWAsz4hhvmX60O9VTv8pyBE QlQQS9IjpSJ/ktp6Iu/zqpqPtI7kcGs5aczxzA7MUbmLP+J5oCax1XR6RPrVgesTSQuOtt8Ao igruhuI1+0NZgqRV000qOZWfbhF9eFbAJ4Mg5zbsYjNIJsm29QxkBTmidErNnmGsz8I8oqcaf Ua0MgErE74g4BxIVLe2FyMJVfcOm/QnDgJ7G7iOy2Knypv3gzDRkOz4AFZrvJnBmUO7J772xV OCCjW67gWwRVLkceBo0tji++Ltl3klqAdE4Kex4cvDZgf8n/NIOpeW4QGm+ZxmbGAzniPiT47 sziMlFxSBLA8h3TrM1IVC2kDFIPpj82GWtx5iiTIuK7cFI8QBRlKH/Dv/WDxJzCbY1yLujPXZ ZYWrNr6yUmZWhIaQ5nklUD7s4YtZWYfcONJJqxg/MiHm8/EjTcFdtwRaKAUK969vh4AwbeKoI h0JvUkM7kr55pi9W Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org The newly added hwmon driver fails to build in an allmodconfig kernel: ERROR: "memblock_is_memory" [drivers/hwmon/xgene-hwmon.ko] undefined! According to comments in the code, the mailbox is a shared memory region, not a set of MMIO registers, so we should use memremap() for mapping it instead of ioremap or acpi_os_ioremap, and pointer dereferences instead of readl/writel. The driver already uses plain kernel pointers, so it's a bit unusual to work with functions that operate on __iomem pointers, and this fixes that part too. I'm using READ_ONCE/WRITE_ONCE here to keep the existing behavior regarding the ordering of the accesses from the CPU, but note that there are no barriers (also unchanged from before). I'm also keeping the endianess behavior, though I'm unsure whether the message data was supposed to be in LE32 format in the first place, it's possible this was meant to be interpreted as a byte stream instead. Signed-off-by: Arnd Bergmann --- v2: use write-back mapping instead of write-thru, minor coding style changes -- To unsubscribe from this list: send the line "unsubscribe devicetree" 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/hwmon/xgene-hwmon.c b/drivers/hwmon/xgene-hwmon.c index bc78a5d10182..e5470bd49067 100644 --- a/drivers/hwmon/xgene-hwmon.c +++ b/drivers/hwmon/xgene-hwmon.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -34,7 +35,7 @@ #include #include #include -#include + #include /* SLIMpro message defines */ @@ -126,10 +127,10 @@ static u16 xgene_word_tst_and_clr(u16 *addr, u16 mask) { u16 ret, val; - val = readw_relaxed(addr); + val = le16_to_cpu(READ_ONCE(*addr)); ret = val & mask; val &= ~mask; - writew_relaxed(val, addr); + WRITE_ONCE(*addr, cpu_to_le16(val)); return ret; } @@ -137,7 +138,7 @@ static u16 xgene_word_tst_and_clr(u16 *addr, u16 mask) static int xgene_hwmon_pcc_rd(struct xgene_hwmon_dev *ctx, u32 *msg) { struct acpi_pcct_shared_memory *generic_comm_base = ctx->pcc_comm_addr; - void *ptr = generic_comm_base + 1; + u32 *ptr = (void *)(generic_comm_base + 1); int rc, i; u16 val; @@ -146,21 +147,21 @@ static int xgene_hwmon_pcc_rd(struct xgene_hwmon_dev *ctx, u32 *msg) ctx->resp_pending = true; /* Write signature for subspace */ - writel_relaxed(PCC_SIGNATURE_MASK | ctx->mbox_idx, - &generic_comm_base->signature); + WRITE_ONCE(generic_comm_base->signature, + cpu_to_le32(PCC_SIGNATURE_MASK | ctx->mbox_idx)); /* Write to the shared command region */ - writew_relaxed(MSG_TYPE(msg[0]) | PCCC_GENERATE_DB_INT, - &generic_comm_base->command); + WRITE_ONCE(generic_comm_base->command, + cpu_to_le16(MSG_TYPE(msg[0]) | PCCC_GENERATE_DB_INT)); /* Flip CMD COMPLETE bit */ - val = readw_relaxed(&generic_comm_base->status); + val = le16_to_cpu(READ_ONCE(generic_comm_base->status)); val &= ~PCCS_CMD_COMPLETE; - writew_relaxed(val, &generic_comm_base->status); + WRITE_ONCE(generic_comm_base->status, cpu_to_le16(val)); /* Copy the message to the PCC comm space */ for (i = 0; i < sizeof(struct slimpro_resp_msg) / 4; i++) - writel_relaxed(msg[i], ptr + i * 4); + WRITE_ONCE(ptr[i], cpu_to_le32(msg[i])); /* Ring the doorbell */ rc = mbox_send_message(ctx->mbox_chan, msg); @@ -652,9 +653,9 @@ static int xgene_hwmon_probe(struct platform_device *pdev) */ ctx->comm_base_addr = cppc_ss->base_address; if (ctx->comm_base_addr) { - ctx->pcc_comm_addr = - acpi_os_ioremap(ctx->comm_base_addr, - cppc_ss->length); + ctx->pcc_comm_addr = memremap(ctx->comm_base_addr, + cppc_ss->length, + MEMREMAP_WB); } else { dev_err(&pdev->dev, "Failed to get PCC comm region\n"); rc = -ENODEV;