Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

viafb: split clock and PLL code to an extra file

This patch is a huge move operation with some rename and introduces
an interface to still use the functions. This should be a step in
the right direction to reuse the code whenever possible but cleanly
separate code that differs on different platform and keeping the
complexity as low as possible.
pll_config was renamed to via_pll_config to keep the naming scheme.

Signed-off-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>

+368 -281
+1 -1
drivers/video/via/Makefile
··· 6 6 7 7 viafb-y :=viafbdev.o hw.o via_i2c.o dvi.o lcd.o ioctl.o accel.o \ 8 8 via_utility.o vt1636.o global.o tblDPASetting.o viamode.o \ 9 - via-core.o via-gpio.o via_modesetting.o 9 + via-core.o via-gpio.o via_modesetting.o via_clock.o
+14 -274
drivers/video/via/hw.c
··· 21 21 22 22 #include <linux/via-core.h> 23 23 #include "global.h" 24 + #include "via_clock.h" 24 25 25 26 static struct pll_limit cle266_pll_limits[] = { 26 27 {19, 19, 4, 0}, ··· 484 483 {VIA_LVDS1, "LVDS1"}, 485 484 {VIA_LVDS2, "LVDS2"} 486 485 }; 486 + 487 + /* structure with function pointers to support clock control */ 488 + static struct via_clock clock; 487 489 488 490 static void load_fix_bit_crtc_reg(void); 489 491 static void __devinit init_gfx_chip_info(int chip_type); ··· 1413 1409 1414 1410 } 1415 1411 1416 - static void set_primary_clock_state(u8 state) 1417 - { 1418 - u8 value; 1419 - 1420 - switch (state) { 1421 - case VIA_STATE_ON: 1422 - value = 0x20; 1423 - break; 1424 - case VIA_STATE_OFF: 1425 - value = 0x00; 1426 - break; 1427 - default: 1428 - return; 1429 - } 1430 - 1431 - via_write_reg_mask(VIASR, 0x1B, value, 0x30); 1432 - } 1433 - 1434 - static void set_secondary_clock_state(u8 state) 1435 - { 1436 - u8 value; 1437 - 1438 - switch (state) { 1439 - case VIA_STATE_ON: 1440 - value = 0x80; 1441 - break; 1442 - case VIA_STATE_OFF: 1443 - value = 0x00; 1444 - break; 1445 - default: 1446 - return; 1447 - } 1448 - 1449 - via_write_reg_mask(VIASR, 0x1B, value, 0xC0); 1450 - } 1451 - 1452 - static void set_primary_pll_state(u8 state) 1453 - { 1454 - u8 value; 1455 - 1456 - switch (state) { 1457 - case VIA_STATE_ON: 1458 - value = 0x20; 1459 - break; 1460 - case VIA_STATE_OFF: 1461 - value = 0x00; 1462 - break; 1463 - default: 1464 - return; 1465 - } 1466 - 1467 - via_write_reg_mask(VIASR, 0x2D, value, 0x30); 1468 - } 1469 - 1470 - static void set_secondary_pll_state(u8 state) 1471 - { 1472 - u8 value; 1473 - 1474 - switch (state) { 1475 - case VIA_STATE_ON: 1476 - value = 0x08; 1477 - break; 1478 - case VIA_STATE_OFF: 1479 - value = 0x00; 1480 - break; 1481 - default: 1482 - return; 1483 - } 1484 - 1485 - via_write_reg_mask(VIASR, 0x2D, value, 0x0C); 1486 - } 1487 - 1488 - static u32 cle266_encode_pll(struct pll_config pll) 1489 - { 1490 - return (pll.multiplier << 8) 1491 - | (pll.rshift << 6) 1492 - | pll.divisor; 1493 - } 1494 - 1495 - static u32 k800_encode_pll(struct pll_config pll) 1496 - { 1497 - return ((pll.divisor - 2) << 16) 1498 - | (pll.rshift << 10) 1499 - | (pll.multiplier - 2); 1500 - } 1501 - 1502 - static u32 vx855_encode_pll(struct pll_config pll) 1503 - { 1504 - return (pll.divisor << 16) 1505 - | (pll.rshift << 10) 1506 - | pll.multiplier; 1507 - } 1508 - 1509 - static inline void cle266_set_primary_pll_encoded(u32 data) 1510 - { 1511 - via_write_reg_mask(VIASR, 0x40, 0x02, 0x02); /* enable reset */ 1512 - via_write_reg(VIASR, 0x46, data & 0xFF); 1513 - via_write_reg(VIASR, 0x47, (data >> 8) & 0xFF); 1514 - via_write_reg_mask(VIASR, 0x40, 0x00, 0x02); /* disable reset */ 1515 - } 1516 - 1517 - static inline void k800_set_primary_pll_encoded(u32 data) 1518 - { 1519 - via_write_reg_mask(VIASR, 0x40, 0x02, 0x02); /* enable reset */ 1520 - via_write_reg(VIASR, 0x44, data & 0xFF); 1521 - via_write_reg(VIASR, 0x45, (data >> 8) & 0xFF); 1522 - via_write_reg(VIASR, 0x46, (data >> 16) & 0xFF); 1523 - via_write_reg_mask(VIASR, 0x40, 0x00, 0x02); /* disable reset */ 1524 - } 1525 - 1526 - static inline void cle266_set_secondary_pll_encoded(u32 data) 1527 - { 1528 - via_write_reg_mask(VIASR, 0x40, 0x04, 0x04); /* enable reset */ 1529 - via_write_reg(VIASR, 0x44, data & 0xFF); 1530 - via_write_reg(VIASR, 0x45, (data >> 8) & 0xFF); 1531 - via_write_reg_mask(VIASR, 0x40, 0x00, 0x04); /* disable reset */ 1532 - } 1533 - 1534 - static inline void k800_set_secondary_pll_encoded(u32 data) 1535 - { 1536 - via_write_reg_mask(VIASR, 0x40, 0x04, 0x04); /* enable reset */ 1537 - via_write_reg(VIASR, 0x4A, data & 0xFF); 1538 - via_write_reg(VIASR, 0x4B, (data >> 8) & 0xFF); 1539 - via_write_reg(VIASR, 0x4C, (data >> 16) & 0xFF); 1540 - via_write_reg_mask(VIASR, 0x40, 0x00, 0x04); /* disable reset */ 1541 - } 1542 - 1543 - static void cle266_set_primary_pll(struct pll_config config) 1544 - { 1545 - cle266_set_primary_pll_encoded(cle266_encode_pll(config)); 1546 - } 1547 - 1548 - static void k800_set_primary_pll(struct pll_config config) 1549 - { 1550 - k800_set_primary_pll_encoded(k800_encode_pll(config)); 1551 - } 1552 - 1553 - static void vx855_set_primary_pll(struct pll_config config) 1554 - { 1555 - k800_set_primary_pll_encoded(vx855_encode_pll(config)); 1556 - } 1557 - 1558 - static void cle266_set_secondary_pll(struct pll_config config) 1559 - { 1560 - cle266_set_secondary_pll_encoded(cle266_encode_pll(config)); 1561 - } 1562 - 1563 - static void k800_set_secondary_pll(struct pll_config config) 1564 - { 1565 - k800_set_secondary_pll_encoded(k800_encode_pll(config)); 1566 - } 1567 - 1568 - static void vx855_set_secondary_pll(struct pll_config config) 1569 - { 1570 - k800_set_secondary_pll_encoded(vx855_encode_pll(config)); 1571 - } 1572 - 1573 - enum via_clksrc { 1574 - VIA_CLKSRC_X1 = 0, 1575 - VIA_CLKSRC_TVX1, 1576 - VIA_CLKSRC_TVPLL, 1577 - VIA_CLKSRC_DVP1TVCLKR, 1578 - VIA_CLKSRC_CAP0, 1579 - VIA_CLKSRC_CAP1, 1580 - }; 1581 - 1582 - static inline u8 set_clock_source_common(enum via_clksrc source, bool use_pll) 1583 - { 1584 - u8 data = 0; 1585 - 1586 - switch (source) { 1587 - case VIA_CLKSRC_X1: 1588 - data = 0x00; 1589 - break; 1590 - case VIA_CLKSRC_TVX1: 1591 - data = 0x02; 1592 - break; 1593 - case VIA_CLKSRC_TVPLL: 1594 - data = 0x04; /* 0x06 should be the same */ 1595 - break; 1596 - case VIA_CLKSRC_DVP1TVCLKR: 1597 - data = 0x0A; 1598 - break; 1599 - case VIA_CLKSRC_CAP0: 1600 - data = 0xC; 1601 - break; 1602 - case VIA_CLKSRC_CAP1: 1603 - data = 0x0E; 1604 - break; 1605 - } 1606 - 1607 - if (!use_pll) 1608 - data |= 1; 1609 - 1610 - return data; 1611 - } 1612 - 1613 - static void set_primary_clock_source(enum via_clksrc source, bool use_pll) 1614 - { 1615 - u8 data = set_clock_source_common(source, use_pll) << 4; 1616 - via_write_reg_mask(VIACR, 0x6C, data, 0xF0); 1617 - } 1618 - 1619 - static void set_secondary_clock_source(enum via_clksrc source, bool use_pll) 1620 - { 1621 - u8 data = set_clock_source_common(source, use_pll); 1622 - via_write_reg_mask(VIACR, 0x6C, data, 0x0F); 1623 - } 1624 - 1625 - static inline u32 get_pll_internal_frequency(u32 ref_freq, 1626 - struct pll_config pll) 1627 - { 1628 - return ref_freq / pll.divisor * pll.multiplier; 1629 - } 1630 - 1631 - static inline u32 get_pll_output_frequency(u32 ref_freq, struct pll_config pll) 1632 - { 1633 - return get_pll_internal_frequency(ref_freq, pll)>>pll.rshift; 1634 - } 1635 - 1636 - static struct pll_config get_pll_config(struct pll_limit *limits, int size, 1412 + static struct via_pll_config get_pll_config(struct pll_limit *limits, int size, 1637 1413 int clk) 1638 1414 { 1639 - struct pll_config cur, up, down, best = {0, 1, 0}; 1415 + struct via_pll_config cur, up, down, best = {0, 1, 0}; 1640 1416 const u32 f0 = 14318180; /* X1 frequency */ 1641 1417 int i, f; 1642 1418 ··· 1446 1662 return best; 1447 1663 } 1448 1664 1449 - static struct pll_config get_best_pll_config(int clk) 1665 + static struct via_pll_config get_best_pll_config(int clk) 1450 1666 { 1451 - struct pll_config config; 1667 + struct via_pll_config config; 1452 1668 1453 1669 switch (viaparinfo->chip_info->gfx_chip_name) { 1454 1670 case UNICHROME_CLE266: ··· 1484 1700 /* Set VCLK*/ 1485 1701 void viafb_set_vclock(u32 clk, int set_iga) 1486 1702 { 1487 - struct pll_config config = get_best_pll_config(clk); 1703 + struct via_pll_config config = get_best_pll_config(clk); 1488 1704 1489 - if (set_iga == IGA1) { 1490 - /* Change D,N FOR VCLK */ 1491 - switch (viaparinfo->chip_info->gfx_chip_name) { 1492 - case UNICHROME_CLE266: 1493 - case UNICHROME_K400: 1494 - cle266_set_primary_pll(config); 1495 - break; 1496 - case UNICHROME_K800: 1497 - case UNICHROME_PM800: 1498 - case UNICHROME_CN700: 1499 - case UNICHROME_CX700: 1500 - case UNICHROME_CN750: 1501 - case UNICHROME_K8M890: 1502 - case UNICHROME_P4M890: 1503 - case UNICHROME_P4M900: 1504 - case UNICHROME_VX800: 1505 - k800_set_primary_pll(config); 1506 - break; 1507 - case UNICHROME_VX855: 1508 - case UNICHROME_VX900: 1509 - vx855_set_primary_pll(config); 1510 - break; 1511 - } 1512 - } 1513 - 1514 - if (set_iga == IGA2) { 1515 - /* Change D,N FOR LCK */ 1516 - switch (viaparinfo->chip_info->gfx_chip_name) { 1517 - case UNICHROME_CLE266: 1518 - case UNICHROME_K400: 1519 - cle266_set_secondary_pll(config); 1520 - break; 1521 - case UNICHROME_K800: 1522 - case UNICHROME_PM800: 1523 - case UNICHROME_CN700: 1524 - case UNICHROME_CX700: 1525 - case UNICHROME_CN750: 1526 - case UNICHROME_K8M890: 1527 - case UNICHROME_P4M890: 1528 - case UNICHROME_P4M900: 1529 - case UNICHROME_VX800: 1530 - k800_set_secondary_pll(config); 1531 - break; 1532 - case UNICHROME_VX855: 1533 - case UNICHROME_VX900: 1534 - vx855_set_secondary_pll(config); 1535 - break; 1536 - } 1537 - } 1705 + if (set_iga == IGA1) 1706 + clock.set_primary_pll(config); 1707 + if (set_iga == IGA2) 1708 + clock.set_secondary_pll(config); 1538 1709 1539 1710 /* Fire! */ 1540 1711 via_write_misc_reg_mask(0x0C, 0x0C); /* select external clock */ ··· 1798 2059 1799 2060 void __devinit viafb_init_chip_info(int chip_type) 1800 2061 { 2062 + via_clock_init(&clock, chip_type); 1801 2063 init_gfx_chip_info(chip_type); 1802 2064 init_tmds_chip_info(); 1803 2065 init_lvds_chip_info();
-6
drivers/video/via/hw.h
··· 732 732 struct _lcd_ver_scaling_factor lcd_ver_scaling_factor; 733 733 }; 734 734 735 - struct pll_config { 736 - u16 multiplier; 737 - u8 divisor; 738 - u8 rshift; 739 - }; 740 - 741 735 struct pll_limit { 742 736 u16 multiplier_min; 743 737 u16 multiplier_max;
+280
drivers/video/via/via_clock.c
··· 1 + /* 2 + * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved. 3 + * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved. 4 + * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de> 5 + * 6 + * This program is free software; you can redistribute it and/or 7 + * modify it under the terms of the GNU General Public 8 + * License as published by the Free Software Foundation; 9 + * either version 2, or (at your option) any later version. 10 + * 11 + * This program is distributed in the hope that it will be useful, 12 + * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even 13 + * the implied warranty of MERCHANTABILITY or FITNESS FOR 14 + * A PARTICULAR PURPOSE.See the GNU General Public License 15 + * for more details. 16 + * 17 + * You should have received a copy of the GNU General Public License 18 + * along with this program; if not, write to the Free Software 19 + * Foundation, Inc., 20 + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 21 + */ 22 + /* 23 + * clock and PLL management functions 24 + */ 25 + 26 + #include <linux/kernel.h> 27 + #include <linux/via-core.h> 28 + #include "via_clock.h" 29 + #include "global.h" 30 + #include "debug.h" 31 + 32 + static inline u32 cle266_encode_pll(struct via_pll_config pll) 33 + { 34 + return (pll.multiplier << 8) 35 + | (pll.rshift << 6) 36 + | pll.divisor; 37 + } 38 + 39 + static inline u32 k800_encode_pll(struct via_pll_config pll) 40 + { 41 + return ((pll.divisor - 2) << 16) 42 + | (pll.rshift << 10) 43 + | (pll.multiplier - 2); 44 + } 45 + 46 + static inline u32 vx855_encode_pll(struct via_pll_config pll) 47 + { 48 + return (pll.divisor << 16) 49 + | (pll.rshift << 10) 50 + | pll.multiplier; 51 + } 52 + 53 + static inline void cle266_set_primary_pll_encoded(u32 data) 54 + { 55 + via_write_reg_mask(VIASR, 0x40, 0x02, 0x02); /* enable reset */ 56 + via_write_reg(VIASR, 0x46, data & 0xFF); 57 + via_write_reg(VIASR, 0x47, (data >> 8) & 0xFF); 58 + via_write_reg_mask(VIASR, 0x40, 0x00, 0x02); /* disable reset */ 59 + } 60 + 61 + static inline void k800_set_primary_pll_encoded(u32 data) 62 + { 63 + via_write_reg_mask(VIASR, 0x40, 0x02, 0x02); /* enable reset */ 64 + via_write_reg(VIASR, 0x44, data & 0xFF); 65 + via_write_reg(VIASR, 0x45, (data >> 8) & 0xFF); 66 + via_write_reg(VIASR, 0x46, (data >> 16) & 0xFF); 67 + via_write_reg_mask(VIASR, 0x40, 0x00, 0x02); /* disable reset */ 68 + } 69 + 70 + static inline void cle266_set_secondary_pll_encoded(u32 data) 71 + { 72 + via_write_reg_mask(VIASR, 0x40, 0x04, 0x04); /* enable reset */ 73 + via_write_reg(VIASR, 0x44, data & 0xFF); 74 + via_write_reg(VIASR, 0x45, (data >> 8) & 0xFF); 75 + via_write_reg_mask(VIASR, 0x40, 0x00, 0x04); /* disable reset */ 76 + } 77 + 78 + static inline void k800_set_secondary_pll_encoded(u32 data) 79 + { 80 + via_write_reg_mask(VIASR, 0x40, 0x04, 0x04); /* enable reset */ 81 + via_write_reg(VIASR, 0x4A, data & 0xFF); 82 + via_write_reg(VIASR, 0x4B, (data >> 8) & 0xFF); 83 + via_write_reg(VIASR, 0x4C, (data >> 16) & 0xFF); 84 + via_write_reg_mask(VIASR, 0x40, 0x00, 0x04); /* disable reset */ 85 + } 86 + 87 + static void cle266_set_primary_pll(struct via_pll_config config) 88 + { 89 + cle266_set_primary_pll_encoded(cle266_encode_pll(config)); 90 + } 91 + 92 + static void k800_set_primary_pll(struct via_pll_config config) 93 + { 94 + k800_set_primary_pll_encoded(k800_encode_pll(config)); 95 + } 96 + 97 + static void vx855_set_primary_pll(struct via_pll_config config) 98 + { 99 + k800_set_primary_pll_encoded(vx855_encode_pll(config)); 100 + } 101 + 102 + static void cle266_set_secondary_pll(struct via_pll_config config) 103 + { 104 + cle266_set_secondary_pll_encoded(cle266_encode_pll(config)); 105 + } 106 + 107 + static void k800_set_secondary_pll(struct via_pll_config config) 108 + { 109 + k800_set_secondary_pll_encoded(k800_encode_pll(config)); 110 + } 111 + 112 + static void vx855_set_secondary_pll(struct via_pll_config config) 113 + { 114 + k800_set_secondary_pll_encoded(vx855_encode_pll(config)); 115 + } 116 + 117 + static void set_primary_pll_state(u8 state) 118 + { 119 + u8 value; 120 + 121 + switch (state) { 122 + case VIA_STATE_ON: 123 + value = 0x20; 124 + break; 125 + case VIA_STATE_OFF: 126 + value = 0x00; 127 + break; 128 + default: 129 + return; 130 + } 131 + 132 + via_write_reg_mask(VIASR, 0x2D, value, 0x30); 133 + } 134 + 135 + static void set_secondary_pll_state(u8 state) 136 + { 137 + u8 value; 138 + 139 + switch (state) { 140 + case VIA_STATE_ON: 141 + value = 0x08; 142 + break; 143 + case VIA_STATE_OFF: 144 + value = 0x00; 145 + break; 146 + default: 147 + return; 148 + } 149 + 150 + via_write_reg_mask(VIASR, 0x2D, value, 0x0C); 151 + } 152 + 153 + static void set_primary_clock_state(u8 state) 154 + { 155 + u8 value; 156 + 157 + switch (state) { 158 + case VIA_STATE_ON: 159 + value = 0x20; 160 + break; 161 + case VIA_STATE_OFF: 162 + value = 0x00; 163 + break; 164 + default: 165 + return; 166 + } 167 + 168 + via_write_reg_mask(VIASR, 0x1B, value, 0x30); 169 + } 170 + 171 + static void set_secondary_clock_state(u8 state) 172 + { 173 + u8 value; 174 + 175 + switch (state) { 176 + case VIA_STATE_ON: 177 + value = 0x80; 178 + break; 179 + case VIA_STATE_OFF: 180 + value = 0x00; 181 + break; 182 + default: 183 + return; 184 + } 185 + 186 + via_write_reg_mask(VIASR, 0x1B, value, 0xC0); 187 + } 188 + 189 + static inline u8 set_clock_source_common(enum via_clksrc source, bool use_pll) 190 + { 191 + u8 data = 0; 192 + 193 + switch (source) { 194 + case VIA_CLKSRC_X1: 195 + data = 0x00; 196 + break; 197 + case VIA_CLKSRC_TVX1: 198 + data = 0x02; 199 + break; 200 + case VIA_CLKSRC_TVPLL: 201 + data = 0x04; /* 0x06 should be the same */ 202 + break; 203 + case VIA_CLKSRC_DVP1TVCLKR: 204 + data = 0x0A; 205 + break; 206 + case VIA_CLKSRC_CAP0: 207 + data = 0xC; 208 + break; 209 + case VIA_CLKSRC_CAP1: 210 + data = 0x0E; 211 + break; 212 + } 213 + 214 + if (!use_pll) 215 + data |= 1; 216 + 217 + return data; 218 + } 219 + 220 + static void set_primary_clock_source(enum via_clksrc source, bool use_pll) 221 + { 222 + u8 data = set_clock_source_common(source, use_pll) << 4; 223 + via_write_reg_mask(VIACR, 0x6C, data, 0xF0); 224 + } 225 + 226 + static void set_secondary_clock_source(enum via_clksrc source, bool use_pll) 227 + { 228 + u8 data = set_clock_source_common(source, use_pll); 229 + via_write_reg_mask(VIACR, 0x6C, data, 0x0F); 230 + } 231 + 232 + void via_clock_init(struct via_clock *clock, int gfx_chip) 233 + { 234 + switch (gfx_chip) { 235 + case UNICHROME_CLE266: 236 + case UNICHROME_K400: 237 + clock->set_primary_clock_state = NULL; 238 + clock->set_primary_clock_source = NULL; 239 + clock->set_primary_pll_state = NULL; 240 + clock->set_primary_pll = cle266_set_primary_pll; 241 + 242 + clock->set_secondary_clock_state = NULL; 243 + clock->set_secondary_clock_source = NULL; 244 + clock->set_secondary_pll_state = NULL; 245 + clock->set_secondary_pll = cle266_set_secondary_pll; 246 + break; 247 + case UNICHROME_K800: 248 + case UNICHROME_PM800: 249 + case UNICHROME_CN700: 250 + case UNICHROME_CX700: 251 + case UNICHROME_CN750: 252 + case UNICHROME_K8M890: 253 + case UNICHROME_P4M890: 254 + case UNICHROME_P4M900: 255 + case UNICHROME_VX800: 256 + clock->set_primary_clock_state = set_primary_clock_state; 257 + clock->set_primary_clock_source = set_primary_clock_source; 258 + clock->set_primary_pll_state = set_primary_pll_state; 259 + clock->set_primary_pll = k800_set_primary_pll; 260 + 261 + clock->set_secondary_clock_state = set_secondary_clock_state; 262 + clock->set_secondary_clock_source = set_secondary_clock_source; 263 + clock->set_secondary_pll_state = set_secondary_pll_state; 264 + clock->set_secondary_pll = k800_set_secondary_pll; 265 + break; 266 + case UNICHROME_VX855: 267 + case UNICHROME_VX900: 268 + clock->set_primary_clock_state = set_primary_clock_state; 269 + clock->set_primary_clock_source = set_primary_clock_source; 270 + clock->set_primary_pll_state = set_primary_pll_state; 271 + clock->set_primary_pll = vx855_set_primary_pll; 272 + 273 + clock->set_secondary_clock_state = set_secondary_clock_state; 274 + clock->set_secondary_clock_source = set_secondary_clock_source; 275 + clock->set_secondary_pll_state = set_secondary_pll_state; 276 + clock->set_secondary_pll = vx855_set_secondary_pll; 277 + break; 278 + 279 + } 280 + }
+73
drivers/video/via/via_clock.h
··· 1 + /* 2 + * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved. 3 + * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved. 4 + * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de> 5 + * 6 + * This program is free software; you can redistribute it and/or 7 + * modify it under the terms of the GNU General Public 8 + * License as published by the Free Software Foundation; 9 + * either version 2, or (at your option) any later version. 10 + * 11 + * This program is distributed in the hope that it will be useful, 12 + * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even 13 + * the implied warranty of MERCHANTABILITY or FITNESS FOR 14 + * A PARTICULAR PURPOSE.See the GNU General Public License 15 + * for more details. 16 + * 17 + * You should have received a copy of the GNU General Public License 18 + * along with this program; if not, write to the Free Software 19 + * Foundation, Inc., 20 + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 21 + */ 22 + /* 23 + * clock and PLL management functions 24 + */ 25 + 26 + #ifndef __VIA_CLOCK_H__ 27 + #define __VIA_CLOCK_H__ 28 + 29 + #include <linux/types.h> 30 + 31 + enum via_clksrc { 32 + VIA_CLKSRC_X1 = 0, 33 + VIA_CLKSRC_TVX1, 34 + VIA_CLKSRC_TVPLL, 35 + VIA_CLKSRC_DVP1TVCLKR, 36 + VIA_CLKSRC_CAP0, 37 + VIA_CLKSRC_CAP1, 38 + }; 39 + 40 + struct via_pll_config { 41 + u16 multiplier; 42 + u8 divisor; 43 + u8 rshift; 44 + }; 45 + 46 + struct via_clock { 47 + void (*set_primary_clock_state)(u8 state); 48 + void (*set_primary_clock_source)(enum via_clksrc src, bool use_pll); 49 + void (*set_primary_pll_state)(u8 state); 50 + void (*set_primary_pll)(struct via_pll_config config); 51 + 52 + void (*set_secondary_clock_state)(u8 state); 53 + void (*set_secondary_clock_source)(enum via_clksrc src, bool use_pll); 54 + void (*set_secondary_pll_state)(u8 state); 55 + void (*set_secondary_pll)(struct via_pll_config config); 56 + }; 57 + 58 + 59 + static inline u32 get_pll_internal_frequency(u32 ref_freq, 60 + struct via_pll_config pll) 61 + { 62 + return ref_freq / pll.divisor * pll.multiplier; 63 + } 64 + 65 + static inline u32 get_pll_output_frequency(u32 ref_freq, 66 + struct via_pll_config pll) 67 + { 68 + return get_pll_internal_frequency(ref_freq, pll) >> pll.rshift; 69 + } 70 + 71 + void via_clock_init(struct via_clock *clock, int gfx_chip); 72 + 73 + #endif /* __VIA_CLOCK_H__ */