Lines Matching refs:idtcm
128 static int idtcm_xfer_read(struct idtcm *idtcm, in idtcm_xfer_read() argument
133 struct i2c_client *client = idtcm->client; in idtcm_xfer_read()
166 static int idtcm_xfer_write(struct idtcm *idtcm, in idtcm_xfer_write() argument
171 struct i2c_client *client = idtcm->client; in idtcm_xfer_write()
197 static int idtcm_page_offset(struct idtcm *idtcm, u8 val) in idtcm_page_offset() argument
202 if (idtcm->page_offset == val) in idtcm_page_offset()
210 err = idtcm_xfer_write(idtcm, PAGE_ADDR, buf, sizeof(buf)); in idtcm_page_offset()
213 idtcm->page_offset = 0xff; in idtcm_page_offset()
214 dev_err(&idtcm->client->dev, "failed to set page offset\n"); in idtcm_page_offset()
216 idtcm->page_offset = val; in idtcm_page_offset()
222 static int _idtcm_rdwr(struct idtcm *idtcm, in _idtcm_rdwr() argument
235 err = idtcm_page_offset(idtcm, hi); in _idtcm_rdwr()
241 return idtcm_xfer_write(idtcm, lo, buf, count); in _idtcm_rdwr()
243 return idtcm_xfer_read(idtcm, lo, buf, count); in _idtcm_rdwr()
246 static int idtcm_read(struct idtcm *idtcm, in idtcm_read() argument
252 return _idtcm_rdwr(idtcm, module + regaddr, buf, count, false); in idtcm_read()
255 static int idtcm_write(struct idtcm *idtcm, in idtcm_write() argument
261 return _idtcm_rdwr(idtcm, module + regaddr, buf, count, true); in idtcm_write()
267 struct idtcm *idtcm = channel->idtcm; in _idtcm_gettime() local
273 err = idtcm_read(idtcm, channel->tod_read_primary, in _idtcm_gettime()
282 err = idtcm_write(idtcm, channel->tod_read_primary, in _idtcm_gettime()
290 if (idtcm->calculate_overhead_flag) in _idtcm_gettime()
291 idtcm->start_time = ktime_get_raw(); in _idtcm_gettime()
293 err = idtcm_read(idtcm, channel->tod_read_primary, in _idtcm_gettime()
304 err = idtcm_read(idtcm, channel->tod_read_primary, in _idtcm_gettime()
315 static int _sync_pll_output(struct idtcm *idtcm, in _sync_pll_output() argument
370 err = idtcm_write(idtcm, 0, sync_ctrl1, &val, sizeof(val)); in _sync_pll_output()
374 err = idtcm_write(idtcm, 0, sync_ctrl0, &sync_src, sizeof(sync_src)); in _sync_pll_output()
387 err = idtcm_write(idtcm, 0, sync_ctrl1, &val, sizeof(val)); in _sync_pll_output()
393 err = idtcm_read(idtcm, 0, HW_Q8_CTRL_SPARE, in _sync_pll_output()
400 err = idtcm_write(idtcm, 0, HW_Q8_CTRL_SPARE, in _sync_pll_output()
407 err = idtcm_write(idtcm, 0, HW_Q8_CTRL_SPARE, in _sync_pll_output()
415 err = idtcm_read(idtcm, 0, HW_Q11_CTRL_SPARE, in _sync_pll_output()
422 err = idtcm_write(idtcm, 0, HW_Q11_CTRL_SPARE, in _sync_pll_output()
429 err = idtcm_write(idtcm, 0, HW_Q11_CTRL_SPARE, in _sync_pll_output()
437 err = idtcm_write(idtcm, 0, sync_ctrl1, &val, sizeof(val)); in _sync_pll_output()
468 struct idtcm *idtcm = channel->idtcm; in idtcm_sync_pps_output() local
485 err = idtcm_read(idtcm, 0, HW_Q8_CTRL_SPARE, in idtcm_sync_pps_output()
494 err = idtcm_read(idtcm, 0, HW_Q11_CTRL_SPARE, in idtcm_sync_pps_output()
540 err = _sync_pll_output(idtcm, pll, sync_src, qn, in idtcm_sync_pps_output()
554 struct idtcm *idtcm = channel->idtcm; in _idtcm_set_dpll_hw_tod() local
563 err = idtcm_read(idtcm, channel->hw_dpll_n, HW_DPLL_TOD_CTRL_1, in _idtcm_set_dpll_hw_tod()
572 err = idtcm_write(idtcm, channel->hw_dpll_n, HW_DPLL_TOD_CTRL_1, in _idtcm_set_dpll_hw_tod()
585 err = idtcm_write(idtcm, channel->hw_dpll_n, in _idtcm_set_dpll_hw_tod()
595 err = idtcm_write(idtcm, channel->hw_dpll_n, HW_DPLL_TOD_CTRL_1, in _idtcm_set_dpll_hw_tod()
600 if (idtcm->calculate_overhead_flag) { in _idtcm_set_dpll_hw_tod()
603 - idtcm->start_time) in _idtcm_set_dpll_hw_tod()
604 + idtcm->tod_write_overhead_ns in _idtcm_set_dpll_hw_tod()
609 idtcm->calculate_overhead_flag = 0; in _idtcm_set_dpll_hw_tod()
617 err = idtcm_write(idtcm, channel->hw_dpll_n, in _idtcm_set_dpll_hw_tod()
629 struct idtcm *idtcm = channel->idtcm; in _idtcm_set_dpll_scsr_tod() local
641 err = idtcm_write(idtcm, channel->tod_write, TOD_WRITE, in _idtcm_set_dpll_scsr_tod()
647 err = idtcm_read(idtcm, channel->tod_write, TOD_WRITE_CMD, in _idtcm_set_dpll_scsr_tod()
657 err = idtcm_write(idtcm, channel->tod_write, TOD_WRITE_CMD, in _idtcm_set_dpll_scsr_tod()
668 err = idtcm_read(idtcm, channel->tod_write, TOD_WRITE_CMD, in _idtcm_set_dpll_scsr_tod()
677 dev_err(&idtcm->client->dev, in _idtcm_set_dpll_scsr_tod()
690 struct idtcm *idtcm = channel->idtcm; in _idtcm_settime() local
702 err = idtcm_read(idtcm, channel->hw_dpll_n, in _idtcm_settime()
716 dev_err(&idtcm->client->dev, in _idtcm_settime()
740 struct idtcm *idtcm = channel->idtcm; in idtcm_set_phase_pull_in_offset() local
749 err = idtcm_write(idtcm, channel->dpll_phase_pull_in, PULL_IN_OFFSET, in idtcm_set_phase_pull_in_offset()
760 struct idtcm *idtcm = channel->idtcm; in idtcm_set_phase_pull_in_slope_limit() local
772 err = idtcm_write(idtcm, channel->dpll_phase_pull_in, in idtcm_set_phase_pull_in_slope_limit()
781 struct idtcm *idtcm = channel->idtcm; in idtcm_start_phase_pull_in() local
785 err = idtcm_read(idtcm, channel->dpll_phase_pull_in, PULL_IN_CTRL, in idtcm_start_phase_pull_in()
793 err = idtcm_write(idtcm, channel->dpll_phase_pull_in, in idtcm_start_phase_pull_in()
825 struct idtcm *idtcm = channel->idtcm; in set_tod_write_overhead() local
837 idtcm_write(idtcm, channel->hw_dpll_n, HW_DPLL_TOD_OVR__0, in set_tod_write_overhead()
844 err = idtcm_write(idtcm, channel->hw_dpll_n, in set_tod_write_overhead()
862 idtcm->tod_write_overhead_ns = lowest_ns; in set_tod_write_overhead()
870 struct idtcm *idtcm = channel->idtcm; in _idtcm_adjtime() local
877 idtcm->calculate_overhead_flag = 1; in _idtcm_adjtime()
900 static int idtcm_state_machine_reset(struct idtcm *idtcm) in idtcm_state_machine_reset() argument
905 err = idtcm_write(idtcm, RESET_CTRL, SM_RESET, &byte, sizeof(byte)); in idtcm_state_machine_reset()
913 static int idtcm_read_hw_rev_id(struct idtcm *idtcm, u8 *hw_rev_id) in idtcm_read_hw_rev_id() argument
915 return idtcm_read(idtcm, HW_REVISION, REV_ID, hw_rev_id, sizeof(u8)); in idtcm_read_hw_rev_id()
918 static int idtcm_read_product_id(struct idtcm *idtcm, u16 *product_id) in idtcm_read_product_id() argument
923 err = idtcm_read(idtcm, GENERAL_STATUS, PRODUCT_ID, buf, sizeof(buf)); in idtcm_read_product_id()
930 static int idtcm_read_major_release(struct idtcm *idtcm, u8 *major) in idtcm_read_major_release() argument
935 err = idtcm_read(idtcm, GENERAL_STATUS, MAJ_REL, &buf, sizeof(buf)); in idtcm_read_major_release()
942 static int idtcm_read_minor_release(struct idtcm *idtcm, u8 *minor) in idtcm_read_minor_release() argument
944 return idtcm_read(idtcm, GENERAL_STATUS, MIN_REL, minor, sizeof(u8)); in idtcm_read_minor_release()
947 static int idtcm_read_hotfix_release(struct idtcm *idtcm, u8 *hotfix) in idtcm_read_hotfix_release() argument
949 return idtcm_read(idtcm, in idtcm_read_hotfix_release()
956 static int idtcm_read_otp_scsr_config_select(struct idtcm *idtcm, in idtcm_read_otp_scsr_config_select() argument
959 return idtcm_read(idtcm, GENERAL_STATUS, OTP_SCSR_CONFIG_SELECT, in idtcm_read_otp_scsr_config_select()
963 static int set_pll_output_mask(struct idtcm *idtcm, u16 addr, u8 val) in set_pll_output_mask() argument
969 SET_U16_LSB(idtcm->channel[0].output_mask, val); in set_pll_output_mask()
972 SET_U16_MSB(idtcm->channel[0].output_mask, val); in set_pll_output_mask()
975 SET_U16_LSB(idtcm->channel[1].output_mask, val); in set_pll_output_mask()
978 SET_U16_MSB(idtcm->channel[1].output_mask, val); in set_pll_output_mask()
981 SET_U16_LSB(idtcm->channel[2].output_mask, val); in set_pll_output_mask()
984 SET_U16_MSB(idtcm->channel[2].output_mask, val); in set_pll_output_mask()
987 SET_U16_LSB(idtcm->channel[3].output_mask, val); in set_pll_output_mask()
990 SET_U16_MSB(idtcm->channel[3].output_mask, val); in set_pll_output_mask()
1000 static int set_tod_ptp_pll(struct idtcm *idtcm, u8 index, u8 pll) in set_tod_ptp_pll() argument
1003 dev_err(&idtcm->client->dev, "ToD%d not supported\n", index); in set_tod_ptp_pll()
1008 dev_err(&idtcm->client->dev, "Pll%d not supported\n", pll); in set_tod_ptp_pll()
1012 idtcm->channel[index].pll = pll; in set_tod_ptp_pll()
1017 static int check_and_set_masks(struct idtcm *idtcm, in check_and_set_masks() argument
1026 dev_err(&idtcm->client->dev, in check_and_set_masks()
1030 idtcm->tod_mask = val; in check_and_set_masks()
1034 err = set_tod_ptp_pll(idtcm, 0, val); in check_and_set_masks()
1037 err = set_tod_ptp_pll(idtcm, 1, val); in check_and_set_masks()
1040 err = set_tod_ptp_pll(idtcm, 2, val); in check_and_set_masks()
1043 err = set_tod_ptp_pll(idtcm, 3, val); in check_and_set_masks()
1046 err = set_pll_output_mask(idtcm, regaddr, val); in check_and_set_masks()
1053 static void display_pll_and_masks(struct idtcm *idtcm) in display_pll_and_masks() argument
1058 dev_dbg(&idtcm->client->dev, "tod_mask = 0x%02x\n", idtcm->tod_mask); in display_pll_and_masks()
1063 if (mask & idtcm->tod_mask) in display_pll_and_masks()
1064 dev_dbg(&idtcm->client->dev, in display_pll_and_masks()
1066 i, idtcm->channel[i].pll, in display_pll_and_masks()
1067 idtcm->channel[i].output_mask); in display_pll_and_masks()
1071 static int idtcm_load_firmware(struct idtcm *idtcm, in idtcm_load_firmware() argument
1086 dev_dbg(&idtcm->client->dev, "requesting firmware '%s'\n", fname); in idtcm_load_firmware()
1091 dev_err(&idtcm->client->dev, in idtcm_load_firmware()
1098 dev_dbg(&idtcm->client->dev, "firmware size %zu bytes\n", fw->size); in idtcm_load_firmware()
1103 idtcm_state_machine_reset(idtcm); in idtcm_load_firmware()
1108 dev_err(&idtcm->client->dev, in idtcm_load_firmware()
1120 err = check_and_set_masks(idtcm, regaddr, val); in idtcm_load_firmware()
1136 err = idtcm_write(idtcm, regaddr, 0, &val, sizeof(val)); in idtcm_load_firmware()
1143 display_pll_and_masks(idtcm); in idtcm_load_firmware()
1153 struct idtcm *idtcm = channel->idtcm; in idtcm_output_enable() local
1157 err = idtcm_read(idtcm, OUTPUT_MODULE_FROM_INDEX(outn), in idtcm_output_enable()
1168 return idtcm_write(idtcm, OUTPUT_MODULE_FROM_INDEX(outn), in idtcm_output_enable()
1215 struct idtcm *idtcm = channel->idtcm; in idtcm_set_pll_mode() local
1219 err = idtcm_read(idtcm, channel->dpll_n, DPLL_MODE, in idtcm_set_pll_mode()
1230 err = idtcm_write(idtcm, channel->dpll_n, DPLL_MODE, in idtcm_set_pll_mode()
1249 struct idtcm *idtcm = channel->idtcm; in _idtcm_adjphase() local
1292 err = idtcm_write(idtcm, channel->dpll_phase, DPLL_WR_PHASE, in _idtcm_adjphase()
1300 struct idtcm *idtcm = channel->idtcm; in _idtcm_adjfine() local
1344 err = idtcm_write(idtcm, channel->dpll_freq, DPLL_WR_FREQ, in _idtcm_adjfine()
1354 struct idtcm *idtcm = channel->idtcm; in idtcm_gettime() local
1357 mutex_lock(&idtcm->reg_lock); in idtcm_gettime()
1362 dev_err(&idtcm->client->dev, in idtcm_gettime()
1367 mutex_unlock(&idtcm->reg_lock); in idtcm_gettime()
1377 struct idtcm *idtcm = channel->idtcm; in idtcm_settime() local
1380 mutex_lock(&idtcm->reg_lock); in idtcm_settime()
1385 dev_err(&idtcm->client->dev, in idtcm_settime()
1390 mutex_unlock(&idtcm->reg_lock); in idtcm_settime()
1400 struct idtcm *idtcm = channel->idtcm; in idtcm_settime_v487() local
1403 mutex_lock(&idtcm->reg_lock); in idtcm_settime_v487()
1408 dev_err(&idtcm->client->dev, in idtcm_settime_v487()
1413 mutex_unlock(&idtcm->reg_lock); in idtcm_settime_v487()
1422 struct idtcm *idtcm = channel->idtcm; in idtcm_adjtime() local
1425 mutex_lock(&idtcm->reg_lock); in idtcm_adjtime()
1430 dev_err(&idtcm->client->dev, in idtcm_adjtime()
1435 mutex_unlock(&idtcm->reg_lock); in idtcm_adjtime()
1444 struct idtcm *idtcm = channel->idtcm; in idtcm_adjtime_v487() local
1452 dev_err(&idtcm->client->dev, in idtcm_adjtime_v487()
1467 mutex_lock(&idtcm->reg_lock); in idtcm_adjtime_v487()
1472 dev_err(&idtcm->client->dev, in idtcm_adjtime_v487()
1477 mutex_unlock(&idtcm->reg_lock); in idtcm_adjtime_v487()
1487 struct idtcm *idtcm = channel->idtcm; in idtcm_adjphase() local
1491 mutex_lock(&idtcm->reg_lock); in idtcm_adjphase()
1496 dev_err(&idtcm->client->dev, in idtcm_adjphase()
1501 mutex_unlock(&idtcm->reg_lock); in idtcm_adjphase()
1511 struct idtcm *idtcm = channel->idtcm; in idtcm_adjfine() local
1515 mutex_lock(&idtcm->reg_lock); in idtcm_adjfine()
1520 dev_err(&idtcm->client->dev, in idtcm_adjfine()
1525 mutex_unlock(&idtcm->reg_lock); in idtcm_adjfine()
1543 dev_err(&channel->idtcm->client->dev, in idtcm_enable()
1557 dev_err(&channel->idtcm->client->dev, in idtcm_enable()
1569 static int _enable_pll_tod_sync(struct idtcm *idtcm, in _enable_pll_tod_sync() argument
1644 err = idtcm_read(idtcm, out0, OUT_CTRL_1, &val, sizeof(val)); in _enable_pll_tod_sync()
1651 err = idtcm_write(idtcm, out0, OUT_CTRL_1, &val, sizeof(val)); in _enable_pll_tod_sync()
1658 err = idtcm_read(idtcm, out1, OUT_CTRL_1, &val, sizeof(val)); in _enable_pll_tod_sync()
1665 err = idtcm_write(idtcm, out1, OUT_CTRL_1, &val, sizeof(val)); in _enable_pll_tod_sync()
1672 err = idtcm_read(idtcm, dpll, DPLL_TOD_SYNC_CFG, &val, sizeof(val)); in _enable_pll_tod_sync()
1680 return idtcm_write(idtcm, dpll, DPLL_TOD_SYNC_CFG, &val, sizeof(val)); in _enable_pll_tod_sync()
1685 struct idtcm *idtcm = channel->idtcm; in idtcm_enable_tod_sync() local
1701 err = idtcm_read(idtcm, channel->tod_n, TOD_CFG, &cfg, sizeof(cfg)); in idtcm_enable_tod_sync()
1707 err = idtcm_write(idtcm, channel->tod_n, TOD_CFG, &cfg, sizeof(cfg)); in idtcm_enable_tod_sync()
1728 err = idtcm_read(idtcm, 0, HW_Q8_CTRL_SPARE, in idtcm_enable_tod_sync()
1737 err = idtcm_read(idtcm, 0, HW_Q11_CTRL_SPARE, in idtcm_enable_tod_sync()
1783 err = _enable_pll_tod_sync(idtcm, pll, sync_src, qn, in idtcm_enable_tod_sync()
1795 struct idtcm *idtcm = channel->idtcm; in idtcm_enable_tod() local
1803 err = idtcm_read(idtcm, channel->tod_n, TOD_CFG, &cfg, sizeof(cfg)); in idtcm_enable_tod()
1809 err = idtcm_write(idtcm, channel->tod_n, TOD_CFG, &cfg, sizeof(cfg)); in idtcm_enable_tod()
1816 static void idtcm_display_version_info(struct idtcm *idtcm) in idtcm_display_version_info() argument
1826 idtcm_read_major_release(idtcm, &major); in idtcm_display_version_info()
1827 idtcm_read_minor_release(idtcm, &minor); in idtcm_display_version_info()
1828 idtcm_read_hotfix_release(idtcm, &hotfix); in idtcm_display_version_info()
1830 idtcm_read_product_id(idtcm, &product_id); in idtcm_display_version_info()
1831 idtcm_read_hw_rev_id(idtcm, &hw_rev_id); in idtcm_display_version_info()
1833 idtcm_read_otp_scsr_config_select(idtcm, &config_select); in idtcm_display_version_info()
1835 snprintf(idtcm->version, sizeof(idtcm->version), "%u.%u.%u", in idtcm_display_version_info()
1838 dev_info(&idtcm->client->dev, fmt, major, minor, hotfix, in idtcm_display_version_info()
1944 static int idtcm_enable_channel(struct idtcm *idtcm, u32 index) in idtcm_enable_channel() argument
1952 channel = &idtcm->channel[index]; in idtcm_enable_channel()
1985 channel->idtcm = idtcm; in idtcm_enable_channel()
1987 if (idtcm_strverscmp(idtcm->version, "4.8.7") >= 0) in idtcm_enable_channel()
1995 if (idtcm_strverscmp(idtcm->version, "4.8.7") >= 0) { in idtcm_enable_channel()
1998 dev_err(&idtcm->client->dev, in idtcm_enable_channel()
2008 dev_err(&idtcm->client->dev, in idtcm_enable_channel()
2017 dev_err(&idtcm->client->dev, in idtcm_enable_channel()
2037 dev_info(&idtcm->client->dev, "PLL%d registered as ptp%d\n", in idtcm_enable_channel()
2043 static void ptp_clock_unregister_all(struct idtcm *idtcm) in ptp_clock_unregister_all() argument
2050 channel = &idtcm->channel[i]; in ptp_clock_unregister_all()
2057 static void set_default_masks(struct idtcm *idtcm) in set_default_masks() argument
2059 idtcm->tod_mask = DEFAULT_TOD_MASK; in set_default_masks()
2061 idtcm->channel[0].pll = DEFAULT_TOD0_PTP_PLL; in set_default_masks()
2062 idtcm->channel[1].pll = DEFAULT_TOD1_PTP_PLL; in set_default_masks()
2063 idtcm->channel[2].pll = DEFAULT_TOD2_PTP_PLL; in set_default_masks()
2064 idtcm->channel[3].pll = DEFAULT_TOD3_PTP_PLL; in set_default_masks()
2066 idtcm->channel[0].output_mask = DEFAULT_OUTPUT_MASK_PLL0; in set_default_masks()
2067 idtcm->channel[1].output_mask = DEFAULT_OUTPUT_MASK_PLL1; in set_default_masks()
2068 idtcm->channel[2].output_mask = DEFAULT_OUTPUT_MASK_PLL2; in set_default_masks()
2069 idtcm->channel[3].output_mask = DEFAULT_OUTPUT_MASK_PLL3; in set_default_masks()
2075 struct idtcm *idtcm; in idtcm_probe() local
2083 idtcm = devm_kzalloc(&client->dev, sizeof(struct idtcm), GFP_KERNEL); in idtcm_probe()
2085 if (!idtcm) in idtcm_probe()
2088 idtcm->client = client; in idtcm_probe()
2089 idtcm->page_offset = 0xff; in idtcm_probe()
2090 idtcm->calculate_overhead_flag = 0; in idtcm_probe()
2092 set_default_masks(idtcm); in idtcm_probe()
2094 mutex_init(&idtcm->reg_lock); in idtcm_probe()
2095 mutex_lock(&idtcm->reg_lock); in idtcm_probe()
2097 idtcm_display_version_info(idtcm); in idtcm_probe()
2099 err = idtcm_load_firmware(idtcm, &client->dev); in idtcm_probe()
2102 dev_warn(&idtcm->client->dev, in idtcm_probe()
2105 if (idtcm->tod_mask) { in idtcm_probe()
2107 if (idtcm->tod_mask & (1 << i)) { in idtcm_probe()
2108 err = idtcm_enable_channel(idtcm, i); in idtcm_probe()
2110 dev_err(&idtcm->client->dev, in idtcm_probe()
2120 dev_err(&idtcm->client->dev, in idtcm_probe()
2125 mutex_unlock(&idtcm->reg_lock); in idtcm_probe()
2128 ptp_clock_unregister_all(idtcm); in idtcm_probe()
2132 i2c_set_clientdata(client, idtcm); in idtcm_probe()
2139 struct idtcm *idtcm = i2c_get_clientdata(client); in idtcm_remove() local
2141 ptp_clock_unregister_all(idtcm); in idtcm_remove()
2143 mutex_destroy(&idtcm->reg_lock); in idtcm_remove()