drivers/gpio/gpio-adp5585.c
Source file repositories/reference/linux-study-clean/drivers/gpio/gpio-adp5585.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpio/gpio-adp5585.c- Extension
.c- Size
- 16061 bytes
- Lines
- 528
- Domain
- Driver Families
- Bucket
- drivers/gpio
- 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/bitmap.hlinux/bitops.hlinux/container_of.hlinux/device.hlinux/gpio/driver.hlinux/mfd/adp5585.hlinux/module.hlinux/mutex.hlinux/notifier.hlinux/platform_device.hlinux/regmap.hlinux/types.h
Detected Declarations
struct adp5585_gpio_chipstruct adp5585_gpio_devfunction adp5585_gpio_bankfunction adp5585_gpio_bitfunction adp5589_gpio_bankfunction adp5589_gpio_bitfunction adp5585_gpio_get_directionfunction adp5585_gpio_direction_inputfunction adp5585_gpio_direction_outputfunction adp5585_gpio_get_valuefunction adp5585_gpio_set_valuefunction adp5585_gpio_set_biasfunction adp5585_gpio_set_drivefunction adp5585_gpio_set_debouncefunction adp5585_gpio_set_configfunction adp5585_gpio_requestfunction adp5585_gpio_freefunction adp5585_gpio_key_eventfunction adp5585_irq_bus_lockfunction adp5585_irq_bus_sync_unlockfunction adp5585_irq_maskfunction adp5585_irq_unmaskfunction adp5585_irq_set_typefunction adp5585_gpio_unreg_notifierfunction adp5585_gpio_probe
Annotated Snippet
struct adp5585_gpio_chip {
int (*bank)(unsigned int off);
int (*bit)(unsigned int off);
unsigned int debounce_dis_a;
unsigned int rpull_cfg_a;
unsigned int gpo_data_a;
unsigned int gpo_out_a;
unsigned int gpio_dir_a;
unsigned int gpi_stat_a;
unsigned int gpi_int_lvl_a;
unsigned int gpi_ev_a;
unsigned int gpi_ev_min;
unsigned int gpi_ev_max;
bool has_bias_hole;
};
struct adp5585_gpio_dev {
struct gpio_chip gpio_chip;
struct notifier_block nb;
const struct adp5585_gpio_chip *info;
struct regmap *regmap;
unsigned long irq_mask;
unsigned long irq_en;
unsigned long irq_active_high;
/* used for irqchip bus locking */
struct mutex bus_lock;
};
static int adp5585_gpio_bank(unsigned int off)
{
return ADP5585_BANK(off);
}
static int adp5585_gpio_bit(unsigned int off)
{
return ADP5585_BIT(off);
}
static int adp5589_gpio_bank(unsigned int off)
{
return ADP5589_BANK(off);
}
static int adp5589_gpio_bit(unsigned int off)
{
return ADP5589_BIT(off);
}
static int adp5585_gpio_get_direction(struct gpio_chip *chip, unsigned int off)
{
struct adp5585_gpio_dev *adp5585_gpio = gpiochip_get_data(chip);
const struct adp5585_gpio_chip *info = adp5585_gpio->info;
unsigned int val;
regmap_read(adp5585_gpio->regmap, info->gpio_dir_a + info->bank(off), &val);
return val & info->bit(off) ? GPIO_LINE_DIRECTION_OUT : GPIO_LINE_DIRECTION_IN;
}
static int adp5585_gpio_direction_input(struct gpio_chip *chip, unsigned int off)
{
struct adp5585_gpio_dev *adp5585_gpio = gpiochip_get_data(chip);
const struct adp5585_gpio_chip *info = adp5585_gpio->info;
return regmap_clear_bits(adp5585_gpio->regmap, info->gpio_dir_a + info->bank(off),
info->bit(off));
}
static int adp5585_gpio_direction_output(struct gpio_chip *chip, unsigned int off, int val)
{
struct adp5585_gpio_dev *adp5585_gpio = gpiochip_get_data(chip);
const struct adp5585_gpio_chip *info = adp5585_gpio->info;
unsigned int bank = info->bank(off);
unsigned int bit = info->bit(off);
int ret;
ret = regmap_update_bits(adp5585_gpio->regmap, info->gpo_data_a + bank,
bit, val ? bit : 0);
if (ret)
return ret;
return regmap_set_bits(adp5585_gpio->regmap, info->gpio_dir_a + bank,
bit);
}
static int adp5585_gpio_get_value(struct gpio_chip *chip, unsigned int off)
{
struct adp5585_gpio_dev *adp5585_gpio = gpiochip_get_data(chip);
const struct adp5585_gpio_chip *info = adp5585_gpio->info;
unsigned int bank = info->bank(off);
Annotation
- Immediate include surface: `linux/bitmap.h`, `linux/bitops.h`, `linux/container_of.h`, `linux/device.h`, `linux/gpio/driver.h`, `linux/mfd/adp5585.h`, `linux/module.h`, `linux/mutex.h`.
- Detected declarations: `struct adp5585_gpio_chip`, `struct adp5585_gpio_dev`, `function adp5585_gpio_bank`, `function adp5585_gpio_bit`, `function adp5589_gpio_bank`, `function adp5589_gpio_bit`, `function adp5585_gpio_get_direction`, `function adp5585_gpio_direction_input`, `function adp5585_gpio_direction_output`, `function adp5585_gpio_get_value`.
- Atlas domain: Driver Families / drivers/gpio.
- 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.