Commit 840ce8f8 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'pinctrl-v5.3-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl

Pull pin control fix from Linus Walleij:
 "Hopefully last pin control fix: a single patch for some Aspeed
  problems. The BMCs are much happier now"

* tag 'pinctrl-v5.3-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl:
  pinctrl: aspeed: Fix spurious mux failures on the AST2500
parents 9c09f623 c1432423
...@@ -2552,7 +2552,7 @@ static struct regmap *aspeed_g5_acquire_regmap(struct aspeed_pinmux_data *ctx, ...@@ -2552,7 +2552,7 @@ static struct regmap *aspeed_g5_acquire_regmap(struct aspeed_pinmux_data *ctx,
if (IS_ERR(map)) if (IS_ERR(map))
return map; return map;
} else } else
map = ERR_PTR(-ENODEV); return ERR_PTR(-ENODEV);
ctx->maps[ASPEED_IP_LPC] = map; ctx->maps[ASPEED_IP_LPC] = map;
dev_dbg(ctx->dev, "Acquired LPC regmap"); dev_dbg(ctx->dev, "Acquired LPC regmap");
...@@ -2562,6 +2562,33 @@ static struct regmap *aspeed_g5_acquire_regmap(struct aspeed_pinmux_data *ctx, ...@@ -2562,6 +2562,33 @@ static struct regmap *aspeed_g5_acquire_regmap(struct aspeed_pinmux_data *ctx,
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
} }
static int aspeed_g5_sig_expr_eval(struct aspeed_pinmux_data *ctx,
const struct aspeed_sig_expr *expr,
bool enabled)
{
int ret;
int i;
for (i = 0; i < expr->ndescs; i++) {
const struct aspeed_sig_desc *desc = &expr->descs[i];
struct regmap *map;
map = aspeed_g5_acquire_regmap(ctx, desc->ip);
if (IS_ERR(map)) {
dev_err(ctx->dev,
"Failed to acquire regmap for IP block %d\n",
desc->ip);
return PTR_ERR(map);
}
ret = aspeed_sig_desc_eval(desc, enabled, ctx->maps[desc->ip]);
if (ret <= 0)
return ret;
}
return 1;
}
/** /**
* Configure a pin's signal by applying an expression's descriptor state for * Configure a pin's signal by applying an expression's descriptor state for
* all descriptors in the expression. * all descriptors in the expression.
...@@ -2647,6 +2674,7 @@ static int aspeed_g5_sig_expr_set(struct aspeed_pinmux_data *ctx, ...@@ -2647,6 +2674,7 @@ static int aspeed_g5_sig_expr_set(struct aspeed_pinmux_data *ctx,
} }
static const struct aspeed_pinmux_ops aspeed_g5_ops = { static const struct aspeed_pinmux_ops aspeed_g5_ops = {
.eval = aspeed_g5_sig_expr_eval,
.set = aspeed_g5_sig_expr_set, .set = aspeed_g5_sig_expr_set,
}; };
......
...@@ -78,11 +78,14 @@ int aspeed_sig_desc_eval(const struct aspeed_sig_desc *desc, ...@@ -78,11 +78,14 @@ int aspeed_sig_desc_eval(const struct aspeed_sig_desc *desc,
* neither the enabled nor disabled state. Thus we must explicitly test for * neither the enabled nor disabled state. Thus we must explicitly test for
* either condition as required. * either condition as required.
*/ */
int aspeed_sig_expr_eval(const struct aspeed_pinmux_data *ctx, int aspeed_sig_expr_eval(struct aspeed_pinmux_data *ctx,
const struct aspeed_sig_expr *expr, bool enabled) const struct aspeed_sig_expr *expr, bool enabled)
{ {
int i;
int ret; int ret;
int i;
if (ctx->ops->eval)
return ctx->ops->eval(ctx, expr, enabled);
for (i = 0; i < expr->ndescs; i++) { for (i = 0; i < expr->ndescs; i++) {
const struct aspeed_sig_desc *desc = &expr->descs[i]; const struct aspeed_sig_desc *desc = &expr->descs[i];
......
...@@ -702,6 +702,8 @@ struct aspeed_pin_function { ...@@ -702,6 +702,8 @@ struct aspeed_pin_function {
struct aspeed_pinmux_data; struct aspeed_pinmux_data;
struct aspeed_pinmux_ops { struct aspeed_pinmux_ops {
int (*eval)(struct aspeed_pinmux_data *ctx,
const struct aspeed_sig_expr *expr, bool enabled);
int (*set)(struct aspeed_pinmux_data *ctx, int (*set)(struct aspeed_pinmux_data *ctx,
const struct aspeed_sig_expr *expr, bool enabled); const struct aspeed_sig_expr *expr, bool enabled);
}; };
...@@ -722,9 +724,8 @@ struct aspeed_pinmux_data { ...@@ -722,9 +724,8 @@ struct aspeed_pinmux_data {
int aspeed_sig_desc_eval(const struct aspeed_sig_desc *desc, bool enabled, int aspeed_sig_desc_eval(const struct aspeed_sig_desc *desc, bool enabled,
struct regmap *map); struct regmap *map);
int aspeed_sig_expr_eval(const struct aspeed_pinmux_data *ctx, int aspeed_sig_expr_eval(struct aspeed_pinmux_data *ctx,
const struct aspeed_sig_expr *expr, const struct aspeed_sig_expr *expr, bool enabled);
bool enabled);
static inline int aspeed_sig_expr_set(struct aspeed_pinmux_data *ctx, static inline int aspeed_sig_expr_set(struct aspeed_pinmux_data *ctx,
const struct aspeed_sig_expr *expr, const struct aspeed_sig_expr *expr,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment