Lines Matching refs:idtcm
43 static inline int idtcm_read(struct idtcm *idtcm, in idtcm_read() argument
49 return regmap_bulk_read(idtcm->regmap, module + regaddr, buf, count); in idtcm_read()
52 static inline int idtcm_write(struct idtcm *idtcm, in idtcm_write() argument
58 return regmap_bulk_write(idtcm->regmap, module + regaddr, buf, count); in idtcm_write()
61 static int contains_full_configuration(struct idtcm *idtcm, in contains_full_configuration() argument
65 u16 scratch = IDTCM_FW_REG(idtcm->fw_ver, V520, SCRATCH); in contains_full_configuration()
199 static int clear_boot_status(struct idtcm *idtcm) in clear_boot_status() argument
203 return idtcm_write(idtcm, GENERAL_STATUS, BOOT_STATUS, buf, sizeof(buf)); in clear_boot_status()
206 static int read_boot_status(struct idtcm *idtcm, u32 *status) in read_boot_status() argument
211 err = idtcm_read(idtcm, GENERAL_STATUS, BOOT_STATUS, buf, sizeof(buf)); in read_boot_status()
218 static int wait_for_boot_status_ready(struct idtcm *idtcm) in wait_for_boot_status_ready() argument
225 err = read_boot_status(idtcm, &status); in wait_for_boot_status_ready()
237 dev_warn(idtcm->dev, "%s timed out", __func__); in wait_for_boot_status_ready()
244 struct idtcm *idtcm = channel->idtcm; in arm_tod_read_trig_sel_refclk() local
245 u16 tod_read_cmd = IDTCM_FW_REG(idtcm->fw_ver, V520, TOD_READ_SECONDARY_CMD); in arm_tod_read_trig_sel_refclk()
252 err = idtcm_write(idtcm, channel->tod_read_secondary, in arm_tod_read_trig_sel_refclk()
259 err = idtcm_write(idtcm, channel->tod_read_secondary, tod_read_cmd, in arm_tod_read_trig_sel_refclk()
262 dev_err(idtcm->dev, "%s: err = %d", __func__, err); in arm_tod_read_trig_sel_refclk()
277 struct idtcm *idtcm; in idtcm_extts_enable() local
283 idtcm = channel->idtcm; in idtcm_extts_enable()
284 old_mask = idtcm->extts_mask; in idtcm_extts_enable()
307 dev_err(idtcm->dev, "%s: No valid pin found for TOD%d!\n", in idtcm_extts_enable()
312 err = arm_tod_read_trig_sel_refclk(&idtcm->channel[index], ref); in idtcm_extts_enable()
315 idtcm->extts_mask |= mask; in idtcm_extts_enable()
316 idtcm->event_channel[index] = channel; in idtcm_extts_enable()
317 idtcm->channel[index].refn = ref; in idtcm_extts_enable()
318 idtcm->extts_single_shot = is_single_shot(idtcm->extts_mask); in idtcm_extts_enable()
323 schedule_delayed_work(&idtcm->extts_work, in idtcm_extts_enable()
327 idtcm->extts_mask &= ~mask; in idtcm_extts_enable()
328 idtcm->extts_single_shot = is_single_shot(idtcm->extts_mask); in idtcm_extts_enable()
330 if (idtcm->extts_mask == 0) in idtcm_extts_enable()
331 cancel_delayed_work(&idtcm->extts_work); in idtcm_extts_enable()
337 static int read_sys_apll_status(struct idtcm *idtcm, u8 *status) in read_sys_apll_status() argument
339 return idtcm_read(idtcm, STATUS, DPLL_SYS_APLL_STATUS, status, in read_sys_apll_status()
343 static int read_sys_dpll_status(struct idtcm *idtcm, u8 *status) in read_sys_dpll_status() argument
345 return idtcm_read(idtcm, STATUS, DPLL_SYS_STATUS, status, sizeof(u8)); in read_sys_dpll_status()
348 static int wait_for_sys_apll_dpll_lock(struct idtcm *idtcm) in wait_for_sys_apll_dpll_lock() argument
356 err = read_sys_apll_status(idtcm, &apll); in wait_for_sys_apll_dpll_lock()
360 err = read_sys_dpll_status(idtcm, &dpll); in wait_for_sys_apll_dpll_lock()
373 dev_warn(idtcm->dev, in wait_for_sys_apll_dpll_lock()
381 dev_warn(idtcm->dev, in wait_for_sys_apll_dpll_lock()
388 static void wait_for_chip_ready(struct idtcm *idtcm) in wait_for_chip_ready() argument
390 if (wait_for_boot_status_ready(idtcm)) in wait_for_chip_ready()
391 dev_warn(idtcm->dev, "BOOT_STATUS != 0xA0"); in wait_for_chip_ready()
393 if (wait_for_sys_apll_dpll_lock(idtcm)) in wait_for_chip_ready()
394 dev_warn(idtcm->dev, in wait_for_chip_ready()
401 struct idtcm *idtcm = channel->idtcm; in _idtcm_gettime_triggered() local
402 u16 tod_read_cmd = IDTCM_FW_REG(idtcm->fw_ver, V520, TOD_READ_SECONDARY_CMD); in _idtcm_gettime_triggered()
407 err = idtcm_read(idtcm, channel->tod_read_secondary, in _idtcm_gettime_triggered()
415 err = idtcm_read(idtcm, channel->tod_read_secondary, in _idtcm_gettime_triggered()
426 struct idtcm *idtcm = channel->idtcm; in _idtcm_gettime() local
427 u16 tod_read_cmd = IDTCM_FW_REG(idtcm->fw_ver, V520, TOD_READ_PRIMARY_CMD); in _idtcm_gettime()
437 if (idtcm->calculate_overhead_flag) in _idtcm_gettime()
438 idtcm->start_time = ktime_get_raw(); in _idtcm_gettime()
440 err = idtcm_read(idtcm, channel->tod_read_primary, in _idtcm_gettime()
447 err = idtcm_read(idtcm, channel->tod_read_primary, in _idtcm_gettime()
457 static int idtcm_extts_check_channel(struct idtcm *idtcm, u8 todn) in idtcm_extts_check_channel() argument
465 extts_channel = &idtcm->channel[todn]; in idtcm_extts_check_channel()
466 ptp_channel = idtcm->event_channel[todn]; in idtcm_extts_check_channel()
487 struct idtcm *idtcm = channel->idtcm; in _idtcm_gettime_immediate() local
489 u16 tod_read_cmd = IDTCM_FW_REG(idtcm->fw_ver, V520, TOD_READ_PRIMARY_CMD); in _idtcm_gettime_immediate()
493 err = idtcm_write(idtcm, channel->tod_read_primary, in _idtcm_gettime_immediate()
501 static int _sync_pll_output(struct idtcm *idtcm, in _sync_pll_output() argument
556 err = idtcm_write(idtcm, 0, sync_ctrl1, &val, sizeof(val)); in _sync_pll_output()
560 err = idtcm_write(idtcm, 0, sync_ctrl0, &sync_src, sizeof(sync_src)); in _sync_pll_output()
573 err = idtcm_write(idtcm, 0, sync_ctrl1, &val, sizeof(val)); in _sync_pll_output()
579 err = idtcm_read(idtcm, 0, HW_Q8_CTRL_SPARE, in _sync_pll_output()
586 err = idtcm_write(idtcm, 0, HW_Q8_CTRL_SPARE, in _sync_pll_output()
593 err = idtcm_write(idtcm, 0, HW_Q8_CTRL_SPARE, in _sync_pll_output()
601 err = idtcm_read(idtcm, 0, HW_Q11_CTRL_SPARE, in _sync_pll_output()
608 err = idtcm_write(idtcm, 0, HW_Q11_CTRL_SPARE, in _sync_pll_output()
615 err = idtcm_write(idtcm, 0, HW_Q11_CTRL_SPARE, in _sync_pll_output()
623 err = idtcm_write(idtcm, 0, sync_ctrl1, &val, sizeof(val)); in _sync_pll_output()
630 struct idtcm *idtcm = channel->idtcm; in idtcm_sync_pps_output() local
640 err = idtcm_read(idtcm, 0, HW_Q8_CTRL_SPARE, in idtcm_sync_pps_output()
649 err = idtcm_read(idtcm, 0, HW_Q11_CTRL_SPARE, in idtcm_sync_pps_output()
695 err = _sync_pll_output(idtcm, pll, channel->sync_src, in idtcm_sync_pps_output()
709 struct idtcm *idtcm = channel->idtcm; in _idtcm_set_dpll_hw_tod() local
717 err = idtcm_read(idtcm, channel->hw_dpll_n, HW_DPLL_TOD_CTRL_1, in _idtcm_set_dpll_hw_tod()
725 err = idtcm_write(idtcm, channel->hw_dpll_n, HW_DPLL_TOD_CTRL_1, in _idtcm_set_dpll_hw_tod()
735 err = idtcm_write(idtcm, channel->hw_dpll_n, in _idtcm_set_dpll_hw_tod()
744 err = idtcm_write(idtcm, channel->hw_dpll_n, HW_DPLL_TOD_CTRL_1, in _idtcm_set_dpll_hw_tod()
748 if (idtcm->calculate_overhead_flag) { in _idtcm_set_dpll_hw_tod()
751 idtcm->start_time); in _idtcm_set_dpll_hw_tod()
753 + idtcm->tod_write_overhead_ns in _idtcm_set_dpll_hw_tod()
758 idtcm->calculate_overhead_flag = 0; in _idtcm_set_dpll_hw_tod()
765 err = idtcm_write(idtcm, channel->hw_dpll_n, in _idtcm_set_dpll_hw_tod()
777 struct idtcm *idtcm = channel->idtcm; in _idtcm_set_dpll_scsr_tod() local
788 err = idtcm_write(idtcm, channel->tod_write, TOD_WRITE, in _idtcm_set_dpll_scsr_tod()
794 err = idtcm_read(idtcm, channel->tod_write, TOD_WRITE_CMD, in _idtcm_set_dpll_scsr_tod()
804 err = idtcm_write(idtcm, channel->tod_write, TOD_WRITE_CMD, in _idtcm_set_dpll_scsr_tod()
815 err = idtcm_read(idtcm, channel->tod_write, TOD_WRITE_CMD, in _idtcm_set_dpll_scsr_tod()
824 dev_err(idtcm->dev, in _idtcm_set_dpll_scsr_tod()
884 struct idtcm *idtcm = channel->idtcm; in _idtcm_settime_deprecated() local
889 dev_err(idtcm->dev, in _idtcm_settime_deprecated()
911 struct idtcm *idtcm = channel->idtcm; in idtcm_set_phase_pull_in_offset() local
919 err = idtcm_write(idtcm, channel->dpll_phase_pull_in, PULL_IN_OFFSET, in idtcm_set_phase_pull_in_offset()
930 struct idtcm *idtcm = channel->idtcm; in idtcm_set_phase_pull_in_slope_limit() local
941 err = idtcm_write(idtcm, channel->dpll_phase_pull_in, in idtcm_set_phase_pull_in_slope_limit()
950 struct idtcm *idtcm = channel->idtcm; in idtcm_start_phase_pull_in() local
953 err = idtcm_read(idtcm, channel->dpll_phase_pull_in, PULL_IN_CTRL, in idtcm_start_phase_pull_in()
960 err = idtcm_write(idtcm, channel->dpll_phase_pull_in, in idtcm_start_phase_pull_in()
990 struct idtcm *idtcm = channel->idtcm; in set_tod_write_overhead() local
1002 idtcm_write(idtcm, channel->hw_dpll_n, HW_DPLL_TOD_OVR__0, in set_tod_write_overhead()
1008 err = idtcm_write(idtcm, channel->hw_dpll_n, in set_tod_write_overhead()
1027 idtcm->tod_write_overhead_ns = lowest_ns; in set_tod_write_overhead()
1035 struct idtcm *idtcm = channel->idtcm; in _idtcm_adjtime_deprecated() local
1042 idtcm->calculate_overhead_flag = 1; in _idtcm_adjtime_deprecated()
1063 static int idtcm_state_machine_reset(struct idtcm *idtcm) in idtcm_state_machine_reset() argument
1070 clear_boot_status(idtcm); in idtcm_state_machine_reset()
1072 err = idtcm_write(idtcm, RESET_CTRL, in idtcm_state_machine_reset()
1073 IDTCM_FW_REG(idtcm->fw_ver, V520, SM_RESET), in idtcm_state_machine_reset()
1079 read_boot_status(idtcm, &status); in idtcm_state_machine_reset()
1082 dev_dbg(idtcm->dev, in idtcm_state_machine_reset()
1089 dev_err(idtcm->dev, in idtcm_state_machine_reset()
1096 static int idtcm_read_hw_rev_id(struct idtcm *idtcm, u8 *hw_rev_id) in idtcm_read_hw_rev_id() argument
1098 return idtcm_read(idtcm, HW_REVISION, REV_ID, hw_rev_id, sizeof(u8)); in idtcm_read_hw_rev_id()
1101 static int idtcm_read_product_id(struct idtcm *idtcm, u16 *product_id) in idtcm_read_product_id() argument
1106 err = idtcm_read(idtcm, GENERAL_STATUS, PRODUCT_ID, buf, sizeof(buf)); in idtcm_read_product_id()
1113 static int idtcm_read_major_release(struct idtcm *idtcm, u8 *major) in idtcm_read_major_release() argument
1118 err = idtcm_read(idtcm, GENERAL_STATUS, MAJ_REL, &buf, sizeof(buf)); in idtcm_read_major_release()
1125 static int idtcm_read_minor_release(struct idtcm *idtcm, u8 *minor) in idtcm_read_minor_release() argument
1127 return idtcm_read(idtcm, GENERAL_STATUS, MIN_REL, minor, sizeof(u8)); in idtcm_read_minor_release()
1130 static int idtcm_read_hotfix_release(struct idtcm *idtcm, u8 *hotfix) in idtcm_read_hotfix_release() argument
1132 return idtcm_read(idtcm, in idtcm_read_hotfix_release()
1139 static int idtcm_read_otp_scsr_config_select(struct idtcm *idtcm, in idtcm_read_otp_scsr_config_select() argument
1142 return idtcm_read(idtcm, GENERAL_STATUS, OTP_SCSR_CONFIG_SELECT, in idtcm_read_otp_scsr_config_select()
1146 static int set_pll_output_mask(struct idtcm *idtcm, u16 addr, u8 val) in set_pll_output_mask() argument
1152 SET_U16_LSB(idtcm->channel[0].output_mask, val); in set_pll_output_mask()
1155 SET_U16_MSB(idtcm->channel[0].output_mask, val); in set_pll_output_mask()
1158 SET_U16_LSB(idtcm->channel[1].output_mask, val); in set_pll_output_mask()
1161 SET_U16_MSB(idtcm->channel[1].output_mask, val); in set_pll_output_mask()
1164 SET_U16_LSB(idtcm->channel[2].output_mask, val); in set_pll_output_mask()
1167 SET_U16_MSB(idtcm->channel[2].output_mask, val); in set_pll_output_mask()
1170 SET_U16_LSB(idtcm->channel[3].output_mask, val); in set_pll_output_mask()
1173 SET_U16_MSB(idtcm->channel[3].output_mask, val); in set_pll_output_mask()
1183 static int set_tod_ptp_pll(struct idtcm *idtcm, u8 index, u8 pll) in set_tod_ptp_pll() argument
1186 dev_err(idtcm->dev, "ToD%d not supported", index); in set_tod_ptp_pll()
1191 dev_err(idtcm->dev, "Pll%d not supported", pll); in set_tod_ptp_pll()
1195 idtcm->channel[index].pll = pll; in set_tod_ptp_pll()
1200 static int check_and_set_masks(struct idtcm *idtcm, in check_and_set_masks() argument
1209 dev_err(idtcm->dev, "Invalid TOD mask 0x%02x", val); in check_and_set_masks()
1212 idtcm->tod_mask = val; in check_and_set_masks()
1216 err = set_tod_ptp_pll(idtcm, 0, val); in check_and_set_masks()
1219 err = set_tod_ptp_pll(idtcm, 1, val); in check_and_set_masks()
1222 err = set_tod_ptp_pll(idtcm, 2, val); in check_and_set_masks()
1225 err = set_tod_ptp_pll(idtcm, 3, val); in check_and_set_masks()
1228 err = set_pll_output_mask(idtcm, regaddr, val); in check_and_set_masks()
1235 static void display_pll_and_masks(struct idtcm *idtcm) in display_pll_and_masks() argument
1240 dev_dbg(idtcm->dev, "tod_mask = 0x%02x", idtcm->tod_mask); in display_pll_and_masks()
1245 if (mask & idtcm->tod_mask) in display_pll_and_masks()
1246 dev_dbg(idtcm->dev, in display_pll_and_masks()
1248 i, idtcm->channel[i].pll, in display_pll_and_masks()
1249 idtcm->channel[i].output_mask); in display_pll_and_masks()
1253 static int idtcm_load_firmware(struct idtcm *idtcm, in idtcm_load_firmware() argument
1256 u16 scratch = IDTCM_FW_REG(idtcm->fw_ver, V520, SCRATCH); in idtcm_load_firmware()
1269 dev_info(idtcm->dev, "requesting firmware '%s'", fname); in idtcm_load_firmware()
1273 dev_err(idtcm->dev, in idtcm_load_firmware()
1278 dev_dbg(idtcm->dev, "firmware size %zu bytes", fw->size); in idtcm_load_firmware()
1282 if (contains_full_configuration(idtcm, fw)) in idtcm_load_firmware()
1283 idtcm_state_machine_reset(idtcm); in idtcm_load_firmware()
1287 dev_err(idtcm->dev, in idtcm_load_firmware()
1299 err = check_and_set_masks(idtcm, regaddr, val); in idtcm_load_firmware()
1313 err = idtcm_write(idtcm, regaddr, 0, &val, sizeof(val)); in idtcm_load_firmware()
1320 display_pll_and_masks(idtcm); in idtcm_load_firmware()
1330 struct idtcm *idtcm = channel->idtcm; in idtcm_output_enable() local
1335 base = get_output_base_addr(idtcm->fw_ver, outn); in idtcm_output_enable()
1338 dev_err(idtcm->dev, in idtcm_output_enable()
1343 err = idtcm_read(idtcm, (u16)base, OUT_CTRL_1, &val, sizeof(val)); in idtcm_output_enable()
1352 return idtcm_write(idtcm, (u16)base, OUT_CTRL_1, &val, sizeof(val)); in idtcm_output_enable()
1359 struct idtcm *idtcm = channel->idtcm; in idtcm_perout_enable() local
1366 dev_err(idtcm->dev, "Unable to set output enable"); in idtcm_perout_enable()
1377 struct idtcm *idtcm = channel->idtcm; in idtcm_get_pll_mode() local
1381 err = idtcm_read(idtcm, channel->dpll_n, in idtcm_get_pll_mode()
1382 IDTCM_FW_REG(idtcm->fw_ver, V520, DPLL_MODE), in idtcm_get_pll_mode()
1395 struct idtcm *idtcm = channel->idtcm; in idtcm_set_pll_mode() local
1399 err = idtcm_read(idtcm, channel->dpll_n, in idtcm_set_pll_mode()
1400 IDTCM_FW_REG(idtcm->fw_ver, V520, DPLL_MODE), in idtcm_set_pll_mode()
1409 err = idtcm_write(idtcm, channel->dpll_n, in idtcm_set_pll_mode()
1410 IDTCM_FW_REG(idtcm->fw_ver, V520, DPLL_MODE), in idtcm_set_pll_mode()
1418 struct idtcm *idtcm = channel->idtcm; in idtcm_get_manual_reference() local
1422 err = idtcm_read(idtcm, channel->dpll_ctrl_n, in idtcm_get_manual_reference()
1438 struct idtcm *idtcm = channel->idtcm; in idtcm_set_manual_reference() local
1442 err = idtcm_read(idtcm, channel->dpll_ctrl_n, in idtcm_set_manual_reference()
1452 err = idtcm_write(idtcm, channel->dpll_ctrl_n, in idtcm_set_manual_reference()
1461 struct idtcm *idtcm = channel->idtcm; in configure_dpll_mode_write_frequency() local
1467 dev_err(idtcm->dev, "Failed to set pll mode to write frequency"); in configure_dpll_mode_write_frequency()
1476 struct idtcm *idtcm = channel->idtcm; in configure_dpll_mode_write_phase() local
1482 dev_err(idtcm->dev, "Failed to set pll mode to write phase"); in configure_dpll_mode_write_phase()
1491 struct idtcm *idtcm = channel->idtcm; in configure_manual_reference_write_frequency() local
1497 dev_err(idtcm->dev, "Failed to set manual reference to write frequency"); in configure_manual_reference_write_frequency()
1506 struct idtcm *idtcm = channel->idtcm; in configure_manual_reference_write_phase() local
1512 dev_err(idtcm->dev, "Failed to set manual reference to write phase"); in configure_manual_reference_write_phase()
1535 struct idtcm *idtcm = channel->idtcm; in idtcm_work_handler() local
1537 mutex_lock(idtcm->lock); in idtcm_work_handler()
1541 mutex_unlock(idtcm->lock); in idtcm_work_handler()
1611 struct idtcm *idtcm = channel->idtcm; in initialize_operating_mode_with_manual_reference() local
1626 dev_warn(idtcm->dev, in initialize_operating_mode_with_manual_reference()
1636 struct idtcm *idtcm = channel->idtcm; in initialize_operating_mode_with_pll_mode() local
1652 dev_err(idtcm->dev, in initialize_operating_mode_with_pll_mode()
1664 struct idtcm *idtcm = channel->idtcm; in initialize_dco_operating_mode() local
1671 dev_err(idtcm->dev, "Unable to read pll mode!"); in initialize_dco_operating_mode()
1678 dev_err(idtcm->dev, "Unable to read manual reference!"); in initialize_dco_operating_mode()
1715 struct idtcm *idtcm = channel->idtcm; in _idtcm_adjphase() local
1734 err = idtcm_write(idtcm, channel->dpll_phase, DPLL_WR_PHASE, in _idtcm_adjphase()
1742 struct idtcm *idtcm = channel->idtcm; in _idtcm_adjfine() local
1778 err = idtcm_write(idtcm, channel->dpll_freq, DPLL_WR_FREQ, in _idtcm_adjfine()
1787 struct idtcm *idtcm = channel->idtcm; in idtcm_gettime() local
1790 mutex_lock(idtcm->lock); in idtcm_gettime()
1792 mutex_unlock(idtcm->lock); in idtcm_gettime()
1795 dev_err(idtcm->dev, "Failed at line %d in %s!", in idtcm_gettime()
1805 struct idtcm *idtcm = channel->idtcm; in idtcm_settime_deprecated() local
1808 mutex_lock(idtcm->lock); in idtcm_settime_deprecated()
1810 mutex_unlock(idtcm->lock); in idtcm_settime_deprecated()
1813 dev_err(idtcm->dev, in idtcm_settime_deprecated()
1823 struct idtcm *idtcm = channel->idtcm; in idtcm_settime() local
1826 mutex_lock(idtcm->lock); in idtcm_settime()
1828 mutex_unlock(idtcm->lock); in idtcm_settime()
1831 dev_err(idtcm->dev, in idtcm_settime()
1840 struct idtcm *idtcm = channel->idtcm; in idtcm_adjtime_deprecated() local
1843 mutex_lock(idtcm->lock); in idtcm_adjtime_deprecated()
1845 mutex_unlock(idtcm->lock); in idtcm_adjtime_deprecated()
1848 dev_err(idtcm->dev, in idtcm_adjtime_deprecated()
1857 struct idtcm *idtcm = channel->idtcm; in idtcm_adjtime() local
1865 mutex_lock(idtcm->lock); in idtcm_adjtime()
1880 mutex_unlock(idtcm->lock); in idtcm_adjtime()
1883 dev_err(idtcm->dev, in idtcm_adjtime()
1892 struct idtcm *idtcm = channel->idtcm; in idtcm_adjphase() local
1895 mutex_lock(idtcm->lock); in idtcm_adjphase()
1897 mutex_unlock(idtcm->lock); in idtcm_adjphase()
1900 dev_err(idtcm->dev, in idtcm_adjphase()
1909 struct idtcm *idtcm = channel->idtcm; in idtcm_adjfine() local
1918 mutex_lock(idtcm->lock); in idtcm_adjfine()
1920 mutex_unlock(idtcm->lock); in idtcm_adjfine()
1923 dev_err(idtcm->dev, in idtcm_adjfine()
1935 struct idtcm *idtcm = channel->idtcm; in idtcm_enable() local
1938 mutex_lock(idtcm->lock); in idtcm_enable()
1958 mutex_unlock(idtcm->lock); in idtcm_enable()
1961 dev_err(channel->idtcm->dev, in idtcm_enable()
1969 struct idtcm *idtcm = channel->idtcm; in idtcm_enable_tod() local
1971 u16 tod_cfg = IDTCM_FW_REG(idtcm->fw_ver, V520, TOD_CFG); in idtcm_enable_tod()
1978 err = idtcm_read(idtcm, channel->tod_n, tod_cfg, &cfg, sizeof(cfg)); in idtcm_enable_tod()
1984 err = idtcm_write(idtcm, channel->tod_n, tod_cfg, &cfg, sizeof(cfg)); in idtcm_enable_tod()
1988 if (idtcm->fw_ver < V487) in idtcm_enable_tod()
1995 static void idtcm_set_version_info(struct idtcm *idtcm) in idtcm_set_version_info() argument
2004 idtcm_read_major_release(idtcm, &major); in idtcm_set_version_info()
2005 idtcm_read_minor_release(idtcm, &minor); in idtcm_set_version_info()
2006 idtcm_read_hotfix_release(idtcm, &hotfix); in idtcm_set_version_info()
2008 idtcm_read_product_id(idtcm, &product_id); in idtcm_set_version_info()
2009 idtcm_read_hw_rev_id(idtcm, &hw_rev_id); in idtcm_set_version_info()
2011 idtcm_read_otp_scsr_config_select(idtcm, &config_select); in idtcm_set_version_info()
2013 snprintf(idtcm->version, sizeof(idtcm->version), "%u.%u.%u", in idtcm_set_version_info()
2016 idtcm->fw_ver = idtcm_fw_version(idtcm->version); in idtcm_set_version_info()
2018 dev_info(idtcm->dev, in idtcm_set_version_info()
2076 struct idtcm *idtcm = channel->idtcm; in configure_channel_pll() local
2098 channel->dpll_n = IDTCM_FW_REG(idtcm->fw_ver, V520, DPLL_2); in configure_channel_pll()
2114 channel->dpll_n = IDTCM_FW_REG(idtcm->fw_ver, V520, DPLL_4); in configure_channel_pll()
2130 channel->dpll_n = IDTCM_FW_REG(idtcm->fw_ver, V520, DPLL_6); in configure_channel_pll()
2157 struct idtcm *idtcm = channel->idtcm; in idtcm_get_dco_delay() local
2165 err = idtcm_read(idtcm, channel->dpll_ctrl_n, in idtcm_get_dco_delay()
2170 err = idtcm_read(idtcm, channel->dpll_ctrl_n, in idtcm_get_dco_delay()
2191 enum fw_version fw_ver = channel->idtcm->fw_ver; in configure_channel_tod()
2230 static int idtcm_enable_channel(struct idtcm *idtcm, u32 index) in idtcm_enable_channel() argument
2239 channel = &idtcm->channel[index]; in idtcm_enable_channel()
2241 channel->idtcm = idtcm; in idtcm_enable_channel()
2254 if (idtcm->fw_ver < V487) in idtcm_enable_channel()
2279 dev_err(idtcm->dev, in idtcm_enable_channel()
2297 dev_info(idtcm->dev, "PLL%d registered as ptp%d", in idtcm_enable_channel()
2303 static int idtcm_enable_extts_channel(struct idtcm *idtcm, u32 index) in idtcm_enable_extts_channel() argument
2311 channel = &idtcm->channel[index]; in idtcm_enable_extts_channel()
2312 channel->idtcm = idtcm; in idtcm_enable_extts_channel()
2319 channel->idtcm = idtcm; in idtcm_enable_extts_channel()
2326 struct idtcm *idtcm = container_of(work, struct idtcm, extts_work.work); in idtcm_extts_check() local
2332 if (idtcm->extts_mask == 0) in idtcm_extts_check()
2335 mutex_lock(idtcm->lock); in idtcm_extts_check()
2340 if ((idtcm->extts_mask & mask) == 0) in idtcm_extts_check()
2343 err = idtcm_extts_check_channel(idtcm, i); in idtcm_extts_check()
2347 if (idtcm->extts_single_shot) { in idtcm_extts_check()
2348 idtcm->extts_mask &= ~mask; in idtcm_extts_check()
2351 channel = &idtcm->channel[i]; in idtcm_extts_check()
2357 if (idtcm->extts_mask) in idtcm_extts_check()
2358 schedule_delayed_work(&idtcm->extts_work, in idtcm_extts_check()
2361 mutex_unlock(idtcm->lock); in idtcm_extts_check()
2364 static void ptp_clock_unregister_all(struct idtcm *idtcm) in ptp_clock_unregister_all() argument
2370 channel = &idtcm->channel[i]; in ptp_clock_unregister_all()
2376 static void set_default_masks(struct idtcm *idtcm) in set_default_masks() argument
2378 idtcm->tod_mask = DEFAULT_TOD_MASK; in set_default_masks()
2379 idtcm->extts_mask = 0; in set_default_masks()
2381 idtcm->channel[0].tod = 0; in set_default_masks()
2382 idtcm->channel[1].tod = 1; in set_default_masks()
2383 idtcm->channel[2].tod = 2; in set_default_masks()
2384 idtcm->channel[3].tod = 3; in set_default_masks()
2386 idtcm->channel[0].pll = DEFAULT_TOD0_PTP_PLL; in set_default_masks()
2387 idtcm->channel[1].pll = DEFAULT_TOD1_PTP_PLL; in set_default_masks()
2388 idtcm->channel[2].pll = DEFAULT_TOD2_PTP_PLL; in set_default_masks()
2389 idtcm->channel[3].pll = DEFAULT_TOD3_PTP_PLL; in set_default_masks()
2391 idtcm->channel[0].output_mask = DEFAULT_OUTPUT_MASK_PLL0; in set_default_masks()
2392 idtcm->channel[1].output_mask = DEFAULT_OUTPUT_MASK_PLL1; in set_default_masks()
2393 idtcm->channel[2].output_mask = DEFAULT_OUTPUT_MASK_PLL2; in set_default_masks()
2394 idtcm->channel[3].output_mask = DEFAULT_OUTPUT_MASK_PLL3; in set_default_masks()
2400 struct idtcm *idtcm; in idtcm_probe() local
2404 idtcm = devm_kzalloc(&pdev->dev, sizeof(struct idtcm), GFP_KERNEL); in idtcm_probe()
2406 if (!idtcm) in idtcm_probe()
2409 idtcm->dev = &pdev->dev; in idtcm_probe()
2410 idtcm->mfd = pdev->dev.parent; in idtcm_probe()
2411 idtcm->lock = &ddata->lock; in idtcm_probe()
2412 idtcm->regmap = ddata->regmap; in idtcm_probe()
2413 idtcm->calculate_overhead_flag = 0; in idtcm_probe()
2415 INIT_DELAYED_WORK(&idtcm->extts_work, idtcm_extts_check); in idtcm_probe()
2417 set_default_masks(idtcm); in idtcm_probe()
2419 mutex_lock(idtcm->lock); in idtcm_probe()
2421 idtcm_set_version_info(idtcm); in idtcm_probe()
2423 err = idtcm_load_firmware(idtcm, &pdev->dev); in idtcm_probe()
2426 dev_warn(idtcm->dev, "loading firmware failed with %d", err); in idtcm_probe()
2428 wait_for_chip_ready(idtcm); in idtcm_probe()
2430 if (idtcm->tod_mask) { in idtcm_probe()
2432 if (idtcm->tod_mask & (1 << i)) in idtcm_probe()
2433 err = idtcm_enable_channel(idtcm, i); in idtcm_probe()
2435 err = idtcm_enable_extts_channel(idtcm, i); in idtcm_probe()
2437 dev_err(idtcm->dev, in idtcm_probe()
2443 dev_err(idtcm->dev, in idtcm_probe()
2448 mutex_unlock(idtcm->lock); in idtcm_probe()
2451 ptp_clock_unregister_all(idtcm); in idtcm_probe()
2455 platform_set_drvdata(pdev, idtcm); in idtcm_probe()
2462 struct idtcm *idtcm = platform_get_drvdata(pdev); in idtcm_remove() local
2464 idtcm->extts_mask = 0; in idtcm_remove()
2465 ptp_clock_unregister_all(idtcm); in idtcm_remove()
2466 cancel_delayed_work_sync(&idtcm->extts_work); in idtcm_remove()