Tim Wawrzynczak has submitted this change. ( https://review.coreboot.org/c/coreboot/+/45159 )
Change subject: mb/google/volteer: Separate power resource for VCM ......................................................................
mb/google/volteer: Separate power resource for VCM
The camera privacy LED blinks during the boot and this gives a wrong impression to the users that the camera is being used during the power up. The blink happens when the camera module is probed and a series of kernel patches and coreboot patches are being submitted to resolve the issue.
The kernel patches are submitted to the chromium gerrit.
https://chromium-review.googlesource.com/2403386 https://chromium-review.googlesource.com/2403387 https://chromium-review.googlesource.com/2403385 https://chromium-review.googlesource.com/2403384 https://chromium-review.googlesource.com/2403383 https://chromium-review.googlesource.com/2403382 https://chromium-review.googlesource.com/2403381 https://chromium-review.googlesource.com/2403380
This is to separate the power resource for the VCM so that it can be controlled by the driver and suppress the LED turn on.
BUG=b:169049942 BRANCH=none TEST=Build and boot volteer board. Monitor camera privacy LED and check if it blinks. It should not blink.
Signed-off-by: Daniel Kang daniel.h.kang@intel.com Change-Id: Id51c98e42c5f20e231d8096c9d2d98deebc7c968 Reviewed-on: https://review.coreboot.org/c/coreboot/+/45159 Tested-by: build bot (Jenkins) no-reply@coreboot.org Reviewed-by: Tim Wawrzynczak twawrzynczak@chromium.org Reviewed-by: Tomasz Figa tfiga@google.com --- M src/mainboard/google/volteer/variants/baseboard/include/baseboard/acpi/mipi_camera.asl 1 file changed, 77 insertions(+), 43 deletions(-)
Approvals: build bot (Jenkins): Verified Tomasz Figa: Looks good to me, but someone else must approve Tim Wawrzynczak: Looks good to me, approved
diff --git a/src/mainboard/google/volteer/variants/baseboard/include/baseboard/acpi/mipi_camera.asl b/src/mainboard/google/volteer/variants/baseboard/include/baseboard/acpi/mipi_camera.asl index 51034c3..38cf14a 100644 --- a/src/mainboard/google/volteer/variants/baseboard/include/baseboard/acpi/mipi_camera.asl +++ b/src/mainboard/google/volteer/variants/baseboard/include/baseboard/acpi/mipi_camera.asl @@ -146,64 +146,69 @@
Scope (_SB.PCI0.I2C3) { + /* Reference counter to track power control by RCAM and VCM */ + Name (REFC, 0) PowerResource (RCPR, 0x00, 0x0000) { - Name (STA, Zero) + Name (STA, 0) Method (_ON, 0, Serialized) /* Rear camera_ON_: Power On */ { - If ((STA == Zero)) - { - /* Enable IMG_CLK */ - MCON(3,1) /* Clock 3, 19.2MHz */ + /* Enable IMG_CLK */ + MCON(3,1) /* Clock 3, 19.2MHz */
- /* Pull RST low */ + /* Pull RST low */ #if CONFIG(BOARD_GOOGLE_VOLTEER) - CTXS(GPP_F15) + CTXS(GPP_F15) #else - CTXS(GPP_D4) + CTXS(GPP_D4) #endif
- /* Pull SNRPWR_EN high */ - STXS(GPP_H14) + /* Pull SNRPWR_EN high */ + STXS(GPP_H14)
+ If (REFC == 0) + { /* Pull PWREN high */ STXS(GPP_H20) - Sleep(2) /* reset pulse width */ - - /* Pull RST high */ -#if CONFIG(BOARD_GOOGLE_VOLTEER) - STXS(GPP_F15) -#else - STXS(GPP_D4) -#endif - Sleep(1) /* t2 */ - - Store(1,STA) } + Sleep(2) /* reset pulse width */ + + REFC++ + + /* Pull RST high */ +#if CONFIG(BOARD_GOOGLE_VOLTEER) + STXS(GPP_F15) +#else + STXS(GPP_D4) +#endif + Sleep(1) /* t2 */ + + STA = 1 } Method (_OFF, 0, Serialized) /* Rear camera _OFF: Power Off */ { - If ((STA == One)) - { - /* Disable IMG_CLK */ - Sleep(1) /* t0+t1 */ - MCOF(3) /* Clock 3 */ + /* Disable IMG_CLK */ + Sleep(1) /* t0+t1 */ + MCOF(3) /* Clock 3 */
- /* Pull RST low */ + /* Pull RST low */ #if CONFIG(BOARD_GOOGLE_VOLTEER) - CTXS(GPP_F15) + CTXS(GPP_F15) #else - CTXS(GPP_D4) + CTXS(GPP_D4) #endif
+ If (REFC == 1) + { /* Pull PWREN low */ CTXS(GPP_H20) - - /* Pull SNRPWR_EN low */ - CTXS(GPP_H14) - - Store(0,STA) } + REFC-- + + /* Pull SNRPWR_EN low */ + CTXS(GPP_H14) + + STA = 0 } Method (_STA, 0, NotSerialized) /* _STA: Status */ { @@ -266,7 +271,7 @@ { "i2c-allow-low-power-probe", 0x01 - } + } } }) Name (PRT0, Package (0x04) @@ -339,6 +344,35 @@ }) }
+ PowerResource (VCPR, 0x00, 0x0000) + { + Name (STA, 0) + Method (_ON, 0, Serialized) /* VCPR_ON_: VCM Power On */ + { + If (REFC == 0) + { + /* Pull PWREN high */ + STXS(GPP_H20) + } + REFC++ + STA = 1 + } + Method (_OFF, 0, Serialized) /* VCPR_OFF: VCM Power Off */ + { + If (REFC == 1) + { + /* Pull PWREN low */ + CTXS(GPP_H20) + } + REFC-- + STA = 0 + } + Method (_STA, 0, NotSerialized) /* _STA: Status */ + { + Return (STA) + } + } + Device (VCM0) { Name (_HID, "PRP0001") /* _HID: Hardware ID */ @@ -361,11 +395,11 @@ }) Name (_PR0, Package (0x01) /* _PR0: Power Resources for D0 */ { - RCPR + VCPR }) Name (_PR3, Package (0x01) /* _PR3: Power Resources for D3hot */ { - RCPR + VCPR }) Name (_DSD, Package (0x02) /* _DSD: Device-Specific Data */ { @@ -381,7 +415,7 @@ { "i2c-allow-low-power-probe", 0x01 - } + } } }) } @@ -455,12 +489,12 @@
Scope (_SB.PCI0.I2C2) { + Name (STA, Zero) PowerResource (FCPR, 0x00, 0x0000) { - Name (STA, Zero) Method (_ON, 0, Serialized) /* Front camera_ON_: Power On */ { - If ((STA == Zero)) + If (STA == 0) { /* Enable IMG_CLK */ MCON(2,1) /* Clock 2, 19.2MHz */ @@ -479,12 +513,12 @@ STXS(GPP_D4) Sleep(1) /* t2 */
- Store(1,STA) + STA = 1 } } Method (_OFF, 0, Serialized) /* Front camera_OFF_: Power Off */ { - If ((STA == One)) + If (STA == 1) { /* Disable IMG_CLK */ Sleep(1) /* t0+t1 */ @@ -499,7 +533,7 @@ /* Pull SNRPWR_EN low */ CTXS(GPP_D18)
- Store(0,STA) + STA = 0 } } Method (_STA, 0, NotSerialized) /* _STA: Status */