soc/intel/tigerlake: Implement soc_get_pmc_mux_device()

The ChromeOS EC is adding new entries to its USBC.CONx devices (see later
patch), and it needs to get access to the PMC.MUX device so that its
ACPI path can be retrieved. This provides a weak function to return NULL
for all Intel SoCs except for Tiger Lake, which locates the device if it
is found in the devicetree.

Change-Id: I3fe3ef25e9fac8748142f5b1bd870c9bc70b97ff
Signed-off-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/40948
Reviewed-by: Duncan Laurie <dlaurie@chromium.org>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Tim Wawrzynczak 2020-05-18 13:43:19 -06:00 committed by Duncan Laurie
parent 90e683b307
commit c7854b064f
3 changed files with 31 additions and 0 deletions

View File

@ -3,6 +3,8 @@
#ifndef __DRIVERS_INTEL_PMC_MUX_H__
#define __DRIVERS_INTEL_PMC_MUX_H__
extern struct chip_operations drivers_intel_pmc_mux_ops;
struct drivers_intel_pmc_mux_config {
};

View File

@ -51,4 +51,13 @@ int pmc_soc_get_resources(struct pmc_resource_config *cfg);
/* API to set ACPI mode */
void pmc_set_acpi_mode(void);
/*
* Returns a reference to the PMC MUX device for the given port number.
* Returns NULL if not found or SoC does not support PMC MUX.
*
* Input: Port number (0-based)
* Output: Const pointer to PMC MUX device
*/
const struct device *soc_get_pmc_mux_device(int port_number);
#endif /* SOC_INTEL_COMMON_BLOCK_PMC_H */

View File

@ -11,6 +11,7 @@
#include <console/console.h>
#include <device/mmio.h>
#include <device/device.h>
#include <drivers/intel/pmc_mux/chip.h>
#include <intelblocks/pmc.h>
#include <intelblocks/pmclib.h>
#include <intelblocks/rtc.h>
@ -123,6 +124,25 @@ static void soc_pmc_fill_ssdt(const struct device *dev)
dev_path(dev));
}
/* By default, TGL uses the PMC MUX for all ports, so port_number is unused */
const struct device *soc_get_pmc_mux_device(int port_number)
{
const struct device *pmc;
struct device *child;
child = NULL;
pmc = pcidev_path_on_root(PCH_DEVFN_PMC);
if (!pmc || !pmc->link_list)
return NULL;
while ((child = dev_bus_each_child(pmc->link_list, child)) != NULL)
if (child->chip_ops == &drivers_intel_pmc_mux_ops)
break;
/* child will either be the correct device or NULL if not found */
return child;
}
struct device_operations pmc_ops = {
.read_resources = soc_pmc_read_resources,
.set_resources = noop_set_resources,