pinctrl: aspeed: Allow disabling Port D and Port E loopback mode
Port D and port E GPIO loopback modes are commonly enabled via hardware straps for use with front-panel buttons. When the BMC is powered off or fails to boot, the front-panel buttons are directly connected to the host chipset via the loopback to allow direct power-on and reset control. Once the BMC has booted, the loopback mode must be disabled for the BMC to take over control of host power-on and reset. Disabling these loopback modes requires writing to the hardware strap register which violates the current design of assuming the system designer chose the strap settings for a specific reason and they should be treated as read-only. Only the two bits of the strap register related to these loopback modes are allowed to be written and comments have been added to explain why. Signed-off-by: Rick Altherr <raltherr@google.com> Acked-by: Joel Stanley <joel@jms.id.au> Reviewed-by: Andrew Jeffery <andrew@aj.id.au> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
parent
3818e4a767
commit
c825676b08
|
@ -198,9 +198,19 @@ static int aspeed_sig_expr_set(const struct aspeed_sig_expr *expr,
|
|||
* them. This may mean that certain functions cannot be
|
||||
* deconfigured and is the reason we re-evaluate after writing
|
||||
* all descriptor bits.
|
||||
*
|
||||
* Port D and port E GPIO loopback modes are the only exception
|
||||
* as those are commonly used with front-panel buttons to allow
|
||||
* normal operation of the host when the BMC is powered off or
|
||||
* fails to boot. Once the BMC has booted, the loopback mode
|
||||
* must be disabled for the BMC to control host power-on and
|
||||
* reset.
|
||||
*/
|
||||
if ((desc->reg == HW_STRAP1 || desc->reg == HW_STRAP2) &&
|
||||
desc->ip == ASPEED_IP_SCU)
|
||||
if (desc->ip == ASPEED_IP_SCU && desc->reg == HW_STRAP1 &&
|
||||
!(desc->mask & (BIT(21) | BIT(22))))
|
||||
continue;
|
||||
|
||||
if (desc->ip == ASPEED_IP_SCU && desc->reg == HW_STRAP2)
|
||||
continue;
|
||||
|
||||
ret = regmap_update_bits(maps[desc->ip], desc->reg,
|
||||
|
|
Loading…
Reference in New Issue