On 04.06.2024 15:15, Diogo Ivo wrote: > Enable PTP support for AM65x SR1.0 devices by registering with the IEP > infrastructure in order to expose a PTP clock to userspace. > > Reviewed-by: Jacob Keller <jacob.e.keller@xxxxxxxxx> > Signed-off-by: Diogo Ivo <diogo.ivo@xxxxxxxxxxx> > --- Reviewed-by: Wojciech Drewek <wojciech.drewek@xxxxxxxxx> > drivers/net/ethernet/ti/icssg/icssg_prueth_sr1.c | 51 +++++++++++++++++++++++- > 1 file changed, 50 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth_sr1.c b/drivers/net/ethernet/ti/icssg/icssg_prueth_sr1.c > index 7b3304bbd7fc..fa98bdb11ece 100644 > --- a/drivers/net/ethernet/ti/icssg/icssg_prueth_sr1.c > +++ b/drivers/net/ethernet/ti/icssg/icssg_prueth_sr1.c > @@ -1011,16 +1011,44 @@ static int prueth_probe(struct platform_device *pdev) > dev_dbg(dev, "sram: pa %llx va %p size %zx\n", prueth->msmcram.pa, > prueth->msmcram.va, prueth->msmcram.size); > > + prueth->iep0 = icss_iep_get_idx(np, 0); > + if (IS_ERR(prueth->iep0)) { > + ret = dev_err_probe(dev, PTR_ERR(prueth->iep0), > + "iep0 get failed\n"); > + goto free_pool; > + } > + > + prueth->iep1 = icss_iep_get_idx(np, 1); > + if (IS_ERR(prueth->iep1)) { > + ret = dev_err_probe(dev, PTR_ERR(prueth->iep1), > + "iep1 get failed\n"); > + goto put_iep0; > + } > + > + ret = icss_iep_init(prueth->iep0, NULL, NULL, 0); > + if (ret) { > + dev_err_probe(dev, ret, "failed to init iep0\n"); > + goto put_iep; > + } > + > + ret = icss_iep_init(prueth->iep1, NULL, NULL, 0); > + if (ret) { > + dev_err_probe(dev, ret, "failed to init iep1\n"); > + goto exit_iep0; > + } > + > if (eth0_node) { > ret = prueth_netdev_init(prueth, eth0_node); > if (ret) { > dev_err_probe(dev, ret, "netdev init %s failed\n", > eth0_node->name); > - goto free_pool; > + goto exit_iep; > } > > if (of_find_property(eth0_node, "ti,half-duplex-capable", NULL)) > prueth->emac[PRUETH_MAC0]->half_duplex = 1; > + > + prueth->emac[PRUETH_MAC0]->iep = prueth->iep0; > } > > if (eth1_node) { > @@ -1033,6 +1061,8 @@ static int prueth_probe(struct platform_device *pdev) > > if (of_find_property(eth1_node, "ti,half-duplex-capable", NULL)) > prueth->emac[PRUETH_MAC1]->half_duplex = 1; > + > + prueth->emac[PRUETH_MAC1]->iep = prueth->iep1; > } > > /* register the network devices */ > @@ -1091,6 +1121,19 @@ static int prueth_probe(struct platform_device *pdev) > prueth_netdev_exit(prueth, eth_node); > } > > +exit_iep: > + icss_iep_exit(prueth->iep1); > +exit_iep0: > + icss_iep_exit(prueth->iep0); > + > +put_iep: > + icss_iep_put(prueth->iep1); > + > +put_iep0: > + icss_iep_put(prueth->iep0); > + prueth->iep0 = NULL; > + prueth->iep1 = NULL; > + > free_pool: > gen_pool_free(prueth->sram_pool, > (unsigned long)prueth->msmcram.va, msmc_ram_size); > @@ -1138,6 +1181,12 @@ static void prueth_remove(struct platform_device *pdev) > prueth_netdev_exit(prueth, eth_node); > } > > + icss_iep_exit(prueth->iep1); > + icss_iep_exit(prueth->iep0); > + > + icss_iep_put(prueth->iep1); > + icss_iep_put(prueth->iep0); > + > gen_pool_free(prueth->sram_pool, > (unsigned long)prueth->msmcram.va, > MSMC_RAM_SIZE_SR1); >