1.1 --- a/pkg/devices/lib/cpm/include/cpm-x1600.h Thu Sep 14 18:51:41 2023 +0200
1.2 +++ b/pkg/devices/lib/cpm/include/cpm-x1600.h Fri Sep 15 00:31:43 2023 +0200
1.3 @@ -32,6 +32,23 @@
1.4
1.5 #include <l4/devices/hw_register_block.h>
1.6
1.7 +/* Register access type. */
1.8 +
1.9 +class Cpm_regs
1.10 +{
1.11 + Hw::Register_block<32> _regs;
1.12 +
1.13 +public:
1.14 + uint32_t exclk_freq;
1.15 +
1.16 + explicit Cpm_regs(l4_addr_t addr, uint32_t exclk_freq);
1.17 +
1.18 + // Utility methods.
1.19 +
1.20 + uint32_t get_field(uint32_t reg, uint32_t mask, uint8_t shift);
1.21 + void set_field(uint32_t reg, uint32_t mask, uint8_t shift, uint32_t value);
1.22 +};
1.23 +
1.24 /* A simple abstraction for accessing the CPM registers.
1.25 * A proper device could inherit from Hw::Device and use an
1.26 * Int_property for _exclk_freq. */
1.27 @@ -41,39 +58,7 @@
1.28 private:
1.29 Hw::Register_block<32> _regs;
1.30 uint32_t _exclk_freq;
1.31 -
1.32 - // Utility methods.
1.33 -
1.34 - uint32_t get_field(uint32_t reg, uint32_t mask, uint8_t shift);
1.35 - void set_field(uint32_t reg, uint32_t mask, uint8_t shift, uint32_t value);
1.36 -
1.37 - // PLL control.
1.38 -
1.39 - int have_pll(uint32_t pll_reg);
1.40 - int pll_enabled(uint32_t pll_reg);
1.41 - int pll_bypassed(uint32_t pll_reg);
1.42 - void pll_disable(uint32_t pll_reg);
1.43 - void pll_enable(uint32_t pll_reg);
1.44 -
1.45 - // General frequency modifiers.
1.46 -
1.47 - uint16_t get_multiplier(uint32_t pll_reg);
1.48 - void set_multiplier(uint32_t pll_reg, uint16_t multiplier);
1.49 - uint8_t get_input_division(uint32_t pll_reg);
1.50 - void set_input_division(uint32_t pll_reg, uint8_t divider);
1.51 - uint8_t get_output_division(uint32_t pll_reg);
1.52 - void set_output_division(uint32_t pll_reg, uint8_t divider);
1.53 -
1.54 - // Input frequencies.
1.55 -
1.56 - uint32_t get_pll_frequency(uint32_t pll_reg);
1.57 - uint32_t get_input_frequency(enum Clock_input_identifiers clock);
1.58 -
1.59 - // Clock control.
1.60 -
1.61 - void change_disable(enum Clock_identifiers clock);
1.62 - void change_enable(enum Clock_identifiers clock);
1.63 - void wait_busy(enum Clock_identifiers clock);
1.64 + Cpm_regs _cpm_regs;
1.65
1.66 public:
1.67 Cpm_x1600_chip(l4_addr_t addr, uint32_t exclk_freq);
1.68 @@ -103,7 +88,8 @@
1.69
1.70 // Other operations.
1.71
1.72 - void set_pll_parameters(uint32_t pll_reg, uint16_t multiplier, uint8_t in_divider, uint8_t out_divider);
1.73 + void set_pll_parameters(enum Clock_identifiers clock, uint16_t multiplier,
1.74 + uint8_t in_divider, uint8_t out_divider);
1.75 };
1.76
1.77 #endif /* __cplusplus */