drivers/gpio/gpio-davinci.c
Source file repositories/reference/linux-study-clean/drivers/gpio/gpio-davinci.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpio/gpio-davinci.c- Extension
.c- Size
- 19248 bytes
- Lines
- 705
- Domain
- Driver Families
- Bucket
- drivers/gpio
- 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.
- 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.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- 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/cleanup.hlinux/gpio/driver.hlinux/errno.hlinux/kernel.hlinux/clk.hlinux/err.hlinux/io.hlinux/irq.hlinux/irqdomain.hlinux/module.hlinux/pinctrl/consumer.hlinux/platform_device.hlinux/property.hlinux/irqchip/chained_irq.hlinux/spinlock.hlinux/pm_runtime.h
Detected Declarations
struct davinci_gpio_regsstruct davinci_gpio_irq_datastruct davinci_gpio_controllerfunction __gpio_maskfunction __davinci_directionfunction davinci_direction_infunction davinci_direction_outfunction davinci_get_directionfunction davinci_gpio_getfunction davinci_gpio_setfunction davinci_gpio_probefunction hookupsfunction gpio_irq_unmaskfunction gpio_irq_typefunction gpio_irq_handlerfunction gpio_to_irq_bankedfunction gpio_to_irq_unbankedfunction gpio_irq_type_unbankedfunction davinci_gpio_irq_mapfunction davinci_gpio_irq_setupfunction davinci_gpio_save_contextfunction davinci_gpio_restore_contextfunction davinci_gpio_suspendfunction davinci_gpio_resumefunction davinci_gpio_drv_regfunction davinci_gpio_exit
Annotated Snippet
struct davinci_gpio_regs {
u32 dir;
u32 out_data;
u32 set_data;
u32 clr_data;
u32 in_data;
u32 set_rising;
u32 clr_rising;
u32 set_falling;
u32 clr_falling;
u32 intstat;
};
typedef struct irq_chip *(*gpio_get_irq_chip_cb_t)(unsigned int irq);
#define BINTEN 0x8 /* GPIO Interrupt Per-Bank Enable Register */
static void __iomem *gpio_base;
static unsigned int offset_array[5] = {0x10, 0x38, 0x60, 0x88, 0xb0};
struct davinci_gpio_irq_data {
void __iomem *regs;
struct davinci_gpio_controller *chip;
int bank_num;
};
struct davinci_gpio_controller {
struct gpio_chip chip;
struct irq_domain *irq_domain;
/* Serialize access to GPIO registers */
spinlock_t lock;
void __iomem *regs[MAX_REGS_BANKS];
int gpio_unbanked;
int irqs[MAX_INT_PER_BANK];
struct davinci_gpio_regs context[MAX_REGS_BANKS];
u32 binten_context;
};
static inline u32 __gpio_mask(unsigned gpio)
{
return 1 << (gpio % 32);
}
static int davinci_gpio_irq_setup(struct platform_device *pdev);
/*--------------------------------------------------------------------------*/
/* board setup code *MUST* setup pinmux and enable the GPIO clock. */
static inline int __davinci_direction(struct gpio_chip *chip,
unsigned offset, bool out, int value)
{
struct davinci_gpio_controller *d = gpiochip_get_data(chip);
struct davinci_gpio_regs __iomem *g;
unsigned long flags;
u32 temp;
int bank = offset / 32;
u32 mask = __gpio_mask(offset);
g = d->regs[bank];
spin_lock_irqsave(&d->lock, flags);
temp = readl_relaxed(&g->dir);
if (out) {
temp &= ~mask;
writel_relaxed(mask, value ? &g->set_data : &g->clr_data);
} else {
temp |= mask;
}
writel_relaxed(temp, &g->dir);
spin_unlock_irqrestore(&d->lock, flags);
return 0;
}
static int davinci_direction_in(struct gpio_chip *chip, unsigned offset)
{
return __davinci_direction(chip, offset, false, 0);
}
static int
davinci_direction_out(struct gpio_chip *chip, unsigned offset, int value)
{
return __davinci_direction(chip, offset, true, value);
}
static int davinci_get_direction(struct gpio_chip *chip, unsigned int offset)
{
struct davinci_gpio_controller *d = gpiochip_get_data(chip);
struct davinci_gpio_regs __iomem *g;
u32 mask = __gpio_mask(offset), val;
int bank = offset / 32;
Annotation
- Immediate include surface: `linux/cleanup.h`, `linux/gpio/driver.h`, `linux/errno.h`, `linux/kernel.h`, `linux/clk.h`, `linux/err.h`, `linux/io.h`, `linux/irq.h`.
- Detected declarations: `struct davinci_gpio_regs`, `struct davinci_gpio_irq_data`, `struct davinci_gpio_controller`, `function __gpio_mask`, `function __davinci_direction`, `function davinci_direction_in`, `function davinci_direction_out`, `function davinci_get_direction`, `function davinci_gpio_get`, `function davinci_gpio_set`.
- Atlas domain: Driver Families / drivers/gpio.
- Implementation status: integration 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.