Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp7799pxf; Wed, 7 Apr 2021 18:19:09 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzqObIt6J/nDpxe/6SmlA3o8Qv+IUTSZuFTnw87EBk9EJpbl3DG7/kzJNzZEtvCF13CvhBa X-Received: by 2002:a62:7c43:0:b029:1ef:20ce:ba36 with SMTP id x64-20020a627c430000b02901ef20ceba36mr5357959pfc.40.1617844748996; Wed, 07 Apr 2021 18:19:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1617844748; cv=none; d=google.com; s=arc-20160816; b=hJHMOXlUcUOyrCqskKx2hF6k/T7Ess1y6WaNReOIzgOksBV6l2f33jF6p2F1ul7vDg W3P6U9T3oBZXICv34VdteewdQsOQSvJqDv4HtJSdyQ35weyo//xlRcAN4NMAByDuoBkC dNOk9zNY8rYqgOn+Cl8Vt5ykgnRdfDCAc5O9xOtBZHC3bVAAMvTgrXzK8QlV0a1AX1B3 Spd6zs9qqFXEeh+WOZlHjUl5z5ZWm0ylgzgbonG9mU2rk15MRN2G7JOuGeFgmHaMDEvm DC5owwovxvGVIP0nnhqBJEDFgx+EXFjHKjZ1SeHPL5ZW/hFwkMlFGqSNP0ve00NXrzNV kBWA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=dkNOm/h1qSphcHi2Oe/aIN2quBfOKYQTuInyf8XmA4o=; b=x0C9jr525L6VpgNGnO2fig5xcn6rOjCqfkk1m3+4xn+9LtYk6tCGlXfzdqXS8NOiy6 Yz0KSWN0KT/pd4fUiVJLx+zv0mpM6QjQXs2F7M0+Pjvu92vwInhbJwyDGCTNYrq6dHap aYdDvqdd7i0kB2gNmqTr8hGBLsWPoQa9jUFL7iKJXTz+QloG0cQvgdjBRPi5+gpZQZG5 lWf5mnyD7Euxp6hDHxZs/QezbW4obRgjfVOw4gxAM7Wkv0godHx18AowNdCOL4PvcF7J 73WdW0SFO5MvI53BGkz0qjQA+i3I6+s4qi3cjYE3GeU/RlRj5GWEopuY43kpLZxx1waf KVqQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@bewilderbeest.net header.s=thorn header.b=KJPZy0Aj; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=bewilderbeest.net Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id t8si14873489plz.334.2021.04.07.18.18.31; Wed, 07 Apr 2021 18:19:08 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@bewilderbeest.net header.s=thorn header.b=KJPZy0Aj; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=bewilderbeest.net Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230301AbhDHBRL (ORCPT + 99 others); Wed, 7 Apr 2021 21:17:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48658 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230237AbhDHBRH (ORCPT ); Wed, 7 Apr 2021 21:17:07 -0400 Received: from thorn.bewilderbeest.net (thorn.bewilderbeest.net [IPv6:2605:2700:0:5::4713:9cab]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6A805C061761; Wed, 7 Apr 2021 18:16:57 -0700 (PDT) Received: from hatter.bewilderbeest.net (unknown [IPv6:2600:6c44:7f:ba20::7c6]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: zev) by thorn.bewilderbeest.net (Postfix) with ESMTPSA id 5BDDC682; Wed, 7 Apr 2021 18:16:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bewilderbeest.net; s=thorn; t=1617844617; bh=dkNOm/h1qSphcHi2Oe/aIN2quBfOKYQTuInyf8XmA4o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KJPZy0AjnrRHhfXKq6Srf+4ZZ9w8jrazvwRePQg9XR9alRyfmEq1wUg2Jj2cae3eO N2tR+ZxaydoGj1rndC3Wc4hejvrLVAAjhugKD4P6BUb4Ct7eS9ByEkBGFrFzVD8nEd NjHEhpxSPlpP1DbM6lqiJSYSsX09DiKDi3v18uHQ= From: Zev Weiss To: Joel Stanley Cc: openbmc@lists.ozlabs.org, linux-arm-kernel@lists.infradead.org, linux-aspeed@lists.ozlabs.org, linux-kernel@vger.kernel.org, Andrew Jeffery , Zev Weiss , Greg Kroah-Hartman , Jiri Slaby , linux-serial@vger.kernel.org Subject: [PATCH v5 2/4] drivers/tty/serial/8250: refactor sirq and lpc address setting code Date: Wed, 7 Apr 2021 20:16:35 -0500 Message-Id: <20210408011637.5361-3-zev@bewilderbeest.net> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210408011637.5361-1-zev@bewilderbeest.net> References: <20210408011637.5361-1-zev@bewilderbeest.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This splits dedicated aspeed_vuart_set_{sirq,lpc_address}() functions out of the sysfs store functions in preparation for adding DT properties that will be poking the same registers. While we're at it, these functions now provide some basic bounds-checking on their arguments. Signed-off-by: Zev Weiss --- drivers/tty/serial/8250/8250_aspeed_vuart.c | 51 ++++++++++++++------- 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/drivers/tty/serial/8250/8250_aspeed_vuart.c b/drivers/tty/serial/8250/8250_aspeed_vuart.c index c33e02cbde93..8433f8dbb186 100644 --- a/drivers/tty/serial/8250/8250_aspeed_vuart.c +++ b/drivers/tty/serial/8250/8250_aspeed_vuart.c @@ -72,22 +72,31 @@ static ssize_t lpc_address_show(struct device *dev, return snprintf(buf, PAGE_SIZE - 1, "0x%x\n", addr); } +static int aspeed_vuart_set_lpc_address(struct aspeed_vuart *vuart, u32 addr) +{ + if (addr > U16_MAX) + return -EINVAL; + + writeb(addr >> 8, vuart->regs + ASPEED_VUART_ADDRH); + writeb(addr >> 0, vuart->regs + ASPEED_VUART_ADDRL); + + return 0; +} + static ssize_t lpc_address_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct aspeed_vuart *vuart = dev_get_drvdata(dev); - unsigned long val; + u32 val; int err; - err = kstrtoul(buf, 0, &val); + err = kstrtou32(buf, 0, &val); if (err) return err; - writeb(val >> 8, vuart->regs + ASPEED_VUART_ADDRH); - writeb(val >> 0, vuart->regs + ASPEED_VUART_ADDRL); - - return count; + err = aspeed_vuart_set_lpc_address(vuart, val); + return err ? : count; } static DEVICE_ATTR_RW(lpc_address); @@ -105,27 +114,37 @@ static ssize_t sirq_show(struct device *dev, return snprintf(buf, PAGE_SIZE - 1, "%u\n", reg); } +static int aspeed_vuart_set_sirq(struct aspeed_vuart *vuart, u32 sirq) +{ + u8 reg; + + if (sirq > (ASPEED_VUART_GCRB_HOST_SIRQ_MASK >> ASPEED_VUART_GCRB_HOST_SIRQ_SHIFT)) + return -EINVAL; + + sirq <<= ASPEED_VUART_GCRB_HOST_SIRQ_SHIFT; + sirq &= ASPEED_VUART_GCRB_HOST_SIRQ_MASK; + + reg = readb(vuart->regs + ASPEED_VUART_GCRB); + reg &= ~ASPEED_VUART_GCRB_HOST_SIRQ_MASK; + reg |= sirq; + writeb(reg, vuart->regs + ASPEED_VUART_GCRB); + + return 0; +} + static ssize_t sirq_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct aspeed_vuart *vuart = dev_get_drvdata(dev); unsigned long val; int err; - u8 reg; err = kstrtoul(buf, 0, &val); if (err) return err; - val <<= ASPEED_VUART_GCRB_HOST_SIRQ_SHIFT; - val &= ASPEED_VUART_GCRB_HOST_SIRQ_MASK; - - reg = readb(vuart->regs + ASPEED_VUART_GCRB); - reg &= ~ASPEED_VUART_GCRB_HOST_SIRQ_MASK; - reg |= val; - writeb(reg, vuart->regs + ASPEED_VUART_GCRB); - - return count; + err = aspeed_vuart_set_sirq(vuart, val); + return err ? : count; } static DEVICE_ATTR_RW(sirq); -- 2.31.1