in ptp_clockmatrix.c [279:311]
static int idtcm_enable_extts(struct idtcm_channel *channel, u8 todn, u8 ref,
bool enable)
{
struct idtcm *idtcm = channel->idtcm;
u8 old_mask = idtcm->extts_mask;
u8 mask = 1 << todn;
int err = 0;
if (todn >= MAX_TOD)
return -EINVAL;
if (enable) {
if (ref > 0xF) /* E_REF_CLK15 */
return -EINVAL;
if (idtcm->extts_mask & mask)
return 0;
err = _idtcm_set_scsr_read_trig(&idtcm->channel[todn],
SCSR_TOD_READ_TRIG_SEL_REFCLK,
ref);
if (err == 0) {
idtcm->extts_mask |= mask;
idtcm->event_channel[todn] = channel;
idtcm->channel[todn].refn = ref;
}
} else
idtcm->extts_mask &= ~mask;
if (old_mask == 0 && idtcm->extts_mask)
schedule_delayed_work(&idtcm->extts_work,
msecs_to_jiffies(EXTTS_PERIOD_MS));
return err;
}