From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-ed1-f51.google.com (mail-ed1-f51.google.com [209.85.208.51]) by mx.groups.io with SMTP id smtpd.web08.11282.1636144493947372581 for ; Fri, 05 Nov 2021 13:34:54 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@gmail.com header.s=20210112 header.b=KbnJHP4x; spf=pass (domain: gmail.com, ip: 209.85.208.51, mailfrom: mariobalanica02@gmail.com) Received: by mail-ed1-f51.google.com with SMTP id c8so20358874ede.13 for ; Fri, 05 Nov 2021 13:34:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=zg46+Zjs+z93W1jrj3BMRXoqKRP5iGaDn9j6C1bca5o=; b=KbnJHP4xBbldPM02VvKAgwsP98sIRvxp/fl5lZo2hsQHcGzIEbJ9eQPc+Bhv7r3+l2 ayiwrlWdGJDbiFejmCfQIwuwRqssZ3My0YXETduCHIL0hayF03zfvJogVU+quDC9OHcz j+3Y0YBTJN3aYD70gVs3VpTOQlUT0MvyJxHumC0990Hw82g+qxSEJkk04525zR+G2pjE R3CW1DZ8/uZCe2K6NPtbBEKDl2cHqd+z1PFMA0aU2Eoge5hi3nab+LWYtaRIzJHjFtII ULBMhXKOWlkjwu17kAyKCVVpQks2oDmG6ZCbQns1Dsk1hWxRDSJWs0Oi9hMaMKCmLfhQ MPFg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=zg46+Zjs+z93W1jrj3BMRXoqKRP5iGaDn9j6C1bca5o=; b=zaf8MLKCjfsfLAdtpE7/fmnfamOKB4ATE8DZZdfYgNbO04g+FVGC4JoysXhj6y4I0H kZF6OUW0F1UTX49Rxj5lhfJP422j0DRMa8hVnUeU1TCt2jvKUDFaC4/AoW4Rj6xE0K2p Ierm/diVI+SfYyqM/EHB/g3Xn5qNE/xzO4jlg8xtzHLyp3wpv3znWjQkqIcGzpHsx0/E aPud6iT1bTO51QazoTk9mM77nNgWazva9CQaZMLxEGhgWCLNzhC+lCCuhs/GtwDltHbB f9DhC2idD7FohNWc1fJjxA2+JGkIqr95VA2rJXFkNBtShjoGyeF1smm3onidT1ai0E3H mSQQ== X-Gm-Message-State: AOAM532TLOmNGojUQvR0AKWQOcgmHtZ6tuhY5NGS5EQ7U278/UCW+AFx y1hLvyd/sQ0uOBut0HxKXcUq5kPqgx8J1A== X-Google-Smtp-Source: ABdhPJwQVdvwc4kVy+CZfmZPyIoKJLeiPcECW0WDW7CU1A2d8HUEtpWzriDiJWIeilO9D1tWNqrxzg== X-Received: by 2002:a17:907:e8b:: with SMTP id ho11mr58099662ejc.430.1636144492293; Fri, 05 Nov 2021 13:34:52 -0700 (PDT) Return-Path: Received: from localhost.localdomain ([2a02:2f0e:c00e:9100:4cef:cfe6:232e:a0d2]) by smtp.gmail.com with ESMTPSA id sh33sm4681399ejc.56.2021.11.05.13.34.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Nov 2021 13:34:52 -0700 (PDT) From: =?UTF-8?B?TWFyaW8gQsSDbMSDbmljxIM=?= To: devel@edk2.groups.io Cc: ardb+tianocore@kernel.org, leif@nuviainc.com, pete@akeo.ie, samer.el-haj-mahmoud@arm.com, jeremy.linton@arm.com, sunny.wang@arm.com Subject: [edk2-platforms][PATCH v1 1/2] Platform/RaspberryPi: Add support for PWM1 in ACPI Date: Fri, 5 Nov 2021 22:34:35 +0200 Message-Id: <20211105203436.997-1-mariobalanica02@gmail.com> X-Mailer: git-send-email 2.29.2.windows.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Also fix PWM0 on the Raspberry Pi 4, but we can't expose both yet. Signed-off-by: Mario B=C4=83l=C4=83nic=C4=83 --- Platform/RaspberryPi/AcpiTables/AcpiTables.h | 10 ++- Platform/RaspberryPi/AcpiTables/Dsdt.asl | 34 ++++++= --- Platform/RaspberryPi/AcpiTables/GpuDevs.asl | 78 ++++++= ++++++++++---- Silicon/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2836.h | 13 ++++ Silicon/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2836Pwm.h | 26 +++---- 5 files changed, 122 insertions(+), 39 deletions(-) diff --git a/Platform/RaspberryPi/AcpiTables/AcpiTables.h b/Platform/Raspbe= rryPi/AcpiTables/AcpiTables.h index 37e2a6bdf409..05da967803af 100644 --- a/Platform/RaspberryPi/AcpiTables/AcpiTables.h +++ b/Platform/RaspberryPi/AcpiTables/AcpiTables.h @@ -24,6 +24,11 @@ CreateDwordField (^BufName, ^MemName._BAS, VarName) \=0D Add (BCM2836_SOC_REGISTERS, Offset, VarName)=0D =0D +// Same as above, but without the base address.=0D +#define MEMORY32SET(BufName, MemName, VarName, Address) \=0D + CreateDwordField (^BufName, ^MemName._BAS, VarName) \=0D + Store(Address, VarName)=0D +=0D #define EFI_ACPI_OEM_ID {'R','P','I','F','D','N'}=0D #if (RPI_MODEL =3D=3D 3)=0D #define EFI_ACPI_OEM_TABLE_ID SIGNATURE_64 ('R','P','I','3= ',' ',' ',' ',' ')=0D @@ -113,7 +118,7 @@ typedef struct //------------------------------------------------------------------------= =0D #if (RPI_MODEL =3D=3D 3)=0D #define BCM2836_V3D_BUS_INTERRUPT 0x2A=0D -#define BCM2836_DMA_INTERRUPT 0x3B=0D +#define BCM2836_DMA5_INTERRUPT 0x35=0D #define BCM2836_SPI1_INTERRUPT 0x3D=0D #define BCM2836_SPI2_INTERRUPT 0x3D=0D #define BCM2836_HVS_INTERRUPT 0x41=0D @@ -138,7 +143,8 @@ typedef struct #define BCM2836_PL011_UART_INTERRUPT 0x59=0D #elif (RPI_MODEL =3D=3D 4)=0D #define BCM2836_V3D_BUS_INTERRUPT 0x2A=0D -#define BCM2836_DMA_INTERRUPT 0x3B=0D +#define BCM2836_DMA0_INTERRUPT 0x70=0D +#define BCM2836_DMA5_INTERRUPT 0x75=0D #define BCM2836_SPI1_INTERRUPT 0x7D=0D #define BCM2836_SPI2_INTERRUPT 0x7D=0D #define BCM2836_HVS_INTERRUPT 0x41=0D diff --git a/Platform/RaspberryPi/AcpiTables/Dsdt.asl b/Platform/RaspberryP= i/AcpiTables/Dsdt.asl index b594d50bdf8e..fbc0049e6beb 100644 --- a/Platform/RaspberryPi/AcpiTables/Dsdt.asl +++ b/Platform/RaspberryPi/AcpiTables/Dsdt.asl @@ -139,15 +139,22 @@ DefinitionBlock ("Dsdt.aml", "DSDT", 2, "RPIFDN", "RP= I", 2) QWORDMEMORYBUF(14)=0D QWORDMEMORYBUF(15)=0D // QWORDMEMORYBUF(16)=0D +#if (RPI_MODEL =3D=3D 3)=0D QWORDMEMORYBUF(17)=0D QWORDMEMORYBUF(18)=0D QWORDMEMORYBUF(19)=0D QWORDMEMORYBUF(20)=0D +#elif (RPI_MODEL =3D=3D 4)=0D QWORDMEMORYBUF(21)=0D QWORDMEMORYBUF(22)=0D QWORDMEMORYBUF(23)=0D QWORDMEMORYBUF(24)=0D +#endif=0D QWORDMEMORYBUF(25)=0D + QWORDMEMORYBUF(26)=0D + QWORDMEMORYBUF(27)=0D + QWORDMEMORYBUF(28)=0D + QWORDMEMORYBUF(29)=0D })=0D =0D // USB=0D @@ -181,19 +188,28 @@ DefinitionBlock ("Dsdt.aml", "DSDT", 2, "RPIFDN", "RP= I", 2) // QWORDMEMORYSET(16, BCM2836_SPI2_OFFSET, BCM2836_SPI2_LENGTH)=0D =0D // PWM=0D - QWORDMEMORYSET(17, BCM2836_PWM_DMA_OFFSET, BCM2836_PWM_DMA_LENGTH)= =0D - QWORDMEMORYSET(18, BCM2836_PWM_CTRL_OFFSET, BCM2836_PWM_CTRL_LENGT= H)=0D - QWORDBUSMEMORYSET(19, BCM2836_PWM_BUS_BASE_ADDRESS, BCM2836_PWM_BU= S_LENGTH)=0D - QWORDBUSMEMORYSET(20, BCM2836_PWM_CTRL_UNCACHED_BASE_ADDRESS, BCM2= 836_PWM_CTRL_UNCACHED_LENGTH)=0D - QWORDMEMORYSET(21, BCM2836_PWM_CLK_OFFSET, BCM2836_PWM_CLK_LENGTH)= =0D +#if (RPI_MODEL =3D=3D 3)=0D + QWORDMEMORYSET(17, BCM2836_DMA5_OFFSET, BCM2836_DMA_CHANNEL_LENGTH= )=0D + QWORDMEMORYSET(18, BCM2836_PWM0_CTRL_OFFSET, BCM2836_PWM_CTRL_LENG= TH)=0D + QWORDBUSMEMORYSET(19, BCM2836_PWM0_CTRL_BUS_BASE_ADDRESS, BCM2836_= PWM_CTRL_LENGTH)=0D + QWORDBUSMEMORYSET(20, BCM2836_DMA_DEVICE_OFFSET, 1)=0D +#elif (RPI_MODEL =3D=3D 4)=0D + QWORDMEMORYSET(21, BCM2836_DMA0_OFFSET, BCM2836_DMA_CHANNEL_LENGTH= )=0D + QWORDMEMORYSET(22, BCM2836_PWM1_CTRL_OFFSET, BCM2836_PWM_CTRL_LENG= TH)=0D + QWORDBUSMEMORYSET(23, BCM2836_PWM1_CTRL_BUS_BASE_ADDRESS, BCM2836_= PWM_CTRL_LENGTH)=0D + QWORDBUSMEMORYSET(24, BCM2836_DMA_DEVICE_OFFSET, 1)=0D +#endif=0D +=0D + // PWM Clock Manager Control=0D + QWORDMEMORYSET(25, BCM2836_CM_PWM_CLOCK_CTRL_OFFSET, BCM2836_CM_PE= RIPHERAL_CLOCK_LENGTH)=0D =0D // UART=0D - QWORDMEMORYSET(22, BCM2836_PL011_UART_OFFSET, BCM2836_PL011_UART_L= ENGTH)=0D - QWORDMEMORYSET(23, BCM2836_MINI_UART_OFFSET, BCM2836_MINI_UART_LEN= GTH)=0D + QWORDMEMORYSET(26, BCM2836_PL011_UART_OFFSET, BCM2836_PL011_UART_L= ENGTH)=0D + QWORDMEMORYSET(27, BCM2836_MINI_UART_OFFSET, BCM2836_MINI_UART_LEN= GTH)=0D =0D // SDC=0D - QWORDMEMORYSET(24, MMCHS1_OFFSET, MMCHS1_LENGTH)=0D - QWORDMEMORYSET(25, SDHOST_OFFSET, SDHOST_LENGTH)=0D + QWORDMEMORYSET(28, MMCHS1_OFFSET, MMCHS1_LENGTH)=0D + QWORDMEMORYSET(29, SDHOST_OFFSET, SDHOST_LENGTH)=0D =0D Return (RBUF)=0D }=0D diff --git a/Platform/RaspberryPi/AcpiTables/GpuDevs.asl b/Platform/Raspber= ryPi/AcpiTables/GpuDevs.asl index 9750dc25c07c..b499620e089a 100644 --- a/Platform/RaspberryPi/AcpiTables/GpuDevs.asl +++ b/Platform/RaspberryPi/AcpiTables/GpuDevs.asl @@ -354,12 +354,20 @@ Device (SPI1) // }=0D // }=0D =0D -// PWM Driver=0D +// PWM devices=0D +//=0D +// TO-DOs (that also require changes in the Windows drivers):=0D +// - drop bus addresses from _CRS and use _DMA instead=0D +// - the Clock Manager should probably have its own device definition s= ince it's=0D +// shared between both controllers=0D +// - expose both devices on the Raspberry Pi 4=0D +//=0D +#if (RPI_MODEL =3D=3D 3)=0D Device (PWM0)=0D {=0D Name (_HID, "BCM2844")=0D Name (_CID, "BCM2844")=0D - Name (_UID, 0)=0D + Name (_UID, 0x0)=0D Name (_CCA, 0x0)=0D Method (_STA)=0D {=0D @@ -367,30 +375,70 @@ Device (PWM0) }=0D Name (RBUF, ResourceTemplate ()=0D {=0D - // DMA channel 11 control=0D - MEMORY32FIXED (ReadWrite, 0, BCM2836_PWM_DMA_LENGTH, RM01)=0D + // DMA channel control=0D + MEMORY32FIXED (ReadWrite, 0, BCM2836_DMA_CHANNEL_LENGTH, RM01)=0D // PWM control=0D MEMORY32FIXED (ReadWrite, 0, BCM2836_PWM_CTRL_LENGTH, RM02)=0D // PWM control bus=0D - MEMORY32FIXED (ReadWrite, BCM2836_PWM_BUS_BASE_ADDRESS, BCM2836_PWM_BU= S_LENGTH, )=0D - // PWM control uncached=0D - MEMORY32FIXED (ReadWrite, BCM2836_PWM_CTRL_UNCACHED_BASE_ADDRESS, BCM2= 836_PWM_CTRL_UNCACHED_LENGTH, )=0D + MEMORY32FIXED (ReadWrite, 0, BCM2836_PWM_CTRL_LENGTH, RM03)=0D + // Uncached base address=0D + MEMORY32FIXED (ReadWrite, BCM2836_DMA_DEVICE_OFFSET, 1, )=0D // PWM clock control=0D - MEMORY32FIXED (ReadWrite, 0, BCM2836_PWM_CLK_LENGTH, RM03)=0D - // Interrupt DMA channel 11=0D - Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive) { BCM2836_D= MA_INTERRUPT }=0D - // DMA channel 11, DREQ 5 for PWM=0D - FixedDMA (5, 11, Width32Bit, )=0D + MEMORY32FIXED (ReadWrite, 0, BCM2836_CM_PERIPHERAL_CLOCK_LENGTH, RM04)= =0D + // DMA channel interrupt=0D + Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive) { BCM2836_D= MA5_INTERRUPT }=0D + // DREQ 5, DMA channel 5=0D + FixedDMA (5, 5, Width32Bit, )=0D })=0D =0D Method (_CRS, 0x0, Serialized)=0D {=0D - MEMORY32SETBASE (RBUF, RM01, RB01, BCM2836_PWM_DMA_OFFSET)=0D - MEMORY32SETBASE (RBUF, RM02, RB02, BCM2836_PWM_CTRL_OFFSET)=0D - MEMORY32SETBASE (RBUF, RM03, RB03, BCM2836_PWM_CLK_OFFSET)=0D + MEMORY32SETBASE (RBUF, RM01, RB01, BCM2836_DMA5_OFFSET)=0D + MEMORY32SETBASE (RBUF, RM02, RB02, BCM2836_PWM0_CTRL_OFFSET)=0D + MEMORY32SET (RBUF, RM03, RB03, BCM2836_PWM0_CTRL_BUS_BASE_ADDRESS)=0D + MEMORY32SETBASE (RBUF, RM04, RB04, BCM2836_CM_PWM_CLOCK_CTRL_OFFSET)=0D Return (^RBUF)=0D }=0D }=0D +#elif (RPI_MODEL =3D=3D 4)=0D +Device (PWM1)=0D +{=0D + Name (_HID, "BCM2844")=0D + Name (_CID, "BCM2844")=0D + Name (_UID, 0x1)=0D + Name (_CCA, 0x0)=0D + Method (_STA)=0D + {=0D + Return (0xf)=0D + }=0D + Name (RBUF, ResourceTemplate ()=0D + {=0D + // DMA channel control=0D + MEMORY32FIXED (ReadWrite, 0, BCM2836_DMA_CHANNEL_LENGTH, RM01)=0D + // PWM control=0D + MEMORY32FIXED (ReadWrite, 0, BCM2836_PWM_CTRL_LENGTH, RM02)=0D + // PWM control bus=0D + MEMORY32FIXED (ReadWrite, 0, BCM2836_PWM_CTRL_LENGTH, RM03)=0D + // Uncached base address=0D + MEMORY32FIXED (ReadWrite, BCM2836_DMA_DEVICE_OFFSET, 1, )=0D + // PWM clock control=0D + MEMORY32FIXED (ReadWrite, 0, BCM2836_CM_PERIPHERAL_CLOCK_LENGTH, RM04)= =0D + // DMA channel interrupt=0D + Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive) { BCM2836_D= MA0_INTERRUPT }=0D + // DREQ 1, DMA channel 0=0D + FixedDMA (1, 0, Width32Bit, )=0D + })=0D +=0D + Method (_CRS, 0x0, Serialized)=0D + {=0D + MEMORY32SETBASE (RBUF, RM01, RB01, BCM2836_DMA0_OFFSET)=0D + MEMORY32SETBASE (RBUF, RM02, RB02, BCM2836_PWM1_CTRL_OFFSET)=0D + MEMORY32SET (RBUF, RM03, RB03, BCM2836_PWM1_CTRL_BUS_BASE_ADDRESS)=0D + MEMORY32SETBASE (RBUF, RM04, RB04, BCM2836_CM_PWM_CLOCK_CTRL_OFFSET)=0D + Return (^RBUF)=0D + }=0D +}=0D +#endif=0D =0D include ("Uart.asl")=0D include ("Rhpx.asl")=0D diff --git a/Silicon/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2836.h b/= Silicon/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2836.h index a930c64af379..126ee52c5ab2 100644 --- a/Silicon/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2836.h +++ b/Silicon/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2836.h @@ -17,6 +17,11 @@ #define BCM2836_SOC_REGISTERS (FixedPcdGet64= (PcdBcm283xRegistersAddress))=0D #define BCM2836_SOC_REGISTER_LENGTH 0x02000000=0D =0D +/*=0D + * VC memory view=0D + */=0D +#define BCM2836_SOC_BUS_REGISTERS 0x7E000000=0D +=0D /*=0D * Offset between the CPU's view and the VC's view of system memory.=0D */=0D @@ -53,6 +58,8 @@ #define BCM2836_CM_EMMC_CLOCK_CONTROL 0x01c0=0D #define BCM2836_CM_EMMC_CLOCK_DIVISOR 0x01c4=0D =0D +#define BCM2836_CM_PERIPHERAL_CLOCK_LENGTH 0x00000008=0D +=0D /* mailbox interface constants */=0D #define BCM2836_MBOX_OFFSET 0x0000b880=0D #define BCM2836_MBOX_BASE_ADDRESS (BCM2836_SOC_R= EGISTERS + BCM2836_MBOX_OFFSET)=0D @@ -113,6 +120,12 @@ #define BCM2836_DMA0_OFFSET 0x00007000=0D #define BCM2836_DMA0_BASE_ADDRESS (BCM2836_SOC_R= EGISTERS + BCM2836_DMA0_OFFSET)=0D =0D +#define BCM2836_DMA1_OFFSET 0x00007100=0D +#define BCM2836_DMA1_BASE_ADDRESS (BCM2836_SOC_R= EGISTERS + BCM2836_DMA1_OFFSET)=0D +=0D +#define BCM2836_DMA5_OFFSET 0x00007500=0D +#define BCM2836_DMA5_BASE_ADDRESS (BCM2836_SOC_R= EGISTERS + BCM2836_DMA5_OFFSET)=0D +=0D #define BCM2836_DMA15_OFFSET 0x00E05000=0D #define BCM2836_DMA15_BASE_ADDRESS (BCM2836_SOC_R= EGISTERS + BCM2836_DMA15_OFFSET)=0D =0D diff --git a/Silicon/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2836Pwm.h= b/Silicon/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2836Pwm.h index ce17724b7c21..8fd1cf66d062 100644 --- a/Silicon/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2836Pwm.h +++ b/Silicon/Broadcom/Bcm283x/Include/IndustryStandard/Bcm2836Pwm.h @@ -13,22 +13,22 @@ =0D /* PWM controller constants */=0D =0D -#define BCM2836_PWM_DMA_OFFSET 0x00007B00=0D -#define BCM2836_PWM_DMA_BASE_ADDRESS (BCM2836_SOC_R= EGISTERS + BCM2836_PWM_DMA_OFFSET)=0D -#define BCM2836_PWM_DMA_LENGTH 0x00000100=0D +//=0D +// PWM0=0D +//=0D +#define BCM2836_PWM0_CTRL_OFFSET 0x0020C000=0D +#define BCM2836_PWM0_CTRL_BASE_ADDRESS (BCM2836_SOC_R= EGISTERS + BCM2836_PWM0_CTRL_OFFSET)=0D +#define BCM2836_PWM0_CTRL_BUS_BASE_ADDRESS (BCM2836_SOC_B= US_REGISTERS + BCM2836_PWM0_CTRL_OFFSET)=0D =0D -#define BCM2836_PWM_CLK_OFFSET 0x001010A0=0D -#define BCM2836_PWM_CLK_BASE_ADDRESS (BCM2836_SOC_R= EGISTERS + BCM2836_PWM_CLK_OFFSET)=0D -#define BCM2836_PWM_CLK_LENGTH 0x00000008=0D +//=0D +// PWM1 (only on BCM2711)=0D +//=0D +#define BCM2836_PWM1_CTRL_OFFSET 0x0020C800=0D +#define BCM2836_PWM1_CTRL_BASE_ADDRESS (BCM2836_SOC_R= EGISTERS + BCM2836_PWM1_CTRL_OFFSET)=0D +#define BCM2836_PWM1_CTRL_BUS_BASE_ADDRESS (BCM2836_SOC_B= US_REGISTERS + BCM2836_PWM1_CTRL_OFFSET)=0D =0D -#define BCM2836_PWM_CTRL_OFFSET 0x0020C000=0D -#define BCM2836_PWM_CTRL_BASE_ADDRESS (BCM2836_SOC_R= EGISTERS + BCM2836_PWM_CTRL_OFFSET)=0D #define BCM2836_PWM_CTRL_LENGTH 0x00000028=0D =0D -#define BCM2836_PWM_BUS_BASE_ADDRESS 0x7E20C000=0D -#define BCM2836_PWM_BUS_LENGTH 0x00000028=0D -=0D -#define BCM2836_PWM_CTRL_UNCACHED_BASE_ADDRESS 0xFF20C000=0D -#define BCM2836_PWM_CTRL_UNCACHED_LENGTH 0x00000028=0D +#define BCM2836_CM_PWM_CLOCK_CTRL_OFFSET (BCM2836_CM_OF= FSET + BCM2836_CM_PWM_CLOCK_CONTROL)=0D =0D #endif /* __BCM2836_PWM_H__ */=0D --=20 2.29.2.windows.2