drivers/pinctrl/mediatek/pinctrl-mtmips.c

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

File Facts

System
Linux kernel
Corpus path
drivers/pinctrl/mediatek/pinctrl-mtmips.c
Extension
.c
Size
8460 bytes
Lines
352
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 mtmips_priv {
	struct device *dev;

	struct pinctrl_pin_desc *pads;
	struct pinctrl_desc *desc;

	struct mtmips_pmx_func **func;
	int func_count;

	struct mtmips_pmx_group *groups;
	const char **group_names;
	int group_count;

	u8 *gpio;
	int max_pins;
};

static int mtmips_get_group_count(struct pinctrl_dev *pctrldev)
{
	struct mtmips_priv *p = pinctrl_dev_get_drvdata(pctrldev);

	return p->group_count;
}

static const char *mtmips_get_group_name(struct pinctrl_dev *pctrldev,
					 unsigned int group)
{
	struct mtmips_priv *p = pinctrl_dev_get_drvdata(pctrldev);

	return (group >= p->group_count) ? NULL : p->group_names[group];
}

static int mtmips_get_group_pins(struct pinctrl_dev *pctrldev,
				 unsigned int group,
				 const unsigned int **pins,
				 unsigned int *num_pins)
{
	struct mtmips_priv *p = pinctrl_dev_get_drvdata(pctrldev);

	if (group >= p->group_count)
		return -EINVAL;

	*pins = p->groups[group].func[0].pins;
	*num_pins = p->groups[group].func[0].pin_count;

	return 0;
}

static const struct pinctrl_ops mtmips_pctrl_ops = {
	.get_groups_count	= mtmips_get_group_count,
	.get_group_name		= mtmips_get_group_name,
	.get_group_pins		= mtmips_get_group_pins,
	.dt_node_to_map		= pinconf_generic_dt_node_to_map_all,
	.dt_free_map		= pinconf_generic_dt_free_map,
};

static int mtmips_pmx_func_count(struct pinctrl_dev *pctrldev)
{
	struct mtmips_priv *p = pinctrl_dev_get_drvdata(pctrldev);

	return p->func_count;
}

static const char *mtmips_pmx_func_name(struct pinctrl_dev *pctrldev,
					unsigned int func)
{
	struct mtmips_priv *p = pinctrl_dev_get_drvdata(pctrldev);

	return p->func[func]->name;
}

static int mtmips_pmx_group_get_groups(struct pinctrl_dev *pctrldev,
				       unsigned int func,
				       const char * const **groups,
				       unsigned int * const num_groups)
{
	struct mtmips_priv *p = pinctrl_dev_get_drvdata(pctrldev);

	if (p->func[func]->group_count == 1)
		*groups = &p->group_names[p->func[func]->groups[0]];
	else
		*groups = p->group_names;

	*num_groups = p->func[func]->group_count;

	return 0;
}

static int mtmips_pmx_group_enable(struct pinctrl_dev *pctrldev,
				   unsigned int func, unsigned int group)

Annotation

Implementation Notes