drivers/pinctrl/ultrarisc/pinctrl-ultrarisc.c

Source file repositories/reference/linux-study-clean/drivers/pinctrl/ultrarisc/pinctrl-ultrarisc.c

File Facts

System
Linux kernel
Corpus path
drivers/pinctrl/ultrarisc/pinctrl-ultrarisc.c
Extension
.c
Size
13285 bytes
Lines
518
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.

Dependency Surface

Detected Declarations

Annotated Snippet

if (match) {
			dev_err(pctrl->dev,
				"ambiguous route for function %s group_mask=%#llx\n",
				function, (unsigned long long)group_mask);
			return -EINVAL;
		}

		match = route;
	}

	if (match) {
		*route_out = match;
		return 0;
	}

	return -EINVAL;
}

static const char *ur_get_group_function(struct pinctrl_dev *pctldev,
					 unsigned int group_selector,
					 unsigned int pin_index)
{
	const struct group_desc *group;
	const char * const *functions;

	group = pinctrl_generic_get_group(pctldev, group_selector);
	if (!group || pin_index >= group->grp.npins || !group->data)
		return NULL;

	functions = group->data;

	return functions[pin_index];
}

static int ur_resolve_group_mux(struct pinctrl_dev *pctldev,
				struct ur_pinctrl *pctrl,
				unsigned int group_selector,
				const unsigned int *pins,
				unsigned int npins,
				const struct ur_func_route **route_out)
{
	const char *function;
	u64 group_mask = 0;

	if (!npins)
		return -EINVAL;

	function = ur_get_group_function(pctldev, group_selector, 0);
	if (!function)
		return -EINVAL;

	for (u32 i = 0; i < npins; i++)
		group_mask |= BIT_ULL(pins[i]);

	return ur_find_group_route(pctrl, function, group_mask, route_out);
}

static bool ur_function_is_gpio(struct pinctrl_dev *pctldev,
				unsigned int selector)
{
	const struct function_desc *function;

	function = pinmux_generic_get_function(pctldev, selector);
	if (!function)
		return false;

	for (u32 i = 0; i < function->func->ngroups; i++) {
		const char *func_name;
		int group_selector;

		group_selector = pinctrl_get_group_selector(pctldev,
							    function->func->groups[i]);
		if (group_selector < 0)
			return false;

		func_name = ur_get_group_function(pctldev, group_selector, 0);
		if (!func_name || strcmp(func_name, "gpio"))
			return false;
	}

	return true;
}

static const struct pinctrl_ops ur_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,
	.dt_node_to_map = pinctrl_generic_pins_function_dt_node_to_map,
	.dt_free_map = pinconf_generic_dt_free_map,
};

Annotation

Implementation Notes