mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	dpll: netlink: Add DPLL framework base functions
DPLL framework is used to represent and configure DPLL devices in systems. Each device that has DPLL and can configure inputs and outputs can use this framework. Implement dpll netlink framework functions for enablement of dpll subsystem netlink family. Co-developed-by: Milena Olech <milena.olech@intel.com> Signed-off-by: Milena Olech <milena.olech@intel.com> Co-developed-by: Michal Michalik <michal.michalik@intel.com> Signed-off-by: Michal Michalik <michal.michalik@intel.com> Signed-off-by: Vadim Fedorenko <vadim.fedorenko@linux.dev> Co-developed-by: Arkadiusz Kubalewski <arkadiusz.kubalewski@intel.com> Signed-off-by: Arkadiusz Kubalewski <arkadiusz.kubalewski@intel.com> Signed-off-by: Jiri Pirko <jiri@nvidia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									9431063ad3
								
							
						
					
					
						commit
						9d71b54b65
					
				
					 4 changed files with 1268 additions and 1 deletions
				
			
		| 
						 | 
					@ -14,6 +14,7 @@
 | 
				
			||||||
#include <linux/string.h>
 | 
					#include <linux/string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "dpll_core.h"
 | 
					#include "dpll_core.h"
 | 
				
			||||||
 | 
					#include "dpll_netlink.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Mutex lock to protect DPLL subsystem devices and pins */
 | 
					/* Mutex lock to protect DPLL subsystem devices and pins */
 | 
				
			||||||
DEFINE_MUTEX(dpll_lock);
 | 
					DEFINE_MUTEX(dpll_lock);
 | 
				
			||||||
| 
						 | 
					@ -381,6 +382,7 @@ int dpll_device_register(struct dpll_device *dpll, enum dpll_type type,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	xa_set_mark(&dpll_device_xa, dpll->id, DPLL_REGISTERED);
 | 
						xa_set_mark(&dpll_device_xa, dpll->id, DPLL_REGISTERED);
 | 
				
			||||||
 | 
						dpll_device_create_ntf(dpll);
 | 
				
			||||||
	mutex_unlock(&dpll_lock);
 | 
						mutex_unlock(&dpll_lock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
| 
						 | 
					@ -404,6 +406,7 @@ void dpll_device_unregister(struct dpll_device *dpll,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mutex_lock(&dpll_lock);
 | 
						mutex_lock(&dpll_lock);
 | 
				
			||||||
	ASSERT_DPLL_REGISTERED(dpll);
 | 
						ASSERT_DPLL_REGISTERED(dpll);
 | 
				
			||||||
 | 
						dpll_device_delete_ntf(dpll);
 | 
				
			||||||
	reg = dpll_device_registration_find(dpll, ops, priv);
 | 
						reg = dpll_device_registration_find(dpll, ops, priv);
 | 
				
			||||||
	if (WARN_ON(!reg)) {
 | 
						if (WARN_ON(!reg)) {
 | 
				
			||||||
		mutex_unlock(&dpll_lock);
 | 
							mutex_unlock(&dpll_lock);
 | 
				
			||||||
| 
						 | 
					@ -528,6 +531,7 @@ __dpll_pin_register(struct dpll_device *dpll, struct dpll_pin *pin,
 | 
				
			||||||
	if (ret)
 | 
						if (ret)
 | 
				
			||||||
		goto ref_pin_del;
 | 
							goto ref_pin_del;
 | 
				
			||||||
	xa_set_mark(&dpll_pin_xa, pin->id, DPLL_REGISTERED);
 | 
						xa_set_mark(&dpll_pin_xa, pin->id, DPLL_REGISTERED);
 | 
				
			||||||
 | 
						dpll_pin_create_ntf(pin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -602,6 +606,7 @@ void dpll_pin_unregister(struct dpll_device *dpll, struct dpll_pin *pin,
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mutex_lock(&dpll_lock);
 | 
						mutex_lock(&dpll_lock);
 | 
				
			||||||
 | 
						dpll_pin_delete_ntf(pin);
 | 
				
			||||||
	__dpll_pin_unregister(dpll, pin, ops, priv);
 | 
						__dpll_pin_unregister(dpll, pin, ops, priv);
 | 
				
			||||||
	mutex_unlock(&dpll_lock);
 | 
						mutex_unlock(&dpll_lock);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -650,6 +655,7 @@ int dpll_pin_on_pin_register(struct dpll_pin *parent, struct dpll_pin *pin,
 | 
				
			||||||
			stop = i;
 | 
								stop = i;
 | 
				
			||||||
			goto dpll_unregister;
 | 
								goto dpll_unregister;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							dpll_pin_create_ntf(pin);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	mutex_unlock(&dpll_lock);
 | 
						mutex_unlock(&dpll_lock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -657,8 +663,10 @@ int dpll_pin_on_pin_register(struct dpll_pin *parent, struct dpll_pin *pin,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dpll_unregister:
 | 
					dpll_unregister:
 | 
				
			||||||
	xa_for_each(&parent->dpll_refs, i, ref)
 | 
						xa_for_each(&parent->dpll_refs, i, ref)
 | 
				
			||||||
		if (i < stop)
 | 
							if (i < stop) {
 | 
				
			||||||
			__dpll_pin_unregister(ref->dpll, pin, ops, priv);
 | 
								__dpll_pin_unregister(ref->dpll, pin, ops, priv);
 | 
				
			||||||
 | 
								dpll_pin_delete_ntf(pin);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	refcount_dec(&pin->refcount);
 | 
						refcount_dec(&pin->refcount);
 | 
				
			||||||
	dpll_xa_ref_pin_del(&pin->parent_refs, parent, ops, priv);
 | 
						dpll_xa_ref_pin_del(&pin->parent_refs, parent, ops, priv);
 | 
				
			||||||
unlock:
 | 
					unlock:
 | 
				
			||||||
| 
						 | 
					@ -684,6 +692,7 @@ void dpll_pin_on_pin_unregister(struct dpll_pin *parent, struct dpll_pin *pin,
 | 
				
			||||||
	unsigned long i;
 | 
						unsigned long i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mutex_lock(&dpll_lock);
 | 
						mutex_lock(&dpll_lock);
 | 
				
			||||||
 | 
						dpll_pin_delete_ntf(pin);
 | 
				
			||||||
	dpll_xa_ref_pin_del(&pin->parent_refs, parent, ops, priv);
 | 
						dpll_xa_ref_pin_del(&pin->parent_refs, parent, ops, priv);
 | 
				
			||||||
	refcount_dec(&pin->refcount);
 | 
						refcount_dec(&pin->refcount);
 | 
				
			||||||
	xa_for_each(&pin->dpll_refs, i, ref)
 | 
						xa_for_each(&pin->dpll_refs, i, ref)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										1241
									
								
								drivers/dpll/dpll_netlink.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1241
									
								
								drivers/dpll/dpll_netlink.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										13
									
								
								drivers/dpll/dpll_netlink.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								drivers/dpll/dpll_netlink.h
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,13 @@
 | 
				
			||||||
 | 
					/* SPDX-License-Identifier: GPL-2.0 */
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 *  Copyright (c) 2023 Meta Platforms, Inc. and affiliates
 | 
				
			||||||
 | 
					 *  Copyright (c) 2023 Intel and affiliates
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int dpll_device_create_ntf(struct dpll_device *dpll);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int dpll_device_delete_ntf(struct dpll_device *dpll);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int dpll_pin_create_ntf(struct dpll_pin *pin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int dpll_pin_delete_ntf(struct dpll_pin *pin);
 | 
				
			||||||
| 
						 | 
					@ -130,4 +130,8 @@ int dpll_pin_on_pin_register(struct dpll_pin *parent, struct dpll_pin *pin,
 | 
				
			||||||
void dpll_pin_on_pin_unregister(struct dpll_pin *parent, struct dpll_pin *pin,
 | 
					void dpll_pin_on_pin_unregister(struct dpll_pin *parent, struct dpll_pin *pin,
 | 
				
			||||||
				const struct dpll_pin_ops *ops, void *priv);
 | 
									const struct dpll_pin_ops *ops, void *priv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int dpll_device_change_ntf(struct dpll_device *dpll);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int dpll_pin_change_ntf(struct dpll_pin *pin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue