/*
 * Copyright (C) 2016 Allwinnertech
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * Adjustable factor-based clock implementation
 */

#include "clk-sun8iw15.h"

/*
 * freq table from hardware, need follow rules
 * 1)   each table  named as
 *      factor_pll1_tbl
 *      factor_pll2_tbl
 *      ...
 * 2) for each table line
 *      a) follow the format PLLx(n, k, m, p, d1, d2, freq), and keep the
 *         factors order
 *      b) if any factor not used, skip it
 *      c) the factor is the value to write registers, not means factor + 1
 *
 *      example
 *      PLL1(9, 0, 0, 2, 60000000) means PLL1(n, k, m, p, freq)
 *      PLLVIDEO0(3, 0, 96000000) means PLLVIDEO0(n, m, freq)
 *
 */

/* PLLCPU(n, m, p, freq)	F_N8X8_M0X2_P16x2 */
struct sunxi_clk_factor_freq factor_pllcpu_tbl[] = {
PLLCPU(11,     2,     72000000U),
PLLCPU(13,     2,     84000000U),
PLLCPU(15,     2,     96000000U),
PLLCPU(17,     2,     108000000U),
PLLCPU(19,     2,     120000000U),
PLLCPU(21,     2,     132000000U),
PLLCPU(23,     2,     144000000U),
PLLCPU(25,     2,     156000000U),
PLLCPU(27,     2,     168000000U),
PLLCPU(29,     2,     180000000U),
PLLCPU(31,     2,     192000000U),
PLLCPU(33,     2,     204000000U),
PLLCPU(35,     2,     216000000U),
PLLCPU(37,     2,     228000000U),
PLLCPU(39,     2,     240000000U),
PLLCPU(41,     2,     252000000U),
PLLCPU(43,     2,     264000000U),
PLLCPU(45,     2,     276000000U),
PLLCPU(11,     0,     288000000U),
PLLCPU(24,     1,     300000000U),
PLLCPU(12,     0,     312000000U),
PLLCPU(26,     1,     324000000U),
PLLCPU(13,     0,     336000000U),
PLLCPU(28,     1,     348000000U),
PLLCPU(14,     0,     360000000U),
PLLCPU(30,     1,     372000000U),
PLLCPU(15,     0,     384000000U),
PLLCPU(32,     1,     396000000U),
PLLCPU(16,     0,     408000000U),
PLLCPU(34,     1,     420000000U),
PLLCPU(17,     0,     432000000U),
PLLCPU(36,     1,     444000000U),
PLLCPU(18,     0,     456000000U),
PLLCPU(38,     1,     468000000U),
PLLCPU(19,     0,     480000000U),
PLLCPU(40,     1,     492000000U),
PLLCPU(20,     0,     504000000U),
PLLCPU(42,     1,     516000000U),
PLLCPU(21,     0,     528000000U),
PLLCPU(44,     1,     540000000U),
PLLCPU(22,     0,     552000000U),
PLLCPU(46,     1,     564000000U),
PLLCPU(23,     0,     576000000U),
PLLCPU(48,     1,     588000000U),
PLLCPU(24,     0,     600000000U),
PLLCPU(50,     1,     612000000U),
PLLCPU(25,     0,     624000000U),
PLLCPU(52,     1,     636000000U),
PLLCPU(26,     0,     648000000U),
PLLCPU(54,     1,     660000000U),
PLLCPU(27,     0,     672000000U),
PLLCPU(56,     1,     684000000U),
PLLCPU(28,     0,     696000000U),
PLLCPU(58,     1,     708000000U),
PLLCPU(29,     0,     720000000U),
PLLCPU(60,     1,     732000000U),
PLLCPU(30,     0,     744000000U),
PLLCPU(62,     1,     756000000U),
PLLCPU(31,     0,     768000000U),
PLLCPU(64,     1,     780000000U),
PLLCPU(32,     0,     792000000U),
PLLCPU(66,     1,     804000000U),
PLLCPU(33,     0,     816000000U),
PLLCPU(68,     1,     828000000U),
PLLCPU(34,     0,     840000000U),
PLLCPU(70,     1,     852000000U),
PLLCPU(35,     0,     864000000U),
PLLCPU(72,     1,     876000000U),
PLLCPU(36,     0,     888000000U),
PLLCPU(74,     1,     900000000U),
PLLCPU(37,     0,     912000000U),
PLLCPU(76,     1,     924000000U),
PLLCPU(38,     0,     936000000U),
PLLCPU(78,     1,     948000000U),
PLLCPU(39,     0,     960000000U),
PLLCPU(80,     1,     972000000U),
PLLCPU(40,     0,     984000000U),
PLLCPU(82,     1,     996000000U),
PLLCPU(41,     0,     1008000000U),
PLLCPU(84,     1,     1020000000U),
PLLCPU(42,     0,     1032000000U),
PLLCPU(86,     1,     1044000000U),
PLLCPU(43,     0,     1056000000U),
PLLCPU(88,     1,     1068000000U),
PLLCPU(44,     0,     1080000000U),
PLLCPU(90,     1,     1092000000U),
PLLCPU(45,     0,     1104000000U),
PLLCPU(92,     1,     1116000000U),
PLLCPU(46,     0,     1128000000U),
PLLCPU(94,     1,     1140000000U),
PLLCPU(47,     0,     1152000000U),
PLLCPU(96,     1,     1164000000U),
PLLCPU(48,     0,     1176000000U),
PLLCPU(98,     1,     1188000000U),
PLLCPU(49,     0,     1200000000U),
PLLCPU(100,     1,     1212000000U),
PLLCPU(50,     0,     1224000000U),
PLLCPU(102,     1,     1236000000U),
PLLCPU(104,     1,     1260000000U),
PLLCPU(106,     1,     1284000000U),
PLLCPU(108,     1,     1308000000U),
PLLCPU(110,     1,     1332000000U),
PLLCPU(112,     1,     1356000000U),
PLLCPU(114,     1,     1380000000U),
PLLCPU(116,     1,     1404000000U),
PLLCPU(118,     1,     1428000000U),
PLLCPU(120,     1,     1452000000U),
PLLCPU(122,     1,     1476000000U),
PLLCPU(124,     1,     1500000000U),
PLLCPU(126,     1,     1524000000U),
PLLCPU(128,     1,     1548000000U),
PLLCPU(130,     1,     1572000000U),
PLLCPU(132,     1,     1596000000U),
PLLCPU(134,     1,     1620000000U),
PLLCPU(136,     1,     1644000000U),
PLLCPU(138,     1,     1668000000U),
PLLCPU(140,     1,     1692000000U),
PLLCPU(142,     1,     1716000000U),
PLLCPU(144,     1,     1740000000U),
PLLCPU(146,     1,     1764000000U),
PLLCPU(148,     1,     1788000000U),
PLLCPU(150,     1,     1812000000U),
PLLCPU(152,     1,     1836000000U),
PLLCPU(154,     1,     1860000000U),
PLLCPU(156,     1,     1884000000U),
PLLCPU(158,     1,     1908000000U),
PLLCPU(160,     1,     1932000000U),
PLLCPU(162,     1,     1956000000U),
PLLCPU(164,     1,     1980000000U),
PLLCPU(166,     1,     2004000000U),
PLLCPU(168,     1,     2028000000U),
PLLCPU(170,     1,     2052000000U),
PLLCPU(172,     1,     2076000000U),
PLLCPU(174,     1,     2100000000U),
PLLCPU(176,     1,     2124000000U),
PLLCPU(178,     1,     2148000000U),
PLLCPU(180,     1,     2172000000U),
PLLCPU(182,     1,     2196000000U),
PLLCPU(184,     1,     2220000000U),
PLLCPU(186,     1,     2244000000U),
PLLCPU(188,     1,     2268000000U),
PLLCPU(190,     1,     2292000000U),
PLLCPU(192,     1,     2316000000U),
PLLCPU(194,     1,     2340000000U),
PLLCPU(196,     1,     2364000000U),
PLLCPU(198,     1,     2388000000U),
PLLCPU(200,     1,     2412000000U),
PLLCPU(202,     1,     2436000000U),
PLLCPU(204,     1,     2460000000U),
PLLCPU(206,     1,     2484000000U),
PLLCPU(208,     1,     2508000000U),
PLLCPU(210,     1,     2532000000U),
PLLCPU(212,     1,     2556000000U),
PLLCPU(106,     0,     2568000000U),
};
/*n  m1   m0   freq */
/* PLLDDR(n, d1, d2, freq)	F_N8X8_D1V1X1_D2V0X1 */
struct sunxi_clk_factor_freq factor_pllddr_tbl[] = {
PLLDDR(23,     0,     1,     288000000U),
PLLDDR(48,     1,     1,     294000000U),
PLLDDR(24,     0,     1,     300000000U),
PLLDDR(50,     1,     1,     306000000U),
PLLDDR(25,     0,     1,     312000000U),
PLLDDR(52,     1,     1,     318000000U),
PLLDDR(26,     0,     1,     324000000U),
PLLDDR(54,     1,     1,     330000000U),
PLLDDR(27,     0,     1,     336000000U),
PLLDDR(56,     1,     1,     342000000U),
PLLDDR(28,     0,     1,     348000000U),
PLLDDR(58,     1,     1,     354000000U),
PLLDDR(29,     0,     1,     360000000U),
PLLDDR(60,     1,     1,     366000000U),
PLLDDR(30,     0,     1,     372000000U),
PLLDDR(62,     1,     1,     378000000U),
PLLDDR(15,     0,     0,     384000000U),
PLLDDR(64,     1,     1,     390000000U),
PLLDDR(32,     0,     1,     396000000U),
PLLDDR(66,     1,     1,     402000000U),
PLLDDR(16,     0,     0,     408000000U),
PLLDDR(68,     1,     1,     414000000U),
PLLDDR(34,     0,     1,     420000000U),
PLLDDR(70,     1,     1,     426000000U),
PLLDDR(17,     0,     0,     432000000U),
PLLDDR(72,     1,     1,     438000000U),
PLLDDR(36,     0,     1,     444000000U),
PLLDDR(74,     1,     1,     450000000U),
PLLDDR(18,     0,     0,     456000000U),
PLLDDR(76,     1,     1,     462000000U),
PLLDDR(38,     0,     1,     468000000U),
PLLDDR(78,     1,     1,     474000000U),
PLLDDR(19,     0,     0,     480000000U),
PLLDDR(80,     1,     1,     486000000U),
PLLDDR(40,     0,     1,     492000000U),
PLLDDR(82,     1,     1,     498000000U),
PLLDDR(20,     0,     0,     504000000U),
PLLDDR(84,     1,     1,     510000000U),
PLLDDR(42,     0,     1,     516000000U),
PLLDDR(86,     1,     1,     522000000U),
PLLDDR(21,     0,     0,     528000000U),
PLLDDR(88,     1,     1,     534000000U),
PLLDDR(44,     0,     1,     540000000U),
PLLDDR(90,     1,     1,     546000000U),
PLLDDR(22,     0,     0,     552000000U),
PLLDDR(92,     1,     1,     558000000U),
PLLDDR(46,     0,     1,     564000000U),
PLLDDR(94,     1,     1,     570000000U),
PLLDDR(23,     0,     0,     576000000U),
PLLDDR(96,     1,     1,     582000000U),
PLLDDR(48,     0,     1,     588000000U),
PLLDDR(98,     1,     1,     594000000U),
PLLDDR(24,     0,     0,     600000000U),
PLLDDR(100,     1,     1,     606000000U),
PLLDDR(50,     0,     1,     612000000U),
PLLDDR(102,     1,     1,     618000000U),
PLLDDR(25,     0,     0,     624000000U),
PLLDDR(104,     1,     1,     630000000U),
PLLDDR(52,     0,     1,     636000000U),
PLLDDR(106,     1,     1,     642000000U),
PLLDDR(26,     0,     0,     648000000U),
PLLDDR(108,     1,     1,     654000000U),
PLLDDR(54,     0,     1,     660000000U),
PLLDDR(110,     1,     1,     666000000U),
PLLDDR(27,     0,     0,     672000000U),
PLLDDR(112,     1,     1,     678000000U),
PLLDDR(56,     0,     1,     684000000U),
PLLDDR(114,     1,     1,     690000000U),
PLLDDR(28,     0,     0,     696000000U),
PLLDDR(116,     1,     1,     702000000U),
PLLDDR(58,     0,     1,     708000000U),
PLLDDR(118,     1,     1,     714000000U),
PLLDDR(29,     0,     0,     720000000U),
PLLDDR(120,     1,     1,     726000000U),
PLLDDR(60,     0,     1,     732000000U),
PLLDDR(122,     1,     1,     738000000U),
PLLDDR(30,     0,     0,     744000000U),
PLLDDR(124,     1,     1,     750000000U),
PLLDDR(62,     0,     1,     756000000U),
PLLDDR(126,     1,     1,     762000000U),
PLLDDR(31,     0,     0,     768000000U),
PLLDDR(128,     1,     1,     774000000U),
PLLDDR(64,     0,     1,     780000000U),
PLLDDR(130,     1,     1,     786000000U),
PLLDDR(32,     0,     0,     792000000U),
PLLDDR(132,     1,     1,     798000000U),
PLLDDR(66,     0,     1,     804000000U),
PLLDDR(134,     1,     1,     810000000U),
PLLDDR(33,     0,     0,     816000000U),
PLLDDR(136,     1,     1,     822000000U),
PLLDDR(68,     0,     1,     828000000U),
PLLDDR(138,     1,     1,     834000000U),
PLLDDR(34,     0,     0,     840000000U),
PLLDDR(140,     1,     1,     846000000U),
PLLDDR(70,     0,     1,     852000000U),
PLLDDR(142,     1,     1,     858000000U),
PLLDDR(35,     0,     0,     864000000U),
PLLDDR(144,     1,     1,     870000000U),
PLLDDR(72,     0,     1,     876000000U),
PLLDDR(146,     1,     1,     882000000U),
PLLDDR(36,     0,     0,     888000000U),
PLLDDR(148,     1,     1,     894000000U),
PLLDDR(74,     0,     1,     900000000U),
PLLDDR(150,     1,     1,     906000000U),
PLLDDR(37,     0,     0,     912000000U),
PLLDDR(152,     1,     1,     918000000U),
PLLDDR(76,     0,     1,     924000000U),
PLLDDR(154,     1,     1,     930000000U),
PLLDDR(38,     0,     0,     936000000U),
PLLDDR(156,     1,     1,     942000000U),
PLLDDR(78,     0,     1,     948000000U),
PLLDDR(158,     1,     1,     954000000U),
PLLDDR(39,     0,     0,     960000000U),
PLLDDR(160,     1,     1,     966000000U),
PLLDDR(80,     0,     1,     972000000U),
PLLDDR(162,     1,     1,     978000000U),
PLLDDR(40,     0,     0,     984000000U),
PLLDDR(164,     1,     1,     990000000U),
PLLDDR(82,     0,     1,     996000000U),
PLLDDR(166,     1,     1,     1002000000U),
PLLDDR(41,     0,     0,     1008000000U),
PLLDDR(168,     1,     1,     1014000000U),
PLLDDR(84,     0,     1,     1020000000U),
PLLDDR(170,     1,     1,     1026000000U),
PLLDDR(42,     0,     0,     1032000000U),
PLLDDR(172,     1,     1,     1038000000U),
PLLDDR(86,     0,     1,     1044000000U),
PLLDDR(174,     1,     1,     1050000000U),
PLLDDR(43,     0,     0,     1056000000U),
PLLDDR(176,     1,     1,     1062000000U),
PLLDDR(88,     0,     1,     1068000000U),
PLLDDR(178,     1,     1,     1074000000U),
PLLDDR(44,     0,     0,     1080000000U),
PLLDDR(180,     1,     1,     1086000000U),
PLLDDR(90,     0,     1,     1092000000U),
PLLDDR(182,     1,     1,     1098000000U),
PLLDDR(45,     0,     0,     1104000000U),
PLLDDR(184,     1,     1,     1110000000U),
PLLDDR(92,     0,     1,     1116000000U),
PLLDDR(186,     1,     1,     1122000000U),
PLLDDR(46,     0,     0,     1128000000U),
PLLDDR(188,     1,     1,     1134000000U),
PLLDDR(94,     0,     1,     1140000000U),
PLLDDR(190,     1,     1,     1146000000U),
PLLDDR(47,     0,     0,     1152000000U),
PLLDDR(192,     1,     1,     1158000000U),
PLLDDR(96,     0,     1,     1164000000U),
PLLDDR(194,     1,     1,     1170000000U),
PLLDDR(48,     0,     0,     1176000000U),
PLLDDR(196,     1,     1,     1182000000U),
PLLDDR(98,     0,     1,     1188000000U),
PLLDDR(198,     1,     1,     1194000000U),
PLLDDR(49,     0,     0,     1200000000U),
PLLDDR(100,     1,     0,     1212000000U),
PLLDDR(50,     0,     0,     1224000000U),
PLLDDR(102,     1,     0,     1236000000U),
PLLDDR(51,     0,     0,     1248000000U),
PLLDDR(104,     1,     0,     1260000000U),
PLLDDR(52,     0,     0,     1272000000U),
PLLDDR(106,     1,     0,     1284000000U),
PLLDDR(53,     0,     0,     1296000000U),
PLLDDR(108,     1,     0,     1308000000U),
PLLDDR(54,     0,     0,     1320000000U),
PLLDDR(110,     1,     0,     1332000000U),
PLLDDR(55,     0,     0,     1344000000U),
PLLDDR(112,     1,     0,     1356000000U),
PLLDDR(56,     0,     0,     1368000000U),
PLLDDR(114,     1,     0,     1380000000U),
PLLDDR(57,     0,     0,     1392000000U),
PLLDDR(116,     1,     0,     1404000000U),
PLLDDR(58,     0,     0,     1416000000U),
PLLDDR(118,     1,     0,     1428000000U),
PLLDDR(59,     0,     0,     1440000000U),
PLLDDR(120,     1,     0,     1452000000U),
PLLDDR(60,     0,     0,     1464000000U),
PLLDDR(122,     1,     0,     1476000000U),
PLLDDR(61,     0,     0,     1488000000U),
PLLDDR(124,     1,     0,     1500000000U),
PLLDDR(62,     0,     0,     1512000000U),
PLLDDR(126,     1,     0,     1524000000U),
PLLDDR(63,     0,     0,     1536000000U),
PLLDDR(128,     1,     0,     1548000000U),
PLLDDR(64,     0,     0,     1560000000U),
PLLDDR(130,     1,     0,     1572000000U),
PLLDDR(65,     0,     0,     1584000000U),
PLLDDR(132,     1,     0,     1596000000U),
PLLDDR(66,     0,     0,     1608000000U),
PLLDDR(134,     1,     0,     1620000000U),
PLLDDR(67,     0,     0,     1632000000U),
PLLDDR(136,     1,     0,     1644000000U),
PLLDDR(68,     0,     0,     1656000000U),
PLLDDR(138,     1,     0,     1668000000U),
PLLDDR(69,     0,     0,     1680000000U),
PLLDDR(140,     1,     0,     1692000000U),
PLLDDR(70,     0,     0,     1704000000U),
PLLDDR(142,     1,     0,     1716000000U),
PLLDDR(71,     0,     0,     1728000000U),
PLLDDR(144,     1,     0,     1740000000U),
PLLDDR(72,     0,     0,     1752000000U),
PLLDDR(146,     1,     0,     1764000000U),
PLLDDR(73,     0,     0,     1776000000U),
PLLDDR(148,     1,     0,     1788000000U),
PLLDDR(74,     0,     0,     1800000000U),
PLLDDR(150,     1,     0,     1812000000U),
PLLDDR(75,     0,     0,     1824000000U),
PLLDDR(152,     1,     0,     1836000000U),
PLLDDR(76,     0,     0,     1848000000U),
PLLDDR(154,     1,     0,     1860000000U),
PLLDDR(77,     0,     0,     1872000000U),
PLLDDR(156,     1,     0,     1884000000U),
PLLDDR(78,     0,     0,     1896000000U),
PLLDDR(158,     1,     0,     1908000000U),
PLLDDR(79,     0,     0,     1920000000U),
PLLDDR(160,     1,     0,     1932000000U),
PLLDDR(80,     0,     0,     1944000000U),
PLLDDR(162,     1,     0,     1956000000U),
PLLDDR(81,     0,     0,     1968000000U),
PLLDDR(164,     1,     0,     1980000000U),
PLLDDR(82,     0,     0,     1992000000U),
PLLDDR(166,     1,     0,     2004000000U),
PLLDDR(83,     0,     0,     2016000000U),
PLLDDR(168,     1,     0,     2028000000U),
PLLDDR(84,     0,     0,     2040000000U),
PLLDDR(170,     1,     0,     2052000000U),
PLLDDR(85,     0,     0,     2064000000U),
PLLDDR(172,     1,     0,     2076000000U),
PLLDDR(86,     0,     0,     2088000000U),
PLLDDR(174,     1,     0,     2100000000U),
PLLDDR(87,     0,     0,     2112000000U),
PLLDDR(176,     1,     0,     2124000000U),
PLLDDR(88,     0,     0,     2136000000U),
PLLDDR(178,     1,     0,     2148000000U),
PLLDDR(89,     0,     0,     2160000000U),
};

/* PLLPERIPH0(n, d1, d2, freq)	F_N8X8_D1V1X1_D2V0X1 */
struct sunxi_clk_factor_freq factor_pllperiph0_tbl[] = {
PLLPERIPH0(49,     1,     1,     300000000U),
PLLPERIPH0(50,     1,     1,     306000000U),
PLLPERIPH0(25,     0,     1,     312000000U),
PLLPERIPH0(52,     1,     1,     318000000U),
PLLPERIPH0(26,     0,     1,     324000000U),
PLLPERIPH0(54,     1,     1,     330000000U),
PLLPERIPH0(27,     0,     1,     336000000U),
PLLPERIPH0(56,     1,     1,     342000000U),
PLLPERIPH0(28,     0,     1,     348000000U),
PLLPERIPH0(58,     1,     1,     354000000U),
PLLPERIPH0(29,     0,     1,     360000000U),
PLLPERIPH0(60,     1,     1,     366000000U),
PLLPERIPH0(30,     0,     1,     372000000U),
PLLPERIPH0(62,     1,     1,     378000000U),
PLLPERIPH0(31,     0,     1,     384000000U),
PLLPERIPH0(64,     1,     1,     390000000U),
PLLPERIPH0(32,     0,     1,     396000000U),
PLLPERIPH0(66,     1,     1,     402000000U),
PLLPERIPH0(16,     0,     0,     408000000U),
PLLPERIPH0(68,     1,     1,     414000000U),
PLLPERIPH0(34,     0,     1,     420000000U),
PLLPERIPH0(70,     1,     1,     426000000U),
PLLPERIPH0(17,     0,     0,     432000000U),
PLLPERIPH0(72,     1,     1,     438000000U),
PLLPERIPH0(36,     0,     1,     444000000U),
PLLPERIPH0(74,     1,     1,     450000000U),
PLLPERIPH0(18,     0,     0,     456000000U),
PLLPERIPH0(76,     1,     1,     462000000U),
PLLPERIPH0(38,     0,     1,     468000000U),
PLLPERIPH0(78,     1,     1,     474000000U),
PLLPERIPH0(19,     0,     0,     480000000U),
PLLPERIPH0(80,     1,     1,     486000000U),
PLLPERIPH0(40,     0,     1,     492000000U),
PLLPERIPH0(82,     1,     1,     498000000U),
PLLPERIPH0(20,     0,     0,     504000000U),
PLLPERIPH0(84,     1,     1,     510000000U),
PLLPERIPH0(42,     0,     1,     516000000U),
PLLPERIPH0(86,     1,     1,     522000000U),
PLLPERIPH0(21,     0,     0,     528000000U),
PLLPERIPH0(88,     1,     1,     534000000U),
PLLPERIPH0(44,     0,     1,     540000000U),
PLLPERIPH0(90,     1,     1,     546000000U),
PLLPERIPH0(22,     0,     0,     552000000U),
PLLPERIPH0(92,     1,     1,     558000000U),
PLLPERIPH0(46,     0,     1,     564000000U),
PLLPERIPH0(94,     1,     1,     570000000U),
PLLPERIPH0(23,     0,     0,     576000000U),
PLLPERIPH0(96,     1,     1,     582000000U),
PLLPERIPH0(48,     0,     1,     588000000U),
PLLPERIPH0(98,     1,     1,     594000000U),
PLLPERIPH0(24,     0,     0,     600000000U),
PLLPERIPH0(100,     1,     1,     606000000U),
PLLPERIPH0(50,     0,     1,     612000000U),
PLLPERIPH0(102,     1,     1,     618000000U),
PLLPERIPH0(25,     0,     0,     624000000U),
PLLPERIPH0(104,     1,     1,     630000000U),
PLLPERIPH0(52,     0,     1,     636000000U),
};

/* PLLPERIPH1(n, d1, d2, freq)	F_N8X8_D1V1X1_D2V0X1 */
struct sunxi_clk_factor_freq factor_pllperiph1_tbl[] = {
PLLPERIPH1(49,     1,     1,     300000000U),
PLLPERIPH1(50,     1,     1,     306000000U),
PLLPERIPH1(25,     0,     1,     312000000U),
PLLPERIPH1(52,     1,     1,     318000000U),
PLLPERIPH1(26,     0,     1,     324000000U),
PLLPERIPH1(54,     1,     1,     330000000U),
PLLPERIPH1(27,     0,     1,     336000000U),
PLLPERIPH1(56,     1,     1,     342000000U),
PLLPERIPH1(28,     0,     1,     348000000U),
PLLPERIPH1(58,     1,     1,     354000000U),
PLLPERIPH1(29,     0,     1,     360000000U),
PLLPERIPH1(60,     1,     1,     366000000U),
PLLPERIPH1(30,     0,     1,     372000000U),
PLLPERIPH1(62,     1,     1,     378000000U),
PLLPERIPH1(31,     0,     1,     384000000U),
PLLPERIPH1(64,     1,     1,     390000000U),
PLLPERIPH1(32,     0,     1,     396000000U),
PLLPERIPH1(66,     1,     1,     402000000U),
PLLPERIPH1(16,     0,     0,     408000000U),
PLLPERIPH1(68,     1,     1,     414000000U),
PLLPERIPH1(34,     0,     1,     420000000U),
PLLPERIPH1(70,     1,     1,     426000000U),
PLLPERIPH1(17,     0,     0,     432000000U),
PLLPERIPH1(72,     1,     1,     438000000U),
PLLPERIPH1(36,     0,     1,     444000000U),
PLLPERIPH1(74,     1,     1,     450000000U),
PLLPERIPH1(18,     0,     0,     456000000U),
PLLPERIPH1(76,     1,     1,     462000000U),
PLLPERIPH1(38,     0,     1,     468000000U),
PLLPERIPH1(78,     1,     1,     474000000U),
PLLPERIPH1(19,     0,     0,     480000000U),
PLLPERIPH1(80,     1,     1,     486000000U),
PLLPERIPH1(40,     0,     1,     492000000U),
PLLPERIPH1(82,     1,     1,     498000000U),
PLLPERIPH1(20,     0,     0,     504000000U),
PLLPERIPH1(84,     1,     1,     510000000U),
PLLPERIPH1(42,     0,     1,     516000000U),
PLLPERIPH1(86,     1,     1,     522000000U),
PLLPERIPH1(21,     0,     0,     528000000U),
PLLPERIPH1(88,     1,     1,     534000000U),
PLLPERIPH1(44,     0,     1,     540000000U),
PLLPERIPH1(90,     1,     1,     546000000U),
PLLPERIPH1(22,     0,     0,     552000000U),
PLLPERIPH1(92,     1,     1,     558000000U),
PLLPERIPH1(46,     0,     1,     564000000U),
PLLPERIPH1(94,     1,     1,     570000000U),
PLLPERIPH1(23,     0,     0,     576000000U),
PLLPERIPH1(96,     1,     1,     582000000U),
PLLPERIPH1(48,     0,     1,     588000000U),
PLLPERIPH1(98,     1,     1,     594000000U),
PLLPERIPH1(24,     0,     0,     600000000U),
PLLPERIPH1(100,     1,     1,     606000000U),
PLLPERIPH1(50,     0,     1,     612000000U),
PLLPERIPH1(102,     1,     1,     618000000U),
PLLPERIPH1(25,     0,     0,     624000000U),
PLLPERIPH1(104,     1,     1,     630000000U),
PLLPERIPH1(52,     0,     1,     636000000U),
};

/* PLLGPU(n, d1, d2, freq)	F_N8X8_D1V1X1_D2V0X1 */
struct sunxi_clk_factor_freq factor_pllgpu_tbl[] = {
PLLGPU(11,     0,     0,     288000000U),
PLLGPU(48,     1,     1,     294000000U),
PLLGPU(24,     0,     1,     300000000U),
PLLGPU(24,     0,     0,     600000000U),
PLLGPU(41,     0,     0,     1008000000U),
};

/* PLLVIDEO0(n, d1, freq)	F_N8X8_D1V1X1 */
struct sunxi_clk_factor_freq factor_pllvideo0_tbl[] = {
PLLVIDEO0(23,     1,     72000000U),
PLLVIDEO0(24,     1,     75000000U),
PLLVIDEO0(25,     1,     78000000U),
PLLVIDEO0(26,     1,     81000000U),
PLLVIDEO0(13,     0,     84000000U),
PLLVIDEO0(28,     1,     87000000U),
PLLVIDEO0(14,     0,     90000000U),
PLLVIDEO0(30,     1,     93000000U),
PLLVIDEO0(15,     0,     96000000U),
PLLVIDEO0(32,     1,     99000000U),
PLLVIDEO0(16,     0,     102000000U),
PLLVIDEO0(34,     1,     105000000U),
PLLVIDEO0(17,     0,     108000000U),
PLLVIDEO0(36,     1,     111000000U),
PLLVIDEO0(18,     0,     114000000U),
PLLVIDEO0(38,     1,     117000000U),
PLLVIDEO0(19,     0,     120000000U),
PLLVIDEO0(40,     1,     123000000U),
PLLVIDEO0(20,     0,     126000000U),
PLLVIDEO0(42,     1,     129000000U),
PLLVIDEO0(21,     0,     132000000U),
PLLVIDEO0(44,     1,     135000000U),
PLLVIDEO0(22,     0,     138000000U),
PLLVIDEO0(46,     1,     141000000U),
PLLVIDEO0(23,     0,     144000000U),
PLLVIDEO0(48,     1,     147000000U),
PLLVIDEO0(24,     0,     150000000U),
PLLVIDEO0(50,     1,     153000000U),
PLLVIDEO0(25,     0,     156000000U),
PLLVIDEO0(52,     1,     159000000U),
PLLVIDEO0(26,     0,     162000000U),
PLLVIDEO0(54,     1,     165000000U),
PLLVIDEO0(27,     0,     168000000U),
PLLVIDEO0(56,     1,     171000000U),
PLLVIDEO0(28,     0,     174000000U),
PLLVIDEO0(58,     1,     177000000U),
PLLVIDEO0(29,     0,     180000000U),
PLLVIDEO0(60,     1,     183000000U),
PLLVIDEO0(30,     0,     186000000U),
PLLVIDEO0(62,     1,     189000000U),
PLLVIDEO0(31,     0,     192000000U),
PLLVIDEO0(64,     1,     195000000U),
PLLVIDEO0(32,     0,     198000000U),
PLLVIDEO0(66,     1,     201000000U),
PLLVIDEO0(33,     0,     204000000U),
PLLVIDEO0(68,     1,     207000000U),
PLLVIDEO0(34,     0,     210000000U),
PLLVIDEO0(70,     1,     213000000U),
PLLVIDEO0(35,     0,     216000000U),
PLLVIDEO0(72,     1,     219000000U),
PLLVIDEO0(36,     0,     222000000U),
PLLVIDEO0(74,     1,     225000000U),
PLLVIDEO0(37,     0,     228000000U),
PLLVIDEO0(76,     1,     231000000U),
PLLVIDEO0(38,     0,     234000000U),
PLLVIDEO0(78,     1,     237000000U),
PLLVIDEO0(39,     0,     240000000U),
PLLVIDEO0(80,     1,     243000000U),
PLLVIDEO0(40,     0,     246000000U),
PLLVIDEO0(82,     1,     249000000U),
PLLVIDEO0(41,     0,     252000000U),
PLLVIDEO0(84,     1,     255000000U),
PLLVIDEO0(42,     0,     258000000U),
PLLVIDEO0(86,     1,     261000000U),
PLLVIDEO0(43,     0,     264000000U),
PLLVIDEO0(88,     1,     267000000U),
PLLVIDEO0(44,     0,     270000000U),
PLLVIDEO0(90,     1,     273000000U),
PLLVIDEO0(45,     0,     276000000U),
PLLVIDEO0(92,     1,     279000000U),
PLLVIDEO0(46,     0,     282000000U),
PLLVIDEO0(94,     1,     285000000U),
PLLVIDEO0(47,     0,     288000000U),
PLLVIDEO0(96,     1,     291000000U),
PLLVIDEO0(48,     0,     294000000U),
PLLVIDEO0(98,     1,     297000000U),
PLLVIDEO0(49,     0,     300000000U),
PLLVIDEO0(100,     1,     303000000U),
PLLVIDEO0(50,     0,     306000000U),
PLLVIDEO0(102,     1,     309000000U),
PLLVIDEO0(51,     0,     312000000U),
PLLVIDEO0(104,     1,     315000000U),
PLLVIDEO0(52,     0,     318000000U),
PLLVIDEO0(106,     1,     321000000U),
PLLVIDEO0(53,     0,     324000000U),
PLLVIDEO0(108,     1,     327000000U),
PLLVIDEO0(54,     0,     330000000U),
PLLVIDEO0(110,     1,     333000000U),
PLLVIDEO0(55,     0,     336000000U),
PLLVIDEO0(112,     1,     339000000U),
PLLVIDEO0(56,     0,     342000000U),
PLLVIDEO0(114,     1,     345000000U),
PLLVIDEO0(57,     0,     348000000U),
PLLVIDEO0(116,     1,     351000000U),
PLLVIDEO0(58,     0,     354000000U),
PLLVIDEO0(118,     1,     357000000U),
PLLVIDEO0(59,     0,     360000000U),
PLLVIDEO0(120,     1,     363000000U),
PLLVIDEO0(60,     0,     366000000U),
PLLVIDEO0(122,     1,     369000000U),
PLLVIDEO0(61,     0,     372000000U),
PLLVIDEO0(124,     1,     375000000U),
PLLVIDEO0(62,     0,     378000000U),
PLLVIDEO0(126,     1,     381000000U),
PLLVIDEO0(63,     0,     384000000U),
PLLVIDEO0(128,     1,     387000000U),
PLLVIDEO0(64,     0,     390000000U),
PLLVIDEO0(130,     1,     393000000U),
PLLVIDEO0(65,     0,     396000000U),
PLLVIDEO0(132,     1,     399000000U),
PLLVIDEO0(66,     0,     402000000U),
PLLVIDEO0(134,     1,     405000000U),
PLLVIDEO0(67,     0,     408000000U),
PLLVIDEO0(136,     1,     411000000U),
PLLVIDEO0(68,     0,     414000000U),
PLLVIDEO0(138,     1,     417000000U),
PLLVIDEO0(69,     0,     420000000U),
PLLVIDEO0(140,     1,     423000000U),
PLLVIDEO0(70,     0,     426000000U),
PLLVIDEO0(142,     1,     429000000U),
PLLVIDEO0(71,     0,     432000000U),
PLLVIDEO0(144,     1,     435000000U),
PLLVIDEO0(72,     0,     438000000U),
PLLVIDEO0(146,     1,     441000000U),
PLLVIDEO0(73,     0,     444000000U),
PLLVIDEO0(148,     1,     447000000U),
PLLVIDEO0(74,     0,     450000000U),
PLLVIDEO0(150,     1,     453000000U),
PLLVIDEO0(75,     0,     456000000U),
PLLVIDEO0(152,     1,     459000000U),
PLLVIDEO0(76,     0,     462000000U),
PLLVIDEO0(154,     1,     465000000U),
PLLVIDEO0(77,     0,     468000000U),
PLLVIDEO0(156,     1,     471000000U),
PLLVIDEO0(78,     0,     474000000U),
PLLVIDEO0(158,     1,     477000000U),
PLLVIDEO0(79,     0,     480000000U),
PLLVIDEO0(160,     1,     483000000U),
PLLVIDEO0(80,     0,     486000000U),
PLLVIDEO0(162,     1,     489000000U),
PLLVIDEO0(81,     0,     492000000U),
PLLVIDEO0(164,     1,     495000000U),
PLLVIDEO0(82,     0,     498000000U),
PLLVIDEO0(166,     1,     501000000U),
PLLVIDEO0(83,     0,     504000000U),
PLLVIDEO0(168,     1,     507000000U),
PLLVIDEO0(84,     0,     510000000U),
PLLVIDEO0(170,     1,     513000000U),
PLLVIDEO0(85,     0,     516000000U),
PLLVIDEO0(172,     1,     519000000U),
PLLVIDEO0(86,     0,     522000000U),
PLLVIDEO0(174,     1,     525000000U),
PLLVIDEO0(87,     0,     528000000U),
PLLVIDEO0(176,     1,     531000000U),
PLLVIDEO0(88,     0,     534000000U),
PLLVIDEO0(178,     1,     537000000U),
PLLVIDEO0(89,     0,     540000000U),
};

/* PLLVIDEO1(n, d1, freq)	F_N8X8_D1V1X1 */
struct sunxi_clk_factor_freq factor_pllvideo1_tbl[] = {
PLLVIDEO1(23,     1,     72000000U),
PLLVIDEO1(24,     1,     75000000U),
PLLVIDEO1(25,     1,     78000000U),
PLLVIDEO1(26,     1,     81000000U),
PLLVIDEO1(13,     0,     84000000U),
PLLVIDEO1(28,     1,     87000000U),
PLLVIDEO1(14,     0,     90000000U),
PLLVIDEO1(30,     1,     93000000U),
PLLVIDEO1(15,     0,     96000000U),
PLLVIDEO1(32,     1,     99000000U),
PLLVIDEO1(16,     0,     102000000U),
PLLVIDEO1(34,     1,     105000000U),
PLLVIDEO1(17,     0,     108000000U),
PLLVIDEO1(36,     1,     111000000U),
PLLVIDEO1(18,     0,     114000000U),
PLLVIDEO1(38,     1,     117000000U),
PLLVIDEO1(19,     0,     120000000U),
PLLVIDEO1(40,     1,     123000000U),
PLLVIDEO1(20,     0,     126000000U),
PLLVIDEO1(42,     1,     129000000U),
PLLVIDEO1(21,     0,     132000000U),
PLLVIDEO1(44,     1,     135000000U),
PLLVIDEO1(22,     0,     138000000U),
PLLVIDEO1(46,     1,     141000000U),
PLLVIDEO1(23,     0,     144000000U),
PLLVIDEO1(48,     1,     147000000U),
PLLVIDEO1(24,     0,     150000000U),
PLLVIDEO1(50,     1,     153000000U),
PLLVIDEO1(25,     0,     156000000U),
PLLVIDEO1(52,     1,     159000000U),
PLLVIDEO1(26,     0,     162000000U),
PLLVIDEO1(54,     1,     165000000U),
PLLVIDEO1(27,     0,     168000000U),
PLLVIDEO1(56,     1,     171000000U),
PLLVIDEO1(28,     0,     174000000U),
PLLVIDEO1(58,     1,     177000000U),
PLLVIDEO1(29,     0,     180000000U),
PLLVIDEO1(60,     1,     183000000U),
PLLVIDEO1(30,     0,     186000000U),
PLLVIDEO1(62,     1,     189000000U),
PLLVIDEO1(31,     0,     192000000U),
PLLVIDEO1(64,     1,     195000000U),
PLLVIDEO1(32,     0,     198000000U),
PLLVIDEO1(66,     1,     201000000U),
PLLVIDEO1(33,     0,     204000000U),
PLLVIDEO1(68,     1,     207000000U),
PLLVIDEO1(34,     0,     210000000U),
PLLVIDEO1(70,     1,     213000000U),
PLLVIDEO1(35,     0,     216000000U),
PLLVIDEO1(72,     1,     219000000U),
PLLVIDEO1(36,     0,     222000000U),
PLLVIDEO1(74,     1,     225000000U),
PLLVIDEO1(37,     0,     228000000U),
PLLVIDEO1(76,     1,     231000000U),
PLLVIDEO1(38,     0,     234000000U),
PLLVIDEO1(78,     1,     237000000U),
PLLVIDEO1(39,     0,     240000000U),
PLLVIDEO1(80,     1,     243000000U),
PLLVIDEO1(40,     0,     246000000U),
PLLVIDEO1(82,     1,     249000000U),
PLLVIDEO1(41,     0,     252000000U),
PLLVIDEO1(84,     1,     255000000U),
PLLVIDEO1(42,     0,     258000000U),
PLLVIDEO1(86,     1,     261000000U),
PLLVIDEO1(43,     0,     264000000U),
PLLVIDEO1(88,     1,     267000000U),
PLLVIDEO1(44,     0,     270000000U),
PLLVIDEO1(90,     1,     273000000U),
PLLVIDEO1(45,     0,     276000000U),
PLLVIDEO1(92,     1,     279000000U),
PLLVIDEO1(46,     0,     282000000U),
PLLVIDEO1(94,     1,     285000000U),
PLLVIDEO1(47,     0,     288000000U),
PLLVIDEO1(96,     1,     291000000U),
PLLVIDEO1(48,     0,     294000000U),
PLLVIDEO1(98,     1,     297000000U),
PLLVIDEO1(49,     0,     300000000U),
PLLVIDEO1(100,     1,     303000000U),
PLLVIDEO1(50,     0,     306000000U),
PLLVIDEO1(102,     1,     309000000U),
PLLVIDEO1(51,     0,     312000000U),
PLLVIDEO1(104,     1,     315000000U),
PLLVIDEO1(52,     0,     318000000U),
PLLVIDEO1(106,     1,     321000000U),
PLLVIDEO1(53,     0,     324000000U),
PLLVIDEO1(108,     1,     327000000U),
PLLVIDEO1(54,     0,     330000000U),
PLLVIDEO1(110,     1,     333000000U),
PLLVIDEO1(55,     0,     336000000U),
PLLVIDEO1(112,     1,     339000000U),
PLLVIDEO1(56,     0,     342000000U),
PLLVIDEO1(114,     1,     345000000U),
PLLVIDEO1(57,     0,     348000000U),
PLLVIDEO1(116,     1,     351000000U),
PLLVIDEO1(58,     0,     354000000U),
PLLVIDEO1(118,     1,     357000000U),
PLLVIDEO1(59,     0,     360000000U),
PLLVIDEO1(120,     1,     363000000U),
PLLVIDEO1(60,     0,     366000000U),
PLLVIDEO1(122,     1,     369000000U),
PLLVIDEO1(61,     0,     372000000U),
PLLVIDEO1(124,     1,     375000000U),
PLLVIDEO1(62,     0,     378000000U),
PLLVIDEO1(126,     1,     381000000U),
PLLVIDEO1(63,     0,     384000000U),
PLLVIDEO1(128,     1,     387000000U),
PLLVIDEO1(64,     0,     390000000U),
PLLVIDEO1(130,     1,     393000000U),
PLLVIDEO1(65,     0,     396000000U),
PLLVIDEO1(132,     1,     399000000U),
PLLVIDEO1(66,     0,     402000000U),
PLLVIDEO1(134,     1,     405000000U),
PLLVIDEO1(67,     0,     408000000U),
PLLVIDEO1(136,     1,     411000000U),
PLLVIDEO1(68,     0,     414000000U),
PLLVIDEO1(138,     1,     417000000U),
PLLVIDEO1(69,     0,     420000000U),
PLLVIDEO1(140,     1,     423000000U),
PLLVIDEO1(70,     0,     426000000U),
PLLVIDEO1(142,     1,     429000000U),
PLLVIDEO1(71,     0,     432000000U),
PLLVIDEO1(144,     1,     435000000U),
PLLVIDEO1(72,     0,     438000000U),
PLLVIDEO1(146,     1,     441000000U),
PLLVIDEO1(73,     0,     444000000U),
PLLVIDEO1(148,     1,     447000000U),
PLLVIDEO1(74,     0,     450000000U),
PLLVIDEO1(150,     1,     453000000U),
PLLVIDEO1(75,     0,     456000000U),
PLLVIDEO1(152,     1,     459000000U),
PLLVIDEO1(76,     0,     462000000U),
PLLVIDEO1(154,     1,     465000000U),
PLLVIDEO1(77,     0,     468000000U),
PLLVIDEO1(156,     1,     471000000U),
PLLVIDEO1(78,     0,     474000000U),
PLLVIDEO1(158,     1,     477000000U),
PLLVIDEO1(79,     0,     480000000U),
PLLVIDEO1(160,     1,     483000000U),
PLLVIDEO1(80,     0,     486000000U),
PLLVIDEO1(162,     1,     489000000U),
PLLVIDEO1(81,     0,     492000000U),
PLLVIDEO1(164,     1,     495000000U),
PLLVIDEO1(82,     0,     498000000U),
PLLVIDEO1(166,     1,     501000000U),
PLLVIDEO1(83,     0,     504000000U),
PLLVIDEO1(168,     1,     507000000U),
PLLVIDEO1(84,     0,     510000000U),
PLLVIDEO1(170,     1,     513000000U),
PLLVIDEO1(85,     0,     516000000U),
PLLVIDEO1(172,     1,     519000000U),
PLLVIDEO1(86,     0,     522000000U),
PLLVIDEO1(174,     1,     525000000U),
PLLVIDEO1(87,     0,     528000000U),
PLLVIDEO1(176,     1,     531000000U),
PLLVIDEO1(88,     0,     534000000U),
PLLVIDEO1(178,     1,     537000000U),
PLLVIDEO1(89,     0,     540000000U),
};

/* PLLVE(n, d1, d2, freq)	F_N8X8_D1V1X1_D2V0X1 */
struct sunxi_clk_factor_freq factor_pllve_tbl[] = {
PLLVE(11,     0,     0,     288000000U),
PLLVE(48,     1,     1,     294000000U),
PLLVE(24,     0,     1,     300000000U),
PLLVE(24,     0,     0,     600000000U),
PLLVE(82,     0,     1,     996000000U),
};

/* PLLDE(n, d1, d2, freq)	F_N8X8_D1V1X1_D2V0X1 */
struct sunxi_clk_factor_freq factor_pllde_tbl[] = {
PLLDE(11,     0,     0,     288000000U),
PLLDE(48,     1,     1,     294000000U),
PLLDE(24,     0,     1,     300000000U),
PLLDE(98,     1,     1,     594000000U),
PLLDE(24,     0,     0,     600000000U),
PLLDE(100,     1,     1,     606000000U),
PLLDE(82,     0,     1,     996000000U),
};

static unsigned int pllcpu_max, pllddr_max, pllperiph0_max,
		    pllperiph1_max, pllgpu_max, pllvideo0_max, pllvideo1_max,
		    pllve_max, pllde_max;

#define PLL_MAX_ASSIGN(name) (pll##name##_max = \
	factor_pll##name##_tbl[ARRAY_SIZE(factor_pll##name##_tbl)-1].freq)

void sunxi_clk_factor_initlimits(void)
{
	PLL_MAX_ASSIGN(cpu);
	PLL_MAX_ASSIGN(ddr);
	PLL_MAX_ASSIGN(periph0);
	PLL_MAX_ASSIGN(periph1);
	PLL_MAX_ASSIGN(gpu);
	PLL_MAX_ASSIGN(video0);
	PLL_MAX_ASSIGN(video1);
	PLL_MAX_ASSIGN(ve);
	PLL_MAX_ASSIGN(de);
}