#include <linux/delay.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/spinlock.h>
#include <linux/pci.h>
#include <linux/debugfs.h>
#include <linux/capability.h>
#include <linux/pm_qos.h>
#include <linux/wait.h>
#include <asm/iosf_mbi.h>
#define PCI_DEVICE_ID_INTEL_BAYTRAIL …
#define PCI_DEVICE_ID_INTEL_BRASWELL …
#define PCI_DEVICE_ID_INTEL_QUARK_X1000 …
#define PCI_DEVICE_ID_INTEL_TANGIER …
static struct pci_dev *mbi_pdev;
static DEFINE_SPINLOCK(iosf_mbi_lock);
static inline u32 iosf_mbi_form_mcr(u8 op, u8 port, u8 offset)
{ … }
static int iosf_mbi_pci_read_mdr(u32 mcrx, u32 mcr, u32 *mdr)
{ … }
static int iosf_mbi_pci_write_mdr(u32 mcrx, u32 mcr, u32 mdr)
{ … }
int iosf_mbi_read(u8 port, u8 opcode, u32 offset, u32 *mdr)
{ … }
EXPORT_SYMBOL(…);
int iosf_mbi_write(u8 port, u8 opcode, u32 offset, u32 mdr)
{ … }
EXPORT_SYMBOL(…);
int iosf_mbi_modify(u8 port, u8 opcode, u32 offset, u32 mdr, u32 mask)
{ … }
EXPORT_SYMBOL(…);
bool iosf_mbi_available(void)
{ … }
EXPORT_SYMBOL(…);
#define SEMAPHORE_TIMEOUT …
#define PUNIT_SEMAPHORE_BYT …
#define PUNIT_SEMAPHORE_CHT …
#define PUNIT_SEMAPHORE_BIT …
#define PUNIT_SEMAPHORE_ACQUIRE …
static DEFINE_MUTEX(iosf_mbi_pmic_access_mutex);
static BLOCKING_NOTIFIER_HEAD(iosf_mbi_pmic_bus_access_notifier);
static DECLARE_WAIT_QUEUE_HEAD(iosf_mbi_pmic_access_waitq);
static u32 iosf_mbi_pmic_punit_access_count;
static u32 iosf_mbi_pmic_i2c_access_count;
static u32 iosf_mbi_sem_address;
static unsigned long iosf_mbi_sem_acquired;
static struct pm_qos_request iosf_mbi_pm_qos;
void iosf_mbi_punit_acquire(void)
{ … }
EXPORT_SYMBOL(…);
void iosf_mbi_punit_release(void)
{ … }
EXPORT_SYMBOL(…);
static int iosf_mbi_get_sem(u32 *sem)
{ … }
static void iosf_mbi_reset_semaphore(void)
{ … }
int iosf_mbi_block_punit_i2c_access(void)
{ … }
EXPORT_SYMBOL(…);
void iosf_mbi_unblock_punit_i2c_access(void)
{ … }
EXPORT_SYMBOL(…);
int iosf_mbi_register_pmic_bus_access_notifier(struct notifier_block *nb)
{ … }
EXPORT_SYMBOL(…);
int iosf_mbi_unregister_pmic_bus_access_notifier_unlocked(
struct notifier_block *nb)
{ … }
EXPORT_SYMBOL(…);
int iosf_mbi_unregister_pmic_bus_access_notifier(struct notifier_block *nb)
{ … }
EXPORT_SYMBOL(…);
void iosf_mbi_assert_punit_acquired(void)
{ … }
EXPORT_SYMBOL(…);
#ifdef CONFIG_IOSF_MBI_DEBUG
static u32 dbg_mdr;
static u32 dbg_mcr;
static u32 dbg_mcrx;
static int mcr_get(void *data, u64 *val)
{ … }
static int mcr_set(void *data, u64 val)
{ … }
DEFINE_SIMPLE_ATTRIBUTE(…);
static struct dentry *iosf_dbg;
static void iosf_sideband_debug_init(void)
{ … }
static void iosf_debugfs_init(void)
{ … }
static void iosf_debugfs_remove(void)
{ … }
#else
static inline void iosf_debugfs_init(void) { }
static inline void iosf_debugfs_remove(void) { }
#endif
static int iosf_mbi_probe(struct pci_dev *pdev,
const struct pci_device_id *dev_id)
{ … }
static const struct pci_device_id iosf_mbi_pci_ids[] = …;
MODULE_DEVICE_TABLE(pci, iosf_mbi_pci_ids);
static struct pci_driver iosf_mbi_pci_driver = …;
static int __init iosf_mbi_init(void)
{ … }
static void __exit iosf_mbi_exit(void)
{ … }
module_init(…) …;
module_exit(iosf_mbi_exit);
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;