18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci#include <linux/compiler.h> 38c2ecf20Sopenharmony_ci#include <linux/gcd.h> 48c2ecf20Sopenharmony_ci#include <linux/export.h> 58c2ecf20Sopenharmony_ci#include <linux/lcm.h> 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci/* Lowest common multiple */ 88c2ecf20Sopenharmony_ciunsigned long lcm(unsigned long a, unsigned long b) 98c2ecf20Sopenharmony_ci{ 108c2ecf20Sopenharmony_ci if (a && b) 118c2ecf20Sopenharmony_ci return (a / gcd(a, b)) * b; 128c2ecf20Sopenharmony_ci else 138c2ecf20Sopenharmony_ci return 0; 148c2ecf20Sopenharmony_ci} 158c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(lcm); 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ciunsigned long lcm_not_zero(unsigned long a, unsigned long b) 188c2ecf20Sopenharmony_ci{ 198c2ecf20Sopenharmony_ci unsigned long l = lcm(a, b); 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci if (l) 228c2ecf20Sopenharmony_ci return l; 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci return (b ? : a); 258c2ecf20Sopenharmony_ci} 268c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(lcm_not_zero); 27