drivers/ptp/ptp_clockmatrix.c
Source file repositories/reference/linux-study-clean/drivers/ptp/ptp_clockmatrix.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/ptp/ptp_clockmatrix.c- Extension
.c- Size
- 56098 bytes
- Lines
- 2468
- Domain
- Driver Families
- Bucket
- drivers/ptp
- 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/firmware.hlinux/platform_device.hlinux/module.hlinux/ptp_clock_kernel.hlinux/delay.hlinux/jiffies.hlinux/kernel.hlinux/timekeeping.hlinux/string.hlinux/of.hlinux/mfd/rsmu.hlinux/mfd/idt8a340_reg.hlinux/unaligned.hptp_private.hptp_clockmatrix.h
Detected Declarations
function idtcm_readfunction idtcm_writefunction contains_full_configurationfunction char_array_to_timespecfunction timespec_to_char_arrayfunction idtcm_strverscmpfunction idtcm_fw_versionfunction clear_boot_statusfunction read_boot_statusfunction wait_for_boot_status_readyfunction arm_tod_read_trig_sel_refclkfunction is_single_shotfunction idtcm_extts_enablefunction read_sys_apll_statusfunction read_sys_dpll_statusfunction wait_for_sys_apll_dpll_lockfunction wait_for_chip_readyfunction _idtcm_gettime_triggeredfunction _idtcm_gettimefunction idtcm_extts_check_channelfunction _idtcm_gettime_immediatefunction _sync_pll_outputfunction idtcm_sync_pps_outputfunction _idtcm_set_dpll_hw_todfunction _idtcm_set_dpll_scsr_todfunction get_output_base_addrfunction _idtcm_settime_deprecatedfunction _idtcm_settimefunction idtcm_set_phase_pull_in_offsetfunction idtcm_set_phase_pull_in_slope_limitfunction idtcm_start_phase_pull_infunction do_phase_pull_in_fwfunction set_tod_write_overheadfunction _idtcm_adjtime_deprecatedfunction idtcm_state_machine_resetfunction idtcm_read_hw_rev_idfunction idtcm_read_product_idfunction idtcm_read_major_releasefunction idtcm_read_minor_releasefunction idtcm_read_hotfix_releasefunction idtcm_read_otp_scsr_config_selectfunction set_pll_output_maskfunction set_tod_ptp_pllfunction check_and_set_masksfunction display_pll_and_masksfunction idtcm_load_firmwarefunction idtcm_output_enablefunction idtcm_perout_enable
Annotated Snippet
if (ref < 0) {
dev_err(idtcm->dev, "%s: No valid pin found for TOD%d!\n",
__func__, channel->tod);
return -EBUSY;
}
err = arm_tod_read_trig_sel_refclk(&idtcm->channel[index], ref);
if (err == 0) {
idtcm->extts_mask |= mask;
idtcm->event_channel[index] = channel;
idtcm->channel[index].refn = ref;
idtcm->extts_single_shot = is_single_shot(idtcm->extts_mask);
if (old_mask)
return 0;
schedule_delayed_work(&idtcm->extts_work,
msecs_to_jiffies(EXTTS_PERIOD_MS));
}
} else {
idtcm->extts_mask &= ~mask;
idtcm->extts_single_shot = is_single_shot(idtcm->extts_mask);
if (idtcm->extts_mask == 0)
cancel_delayed_work(&idtcm->extts_work);
}
return err;
}
static int read_sys_apll_status(struct idtcm *idtcm, u8 *status)
{
return idtcm_read(idtcm, STATUS, DPLL_SYS_APLL_STATUS, status,
sizeof(u8));
}
static int read_sys_dpll_status(struct idtcm *idtcm, u8 *status)
{
return idtcm_read(idtcm, STATUS, DPLL_SYS_STATUS, status, sizeof(u8));
}
static int wait_for_sys_apll_dpll_lock(struct idtcm *idtcm)
{
unsigned long timeout = jiffies + msecs_to_jiffies(LOCK_TIMEOUT_MS);
u8 apll = 0;
u8 dpll = 0;
int err;
do {
err = read_sys_apll_status(idtcm, &apll);
if (err)
return err;
err = read_sys_dpll_status(idtcm, &dpll);
if (err)
return err;
apll &= SYS_APLL_LOSS_LOCK_LIVE_MASK;
dpll &= DPLL_SYS_STATE_MASK;
if (apll == SYS_APLL_LOSS_LOCK_LIVE_LOCKED &&
dpll == DPLL_STATE_LOCKED) {
return 0;
} else if (dpll == DPLL_STATE_FREERUN ||
dpll == DPLL_STATE_HOLDOVER ||
dpll == DPLL_STATE_OPEN_LOOP) {
dev_warn(idtcm->dev,
"No wait state: DPLL_SYS_STATE %d", dpll);
return -EPERM;
}
msleep(LOCK_POLL_INTERVAL_MS);
} while (time_is_after_jiffies(timeout));
dev_warn(idtcm->dev,
"%d ms lock timeout: SYS APLL Loss Lock %d SYS DPLL state %d",
LOCK_TIMEOUT_MS, apll, dpll);
return -ETIME;
}
static void wait_for_chip_ready(struct idtcm *idtcm)
{
if (wait_for_boot_status_ready(idtcm))
dev_warn(idtcm->dev, "BOOT_STATUS != 0xA0");
if (wait_for_sys_apll_dpll_lock(idtcm))
dev_warn(idtcm->dev,
"Continuing while SYS APLL/DPLL is not locked");
Annotation
- Immediate include surface: `linux/firmware.h`, `linux/platform_device.h`, `linux/module.h`, `linux/ptp_clock_kernel.h`, `linux/delay.h`, `linux/jiffies.h`, `linux/kernel.h`, `linux/timekeeping.h`.
- Detected declarations: `function idtcm_read`, `function idtcm_write`, `function contains_full_configuration`, `function char_array_to_timespec`, `function timespec_to_char_array`, `function idtcm_strverscmp`, `function idtcm_fw_version`, `function clear_boot_status`, `function read_boot_status`, `function wait_for_boot_status_ready`.
- Atlas domain: Driver Families / drivers/ptp.
- 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.