drivers/pinctrl/cirrus/pinctrl-madera-core.c
Source file repositories/reference/linux-study-clean/drivers/pinctrl/cirrus/pinctrl-madera-core.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/pinctrl/cirrus/pinctrl-madera-core.c- Extension
.c- Size
- 27210 bytes
- Lines
- 1097
- Domain
- Driver Families
- Bucket
- drivers/pinctrl
- Inferred role
- Driver Families: implementation source
- Status
- source 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.
- 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/err.hlinux/module.hlinux/platform_device.hlinux/property.hlinux/regmap.hlinux/seq_file.hlinux/slab.hlinux/pinctrl/machine.hlinux/pinctrl/pinconf-generic.hlinux/pinctrl/pinconf.hlinux/pinctrl/pinctrl.hlinux/pinctrl/pinmux.hlinux/mfd/madera/core.hlinux/mfd/madera/registers.h../pinctrl-utils.hpinctrl-madera.h
Detected Declarations
function madera_pin_make_drv_strfunction madera_pin_unmake_drv_strfunction madera_get_groups_countfunction madera_get_group_pinsfunction madera_pin_dbg_show_fnfunction madera_pin_dbg_showfunction madera_mux_get_funcs_countfunction madera_mux_get_groupsfunction madera_mux_set_muxfunction madera_gpio_set_directionfunction madera_gpio_request_enablefunction madera_gpio_disable_freefunction madera_pin_conf_getfunction madera_pin_conf_setfunction madera_pin_conf_group_setfunction madera_pin_probe
Annotated Snippet
if (madera_mux_funcs[i].func == fn) {
seq_printf(s, " FN=%s",
madera_mux_funcs[i].name);
return;
}
}
return; /* ignore unknown function values */
}
/* alt function */
for (i = 0; i < chip->n_pin_groups; ++i) {
for (g_pin = 0; g_pin < chip->pin_groups[i].n_pins; ++g_pin) {
if (chip->pin_groups[i].pins[g_pin] == pin) {
seq_printf(s, " FN=%s",
chip->pin_groups[i].name);
return;
}
}
}
}
static void __maybe_unused madera_pin_dbg_show(struct pinctrl_dev *pctldev,
struct seq_file *s,
unsigned int pin)
{
struct madera_pin_private *priv = pinctrl_dev_get_drvdata(pctldev);
unsigned int conf[2];
unsigned int reg = MADERA_GPIO1_CTRL_1 + (2 * pin);
unsigned int fn;
int ret;
ret = regmap_read(priv->madera->regmap, reg, &conf[0]);
if (ret)
return;
ret = regmap_read(priv->madera->regmap, reg + 1, &conf[1]);
if (ret)
return;
seq_printf(s, "%04x:%04x", conf[0], conf[1]);
fn = (conf[0] & MADERA_GP1_FN_MASK) >> MADERA_GP1_FN_SHIFT;
madera_pin_dbg_show_fn(priv, s, pin, fn);
/* State of direction bit is only relevant if function==1 */
if (fn == 1) {
if (conf[1] & MADERA_GP1_DIR_MASK)
seq_puts(s, " IN");
else
seq_puts(s, " OUT");
}
if (conf[1] & MADERA_GP1_PU_MASK)
seq_puts(s, " PU");
if (conf[1] & MADERA_GP1_PD_MASK)
seq_puts(s, " PD");
if (conf[0] & MADERA_GP1_DB_MASK)
seq_puts(s, " DB");
if (conf[0] & MADERA_GP1_OP_CFG_MASK)
seq_puts(s, " OD");
else
seq_puts(s, " CMOS");
seq_printf(s, " DRV=%umA", madera_pin_unmake_drv_str(priv, conf[1]));
if (conf[0] & MADERA_GP1_IP_CFG_MASK)
seq_puts(s, " SCHMITT");
}
static const struct pinctrl_ops madera_pin_group_ops = {
.get_groups_count = madera_get_groups_count,
.get_group_name = madera_get_group_name,
.get_group_pins = madera_get_group_pins,
#if IS_ENABLED(CONFIG_OF)
.dt_node_to_map = pinconf_generic_dt_node_to_map_all,
.dt_free_map = pinctrl_utils_free_map,
#endif
#if IS_ENABLED(CONFIG_DEBUG_FS)
.pin_dbg_show = madera_pin_dbg_show,
#endif
};
static int madera_mux_get_funcs_count(struct pinctrl_dev *pctldev)
{
return ARRAY_SIZE(madera_mux_funcs);
}
Annotation
- Immediate include surface: `linux/err.h`, `linux/module.h`, `linux/platform_device.h`, `linux/property.h`, `linux/regmap.h`, `linux/seq_file.h`, `linux/slab.h`, `linux/pinctrl/machine.h`.
- Detected declarations: `function madera_pin_make_drv_str`, `function madera_pin_unmake_drv_str`, `function madera_get_groups_count`, `function madera_get_group_pins`, `function madera_pin_dbg_show_fn`, `function madera_pin_dbg_show`, `function madera_mux_get_funcs_count`, `function madera_mux_get_groups`, `function madera_mux_set_mux`, `function madera_gpio_set_direction`.
- Atlas domain: Driver Families / drivers/pinctrl.
- Implementation status: source implementation candidate.
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.