drivers/pinctrl/bcm/pinctrl-iproc-gpio.c
Source file repositories/reference/linux-study-clean/drivers/pinctrl/bcm/pinctrl-iproc-gpio.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/pinctrl/bcm/pinctrl-iproc-gpio.c- Extension
.c- Size
- 24466 bytes
- Lines
- 936
- 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/interrupt.hlinux/io.hlinux/ioport.hlinux/kernel.hlinux/of.hlinux/platform_device.hlinux/seq_file.hlinux/slab.hlinux/pinctrl/consumer.hlinux/pinctrl/pinconf-generic.hlinux/pinctrl/pinconf.hlinux/pinctrl/pinctrl.h../pinctrl-utils.h
Detected Declarations
struct iproc_gpioenum iproc_pinconf_paramenum iproc_pinconf_ctrl_typefunction iproc_pin_to_gpiofunction iproc_set_bitfunction iproc_get_bitfunction iproc_gpio_irq_handlerfunction for_each_set_bitfunction iproc_gpio_irq_ackfunction iproc_gpio_irq_set_maskfunction iproc_gpio_irq_maskfunction iproc_gpio_irq_unmaskfunction iproc_gpio_irq_set_typefunction iproc_gpio_irq_print_chipfunction iproc_gpio_requestfunction iproc_gpio_freefunction iproc_gpio_direction_inputfunction iproc_gpio_direction_outputfunction iproc_gpio_get_directionfunction iproc_gpio_setfunction iproc_gpio_getfunction iproc_pinconf_param_is_disabledfunction iproc_pinconf_disable_map_createfunction iproc_get_groups_countfunction iproc_gpio_set_pullfunction iproc_gpio_get_pullfunction iproc_gpio_set_strengthfunction iproc_gpio_get_strengthfunction iproc_pin_config_getfunction iproc_pin_config_setfunction iproc_gpio_register_pinconffunction iproc_gpio_probefunction iproc_gpio_init
Annotated Snippet
struct iproc_gpio {
struct device *dev;
void __iomem *base;
void __iomem *io_ctrl;
enum iproc_pinconf_ctrl_type io_ctrl_type;
raw_spinlock_t lock;
struct gpio_chip gc;
unsigned num_banks;
bool pinmux_is_supported;
enum pin_config_param *pinconf_disable;
unsigned int nr_pinconf_disable;
struct pinctrl_dev *pctl;
struct pinctrl_desc pctldesc;
};
/*
* Mapping from PINCONF pins to GPIO pins is 1-to-1
*/
static inline unsigned iproc_pin_to_gpio(unsigned pin)
{
return pin;
}
/**
* iproc_set_bit - set or clear one bit (corresponding to the GPIO pin) in a
* Iproc GPIO register
*
* @chip: Iproc GPIO device
* @reg: register offset
* @gpio: GPIO pin
* @set: set or clear
*/
static inline void iproc_set_bit(struct iproc_gpio *chip, unsigned int reg,
unsigned gpio, bool set)
{
unsigned int offset = IPROC_GPIO_REG(gpio, reg);
unsigned int shift = IPROC_GPIO_SHIFT(gpio);
u32 val;
val = readl(chip->base + offset);
if (set)
val |= BIT(shift);
else
val &= ~BIT(shift);
writel(val, chip->base + offset);
}
static inline bool iproc_get_bit(struct iproc_gpio *chip, unsigned int reg,
unsigned gpio)
{
unsigned int offset = IPROC_GPIO_REG(gpio, reg);
unsigned int shift = IPROC_GPIO_SHIFT(gpio);
return !!(readl(chip->base + offset) & BIT(shift));
}
static void iproc_gpio_irq_handler(struct irq_desc *desc)
{
struct gpio_chip *gc = irq_desc_get_handler_data(desc);
struct iproc_gpio *chip = gpiochip_get_data(gc);
struct irq_chip *irq_chip = irq_desc_get_chip(desc);
int i, bit;
chained_irq_enter(irq_chip, desc);
/* go through the entire GPIO banks and handle all interrupts */
for (i = 0; i < chip->num_banks; i++) {
unsigned long val = readl(chip->base + (i * GPIO_BANK_SIZE) +
IPROC_GPIO_INT_MSTAT_OFFSET);
for_each_set_bit(bit, &val, NGPIOS_PER_BANK) {
unsigned pin = NGPIOS_PER_BANK * i + bit;
/*
* Clear the interrupt before invoking the
* handler, so we do not leave any window
*/
writel(BIT(bit), chip->base + (i * GPIO_BANK_SIZE) +
IPROC_GPIO_INT_CLR_OFFSET);
generic_handle_domain_irq(gc->irq.domain, pin);
}
}
Annotation
- Immediate include surface: `linux/gpio/driver.h`, `linux/interrupt.h`, `linux/io.h`, `linux/ioport.h`, `linux/kernel.h`, `linux/of.h`, `linux/platform_device.h`, `linux/seq_file.h`.
- Detected declarations: `struct iproc_gpio`, `enum iproc_pinconf_param`, `enum iproc_pinconf_ctrl_type`, `function iproc_pin_to_gpio`, `function iproc_set_bit`, `function iproc_get_bit`, `function iproc_gpio_irq_handler`, `function for_each_set_bit`, `function iproc_gpio_irq_ack`, `function iproc_gpio_irq_set_mask`.
- 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.