2018-07-16 08:54:32 +03:00
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (c) 2015, 2018, The Linux Foundation. All rights reserved. */
2015-12-01 04:31:39 +03:00
# ifndef __QCOM_CLK_ALPHA_PLL_H__
# define __QCOM_CLK_ALPHA_PLL_H__
# include <linux/clk-provider.h>
# include "clk-regmap.h"
2017-09-28 20:50:40 +03:00
/* Alpha PLL types */
enum {
CLK_ALPHA_PLL_TYPE_DEFAULT ,
2017-09-28 20:50:46 +03:00
CLK_ALPHA_PLL_TYPE_HUAYRA ,
2017-09-28 20:50:48 +03:00
CLK_ALPHA_PLL_TYPE_BRAMMO ,
2018-03-08 10:18:14 +03:00
CLK_ALPHA_PLL_TYPE_FABIA ,
2017-09-28 20:50:40 +03:00
CLK_ALPHA_PLL_TYPE_MAX ,
} ;
enum {
PLL_OFF_L_VAL ,
PLL_OFF_ALPHA_VAL ,
PLL_OFF_ALPHA_VAL_U ,
PLL_OFF_USER_CTL ,
PLL_OFF_USER_CTL_U ,
PLL_OFF_CONFIG_CTL ,
PLL_OFF_CONFIG_CTL_U ,
PLL_OFF_TEST_CTL ,
PLL_OFF_TEST_CTL_U ,
PLL_OFF_STATUS ,
2018-03-08 10:18:14 +03:00
PLL_OFF_OPMODE ,
PLL_OFF_FRAC ,
2017-09-28 20:50:40 +03:00
PLL_OFF_MAX_REGS
} ;
extern const u8 clk_alpha_pll_regs [ CLK_ALPHA_PLL_TYPE_MAX ] [ PLL_OFF_MAX_REGS ] ;
2015-12-01 04:31:39 +03:00
struct pll_vco {
unsigned long min_freq ;
unsigned long max_freq ;
u32 val ;
} ;
/**
* struct clk_alpha_pll - phase locked loop ( PLL )
* @ offset : base address of registers
* @ vco_table : array of VCO settings
2017-09-28 20:50:40 +03:00
* @ regs : alpha pll register map ( see @ clk_alpha_pll_regs )
2015-12-01 04:31:39 +03:00
* @ clkr : regmap clock handle
*/
struct clk_alpha_pll {
u32 offset ;
2017-09-28 20:50:40 +03:00
const u8 * regs ;
2015-12-01 04:31:39 +03:00
const struct pll_vco * vco_table ;
size_t num_vco ;
2016-09-29 11:35:42 +03:00
# define SUPPORTS_OFFLINE_REQ BIT(0)
2016-09-29 11:35:45 +03:00
# define SUPPORTS_FSM_MODE BIT(2)
2017-09-28 20:50:45 +03:00
# define SUPPORTS_DYNAMIC_UPDATE BIT(3)
2016-09-29 11:35:42 +03:00
u8 flags ;
2015-12-01 04:31:39 +03:00
struct clk_regmap clkr ;
} ;
/**
* struct clk_alpha_pll_postdiv - phase locked loop ( PLL ) post - divider
* @ offset : base address of registers
2017-09-28 20:50:40 +03:00
* @ regs : alpha pll register map ( see @ clk_alpha_pll_regs )
2015-12-01 04:31:39 +03:00
* @ width : width of post - divider
2018-03-08 10:18:14 +03:00
* @ post_div_shift : shift to differentiate between odd & even post - divider
* @ post_div_table : table with PLL odd and even post - divider settings
* @ num_post_div : Number of PLL post - divider settings
*
2015-12-01 04:31:39 +03:00
* @ clkr : regmap clock handle
*/
struct clk_alpha_pll_postdiv {
u32 offset ;
u8 width ;
2017-09-28 20:50:40 +03:00
const u8 * regs ;
2015-12-01 04:31:39 +03:00
struct clk_regmap clkr ;
2018-03-08 10:18:14 +03:00
int post_div_shift ;
const struct clk_div_table * post_div_table ;
size_t num_post_div ;
2015-12-01 04:31:39 +03:00
} ;
2016-09-29 11:35:43 +03:00
struct alpha_pll_config {
u32 l ;
u32 alpha ;
2017-09-28 20:50:44 +03:00
u32 alpha_hi ;
2016-09-29 11:35:43 +03:00
u32 config_ctl_val ;
u32 config_ctl_hi_val ;
u32 main_output_mask ;
u32 aux_output_mask ;
u32 aux2_output_mask ;
u32 early_output_mask ;
2017-09-28 20:50:44 +03:00
u32 alpha_en_mask ;
u32 alpha_mode_mask ;
2016-09-29 11:35:43 +03:00
u32 pre_div_val ;
u32 pre_div_mask ;
u32 post_div_val ;
u32 post_div_mask ;
u32 vco_val ;
u32 vco_mask ;
} ;
2015-12-01 04:31:39 +03:00
extern const struct clk_ops clk_alpha_pll_ops ;
2016-09-29 11:35:42 +03:00
extern const struct clk_ops clk_alpha_pll_hwfsm_ops ;
2015-12-01 04:31:39 +03:00
extern const struct clk_ops clk_alpha_pll_postdiv_ops ;
2017-09-28 20:50:46 +03:00
extern const struct clk_ops clk_alpha_pll_huayra_ops ;
2017-09-28 20:50:50 +03:00
extern const struct clk_ops clk_alpha_pll_postdiv_ro_ops ;
2015-12-01 04:31:39 +03:00
2018-03-08 10:18:14 +03:00
extern const struct clk_ops clk_alpha_pll_fabia_ops ;
extern const struct clk_ops clk_alpha_pll_fixed_fabia_ops ;
extern const struct clk_ops clk_alpha_pll_postdiv_fabia_ops ;
2016-09-29 11:35:43 +03:00
void clk_alpha_pll_configure ( struct clk_alpha_pll * pll , struct regmap * regmap ,
const struct alpha_pll_config * config ) ;
2018-03-08 10:18:14 +03:00
void clk_fabia_pll_configure ( struct clk_alpha_pll * pll , struct regmap * regmap ,
const struct alpha_pll_config * config ) ;
2016-09-29 11:35:43 +03:00
2015-12-01 04:31:39 +03:00
# endif