diff --git a/src/soc/intel/common/feature/i2c/Kconfig b/src/soc/intel/common/feature/i2c/Kconfig new file mode 100644 index 0000000000..5dede903d3 --- /dev/null +++ b/src/soc/intel/common/feature/i2c/Kconfig @@ -0,0 +1,8 @@ +## SPDX-License-Identifier: GPL-2.0-only + +config SOC_INTEL_COMMON_FEATURE_I2C_DEVFN + bool + help + Common I2C device function to bus mapping implementation. + SoCs using this must define SOC_I2C_DEVFN(n) macro in their + pci_devs.h and CONFIG_SOC_INTEL_I2C_DEV_MAX in their Kconfig. diff --git a/src/soc/intel/common/feature/i2c/Makefile.mk b/src/soc/intel/common/feature/i2c/Makefile.mk new file mode 100644 index 0000000000..2b4a6ab6fb --- /dev/null +++ b/src/soc/intel/common/feature/i2c/Makefile.mk @@ -0,0 +1,4 @@ +## SPDX-License-Identifier: GPL-2.0-only + +all-$(CONFIG_SOC_INTEL_COMMON_FEATURE_I2C_DEVFN) += i2c_devfn.c +smm-$(CONFIG_SOC_INTEL_COMMON_FEATURE_I2C_DEVFN) += i2c_devfn.c diff --git a/src/soc/intel/common/feature/i2c/i2c_devfn.c b/src/soc/intel/common/feature/i2c/i2c_devfn.c new file mode 100644 index 0000000000..e8adb2fe4b --- /dev/null +++ b/src/soc/intel/common/feature/i2c/i2c_devfn.c @@ -0,0 +1,79 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include +#include + +/* + * SoC-specific I2C device function to bus number mapping. + * + * Each SoC must define: + * - CONFIG_SOC_INTEL_I2C_DEV_MAX: Maximum number of I2C controllers + * - SOC_I2C_DEVFN(n): Macro that expands to the SoC-specific I2C device + * function name (e.g., PCH_DEVFN_I2Cn or PCI_DEVFN_I2Cn) + */ + +_Static_assert(CONFIG_SOC_INTEL_I2C_DEV_MAX <= 8, + "CONFIG_SOC_INTEL_I2C_DEV_MAX greater than 8 is not supported."); + +int dw_i2c_soc_devfn_to_bus(unsigned int devfn) +{ + switch (devfn) { + case SOC_I2C_DEVFN(0): + return 0; + case SOC_I2C_DEVFN(1): + return 1; + case SOC_I2C_DEVFN(2): + return 2; + case SOC_I2C_DEVFN(3): + return 3; +#if CONFIG_SOC_INTEL_I2C_DEV_MAX > 4 + case SOC_I2C_DEVFN(4): + return 4; +#endif +#if CONFIG_SOC_INTEL_I2C_DEV_MAX > 5 + case SOC_I2C_DEVFN(5): + return 5; +#endif +#if CONFIG_SOC_INTEL_I2C_DEV_MAX > 6 + case SOC_I2C_DEVFN(6): + return 6; +#endif +#if CONFIG_SOC_INTEL_I2C_DEV_MAX > 7 + case SOC_I2C_DEVFN(7): + return 7; +#endif + } + return -1; +} + +int dw_i2c_soc_bus_to_devfn(unsigned int bus) +{ + switch (bus) { + case 0: + return SOC_I2C_DEVFN(0); + case 1: + return SOC_I2C_DEVFN(1); + case 2: + return SOC_I2C_DEVFN(2); + case 3: + return SOC_I2C_DEVFN(3); +#if CONFIG_SOC_INTEL_I2C_DEV_MAX > 4 + case 4: + return SOC_I2C_DEVFN(4); +#endif +#if CONFIG_SOC_INTEL_I2C_DEV_MAX > 5 + case 5: + return SOC_I2C_DEVFN(5); +#endif +#if CONFIG_SOC_INTEL_I2C_DEV_MAX > 6 + case 6: + return SOC_I2C_DEVFN(6); +#endif +#if CONFIG_SOC_INTEL_I2C_DEV_MAX > 7 + case 7: + return SOC_I2C_DEVFN(7); +#endif + } + return -1; +}