1.1 --- a/pkg/devices/lib/cpm/src/x1600.cc Fri Sep 22 21:55:54 2023 +0200
1.2 +++ b/pkg/devices/lib/cpm/src/x1600.cc Fri Sep 22 21:56:34 2023 +0200
1.3 @@ -219,9 +219,9 @@
1.4 Pll_bypass_E (Pll_control_E, 1, 26), // EPLL_BP
1.5 Pll_bypass_M (Pll_control_M, 1, 28), // MPLL_BP
1.6
1.7 - Pll_multiplier_A (Pll_control_A, 0x1fff, 20), // APLLM
1.8 - Pll_multiplier_E (Pll_control_E, 0x1fff, 20), // EPLLM
1.9 - Pll_multiplier_M (Pll_control_M, 0x1fff, 20), // MPLLM
1.10 + Pll_multiplier_A (Pll_control_A, 0xfff, 20), // APLLM
1.11 + Pll_multiplier_E (Pll_control_E, 0x3f, 20), // EPLLM (observed)
1.12 + Pll_multiplier_M (Pll_control_M, 0xfff, 20), // MPLLM
1.13
1.14 Pll_input_division_A (Pll_control_A, 0x3f, 14), // APLLN
1.15 Pll_input_division_E (Pll_control_E, 0x3f, 14), // EPLLN
1.16 @@ -564,36 +564,15 @@
1.17 return clocks[clock]->get_frequency(_cpm_regs);
1.18 }
1.19
1.20 -void
1.21 +int
1.22 Cpm_x1600_chip::set_frequency(enum Clock_identifiers clock, uint32_t frequency)
1.23 {
1.24 - switch (clock)
1.25 - {
1.26 - // The pixel frequency is based on the selected clock source (SCLK_A, MPLL or
1.27 - // EPLL).
1.28 -
1.29 - case Clock_lcd_pixel:
1.30 - {
1.31 -
1.32 - // Switch to the MPLL and attempt to set the divider.
1.33 -
1.34 - Clock_divided_base *lcd = dynamic_cast<Clock_divided_base *>(clocks[Clock_lcd_pixel]);
1.35 - Clock_base *pll = clocks[Clock_pll_M];
1.36 + Clock_divided_base *clk = dynamic_cast<Clock_divided_base *>(clocks[clock]);
1.37
1.38 - if (lcd != NULL)
1.39 - {
1.40 - uint32_t parameters[] = {lcd->get_source_frequency(_cpm_regs) / frequency};
1.41 -
1.42 - lcd->set_source(_cpm_regs, Source_mME_pll_M);
1.43 - pll->start_clock(_cpm_regs);
1.44 - lcd->set_parameters(_cpm_regs, 1, parameters);
1.45 - }
1.46 - break;
1.47 - }
1.48 -
1.49 - default:
1.50 - break;
1.51 - }
1.52 + if (clk != NULL)
1.53 + return clk->set_frequency(_cpm_regs, frequency);
1.54 + else
1.55 + return 0;
1.56 }
1.57
1.58
1.59 @@ -681,8 +660,8 @@
1.60 return static_cast<Cpm_x1600_chip *>(cpm)->get_frequency(clock);
1.61 }
1.62
1.63 -void
1.64 +int
1.65 x1600_cpm_set_frequency(void *cpm, enum Clock_identifiers clock, uint32_t frequency)
1.66 {
1.67 - static_cast<Cpm_x1600_chip *>(cpm)->set_frequency(clock, frequency);
1.68 + return static_cast<Cpm_x1600_chip *>(cpm)->set_frequency(clock, frequency);
1.69 }