Skip to content

Commit

Permalink
viafb: always return the best possible clock
Browse files Browse the repository at this point in the history
Before this patch only clocks that perfectly match were used and if
none existed this was not handled properly. This patch changes this
to always use the closest clock supported. This should behave like
before for clocks that have a perfect match but be much saner for
clocks which are slightly off.

Signed-off-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
  • Loading branch information
Florian Tobias Schandinat authored and Florian Tobias Schandinat committed Mar 12, 2011
1 parent f5b1c4b commit 97597a3
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 34 deletions.
60 changes: 28 additions & 32 deletions drivers/video/via/hw.c
Original file line number Diff line number Diff line change
Expand Up @@ -1677,40 +1677,36 @@ static u32 vx855_encode_pll(struct pll_config pll)
u32 viafb_get_clk_value(int clk)
{
u32 value = 0;
int i = 0;
int i, best = 0;

while (i < NUM_TOTAL_PLL_TABLE && clk != pll_value[i].clk)
i++;

if (i == NUM_TOTAL_PLL_TABLE) {
printk(KERN_WARNING "viafb_get_clk_value: PLL lookup failed!");
} else {
switch (viaparinfo->chip_info->gfx_chip_name) {
case UNICHROME_CLE266:
case UNICHROME_K400:
value = cle266_encode_pll(pll_value[i].cle266_pll);
break;

case UNICHROME_K800:
case UNICHROME_PM800:
case UNICHROME_CN700:
value = k800_encode_pll(pll_value[i].k800_pll);
break;

case UNICHROME_CX700:
case UNICHROME_CN750:
case UNICHROME_K8M890:
case UNICHROME_P4M890:
case UNICHROME_P4M900:
case UNICHROME_VX800:
value = k800_encode_pll(pll_value[i].cx700_pll);
break;
for (i = 1; i < ARRAY_SIZE(pll_value); i++) {
if (abs(pll_value[i].clk - clk)
< abs(pll_value[best].clk - clk))
best = i;
}

case UNICHROME_VX855:
case UNICHROME_VX900:
value = vx855_encode_pll(pll_value[i].vx855_pll);
break;
}
switch (viaparinfo->chip_info->gfx_chip_name) {
case UNICHROME_CLE266:
case UNICHROME_K400:
value = cle266_encode_pll(pll_value[best].cle266_pll);
break;
case UNICHROME_K800:
case UNICHROME_PM800:
case UNICHROME_CN700:
value = k800_encode_pll(pll_value[best].k800_pll);
break;
case UNICHROME_CX700:
case UNICHROME_CN750:
case UNICHROME_K8M890:
case UNICHROME_P4M890:
case UNICHROME_P4M900:
case UNICHROME_VX800:
value = k800_encode_pll(pll_value[best].cx700_pll);
break;
case UNICHROME_VX855:
case UNICHROME_VX900:
value = vx855_encode_pll(pll_value[best].vx855_pll);
break;
}

return value;
Expand Down
2 changes: 0 additions & 2 deletions drivers/video/via/hw.h
Original file line number Diff line number Diff line change
Expand Up @@ -893,8 +893,6 @@ struct iga2_crtc_timing {
/* VT3410 chipset*/
#define VX900_FUNCTION3 0x3410

#define NUM_TOTAL_PLL_TABLE ARRAY_SIZE(pll_value)

struct IODATA {
u8 Index;
u8 Mask;
Expand Down

0 comments on commit 97597a3

Please sign in to comment.