11.8Sriastrad/*	$NetBSD: delay.h,v 1.8 2021/12/19 09:43:49 riastradh Exp $	*/
21.2Sriastrad
31.2Sriastrad/*-
41.2Sriastrad * Copyright (c) 2013 The NetBSD Foundation, Inc.
51.2Sriastrad * All rights reserved.
61.2Sriastrad *
71.2Sriastrad * This code is derived from software contributed to The NetBSD Foundation
81.2Sriastrad * by Taylor R. Campbell.
91.2Sriastrad *
101.2Sriastrad * Redistribution and use in source and binary forms, with or without
111.2Sriastrad * modification, are permitted provided that the following conditions
121.2Sriastrad * are met:
131.2Sriastrad * 1. Redistributions of source code must retain the above copyright
141.2Sriastrad *    notice, this list of conditions and the following disclaimer.
151.2Sriastrad * 2. Redistributions in binary form must reproduce the above copyright
161.2Sriastrad *    notice, this list of conditions and the following disclaimer in the
171.2Sriastrad *    documentation and/or other materials provided with the distribution.
181.2Sriastrad *
191.2Sriastrad * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
201.2Sriastrad * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
211.2Sriastrad * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
221.2Sriastrad * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
231.2Sriastrad * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
241.2Sriastrad * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
251.2Sriastrad * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
261.2Sriastrad * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
271.2Sriastrad * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
281.2Sriastrad * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
291.2Sriastrad * POSSIBILITY OF SUCH DAMAGE.
301.2Sriastrad */
311.2Sriastrad
321.2Sriastrad#ifndef _LINUX_DELAY_H_
331.2Sriastrad#define _LINUX_DELAY_H_
341.2Sriastrad
351.2Sriastrad#include <sys/param.h>
361.2Sriastrad#include <sys/kernel.h>
371.2Sriastrad#include <sys/proc.h>
381.2Sriastrad
391.8Sriastrad#include <linux/kernel.h>
401.8Sriastrad
411.2Sriastrad#define	MAX_UDELAY_MS	5
421.2Sriastrad
431.2Sriastradstatic inline void
441.2Sriastradudelay(unsigned int usec)
451.2Sriastrad{
461.2Sriastrad	DELAY(usec);
471.2Sriastrad}
481.2Sriastrad
491.2Sriastradstatic inline void
501.3Sriastradusleep_range(unsigned long minimum, unsigned long maximum __unused)
511.3Sriastrad{
521.3Sriastrad	DELAY(minimum);
531.3Sriastrad}
541.3Sriastrad
551.3Sriastradstatic inline void
561.2Sriastradmdelay(unsigned int msec)
571.2Sriastrad{
581.2Sriastrad
591.2Sriastrad	if (msec < MAX_UDELAY_MS)
601.2Sriastrad		udelay(msec * 1000);
611.2Sriastrad	else
621.2Sriastrad		while (msec--)
631.2Sriastrad			udelay(1000);
641.2Sriastrad}
651.2Sriastrad
661.2Sriastradstatic inline void
671.2Sriastradmsleep(unsigned int msec)
681.2Sriastrad{
691.4Sskrll	if (cold ||
701.6Sriastrad	    ((hz < 1000) && (msec < (1000/(unsigned)hz))))
711.2Sriastrad		mdelay(msec);
721.2Sriastrad	else
731.2Sriastrad		(void)kpause("lnxmslep", false, mstohz(msec), NULL);
741.2Sriastrad}
751.2Sriastrad
761.3Sriastradstatic inline void
771.3Sriastradndelay(unsigned int nsec)
781.3Sriastrad{
791.3Sriastrad
801.5Sriastrad	DELAY((nsec + 999) / 1000);
811.3Sriastrad}
821.3Sriastrad
831.2Sriastrad#endif  /* _LINUX_DELAY_H_ */
84