mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-30 13:23:02 -04:00
pinctrl: renesas: gpio: support software nodes for function GPIOs
This patch extends the sh-pfc GPIO driver to support software-node-based configuration for the secondary 'function' GPIO chip. While the primary GPIO chip typically uses the firmware node attached to the parent platform device, the secondary chip should target a specific child node to avoid ambiguity when defining GPIO hogs or properties. Update gpio_function_setup() to look for a child node named 'functions', but only when the parent is a software node. This ensures the behavior is restricted to legacy platforms being migrated to software nodes. Assisted-by: Gemini:gemini-3.1-pro Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com> Reviewed-by: Linus Walleij <linusw@kernel.org> Signed-off-by: Linus Walleij <linusw@kernel.org>
This commit is contained in:
committed by
Linus Walleij
parent
6905cdac0e
commit
c5b962b602
@@ -271,18 +271,40 @@ static int gpio_function_request(struct gpio_chip *gc, unsigned offset)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void sh_pfc_fwnode_put(void *data)
|
||||
{
|
||||
fwnode_handle_put(data);
|
||||
}
|
||||
|
||||
static int gpio_function_setup(struct sh_pfc_chip *chip)
|
||||
{
|
||||
struct sh_pfc *pfc = chip->pfc;
|
||||
struct gpio_chip *gc = &chip->gpio_chip;
|
||||
struct fwnode_handle *fwnode = dev_fwnode(pfc->dev);
|
||||
|
||||
gc->request = gpio_function_request;
|
||||
|
||||
if (is_software_node(fwnode)) {
|
||||
fwnode = fwnode_get_named_child_node(fwnode, "functions");
|
||||
if (fwnode) {
|
||||
int ret;
|
||||
|
||||
ret = devm_add_action_or_reset(pfc->dev,
|
||||
sh_pfc_fwnode_put,
|
||||
fwnode);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
gc->fwnode = fwnode;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Explicitly mask the parent's fwnode to prevent gpiolib from
|
||||
* reusing it for function GPIOs.
|
||||
* If we did not find 'functions' node, explicitly mask the parent's
|
||||
* fwnode to prevent gpiolib from reusing it for function GPIOs.
|
||||
*/
|
||||
gc->fwnode = ERR_PTR(-ENODEV);
|
||||
if (!gc->fwnode)
|
||||
gc->fwnode = ERR_PTR(-ENODEV);
|
||||
|
||||
gc->label = pfc->info->name;
|
||||
gc->owner = THIS_MODULE;
|
||||
|
||||
Reference in New Issue
Block a user