drivers/media/rc/gpio-ir-tx.c
Source file repositories/reference/linux-study-clean/drivers/media/rc/gpio-ir-tx.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/media/rc/gpio-ir-tx.c- Extension
.c- Size
- 4555 bytes
- Lines
- 206
- Domain
- Driver Families
- Bucket
- drivers/media
- 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.
- 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/kernel.hlinux/module.hlinux/gpio/consumer.hlinux/delay.hlinux/slab.hlinux/of.hlinux/platform_device.hmedia/rc-core.h
Detected Declarations
struct gpio_irfunction gpio_ir_tx_set_duty_cyclefunction gpio_ir_tx_set_carrierfunction delay_untilfunction gpio_ir_tx_unmodulatedfunction gpio_ir_tx_modulatedfunction gpio_ir_txfunction gpio_ir_tx_probe
Annotated Snippet
struct gpio_ir {
struct gpio_desc *gpio;
unsigned int carrier;
unsigned int duty_cycle;
};
static const struct of_device_id gpio_ir_tx_of_match[] = {
{ .compatible = "gpio-ir-tx", },
{ },
};
MODULE_DEVICE_TABLE(of, gpio_ir_tx_of_match);
static int gpio_ir_tx_set_duty_cycle(struct rc_dev *dev, u32 duty_cycle)
{
struct gpio_ir *gpio_ir = dev->priv;
gpio_ir->duty_cycle = duty_cycle;
return 0;
}
static int gpio_ir_tx_set_carrier(struct rc_dev *dev, u32 carrier)
{
struct gpio_ir *gpio_ir = dev->priv;
if (carrier > 500000)
return -EINVAL;
gpio_ir->carrier = carrier;
return 0;
}
static void delay_until(ktime_t until)
{
/*
* delta should never exceed 1 second (IR_MAX_DURATION) and on
* m68k ndelay(s64) does not compile; so use s32 rather than s64.
*/
s32 delta;
while (true) {
delta = ktime_us_delta(until, ktime_get());
if (delta <= 0)
return;
/* udelay more than 1ms may not work */
if (delta >= 1000) {
mdelay(delta / 1000);
continue;
}
udelay(delta);
break;
}
}
static void gpio_ir_tx_unmodulated(struct gpio_ir *gpio_ir, uint *txbuf,
uint count)
{
ktime_t edge;
int i;
edge = ktime_get();
for (i = 0; i < count; i++) {
gpiod_set_value(gpio_ir->gpio, !(i % 2));
edge = ktime_add_us(edge, txbuf[i]);
delay_until(edge);
}
gpiod_set_value(gpio_ir->gpio, 0);
}
static void gpio_ir_tx_modulated(struct gpio_ir *gpio_ir, uint *txbuf,
uint count)
{
ktime_t edge;
/*
* delta should never exceed 1 second (IR_MAX_DURATION) and on
* m68k ndelay(s64) does not compile; so use s32 rather than s64.
*/
s32 delta;
int i;
unsigned int pulse, space;
/* Ensure the dividend fits into 32 bit */
pulse = DIV_ROUND_CLOSEST(gpio_ir->duty_cycle * (NSEC_PER_SEC / 100),
gpio_ir->carrier);
Annotation
- Immediate include surface: `linux/kernel.h`, `linux/module.h`, `linux/gpio/consumer.h`, `linux/delay.h`, `linux/slab.h`, `linux/of.h`, `linux/platform_device.h`, `media/rc-core.h`.
- Detected declarations: `struct gpio_ir`, `function gpio_ir_tx_set_duty_cycle`, `function gpio_ir_tx_set_carrier`, `function delay_until`, `function gpio_ir_tx_unmodulated`, `function gpio_ir_tx_modulated`, `function gpio_ir_tx`, `function gpio_ir_tx_probe`.
- Atlas domain: Driver Families / drivers/media.
- Implementation status: source implementation candidate.
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.