From patchwork Thu Jun 16 09:00:05 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 102188 Delivered-To: patch@linaro.org Received: by 10.140.28.4 with SMTP id 4csp152323qgy; Thu, 16 Jun 2016 01:58:50 -0700 (PDT) X-Received: by 10.36.16.67 with SMTP id 64mr5869688ity.88.1466067530677; Thu, 16 Jun 2016 01:58:50 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c186si4972180pfa.69.2016.06.16.01.58.50; Thu, 16 Jun 2016 01:58:50 -0700 (PDT) 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; 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 S1753870AbcFPI6t (ORCPT + 30 others); Thu, 16 Jun 2016 04:58:49 -0400 Received: from mout.kundenserver.de ([212.227.126.187]:51620 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752666AbcFPI6n (ORCPT ); Thu, 16 Jun 2016 04:58:43 -0400 Received: from wuerfel.lan. ([78.42.132.4]) by mrelayeu.kundenserver.de (mreue001) with ESMTPA (Nemesis) id 0MLWok-1bCuty0CSA-000YEI; Thu, 16 Jun 2016 10:58:36 +0200 From: Arnd Bergmann To: Florian Fainelli Cc: Arnd Bergmann , "David S. Miller" , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] dsa: b53: fix big-endian register access Date: Thu, 16 Jun 2016 11:00:05 +0200 Message-Id: <20160616090017.912604-1-arnd@arndb.de> X-Mailer: git-send-email 2.9.0 X-Provags-ID: V03:K0:ohnQi/nvJEhlccJNP2AwUsMYgMSeHcHCLvjCuKwZA3f7fsmWBiA pvv4CBrDRbemKHir7F7vO3ir+B05ckm8V5j8wkYgaEUkHGWABr61acI1bSv3NHoN+4Xf6Nq rI9Ztlj56QDvP3/FV3iEgMuX2AZh2mPdrz4F8fSVraKIO/b90ESFBqjhp3RMHPdJoFK0/yf K85ilzZ/AhlfrB0ABz89A== X-UI-Out-Filterresults: notjunk:1; V01:K0:lwtJestOka0=:rGj4cNiN6kC8t/Y6+fnEEE vh/qYWNK1ToqWCMrpnfmjC2x/XTOyz3a7cRzRKUJmTU0WIXHDoY2xCW7qf1tQPsdf4CLnLydS X7bWh3qejkYXTjUdRXAm/vAxS7eVm2QrQzD6gKrudxT8lmwkj+ji1frycMsxrAi9pBxqLDAuy gDeK7g4OsoC4QUjgL3j703+Vp0AzC1557pq2CiutNt81QSKB4xHPigkznvvqteIZkI4nuNaVp qXncZSXf21xoJYsihOkWmuVK6iZ3lPE5LJBQXensYN63z1gCj65ThDIQVN5/hRBLCD3NvreSI /VcZs97LkOHfHDIJH67ySjqV74PGrcIR4DwNtbpRjEkHmE14gABRuTMY8MBc/G6fEnstkmBLa AGZcqCM66X9d/p7G01IUqwBwOSg76l0/JU0Vlw3zBSnwTX9d2UvBzwCFAZ15P2PwVl7yCNRbl BZNcMM8vikHJ+F5BfbCxUmh5OOTDoApGJCfZu2yoq5FTqt7mh3zM/F4vho7ipzRqX618ws1Zs ziC0+BrRDrBeLewGgi33s1vhl6z8Fe/mflGgV289gMHrPjgvUWDTHY/dm1a85Ei2G1abguE/a OlMZKwaJTr7TywsM1tJYqJRZOKpg5kQmiDPW66g76btNJdqKAbvBCXZIuD8uC3MyFdl6+sxy9 gknM96GrY48b5ZZVPpuRAK1U5GjmV5TEb8zxvoo/NCs/SybGy5BJzmi1Sq+UaXUQRFo4= Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The b53 dsa register access confusingly uses __raw register accessors when both the CPU and the device are big-endian, but it uses little- endian accessors when the same device is used from a little-endian CPU, which makes no sense. This uses normal accessors in device-endianess all the time, which will work in all four combinations of register and CPU endianess, and it will have the same barrier semantics in all cases. This also seems to take care of a (false positive) warning I'm getting: drivers/net/dsa/b53/b53_mmap.c: In function 'b53_mmap_read64': drivers/net/dsa/b53/b53_mmap.c:109:10: error: 'hi' may be used uninitialized in this function [-Werror=maybe-uninitialized] *val = ((u64)hi << 32) | lo; I originally planned to submit another patch for that warning and did this one as a preparation cleanup, but it does seem to be sufficient by itself. Signed-off-by: Arnd Bergmann --- drivers/net/dsa/b53/b53_mmap.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) -- 2.9.0 diff --git a/drivers/net/dsa/b53/b53_mmap.c b/drivers/net/dsa/b53/b53_mmap.c index f115ee25c0e8..b70daf9174d4 100644 --- a/drivers/net/dsa/b53/b53_mmap.c +++ b/drivers/net/dsa/b53/b53_mmap.c @@ -45,9 +45,8 @@ static int b53_mmap_read16(struct b53_device *dev, u8 page, u8 reg, u16 *val) if (WARN_ON(reg % 2)) return -EINVAL; - if (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) && dev->pdata && - dev->pdata->big_endian) - *val = __raw_readw(regs + (page << 8) + reg); + if (dev->pdata && dev->pdata->big_endian) + *val = ioread16be(regs + (page << 8) + reg); else *val = readw(regs + (page << 8) + reg); @@ -61,9 +60,8 @@ static int b53_mmap_read32(struct b53_device *dev, u8 page, u8 reg, u32 *val) if (WARN_ON(reg % 4)) return -EINVAL; - if (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) && dev->pdata && - dev->pdata->big_endian) - *val = __raw_readl(regs + (page << 8) + reg); + if (dev->pdata && dev->pdata->big_endian) + *val = ioread32be(regs + (page << 8) + reg); else *val = readl(regs + (page << 8) + reg); @@ -128,9 +126,8 @@ static int b53_mmap_write16(struct b53_device *dev, u8 page, u8 reg, if (WARN_ON(reg % 2)) return -EINVAL; - if (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) && dev->pdata && - dev->pdata->big_endian) - __raw_writew(value, regs + (page << 8) + reg); + if (dev->pdata && dev->pdata->big_endian) + iowrite16be(value, regs + (page << 8) + reg); else writew(value, regs + (page << 8) + reg); @@ -145,9 +142,8 @@ static int b53_mmap_write32(struct b53_device *dev, u8 page, u8 reg, if (WARN_ON(reg % 4)) return -EINVAL; - if (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) && dev->pdata && - dev->pdata->big_endian) - __raw_writel(value, regs + (page << 8) + reg); + if (dev->pdata && dev->pdata->big_endian) + iowrite32be(value, regs + (page << 8) + reg); else writel(value, regs + (page << 8) + reg);