aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video/via/hw.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video/via/hw.c')
-rw-r--r--drivers/video/via/hw.c88
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
1412static 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
1430static 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
1412static u32 cle266_encode_pll(struct pll_config pll) 1448static 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
1533enum 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
1542static 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
1573static 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
1579static 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
1497static inline u32 get_pll_internal_frequency(u32 ref_freq, 1585static inline u32 get_pll_internal_frequency(u32 ref_freq,
1498 struct pll_config pll) 1586 struct pll_config pll)
1499{ 1587{