forked from mirrors/linux
		
	net: fixed-phy: Add fixed_phy_register_with_gpiod() API
Add fixed_phy_register_with_gpiod() API. It lets users create a fixed_phy instance that uses a GPIO descriptor which was obtained externally e.g. through platform data. This enables platform devices (non-DT based) to use GPIOs for link status. Signed-off-by: Moritz Fischer <mdf@kernel.org> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									a4751093a2
								
							
						
					
					
						commit
						71bd106d25
					
				
					 2 changed files with 40 additions and 7 deletions
				
			
		|  | @ -229,12 +229,12 @@ static struct gpio_desc *fixed_phy_get_gpiod(struct device_node *np) | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| struct phy_device *fixed_phy_register(unsigned int irq, | static struct phy_device *__fixed_phy_register(unsigned int irq, | ||||||
| 				      struct fixed_phy_status *status, | 					       struct fixed_phy_status *status, | ||||||
| 				      struct device_node *np) | 					       struct device_node *np, | ||||||
|  | 					       struct gpio_desc *gpiod) | ||||||
| { | { | ||||||
| 	struct fixed_mdio_bus *fmb = &platform_fmb; | 	struct fixed_mdio_bus *fmb = &platform_fmb; | ||||||
| 	struct gpio_desc *gpiod = NULL; |  | ||||||
| 	struct phy_device *phy; | 	struct phy_device *phy; | ||||||
| 	int phy_addr; | 	int phy_addr; | ||||||
| 	int ret; | 	int ret; | ||||||
|  | @ -243,9 +243,11 @@ struct phy_device *fixed_phy_register(unsigned int irq, | ||||||
| 		return ERR_PTR(-EPROBE_DEFER); | 		return ERR_PTR(-EPROBE_DEFER); | ||||||
| 
 | 
 | ||||||
| 	/* Check if we have a GPIO associated with this fixed phy */ | 	/* Check if we have a GPIO associated with this fixed phy */ | ||||||
| 	gpiod = fixed_phy_get_gpiod(np); | 	if (!gpiod) { | ||||||
| 	if (IS_ERR(gpiod)) | 		gpiod = fixed_phy_get_gpiod(np); | ||||||
| 		return ERR_CAST(gpiod); | 		if (IS_ERR(gpiod)) | ||||||
|  | 			return ERR_CAST(gpiod); | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	/* Get the next available PHY address, up to PHY_MAX_ADDR */ | 	/* Get the next available PHY address, up to PHY_MAX_ADDR */ | ||||||
| 	phy_addr = ida_simple_get(&phy_fixed_ida, 0, PHY_MAX_ADDR, GFP_KERNEL); | 	phy_addr = ida_simple_get(&phy_fixed_ida, 0, PHY_MAX_ADDR, GFP_KERNEL); | ||||||
|  | @ -308,8 +310,24 @@ struct phy_device *fixed_phy_register(unsigned int irq, | ||||||
| 
 | 
 | ||||||
| 	return phy; | 	return phy; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | struct phy_device *fixed_phy_register(unsigned int irq, | ||||||
|  | 				      struct fixed_phy_status *status, | ||||||
|  | 				      struct device_node *np) | ||||||
|  | { | ||||||
|  | 	return __fixed_phy_register(irq, status, np, NULL); | ||||||
|  | } | ||||||
| EXPORT_SYMBOL_GPL(fixed_phy_register); | EXPORT_SYMBOL_GPL(fixed_phy_register); | ||||||
| 
 | 
 | ||||||
|  | struct phy_device * | ||||||
|  | fixed_phy_register_with_gpiod(unsigned int irq, | ||||||
|  | 			      struct fixed_phy_status *status, | ||||||
|  | 			      struct gpio_desc *gpiod) | ||||||
|  | { | ||||||
|  | 	return __fixed_phy_register(irq, status, NULL, gpiod); | ||||||
|  | } | ||||||
|  | EXPORT_SYMBOL_GPL(fixed_phy_register_with_gpiod); | ||||||
|  | 
 | ||||||
| void fixed_phy_unregister(struct phy_device *phy) | void fixed_phy_unregister(struct phy_device *phy) | ||||||
| { | { | ||||||
| 	phy_device_remove(phy); | 	phy_device_remove(phy); | ||||||
|  |  | ||||||
|  | @ -19,6 +19,12 @@ extern int fixed_phy_add(unsigned int irq, int phy_id, | ||||||
| extern struct phy_device *fixed_phy_register(unsigned int irq, | extern struct phy_device *fixed_phy_register(unsigned int irq, | ||||||
| 					     struct fixed_phy_status *status, | 					     struct fixed_phy_status *status, | ||||||
| 					     struct device_node *np); | 					     struct device_node *np); | ||||||
|  | 
 | ||||||
|  | extern struct phy_device * | ||||||
|  | fixed_phy_register_with_gpiod(unsigned int irq, | ||||||
|  | 			      struct fixed_phy_status *status, | ||||||
|  | 			      struct gpio_desc *gpiod); | ||||||
|  | 
 | ||||||
| extern void fixed_phy_unregister(struct phy_device *phydev); | extern void fixed_phy_unregister(struct phy_device *phydev); | ||||||
| extern int fixed_phy_set_link_update(struct phy_device *phydev, | extern int fixed_phy_set_link_update(struct phy_device *phydev, | ||||||
| 			int (*link_update)(struct net_device *, | 			int (*link_update)(struct net_device *, | ||||||
|  | @ -35,6 +41,15 @@ static inline struct phy_device *fixed_phy_register(unsigned int irq, | ||||||
| { | { | ||||||
| 	return ERR_PTR(-ENODEV); | 	return ERR_PTR(-ENODEV); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | static inline struct phy_device * | ||||||
|  | fixed_phy_register_with_gpiod(unsigned int irq, | ||||||
|  | 			      struct fixed_phy_status *status, | ||||||
|  | 			      struct gpio_desc *gpiod) | ||||||
|  | { | ||||||
|  | 	return ERR_PTR(-ENODEV); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static inline void fixed_phy_unregister(struct phy_device *phydev) | static inline void fixed_phy_unregister(struct phy_device *phydev) | ||||||
| { | { | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Moritz Fischer
						Moritz Fischer