• Ming Lei's avatar
    USB: otg: twl4030: fix phy initialization(v1) · fc8f2a76
    Ming Lei authored
    Commit 461c3177(into 2.6.36-v3)
    is put forward to power down phy if no usb cable is connected,
    but does introduce the two issues below:
    
    1), phy is not into work state if usb cable is connected
    with PC during poweron, so musb device mode is not usable
    in such case, follows the reasons:
    	-twl4030_phy_resume is not called, so
    		regulators are not enabled
    		i2c access are not enabled
    		usb mode not configurated
    
    2), The kernel warings[1] of regulators 'unbalanced disables'
    is caused if poweron without usb cable connected
    with PC or b-device.
    
    This patch fixes the two issues above:
    	-power down phy only if no usb cable is connected with PC
    and b-device
    	-do phy initialization(via __twl4030_phy_resume) if usb cable
    is connected with PC(vbus event) or another b-device(ID event) in
    twl4030_usb_probe.
    
    This patch also doesn't put VUSB3V1 LDO into active mode in
    twl4030_usb_ldo_init until VBUS/ID change detected, so we can
    save more power consumption than before.
    
    This patch is verified OK on Beagle board either connected with
    usb cable or not when poweron.
    
    [1]. warnings of 'unbalanced disables' of regulators.
    [root@OMAP3EVM /]# dmesg
    ------------[ cut here ]------------
    WARNING: at drivers/regulator/core.c:1357 _regulator_disable+0x38/0x128()
    unbalanced disables for VUSB1V8
    Modules linked in:
    Backtrace:
    [<c0030c48>] (dump_backtrace+0x0/0x110) from [<c034f5a8>] (dump_stack+0x18/0x1c)
     r7:c78179d8 r6:c01ed6b8 r5:c0410822 r4:0000054d
    [<c034f590>] (dump_stack+0x0/0x1c) from [<c0057da8>] (warn_slowpath_common+0x54/0x6c)
    [<c0057d54>] (warn_slowpath_common+0x0/0x6c) from [<c0057e64>] (warn_slowpath_fmt+0x38/0x40)
     r9:00000000 r8:00000000 r7:c78e6608 r6:00000000 r5:fffffffb
     r4:c78e6c00
    [<c0057e2c>] (warn_slowpath_fmt+0x0/0x40) from [<c01ed6b8>] (_regulator_disable+0x38/0x128)
     r3:c0410e53 r2:c0410ad5
    [<c01ed680>] (_regulator_disable+0x0/0x128) from [<c01ed87c>] (regulator_disable+0x24/0x38)
     r7:c78e6608 r6:00000000 r5:c78e6c40 r4:c78e6c00
    [<c01ed858>] (regulator_disable+0x0/0x38) from [<c02382dc>] (twl4030_phy_power+0x15c/0x17c)
     r5:c78595c0 r4:00000000
    [<c0238180>] (twl4030_phy_power+0x0/0x17c) from [<c023831c>] (twl4030_phy_suspend+0x20/0x2c)
     r6:00000000 r5:c78595c0 r4:c78595c0
    [<c02382fc>] (twl4030_phy_suspend+0x0/0x2c) from [<c0238638>] (twl4030_usb_irq+0x11c/0x16c)
     r5:c78595c0 r4:00000040
    [<c023851c>] (twl4030_usb_irq+0x0/0x16c) from [<c034ec18>] (twl4030_usb_probe+0x2c4/0x32c)
     r6:00000000 r5:00000000 r4:c78595c0
    [<c034e954>] (twl4030_usb_probe+0x0/0x32c) from [<c02152a0>] (platform_drv_probe+0x20/0x24)
     r7:00000000 r6:c047d49c r5:c78e6608 r4:c047d49c
    [<c0215280>] (platform_drv_probe+0x0/0x24) from [<c0214244>] (driver_probe_device+0xd0/0x190)
    [<c0214174>] (driver_probe_device+0x0/0x190) from [<c02143d4>] (__device_attach+0x44/0x48)
     r7:00000000 r6:c78e6608 r5:c78e6608 r4:c047d49c
    [<c0214390>] (__device_attach+0x0/0x48) from [<c0213694>] (bus_for_each_drv+0x50/0x90)
     r5:c0214390 r4:00000000
    [<c0213644>] (bus_for_each_drv+0x0/0x90) from [<c0214474>] (device_attach+0x70/0x94)
     r6:c78e663c r5:c78e6608 r4:c78e6608
    [<c0214404>] (device_attach+0x0/0x94) from [<c02134fc>] (bus_probe_device+0x2c/0x48)
     r7:00000000 r6:00000002 r5:c78e6608 r4:c78e6600
    [<c02134d0>] (bus_probe_device+0x0/0x48) from [<c0211e48>] (device_add+0x340/0x4b4)
    [<c0211b08>] (device_add+0x0/0x4b4) from [<c021597c>] (platform_device_add+0x110/0x16c)
    [<c021586c>] (platform_device_add+0x0/0x16c) from [<c0220cb0>] (add_numbered_child+0xd8/0x118)
     r7:00000000 r6:c045f15c r5:c78e6600 r4:00000000
    [<c0220bd8>] (add_numbered_child+0x0/0x118) from [<c001c618>] (twl_probe+0x3a4/0x72c)
    [<c001c274>] (twl_probe+0x0/0x72c) from [<c02601ac>] (i2c_device_probe+0x7c/0xa4)
    [<c0260130>] (i2c_device_probe+0x0/0xa4) from [<c0214244>] (driver_probe_device+0xd0/0x190)
     r5:c7856e20 r4:c047c860
    [<c0214174>] (driver_probe_device+0x0/0x190) from [<c02143d4>] (__device_attach+0x44/0x48)
     r7:c7856e04 r6:c7856e20 r5:c7856e20 r4:c047c860
    [<c0214390>] (__device_attach+0x0/0x48) from [<c0213694>] (bus_for_each_drv+0x50/0x90)
     r5:c0214390 r4:00000000
    [<c0213644>] (bus_for_each_drv+0x0/0x90) from [<c0214474>] (device_attach+0x70/0x94)
     r6:c7856e54 r5:c7856e20 r4:c7856e20
    [<c0214404>] (device_attach+0x0/0x94) from [<c02134fc>] (bus_probe_device+0x2c/0x48)
     r7:c7856e04 r6:c78fd048 r5:c7856e20 r4:c7856e20
    [<c02134d0>] (bus_probe_device+0x0/0x48) from [<c0211e48>] (device_add+0x340/0x4b4)
    [<c0211b08>] (device_add+0x0/0x4b4) from [<c0211fd8>] (device_register+0x1c/0x20)
    [<c0211fbc>] (device_register+0x0/0x20) from [<c0260aa8>] (i2c_new_device+0xec/0x150)
     r5:c7856e00 r4:c7856e20
    [<c02609bc>] (i2c_new_device+0x0/0x150) from [<c0260dc0>] (i2c_register_adapter+0xa0/0x1c4)
     r7:00000000 r6:c78fd078 r5:c78fd048 r4:c781d5c0
    [<c0260d20>] (i2c_register_adapter+0x0/0x1c4) from [<c0260f80>] (i2c_add_numbered_adapter+0x9c/0xb4)
     r7:00000a28 r6:c04600a8 r5:c78fd048 r4:00000000
    [<c0260ee4>] (i2c_add_numbered_adapter+0x0/0xb4) from [<c034efa4>] (omap_i2c_probe+0x324/0x3e8)
     r5:00000000 r4:c78fd000
    [<c034ec80>] (omap_i2c_probe+0x0/0x3e8) from [<c02152a0>] (platform_drv_probe+0x20/0x24)
    [<c0215280>] (platform_drv_probe+0x0/0x24) from [<c0214244>] (driver_probe_device+0xd0/0x190)
    [<c0214174>] (driver_probe_device+0x0/0x190) from [<c021436c>] (__driver_attach+0x68/0x8c)
     r7:c78b2140 r6:c047e214 r5:c04600e4 r4:c04600b0
    [<c0214304>] (__driver_attach+0x0/0x8c) from [<c021399c>] (bus_for_each_dev+0x50/0x84)
     r7:c78b2140 r6:c047e214 r5:c0214304 r4:00000000
    [<c021394c>] (bus_for_each_dev+0x0/0x84) from [<c0214068>] (driver_attach+0x20/0x28)
     r6:c047e214 r5:c047e214 r4:c00270d0
    [<c0214048>] (driver_attach+0x0/0x28) from [<c0213274>] (bus_add_driver+0xa8/0x228)
    [<c02131cc>] (bus_add_driver+0x0/0x228) from [<c02146a4>] (driver_register+0xb0/0x13c)
    [<c02145f4>] (driver_register+0x0/0x13c) from [<c0215744>] (platform_driver_register+0x4c/0x60)
     r9:00000000 r8:c001f688 r7:00000013 r6:c005b6fc r5:c00083dc
    r4:c00270d0
    [<c02156f8>] (platform_driver_register+0x0/0x60) from [<c001f69c>] (omap_i2c_init_driver+0x14/0x1c)
    [<c001f688>] (omap_i2c_init_driver+0x0/0x1c) from [<c002c460>] (do_one_initcall+0xd0/0x1a4)
    [<c002c390>] (do_one_initcall+0x0/0x1a4) from [<c0008478>] (kernel_init+0x9c/0x154)
    [<c00083dc>] (kernel_init+0x0/0x154) from [<c005b6fc>] (do_exit+0x0/0x688)
     r5:c00083dc r4:00000000
    ---[ end trace 1b75b31a2719ed1d ]---
    Signed-off-by: default avatarMing Lei <tom.leiming@gmail.com>
    Cc: David Brownell <dbrownell@users.sourceforge.net>
    Cc: Felipe Balbi <me@felipebalbi.com>
    Cc: Anand Gadiyar <gadiyar@ti.com>
    Cc: Mike Frysinger <vapier@gentoo.org>
    Cc: Sergei Shtylyov <sshtylyov@ru.mvista.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    fc8f2a76
twl4030-usb.c 18.7 KB