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: David S. Miller <davem@davemloft.net>
This commit is contained in:
Коммит
0247743251
|
@ -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)) {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -74,14 +74,13 @@ static void set_fipers(struct ptp_qoriq *ptp_qoriq)
|
|||
ptp_qoriq->write(®s->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(®s->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(®s->ctrl_regs->tmr_stat);
|
||||
} while (ptp_qoriq->extts_fifo_support && (stat & valid));
|
||||
if (!ptp_qoriq->extts_fifo_support)
|
||||
break;
|
||||
} while (ptp_qoriq->read(®s->ctrl_regs->tmr_stat) & valid);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(extts_clean_up);
|
||||
|
||||
/*
|
||||
* Interrupt service routine
|
||||
|
|
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче