162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Intel BayTrail PMIC I2C bus semaphore implementation 462306a36Sopenharmony_ci * Copyright (c) 2014, Intel Corporation. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci#include <linux/device.h> 762306a36Sopenharmony_ci#include <linux/acpi.h> 862306a36Sopenharmony_ci#include <linux/i2c.h> 962306a36Sopenharmony_ci#include <linux/interrupt.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <asm/iosf_mbi.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include "i2c-designware-core.h" 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ciint i2c_dw_baytrail_probe_lock_support(struct dw_i2c_dev *dev) 1662306a36Sopenharmony_ci{ 1762306a36Sopenharmony_ci acpi_status status; 1862306a36Sopenharmony_ci unsigned long long shared_host = 0; 1962306a36Sopenharmony_ci acpi_handle handle; 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci if (!dev) 2262306a36Sopenharmony_ci return -ENODEV; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci handle = ACPI_HANDLE(dev->dev); 2562306a36Sopenharmony_ci if (!handle) 2662306a36Sopenharmony_ci return -ENODEV; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci status = acpi_evaluate_integer(handle, "_SEM", NULL, &shared_host); 2962306a36Sopenharmony_ci if (ACPI_FAILURE(status)) 3062306a36Sopenharmony_ci return -ENODEV; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci if (!shared_host) 3362306a36Sopenharmony_ci return -ENODEV; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci if (!iosf_mbi_available()) 3662306a36Sopenharmony_ci return -EPROBE_DEFER; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci dev_info(dev->dev, "I2C bus managed by PUNIT\n"); 3962306a36Sopenharmony_ci dev->acquire_lock = iosf_mbi_block_punit_i2c_access; 4062306a36Sopenharmony_ci dev->release_lock = iosf_mbi_unblock_punit_i2c_access; 4162306a36Sopenharmony_ci dev->shared_with_punit = true; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci return 0; 4462306a36Sopenharmony_ci} 45