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

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
Loading
Loading
Loading
Loading
+20 −0
Original line number Original line Diff line number Diff line
@@ -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)
		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)) {
+3 −1
Original line number Original line Diff line number Diff line
@@ -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 @@


#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)
+2 −0
Original line number Original line Diff line number Diff line
@@ -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,
+10 −5
Original line number Original line Diff line number Diff line
@@ -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,
	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,
			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
+1 −0
Original line number Original line Diff line number Diff line
@@ -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);