]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - arch/arm/cpu/armv7/omap-common/utils.c
mxc_ipuv3: fix memory alignment of framebuffer
[karo-tx-uboot.git] / arch / arm / cpu / armv7 / omap-common / utils.c
1 /*
2  * Copyright 2011 Linaro Limited
3  * Aneesh V <aneesh@ti.com>
4  *
5  * See file CREDITS for list of people who contributed to this
6  * project.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License as
10  * published by the Free Software Foundation; either version 2 of
11  * the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21  * MA 02111-1307 USA
22  */
23 #include <common.h>
24 static void do_cancel_out(u32 *num, u32 *den, u32 factor)
25 {
26         while (1) {
27                 if (((*num)/factor*factor == (*num)) &&
28                    ((*den)/factor*factor == (*den))) {
29                         (*num) /= factor;
30                         (*den) /= factor;
31                 } else
32                         break;
33         }
34 }
35
36 /*
37  * Cancel out the denominator and numerator of a fraction
38  * to get smaller numerator and denominator.
39  */
40 void cancel_out(u32 *num, u32 *den, u32 den_limit)
41 {
42         do_cancel_out(num, den, 2);
43         do_cancel_out(num, den, 3);
44         do_cancel_out(num, den, 5);
45         do_cancel_out(num, den, 7);
46         do_cancel_out(num, den, 11);
47         do_cancel_out(num, den, 13);
48         do_cancel_out(num, den, 17);
49         while ((*den) > den_limit) {
50                 *num /= 2;
51                 /*
52                  * Round up the denominator so that the final fraction
53                  * (num/den) is always <= the desired value
54                  */
55                 *den = (*den + 1) / 2;
56         }
57 }