On 15:12 Fri 04 Sep , Tom Rix wrote: > The twl4030 provides a PHY device for connecting a link device, > like musb, to physical connection. > > This change adds the twl4030 usb registers and functions for > initializing the PHY as required by omap3. > > Signed-off-by: Tom Rix <tom....@windriver.com> > --- > Makefile | 1 + > drivers/usb/phy/Makefile | 44 +++++++++++ > drivers/usb/phy/twl4030.c | 184 > +++++++++++++++++++++++++++++++++++++++++++++ > include/twl4030.h | 143 +++++++++++++++++++++++++++++++---- > 4 files changed, 357 insertions(+), 15 deletions(-) > create mode 100644 drivers/usb/phy/Makefile > create mode 100644 drivers/usb/phy/twl4030.c > > diff --git a/Makefile b/Makefile > index 329e0f5..dcaa1dc 100644 > --- a/Makefile > +++ b/Makefile > @@ -241,6 +241,7 @@ LIBS += drivers/twserial/libtws.a > LIBS += drivers/usb/gadget/libusb_gadget.a > LIBS += drivers/usb/host/libusb_host.a > LIBS += drivers/usb/musb/libusb_musb.a > +LIBS += drivers/usb/phy/libusb_phy.a > LIBS += drivers/video/libvideo.a > LIBS += drivers/watchdog/libwatchdog.a > LIBS += common/libcommon.a > diff --git a/drivers/usb/phy/Makefile b/drivers/usb/phy/Makefile > new file mode 100644 > index 0000000..200b907 > --- /dev/null > +++ b/drivers/usb/phy/Makefile > @@ -0,0 +1,44 @@ > +# > +# Copyright (c) 2009 Wind River Systems, Inc. > +# Tom Rix <tom....@windriver.com> > +# > +# 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. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, > +# MA 02111-1307 USA > +# > + > +include $(TOPDIR)/config.mk > + > +LIB := $(obj)libusb_phy.a > + > +COBJS-$(CONFIG_TWL4030_USB) += twl4030.o > +COBJS-y := twl4030.o > + > +COBJS := $(COBJS-y) > +SRCS := $(COBJS:.o=.c) > +OBJS := $(addprefix $(obj),$(COBJS)) > + > +all: $(LIB) > + > +$(LIB): $(obj).depend $(OBJS) > + $(AR) $(ARFLAGS) $@ $(OBJS) > + > +######################################################################### > + > +# defines $(obj).depend target > +include $(SRCTREE)/rules.mk > + > +sinclude $(obj).depend > + > +######################################################################### > diff --git a/drivers/usb/phy/twl4030.c b/drivers/usb/phy/twl4030.c > new file mode 100644 > index 0000000..32f1df3 > --- /dev/null > +++ b/drivers/usb/phy/twl4030.c > @@ -0,0 +1,184 @@ > +/* > + * Copyright (c) 2009 Wind River Systems, Inc. > + * Tom Rix <tom....@windriver.com> > + * > + * This is file is based on > + * repository git.gitorious.org/u-boot-omap3/mainline.git, > + * branch omap3-dev-usb, file drivers/usb/gadget/twl4030_usb.c > + * > + * This is the unique part of its copyright : > + * > + * ------------------------------------------------------------------------ > + * > + * * (C) Copyright 2009 Atin Malaviya (atin.malav...@gmail.com) > + * > + * Based on: twl4030_usb.c in linux 2.6 (drivers/i2c/chips/twl4030_usb.c) > + * Copyright (C) 2004-2007 Texas Instruments > + * Copyright (C) 2008 Nokia Corporation > + * Contact: Felipe Balbi <felipe.ba...@nokia.com> > + * > + * Author: Atin Malaviya (atin.malav...@gmail.com) > + * > + * ------------------------------------------------------------------------ > + * > + * 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. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, > + * MA 02111-1307 USA > + */ > + > +#include <twl4030.h> > + > +/* Defines for bits in registers */ > +#define OPMODE_MASK (3 << 3) > +#define XCVRSELECT_MASK (3 << 0) > +#define CARKITMODE (1 << 2) > +#define OTG_ENAB (1 << 5) > +#define PHYPWD (1 << 0) > +#define CLOCKGATING_EN (1 << 2) > +#define CLK32K_EN (1 << 1) > +#define REQ_PHY_DPLL_CLK (1 << 0) > +#define PHY_DPLL_CLK (1 << 0) > + > +static int twl4030_usb_write(u8 address, u8 data) > +{ > + int ret; please add an empty line > + ret = twl4030_i2c_write_u8(TWL4030_CHIP_USB, data, address); > + if (ret != 0) > + printf("TWL4030:USB:Write[0x%x] Error %d\n", address, ret); > + > + return ret; > +} > + > +static int twl4030_usb_read(u8 address) > +{ > + u8 data; > + int ret; please add an empty line > + ret = twl4030_i2c_read_u8(TWL4030_CHIP_USB, &data, address);
> + if (ret == 0) > + ret = data; > + else > + printf("TWL4030:USB:Read[0x%x] Error %d\n", address, ret); > + > + return ret; why not this and avoid the copy of data if (ret != 0) { printf("TWL4030:USB:Read[0x%x] Error %d\n", address, ret); return ret; } return data; } > + > +static void twl4030_phy_power(void) > +{ > + u8 pwr, clk; please add an empty line > + /* Power the PHY */ > + pwr = twl4030_usb_read(TWL4030_USB_PHY_PWR_CTRL); > + pwr &= ~PHYPWD; > + twl4030_usb_write(TWL4030_USB_PHY_PWR_CTRL, pwr); please add an empty line to make it more readable > + /* Enable clocks */ > + clk = twl4030_usb_read(TWL4030_USB_PHY_CLK_CTRL); > + clk |= CLOCKGATING_EN | CLK32K_EN; > + twl4030_usb_write(TWL4030_USB_PHY_CLK_CTRL, clk); > +} > + > +/* > + * Initiaze the ULPI interface > + * ULPI : Universal Transceiver Macrocell Low Pin Interface > + * An interface between the USB link controller like musb and the > + * the PHY or transceiver that drives the actual bus. > + */ > +int twl4030_usb_ulpi_init(void) > +{ > + long timeout = 1000 * 1000; /* 1 sec */; > + u8 clk, sts, pwr; > + > + /* twl4030 ldo init */ > + twl4030_usb_ldo_init(); > + > + /* Enable the twl4030 phy */ > + twl4030_phy_power(); > + > + /* Enable DPLL to access PHY registers over I2C */ > + clk = twl4030_usb_read(TWL4030_USB_PHY_CLK_CTRL); > + clk |= REQ_PHY_DPLL_CLK; > + twl4030_usb_write(TWL4030_USB_PHY_CLK_CTRL, clk); > + > + /* Check if the PHY DPLL is locked */ > + sts = twl4030_usb_read(TWL4030_USB_PHY_CLK_CTRL_STS); > + while (!(sts & PHY_DPLL_CLK) && 0 < timeout) { > + udelay(10); > + sts = twl4030_usb_read(TWL4030_USB_PHY_CLK_CTRL_STS); > + timeout -= 10; > + } why not set time to 100 * 1000 and just decrease by 1 > + > + /* Final check */ > + sts = twl4030_usb_read(TWL4030_USB_PHY_CLK_CTRL_STS); > + if (!(sts & PHY_DPLL_CLK)) { > + printf("Error:TWL4030:USB Timeout setting PHY DPLL clock\n"); > + return -1; > + } > + > + /* > + * There are two circuit blocks attached to the PHY, > + * Carkit and USB OTG. Disable Carkit and enable USB OTG > + */ > + twl4030_usb_write(TWL4030_USB_IFC_CTRL_CLR, CARKITMODE); > + pwr = twl4030_usb_read(TWL4030_USB_POWER_CTRL); > + pwr |= OTG_ENAB; > + twl4030_usb_write(TWL4030_USB_POWER_CTRL_SET, pwr); please add an empty line to make it more readable > + /* Clear the opmode bits to ensure normal encode */ > + twl4030_usb_write(TWL4030_USB_FUNC_CTRL_CLR, OPMODE_MASK); please add an empty line to make it more readable > + /* Clear the xcvrselect bits to enable the high speed transeiver */ > + twl4030_usb_write(TWL4030_USB_FUNC_CTRL_CLR, XCVRSELECT_MASK); > + > + /* Let ULPI control the DPLL clock */ > + clk = twl4030_usb_read(TWL4030_USB_PHY_CLK_CTRL); > + clk &= ~REQ_PHY_DPLL_CLK; > + twl4030_usb_write(TWL4030_USB_PHY_CLK_CTRL, clk); > + > + return 0; > +} > diff --git a/include/twl4030.h b/include/twl4030.h > index f260ecb..feaec47 100644 > --- a/include/twl4030.h > +++ b/include/twl4030.h > @@ -342,21 +342,129 @@ > #define TWL4030_KEYPAD_CTRL_SOFT_NRST (1 << 0) > > /* USB */ > -#define TWL4030_USB_FUNC_CTRL (0x04) > -#define TWL4030_USB_OPMODE_MASK (3 << 3) > -#define TWL4030_USB_XCVRSELECT_MASK (3 << 0) > -#define TWL4030_USB_IFC_CTRL (0x07) > -#define TWL4030_USB_CARKITMODE (1 << 2) > -#define TWL4030_USB_POWER_CTRL (0xAC) > -#define TWL4030_USB_OTG_ENAB (1 << 5) > -#define TWL4030_USB_PHY_PWR_CTRL (0xFD) > -#define TWL4030_USB_PHYPWD (1 << 0) > -#define TWL4030_USB_PHY_CLK_CTRL (0xFE) > -#define TWL4030_USB_CLOCKGATING_EN (1 << 2) > -#define TWL4030_USB_CLK32K_EN (1 << 1) > -#define TWL4030_USB_REQ_PHY_DPLL_CLK (1 << 0) > -#define TWL4030_USB_PHY_CLK_CTRL_STS (0xFF) > -#define TWL4030_USB_PHY_DPLL_CLK (1 << 0) make some enums by group of function will be better as it simplify the code > +#define TWL4030_USB_VENDOR_ID_LO 0x00 > +#define TWL4030_USB_VENDOR_ID_HI 0x01 > +#define TWL4030_USB_PRODUCT_ID_LO 0x02 > +#define TWL4030_USB_PRODUCT_ID_HI 0x03 > +#define TWL4030_USB_FUNC_CTRL 0x04 > +#define TWL4030_USB_FUNC_CTRL_SET 0x05 > +#define TWL4030_USB_FUNC_CTRL_CLR 0x06 > +#define TWL4030_USB_IFC_CTRL 0x07 > +#define TWL4030_USB_IFC_CTRL_SET 0x08 > +#define TWL4030_USB_IFC_CTRL_CLR 0x09 > +#define TWL4030_USB_OTG_CTRL 0x0A > +#define TWL4030_USB_OTG_CTRL_SET 0x0B > +#define TWL4030_USB_OTG_CTRL_CLR 0x0C > +#define TWL4030_USB_USB_INT_EN_RISE 0x0D > +#define TWL4030_USB_USB_INT_EN_RISE_SET 0x0E > +#define TWL4030_USB_USB_INT_EN_RISE_CLR 0x0F > +#define TWL4030_USB_USB_INT_EN_FALL 0x10 > +#define TWL4030_USB_USB_INT_EN_FALL_SET 0x11 > +#define TWL4030_USB_USB_INT_EN_FALL_CLR 0x12 > +#define TWL4030_USB_USB_INT_STS 0x13 > +#define TWL4030_USB_USB_INT_LATCH 0x14 > +#define TWL4030_USB_DEBUG 0x15 > +#define TWL4030_USB_SCRATCH_REG 0x16 > +#define TWL4030_USB_SCRATCH_REG_SET 0x17 > +#define TWL4030_USB_SCRATCH_REG_CLR 0x18 > +#define TWL4030_USB_CARKIT_CTRL 0x19 > +#define TWL4030_USB_CARKIT_CTRL_SET 0x1A > +#define TWL4030_USB_CARKIT_CTRL_CLR 0x1B > +#define TWL4030_USB_CARKIT_INT_DELAY 0x1C > +#define TWL4030_USB_CARKIT_INT_EN 0x1D > +#define TWL4030_USB_CARKIT_INT_EN_SET 0x1E > +#define TWL4030_USB_CARKIT_INT_EN_CLR 0x1F > +#define TWL4030_USB_CARKIT_INT_STS 0x20 > +#define TWL4030_USB_CARKIT_INT_LATCH 0x21 > +#define TWL4030_USB_CARKIT_PLS_CTRL 0x22 > +#define TWL4030_USB_CARKIT_PLS_CTRL_SET 0x23 > +#define TWL4030_USB_CARKIT_PLS_CTRL_CLR 0x24 > +#define TWL4030_USB_TRANS_POS_WIDTH 0x25 > +#define TWL4030_USB_TRANS_NEG_WIDTH 0x26 > +#define TWL4030_USB_RCV_PLTY_RECOVERY 0x27 > +#define TWL4030_USB_MCPC_CTRL 0x30 > +#define TWL4030_USB_MCPC_CTRL_SET 0x31 > +#define TWL4030_USB_MCPC_CTRL_CLR 0x32 > +#define TWL4030_USB_MCPC_IO_CTRL 0x33 > +#define TWL4030_USB_MCPC_IO_CTRL_SET 0x34 Best Regards, J. _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot