87 lines
2.3 KiB
C
87 lines
2.3 KiB
C
|
/* SPDX-License-Identifier: GPL-2.0+ */
|
||
|
/*
|
||
|
* Copyright (C) 2023 Loongson Technology Corporation Limited
|
||
|
*/
|
||
|
|
||
|
#ifndef __LSDC_PIXPLL_H__
|
||
|
#define __LSDC_PIXPLL_H__
|
||
|
|
||
|
#include <drm/drm_device.h>
|
||
|
|
||
|
/*
|
||
|
* Loongson Pixel PLL hardware structure
|
||
|
*
|
||
|
* refclk: reference frequency, 100 MHz from external oscillator
|
||
|
* outclk: output frequency desired.
|
||
|
*
|
||
|
*
|
||
|
* L1 Fref Fvco L2
|
||
|
* refclk +-----------+ +------------------+ +---------+ outclk
|
||
|
* ---+---> | Prescaler | ---> | Clock Multiplier | ---> | divider | -------->
|
||
|
* | +-----------+ +------------------+ +---------+ ^
|
||
|
* | ^ ^ ^ |
|
||
|
* | | | | |
|
||
|
* | | | | |
|
||
|
* | div_ref loopc div_out |
|
||
|
* | |
|
||
|
* +---- bypass (bypass above software configurable clock if set) ----+
|
||
|
*
|
||
|
* outclk = refclk / div_ref * loopc / div_out;
|
||
|
*
|
||
|
* sel_out: PLL clock output selector(enable).
|
||
|
*
|
||
|
* If sel_out == 1, then enable output clock (turn On);
|
||
|
* If sel_out == 0, then disable output clock (turn Off);
|
||
|
*
|
||
|
* PLL working requirements:
|
||
|
*
|
||
|
* 1) 20 MHz <= refclk / div_ref <= 40Mhz
|
||
|
* 2) 1.2 GHz <= refclk /div_out * loopc <= 3.2 Ghz
|
||
|
*/
|
||
|
|
||
|
struct lsdc_pixpll_parms {
|
||
|
unsigned int ref_clock;
|
||
|
unsigned int div_ref;
|
||
|
unsigned int loopc;
|
||
|
unsigned int div_out;
|
||
|
};
|
||
|
|
||
|
struct lsdc_pixpll;
|
||
|
|
||
|
struct lsdc_pixpll_funcs {
|
||
|
int (*setup)(struct lsdc_pixpll * const this);
|
||
|
|
||
|
int (*compute)(struct lsdc_pixpll * const this,
|
||
|
unsigned int clock,
|
||
|
struct lsdc_pixpll_parms *pout);
|
||
|
|
||
|
int (*update)(struct lsdc_pixpll * const this,
|
||
|
struct lsdc_pixpll_parms const *pin);
|
||
|
|
||
|
unsigned int (*get_rate)(struct lsdc_pixpll * const this);
|
||
|
|
||
|
void (*print)(struct lsdc_pixpll * const this,
|
||
|
struct drm_printer *printer);
|
||
|
};
|
||
|
|
||
|
struct lsdc_pixpll {
|
||
|
const struct lsdc_pixpll_funcs *funcs;
|
||
|
|
||
|
struct drm_device *ddev;
|
||
|
|
||
|
/* PLL register offset */
|
||
|
u32 reg_base;
|
||
|
/* PLL register size in bytes */
|
||
|
u32 reg_size;
|
||
|
|
||
|
void __iomem *mmio;
|
||
|
|
||
|
struct lsdc_pixpll_parms *priv;
|
||
|
};
|
||
|
|
||
|
int lsdc_pixpll_init(struct lsdc_pixpll * const this,
|
||
|
struct drm_device *ddev,
|
||
|
unsigned int index);
|
||
|
|
||
|
#endif
|