viafb: add VIA slapping capability

This patch introduces dummy functions to execute when we don't know
what we should do (due to missing documentation). They do nothing
but print a nice message in the log explaining the situation.
To trigger this message initial power management support is
activated which might save a bit energy by disabling PLL and clock
if no device is configured to use them.

Note: The message is only shown for the oldest IGPs CLE266 and K400
      as for the other platforms there are reasonable assumptions
      how it does (hopefully) work.

Signed-off-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
This commit is contained in:
Florian Tobias Schandinat 2011-03-24 14:25:51 +00:00
parent 2c536f84c1
commit b692a63af8
2 changed files with 43 additions and 6 deletions

View File

@ -2289,6 +2289,25 @@ int viafb_setmode(struct VideoModeTable *vmode_tbl, int video_bpp,
get_sync(viafbinfo1)); get_sync(viafbinfo1));
} }
clock.set_primary_clock_source(VIA_CLKSRC_X1, true);
clock.set_secondary_clock_source(VIA_CLKSRC_X1, true);
if (viaparinfo->shared->iga1_devices) {
clock.set_primary_pll_state(VIA_STATE_ON);
clock.set_primary_clock_state(VIA_STATE_ON);
} else {
clock.set_primary_pll_state(VIA_STATE_OFF);
clock.set_primary_clock_state(VIA_STATE_OFF);
}
if (viaparinfo->shared->iga2_devices) {
clock.set_secondary_pll_state(VIA_STATE_ON);
clock.set_secondary_clock_state(VIA_STATE_ON);
} else {
clock.set_secondary_pll_state(VIA_STATE_OFF);
clock.set_secondary_clock_state(VIA_STATE_OFF);
}
via_set_state(devices, VIA_STATE_ON); via_set_state(devices, VIA_STATE_ON);
device_screen_on(); device_screen_on();
return 1; return 1;

View File

@ -29,6 +29,9 @@
#include "global.h" #include "global.h"
#include "debug.h" #include "debug.h"
const char *via_slap = "Please slap VIA Technologies to motivate them "
"releasing full documentation for your platform!\n";
static inline u32 cle266_encode_pll(struct via_pll_config pll) static inline u32 cle266_encode_pll(struct via_pll_config pll)
{ {
return (pll.multiplier << 8) return (pll.multiplier << 8)
@ -229,19 +232,34 @@ static void set_secondary_clock_source(enum via_clksrc source, bool use_pll)
via_write_reg_mask(VIACR, 0x6C, data, 0x0F); via_write_reg_mask(VIACR, 0x6C, data, 0x0F);
} }
static void dummy_set_clock_state(u8 state)
{
printk(KERN_INFO "Using undocumented set clock state.\n%s", via_slap);
}
static void dummy_set_clock_source(enum via_clksrc source, bool use_pll)
{
printk(KERN_INFO "Using undocumented set clock source.\n%s", via_slap);
}
static void dummy_set_pll_state(u8 state)
{
printk(KERN_INFO "Using undocumented set PLL state.\n%s", via_slap);
}
void via_clock_init(struct via_clock *clock, int gfx_chip) void via_clock_init(struct via_clock *clock, int gfx_chip)
{ {
switch (gfx_chip) { switch (gfx_chip) {
case UNICHROME_CLE266: case UNICHROME_CLE266:
case UNICHROME_K400: case UNICHROME_K400:
clock->set_primary_clock_state = NULL; clock->set_primary_clock_state = dummy_set_clock_state;
clock->set_primary_clock_source = NULL; clock->set_primary_clock_source = dummy_set_clock_source;
clock->set_primary_pll_state = NULL; clock->set_primary_pll_state = dummy_set_pll_state;
clock->set_primary_pll = cle266_set_primary_pll; clock->set_primary_pll = cle266_set_primary_pll;
clock->set_secondary_clock_state = NULL; clock->set_secondary_clock_state = dummy_set_clock_state;
clock->set_secondary_clock_source = NULL; clock->set_secondary_clock_source = dummy_set_clock_source;
clock->set_secondary_pll_state = NULL; clock->set_secondary_pll_state = dummy_set_pll_state;
clock->set_secondary_pll = cle266_set_secondary_pll; clock->set_secondary_pll = cle266_set_secondary_pll;
break; break;
case UNICHROME_K800: case UNICHROME_K800: