# SMBus configuration options

# Copyright (c) 2022 Intel Corporation
# SPDX-License-Identifier: Apache-2.0

menuconfig SMBUS
	bool "System Management Bus (SMBus) drivers"
	help
	  Enable SMBus Driver Configuration

if SMBUS

config SMBUS_SHELL
	bool "SMBus Shell"
	default y
	depends on SHELL
	help
	  Enable SMBus Shell.

config SMBUS_STATS
	bool "SMBus device Stats"
	depends on STATS
	help
	  Enable SMBus Stats.

config SMBUS_INIT_PRIORITY
	int "Init priority"
	default KERNEL_INIT_PRIORITY_DEFAULT
	help
	  SMBus device driver initialization priority.


module = SMBUS
module-str = smbus
source "subsys/logging/Kconfig.template.log_config"

config SMBUS_INTEL_PCH
	bool "SMBus Intel PCH driver"
	default y
	depends on DT_HAS_INTEL_PCH_SMBUS_ENABLED
	select PCIE
	select DYNAMIC_INTERRUPTS
	help
	  Enable Intel Platform Controller Hub (PCH) SMBus driver.

if SMBUS_INTEL_PCH

choice SMBUS_INTEL_PCH_ACCESS
	bool "SMBus register access mode"
	default SMBUS_INTEL_PCH_ACCESS_IO
	help
	  Default PCH register access mode. Set default access IO so
	  that both Qemu Q35 and Intel hardware are supported.

config SMBUS_INTEL_PCH_ACCESS_IO
	bool "I/O PCH SMBus Register Access Mode"
	help
	  Access PCH SMBus registers through I/O space.

config SMBUS_INTEL_PCH_ACCESS_MMIO
	bool "MMIO PCH SMBus Register Access Mode"
	help
	  Access PCH SMBus registers though MMIO space.

endchoice

config SMBUS_INTEL_PCH_HOST_NOTIFY
	bool "SMBus Intel PCH Host Notify support"
	default y
	help
	  Support Host Notify from peripheral devices.

config SMBUS_INTEL_PCH_SMBALERT
	bool "SMBus Intel PCH SMBALERT signal support"
	default y
	help
	  Support SMBALERT signal from peripheral devices.

endif # SMBUS_INTEL_PCH

endif # SMBUS
