How to test pps signal from TDA4VM?
Example of using Time stamp external events
device tree can be change :
×ync_router {
pinctrl-names = "default";
pinctrl-0 = <&mcu_cpts_pps>;
/* Example of the timesync routing */
mcu_cpts_pps: mcu-cpts-pps {
pinctrl-single,pins = <
/* pps [cpts genf1] in17 -> out29 [cpts hw4_push] */
TS_OFFSET(29, 17)
/* pps [cpts genf1] in17 -> out35 [SYNC1_OUT pin] */
TS_OFFSET(35, 17)
>;
};
};
Pps signal output from SYNC1_OUT,when enable pps,and can not generate interrupt.
46000000.ethernet is set,and irq is created.
am65-cpts.c drivers/net/ethernet/ti
struct am65_cpts *am65_cpts_create(struct device *dev, void __iomem *regs,
struct device_node *node)
{
struct am65_cpts *cpts;
int ret, i;
cpts = devm_kzalloc(dev, sizeof(*cpts), GFP_KERNEL);
if (!cpts)
return ERR_PTR(-ENOMEM);
cpts->dev = dev;
cpts->reg = (struct am65_cpts_regs __iomem *)regs;
cpts->irq = of_irq_get_byname(node, "cpts"); //generate irq
if (cpts->irq <= 0) {
ret = cpts->irq ?: -ENXIO;
if (ret != -EPROBE_DEFER)
dev_err(dev, "Failed to get IRQ number (err = %d)\n",
ret);
return ERR_PTR(ret);
}
dev_info(dev, "cpts irq is %d\n", cpts->irq);
ret = am65_cpts_of_parse(cpts, node);
if (ret)
return ERR_PTR(ret);
mutex_init(&cpts->ptp_clk_lock);
INIT_LIST_HEAD(&cpts->events);
INIT_LIST_HEAD(&cpts->pool);
spin_lock_init(&cpts->lock);
skb_queue_head_init(&cpts->txq);
for (i = 0; i < AM65_CPTS_MAX_EVENTS; i++)
list_add(&cpts->pool_data[i].list, &cpts->pool);
cpts->refclk = devm_get_clk_from_child(dev, node, "cpts");
if (IS_ERR(cpts->refclk)) {
ret = PTR_ERR(cpts->refclk);
if (ret != -EPROBE_DEFER)
dev_err(dev, "Failed to get refclk %d\n", ret);
return ERR_PTR(ret);
}
ret = clk_prepare_enable(cpts->refclk);
if (ret) {
dev_err(dev, "Failed to enable refclk %d\n", ret);
return ERR_PTR(ret);
}
cpts->refclk_freq = clk_get_rate(cpts->refclk);
am65_ptp_info.max_adj = cpts->refclk_freq / AM65_CPTS_MIN_PPM;
cpts->ptp_info = am65_ptp_info;
if (cpts->ext_ts_inputs)
cpts->ptp_info.n_ext_ts = cpts->ext_ts_inputs;
if (cpts->genf_num)
cpts->ptp_info.n_per_out = cpts->genf_num;
if (cpts->pps_present)
cpts->ptp_info.pps = 1;
am65_cpts_set_add_val(cpts);
am65_cpts_write32(cpts, AM65_CPTS_CONTROL_EN |
AM65_CPTS_CONTROL_64MODE |
AM65_CPTS_CONTROL_TX_GENF_CLR_EN,
control);
am65_cpts_write32(cpts, AM65_CPTS_INT_ENABLE_TS_PEND_EN, int_enable);
/* set time to the current system time */
am65_cpts_settime(cpts, ktime_to_ns(ktime_get_real()));
cpts->ptp_clock = ptp_clock_register(&cpts->ptp_info, cpts->dev);
if (IS_ERR_OR_NULL(cpts->ptp_clock)) {
dev_err(dev, "Failed to register ptp clk %ld\n",
PTR_ERR(cpts->ptp_clock));
ret = cpts->ptp_clock ? PTR_ERR(cpts->ptp_clock) : -ENODEV;
goto refclk_disable;
}
cpts->phc_index = ptp_clock_index(cpts->ptp_clock);
ret = devm_add_action_or_reset(dev, am65_cpts_release, cpts);
if (ret) {
dev_err(dev, "failed to add ptpclk reset action %d", ret);
return ERR_PTR(ret);
}
ret = devm_request_threaded_irq(dev, cpts->irq, NULL, //irq request
am65_cpts_interrupt,
IRQF_ONESHOT, dev_name(dev), cpts);
if (ret < 0) {
dev_err(cpts->dev, "error attaching irq %d\n", ret);
return ERR_PTR(ret);
}
dev_info(dev, "CPTS ver 0x%08x, freq:%u, add_val:%u pps:%d\n",
am65_cpts_read32(cpts, idver),
cpts->refclk_freq, cpts->ts_add_val, cpts->pps_present);
return cpts;
refclk_disable:
clk_disable_unprepare(cpts->refclk);
return ERR_PTR(ret);
}
EXPORT_SYMBOL_GPL(am65_cpts_create);
604: 0 0 GICv3 890 Level 46000000.ethernet
There is no any irq when enable pps.
How to resolve the problem?