Commit 840ce8f8 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
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
Loading
Loading
Loading
Loading
+29 −1
Original line number Diff line number Diff line
@@ -2552,7 +2552,7 @@ static struct regmap *aspeed_g5_acquire_regmap(struct aspeed_pinmux_data *ctx,
			if (IS_ERR(map))
				return map;
		} else
			map = ERR_PTR(-ENODEV);
			return ERR_PTR(-ENODEV);

		ctx->maps[ASPEED_IP_LPC] = map;
		dev_dbg(ctx->dev, "Acquired LPC regmap");
@@ -2562,6 +2562,33 @@ static struct regmap *aspeed_g5_acquire_regmap(struct aspeed_pinmux_data *ctx,
	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
 * all descriptors in the expression.
@@ -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 = {
	.eval = aspeed_g5_sig_expr_eval,
	.set = aspeed_g5_sig_expr_set,
};

+5 −2
Original line number Diff line number Diff line
@@ -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
 * 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)
{
	int i;
	int ret;
	int i;

	if (ctx->ops->eval)
		return ctx->ops->eval(ctx, expr, enabled);

	for (i = 0; i < expr->ndescs; i++) {
		const struct aspeed_sig_desc *desc = &expr->descs[i];
+4 −3
Original line number Diff line number Diff line
@@ -702,6 +702,8 @@ struct aspeed_pin_function {
struct aspeed_pinmux_data;

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,
		   const struct aspeed_sig_expr *expr, bool enabled);
};
@@ -722,9 +724,8 @@ struct aspeed_pinmux_data {
int aspeed_sig_desc_eval(const struct aspeed_sig_desc *desc, bool enabled,
			 struct regmap *map);

int aspeed_sig_expr_eval(const struct aspeed_pinmux_data *ctx,
			 const struct aspeed_sig_expr *expr,
			 bool enabled);
int aspeed_sig_expr_eval(struct aspeed_pinmux_data *ctx,
			 const struct aspeed_sig_expr *expr, bool enabled);

static inline int aspeed_sig_expr_set(struct aspeed_pinmux_data *ctx,
				      const struct aspeed_sig_expr *expr,