2016-06-29 21:05:23 +02:00
# ifndef _CCU_MULT_H_
# define _CCU_MULT_H_
2016-08-30 10:38:07 +02:00
# include "ccu_common.h"
2016-10-13 12:44:55 +02:00
# include "ccu_frac.h"
2016-08-30 10:38:07 +02:00
# include "ccu_mux.h"
2016-09-30 10:05:32 +02:00
struct ccu_mult_internal {
2016-11-08 18:12:34 +01:00
u8 offset ;
2016-06-29 21:05:23 +02:00
u8 shift ;
u8 width ;
2016-09-30 22:16:51 +02:00
u8 min ;
2016-10-14 12:08:19 +02:00
u8 max ;
2016-06-29 21:05:23 +02:00
} ;
2016-10-14 12:08:19 +02:00
# define _SUNXI_CCU_MULT_OFFSET_MIN_MAX(_shift, _width, _offset, _min, _max) \
2016-11-08 18:12:34 +01:00
{ \
. min = _min , \
2016-10-14 12:08:19 +02:00
. max = _max , \
2016-11-08 18:12:34 +01:00
. offset = _offset , \
. shift = _shift , \
. width = _width , \
2016-06-29 21:05:23 +02:00
}
2016-11-08 18:12:34 +01:00
# define _SUNXI_CCU_MULT_MIN(_shift, _width, _min) \
2016-10-14 12:08:19 +02:00
_SUNXI_CCU_MULT_OFFSET_MIN_MAX ( _shift , _width , 1 , _min , 0 )
2016-11-08 18:12:34 +01:00
# define _SUNXI_CCU_MULT_OFFSET(_shift, _width, _offset) \
2016-10-14 12:08:19 +02:00
_SUNXI_CCU_MULT_OFFSET_MIN_MAX ( _shift , _width , _offset , 1 , 0 )
2016-11-08 18:12:34 +01:00
2016-09-30 22:16:51 +02:00
# define _SUNXI_CCU_MULT(_shift, _width) \
2016-10-14 12:08:19 +02:00
_SUNXI_CCU_MULT_OFFSET_MIN_MAX ( _shift , _width , 1 , 1 , 0 )
2016-09-30 22:16:51 +02:00
2016-08-30 10:38:07 +02:00
struct ccu_mult {
u32 enable ;
2017-04-05 14:37:42 +08:00
u32 lock ;
2016-08-30 10:38:07 +02:00
2016-10-13 12:44:55 +02:00
struct ccu_frac_internal frac ;
2016-09-30 10:05:32 +02:00
struct ccu_mult_internal mult ;
2016-08-30 10:38:07 +02:00
struct ccu_mux_internal mux ;
struct ccu_common common ;
} ;
# define SUNXI_CCU_N_WITH_GATE_LOCK(_struct, _name, _parent, _reg, \
_mshift , _mwidth , _gate , _lock , \
_flags ) \
struct ccu_mult _struct = { \
. enable = _gate , \
2017-04-05 14:37:42 +08:00
. lock = _lock , \
2016-08-30 10:38:07 +02:00
. mult = _SUNXI_CCU_MULT ( _mshift , _mwidth ) , \
. common = { \
. reg = _reg , \
. hw . init = CLK_HW_INIT ( _name , \
_parent , \
& ccu_mult_ops , \
_flags ) , \
} , \
}
static inline struct ccu_mult * hw_to_ccu_mult ( struct clk_hw * hw )
{
struct ccu_common * common = hw_to_ccu_common ( hw ) ;
return container_of ( common , struct ccu_mult , common ) ;
}
extern const struct clk_ops ccu_mult_ops ;
2016-06-29 21:05:23 +02:00
# endif /* _CCU_MULT_H_ */