Lines Matching +full:xusb +full:- +full:padctl
2 * Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.
21 #include <linux/phy/tegra/xusb.h>
30 #include "xusb.h"
39 if (args->args_count != 0) in tegra_xusb_pad_of_xlate()
40 return ERR_PTR(-EINVAL); in tegra_xusb_pad_of_xlate()
42 for (i = 0; i < pad->soc->num_lanes; i++) { in tegra_xusb_pad_of_xlate()
43 if (!pad->lanes[i]) in tegra_xusb_pad_of_xlate()
46 if (pad->lanes[i]->dev.of_node == args->np) { in tegra_xusb_pad_of_xlate()
47 phy = pad->lanes[i]; in tegra_xusb_pad_of_xlate()
53 phy = ERR_PTR(-ENODEV); in tegra_xusb_pad_of_xlate()
61 .compatible = "nvidia,tegra124-xusb-padctl",
67 .compatible = "nvidia,tegra210-xusb-padctl",
76 tegra_xusb_find_pad_node(struct tegra_xusb_padctl *padctl, const char *name) in tegra_xusb_find_pad_node() argument
80 pads = of_get_child_by_name(padctl->dev->of_node, "pads"); in tegra_xusb_find_pad_node()
95 lanes = of_get_child_by_name(pad->dev.of_node, "lanes"); in tegra_xusb_pad_find_phy_node()
99 np = of_get_child_by_name(lanes, pad->soc->lanes[index].name); in tegra_xusb_pad_find_phy_node()
108 struct device *dev = &lane->pad->dev; in tegra_xusb_lane_parse_dt()
116 err = match_string(lane->soc->funcs, lane->soc->num_funcs, function); in tegra_xusb_lane_parse_dt()
119 function, np->name); in tegra_xusb_lane_parse_dt()
123 lane->function = err; in tegra_xusb_lane_parse_dt()
133 lane->pad->ops->remove(lane); in tegra_xusb_lane_destroy()
142 pad->soc->ops->remove(pad); in tegra_xusb_pad_release()
150 struct tegra_xusb_padctl *padctl, in tegra_xusb_pad_init() argument
155 device_initialize(&pad->dev); in tegra_xusb_pad_init()
156 INIT_LIST_HEAD(&pad->list); in tegra_xusb_pad_init()
157 pad->dev.parent = padctl->dev; in tegra_xusb_pad_init()
158 pad->dev.type = &tegra_xusb_pad_type; in tegra_xusb_pad_init()
159 pad->dev.of_node = np; in tegra_xusb_pad_init()
160 pad->padctl = padctl; in tegra_xusb_pad_init()
162 err = dev_set_name(&pad->dev, "%s", pad->soc->name); in tegra_xusb_pad_init()
166 err = device_add(&pad->dev); in tegra_xusb_pad_init()
173 device_unregister(&pad->dev); in tegra_xusb_pad_init()
185 children = of_get_child_by_name(pad->dev.of_node, "lanes"); in tegra_xusb_pad_register()
187 return -ENODEV; in tegra_xusb_pad_register()
189 pad->lanes = devm_kcalloc(&pad->dev, pad->soc->num_lanes, sizeof(lane), in tegra_xusb_pad_register()
191 if (!pad->lanes) { in tegra_xusb_pad_register()
193 return -ENOMEM; in tegra_xusb_pad_register()
196 for (i = 0; i < pad->soc->num_lanes; i++) { in tegra_xusb_pad_register()
206 pad->lanes[i] = phy_create(&pad->dev, np, ops); in tegra_xusb_pad_register()
207 if (IS_ERR(pad->lanes[i])) { in tegra_xusb_pad_register()
208 err = PTR_ERR(pad->lanes[i]); in tegra_xusb_pad_register()
213 lane = pad->ops->probe(pad, np, i); in tegra_xusb_pad_register()
215 phy_destroy(pad->lanes[i]); in tegra_xusb_pad_register()
220 list_add_tail(&lane->list, &pad->padctl->lanes); in tegra_xusb_pad_register()
221 phy_set_drvdata(pad->lanes[i], lane); in tegra_xusb_pad_register()
224 pad->provider = of_phy_provider_register_full(&pad->dev, children, in tegra_xusb_pad_register()
226 if (IS_ERR(pad->provider)) { in tegra_xusb_pad_register()
227 err = PTR_ERR(pad->provider); in tegra_xusb_pad_register()
234 while (i--) in tegra_xusb_pad_register()
235 tegra_xusb_lane_destroy(pad->lanes[i]); in tegra_xusb_pad_register()
244 unsigned int i = pad->soc->num_lanes; in tegra_xusb_pad_unregister()
246 of_phy_provider_unregister(pad->provider); in tegra_xusb_pad_unregister()
248 while (i--) in tegra_xusb_pad_unregister()
249 tegra_xusb_lane_destroy(pad->lanes[i]); in tegra_xusb_pad_unregister()
251 device_unregister(&pad->dev); in tegra_xusb_pad_unregister()
255 tegra_xusb_pad_create(struct tegra_xusb_padctl *padctl, in tegra_xusb_pad_create() argument
262 np = tegra_xusb_find_pad_node(padctl, soc->name); in tegra_xusb_pad_create()
266 pad = soc->ops->probe(padctl, soc, np); in tegra_xusb_pad_create()
269 dev_err(padctl->dev, "failed to create pad %s: %d\n", in tegra_xusb_pad_create()
270 soc->name, err); in tegra_xusb_pad_create()
274 /* XXX move this into ->probe() to avoid string comparison */ in tegra_xusb_pad_create()
275 if (strcmp(soc->name, "pcie") == 0) in tegra_xusb_pad_create()
276 padctl->pcie = pad; in tegra_xusb_pad_create()
278 if (strcmp(soc->name, "sata") == 0) in tegra_xusb_pad_create()
279 padctl->sata = pad; in tegra_xusb_pad_create()
281 if (strcmp(soc->name, "usb2") == 0) in tegra_xusb_pad_create()
282 padctl->usb2 = pad; in tegra_xusb_pad_create()
284 if (strcmp(soc->name, "ulpi") == 0) in tegra_xusb_pad_create()
285 padctl->ulpi = pad; in tegra_xusb_pad_create()
287 if (strcmp(soc->name, "hsic") == 0) in tegra_xusb_pad_create()
288 padctl->hsic = pad; in tegra_xusb_pad_create()
293 static void __tegra_xusb_remove_pads(struct tegra_xusb_padctl *padctl) in __tegra_xusb_remove_pads() argument
297 list_for_each_entry_safe_reverse(pad, tmp, &padctl->pads, list) { in __tegra_xusb_remove_pads()
298 list_del(&pad->list); in __tegra_xusb_remove_pads()
303 static void tegra_xusb_remove_pads(struct tegra_xusb_padctl *padctl) in tegra_xusb_remove_pads() argument
305 mutex_lock(&padctl->lock); in tegra_xusb_remove_pads()
306 __tegra_xusb_remove_pads(padctl); in tegra_xusb_remove_pads()
307 mutex_unlock(&padctl->lock); in tegra_xusb_remove_pads()
312 struct tegra_xusb_padctl *padctl = lane->pad->padctl; in tegra_xusb_lane_program() local
313 const struct tegra_xusb_lane_soc *soc = lane->soc; in tegra_xusb_lane_program()
317 value = padctl_readl(padctl, soc->offset); in tegra_xusb_lane_program()
318 value &= ~(soc->mask << soc->shift); in tegra_xusb_lane_program()
319 value |= lane->function << soc->shift; in tegra_xusb_lane_program()
320 padctl_writel(padctl, value, soc->offset); in tegra_xusb_lane_program()
327 for (i = 0; i < pad->soc->num_lanes; i++) { in tegra_xusb_pad_program()
330 if (pad->lanes[i]) { in tegra_xusb_pad_program()
331 lane = phy_get_drvdata(pad->lanes[i]); in tegra_xusb_pad_program()
337 static int tegra_xusb_setup_pads(struct tegra_xusb_padctl *padctl) in tegra_xusb_setup_pads() argument
342 mutex_lock(&padctl->lock); in tegra_xusb_setup_pads()
344 for (i = 0; i < padctl->soc->num_pads; i++) { in tegra_xusb_setup_pads()
345 const struct tegra_xusb_pad_soc *soc = padctl->soc->pads[i]; in tegra_xusb_setup_pads()
348 pad = tegra_xusb_pad_create(padctl, soc); in tegra_xusb_setup_pads()
351 dev_err(padctl->dev, "failed to create pad %s: %d\n", in tegra_xusb_setup_pads()
352 soc->name, err); in tegra_xusb_setup_pads()
353 __tegra_xusb_remove_pads(padctl); in tegra_xusb_setup_pads()
354 mutex_unlock(&padctl->lock); in tegra_xusb_setup_pads()
361 list_add_tail(&pad->list, &padctl->pads); in tegra_xusb_setup_pads()
364 list_for_each_entry(pad, &padctl->pads, list) in tegra_xusb_setup_pads()
367 mutex_unlock(&padctl->lock); in tegra_xusb_setup_pads()
374 const char *func = lane->soc->funcs[lane->function]; in tegra_xusb_lane_check()
379 struct tegra_xusb_lane *tegra_xusb_find_lane(struct tegra_xusb_padctl *padctl, in tegra_xusb_find_lane() argument
383 struct tegra_xusb_lane *lane, *hit = ERR_PTR(-ENODEV); in tegra_xusb_find_lane()
386 name = kasprintf(GFP_KERNEL, "%s-%u", type, index); in tegra_xusb_find_lane()
388 return ERR_PTR(-ENOMEM); in tegra_xusb_find_lane()
390 list_for_each_entry(lane, &padctl->lanes, list) { in tegra_xusb_find_lane()
391 if (strcmp(lane->soc->name, name) == 0) { in tegra_xusb_find_lane()
406 struct tegra_xusb_lane *lane, *match = ERR_PTR(-ENODEV); in tegra_xusb_port_find_lane()
408 for (; map->type; map++) { in tegra_xusb_port_find_lane()
409 if (port->index != map->port) in tegra_xusb_port_find_lane()
412 lane = tegra_xusb_find_lane(port->padctl, map->type, in tegra_xusb_port_find_lane()
413 map->index); in tegra_xusb_port_find_lane()
421 dev_err(&port->dev, "conflicting match: %s-%u / %s\n", in tegra_xusb_port_find_lane()
422 map->type, map->index, match->soc->name); in tegra_xusb_port_find_lane()
431 tegra_xusb_find_port_node(struct tegra_xusb_padctl *padctl, const char *type, in tegra_xusb_find_port_node() argument
437 ports = of_get_child_by_name(padctl->dev->of_node, "ports"); in tegra_xusb_find_port_node()
441 name = kasprintf(GFP_KERNEL, "%s-%u", type, index); in tegra_xusb_find_port_node()
444 return ERR_PTR(-ENOMEM); in tegra_xusb_find_port_node()
454 tegra_xusb_find_port(struct tegra_xusb_padctl *padctl, const char *type, in tegra_xusb_find_port() argument
460 np = tegra_xusb_find_port_node(padctl, type, index); in tegra_xusb_find_port()
464 list_for_each_entry(port, &padctl->ports, list) { in tegra_xusb_find_port()
465 if (np == port->dev.of_node) { in tegra_xusb_find_port()
477 tegra_xusb_find_usb2_port(struct tegra_xusb_padctl *padctl, unsigned int index) in tegra_xusb_find_usb2_port() argument
481 port = tegra_xusb_find_port(padctl, "usb2", index); in tegra_xusb_find_usb2_port()
489 tegra_xusb_find_usb3_port(struct tegra_xusb_padctl *padctl, unsigned int index) in tegra_xusb_find_usb3_port() argument
493 port = tegra_xusb_find_port(padctl, "usb3", index); in tegra_xusb_find_usb3_port()
509 struct tegra_xusb_padctl *padctl, in tegra_xusb_port_init() argument
516 INIT_LIST_HEAD(&port->list); in tegra_xusb_port_init()
517 port->padctl = padctl; in tegra_xusb_port_init()
518 port->index = index; in tegra_xusb_port_init()
520 device_initialize(&port->dev); in tegra_xusb_port_init()
521 port->dev.type = &tegra_xusb_port_type; in tegra_xusb_port_init()
522 port->dev.of_node = of_node_get(np); in tegra_xusb_port_init()
523 port->dev.parent = padctl->dev; in tegra_xusb_port_init()
525 err = dev_set_name(&port->dev, "%s-%u", name, index); in tegra_xusb_port_init()
529 err = device_add(&port->dev); in tegra_xusb_port_init()
536 device_unregister(&port->dev); in tegra_xusb_port_init()
542 device_unregister(&port->dev); in tegra_xusb_port_unregister()
547 struct tegra_xusb_port *port = &usb2->base; in tegra_xusb_usb2_port_parse_dt()
548 struct device_node *np = port->dev.of_node; in tegra_xusb_usb2_port_parse_dt()
550 usb2->internal = of_property_read_bool(np, "nvidia,internal"); in tegra_xusb_usb2_port_parse_dt()
552 usb2->supply = devm_regulator_get(&port->dev, "vbus"); in tegra_xusb_usb2_port_parse_dt()
553 return PTR_ERR_OR_ZERO(usb2->supply); in tegra_xusb_usb2_port_parse_dt()
556 static int tegra_xusb_add_usb2_port(struct tegra_xusb_padctl *padctl, in tegra_xusb_add_usb2_port() argument
567 np = tegra_xusb_find_port_node(padctl, "usb2", index); in tegra_xusb_add_usb2_port()
571 usb2 = devm_kzalloc(padctl->dev, sizeof(*usb2), GFP_KERNEL); in tegra_xusb_add_usb2_port()
573 err = -ENOMEM; in tegra_xusb_add_usb2_port()
577 err = tegra_xusb_port_init(&usb2->base, padctl, np, "usb2", index); in tegra_xusb_add_usb2_port()
581 usb2->base.ops = padctl->soc->ports.usb2.ops; in tegra_xusb_add_usb2_port()
583 usb2->base.lane = usb2->base.ops->map(&usb2->base); in tegra_xusb_add_usb2_port()
584 if (IS_ERR(usb2->base.lane)) { in tegra_xusb_add_usb2_port()
585 err = PTR_ERR(usb2->base.lane); in tegra_xusb_add_usb2_port()
591 tegra_xusb_port_unregister(&usb2->base); in tegra_xusb_add_usb2_port()
595 list_add_tail(&usb2->base.list, &padctl->ports); in tegra_xusb_add_usb2_port()
604 struct tegra_xusb_port *port = &ulpi->base; in tegra_xusb_ulpi_port_parse_dt()
605 struct device_node *np = port->dev.of_node; in tegra_xusb_ulpi_port_parse_dt()
607 ulpi->internal = of_property_read_bool(np, "nvidia,internal"); in tegra_xusb_ulpi_port_parse_dt()
612 static int tegra_xusb_add_ulpi_port(struct tegra_xusb_padctl *padctl, in tegra_xusb_add_ulpi_port() argument
619 np = tegra_xusb_find_port_node(padctl, "ulpi", index); in tegra_xusb_add_ulpi_port()
623 ulpi = devm_kzalloc(padctl->dev, sizeof(*ulpi), GFP_KERNEL); in tegra_xusb_add_ulpi_port()
625 err = -ENOMEM; in tegra_xusb_add_ulpi_port()
629 err = tegra_xusb_port_init(&ulpi->base, padctl, np, "ulpi", index); in tegra_xusb_add_ulpi_port()
633 ulpi->base.ops = padctl->soc->ports.ulpi.ops; in tegra_xusb_add_ulpi_port()
635 ulpi->base.lane = ulpi->base.ops->map(&ulpi->base); in tegra_xusb_add_ulpi_port()
636 if (IS_ERR(ulpi->base.lane)) { in tegra_xusb_add_ulpi_port()
637 err = PTR_ERR(ulpi->base.lane); in tegra_xusb_add_ulpi_port()
643 tegra_xusb_port_unregister(&ulpi->base); in tegra_xusb_add_ulpi_port()
647 list_add_tail(&ulpi->base.list, &padctl->ports); in tegra_xusb_add_ulpi_port()
660 static int tegra_xusb_add_hsic_port(struct tegra_xusb_padctl *padctl, in tegra_xusb_add_hsic_port() argument
667 np = tegra_xusb_find_port_node(padctl, "hsic", index); in tegra_xusb_add_hsic_port()
671 hsic = devm_kzalloc(padctl->dev, sizeof(*hsic), GFP_KERNEL); in tegra_xusb_add_hsic_port()
673 err = -ENOMEM; in tegra_xusb_add_hsic_port()
677 err = tegra_xusb_port_init(&hsic->base, padctl, np, "hsic", index); in tegra_xusb_add_hsic_port()
681 hsic->base.ops = padctl->soc->ports.hsic.ops; in tegra_xusb_add_hsic_port()
683 hsic->base.lane = hsic->base.ops->map(&hsic->base); in tegra_xusb_add_hsic_port()
684 if (IS_ERR(hsic->base.lane)) { in tegra_xusb_add_hsic_port()
685 err = PTR_ERR(hsic->base.lane); in tegra_xusb_add_hsic_port()
691 tegra_xusb_port_unregister(&hsic->base); in tegra_xusb_add_hsic_port()
695 list_add_tail(&hsic->base.list, &padctl->ports); in tegra_xusb_add_hsic_port()
704 struct tegra_xusb_port *port = &usb3->base; in tegra_xusb_usb3_port_parse_dt()
705 struct device_node *np = port->dev.of_node; in tegra_xusb_usb3_port_parse_dt()
709 err = of_property_read_u32(np, "nvidia,usb2-companion", &value); in tegra_xusb_usb3_port_parse_dt()
711 dev_err(&port->dev, "failed to read port: %d\n", err); in tegra_xusb_usb3_port_parse_dt()
715 usb3->port = value; in tegra_xusb_usb3_port_parse_dt()
717 usb3->internal = of_property_read_bool(np, "nvidia,internal"); in tegra_xusb_usb3_port_parse_dt()
719 usb3->supply = devm_regulator_get(&port->dev, "vbus"); in tegra_xusb_usb3_port_parse_dt()
720 return PTR_ERR_OR_ZERO(usb3->supply); in tegra_xusb_usb3_port_parse_dt()
723 static int tegra_xusb_add_usb3_port(struct tegra_xusb_padctl *padctl, in tegra_xusb_add_usb3_port() argument
735 np = tegra_xusb_find_port_node(padctl, "usb3", index); in tegra_xusb_add_usb3_port()
739 usb3 = devm_kzalloc(padctl->dev, sizeof(*usb3), GFP_KERNEL); in tegra_xusb_add_usb3_port()
741 err = -ENOMEM; in tegra_xusb_add_usb3_port()
745 err = tegra_xusb_port_init(&usb3->base, padctl, np, "usb3", index); in tegra_xusb_add_usb3_port()
749 usb3->base.ops = padctl->soc->ports.usb3.ops; in tegra_xusb_add_usb3_port()
751 usb3->base.lane = usb3->base.ops->map(&usb3->base); in tegra_xusb_add_usb3_port()
752 if (IS_ERR(usb3->base.lane)) { in tegra_xusb_add_usb3_port()
753 err = PTR_ERR(usb3->base.lane); in tegra_xusb_add_usb3_port()
759 tegra_xusb_port_unregister(&usb3->base); in tegra_xusb_add_usb3_port()
763 list_add_tail(&usb3->base.list, &padctl->ports); in tegra_xusb_add_usb3_port()
770 static void __tegra_xusb_remove_ports(struct tegra_xusb_padctl *padctl) in __tegra_xusb_remove_ports() argument
774 list_for_each_entry_safe_reverse(port, tmp, &padctl->ports, list) { in __tegra_xusb_remove_ports()
775 list_del(&port->list); in __tegra_xusb_remove_ports()
780 static int tegra_xusb_setup_ports(struct tegra_xusb_padctl *padctl) in tegra_xusb_setup_ports() argument
786 mutex_lock(&padctl->lock); in tegra_xusb_setup_ports()
788 for (i = 0; i < padctl->soc->ports.usb2.count; i++) { in tegra_xusb_setup_ports()
789 err = tegra_xusb_add_usb2_port(padctl, i); in tegra_xusb_setup_ports()
794 for (i = 0; i < padctl->soc->ports.ulpi.count; i++) { in tegra_xusb_setup_ports()
795 err = tegra_xusb_add_ulpi_port(padctl, i); in tegra_xusb_setup_ports()
800 for (i = 0; i < padctl->soc->ports.hsic.count; i++) { in tegra_xusb_setup_ports()
801 err = tegra_xusb_add_hsic_port(padctl, i); in tegra_xusb_setup_ports()
806 for (i = 0; i < padctl->soc->ports.usb3.count; i++) { in tegra_xusb_setup_ports()
807 err = tegra_xusb_add_usb3_port(padctl, i); in tegra_xusb_setup_ports()
812 list_for_each_entry(port, &padctl->ports, list) { in tegra_xusb_setup_ports()
813 err = port->ops->enable(port); in tegra_xusb_setup_ports()
815 dev_err(padctl->dev, "failed to enable port %s: %d\n", in tegra_xusb_setup_ports()
816 dev_name(&port->dev), err); in tegra_xusb_setup_ports()
822 __tegra_xusb_remove_ports(padctl); in tegra_xusb_setup_ports()
824 mutex_unlock(&padctl->lock); in tegra_xusb_setup_ports()
828 static void tegra_xusb_remove_ports(struct tegra_xusb_padctl *padctl) in tegra_xusb_remove_ports() argument
830 mutex_lock(&padctl->lock); in tegra_xusb_remove_ports()
831 __tegra_xusb_remove_ports(padctl); in tegra_xusb_remove_ports()
832 mutex_unlock(&padctl->lock); in tegra_xusb_remove_ports()
837 struct device_node *np = pdev->dev.of_node; in tegra_xusb_padctl_probe()
839 struct tegra_xusb_padctl *padctl; in tegra_xusb_padctl_probe() local
847 dev_warn(&pdev->dev, "deprecated DT, using legacy driver\n"); in tegra_xusb_padctl_probe()
853 match = of_match_node(tegra_xusb_padctl_of_match, pdev->dev.of_node); in tegra_xusb_padctl_probe()
854 soc = match->data; in tegra_xusb_padctl_probe()
856 padctl = soc->ops->probe(&pdev->dev, soc); in tegra_xusb_padctl_probe()
857 if (IS_ERR(padctl)) in tegra_xusb_padctl_probe()
858 return PTR_ERR(padctl); in tegra_xusb_padctl_probe()
860 platform_set_drvdata(pdev, padctl); in tegra_xusb_padctl_probe()
861 INIT_LIST_HEAD(&padctl->ports); in tegra_xusb_padctl_probe()
862 INIT_LIST_HEAD(&padctl->lanes); in tegra_xusb_padctl_probe()
863 INIT_LIST_HEAD(&padctl->pads); in tegra_xusb_padctl_probe()
864 mutex_init(&padctl->lock); in tegra_xusb_padctl_probe()
867 padctl->regs = devm_ioremap_resource(&pdev->dev, res); in tegra_xusb_padctl_probe()
868 if (IS_ERR(padctl->regs)) { in tegra_xusb_padctl_probe()
869 err = PTR_ERR(padctl->regs); in tegra_xusb_padctl_probe()
873 padctl->rst = devm_reset_control_get(&pdev->dev, NULL); in tegra_xusb_padctl_probe()
874 if (IS_ERR(padctl->rst)) { in tegra_xusb_padctl_probe()
875 err = PTR_ERR(padctl->rst); in tegra_xusb_padctl_probe()
879 err = reset_control_deassert(padctl->rst); in tegra_xusb_padctl_probe()
883 err = tegra_xusb_setup_pads(padctl); in tegra_xusb_padctl_probe()
885 dev_err(&pdev->dev, "failed to setup pads: %d\n", err); in tegra_xusb_padctl_probe()
889 err = tegra_xusb_setup_ports(padctl); in tegra_xusb_padctl_probe()
891 dev_err(&pdev->dev, "failed to setup XUSB ports: %d\n", err); in tegra_xusb_padctl_probe()
898 tegra_xusb_remove_pads(padctl); in tegra_xusb_padctl_probe()
900 reset_control_assert(padctl->rst); in tegra_xusb_padctl_probe()
902 soc->ops->remove(padctl); in tegra_xusb_padctl_probe()
908 struct tegra_xusb_padctl *padctl = platform_get_drvdata(pdev); in tegra_xusb_padctl_remove() local
911 tegra_xusb_remove_ports(padctl); in tegra_xusb_padctl_remove()
912 tegra_xusb_remove_pads(padctl); in tegra_xusb_padctl_remove()
914 err = reset_control_assert(padctl->rst); in tegra_xusb_padctl_remove()
916 dev_err(&pdev->dev, "failed to assert reset: %d\n", err); in tegra_xusb_padctl_remove()
918 padctl->soc->ops->remove(padctl); in tegra_xusb_padctl_remove()
925 .name = "tegra-xusb-padctl",
935 struct tegra_xusb_padctl *padctl; in tegra_xusb_padctl_get() local
939 np = of_parse_phandle(dev->of_node, "nvidia,xusb-padctl", 0); in tegra_xusb_padctl_get()
941 return ERR_PTR(-EINVAL); in tegra_xusb_padctl_get()
951 return ERR_PTR(-ENODEV); in tegra_xusb_padctl_get()
956 padctl = platform_get_drvdata(pdev); in tegra_xusb_padctl_get()
957 if (!padctl) { in tegra_xusb_padctl_get()
958 put_device(&pdev->dev); in tegra_xusb_padctl_get()
959 return ERR_PTR(-EPROBE_DEFER); in tegra_xusb_padctl_get()
962 return padctl; in tegra_xusb_padctl_get()
966 void tegra_xusb_padctl_put(struct tegra_xusb_padctl *padctl) in tegra_xusb_padctl_put() argument
968 if (padctl) in tegra_xusb_padctl_put()
969 put_device(padctl->dev); in tegra_xusb_padctl_put()
973 int tegra_xusb_padctl_usb3_save_context(struct tegra_xusb_padctl *padctl, in tegra_xusb_padctl_usb3_save_context() argument
976 if (padctl->soc->ops->usb3_save_context) in tegra_xusb_padctl_usb3_save_context()
977 return padctl->soc->ops->usb3_save_context(padctl, port); in tegra_xusb_padctl_usb3_save_context()
979 return -ENOSYS; in tegra_xusb_padctl_usb3_save_context()
983 int tegra_xusb_padctl_hsic_set_idle(struct tegra_xusb_padctl *padctl, in tegra_xusb_padctl_hsic_set_idle() argument
986 if (padctl->soc->ops->hsic_set_idle) in tegra_xusb_padctl_hsic_set_idle()
987 return padctl->soc->ops->hsic_set_idle(padctl, port, idle); in tegra_xusb_padctl_hsic_set_idle()
989 return -ENOSYS; in tegra_xusb_padctl_hsic_set_idle()
993 int tegra_xusb_padctl_usb3_set_lfps_detect(struct tegra_xusb_padctl *padctl, in tegra_xusb_padctl_usb3_set_lfps_detect() argument
996 if (padctl->soc->ops->usb3_set_lfps_detect) in tegra_xusb_padctl_usb3_set_lfps_detect()
997 return padctl->soc->ops->usb3_set_lfps_detect(padctl, port, in tegra_xusb_padctl_usb3_set_lfps_detect()
1000 return -ENOSYS; in tegra_xusb_padctl_usb3_set_lfps_detect()
1005 MODULE_DESCRIPTION("Tegra XUSB Pad Controller driver");