Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 208025
b: refs/heads/master
c: 13dd0c9
h: refs/heads/master
i:
  208023: 642c625
v: v3
  • Loading branch information
Igor Grinberg authored and Greg Kroah-Hartman committed Aug 10, 2010
1 parent fedd13f commit b91edec
Show file tree
Hide file tree
Showing 11 changed files with 167 additions and 28 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 51a91a5424cb94f40eb0c9d0b71d8df4e423742a
refs/heads/master: 13dd0c9767349b280cf131c34461f85e5effc42a
4 changes: 2 additions & 2 deletions trunk/arch/arm/mach-mx3/mach-armadillo5x0.c
Original file line number Diff line number Diff line change
Expand Up @@ -551,9 +551,9 @@ static void __init armadillo5x0_init(void)
/* USB */
#if defined(CONFIG_USB_ULPI)
usbotg_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops,
USB_OTG_DRV_VBUS | USB_OTG_DRV_VBUS_EXT);
ULPI_OTG_DRVVBUS | ULPI_OTG_DRVVBUS_EXT);
usbh2_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops,
USB_OTG_DRV_VBUS | USB_OTG_DRV_VBUS_EXT);
ULPI_OTG_DRVVBUS | ULPI_OTG_DRVVBUS_EXT);

mxc_register_device(&mxc_otg_host, &usbotg_pdata);
mxc_register_device(&mxc_usbh2, &usbh2_pdata);
Expand Down
4 changes: 2 additions & 2 deletions trunk/arch/arm/mach-mx3/mach-mx31lilly.c
Original file line number Diff line number Diff line change
Expand Up @@ -245,9 +245,9 @@ static struct mxc_usbh_platform_data usbh2_pdata = {
static void lilly1131_usb_init(void)
{
usbotg_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops,
USB_OTG_DRV_VBUS | USB_OTG_DRV_VBUS_EXT);
ULPI_OTG_DRVVBUS | ULPI_OTG_DRVVBUS_EXT);
usbh2_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops,
USB_OTG_DRV_VBUS | USB_OTG_DRV_VBUS_EXT);
ULPI_OTG_DRVVBUS | ULPI_OTG_DRVVBUS_EXT);

mxc_register_device(&mxc_usbh1, &usbh1_pdata);
mxc_register_device(&mxc_usbh2, &usbh2_pdata);
Expand Down
2 changes: 1 addition & 1 deletion trunk/arch/arm/mach-mx3/mach-mx31lite.c
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,7 @@ static void __init mxc_board_init(void)
#if defined(CONFIG_USB_ULPI)
/* USB */
usbh2_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops,
USB_OTG_DRV_VBUS | USB_OTG_DRV_VBUS_EXT);
ULPI_OTG_DRVVBUS | ULPI_OTG_DRVVBUS_EXT);

mxc_register_device(&mxc_usbh2, &usbh2_pdata);
#endif
Expand Down
2 changes: 1 addition & 1 deletion trunk/arch/arm/mach-mx3/mach-mx31moboard.c
Original file line number Diff line number Diff line change
Expand Up @@ -412,7 +412,7 @@ static struct mxc_usbh_platform_data usbh2_pdata = {
static int __init moboard_usbh2_init(void)
{
usbh2_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops,
USB_OTG_DRV_VBUS | USB_OTG_DRV_VBUS_EXT);
ULPI_OTG_DRVVBUS | ULPI_OTG_DRVVBUS_EXT);

return mxc_register_device(&mxc_usbh2, &usbh2_pdata);
}
Expand Down
4 changes: 2 additions & 2 deletions trunk/arch/arm/mach-mx3/mach-pcm037.c
Original file line number Diff line number Diff line change
Expand Up @@ -654,13 +654,13 @@ static void __init mxc_board_init(void)
#if defined(CONFIG_USB_ULPI)
if (otg_mode_host) {
otg_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops,
USB_OTG_DRV_VBUS | USB_OTG_DRV_VBUS_EXT);
ULPI_OTG_DRVVBUS | ULPI_OTG_DRVVBUS_EXT);

mxc_register_device(&mxc_otg_host, &otg_pdata);
}

usbh2_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops,
USB_OTG_DRV_VBUS | USB_OTG_DRV_VBUS_EXT);
ULPI_OTG_DRVVBUS | ULPI_OTG_DRVVBUS_EXT);

mxc_register_device(&mxc_usbh2, &usbh2_pdata);
#endif
Expand Down
2 changes: 1 addition & 1 deletion trunk/arch/arm/mach-mx3/mach-pcm043.c
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,7 @@ static void __init mxc_board_init(void)
#if defined(CONFIG_USB_ULPI)
if (otg_mode_host) {
otg_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops,
USB_OTG_DRV_VBUS | USB_OTG_DRV_VBUS_EXT);
ULPI_OTG_DRVVBUS | ULPI_OTG_DRVVBUS_EXT);

mxc_register_device(&mxc_otg_host, &otg_pdata);
}
Expand Down
2 changes: 1 addition & 1 deletion trunk/arch/arm/mach-mx3/mx31moboard-smartbot.c
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ static struct mxc_usbh_platform_data otg_host_pdata = {
static int __init smartbot_otg_host_init(void)
{
otg_host_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops,
USB_OTG_DRV_VBUS | USB_OTG_DRV_VBUS_EXT);
ULPI_OTG_DRVVBUS | ULPI_OTG_DRVVBUS_EXT);

return mxc_register_device(&mxc_otg_host, &otg_host_pdata);
}
Expand Down
127 changes: 117 additions & 10 deletions trunk/drivers/usb/otg/ulpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,25 +37,106 @@ static unsigned int ulpi_ids[] = {
ULPI_ID(0x0424, 0x0006), /* SMSC USB3319 */
};

static int ulpi_set_flags(struct otg_transceiver *otg)
static int ulpi_set_otg_flags(struct otg_transceiver *otg)
{
unsigned int flags = 0;
unsigned int flags = ULPI_OTG_CTRL_DP_PULLDOWN |
ULPI_OTG_CTRL_DM_PULLDOWN;

if (otg->flags & USB_OTG_PULLUP_ID)
if (otg->flags & ULPI_OTG_ID_PULLUP)
flags |= ULPI_OTG_CTRL_ID_PULLUP;

if (otg->flags & USB_OTG_PULLDOWN_DM)
flags |= ULPI_OTG_CTRL_DM_PULLDOWN;
/*
* ULPI Specification rev.1.1 default
* for Dp/DmPulldown is enabled.
*/
if (otg->flags & ULPI_OTG_DP_PULLDOWN_DIS)
flags &= ~ULPI_OTG_CTRL_DP_PULLDOWN;

if (otg->flags & USB_OTG_PULLDOWN_DP)
flags |= ULPI_OTG_CTRL_DP_PULLDOWN;
if (otg->flags & ULPI_OTG_DM_PULLDOWN_DIS)
flags &= ~ULPI_OTG_CTRL_DM_PULLDOWN;

if (otg->flags & USB_OTG_EXT_VBUS_INDICATOR)
if (otg->flags & ULPI_OTG_EXTVBUSIND)
flags |= ULPI_OTG_CTRL_EXTVBUSIND;

return otg_io_write(otg, flags, ULPI_OTG_CTRL);
}

static int ulpi_set_fc_flags(struct otg_transceiver *otg)
{
unsigned int flags = 0;

/*
* ULPI Specification rev.1.1 default
* for XcvrSelect is Full Speed.
*/
if (otg->flags & ULPI_FC_HS)
flags |= ULPI_FUNC_CTRL_HIGH_SPEED;
else if (otg->flags & ULPI_FC_LS)
flags |= ULPI_FUNC_CTRL_LOW_SPEED;
else if (otg->flags & ULPI_FC_FS4LS)
flags |= ULPI_FUNC_CTRL_FS4LS;
else
flags |= ULPI_FUNC_CTRL_FULL_SPEED;

if (otg->flags & ULPI_FC_TERMSEL)
flags |= ULPI_FUNC_CTRL_TERMSELECT;

/*
* ULPI Specification rev.1.1 default
* for OpMode is Normal Operation.
*/
if (otg->flags & ULPI_FC_OP_NODRV)
flags |= ULPI_FUNC_CTRL_OPMODE_NONDRIVING;
else if (otg->flags & ULPI_FC_OP_DIS_NRZI)
flags |= ULPI_FUNC_CTRL_OPMODE_DISABLE_NRZI;
else if (otg->flags & ULPI_FC_OP_NSYNC_NEOP)
flags |= ULPI_FUNC_CTRL_OPMODE_NOSYNC_NOEOP;
else
flags |= ULPI_FUNC_CTRL_OPMODE_NORMAL;

/*
* ULPI Specification rev.1.1 default
* for SuspendM is Powered.
*/
flags |= ULPI_FUNC_CTRL_SUSPENDM;

return otg_io_write(otg, flags, ULPI_FUNC_CTRL);
}

static int ulpi_set_ic_flags(struct otg_transceiver *otg)
{
unsigned int flags = 0;

if (otg->flags & ULPI_IC_AUTORESUME)
flags |= ULPI_IFC_CTRL_AUTORESUME;

if (otg->flags & ULPI_IC_EXTVBUS_INDINV)
flags |= ULPI_IFC_CTRL_EXTERNAL_VBUS;

if (otg->flags & ULPI_IC_IND_PASSTHRU)
flags |= ULPI_IFC_CTRL_PASSTHRU;

if (otg->flags & ULPI_IC_PROTECT_DIS)
flags |= ULPI_IFC_CTRL_PROTECT_IFC_DISABLE;

return otg_io_write(otg, flags, ULPI_IFC_CTRL);
}

static int ulpi_set_flags(struct otg_transceiver *otg)
{
int ret;

ret = ulpi_set_otg_flags(otg);
if (ret)
return ret;

ret = ulpi_set_ic_flags(otg);
if (ret)
return ret;

return ulpi_set_fc_flags(otg);
}

static int ulpi_init(struct otg_transceiver *otg)
{
int i, vid, pid, ret;
Expand All @@ -80,17 +161,42 @@ static int ulpi_init(struct otg_transceiver *otg)
return -ENODEV;
}

static int ulpi_set_host(struct otg_transceiver *otg, struct usb_bus *host)
{
unsigned int flags = otg_io_read(otg, ULPI_IFC_CTRL);

if (!host) {
otg->host = NULL;
return 0;
}

otg->host = host;

flags &= ~(ULPI_IFC_CTRL_6_PIN_SERIAL_MODE |
ULPI_IFC_CTRL_3_PIN_SERIAL_MODE |
ULPI_IFC_CTRL_CARKITMODE);

if (otg->flags & ULPI_IC_6PIN_SERIAL)
flags |= ULPI_IFC_CTRL_6_PIN_SERIAL_MODE;
else if (otg->flags & ULPI_IC_3PIN_SERIAL)
flags |= ULPI_IFC_CTRL_3_PIN_SERIAL_MODE;
else if (otg->flags & ULPI_IC_CARKIT)
flags |= ULPI_IFC_CTRL_CARKITMODE;

return otg_io_write(otg, flags, ULPI_IFC_CTRL);
}

static int ulpi_set_vbus(struct otg_transceiver *otg, bool on)
{
unsigned int flags = otg_io_read(otg, ULPI_OTG_CTRL);

flags &= ~(ULPI_OTG_CTRL_DRVVBUS | ULPI_OTG_CTRL_DRVVBUS_EXT);

if (on) {
if (otg->flags & USB_OTG_DRV_VBUS)
if (otg->flags & ULPI_OTG_DRVVBUS)
flags |= ULPI_OTG_CTRL_DRVVBUS;

if (otg->flags & USB_OTG_DRV_VBUS_EXT)
if (otg->flags & ULPI_OTG_DRVVBUS_EXT)
flags |= ULPI_OTG_CTRL_DRVVBUS_EXT;
}

Expand All @@ -111,6 +217,7 @@ otg_ulpi_create(struct otg_io_access_ops *ops,
otg->flags = flags;
otg->io_ops = ops;
otg->init = ulpi_init;
otg->set_host = ulpi_set_host;
otg->set_vbus = ulpi_set_vbus;

return otg;
Expand Down
7 changes: 0 additions & 7 deletions trunk/include/linux/usb/otg.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,6 @@ enum usb_xceiv_events {
USB_EVENT_ENUMERATED, /* gadget driver enumerated */
};

#define USB_OTG_PULLUP_ID (1 << 0)
#define USB_OTG_PULLDOWN_DP (1 << 1)
#define USB_OTG_PULLDOWN_DM (1 << 2)
#define USB_OTG_EXT_VBUS_INDICATOR (1 << 3)
#define USB_OTG_DRV_VBUS (1 << 4)
#define USB_OTG_DRV_VBUS_EXT (1 << 5)

struct otg_transceiver;

/* for transceivers connected thru an ULPI interface, the user must
Expand Down
39 changes: 39 additions & 0 deletions trunk/include/linux/usb/ulpi.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,41 @@
#include <linux/usb/otg.h>
/*-------------------------------------------------------------------------*/

/*
* ULPI Flags
*/
#define ULPI_OTG_ID_PULLUP (1 << 0)
#define ULPI_OTG_DP_PULLDOWN_DIS (1 << 1)
#define ULPI_OTG_DM_PULLDOWN_DIS (1 << 2)
#define ULPI_OTG_DISCHRGVBUS (1 << 3)
#define ULPI_OTG_CHRGVBUS (1 << 4)
#define ULPI_OTG_DRVVBUS (1 << 5)
#define ULPI_OTG_DRVVBUS_EXT (1 << 6)
#define ULPI_OTG_EXTVBUSIND (1 << 7)

#define ULPI_IC_6PIN_SERIAL (1 << 8)
#define ULPI_IC_3PIN_SERIAL (1 << 9)
#define ULPI_IC_CARKIT (1 << 10)
#define ULPI_IC_CLKSUSPM (1 << 11)
#define ULPI_IC_AUTORESUME (1 << 12)
#define ULPI_IC_EXTVBUS_INDINV (1 << 13)
#define ULPI_IC_IND_PASSTHRU (1 << 14)
#define ULPI_IC_PROTECT_DIS (1 << 15)

#define ULPI_FC_HS (1 << 16)
#define ULPI_FC_FS (1 << 17)
#define ULPI_FC_LS (1 << 18)
#define ULPI_FC_FS4LS (1 << 19)
#define ULPI_FC_TERMSEL (1 << 20)
#define ULPI_FC_OP_NORM (1 << 21)
#define ULPI_FC_OP_NODRV (1 << 22)
#define ULPI_FC_OP_DIS_NRZI (1 << 23)
#define ULPI_FC_OP_NSYNC_NEOP (1 << 24)
#define ULPI_FC_RST (1 << 25)
#define ULPI_FC_SUSPM (1 << 26)

/*-------------------------------------------------------------------------*/

/*
* Macros for Set and Clear
* See ULPI 1.1 specification to find the registers with Set and Clear offsets
Expand Down Expand Up @@ -59,6 +94,10 @@

/*-------------------------------------------------------------------------*/

/*
* Register Bits
*/

/* Function Control */
#define ULPI_FUNC_CTRL_XCVRSEL (1 << 0)
#define ULPI_FUNC_CTRL_XCVRSEL_MASK (3 << 0)
Expand Down

0 comments on commit b91edec

Please sign in to comment.