otg.c 2.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
/*
 * otg.c -- USB OTG utility code
 *
 * Copyright (C) 2004 Texas Instruments
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 */

#include <linux/kernel.h>
13
#include <linux/export.h>
14 15 16 17
#include <linux/device.h>

#include <linux/usb/otg.h>

18
static struct usb_phy *phy;
19 20

/**
21
 * usb_get_phy - find the (single) USB PHY
22
 *
23 24 25
 * Returns the phy driver, after getting a refcount to it; or
 * null if there is no such phy.  The caller is responsible for
 * calling usb_put_phy() to release that count.
26 27 28
 *
 * For use by USB host and peripheral drivers.
 */
29
struct usb_phy *usb_get_phy(void)
30
{
31 32 33
	if (phy)
		get_device(phy->dev);
	return phy;
34
}
35
EXPORT_SYMBOL(usb_get_phy);
36 37

/**
38 39
 * usb_put_phy - release the (single) USB PHY
 * @x: the phy returned by usb_get_phy()
40
 *
41
 * Releases a refcount the caller received from usb_get_phy().
42 43 44
 *
 * For use by USB host and peripheral drivers.
 */
45
void usb_put_phy(struct usb_phy *x)
46
{
47 48
	if (x)
		put_device(x->dev);
49
}
50
EXPORT_SYMBOL(usb_put_phy);
51 52

/**
53 54
 * usb_add_phy - declare the (single) USB PHY
 * @x: the USB phy to be used; or NULL
55
 *
56
 * This call is exclusively for use by phy drivers, which
57 58 59
 * coordinate the activities of drivers for host and peripheral
 * controllers, and in some cases for VBUS current regulation.
 */
60
int usb_add_phy(struct usb_phy *x)
61
{
62
	if (phy && x)
63
		return -EBUSY;
64
	phy = x;
65 66
	return 0;
}
67
EXPORT_SYMBOL(usb_add_phy);
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

const char *otg_state_string(enum usb_otg_state state)
{
	switch (state) {
	case OTG_STATE_A_IDLE:
		return "a_idle";
	case OTG_STATE_A_WAIT_VRISE:
		return "a_wait_vrise";
	case OTG_STATE_A_WAIT_BCON:
		return "a_wait_bcon";
	case OTG_STATE_A_HOST:
		return "a_host";
	case OTG_STATE_A_SUSPEND:
		return "a_suspend";
	case OTG_STATE_A_PERIPHERAL:
		return "a_peripheral";
	case OTG_STATE_A_WAIT_VFALL:
		return "a_wait_vfall";
	case OTG_STATE_A_VBUS_ERR:
		return "a_vbus_err";
	case OTG_STATE_B_IDLE:
		return "b_idle";
	case OTG_STATE_B_SRP_INIT:
		return "b_srp_init";
	case OTG_STATE_B_PERIPHERAL:
		return "b_peripheral";
	case OTG_STATE_B_WAIT_ACON:
		return "b_wait_acon";
	case OTG_STATE_B_HOST:
		return "b_host";
	default:
		return "UNDEFINED";
	}
}
EXPORT_SYMBOL(otg_state_string);