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