Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6: USB: musb: MAINTAINERS: Fix my mail address USB: serial/mos*: prevent reading uninitialized stack memory USB: otg: twl4030: fix phy initialization(v1) USB: EHCI: Disable langwell/penwell LPM capability usb: musb_debugfs: don't use the struct file private_data field with seq_files
This commit is contained in:
commit
0c4ab3453a
|
@ -3942,7 +3942,7 @@ F: drivers/char/isicom.c
|
||||||
F: include/linux/isicom.h
|
F: include/linux/isicom.h
|
||||||
|
|
||||||
MUSB MULTIPOINT HIGH SPEED DUAL-ROLE CONTROLLER
|
MUSB MULTIPOINT HIGH SPEED DUAL-ROLE CONTROLLER
|
||||||
M: Felipe Balbi <felipe.balbi@nokia.com>
|
M: Felipe Balbi <balbi@ti.com>
|
||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
T: git git://gitorious.org/usb/usb.git
|
T: git git://gitorious.org/usb/usb.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -4240,7 +4240,7 @@ S: Maintained
|
||||||
F: drivers/char/hw_random/omap-rng.c
|
F: drivers/char/hw_random/omap-rng.c
|
||||||
|
|
||||||
OMAP USB SUPPORT
|
OMAP USB SUPPORT
|
||||||
M: Felipe Balbi <felipe.balbi@nokia.com>
|
M: Felipe Balbi <balbi@ti.com>
|
||||||
M: David Brownell <dbrownell@users.sourceforge.net>
|
M: David Brownell <dbrownell@users.sourceforge.net>
|
||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
L: linux-omap@vger.kernel.org
|
L: linux-omap@vger.kernel.org
|
||||||
|
|
|
@ -119,6 +119,11 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
|
||||||
ehci->broken_periodic = 1;
|
ehci->broken_periodic = 1;
|
||||||
ehci_info(ehci, "using broken periodic workaround\n");
|
ehci_info(ehci, "using broken periodic workaround\n");
|
||||||
}
|
}
|
||||||
|
if (pdev->device == 0x0806 || pdev->device == 0x0811
|
||||||
|
|| pdev->device == 0x0829) {
|
||||||
|
ehci_info(ehci, "disable lpm for langwell/penwell\n");
|
||||||
|
ehci->has_lpm = 0;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case PCI_VENDOR_ID_TDI:
|
case PCI_VENDOR_ID_TDI:
|
||||||
if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) {
|
if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) {
|
||||||
|
|
|
@ -195,15 +195,14 @@ static const struct file_operations musb_regdump_fops = {
|
||||||
|
|
||||||
static int musb_test_mode_open(struct inode *inode, struct file *file)
|
static int musb_test_mode_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
file->private_data = inode->i_private;
|
|
||||||
|
|
||||||
return single_open(file, musb_test_mode_show, inode->i_private);
|
return single_open(file, musb_test_mode_show, inode->i_private);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t musb_test_mode_write(struct file *file,
|
static ssize_t musb_test_mode_write(struct file *file,
|
||||||
const char __user *ubuf, size_t count, loff_t *ppos)
|
const char __user *ubuf, size_t count, loff_t *ppos)
|
||||||
{
|
{
|
||||||
struct musb *musb = file->private_data;
|
struct seq_file *s = file->private_data;
|
||||||
|
struct musb *musb = s->private;
|
||||||
u8 test = 0;
|
u8 test = 0;
|
||||||
char buf[18];
|
char buf[18];
|
||||||
|
|
||||||
|
|
|
@ -347,11 +347,20 @@ static void twl4030_i2c_access(struct twl4030_usb *twl, int on)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void __twl4030_phy_power(struct twl4030_usb *twl, int on)
|
||||||
|
{
|
||||||
|
u8 pwr = twl4030_usb_read(twl, PHY_PWR_CTRL);
|
||||||
|
|
||||||
|
if (on)
|
||||||
|
pwr &= ~PHY_PWR_PHYPWD;
|
||||||
|
else
|
||||||
|
pwr |= PHY_PWR_PHYPWD;
|
||||||
|
|
||||||
|
WARN_ON(twl4030_usb_write_verify(twl, PHY_PWR_CTRL, pwr) < 0);
|
||||||
|
}
|
||||||
|
|
||||||
static void twl4030_phy_power(struct twl4030_usb *twl, int on)
|
static void twl4030_phy_power(struct twl4030_usb *twl, int on)
|
||||||
{
|
{
|
||||||
u8 pwr;
|
|
||||||
|
|
||||||
pwr = twl4030_usb_read(twl, PHY_PWR_CTRL);
|
|
||||||
if (on) {
|
if (on) {
|
||||||
regulator_enable(twl->usb3v1);
|
regulator_enable(twl->usb3v1);
|
||||||
regulator_enable(twl->usb1v8);
|
regulator_enable(twl->usb1v8);
|
||||||
|
@ -365,15 +374,13 @@ static void twl4030_phy_power(struct twl4030_usb *twl, int on)
|
||||||
twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0,
|
twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0,
|
||||||
VUSB_DEDICATED2);
|
VUSB_DEDICATED2);
|
||||||
regulator_enable(twl->usb1v5);
|
regulator_enable(twl->usb1v5);
|
||||||
pwr &= ~PHY_PWR_PHYPWD;
|
__twl4030_phy_power(twl, 1);
|
||||||
WARN_ON(twl4030_usb_write_verify(twl, PHY_PWR_CTRL, pwr) < 0);
|
|
||||||
twl4030_usb_write(twl, PHY_CLK_CTRL,
|
twl4030_usb_write(twl, PHY_CLK_CTRL,
|
||||||
twl4030_usb_read(twl, PHY_CLK_CTRL) |
|
twl4030_usb_read(twl, PHY_CLK_CTRL) |
|
||||||
(PHY_CLK_CTRL_CLOCKGATING_EN |
|
(PHY_CLK_CTRL_CLOCKGATING_EN |
|
||||||
PHY_CLK_CTRL_CLK32K_EN));
|
PHY_CLK_CTRL_CLK32K_EN));
|
||||||
} else {
|
} else {
|
||||||
pwr |= PHY_PWR_PHYPWD;
|
__twl4030_phy_power(twl, 0);
|
||||||
WARN_ON(twl4030_usb_write_verify(twl, PHY_PWR_CTRL, pwr) < 0);
|
|
||||||
regulator_disable(twl->usb1v5);
|
regulator_disable(twl->usb1v5);
|
||||||
regulator_disable(twl->usb1v8);
|
regulator_disable(twl->usb1v8);
|
||||||
regulator_disable(twl->usb3v1);
|
regulator_disable(twl->usb3v1);
|
||||||
|
@ -387,19 +394,25 @@ static void twl4030_phy_suspend(struct twl4030_usb *twl, int controller_off)
|
||||||
|
|
||||||
twl4030_phy_power(twl, 0);
|
twl4030_phy_power(twl, 0);
|
||||||
twl->asleep = 1;
|
twl->asleep = 1;
|
||||||
|
dev_dbg(twl->dev, "%s\n", __func__);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __twl4030_phy_resume(struct twl4030_usb *twl)
|
||||||
|
{
|
||||||
|
twl4030_phy_power(twl, 1);
|
||||||
|
twl4030_i2c_access(twl, 1);
|
||||||
|
twl4030_usb_set_mode(twl, twl->usb_mode);
|
||||||
|
if (twl->usb_mode == T2_USB_MODE_ULPI)
|
||||||
|
twl4030_i2c_access(twl, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void twl4030_phy_resume(struct twl4030_usb *twl)
|
static void twl4030_phy_resume(struct twl4030_usb *twl)
|
||||||
{
|
{
|
||||||
if (!twl->asleep)
|
if (!twl->asleep)
|
||||||
return;
|
return;
|
||||||
|
__twl4030_phy_resume(twl);
|
||||||
twl4030_phy_power(twl, 1);
|
|
||||||
twl4030_i2c_access(twl, 1);
|
|
||||||
twl4030_usb_set_mode(twl, twl->usb_mode);
|
|
||||||
if (twl->usb_mode == T2_USB_MODE_ULPI)
|
|
||||||
twl4030_i2c_access(twl, 0);
|
|
||||||
twl->asleep = 0;
|
twl->asleep = 0;
|
||||||
|
dev_dbg(twl->dev, "%s\n", __func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int twl4030_usb_ldo_init(struct twl4030_usb *twl)
|
static int twl4030_usb_ldo_init(struct twl4030_usb *twl)
|
||||||
|
@ -408,8 +421,8 @@ static int twl4030_usb_ldo_init(struct twl4030_usb *twl)
|
||||||
twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, 0xC0, PROTECT_KEY);
|
twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, 0xC0, PROTECT_KEY);
|
||||||
twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, 0x0C, PROTECT_KEY);
|
twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, 0x0C, PROTECT_KEY);
|
||||||
|
|
||||||
/* put VUSB3V1 LDO in active state */
|
/* Keep VUSB3V1 LDO in sleep state until VBUS/ID change detected*/
|
||||||
twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, VUSB_DEDICATED2);
|
/*twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0, VUSB_DEDICATED2);*/
|
||||||
|
|
||||||
/* input to VUSB3V1 LDO is from VBAT, not VBUS */
|
/* input to VUSB3V1 LDO is from VBAT, not VBUS */
|
||||||
twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x14, VUSB_DEDICATED1);
|
twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x14, VUSB_DEDICATED1);
|
||||||
|
@ -502,6 +515,26 @@ static irqreturn_t twl4030_usb_irq(int irq, void *_twl)
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void twl4030_usb_phy_init(struct twl4030_usb *twl)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
|
||||||
|
status = twl4030_usb_linkstat(twl);
|
||||||
|
if (status >= 0) {
|
||||||
|
if (status == USB_EVENT_NONE) {
|
||||||
|
__twl4030_phy_power(twl, 0);
|
||||||
|
twl->asleep = 1;
|
||||||
|
} else {
|
||||||
|
__twl4030_phy_resume(twl);
|
||||||
|
twl->asleep = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
blocking_notifier_call_chain(&twl->otg.notifier, status,
|
||||||
|
twl->otg.gadget);
|
||||||
|
}
|
||||||
|
sysfs_notify(&twl->dev->kobj, NULL, "vbus");
|
||||||
|
}
|
||||||
|
|
||||||
static int twl4030_set_suspend(struct otg_transceiver *x, int suspend)
|
static int twl4030_set_suspend(struct otg_transceiver *x, int suspend)
|
||||||
{
|
{
|
||||||
struct twl4030_usb *twl = xceiv_to_twl(x);
|
struct twl4030_usb *twl = xceiv_to_twl(x);
|
||||||
|
@ -550,7 +583,6 @@ static int __devinit twl4030_usb_probe(struct platform_device *pdev)
|
||||||
struct twl4030_usb_data *pdata = pdev->dev.platform_data;
|
struct twl4030_usb_data *pdata = pdev->dev.platform_data;
|
||||||
struct twl4030_usb *twl;
|
struct twl4030_usb *twl;
|
||||||
int status, err;
|
int status, err;
|
||||||
u8 pwr;
|
|
||||||
|
|
||||||
if (!pdata) {
|
if (!pdata) {
|
||||||
dev_dbg(&pdev->dev, "platform_data not available\n");
|
dev_dbg(&pdev->dev, "platform_data not available\n");
|
||||||
|
@ -569,10 +601,7 @@ static int __devinit twl4030_usb_probe(struct platform_device *pdev)
|
||||||
twl->otg.set_peripheral = twl4030_set_peripheral;
|
twl->otg.set_peripheral = twl4030_set_peripheral;
|
||||||
twl->otg.set_suspend = twl4030_set_suspend;
|
twl->otg.set_suspend = twl4030_set_suspend;
|
||||||
twl->usb_mode = pdata->usb_mode;
|
twl->usb_mode = pdata->usb_mode;
|
||||||
|
twl->asleep = 1;
|
||||||
pwr = twl4030_usb_read(twl, PHY_PWR_CTRL);
|
|
||||||
|
|
||||||
twl->asleep = (pwr & PHY_PWR_PHYPWD);
|
|
||||||
|
|
||||||
/* init spinlock for workqueue */
|
/* init spinlock for workqueue */
|
||||||
spin_lock_init(&twl->lock);
|
spin_lock_init(&twl->lock);
|
||||||
|
@ -610,15 +639,10 @@ static int __devinit twl4030_usb_probe(struct platform_device *pdev)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The IRQ handler just handles changes from the previous states
|
/* Power down phy or make it work according to
|
||||||
* of the ID and VBUS pins ... in probe() we must initialize that
|
* current link state.
|
||||||
* previous state. The easy way: fake an IRQ.
|
|
||||||
*
|
|
||||||
* REVISIT: a real IRQ might have happened already, if PREEMPT is
|
|
||||||
* enabled. Else the IRQ may not yet be configured or enabled,
|
|
||||||
* because of scheduling delays.
|
|
||||||
*/
|
*/
|
||||||
twl4030_usb_irq(twl->irq, twl);
|
twl4030_usb_phy_init(twl);
|
||||||
|
|
||||||
dev_info(&pdev->dev, "Initialized TWL4030 USB module\n");
|
dev_info(&pdev->dev, "Initialized TWL4030 USB module\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -2024,6 +2024,9 @@ static int mos7720_ioctl(struct tty_struct *tty, struct file *file,
|
||||||
|
|
||||||
case TIOCGICOUNT:
|
case TIOCGICOUNT:
|
||||||
cnow = mos7720_port->icount;
|
cnow = mos7720_port->icount;
|
||||||
|
|
||||||
|
memset(&icount, 0, sizeof(struct serial_icounter_struct));
|
||||||
|
|
||||||
icount.cts = cnow.cts;
|
icount.cts = cnow.cts;
|
||||||
icount.dsr = cnow.dsr;
|
icount.dsr = cnow.dsr;
|
||||||
icount.rng = cnow.rng;
|
icount.rng = cnow.rng;
|
||||||
|
|
|
@ -2285,6 +2285,9 @@ static int mos7840_ioctl(struct tty_struct *tty, struct file *file,
|
||||||
case TIOCGICOUNT:
|
case TIOCGICOUNT:
|
||||||
cnow = mos7840_port->icount;
|
cnow = mos7840_port->icount;
|
||||||
smp_rmb();
|
smp_rmb();
|
||||||
|
|
||||||
|
memset(&icount, 0, sizeof(struct serial_icounter_struct));
|
||||||
|
|
||||||
icount.cts = cnow.cts;
|
icount.cts = cnow.cts;
|
||||||
icount.dsr = cnow.dsr;
|
icount.dsr = cnow.dsr;
|
||||||
icount.rng = cnow.rng;
|
icount.rng = cnow.rng;
|
||||||
|
|
Loading…
Reference in New Issue