Lines Matching refs:channel

99 static int idt82p33_dpll_set_mode(struct idt82p33_channel *channel,  in idt82p33_dpll_set_mode()  argument
102 struct idt82p33 *idt82p33 = channel->idt82p33; in idt82p33_dpll_set_mode()
106 if (channel->pll_mode == mode) in idt82p33_dpll_set_mode()
109 err = idt82p33_read(idt82p33, channel->dpll_mode_cnfg, in idt82p33_dpll_set_mode()
118 err = idt82p33_write(idt82p33, channel->dpll_mode_cnfg, in idt82p33_dpll_set_mode()
123 channel->pll_mode = mode; in idt82p33_dpll_set_mode()
128 static int idt82p33_set_tod_trigger(struct idt82p33_channel *channel, in idt82p33_set_tod_trigger() argument
131 struct idt82p33 *idt82p33 = channel->idt82p33; in idt82p33_set_tod_trigger()
138 err = idt82p33_read(idt82p33, channel->dpll_tod_trigger, in idt82p33_set_tod_trigger()
151 return idt82p33_write(idt82p33, channel->dpll_tod_trigger, in idt82p33_set_tod_trigger()
155 static int idt82p33_get_extts(struct idt82p33_channel *channel, in idt82p33_get_extts() argument
158 struct idt82p33 *idt82p33 = channel->idt82p33; in idt82p33_get_extts()
162 err = idt82p33_read(idt82p33, channel->dpll_tod_sts, buf, sizeof(buf)); in idt82p33_get_extts()
168 if (memcmp(buf, channel->extts_tod_sts, TOD_BYTE_COUNT) == 0) in idt82p33_get_extts()
171 memcpy(channel->extts_tod_sts, buf, TOD_BYTE_COUNT); in idt82p33_get_extts()
175 if (channel->discard_next_extts) { in idt82p33_get_extts()
176 channel->discard_next_extts = false; in idt82p33_get_extts()
213 static int arm_tod_read_with_trigger(struct idt82p33_channel *channel, u8 trigger) in arm_tod_read_with_trigger() argument
215 struct idt82p33 *idt82p33 = channel->idt82p33; in arm_tod_read_with_trigger()
220 err = idt82p33_read(idt82p33, channel->dpll_tod_sts, buf, sizeof(buf)); in arm_tod_read_with_trigger()
225 memcpy(channel->extts_tod_sts, buf, TOD_BYTE_COUNT); in arm_tod_read_with_trigger()
227 err = idt82p33_set_tod_trigger(channel, trigger, false); in arm_tod_read_with_trigger()
235 static int idt82p33_extts_enable(struct idt82p33_channel *channel, in idt82p33_extts_enable() argument
246 idt82p33 = channel->idt82p33; in idt82p33_extts_enable()
270 ref = ptp_find_pin(channel->ptp_clock, PTP_PF_EXTTS, channel->plln); in idt82p33_extts_enable()
274 __func__, channel->plln); in idt82p33_extts_enable()
286 err = arm_tod_read_with_trigger(&idt82p33->channel[index], trigger); in idt82p33_extts_enable()
290 idt82p33->channel[index].tod_trigger = trigger; in idt82p33_extts_enable()
291 idt82p33->event_channel[index] = channel; in idt82p33_extts_enable()
318 err = idt82p33_get_extts(&idt82p33->channel[todn], &ts); in idt82p33_extts_check_channel()
330 static u8 idt82p33_extts_enable_mask(struct idt82p33_channel *channel, in idt82p33_extts_enable_mask() argument
333 struct idt82p33 *idt82p33 = channel->idt82p33; in idt82p33_extts_enable_mask()
334 u8 trigger = channel->tod_trigger; in idt82p33_extts_enable_mask()
352 err = arm_tod_read_with_trigger(&idt82p33->channel[i], trigger); in idt82p33_extts_enable_mask()
372 static int _idt82p33_gettime(struct idt82p33_channel *channel, in _idt82p33_gettime() argument
375 struct idt82p33 *idt82p33 = channel->idt82p33; in _idt82p33_gettime()
383 new_mask = idt82p33_extts_enable_mask(channel, old_mask, false); in _idt82p33_gettime()
385 err = idt82p33_set_tod_trigger(channel, HW_TOD_RD_TRIG_SEL_LSB_TOD_STS, in _idt82p33_gettime()
390 channel->discard_next_extts = true; in _idt82p33_gettime()
395 err = idt82p33_read(idt82p33, channel->dpll_tod_sts, buf, sizeof(buf)); in _idt82p33_gettime()
402 idt82p33_extts_enable_mask(channel, new_mask, true); in _idt82p33_gettime()
415 static int _idt82p33_settime(struct idt82p33_channel *channel, in _idt82p33_settime() argument
418 struct idt82p33 *idt82p33 = channel->idt82p33; in _idt82p33_settime()
425 err = idt82p33_set_tod_trigger(channel, HW_TOD_WR_TRIG_SEL_MSB_TOD_CNFG, in _idt82p33_settime()
430 channel->discard_next_extts = true; in _idt82p33_settime()
447 err = idt82p33_write(idt82p33, channel->dpll_tod_cnfg + i, in _idt82p33_settime()
456 static int _idt82p33_adjtime_immediate(struct idt82p33_channel *channel, in _idt82p33_adjtime_immediate() argument
459 struct idt82p33 *idt82p33 = channel->idt82p33; in _idt82p33_adjtime_immediate()
466 err = _idt82p33_gettime(channel, &ts); in _idt82p33_adjtime_immediate()
476 err = _idt82p33_settime(channel, &ts); in _idt82p33_adjtime_immediate()
481 static int _idt82p33_adjtime_internal_triggered(struct idt82p33_channel *channel, in _idt82p33_adjtime_internal_triggered() argument
484 struct idt82p33 *idt82p33 = channel->idt82p33; in _idt82p33_adjtime_internal_triggered()
492 err = _idt82p33_gettime(channel, &ts); in _idt82p33_adjtime_internal_triggered()
510 err = idt82p33_write(idt82p33, channel->dpll_tod_cnfg, buf, sizeof(buf)); in _idt82p33_adjtime_internal_triggered()
517 schedule_delayed_work(&channel->adjtime_work, HZ); in _idt82p33_adjtime_internal_triggered()
519 return idt82p33_set_tod_trigger(channel, HW_TOD_TRIG_SEL_TOD_PPS, true); in _idt82p33_adjtime_internal_triggered()
524 struct idt82p33_channel *channel = container_of(work, in idt82p33_adjtime_workaround() local
527 struct idt82p33 *idt82p33 = channel->idt82p33; in idt82p33_adjtime_workaround()
531 _idt82p33_adjtime_internal_triggered(channel, 0); in idt82p33_adjtime_workaround()
535 static int _idt82p33_adjfine(struct idt82p33_channel *channel, long scaled_ppm) in _idt82p33_adjfine() argument
537 struct idt82p33 *idt82p33 = channel->idt82p33; in _idt82p33_adjfine()
564 err = idt82p33_dpll_set_mode(channel, PLL_MODE_DCO); in _idt82p33_adjfine()
569 err = idt82p33_write(idt82p33, channel->dpll_freq_cnfg, in _idt82p33_adjfine()
591 static int idt82p33_stop_ddco(struct idt82p33_channel *channel) in idt82p33_stop_ddco() argument
595 err = _idt82p33_adjfine(channel, channel->current_freq); in idt82p33_stop_ddco()
599 channel->ddco = false; in idt82p33_stop_ddco()
604 static int idt82p33_start_ddco(struct idt82p33_channel *channel, s32 delta_ns) in idt82p33_start_ddco() argument
606 s32 current_ppm = channel->current_freq; in idt82p33_start_ddco()
625 err = _idt82p33_adjfine(channel, in idt82p33_start_ddco()
631 ptp_schedule_worker(channel->ptp_clock, in idt82p33_start_ddco()
633 channel->ddco = true; in idt82p33_start_ddco()
639 struct idt82p33_channel *channel, s64 *overhead_ns) in idt82p33_measure_one_byte_write_overhead() argument
641 struct idt82p33 *idt82p33 = channel->idt82p33; in idt82p33_measure_one_byte_write_overhead()
655 err = idt82p33_write(idt82p33, channel->dpll_tod_trigger, in idt82p33_measure_one_byte_write_overhead()
672 struct idt82p33_channel *channel, s64 *overhead_ns) in idt82p33_measure_one_byte_read_overhead() argument
674 struct idt82p33 *idt82p33 = channel->idt82p33; in idt82p33_measure_one_byte_read_overhead()
688 err = idt82p33_read(idt82p33, channel->dpll_tod_trigger, in idt82p33_measure_one_byte_read_overhead()
705 struct idt82p33_channel *channel) in idt82p33_measure_tod_write_9_byte_overhead() argument
707 struct idt82p33 *idt82p33 = channel->idt82p33; in idt82p33_measure_tod_write_9_byte_overhead()
724 channel->dpll_tod_cnfg + i, in idt82p33_measure_tod_write_9_byte_overhead()
742 struct idt82p33_channel *channel, s64 *overhead_ns) in idt82p33_measure_settime_gettime_gap_overhead() argument
750 err = _idt82p33_settime(channel, &ts1); in idt82p33_measure_settime_gettime_gap_overhead()
755 err = _idt82p33_gettime(channel, &ts2); in idt82p33_measure_settime_gettime_gap_overhead()
763 static int idt82p33_measure_tod_write_overhead(struct idt82p33_channel *channel) in idt82p33_measure_tod_write_overhead() argument
766 struct idt82p33 *idt82p33 = channel->idt82p33; in idt82p33_measure_tod_write_overhead()
771 err = idt82p33_measure_settime_gettime_gap_overhead(channel, &gap_ns); in idt82p33_measure_tod_write_overhead()
779 err = idt82p33_measure_one_byte_write_overhead(channel, in idt82p33_measure_tod_write_overhead()
785 err = idt82p33_measure_one_byte_read_overhead(channel, in idt82p33_measure_tod_write_overhead()
791 err = idt82p33_measure_tod_write_9_byte_overhead(channel); in idt82p33_measure_tod_write_overhead()
821 idt82p33->channel[0].output_mask = val; in idt82p33_check_and_set_masks()
824 idt82p33->channel[1].output_mask = val; in idt82p33_check_and_set_masks()
843 i, idt82p33->channel[i].output_mask); in idt82p33_display_masks()
847 static int idt82p33_sync_tod(struct idt82p33_channel *channel, bool enable) in idt82p33_sync_tod() argument
849 struct idt82p33 *idt82p33 = channel->idt82p33; in idt82p33_sync_tod()
853 err = idt82p33_read(idt82p33, channel->dpll_sync_cnfg, in idt82p33_sync_tod()
862 return idt82p33_write(idt82p33, channel->dpll_sync_cnfg, in idt82p33_sync_tod()
868 struct idt82p33_channel *channel = in idt82p33_work_handler() local
870 struct idt82p33 *idt82p33 = channel->idt82p33; in idt82p33_work_handler()
873 (void)idt82p33_stop_ddco(channel); in idt82p33_work_handler()
880 static int idt82p33_output_enable(struct idt82p33_channel *channel, in idt82p33_output_enable() argument
883 struct idt82p33 *idt82p33 = channel->idt82p33; in idt82p33_output_enable()
898 static int idt82p33_perout_enable(struct idt82p33_channel *channel, in idt82p33_perout_enable() argument
903 return idt82p33_output_enable(channel, enable, perout->index); in idt82p33_perout_enable()
906 static int idt82p33_enable_tod(struct idt82p33_channel *channel) in idt82p33_enable_tod() argument
908 struct idt82p33 *idt82p33 = channel->idt82p33; in idt82p33_enable_tod()
912 err = idt82p33_measure_tod_write_overhead(channel); in idt82p33_enable_tod()
920 err = _idt82p33_settime(channel, &ts); in idt82p33_enable_tod()
925 return idt82p33_sync_tod(channel, true); in idt82p33_enable_tod()
930 struct idt82p33_channel *channel; in idt82p33_ptp_clock_unregister_all() local
934 channel = &idt82p33->channel[i]; in idt82p33_ptp_clock_unregister_all()
935 cancel_delayed_work_sync(&channel->adjtime_work); in idt82p33_ptp_clock_unregister_all()
936 if (channel->ptp_clock) in idt82p33_ptp_clock_unregister_all()
937 ptp_clock_unregister(channel->ptp_clock); in idt82p33_ptp_clock_unregister_all()
946 struct idt82p33_channel *channel = in idt82p33_enable() local
948 struct idt82p33 *idt82p33 = channel->idt82p33; in idt82p33_enable()
956 err = idt82p33_perout_enable(channel, false, in idt82p33_enable()
963 err = idt82p33_perout_enable(channel, true, in idt82p33_enable()
967 err = idt82p33_extts_enable(channel, rq, on); in idt82p33_enable()
988 struct idt82p33_channel *channel = in idt82p33_adjwritephase() local
990 struct idt82p33 *idt82p33 = channel->idt82p33; in idt82p33_adjwritephase()
1007 err = idt82p33_dpll_set_mode(channel, PLL_MODE_WPH); in idt82p33_adjwritephase()
1014 err = idt82p33_write(idt82p33, channel->dpll_phase_cnfg, val, in idt82p33_adjwritephase()
1024 struct idt82p33_channel *channel = in idt82p33_adjfine() local
1026 struct idt82p33 *idt82p33 = channel->idt82p33; in idt82p33_adjfine()
1029 if (channel->ddco == true) in idt82p33_adjfine()
1032 if (scaled_ppm == channel->current_freq) in idt82p33_adjfine()
1036 err = _idt82p33_adjfine(channel, scaled_ppm); in idt82p33_adjfine()
1039 channel->current_freq = scaled_ppm; in idt82p33_adjfine()
1050 struct idt82p33_channel *channel = in idt82p33_adjtime() local
1052 struct idt82p33 *idt82p33 = channel->idt82p33; in idt82p33_adjtime()
1055 if (channel->ddco == true) in idt82p33_adjtime()
1061 err = idt82p33_start_ddco(channel, delta_ns); in idt82p33_adjtime()
1067 err = _idt82p33_adjtime_internal_triggered(channel, delta_ns); in idt82p33_adjtime()
1069 err = _idt82p33_adjtime_immediate(channel, delta_ns); in idt82p33_adjtime()
1081 struct idt82p33_channel *channel = in idt82p33_gettime() local
1083 struct idt82p33 *idt82p33 = channel->idt82p33; in idt82p33_gettime()
1087 err = _idt82p33_gettime(channel, ts); in idt82p33_gettime()
1099 struct idt82p33_channel *channel = in idt82p33_settime() local
1101 struct idt82p33 *idt82p33 = channel->idt82p33; in idt82p33_settime()
1105 err = _idt82p33_settime(channel, ts); in idt82p33_settime()
1116 struct idt82p33_channel *channel = &idt82p33->channel[index]; in idt82p33_channel_init() local
1120 channel->dpll_tod_cnfg = DPLL1_TOD_CNFG; in idt82p33_channel_init()
1121 channel->dpll_tod_trigger = DPLL1_TOD_TRIGGER; in idt82p33_channel_init()
1122 channel->dpll_tod_sts = DPLL1_TOD_STS; in idt82p33_channel_init()
1123 channel->dpll_mode_cnfg = DPLL1_OPERATING_MODE_CNFG; in idt82p33_channel_init()
1124 channel->dpll_freq_cnfg = DPLL1_HOLDOVER_FREQ_CNFG; in idt82p33_channel_init()
1125 channel->dpll_phase_cnfg = DPLL1_PHASE_OFFSET_CNFG; in idt82p33_channel_init()
1126 channel->dpll_sync_cnfg = DPLL1_SYNC_EDGE_CNFG; in idt82p33_channel_init()
1127 channel->dpll_input_mode_cnfg = DPLL1_INPUT_MODE_CNFG; in idt82p33_channel_init()
1130 channel->dpll_tod_cnfg = DPLL2_TOD_CNFG; in idt82p33_channel_init()
1131 channel->dpll_tod_trigger = DPLL2_TOD_TRIGGER; in idt82p33_channel_init()
1132 channel->dpll_tod_sts = DPLL2_TOD_STS; in idt82p33_channel_init()
1133 channel->dpll_mode_cnfg = DPLL2_OPERATING_MODE_CNFG; in idt82p33_channel_init()
1134 channel->dpll_freq_cnfg = DPLL2_HOLDOVER_FREQ_CNFG; in idt82p33_channel_init()
1135 channel->dpll_phase_cnfg = DPLL2_PHASE_OFFSET_CNFG; in idt82p33_channel_init()
1136 channel->dpll_sync_cnfg = DPLL2_SYNC_EDGE_CNFG; in idt82p33_channel_init()
1137 channel->dpll_input_mode_cnfg = DPLL2_INPUT_MODE_CNFG; in idt82p33_channel_init()
1143 channel->plln = index; in idt82p33_channel_init()
1144 channel->current_freq = 0; in idt82p33_channel_init()
1145 channel->idt82p33 = idt82p33; in idt82p33_channel_init()
1146 INIT_DELAYED_WORK(&channel->adjtime_work, idt82p33_adjtime_workaround); in idt82p33_channel_init()
1202 struct idt82p33_channel *channel; in idt82p33_enable_channel() local
1208 channel = &idt82p33->channel[index]; in idt82p33_enable_channel()
1218 idt82p33_caps_init(index, &channel->caps, in idt82p33_enable_channel()
1221 channel->ptp_clock = ptp_clock_register(&channel->caps, NULL); in idt82p33_enable_channel()
1223 if (IS_ERR(channel->ptp_clock)) { in idt82p33_enable_channel()
1224 err = PTR_ERR(channel->ptp_clock); in idt82p33_enable_channel()
1225 channel->ptp_clock = NULL; in idt82p33_enable_channel()
1229 if (!channel->ptp_clock) in idt82p33_enable_channel()
1232 err = idt82p33_dpll_set_mode(channel, PLL_MODE_DCO); in idt82p33_enable_channel()
1240 err = idt82p33_enable_tod(channel); in idt82p33_enable_channel()
1249 index, channel->ptp_clock->index); in idt82p33_enable_channel()
1345 struct idt82p33_channel *channel; in idt82p33_extts_check() local
1369 channel = &idt82p33->channel[i]; in idt82p33_extts_check()
1370 arm_tod_read_with_trigger(channel, channel->tod_trigger); in idt82p33_extts_check()
1401 idt82p33->channel[0].output_mask = DEFAULT_OUTPUT_MASK_PLL0; in idt82p33_probe()
1402 idt82p33->channel[1].output_mask = DEFAULT_OUTPUT_MASK_PLL1; in idt82p33_probe()