From patchwork Fri Dec 16 10:56:28 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 101392 Delivered-To: patch@linaro.org Received: by 10.140.20.101 with SMTP id 92csp1334257qgi; Fri, 16 Dec 2016 02:59:53 -0800 (PST) X-Received: by 10.99.253.85 with SMTP id m21mr4656758pgj.38.1481885993564; Fri, 16 Dec 2016 02:59:53 -0800 (PST) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 62si7274543ply.143.2016.12.16.02.59.53; Fri, 16 Dec 2016 02:59:53 -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; 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 S934842AbcLPK7e (ORCPT + 25 others); Fri, 16 Dec 2016 05:59:34 -0500 Received: from mout.kundenserver.de ([217.72.192.73]:53721 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1760749AbcLPK5G (ORCPT ); Fri, 16 Dec 2016 05:57:06 -0500 Received: from wuerfel.lan ([78.43.21.235]) by mrelayeu.kundenserver.de (mreue104 [212.227.15.145]) with ESMTPA (Nemesis) id 0LhvGc-1cunxr0XPW-00n89H; Fri, 16 Dec 2016 11:56:49 +0100 From: Arnd Bergmann To: linux-arch@vger.kernel.org Cc: linux-kbuild@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@vger.kernel.org, Russell King , Andrew Morton , kernel-build-reports@lists.linaro.org, kvmarm@lists.cs.columbia.edu, Arnd Bergmann Subject: [PATCH 07/13] watchdog: kempld: fix gcc-4.3 build Date: Fri, 16 Dec 2016 11:56:28 +0100 Message-Id: <20161216105634.235457-8-arnd@arndb.de> X-Mailer: git-send-email 2.9.0 In-Reply-To: <20161216105634.235457-1-arnd@arndb.de> References: <20161216105634.235457-1-arnd@arndb.de> X-Provags-ID: V03:K0:bKgB3BQpvPRs49NAbMvhifnnk+OPpWwz+xgJXiXXhJhceVUK53T pjG5Jkozv/z60G+zgNigp+MvManDrEdfbh3X58sL7SmI9KInhYNDGvXxPmux4vxrfN6W118 La5iu72TAlhJ4L8ZXZtrKDWCFcXDSryrUCvdC3VdjqXNcOUXcPcnxfebfYZBkXaeyAPkbRY IiTBTb62cfQn2/atd8z7Q== X-UI-Out-Filterresults: notjunk:1; V01:K0:37K2/S81aS8=:oyK9ON1e80MvKf8hWmVAOF 2qacpbj2p7ICE5YMUGZAD195pk22r/PfA1HMzOrajCV0ucQ9mpgc9ybFyqub5lv86vALrbwhv iDisD+ul2j3CsPkssp8Hee7o92yk/vehO3m5zM8CVU++QUKvBtqeiB5Rt+YQ45Z6achujULEV BTZKYvt1BJwYzCKIT3WRg1lWIe2A2StsEOVR8KONAndSUyu+sL808vAyCELvab+zCoF33cb8G dMaB5KF8iSVoGHOExF7TgKbVMX1hf4Juhpsa9Rz0C11/TEMF6NuSiCD1OZeV8ZnFXWtJf4uql kCsKKCRjO9H8QqPhNmr/+5w/BDHBbSKMkm15NzxCivpjDRFlgcAuNjw701sy8VSRgdFdPlBkz /Ckf8TVnCj73plo9Qz14wC9RDxeniR0dFQ++cOiFwgXdvdUPPK4vgOfObxeSEmsHmqtokb6u5 bjwow8joa6NvD60Ag2qe1ab9tT4fN18c3ItH8BBOdICwpCILWmoiZzdmIG1mgtsSluuQyXZ2L WintplEXexDrwfG3PGKPfdJMXj1qVqjJpyy96WQekEGHjQqj4yoA9Eif7FYBTVjb2aA0JpO1v LfT1Xf5DS3nOvaElTg63LAuZW8FwuLepOrG+IPHeh6mDUZFPKVGMlv+BR7Uj3UsZUesBAIiPd pTx/XRJKE9TViOiLOdXR4K1LccLoU5dFIauZjngZOU3fN1mr+FJAyjtTqkXslTT/CMug= Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org gcc-4.3 can't decide whether the constant value in kempld_prescaler[PRESCALER_21] is built-time constant or not, and gets confused by the logic in do_div(): drivers/watchdog/kempld_wdt.o: In function `kempld_wdt_set_stage_timeout': kempld_wdt.c:(.text.kempld_wdt_set_stage_timeout+0x130): undefined reference to `__aeabi_uldivmod' This adds a call to ACCESS_ONCE() to force it to not consider it to be constant, and leaves the more efficient normal case in place for modern compilers, using an #ifdef to annotate why we do this hack. Signed-off-by: Arnd Bergmann --- drivers/watchdog/kempld_wdt.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) -- 2.9.0 diff --git a/drivers/watchdog/kempld_wdt.c b/drivers/watchdog/kempld_wdt.c index 8e302d0e346c..3efa295ac627 100644 --- a/drivers/watchdog/kempld_wdt.c +++ b/drivers/watchdog/kempld_wdt.c @@ -140,12 +140,19 @@ static int kempld_wdt_set_stage_timeout(struct kempld_wdt_data *wdt_data, unsigned int timeout) { struct kempld_device_data *pld = wdt_data->pld; - u32 prescaler = kempld_prescaler[PRESCALER_21]; + u32 prescaler; u64 stage_timeout64; u32 stage_timeout; u32 remainder; u8 stage_cfg; +#if GCC_VERSION < 40400 + /* work around a bug compiling do_div() */ + prescaler = READ_ONCE(kempld_prescaler[PRESCALER_21]); +#else + prescaler = kempld_prescaler[PRESCALER_21]; +#endif + if (!stage) return -EINVAL;