This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TDA4VM: CPSW2G CPTS OUTPUT PPS

Other Parts Discussed in Thread: TDA4VM

How to test pps signal from TDA4VM?

https://software-dl.ti.com/jacinto7/esd/processor-sdk-linux-rt-jacinto7/08_01_00_02/exports/docs/linux/Foundational_Components/Kernel/Kernel_Drivers/Network/CPSW2g.html#

Example of using Time stamp external events

device tree can be change :

&timesync_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?