Skip to content

Commit 3b44af4

Browse files
zevweissgregkh
authored andcommitted
serial: 8250_aspeed_vuart: refactor sirq and lpc address setting code
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. Reviewed-by: Andrew Jeffery <andrew@aj.id.au> Signed-off-by: Zev Weiss <zev@bewilderbeest.net> Link: https://lore.kernel.org/r/20210412034712.16778-3-zev@bewilderbeest.net Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent a13df3b commit 3b44af4

File tree

1 file changed

+35
-16
lines changed

1 file changed

+35
-16
lines changed

drivers/tty/serial/8250/8250_aspeed_vuart.c

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -72,22 +72,31 @@ static ssize_t lpc_address_show(struct device *dev,
7272
return snprintf(buf, PAGE_SIZE - 1, "0x%x\n", addr);
7373
}
7474

75+
static int aspeed_vuart_set_lpc_address(struct aspeed_vuart *vuart, u32 addr)
76+
{
77+
if (addr > U16_MAX)
78+
return -EINVAL;
79+
80+
writeb(addr >> 8, vuart->regs + ASPEED_VUART_ADDRH);
81+
writeb(addr >> 0, vuart->regs + ASPEED_VUART_ADDRL);
82+
83+
return 0;
84+
}
85+
7586
static ssize_t lpc_address_store(struct device *dev,
7687
struct device_attribute *attr,
7788
const char *buf, size_t count)
7889
{
7990
struct aspeed_vuart *vuart = dev_get_drvdata(dev);
80-
unsigned long val;
91+
u32 val;
8192
int err;
8293

83-
err = kstrtoul(buf, 0, &val);
94+
err = kstrtou32(buf, 0, &val);
8495
if (err)
8596
return err;
8697

87-
writeb(val >> 8, vuart->regs + ASPEED_VUART_ADDRH);
88-
writeb(val >> 0, vuart->regs + ASPEED_VUART_ADDRL);
89-
90-
return count;
98+
err = aspeed_vuart_set_lpc_address(vuart, val);
99+
return err ? : count;
91100
}
92101

93102
static DEVICE_ATTR_RW(lpc_address);
@@ -105,27 +114,37 @@ static ssize_t sirq_show(struct device *dev,
105114
return snprintf(buf, PAGE_SIZE - 1, "%u\n", reg);
106115
}
107116

117+
static int aspeed_vuart_set_sirq(struct aspeed_vuart *vuart, u32 sirq)
118+
{
119+
u8 reg;
120+
121+
if (sirq > (ASPEED_VUART_GCRB_HOST_SIRQ_MASK >> ASPEED_VUART_GCRB_HOST_SIRQ_SHIFT))
122+
return -EINVAL;
123+
124+
sirq <<= ASPEED_VUART_GCRB_HOST_SIRQ_SHIFT;
125+
sirq &= ASPEED_VUART_GCRB_HOST_SIRQ_MASK;
126+
127+
reg = readb(vuart->regs + ASPEED_VUART_GCRB);
128+
reg &= ~ASPEED_VUART_GCRB_HOST_SIRQ_MASK;
129+
reg |= sirq;
130+
writeb(reg, vuart->regs + ASPEED_VUART_GCRB);
131+
132+
return 0;
133+
}
134+
108135
static ssize_t sirq_store(struct device *dev, struct device_attribute *attr,
109136
const char *buf, size_t count)
110137
{
111138
struct aspeed_vuart *vuart = dev_get_drvdata(dev);
112139
unsigned long val;
113140
int err;
114-
u8 reg;
115141

116142
err = kstrtoul(buf, 0, &val);
117143
if (err)
118144
return err;
119145

120-
val <<= ASPEED_VUART_GCRB_HOST_SIRQ_SHIFT;
121-
val &= ASPEED_VUART_GCRB_HOST_SIRQ_MASK;
122-
123-
reg = readb(vuart->regs + ASPEED_VUART_GCRB);
124-
reg &= ~ASPEED_VUART_GCRB_HOST_SIRQ_MASK;
125-
reg |= val;
126-
writeb(reg, vuart->regs + ASPEED_VUART_GCRB);
127-
128-
return count;
146+
err = aspeed_vuart_set_sirq(vuart, val);
147+
return err ? : count;
129148
}
130149

131150
static DEVICE_ATTR_RW(sirq);

0 commit comments

Comments
 (0)