1e986e25d0
There are 5 PLLs in the CPRMAN, namely PLL A, C, D, H and B. All of them take the xosc clock as input and produce a new clock. This commit adds a skeleton implementation for the PLLs as sub-devices of the CPRMAN. The PLLs are instantiated and connected internally to the main oscillator. Each PLL has 6 registers : CM, A2W_CTRL, A2W_ANA[0,1,2,3], A2W_FRAC. A write to any of them triggers a call to the (not yet implemented) pll_update function. If the main oscillator changes frequency, an update is also triggered. Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Signed-off-by: Luc Michel <luc@lmichel.fr> Tested-by: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
67 lines
1.2 KiB
C
67 lines
1.2 KiB
C
/*
|
|
* BCM2835 CPRMAN clock manager
|
|
*
|
|
* Copyright (c) 2020 Luc Michel <luc@lmichel.fr>
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
|
*/
|
|
|
|
#ifndef HW_MISC_CPRMAN_H
|
|
#define HW_MISC_CPRMAN_H
|
|
|
|
#include "hw/sysbus.h"
|
|
#include "hw/qdev-clock.h"
|
|
|
|
#define TYPE_BCM2835_CPRMAN "bcm2835-cprman"
|
|
|
|
typedef struct BCM2835CprmanState BCM2835CprmanState;
|
|
|
|
DECLARE_INSTANCE_CHECKER(BCM2835CprmanState, CPRMAN,
|
|
TYPE_BCM2835_CPRMAN)
|
|
|
|
#define CPRMAN_NUM_REGS (0x2000 / sizeof(uint32_t))
|
|
|
|
typedef enum CprmanPll {
|
|
CPRMAN_PLLA = 0,
|
|
CPRMAN_PLLC,
|
|
CPRMAN_PLLD,
|
|
CPRMAN_PLLH,
|
|
CPRMAN_PLLB,
|
|
|
|
CPRMAN_NUM_PLL
|
|
} CprmanPll;
|
|
|
|
typedef struct CprmanPllState {
|
|
/*< private >*/
|
|
DeviceState parent_obj;
|
|
|
|
/*< public >*/
|
|
CprmanPll id;
|
|
|
|
uint32_t *reg_cm;
|
|
uint32_t *reg_a2w_ctrl;
|
|
uint32_t *reg_a2w_ana; /* ANA[0] .. ANA[3] */
|
|
uint32_t prediv_mask; /* prediv bit in ana[1] */
|
|
uint32_t *reg_a2w_frac;
|
|
|
|
Clock *xosc_in;
|
|
Clock *out;
|
|
} CprmanPllState;
|
|
|
|
struct BCM2835CprmanState {
|
|
/*< private >*/
|
|
SysBusDevice parent_obj;
|
|
|
|
/*< public >*/
|
|
MemoryRegion iomem;
|
|
|
|
CprmanPllState plls[CPRMAN_NUM_PLL];
|
|
|
|
uint32_t regs[CPRMAN_NUM_REGS];
|
|
uint32_t xosc_freq;
|
|
|
|
Clock *xosc;
|
|
};
|
|
|
|
#endif
|