diff options
Diffstat (limited to 'drivers/video/via/hw.c')
-rw-r--r-- | drivers/video/via/hw.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/drivers/video/via/hw.c b/drivers/video/via/hw.c index bd28e13f83d4..b38d3b40de95 100644 --- a/drivers/video/via/hw.c +++ b/drivers/video/via/hw.c | |||
@@ -1409,6 +1409,42 @@ void viafb_load_FIFO_reg(int set_iga, int hor_active, int ver_active) | |||
1409 | 1409 | ||
1410 | } | 1410 | } |
1411 | 1411 | ||
1412 | static void set_primary_pll_state(u8 state) | ||
1413 | { | ||
1414 | u8 value; | ||
1415 | |||
1416 | switch (state) { | ||
1417 | case VIA_STATE_ON: | ||
1418 | value = 0x20; | ||
1419 | break; | ||
1420 | case VIA_STATE_OFF: | ||
1421 | value = 0x00; | ||
1422 | break; | ||
1423 | default: | ||
1424 | return; | ||
1425 | } | ||
1426 | |||
1427 | via_write_reg_mask(VIASR, 0x2D, value, 0x30); | ||
1428 | } | ||
1429 | |||
1430 | static void set_secondary_pll_state(u8 state) | ||
1431 | { | ||
1432 | u8 value; | ||
1433 | |||
1434 | switch (state) { | ||
1435 | case VIA_STATE_ON: | ||
1436 | value = 0x08; | ||
1437 | break; | ||
1438 | case VIA_STATE_OFF: | ||
1439 | value = 0x00; | ||
1440 | break; | ||
1441 | default: | ||
1442 | return; | ||
1443 | } | ||
1444 | |||
1445 | via_write_reg_mask(VIASR, 0x2D, value, 0x08); | ||
1446 | } | ||
1447 | |||
1412 | static u32 cle266_encode_pll(struct pll_config pll) | 1448 | static u32 cle266_encode_pll(struct pll_config pll) |
1413 | { | 1449 | { |
1414 | return (pll.multiplier << 8) | 1450 | return (pll.multiplier << 8) |
@@ -1494,6 +1530,58 @@ static void vx855_set_secondary_pll(struct pll_config config) | |||
1494 | k800_set_secondary_pll_encoded(vx855_encode_pll(config)); | 1530 | k800_set_secondary_pll_encoded(vx855_encode_pll(config)); |
1495 | } | 1531 | } |
1496 | 1532 | ||
1533 | enum via_clksrc { | ||
1534 | VIA_CLKSRC_X1 = 0, | ||
1535 | VIA_CLKSRC_TVX1, | ||
1536 | VIA_CLKSRC_TVPLL, | ||
1537 | VIA_CLKSRC_DVP1TVCLKR, | ||
1538 | VIA_CLKSRC_CAP0, | ||
1539 | VIA_CLKSRC_CAP1, | ||
1540 | }; | ||
1541 | |||
1542 | static inline u8 set_clock_source_common(enum via_clksrc source, bool use_pll) | ||
1543 | { | ||
1544 | u8 data = 0; | ||
1545 | |||
1546 | switch (source) { | ||
1547 | case VIA_CLKSRC_X1: | ||
1548 | data = 0x00; | ||
1549 | break; | ||
1550 | case VIA_CLKSRC_TVX1: | ||
1551 | data = 0x02; | ||
1552 | break; | ||
1553 | case VIA_CLKSRC_TVPLL: | ||
1554 | data = 0x04; /* 0x06 should be the same */ | ||
1555 | break; | ||
1556 | case VIA_CLKSRC_DVP1TVCLKR: | ||
1557 | data = 0x0A; | ||
1558 | break; | ||
1559 | case VIA_CLKSRC_CAP0: | ||
1560 | data = 0xC; | ||
1561 | break; | ||
1562 | case VIA_CLKSRC_CAP1: | ||
1563 | data = 0x0E; | ||
1564 | break; | ||
1565 | } | ||
1566 | |||
1567 | if (!use_pll) | ||
1568 | data |= 1; | ||
1569 | |||
1570 | return data; | ||
1571 | } | ||
1572 | |||
1573 | static void set_primary_clock_source(enum via_clksrc source, bool use_pll) | ||
1574 | { | ||
1575 | u8 data = set_clock_source_common(source, use_pll) << 4; | ||
1576 | via_write_reg_mask(VIACR, 0x6C, data, 0xF0); | ||
1577 | } | ||
1578 | |||
1579 | static void set_secondary_clock_source(enum via_clksrc source, bool use_pll) | ||
1580 | { | ||
1581 | u8 data = set_clock_source_common(source, use_pll); | ||
1582 | via_write_reg_mask(VIACR, 0x6C, data, 0x0F); | ||
1583 | } | ||
1584 | |||
1497 | static inline u32 get_pll_internal_frequency(u32 ref_freq, | 1585 | static inline u32 get_pll_internal_frequency(u32 ref_freq, |
1498 | struct pll_config pll) | 1586 | struct pll_config pll) |
1499 | { | 1587 | { |