]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
Merge branch 'dpaa2-ptp-support-external-trigger-event'
authorDavid S. Miller <davem@davemloft.net>
Mon, 16 Dec 2019 23:56:41 +0000 (15:56 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 16 Dec 2019 23:56:41 +0000 (15:56 -0800)
Yangbo Lu says:

====================
dpaa2-ptp: support external trigger event

This patch-set is to add external trigger event support for
dpaa2-ptp driver since MC firmware has supported external
trigger interrupt with a new v2 dprtc_set_irq_mask() API.
And extts_clean_up() function in ptp_qoriq driver needs to be
exported with minor fixes for dpaa2-ptp reusing.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/freescale/dpaa2/dpaa2-ptp.c
drivers/net/ethernet/freescale/dpaa2/dprtc-cmd.h
drivers/net/ethernet/freescale/dpaa2/dprtc.h
drivers/ptp/ptp_qoriq.c
include/linux/fsl/ptp_qoriq.h

index a9503aea527f54853720eb8aeb457f4720e7eb5b..a0061e9299088e14337b594e7dc226721fd1ad6a 100644 (file)
@@ -27,6 +27,20 @@ static int dpaa2_ptp_enable(struct ptp_clock_info *ptp,
        mc_dev = to_fsl_mc_device(dev);
 
        switch (rq->type) {
+       case PTP_CLK_REQ_EXTTS:
+               switch (rq->extts.index) {
+               case 0:
+                       bit = DPRTC_EVENT_ETS1;
+                       break;
+               case 1:
+                       bit = DPRTC_EVENT_ETS2;
+                       break;
+               default:
+                       return -EINVAL;
+               }
+               if (on)
+                       extts_clean_up(ptp_qoriq, rq->extts.index, false);
+               break;
        case PTP_CLK_REQ_PPS:
                bit = DPRTC_EVENT_PPS;
                break;
@@ -96,6 +110,12 @@ static irqreturn_t dpaa2_ptp_irq_handler_thread(int irq, void *priv)
                ptp_clock_event(ptp_qoriq->clock, &event);
        }
 
+       if (status & DPRTC_EVENT_ETS1)
+               extts_clean_up(ptp_qoriq, 0, true);
+
+       if (status & DPRTC_EVENT_ETS2)
+               extts_clean_up(ptp_qoriq, 1, true);
+
        err = dprtc_clear_irq_status(mc_dev->mc_io, 0, mc_dev->mc_handle,
                                     DPRTC_IRQ_INDEX, status);
        if (unlikely(err)) {
index 4ac05bfef338098b2bba5f1c697b36f816107ce8..96ffeb948f088a2488a0ebbf3bcc18ac7710c582 100644 (file)
@@ -9,9 +9,11 @@
 
 /* Command versioning */
 #define DPRTC_CMD_BASE_VERSION         1
+#define DPRTC_CMD_VERSION_2            2
 #define DPRTC_CMD_ID_OFFSET            4
 
 #define DPRTC_CMD(id)  (((id) << DPRTC_CMD_ID_OFFSET) | DPRTC_CMD_BASE_VERSION)
+#define DPRTC_CMD_V2(id) (((id) << DPRTC_CMD_ID_OFFSET) | DPRTC_CMD_VERSION_2)
 
 /* Command IDs */
 #define DPRTC_CMDID_CLOSE                      DPRTC_CMD(0x800)
@@ -19,7 +21,7 @@
 
 #define DPRTC_CMDID_SET_IRQ_ENABLE             DPRTC_CMD(0x012)
 #define DPRTC_CMDID_GET_IRQ_ENABLE             DPRTC_CMD(0x013)
-#define DPRTC_CMDID_SET_IRQ_MASK               DPRTC_CMD(0x014)
+#define DPRTC_CMDID_SET_IRQ_MASK               DPRTC_CMD_V2(0x014)
 #define DPRTC_CMDID_GET_IRQ_MASK               DPRTC_CMD(0x015)
 #define DPRTC_CMDID_GET_IRQ_STATUS             DPRTC_CMD(0x016)
 #define DPRTC_CMDID_CLEAR_IRQ_STATUS           DPRTC_CMD(0x017)
index 311c184e1aef675f02ea14892225ce0947d3baee..05c413719e555f8f166eec53258cc77bdf8b8750 100644 (file)
@@ -20,6 +20,8 @@ struct fsl_mc_io;
 #define DPRTC_IRQ_INDEX                0
 
 #define DPRTC_EVENT_PPS                0x08000000
+#define DPRTC_EVENT_ETS1       0x00800000
+#define DPRTC_EVENT_ETS2       0x00400000
 
 int dprtc_open(struct fsl_mc_io *mc_io,
               u32 cmd_flags,
index a577218d1ab716fc9367e5e4a02289268a7f8ec7..b27c46ebfc8f29af6e35b0be05ca975fe651ae67 100644 (file)
@@ -74,14 +74,13 @@ static void set_fipers(struct ptp_qoriq *ptp_qoriq)
        ptp_qoriq->write(&regs->fiper_regs->tmr_fiper2, ptp_qoriq->tmr_fiper2);
 }
 
-static int extts_clean_up(struct ptp_qoriq *ptp_qoriq, int index,
-                         bool update_event)
+int extts_clean_up(struct ptp_qoriq *ptp_qoriq, int index, bool update_event)
 {
        struct ptp_qoriq_registers *regs = &ptp_qoriq->regs;
        struct ptp_clock_event event;
        void __iomem *reg_etts_l;
        void __iomem *reg_etts_h;
-       u32 valid, stat, lo, hi;
+       u32 valid, lo, hi;
 
        switch (index) {
        case 0:
@@ -101,6 +100,10 @@ static int extts_clean_up(struct ptp_qoriq *ptp_qoriq, int index,
        event.type = PTP_CLOCK_EXTTS;
        event.index = index;
 
+       if (ptp_qoriq->extts_fifo_support)
+               if (!(ptp_qoriq->read(&regs->ctrl_regs->tmr_stat) & valid))
+                       return 0;
+
        do {
                lo = ptp_qoriq->read(reg_etts_l);
                hi = ptp_qoriq->read(reg_etts_h);
@@ -111,11 +114,13 @@ static int extts_clean_up(struct ptp_qoriq *ptp_qoriq, int index,
                        ptp_clock_event(ptp_qoriq->clock, &event);
                }
 
-               stat = ptp_qoriq->read(&regs->ctrl_regs->tmr_stat);
-       } while (ptp_qoriq->extts_fifo_support && (stat & valid));
+               if (!ptp_qoriq->extts_fifo_support)
+                       break;
+       } while (ptp_qoriq->read(&regs->ctrl_regs->tmr_stat) & valid);
 
        return 0;
 }
+EXPORT_SYMBOL_GPL(extts_clean_up);
 
 /*
  * Interrupt service routine
index 992bf9fa17298ca6d7a8cfda6480a13a01ee876c..b0b743563f432f4fb7e08596012f1f7b6434c494 100644 (file)
@@ -192,6 +192,7 @@ int ptp_qoriq_settime(struct ptp_clock_info *ptp,
                      const struct timespec64 *ts);
 int ptp_qoriq_enable(struct ptp_clock_info *ptp,
                     struct ptp_clock_request *rq, int on);
+int extts_clean_up(struct ptp_qoriq *ptp_qoriq, int index, bool update_event);
 #ifdef CONFIG_DEBUG_FS
 void ptp_qoriq_create_debugfs(struct ptp_qoriq *ptp_qoriq);
 void ptp_qoriq_remove_debugfs(struct ptp_qoriq *ptp_qoriq);