Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

usb: ulpi: Add resource-managed variant of otg_ulpi_create()

Now drivers (like NVIDIA Tegra USB PHY for example) will be able to
benefit from the resource-managed variant, making driver's code a bit
cleaner.

Suggested-by: Thierry Reding <thierry.reding@gmail.com>
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
Link: https://lore.kernel.org/r/20200106013416.9604-11-digetx@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Dmitry Osipenko and committed by
Greg Kroah-Hartman
dea75ee6 9df3adca

+50 -9
+39 -9
drivers/usb/phy/phy-ulpi.c
··· 240 240 return usb_phy_io_write(phy, flags, ULPI_OTG_CTRL); 241 241 } 242 242 243 + static void otg_ulpi_init(struct usb_phy *phy, struct usb_otg *otg, 244 + struct usb_phy_io_ops *ops, 245 + unsigned int flags) 246 + { 247 + phy->label = "ULPI"; 248 + phy->flags = flags; 249 + phy->io_ops = ops; 250 + phy->otg = otg; 251 + phy->init = ulpi_init; 252 + 253 + otg->usb_phy = phy; 254 + otg->set_host = ulpi_set_host; 255 + otg->set_vbus = ulpi_set_vbus; 256 + } 257 + 243 258 struct usb_phy * 244 259 otg_ulpi_create(struct usb_phy_io_ops *ops, 245 260 unsigned int flags) ··· 272 257 return NULL; 273 258 } 274 259 275 - phy->label = "ULPI"; 276 - phy->flags = flags; 277 - phy->io_ops = ops; 278 - phy->otg = otg; 279 - phy->init = ulpi_init; 280 - 281 - otg->usb_phy = phy; 282 - otg->set_host = ulpi_set_host; 283 - otg->set_vbus = ulpi_set_vbus; 260 + otg_ulpi_init(phy, otg, ops, flags); 284 261 285 262 return phy; 286 263 } 287 264 EXPORT_SYMBOL_GPL(otg_ulpi_create); 288 265 266 + struct usb_phy * 267 + devm_otg_ulpi_create(struct device *dev, 268 + struct usb_phy_io_ops *ops, 269 + unsigned int flags) 270 + { 271 + struct usb_phy *phy; 272 + struct usb_otg *otg; 273 + 274 + phy = devm_kzalloc(dev, sizeof(*phy), GFP_KERNEL); 275 + if (!phy) 276 + return NULL; 277 + 278 + otg = devm_kzalloc(dev, sizeof(*otg), GFP_KERNEL); 279 + if (!otg) { 280 + devm_kfree(dev, phy); 281 + return NULL; 282 + } 283 + 284 + otg_ulpi_init(phy, otg, ops, flags); 285 + 286 + return phy; 287 + } 288 + EXPORT_SYMBOL_GPL(devm_otg_ulpi_create);
+11
include/linux/usb/ulpi.h
··· 55 55 #if IS_ENABLED(CONFIG_USB_ULPI) 56 56 struct usb_phy *otg_ulpi_create(struct usb_phy_io_ops *ops, 57 57 unsigned int flags); 58 + 59 + struct usb_phy *devm_otg_ulpi_create(struct device *dev, 60 + struct usb_phy_io_ops *ops, 61 + unsigned int flags); 58 62 #else 59 63 static inline struct usb_phy *otg_ulpi_create(struct usb_phy_io_ops *ops, 60 64 unsigned int flags) 65 + { 66 + return NULL; 67 + } 68 + 69 + static inline struct usb_phy *devm_otg_ulpi_create(struct device *dev, 70 + struct usb_phy_io_ops *ops, 71 + unsigned int flags) 61 72 { 62 73 return NULL; 63 74 }