162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef _M68K_DIV64_H
362306a36Sopenharmony_ci#define _M68K_DIV64_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#ifdef CONFIG_CPU_HAS_NO_MULDIV64
662306a36Sopenharmony_ci#include <asm-generic/div64.h>
762306a36Sopenharmony_ci#else
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/types.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci/* n = n / base; return rem; */
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#define do_div(n, base) ({					\
1462306a36Sopenharmony_ci	union {							\
1562306a36Sopenharmony_ci		unsigned long n32[2];				\
1662306a36Sopenharmony_ci		unsigned long long n64;				\
1762306a36Sopenharmony_ci	} __n;							\
1862306a36Sopenharmony_ci	unsigned long __rem, __upper;				\
1962306a36Sopenharmony_ci	unsigned long __base = (base);				\
2062306a36Sopenharmony_ci								\
2162306a36Sopenharmony_ci	__n.n64 = (n);						\
2262306a36Sopenharmony_ci	if ((__upper = __n.n32[0])) {				\
2362306a36Sopenharmony_ci		asm ("divul.l %2,%1:%0"				\
2462306a36Sopenharmony_ci		     : "=d" (__n.n32[0]), "=d" (__upper)	\
2562306a36Sopenharmony_ci		     : "d" (__base), "0" (__n.n32[0]));		\
2662306a36Sopenharmony_ci	}							\
2762306a36Sopenharmony_ci	asm ("divu.l %2,%1:%0"					\
2862306a36Sopenharmony_ci	     : "=d" (__n.n32[1]), "=d" (__rem)			\
2962306a36Sopenharmony_ci	     : "d" (__base), "1" (__upper), "0" (__n.n32[1]));	\
3062306a36Sopenharmony_ci	(n) = __n.n64;						\
3162306a36Sopenharmony_ci	__rem;							\
3262306a36Sopenharmony_ci})
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci/* defining this stops the unused helper function from being built */
3562306a36Sopenharmony_ci#define __div64_32 __div64_32
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci#endif /* CONFIG_CPU_HAS_NO_MULDIV64 */
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci#endif /* _M68K_DIV64_H */
40