Пример #1
0
static void mtt_reset(SkelDrvrModuleContext *mcon)
{
	InsLibIntrDesc *isr = mcon->Modld->Isr;
	struct udata	*udata = mcon->UserData;
	unsigned long	flags;

	cdcm_spin_lock_irqsave(&udata->iolock, flags);
	/* quiesce the module */
	__mtt_quiesce(mcon);

	/* reset the module */
	__mtt_cmd(mcon, MttDrvrCommandRESET, 1);
	__mtt_cmd(mcon, MttDrvrCommandENABLE, 1);
	udata->EnabledOutput = 1;
	cdcm_spin_unlock_irqrestore(&udata->iolock, flags);

	usec_sleep(100);

	/*
	 * re-configure the interrupt level
	 * Note that the vector and level share the register
	 */
	if (isr) {
		mtt_writew(mcon, MTT_INTR, isr->Vector |
			mtt_shift_intr_level(isr->Level));
	}
}
Пример #2
0
/* Ensure the command is executed atomically by acquiring the module's iolock */
static inline void
mtt_cmd(SkelDrvrModuleContext *mcon, uint32_t cmd, uint32_t val)
{
	struct udata	*udata = mcon->UserData;
	unsigned long	flags;

	cdcm_spin_lock_irqsave(&udata->iolock, flags);
	__mtt_cmd(mcon, cmd, val);
	cdcm_spin_unlock_irqrestore(&udata->iolock, flags);
}
Пример #3
0
static void mtt_gs_utc(SkelDrvrModuleContext *mcon, MttDrvrTime *utc, int set)
{
	struct udata	*udata = mcon->UserData;
	unsigned long	flags;

	cdcm_spin_lock_irqsave(&udata->iolock, flags);
	if (set) {
		__mtt_cmd(mcon, MttDrvrCommandSET_UTC, utc->Second);
	} else {
		/* reading the ms register causes the seconds to be latched */
		utc->MilliSecond = mtt_readw(mcon, MTT_MSEC);
		cdcm_wmb();
		utc->Second = mtt_readw(mcon, MTT_SEC);
	}
	cdcm_spin_unlock_irqrestore(&udata->iolock, flags);
}