forked from luck/tmp_suning_uos_patched
Some pin control fixes for the v5.4 series:
- Delay acquisition of regmaps in the Aspeed G5 driver. - Make a symbol static to reduce compiler noise. -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEElDRnuGcz/wPCXQWMQRCzN7AZXXMFAl1OhssACgkQQRCzN7AZ XXOZ8Q//cPbSRI8yYeEiAfCsC32UojzKzsZ42any/Qn2mw9lWjHuq8Qzkt8TVfoE +g1BEcM6aln4j4ZX3MEropULvZmBRsgYObQLqiq0LsT+C+cQUTBXOSEYneLfkXur 9JncvOeymELU0BH6JMznhiKM6fuuepznhrhbWfHrMDddyrmzyTnjXExmKGap1+jZ mrKoDd7uVnpRSWjWXFm0wkwaPhJZBfPHC4Yh8T/VbmGlZ4KOGi/uR/QrjXfrnzec Ml78qbgrSCyv90nefI1ZnmKKTSlWTPhz5jvGD6xFr3C3jUMzKz+JnLH5DMRVsyLK O869nFmcnuLF/+DR0FCdx5HXSSB8uBDEdtZsUhXX0z+X05xX2LKA7VwxWbyHB5fm xcsig7qOvLYLjIhzuOkf4N+zIo32LqbKewkS9/X5J3aJBDkERvbwLZRdajSIruK+ +uChqxD7FE8FMaWfT46aY5AWKLDxlOo1uNQGfh1xFzDMpxb3l6NdJd/4DXD++t5F mH3QpBMssgPLbwUctCkX3PRXDLnAntPZ7avrJgTnHXfhD1s3W/Ln1W6EY5oETGcJ rKO/z2ph5LEtn97iLfMdbIfweHY3dmFZwQAqJukx7zFocqtnM2c+dq14pt/YRAQ0 xepb0u8w+ZOodOO857Omp/YhFwJwRXo9b7KVucs2vqzFlD3N+mE= =4BKY -----END PGP SIGNATURE----- Merge tag 'pinctrl-v5.3-2' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl Pull pin control fixes from Linus Walleij: - Delay acquisition of regmaps in the Aspeed G5 driver. - Make a symbol static to reduce compiler noise. * tag 'pinctrl-v5.3-2' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl: pinctrl: aspeed: Make aspeed_pinmux_ips static pinctrl: aspeed-g5: Delay acquisition of regmaps
This commit is contained in:
commit
97946f59fe
|
@ -2412,7 +2412,7 @@ static const struct aspeed_pin_config aspeed_g4_configs[] = {
|
|||
{ PIN_CONFIG_INPUT_DEBOUNCE, { C14, B14 }, SCUA8, 27 },
|
||||
};
|
||||
|
||||
static int aspeed_g4_sig_expr_set(const struct aspeed_pinmux_data *ctx,
|
||||
static int aspeed_g4_sig_expr_set(struct aspeed_pinmux_data *ctx,
|
||||
const struct aspeed_sig_expr *expr,
|
||||
bool enable)
|
||||
{
|
||||
|
|
|
@ -2507,6 +2507,61 @@ static struct aspeed_pin_config aspeed_g5_configs[] = {
|
|||
{ PIN_CONFIG_INPUT_DEBOUNCE, { A20, B19 }, SCUA8, 27 },
|
||||
};
|
||||
|
||||
static struct regmap *aspeed_g5_acquire_regmap(struct aspeed_pinmux_data *ctx,
|
||||
int ip)
|
||||
{
|
||||
if (ip == ASPEED_IP_SCU) {
|
||||
WARN(!ctx->maps[ip], "Missing SCU syscon!");
|
||||
return ctx->maps[ip];
|
||||
}
|
||||
|
||||
if (ip >= ASPEED_NR_PINMUX_IPS)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
if (likely(ctx->maps[ip]))
|
||||
return ctx->maps[ip];
|
||||
|
||||
if (ip == ASPEED_IP_GFX) {
|
||||
struct device_node *node;
|
||||
struct regmap *map;
|
||||
|
||||
node = of_parse_phandle(ctx->dev->of_node,
|
||||
"aspeed,external-nodes", 0);
|
||||
if (node) {
|
||||
map = syscon_node_to_regmap(node);
|
||||
of_node_put(node);
|
||||
if (IS_ERR(map))
|
||||
return map;
|
||||
} else
|
||||
return ERR_PTR(-ENODEV);
|
||||
|
||||
ctx->maps[ASPEED_IP_GFX] = map;
|
||||
dev_dbg(ctx->dev, "Acquired GFX regmap");
|
||||
return map;
|
||||
}
|
||||
|
||||
if (ip == ASPEED_IP_LPC) {
|
||||
struct device_node *node;
|
||||
struct regmap *map;
|
||||
|
||||
node = of_parse_phandle(ctx->dev->of_node,
|
||||
"aspeed,external-nodes", 1);
|
||||
if (node) {
|
||||
map = syscon_node_to_regmap(node->parent);
|
||||
of_node_put(node);
|
||||
if (IS_ERR(map))
|
||||
return map;
|
||||
} else
|
||||
map = ERR_PTR(-ENODEV);
|
||||
|
||||
ctx->maps[ASPEED_IP_LPC] = map;
|
||||
dev_dbg(ctx->dev, "Acquired LPC regmap");
|
||||
return map;
|
||||
}
|
||||
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Configure a pin's signal by applying an expression's descriptor state for
|
||||
* all descriptors in the expression.
|
||||
|
@ -2520,7 +2575,7 @@ static struct aspeed_pin_config aspeed_g5_configs[] = {
|
|||
* Return: 0 if the expression is configured as requested and a negative error
|
||||
* code otherwise
|
||||
*/
|
||||
static int aspeed_g5_sig_expr_set(const struct aspeed_pinmux_data *ctx,
|
||||
static int aspeed_g5_sig_expr_set(struct aspeed_pinmux_data *ctx,
|
||||
const struct aspeed_sig_expr *expr,
|
||||
bool enable)
|
||||
{
|
||||
|
@ -2531,9 +2586,15 @@ static int aspeed_g5_sig_expr_set(const struct aspeed_pinmux_data *ctx,
|
|||
const struct aspeed_sig_desc *desc = &expr->descs[i];
|
||||
u32 pattern = enable ? desc->enable : desc->disable;
|
||||
u32 val = (pattern << __ffs(desc->mask));
|
||||
struct regmap *map;
|
||||
|
||||
if (!ctx->maps[desc->ip])
|
||||
return -ENODEV;
|
||||
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);
|
||||
}
|
||||
|
||||
/*
|
||||
* Strap registers are configured in hardware or by early-boot
|
||||
|
@ -2641,34 +2702,11 @@ static struct pinctrl_desc aspeed_g5_pinctrl_desc = {
|
|||
static int aspeed_g5_pinctrl_probe(struct platform_device *pdev)
|
||||
{
|
||||
int i;
|
||||
struct regmap *map;
|
||||
struct device_node *node;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(aspeed_g5_pins); i++)
|
||||
aspeed_g5_pins[i].number = i;
|
||||
|
||||
node = of_parse_phandle(pdev->dev.of_node, "aspeed,external-nodes", 0);
|
||||
map = syscon_node_to_regmap(node);
|
||||
of_node_put(node);
|
||||
if (IS_ERR(map)) {
|
||||
dev_warn(&pdev->dev, "No GFX phandle found, some mux configurations may fail\n");
|
||||
map = NULL;
|
||||
}
|
||||
aspeed_g5_pinctrl_data.pinmux.maps[ASPEED_IP_GFX] = map;
|
||||
|
||||
node = of_parse_phandle(pdev->dev.of_node, "aspeed,external-nodes", 1);
|
||||
if (node) {
|
||||
map = syscon_node_to_regmap(node->parent);
|
||||
if (IS_ERR(map)) {
|
||||
dev_warn(&pdev->dev, "LHC parent is not a syscon, some mux configurations may fail\n");
|
||||
map = NULL;
|
||||
}
|
||||
} else {
|
||||
dev_warn(&pdev->dev, "No LHC phandle found, some mux configurations may fail\n");
|
||||
map = NULL;
|
||||
}
|
||||
of_node_put(node);
|
||||
aspeed_g5_pinctrl_data.pinmux.maps[ASPEED_IP_LPC] = map;
|
||||
aspeed_g5_pinctrl_data.pinmux.dev = &pdev->dev;
|
||||
|
||||
return aspeed_pinctrl_probe(pdev, &aspeed_g5_pinctrl_desc,
|
||||
&aspeed_g5_pinctrl_data);
|
||||
|
|
|
@ -71,7 +71,7 @@ int aspeed_pinmux_get_fn_groups(struct pinctrl_dev *pctldev,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int aspeed_sig_expr_enable(const struct aspeed_pinmux_data *ctx,
|
||||
static int aspeed_sig_expr_enable(struct aspeed_pinmux_data *ctx,
|
||||
const struct aspeed_sig_expr *expr)
|
||||
{
|
||||
int ret;
|
||||
|
@ -86,7 +86,7 @@ static int aspeed_sig_expr_enable(const struct aspeed_pinmux_data *ctx,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int aspeed_sig_expr_disable(const struct aspeed_pinmux_data *ctx,
|
||||
static int aspeed_sig_expr_disable(struct aspeed_pinmux_data *ctx,
|
||||
const struct aspeed_sig_expr *expr)
|
||||
{
|
||||
int ret;
|
||||
|
@ -109,7 +109,7 @@ static int aspeed_sig_expr_disable(const struct aspeed_pinmux_data *ctx,
|
|||
*
|
||||
* Return: 0 if all expressions are disabled, otherwise a negative error code
|
||||
*/
|
||||
static int aspeed_disable_sig(const struct aspeed_pinmux_data *ctx,
|
||||
static int aspeed_disable_sig(struct aspeed_pinmux_data *ctx,
|
||||
const struct aspeed_sig_expr **exprs)
|
||||
{
|
||||
int ret = 0;
|
||||
|
@ -217,8 +217,7 @@ int aspeed_pinmux_set_mux(struct pinctrl_dev *pctldev, unsigned int function,
|
|||
{
|
||||
int i;
|
||||
int ret;
|
||||
const struct aspeed_pinctrl_data *pdata =
|
||||
pinctrl_dev_get_drvdata(pctldev);
|
||||
struct aspeed_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
|
||||
const struct aspeed_pin_group *pgroup = &pdata->pinmux.groups[group];
|
||||
const struct aspeed_pin_function *pfunc =
|
||||
&pdata->pinmux.functions[function];
|
||||
|
@ -306,8 +305,7 @@ int aspeed_gpio_request_enable(struct pinctrl_dev *pctldev,
|
|||
unsigned int offset)
|
||||
{
|
||||
int ret;
|
||||
const struct aspeed_pinctrl_data *pdata =
|
||||
pinctrl_dev_get_drvdata(pctldev);
|
||||
struct aspeed_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
|
||||
const struct aspeed_pin_desc *pdesc = pdata->pins[offset].drv_data;
|
||||
const struct aspeed_sig_expr ***prios, **funcs, *expr;
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
#include "pinmux-aspeed.h"
|
||||
|
||||
const char *const aspeed_pinmux_ips[] = {
|
||||
static const char *const aspeed_pinmux_ips[] = {
|
||||
[ASPEED_IP_SCU] = "SCU",
|
||||
[ASPEED_IP_GFX] = "GFX",
|
||||
[ASPEED_IP_LPC] = "LPC",
|
||||
|
|
|
@ -702,11 +702,12 @@ struct aspeed_pin_function {
|
|||
struct aspeed_pinmux_data;
|
||||
|
||||
struct aspeed_pinmux_ops {
|
||||
int (*set)(const struct aspeed_pinmux_data *ctx,
|
||||
int (*set)(struct aspeed_pinmux_data *ctx,
|
||||
const struct aspeed_sig_expr *expr, bool enabled);
|
||||
};
|
||||
|
||||
struct aspeed_pinmux_data {
|
||||
struct device *dev;
|
||||
struct regmap *maps[ASPEED_NR_PINMUX_IPS];
|
||||
|
||||
const struct aspeed_pinmux_ops *ops;
|
||||
|
@ -725,7 +726,7 @@ int aspeed_sig_expr_eval(const struct aspeed_pinmux_data *ctx,
|
|||
const struct aspeed_sig_expr *expr,
|
||||
bool enabled);
|
||||
|
||||
static inline int aspeed_sig_expr_set(const struct aspeed_pinmux_data *ctx,
|
||||
static inline int aspeed_sig_expr_set(struct aspeed_pinmux_data *ctx,
|
||||
const struct aspeed_sig_expr *expr,
|
||||
bool enabled)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue
Block a user