forked from mirrors/linux
		
	device property: Fix the secondary firmware node handling in set_primary_fwnode()
When the primary firmware node pointer is removed from a
device (set to NULL) the secondary firmware node pointer,
when it exists, is made the primary node for the device.
However, the secondary firmware node pointer of the original
primary firmware node is never cleared (set to NULL).
To avoid situation where the secondary firmware node pointer
is pointing to a non-existing object, clearing it properly
when the primary node is removed from a device in
set_primary_fwnode().
Fixes: 97badf873a ("device property: Make it possible to use secondary firmware nodes")
Cc: All applicable <stable@vger.kernel.org>
Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
			
			
This commit is contained in:
		
							parent
							
								
									9123e3a74e
								
							
						
					
					
						commit
						c15e1bdda4
					
				
					 1 changed files with 8 additions and 4 deletions
				
			
		| 
						 | 
					@ -4264,9 +4264,9 @@ static inline bool fwnode_is_primary(struct fwnode_handle *fwnode)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
void set_primary_fwnode(struct device *dev, struct fwnode_handle *fwnode)
 | 
					void set_primary_fwnode(struct device *dev, struct fwnode_handle *fwnode)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (fwnode) {
 | 
					 | 
				
			||||||
	struct fwnode_handle *fn = dev->fwnode;
 | 
						struct fwnode_handle *fn = dev->fwnode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (fwnode) {
 | 
				
			||||||
		if (fwnode_is_primary(fn))
 | 
							if (fwnode_is_primary(fn))
 | 
				
			||||||
			fn = fn->secondary;
 | 
								fn = fn->secondary;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4276,8 +4276,12 @@ void set_primary_fwnode(struct device *dev, struct fwnode_handle *fwnode)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		dev->fwnode = fwnode;
 | 
							dev->fwnode = fwnode;
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		dev->fwnode = fwnode_is_primary(dev->fwnode) ?
 | 
							if (fwnode_is_primary(fn)) {
 | 
				
			||||||
			dev->fwnode->secondary : NULL;
 | 
								dev->fwnode = fn->secondary;
 | 
				
			||||||
 | 
								fn->secondary = NULL;
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								dev->fwnode = NULL;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL_GPL(set_primary_fwnode);
 | 
					EXPORT_SYMBOL_GPL(set_primary_fwnode);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue