Commit 02477432 authored by David S. Miller's avatar David S. Miller

Merge branch 'dpaa2-ptp-support-external-trigger-event'

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: default avatarDavid S. Miller <davem@davemloft.net>
parents 0e627190 17568c62
...@@ -27,6 +27,20 @@ static int dpaa2_ptp_enable(struct ptp_clock_info *ptp, ...@@ -27,6 +27,20 @@ static int dpaa2_ptp_enable(struct ptp_clock_info *ptp,
mc_dev = to_fsl_mc_device(dev); mc_dev = to_fsl_mc_device(dev);
switch (rq->type) { 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: case PTP_CLK_REQ_PPS:
bit = DPRTC_EVENT_PPS; bit = DPRTC_EVENT_PPS;
break; break;
...@@ -96,6 +110,12 @@ static irqreturn_t dpaa2_ptp_irq_handler_thread(int irq, void *priv) ...@@ -96,6 +110,12 @@ static irqreturn_t dpaa2_ptp_irq_handler_thread(int irq, void *priv)
ptp_clock_event(ptp_qoriq->clock, &event); 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, err = dprtc_clear_irq_status(mc_dev->mc_io, 0, mc_dev->mc_handle,
DPRTC_IRQ_INDEX, status); DPRTC_IRQ_INDEX, status);
if (unlikely(err)) { if (unlikely(err)) {
......
...@@ -9,9 +9,11 @@ ...@@ -9,9 +9,11 @@
/* Command versioning */ /* Command versioning */
#define DPRTC_CMD_BASE_VERSION 1 #define DPRTC_CMD_BASE_VERSION 1
#define DPRTC_CMD_VERSION_2 2
#define DPRTC_CMD_ID_OFFSET 4 #define DPRTC_CMD_ID_OFFSET 4
#define DPRTC_CMD(id) (((id) << DPRTC_CMD_ID_OFFSET) | DPRTC_CMD_BASE_VERSION) #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 */ /* Command IDs */
#define DPRTC_CMDID_CLOSE DPRTC_CMD(0x800) #define DPRTC_CMDID_CLOSE DPRTC_CMD(0x800)
...@@ -19,7 +21,7 @@ ...@@ -19,7 +21,7 @@
#define DPRTC_CMDID_SET_IRQ_ENABLE DPRTC_CMD(0x012) #define DPRTC_CMDID_SET_IRQ_ENABLE DPRTC_CMD(0x012)
#define DPRTC_CMDID_GET_IRQ_ENABLE DPRTC_CMD(0x013) #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_MASK DPRTC_CMD(0x015)
#define DPRTC_CMDID_GET_IRQ_STATUS DPRTC_CMD(0x016) #define DPRTC_CMDID_GET_IRQ_STATUS DPRTC_CMD(0x016)
#define DPRTC_CMDID_CLEAR_IRQ_STATUS DPRTC_CMD(0x017) #define DPRTC_CMDID_CLEAR_IRQ_STATUS DPRTC_CMD(0x017)
......
...@@ -20,6 +20,8 @@ struct fsl_mc_io; ...@@ -20,6 +20,8 @@ struct fsl_mc_io;
#define DPRTC_IRQ_INDEX 0 #define DPRTC_IRQ_INDEX 0
#define DPRTC_EVENT_PPS 0x08000000 #define DPRTC_EVENT_PPS 0x08000000
#define DPRTC_EVENT_ETS1 0x00800000
#define DPRTC_EVENT_ETS2 0x00400000
int dprtc_open(struct fsl_mc_io *mc_io, int dprtc_open(struct fsl_mc_io *mc_io,
u32 cmd_flags, u32 cmd_flags,
......
...@@ -74,14 +74,13 @@ static void set_fipers(struct ptp_qoriq *ptp_qoriq) ...@@ -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); ptp_qoriq->write(&regs->fiper_regs->tmr_fiper2, ptp_qoriq->tmr_fiper2);
} }
static int extts_clean_up(struct ptp_qoriq *ptp_qoriq, int index, int extts_clean_up(struct ptp_qoriq *ptp_qoriq, int index, bool update_event)
bool update_event)
{ {
struct ptp_qoriq_registers *regs = &ptp_qoriq->regs; struct ptp_qoriq_registers *regs = &ptp_qoriq->regs;
struct ptp_clock_event event; struct ptp_clock_event event;
void __iomem *reg_etts_l; void __iomem *reg_etts_l;
void __iomem *reg_etts_h; void __iomem *reg_etts_h;
u32 valid, stat, lo, hi; u32 valid, lo, hi;
switch (index) { switch (index) {
case 0: case 0:
...@@ -101,6 +100,10 @@ static int extts_clean_up(struct ptp_qoriq *ptp_qoriq, int index, ...@@ -101,6 +100,10 @@ static int extts_clean_up(struct ptp_qoriq *ptp_qoriq, int index,
event.type = PTP_CLOCK_EXTTS; event.type = PTP_CLOCK_EXTTS;
event.index = index; event.index = index;
if (ptp_qoriq->extts_fifo_support)
if (!(ptp_qoriq->read(&regs->ctrl_regs->tmr_stat) & valid))
return 0;
do { do {
lo = ptp_qoriq->read(reg_etts_l); lo = ptp_qoriq->read(reg_etts_l);
hi = ptp_qoriq->read(reg_etts_h); hi = ptp_qoriq->read(reg_etts_h);
...@@ -111,11 +114,13 @@ static int extts_clean_up(struct ptp_qoriq *ptp_qoriq, int index, ...@@ -111,11 +114,13 @@ static int extts_clean_up(struct ptp_qoriq *ptp_qoriq, int index,
ptp_clock_event(ptp_qoriq->clock, &event); ptp_clock_event(ptp_qoriq->clock, &event);
} }
stat = ptp_qoriq->read(&regs->ctrl_regs->tmr_stat); if (!ptp_qoriq->extts_fifo_support)
} while (ptp_qoriq->extts_fifo_support && (stat & valid)); break;
} while (ptp_qoriq->read(&regs->ctrl_regs->tmr_stat) & valid);
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(extts_clean_up);
/* /*
* Interrupt service routine * Interrupt service routine
......
...@@ -192,6 +192,7 @@ int ptp_qoriq_settime(struct ptp_clock_info *ptp, ...@@ -192,6 +192,7 @@ int ptp_qoriq_settime(struct ptp_clock_info *ptp,
const struct timespec64 *ts); const struct timespec64 *ts);
int ptp_qoriq_enable(struct ptp_clock_info *ptp, int ptp_qoriq_enable(struct ptp_clock_info *ptp,
struct ptp_clock_request *rq, int on); 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 #ifdef CONFIG_DEBUG_FS
void ptp_qoriq_create_debugfs(struct ptp_qoriq *ptp_qoriq); void ptp_qoriq_create_debugfs(struct ptp_qoriq *ptp_qoriq);
void ptp_qoriq_remove_debugfs(struct ptp_qoriq *ptp_qoriq); void ptp_qoriq_remove_debugfs(struct ptp_qoriq *ptp_qoriq);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment