drivers/usb/host/r8a66597-hcd.c
Source file repositories/reference/linux-study-clean/drivers/usb/host/r8a66597-hcd.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/usb/host/r8a66597-hcd.c- Extension
.c- Size
- 63937 bytes
- Lines
- 2521
- Domain
- Driver Families
- Bucket
- drivers/usb
- 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.
- 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/module.hlinux/kernel.hlinux/sched.hlinux/errno.hlinux/timer.hlinux/delay.hlinux/list.hlinux/interrupt.hlinux/usb.hlinux/usb/hcd.hlinux/platform_device.hlinux/io.hlinux/mm.hlinux/irq.hlinux/slab.hasm/cacheflush.hr8a66597.h
Detected Declarations
function enable_pipe_irqfunction disable_pipe_irqfunction set_devadd_regfunction r8a66597_clock_enablefunction r8a66597_clock_disablefunction r8a66597_enable_portfunction r8a66597_disable_portfunction enable_controllerfunction disable_controllerfunction get_parent_r8a66597_addressfunction is_child_devicefunction is_hub_limitfunction get_port_numberfunction get_r8a66597_usb_speedfunction set_child_connect_mapfunction put_child_connect_mapfunction set_pipe_reg_addrfunction get_urb_to_r8a66597_devfunction make_r8a66597_devicefunction alloc_usb_addressfunction free_usb_addressfunction r8a66597_reg_waitfunction pipe_startfunction pipe_stopfunction clear_all_bufferfunction r8a66597_pipe_togglefunction mbw_valuefunction cfifo_changefunction fifo_change_from_pipefunction r8a66597_get_pipenumfunction get_urb_to_r8a66597_addrfunction pipe_toggle_setfunction pipe_toggle_savefunction pipe_toggle_restorefunction pipe_buffer_settingfunction pipe_settingfunction get_empty_pipenumfunction get_r8a66597_typefunction get_bufnumfunction get_buf_bsizefunction enable_r8a66597_pipe_dmafunction enable_r8a66597_pipefunction r8a66597_urb_donefunction force_dequeuefunction list_for_each_entry_safefunction disable_r8a66597_pipe_allfunction get_intervalfunction get_timer_interval
Annotated Snippet
if (i++ > 1000) {
printk(KERN_ERR "r8a66597: reg access fail.\n");
return -ENXIO;
}
} while ((tmp & SCKE) != SCKE);
r8a66597_write(r8a66597, 0x04, 0x02);
} else {
do {
r8a66597_write(r8a66597, USBE, SYSCFG0);
tmp = r8a66597_read(r8a66597, SYSCFG0);
if (i++ > 1000) {
printk(KERN_ERR "r8a66597: reg access fail.\n");
return -ENXIO;
}
} while ((tmp & USBE) != USBE);
r8a66597_bclr(r8a66597, USBE, SYSCFG0);
r8a66597_mdfy(r8a66597, get_xtal_from_pdata(r8a66597->pdata),
XTAL, SYSCFG0);
i = 0;
r8a66597_bset(r8a66597, XCKE, SYSCFG0);
do {
msleep(1);
tmp = r8a66597_read(r8a66597, SYSCFG0);
if (i++ > 500) {
printk(KERN_ERR "r8a66597: reg access fail.\n");
return -ENXIO;
}
} while ((tmp & SCKE) != SCKE);
}
return 0;
}
static void r8a66597_clock_disable(struct r8a66597 *r8a66597)
{
r8a66597_bclr(r8a66597, SCKE, SYSCFG0);
udelay(1);
if (r8a66597->pdata->on_chip) {
clk_disable_unprepare(r8a66597->clk);
} else {
r8a66597_bclr(r8a66597, PLLC, SYSCFG0);
r8a66597_bclr(r8a66597, XCKE, SYSCFG0);
r8a66597_bclr(r8a66597, USBE, SYSCFG0);
}
}
static void r8a66597_enable_port(struct r8a66597 *r8a66597, int port)
{
u16 val;
val = port ? DRPD : DCFM | DRPD;
r8a66597_bset(r8a66597, val, get_syscfg_reg(port));
r8a66597_bset(r8a66597, HSE, get_syscfg_reg(port));
r8a66597_write(r8a66597, BURST | CPU_ADR_RD_WR, get_dmacfg_reg(port));
r8a66597_bclr(r8a66597, DTCHE, get_intenb_reg(port));
r8a66597_bset(r8a66597, ATTCHE, get_intenb_reg(port));
}
static void r8a66597_disable_port(struct r8a66597 *r8a66597, int port)
{
u16 val, tmp;
r8a66597_write(r8a66597, 0, get_intenb_reg(port));
r8a66597_write(r8a66597, 0, get_intsts_reg(port));
r8a66597_port_power(r8a66597, port, 0);
do {
tmp = r8a66597_read(r8a66597, SOFCFG) & EDGESTS;
udelay(640);
} while (tmp == EDGESTS);
val = port ? DRPD : DCFM | DRPD;
r8a66597_bclr(r8a66597, val, get_syscfg_reg(port));
r8a66597_bclr(r8a66597, HSE, get_syscfg_reg(port));
}
static int enable_controller(struct r8a66597 *r8a66597)
{
int ret, port;
u16 vif = r8a66597->pdata->vif ? LDRV : 0;
u16 irq_sense = r8a66597->irq_sense_low ? INTL : 0;
u16 endian = r8a66597->pdata->endian ? BIGEND : 0;
ret = r8a66597_clock_enable(r8a66597);
if (ret < 0)
return ret;
Annotation
- Immediate include surface: `linux/module.h`, `linux/kernel.h`, `linux/sched.h`, `linux/errno.h`, `linux/timer.h`, `linux/delay.h`, `linux/list.h`, `linux/interrupt.h`.
- Detected declarations: `function enable_pipe_irq`, `function disable_pipe_irq`, `function set_devadd_reg`, `function r8a66597_clock_enable`, `function r8a66597_clock_disable`, `function r8a66597_enable_port`, `function r8a66597_disable_port`, `function enable_controller`, `function disable_controller`, `function get_parent_r8a66597_address`.
- Atlas domain: Driver Families / drivers/usb.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
- 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.