mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.2 KiB
83 lines
2.2 KiB
/* SPDX-License-Identifier: GPL-2.0 */ |
|
// |
|
// Spreadtrum divider clock driver |
|
// |
|
// Copyright (C) 2017 Spreadtrum, Inc. |
|
// Author: Chunyan Zhang <[email protected]> |
|
|
|
#ifndef _SPRD_DIV_H_ |
|
#define _SPRD_DIV_H_ |
|
|
|
#include "common.h" |
|
|
|
/** |
|
* struct sprd_div_internal - Internal divider description |
|
* @shift: Bit offset of the divider in its register |
|
* @width: Width of the divider field in its register |
|
* |
|
* That structure represents a single divider, and is meant to be |
|
* embedded in other structures representing the various clock |
|
* classes. |
|
*/ |
|
struct sprd_div_internal { |
|
u8 shift; |
|
u8 width; |
|
}; |
|
|
|
#define _SPRD_DIV_CLK(_shift, _width) \ |
|
{ \ |
|
.shift = _shift, \ |
|
.width = _width, \ |
|
} |
|
|
|
struct sprd_div { |
|
struct sprd_div_internal div; |
|
struct sprd_clk_common common; |
|
}; |
|
|
|
#define SPRD_DIV_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \ |
|
_shift, _width, _flags, _fn) \ |
|
struct sprd_div _struct = { \ |
|
.div = _SPRD_DIV_CLK(_shift, _width), \ |
|
.common = { \ |
|
.regmap = NULL, \ |
|
.reg = _reg, \ |
|
.hw.init = _fn(_name, _parent, \ |
|
&sprd_div_ops, _flags), \ |
|
} \ |
|
} |
|
|
|
#define SPRD_DIV_CLK(_struct, _name, _parent, _reg, \ |
|
_shift, _width, _flags) \ |
|
SPRD_DIV_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \ |
|
_shift, _width, _flags, CLK_HW_INIT) |
|
|
|
#define SPRD_DIV_CLK_HW(_struct, _name, _parent, _reg, \ |
|
_shift, _width, _flags) \ |
|
SPRD_DIV_CLK_HW_INIT_FN(_struct, _name, _parent, _reg, \ |
|
_shift, _width, _flags, CLK_HW_INIT_HW) |
|
|
|
static inline struct sprd_div *hw_to_sprd_div(const struct clk_hw *hw) |
|
{ |
|
struct sprd_clk_common *common = hw_to_sprd_clk_common(hw); |
|
|
|
return container_of(common, struct sprd_div, common); |
|
} |
|
|
|
long sprd_div_helper_round_rate(struct sprd_clk_common *common, |
|
const struct sprd_div_internal *div, |
|
unsigned long rate, |
|
unsigned long *parent_rate); |
|
|
|
unsigned long sprd_div_helper_recalc_rate(struct sprd_clk_common *common, |
|
const struct sprd_div_internal *div, |
|
unsigned long parent_rate); |
|
|
|
int sprd_div_helper_set_rate(const struct sprd_clk_common *common, |
|
const struct sprd_div_internal *div, |
|
unsigned long rate, |
|
unsigned long parent_rate); |
|
|
|
extern const struct clk_ops sprd_div_ops; |
|
|
|
#endif /* _SPRD_DIV_H_ */
|
|
|