18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Intel BayTrail PMIC I2C bus semaphore implementation 48c2ecf20Sopenharmony_ci * Copyright (c) 2014, Intel Corporation. 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci#include <linux/device.h> 78c2ecf20Sopenharmony_ci#include <linux/acpi.h> 88c2ecf20Sopenharmony_ci#include <linux/i2c.h> 98c2ecf20Sopenharmony_ci#include <linux/interrupt.h> 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <asm/iosf_mbi.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#include "i2c-designware-core.h" 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ciint i2c_dw_probe_lock_support(struct dw_i2c_dev *dev) 168c2ecf20Sopenharmony_ci{ 178c2ecf20Sopenharmony_ci acpi_status status; 188c2ecf20Sopenharmony_ci unsigned long long shared_host = 0; 198c2ecf20Sopenharmony_ci acpi_handle handle; 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci if (!dev || !dev->dev) 228c2ecf20Sopenharmony_ci return 0; 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci handle = ACPI_HANDLE(dev->dev); 258c2ecf20Sopenharmony_ci if (!handle) 268c2ecf20Sopenharmony_ci return 0; 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci status = acpi_evaluate_integer(handle, "_SEM", NULL, &shared_host); 298c2ecf20Sopenharmony_ci if (ACPI_FAILURE(status)) 308c2ecf20Sopenharmony_ci return 0; 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci if (!shared_host) 338c2ecf20Sopenharmony_ci return 0; 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci if (!iosf_mbi_available()) 368c2ecf20Sopenharmony_ci return -EPROBE_DEFER; 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci dev_info(dev->dev, "I2C bus managed by PUNIT\n"); 398c2ecf20Sopenharmony_ci dev->acquire_lock = iosf_mbi_block_punit_i2c_access; 408c2ecf20Sopenharmony_ci dev->release_lock = iosf_mbi_unblock_punit_i2c_access; 418c2ecf20Sopenharmony_ci dev->shared_with_punit = true; 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci return 0; 448c2ecf20Sopenharmony_ci} 45