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.

Dependency Surface

Detected Declarations

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

Implementation Notes