mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-18 22:14:16 +00:00
pinctrl: mcp23s08: Reset all pins to input at probe
At startup, the driver just assumes that all registers have their default values. But after a soft reset, the chip will just be in the state it was, and some pins may have been configured as outputs. Any modification of the output register will cause these pins to be driven low, which leads to unexpected/unwanted effects. To prevent this from happening, set the chip's IO configuration register to a known safe mode (all inputs) before toggling any other bits. Signed-off-by: Mike Looijmans <mike.looijmans@topic.nl> Link: https://lore.kernel.org/20250314151803.28903-1-mike.looijmans@topic.nl Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
parent
a63cafe241
commit
3ede3f8b4b
1 changed files with 8 additions and 0 deletions
|
@ -636,6 +636,14 @@ int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
|
|||
|
||||
mcp->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
|
||||
|
||||
/*
|
||||
* Reset the chip - we don't really know what state it's in, so reset
|
||||
* all pins to input first to prevent surprises.
|
||||
*/
|
||||
ret = mcp_write(mcp, MCP_IODIR, mcp->chip.ngpio == 16 ? 0xFFFF : 0xFF);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* verify MCP_IOCON.SEQOP = 0, so sequential reads work,
|
||||
* and MCP_IOCON.HAEN = 1, so we work with all chips.
|
||||
*/
|
||||
|
|
Loading…
Add table
Reference in a new issue