drivers/pinctrl/intel/pinctrl-intel-platform.c

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

File Facts

System
Linux kernel
Corpus path
drivers/pinctrl/intel/pinctrl-intel-platform.c
Extension
.c
Size
5395 bytes
Lines
225
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.

Dependency Surface

Detected Declarations

Annotated Snippet

struct intel_platform_pins {
	struct pinctrl_pin_desc *pins;
	size_t npins;
};

static int intel_platform_pinctrl_prepare_pins(struct device *dev, size_t base,
					       const char *name, u32 size,
					       struct intel_platform_pins *pins)
{
	struct pinctrl_pin_desc *descs;
	char **pin_names;
	unsigned int i;

	pin_names = devm_kasprintf_strarray(dev, name, size);
	if (IS_ERR(pin_names))
		return PTR_ERR(pin_names);

	descs = devm_krealloc_array(dev, pins->pins, base + size, sizeof(*descs), GFP_KERNEL);
	if (!descs)
		return -ENOMEM;

	for (i = 0; i < size; i++) {
		unsigned int pin_number = base + i;
		char *pin_name = pin_names[i];
		struct pinctrl_pin_desc *desc;

		/* Unify delimiter for pin name */
		strreplace(pin_name, '-', '_');

		desc = &descs[pin_number];
		desc->number = pin_number;
		desc->name = pin_name;
	}

	pins->pins = descs;
	pins->npins = base + size;

	return 0;
}

static int intel_platform_pinctrl_prepare_group(struct device *dev,
						struct fwnode_handle *child,
						struct intel_padgroup *gpp,
						struct intel_platform_pins *pins)
{
	size_t base = pins->npins;
	const char *name;
	u32 size;
	int ret;

	ret = fwnode_property_read_string(child, "intc-gpio-group-name", &name);
	if (ret)
		return ret;

	ret = fwnode_property_read_u32(child, "intc-gpio-pad-count", &size);
	if (ret)
		return ret;

	ret = intel_platform_pinctrl_prepare_pins(dev, base, name, size, pins);
	if (ret)
		return ret;

	gpp->base = base;
	gpp->size = size;
	gpp->gpio_base = INTEL_GPIO_BASE_MATCH;

	return 0;
}

static int intel_platform_pinctrl_prepare_community(struct device *dev,
						    struct intel_community *community,
						    struct intel_platform_pins *pins)
{
	struct intel_padgroup *gpps;
	unsigned int group;
	size_t ngpps;
	u32 offset;
	int ret;

	ret = device_property_read_u32(dev, "intc-gpio-pad-ownership-offset", &offset);
	if (ret)
		return ret;
	community->padown_offset = offset;

	ret = device_property_read_u32(dev, "intc-gpio-pad-configuration-lock-offset", &offset);
	if (ret)
		return ret;
	community->padcfglock_offset = offset;

	ret = device_property_read_u32(dev, "intc-gpio-host-software-pad-ownership-offset", &offset);

Annotation

Implementation Notes