drivers/pinctrl/starfive/pinctrl-starfive-jh7110.c
Source file repositories/reference/linux-study-clean/drivers/pinctrl/starfive/pinctrl-starfive-jh7110.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/pinctrl/starfive/pinctrl-starfive-jh7110.c- Extension
.c- Size
- 27171 bytes
- Lines
- 1006
- Domain
- Driver Families
- Bucket
- drivers/pinctrl
- Inferred role
- Driver Families: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/bits.hlinux/clk.hlinux/gpio/driver.hlinux/io.hlinux/mod_devicetable.hlinux/module.hlinux/mutex.hlinux/of.hlinux/platform_device.hlinux/reset.hlinux/seq_file.hlinux/spinlock.hlinux/pinctrl/consumer.hlinux/pinctrl/pinconf.hlinux/pinctrl/pinctrl.hlinux/pinctrl/pinmux.hdt-bindings/pinctrl/starfive,jh7110-pinctrl.h../core.h../pinctrl-utils.h../pinmux.h../pinconf.hpinctrl-starfive-jh7110.h
Detected Declarations
function Copyrightfunction jh7110_pinmux_doutfunction jh7110_pinmux_doenfunction jh7110_pinmux_functionfunction jh7110_pinmux_pinfunction jh7110_pin_dbg_showfunction jh7110_dt_node_to_mapfunction jh7110_set_gpiomuxfunction jh7110_set_muxfunction jh7110_padcfg_ds_to_mAfunction jh7110_padcfg_ds_from_mAfunction jh7110_padcfg_rmwfunction jh7110_pinconf_getfunction jh7110_pinconf_group_getfunction jh7110_pinconf_group_setfunction jh7110_pinconf_dbg_showfunction jh7110_gpio_get_directionfunction jh7110_gpio_direction_inputfunction jh7110_gpio_direction_outputfunction jh7110_gpio_getfunction jh7110_gpio_setfunction jh7110_gpio_set_configfunction jh7110_gpio_add_pin_rangesfunction jh7110_irq_ackfunction jh7110_irq_maskfunction jh7110_irq_mask_ackfunction jh7110_irq_unmaskfunction jh7110_irq_set_typefunction jh7110_disable_clockfunction jh7110_pinctrl_probefunction jh7110_pinctrl_suspendfunction jh7110_pinctrl_resumeexport jh7110_from_irq_descexport jh7110_set_gpiomuxexport jh7110_pinctrl_probeexport jh7110_pinctrl_pm_ops
Annotated Snippet
if (npins < 1) {
dev_err(dev,
"invalid pinctrl group %pOFn.%pOFn: pinmux not set\n",
np, child);
ret = -EINVAL;
goto free_map;
}
grpname = devm_kasprintf(dev, GFP_KERNEL, "%pOFn.%pOFn", np, child);
if (!grpname) {
ret = -ENOMEM;
goto free_map;
}
pgnames[ngroups++] = grpname;
pins = devm_kcalloc(dev, npins, sizeof(*pins), GFP_KERNEL);
if (!pins) {
ret = -ENOMEM;
goto free_map;
}
pinmux = devm_kcalloc(dev, npins, sizeof(*pinmux), GFP_KERNEL);
if (!pinmux) {
ret = -ENOMEM;
goto free_map;
}
ret = of_property_read_u32_array(child, "pinmux", pinmux, npins);
if (ret)
goto free_map;
for (i = 0; i < npins; i++)
pins[i] = jh7110_pinmux_pin(pinmux[i]);
map[nmaps].type = PIN_MAP_TYPE_MUX_GROUP;
map[nmaps].data.mux.function = np->name;
map[nmaps].data.mux.group = grpname;
nmaps += 1;
ret = pinctrl_generic_add_group(pctldev, grpname,
pins, npins, pinmux);
if (ret < 0) {
dev_err(dev, "error adding group %s: %d\n", grpname, ret);
goto free_map;
}
ret = pinconf_generic_parse_dt_config(child, pctldev,
&map[nmaps].data.configs.configs,
&map[nmaps].data.configs.num_configs);
if (ret) {
dev_err(dev, "error parsing pin config of group %s: %d\n",
grpname, ret);
goto free_map;
}
/* don't create a map if there are no pinconf settings */
if (map[nmaps].data.configs.num_configs == 0)
continue;
map[nmaps].type = PIN_MAP_TYPE_CONFIGS_GROUP;
map[nmaps].data.configs.group_or_pin = grpname;
nmaps += 1;
}
ret = pinmux_generic_add_function(pctldev, np->name,
pgnames, ngroups, NULL);
if (ret < 0) {
dev_err(dev, "error adding function %s: %d\n", np->name, ret);
goto free_map;
}
mutex_unlock(&sfp->mutex);
*maps = map;
*num_maps = nmaps;
return 0;
free_map:
pinctrl_utils_free_map(pctldev, map, nmaps);
mutex_unlock(&sfp->mutex);
return ret;
}
static const struct pinctrl_ops jh7110_pinctrl_ops = {
.get_groups_count = pinctrl_generic_get_group_count,
.get_group_name = pinctrl_generic_get_group_name,
.get_group_pins = pinctrl_generic_get_group_pins,
.pin_dbg_show = jh7110_pin_dbg_show,
.dt_node_to_map = jh7110_dt_node_to_map,
.dt_free_map = pinctrl_utils_free_map,
Annotation
- Immediate include surface: `linux/bits.h`, `linux/clk.h`, `linux/gpio/driver.h`, `linux/io.h`, `linux/mod_devicetable.h`, `linux/module.h`, `linux/mutex.h`, `linux/of.h`.
- Detected declarations: `function Copyright`, `function jh7110_pinmux_dout`, `function jh7110_pinmux_doen`, `function jh7110_pinmux_function`, `function jh7110_pinmux_pin`, `function jh7110_pin_dbg_show`, `function jh7110_dt_node_to_map`, `function jh7110_set_gpiomux`, `function jh7110_set_mux`, `function jh7110_padcfg_ds_to_mA`.
- Atlas domain: Driver Families / drivers/pinctrl.
- Implementation status: integration implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.