drivers/pinctrl/qcom/pinctrl-lpass-lpi.c

Source file repositories/reference/linux-study-clean/drivers/pinctrl/qcom/pinctrl-lpass-lpi.c

File Facts

System
Linux kernel
Corpus path
drivers/pinctrl/qcom/pinctrl-lpass-lpi.c
Extension
.c
Size
15144 bytes
Lines
604
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

struct lpi_pinctrl {
	struct device *dev;
	struct pinctrl_dev *ctrl;
	struct gpio_chip chip;
	struct pinctrl_desc desc;
	char __iomem *tlmm_base;
	char __iomem *slew_base;
	/* Protects from concurrent register updates */
	struct mutex lock;
	DECLARE_BITMAP(ever_gpio, MAX_NR_GPIO);
	const struct lpi_pinctrl_variant_data *data;
};

static void __iomem *lpi_gpio_reg(struct lpi_pinctrl *state,
				  unsigned int pin, unsigned int addr)
{
	u32 pin_offset;

	if (state->data->flags & LPI_FLAG_USE_PREDEFINED_PIN_OFFSET)
		pin_offset = state->data->groups[pin].pin_offset;
	else
		pin_offset = LPI_TLMM_REG_OFFSET * pin;

	return state->tlmm_base + pin_offset + addr;
}

static void lpi_gpio_read_reg(struct lpi_pinctrl *state,
			      unsigned int pin, unsigned int addr, u32 *val)
{
	*val = ioread32(lpi_gpio_reg(state, pin, addr));
}

static void lpi_gpio_write_reg(struct lpi_pinctrl *state,
			       unsigned int pin, unsigned int addr,
			       unsigned int val)
{
	iowrite32(val, lpi_gpio_reg(state, pin, addr));
}

static int lpi_gpio_read(struct lpi_pinctrl *state, unsigned int pin,
			 unsigned int addr, u32 *val)
{
	int ret;

	ret = pm_runtime_resume_and_get(state->dev);
	if (ret < 0)
		return ret;

	lpi_gpio_read_reg(state, pin, addr, val);

	return pm_runtime_put_autosuspend(state->dev);
}

static const struct pinctrl_ops lpi_gpio_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		= pinconf_generic_dt_node_to_map_group,
	.dt_free_map		= pinctrl_utils_free_map,
};

static int lpi_gpio_get_functions_count(struct pinctrl_dev *pctldev)
{
	struct lpi_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);

	return pctrl->data->nfunctions;
}

static const char *lpi_gpio_get_function_name(struct pinctrl_dev *pctldev,
					      unsigned int function)
{
	struct lpi_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);

	return pctrl->data->functions[function].name;
}

static int lpi_gpio_get_function_groups(struct pinctrl_dev *pctldev,
					unsigned int function,
					const char *const **groups,
					unsigned *const num_qgroups)
{
	struct lpi_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);

	*groups = pctrl->data->functions[function].groups;
	*num_qgroups = pctrl->data->functions[function].ngroups;

	return 0;
}

static int lpi_gpio_set_mux(struct pinctrl_dev *pctldev, unsigned int function,

Annotation

Implementation Notes