forked from mirrors/linux
		
	 889c2b7ec4
			
		
	
	
		889c2b7ec4
		
	
	
	
	
		
			
			Initially, the meson clock directory only hosted 2 controllers drivers, for meson8 and gxbb. At the time, both used the same set of clock drivers so managing the dependencies was not a big concern. Since this ancient time, entropy did its job, controllers with different requirement and specific clock drivers have been added. Unfortunately, we did not do a great job at managing the dependencies between the controllers and the different clock drivers. Some drivers, such as clk-phase or vid-pll-div, are compiled even if they are useless on the target (meson8). As we are adding new controllers, we need to be able to pick a driver w/o pulling the whole thing. The patch aims to clean things up by: * providing a dedicated CONFIG_ for each clock drivers * allowing clock drivers to be compiled as a modules, if possible * stating explicitly which drivers are required by each controller. Signed-off-by: Jerome Brunet <jbrunet@baylibre.com> Signed-off-by: Neil Armstrong <narmstrong@baylibre.com> Link: https://lkml.kernel.org/r/20190201125841.26785-5-jbrunet@baylibre.com
		
			
				
	
	
		
			46 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| /*
 | |
|  * Copyright (c) 2015 Endless Mobile, Inc.
 | |
|  * Author: Carlo Caione <carlo@endlessm.com>
 | |
|  */
 | |
| 
 | |
| #ifndef __MESON_PARM_H
 | |
| #define __MESON_PARM_H
 | |
| 
 | |
| #include <linux/bits.h>
 | |
| #include <linux/regmap.h>
 | |
| 
 | |
| #define PMASK(width)			GENMASK(width - 1, 0)
 | |
| #define SETPMASK(width, shift)		GENMASK(shift + width - 1, shift)
 | |
| #define CLRPMASK(width, shift)		(~SETPMASK(width, shift))
 | |
| 
 | |
| #define PARM_GET(width, shift, reg)					\
 | |
| 	(((reg) & SETPMASK(width, shift)) >> (shift))
 | |
| #define PARM_SET(width, shift, reg, val)				\
 | |
| 	(((reg) & CLRPMASK(width, shift)) | ((val) << (shift)))
 | |
| 
 | |
| #define MESON_PARM_APPLICABLE(p)		(!!((p)->width))
 | |
| 
 | |
| struct parm {
 | |
| 	u16	reg_off;
 | |
| 	u8	shift;
 | |
| 	u8	width;
 | |
| };
 | |
| 
 | |
| static inline unsigned int meson_parm_read(struct regmap *map, struct parm *p)
 | |
| {
 | |
| 	unsigned int val;
 | |
| 
 | |
| 	regmap_read(map, p->reg_off, &val);
 | |
| 	return PARM_GET(p->width, p->shift, val);
 | |
| }
 | |
| 
 | |
| static inline void meson_parm_write(struct regmap *map, struct parm *p,
 | |
| 				    unsigned int val)
 | |
| {
 | |
| 	regmap_update_bits(map, p->reg_off, SETPMASK(p->width, p->shift),
 | |
| 			   val << p->shift);
 | |
| }
 | |
| 
 | |
| #endif /* __MESON_PARM_H */
 | |
| 
 |