From 8661fe220d92cedbb5eb7956d74b764670d354f3 Mon Sep 17 00:00:00 2001 From: Daniel Kang Date: Thu, 27 Aug 2020 14:39:02 -0700 Subject: 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 Change-Id: Id51c98e42c5f20e231d8096c9d2d98deebc7c968 Reviewed-on: https://review.coreboot.org/c/coreboot/+/45159 Tested-by: build bot (Jenkins) Reviewed-by: Tim Wawrzynczak Reviewed-by: Tomasz Figa --- .../include/baseboard/acpi/mipi_camera.asl | 110 ++++++++++++++------- 1 file changed, 72 insertions(+), 38 deletions(-) (limited to 'src/mainboard/google/volteer/variants/baseboard/include') 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 51034c3d73..38cf14a80d 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.IPU0) 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 */ + } + Sleep(2) /* reset pulse width */ - /* Pull RST high */ + REFC++ + + /* Pull RST high */ #if CONFIG(BOARD_GOOGLE_VOLTEER) - STXS(GPP_F15) + STXS(GPP_F15) #else - STXS(GPP_D4) + STXS(GPP_D4) #endif - Sleep(1) /* t2 */ + Sleep(1) /* t2 */ - Store(1,STA) - } + 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) + } + REFC-- - /* Pull SNRPWR_EN low */ - CTXS(GPP_H14) + /* Pull SNRPWR_EN low */ + CTXS(GPP_H14) - Store(0,STA) - } + STA = 0 } Method (_STA, 0, NotSerialized) /* _STA: Status */ { @@ -266,7 +271,7 @@ Scope (\_SB.PCI0.I2C3) { "i2c-allow-low-power-probe", 0x01 - } + } } }) Name (PRT0, Package (0x04) @@ -339,6 +344,35 @@ Scope (\_SB.PCI0.I2C3) }) } + 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 @@ Scope (\_SB.PCI0.I2C3) }) 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 @@ Scope (\_SB.PCI0.I2C3) { "i2c-allow-low-power-probe", 0x01 - } + } } }) } @@ -455,12 +489,12 @@ Scope (\_SB.PCI0.I2C3) 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 @@ Scope (\_SB.PCI0.I2C2) 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 @@ Scope (\_SB.PCI0.I2C2) /* Pull SNRPWR_EN low */ CTXS(GPP_D18) - Store(0,STA) + STA = 0 } } Method (_STA, 0, NotSerialized) /* _STA: Status */ -- cgit v1.2.3