drivers/pinctrl/pinctrl-amdisp.c
Source file repositories/reference/linux-study-clean/drivers/pinctrl/pinctrl-amdisp.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/pinctrl/pinctrl-amdisp.c- Extension
.c- Size
- 5865 bytes
- Lines
- 234
- 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.
- 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.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/gpio/driver.hlinux/module.hlinux/platform_device.hpinctrl-amdisp.h
Detected Declarations
struct amdisp_pinctrl_datastruct amdisp_pinctrlfunction amdisp_get_groups_countfunction amdisp_get_group_pinsfunction amdisp_gpio_get_directionfunction amdisp_gpio_direction_inputfunction amdisp_gpio_direction_outputfunction amdisp_gpio_getfunction amdisp_gpio_setfunction amdisp_gpiochip_addfunction amdisp_pinctrl_probe
Annotated Snippet
struct amdisp_pinctrl_data {
const struct pinctrl_pin_desc *pins;
unsigned int npins;
const struct amdisp_function *functions;
unsigned int nfunctions;
const struct amdisp_pingroup *groups;
unsigned int ngroups;
};
static const struct amdisp_pinctrl_data amdisp_pinctrl_data = {
.pins = amdisp_pins,
.npins = ARRAY_SIZE(amdisp_pins),
.functions = amdisp_functions,
.nfunctions = ARRAY_SIZE(amdisp_functions),
.groups = amdisp_groups,
.ngroups = ARRAY_SIZE(amdisp_groups),
};
struct amdisp_pinctrl {
struct device *dev;
struct pinctrl_dev *pctrl;
struct pinctrl_desc desc;
struct pinctrl_gpio_range gpio_range;
struct gpio_chip gc;
const struct amdisp_pinctrl_data *data;
void __iomem *gpiobase;
raw_spinlock_t lock;
};
static int amdisp_get_groups_count(struct pinctrl_dev *pctldev)
{
struct amdisp_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
return pctrl->data->ngroups;
}
static const char *amdisp_get_group_name(struct pinctrl_dev *pctldev,
unsigned int group)
{
struct amdisp_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
return pctrl->data->groups[group].name;
}
static int amdisp_get_group_pins(struct pinctrl_dev *pctldev,
unsigned int group,
const unsigned int **pins,
unsigned int *num_pins)
{
struct amdisp_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
*pins = pctrl->data->groups[group].pins;
*num_pins = pctrl->data->groups[group].npins;
return 0;
}
static const struct pinctrl_ops amdisp_pinctrl_ops = {
.get_groups_count = amdisp_get_groups_count,
.get_group_name = amdisp_get_group_name,
.get_group_pins = amdisp_get_group_pins,
};
static int amdisp_gpio_get_direction(struct gpio_chip *gc, unsigned int gpio)
{
/* amdisp gpio only has output mode */
return GPIO_LINE_DIRECTION_OUT;
}
static int amdisp_gpio_direction_input(struct gpio_chip *gc, unsigned int gpio)
{
return -EOPNOTSUPP;
}
static int amdisp_gpio_direction_output(struct gpio_chip *gc, unsigned int gpio,
int value)
{
/* Nothing to do, amdisp gpio only has output mode */
return 0;
}
static int amdisp_gpio_get(struct gpio_chip *gc, unsigned int gpio)
{
unsigned long flags;
u32 pin_reg;
struct amdisp_pinctrl *pctrl = gpiochip_get_data(gc);
raw_spin_lock_irqsave(&pctrl->lock, flags);
pin_reg = readl(pctrl->gpiobase + gpio_offset[gpio]);
raw_spin_unlock_irqrestore(&pctrl->lock, flags);
Annotation
- Immediate include surface: `linux/gpio/driver.h`, `linux/module.h`, `linux/platform_device.h`, `pinctrl-amdisp.h`.
- Detected declarations: `struct amdisp_pinctrl_data`, `struct amdisp_pinctrl`, `function amdisp_get_groups_count`, `function amdisp_get_group_pins`, `function amdisp_gpio_get_direction`, `function amdisp_gpio_direction_input`, `function amdisp_gpio_direction_output`, `function amdisp_gpio_get`, `function amdisp_gpio_set`, `function amdisp_gpiochip_add`.
- Atlas domain: Driver Families / drivers/pinctrl.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.