drivers/extcon/extcon-gpio.c
Source file repositories/reference/linux-study-clean/drivers/extcon/extcon-gpio.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/extcon/extcon-gpio.c- Extension
.c- Size
- 4503 bytes
- Lines
- 166
- Domain
- Driver Families
- Bucket
- drivers/extcon
- 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.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- 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/devm-helpers.hlinux/extcon-provider.hlinux/gpio/consumer.hlinux/init.hlinux/interrupt.hlinux/kernel.hlinux/module.hlinux/platform_device.hlinux/slab.hlinux/workqueue.h
Detected Declarations
struct gpio_extcon_datafunction gpio_extcon_workfunction gpio_irq_handlerfunction gpio_extcon_probefunction gpio_extcon_resume
Annotated Snippet
struct gpio_extcon_data {
struct extcon_dev *edev;
struct delayed_work work;
unsigned long debounce_jiffies;
struct gpio_desc *gpiod;
unsigned int extcon_id;
unsigned long debounce;
bool check_on_resume;
};
static void gpio_extcon_work(struct work_struct *work)
{
int state;
struct gpio_extcon_data *data =
container_of(to_delayed_work(work), struct gpio_extcon_data,
work);
state = gpiod_get_value_cansleep(data->gpiod);
extcon_set_state_sync(data->edev, data->extcon_id, state);
}
static irqreturn_t gpio_irq_handler(int irq, void *dev_id)
{
struct gpio_extcon_data *data = dev_id;
queue_delayed_work(system_power_efficient_wq, &data->work,
data->debounce_jiffies);
return IRQ_HANDLED;
}
static int gpio_extcon_probe(struct platform_device *pdev)
{
struct gpio_extcon_data *data;
struct device *dev = &pdev->dev;
unsigned long irq_flags;
int irq;
int ret;
data = devm_kzalloc(dev, sizeof(struct gpio_extcon_data), GFP_KERNEL);
if (!data)
return -ENOMEM;
/*
* FIXME: extcon_id represents the unique identifier of external
* connectors such as EXTCON_USB, EXTCON_DISP_HDMI and so on. extcon_id
* is necessary to register the extcon device. But, it's not yet
* developed to get the extcon id from device-tree or others.
* On later, it have to be solved.
*/
if (data->extcon_id > EXTCON_NONE)
return -EINVAL;
data->gpiod = devm_gpiod_get(dev, "extcon", GPIOD_IN);
if (IS_ERR(data->gpiod))
return PTR_ERR(data->gpiod);
irq = gpiod_to_irq(data->gpiod);
if (irq <= 0)
return irq;
/*
* It is unlikely that this is an acknowledged interrupt that goes
* away after handling, what we are looking for are falling edges
* if the signal is active low, and rising edges if the signal is
* active high.
*/
if (gpiod_is_active_low(data->gpiod))
irq_flags = IRQF_TRIGGER_FALLING;
else
irq_flags = IRQF_TRIGGER_RISING;
/* Allocate the memory of extcon devie and register extcon device */
data->edev = devm_extcon_dev_allocate(dev, &data->extcon_id);
if (IS_ERR(data->edev)) {
dev_err(dev, "failed to allocate extcon device\n");
return -ENOMEM;
}
ret = devm_extcon_dev_register(dev, data->edev);
if (ret < 0)
return ret;
ret = devm_delayed_work_autocancel(dev, &data->work, gpio_extcon_work);
if (ret)
return ret;
/*
* Request the interrupt of gpio to detect whether external connector
* is attached or detached.
*/
ret = devm_request_any_context_irq(dev, irq,
Annotation
- Immediate include surface: `linux/devm-helpers.h`, `linux/extcon-provider.h`, `linux/gpio/consumer.h`, `linux/init.h`, `linux/interrupt.h`, `linux/kernel.h`, `linux/module.h`, `linux/platform_device.h`.
- Detected declarations: `struct gpio_extcon_data`, `function gpio_extcon_work`, `function gpio_irq_handler`, `function gpio_extcon_probe`, `function gpio_extcon_resume`.
- Atlas domain: Driver Families / drivers/extcon.
- Implementation status: source implementation candidate.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
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.