drivers/pinctrl/sunxi/pinctrl-sunxi.c
Source file repositories/reference/linux-study-clean/drivers/pinctrl/sunxi/pinctrl-sunxi.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/pinctrl/sunxi/pinctrl-sunxi.c- Extension
.c- Size
- 44367 bytes
- Lines
- 1768
- 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.
- 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/clk.hlinux/export.hlinux/gpio/driver.hlinux/interrupt.hlinux/io.hlinux/irqchip/chained_irq.hlinux/irqdomain.hlinux/of.hlinux/of_clk.hlinux/platform_device.hlinux/regulator/consumer.hlinux/slab.hlinux/pinctrl/consumer.hlinux/pinctrl/machine.hlinux/pinctrl/pinconf-generic.hlinux/pinctrl/pinconf.hlinux/pinctrl/pinctrl.hlinux/pinctrl/pinmux.hdt-bindings/pinctrl/sun4i-a10.h../core.hpinctrl-sunxi.h
Detected Declarations
function sunxi_bank_offsetfunction sunxi_mux_regfunction sunxi_data_regfunction sunxi_dlevel_regfunction sunxi_pull_regfunction sunxi_pinctrl_find_group_by_namefunction sunxi_pinctrl_find_function_by_namefunction sunxi_pinctrl_desc_find_function_by_namefunction sunxi_pinctrl_desc_find_function_by_pinfunction sunxi_pinctrl_desc_find_function_by_pin_and_muxfunction sunxi_pctrl_get_groups_countfunction sunxi_pctrl_get_group_pinsfunction sunxi_pctrl_has_bias_propfunction sunxi_pctrl_has_drive_propfunction sunxi_pctrl_parse_bias_propfunction sunxi_pctrl_parse_drive_propfunction sunxi_pctrl_dt_node_to_mapfunction of_property_for_each_stringfunction sunxi_pctrl_dt_free_mapfunction sunxi_pconf_regfunction sunxi_pconf_getfunction sunxi_pconf_group_getfunction sunxi_pconf_setfunction sunxi_pconf_group_setfunction sunxi_pinctrl_set_io_bias_cfgfunction sunxi_pmx_get_funcs_cntfunction sunxi_pmx_get_func_groupsfunction sunxi_pmx_setfunction sunxi_pmx_set_muxfunction sunxi_pmx_gpio_set_directionfunction sunxi_pmx_requestfunction sunxi_pmx_freefunction sunxi_pinctrl_gpio_get_directionfunction sunxi_pinctrl_gpio_direction_inputfunction sunxi_pinctrl_gpio_getfunction sunxi_pinctrl_gpio_setfunction sunxi_pinctrl_gpio_direction_outputfunction sunxi_pinctrl_gpio_of_xlatefunction sunxi_pinctrl_gpio_to_irqfunction sunxi_pinctrl_irq_request_resourcesfunction sunxi_pinctrl_irq_release_resourcesfunction sunxi_pinctrl_irq_set_typefunction sunxi_pinctrl_irq_ackfunction sunxi_pinctrl_irq_maskfunction sunxi_pinctrl_irq_unmaskfunction sunxi_pinctrl_irq_ack_unmaskfunction sunxi_pinctrl_irq_set_wakefunction sunxi_pinctrl_irq_of_xlate
Annotated Snippet
if (!strcmp(pin->pin.name, pin_name)) {
struct sunxi_desc_function *func = pin->functions;
while (func->name) {
if (!strcmp(func->name, func_name) &&
(!func->variant ||
func->variant & variant))
return func;
func++;
}
}
}
return NULL;
}
static struct sunxi_desc_function *
sunxi_pinctrl_desc_find_function_by_pin(struct sunxi_pinctrl *pctl,
const u16 pin_num,
const char *func_name)
{
int i;
for (i = 0; i < pctl->desc->npins; i++) {
const struct sunxi_desc_pin *pin = pctl->desc->pins + i;
if (pin->pin.number == pin_num) {
struct sunxi_desc_function *func = pin->functions;
while (func->name) {
if (!strcmp(func->name, func_name))
return func;
func++;
}
}
}
return NULL;
}
static struct sunxi_desc_function *
sunxi_pinctrl_desc_find_function_by_pin_and_mux(struct sunxi_pinctrl *pctl,
const u16 pin_num,
const u8 muxval)
{
unsigned long variant = pctl->flags & SUNXI_PINCTRL_VARIANT_MASK;
for (unsigned int i = 0; i < pctl->desc->npins; i++) {
const struct sunxi_desc_pin *pin = pctl->desc->pins + i;
struct sunxi_desc_function *func = pin->functions;
if (pin->pin.number != pin_num)
continue;
if (pin->variant && !(variant & pin->variant))
continue;
while (func->name) {
if (func->muxval == muxval)
return func;
func++;
}
}
return NULL;
}
static int sunxi_pctrl_get_groups_count(struct pinctrl_dev *pctldev)
{
struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
return pctl->ngroups;
}
static const char *sunxi_pctrl_get_group_name(struct pinctrl_dev *pctldev,
unsigned group)
{
struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
return pctl->groups[group].name;
}
static int sunxi_pctrl_get_group_pins(struct pinctrl_dev *pctldev,
unsigned group,
const unsigned **pins,
unsigned *num_pins)
{
Annotation
- Immediate include surface: `linux/clk.h`, `linux/export.h`, `linux/gpio/driver.h`, `linux/interrupt.h`, `linux/io.h`, `linux/irqchip/chained_irq.h`, `linux/irqdomain.h`, `linux/of.h`.
- Detected declarations: `function sunxi_bank_offset`, `function sunxi_mux_reg`, `function sunxi_data_reg`, `function sunxi_dlevel_reg`, `function sunxi_pull_reg`, `function sunxi_pinctrl_find_group_by_name`, `function sunxi_pinctrl_find_function_by_name`, `function sunxi_pinctrl_desc_find_function_by_name`, `function sunxi_pinctrl_desc_find_function_by_pin`, `function sunxi_pinctrl_desc_find_function_by_pin_and_mux`.
- Atlas domain: Driver Families / drivers/pinctrl.
- Implementation status: source 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.