mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
iio: accel: kxcjk-1013: Implement ACPI method ROTM to retrieve mount matrix.
Implement kxj_acpi_orientation to retrieve mount matrix from ACPI ROTM method Cc: Jonathan Cameron <jic23@kernel.org> Cc: Lars-Peter Clausen <lars@metafoo.de> Cc: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de> Signed-off-by: Sean Rhodes <sean@starlabs.systems> Link: https://lore.kernel.org/r/19d7a10aae5238a2c8db37da1f74edb86480e17e.1708293140.git.sean@starlabs.systems Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
parent
ffe7c46c59
commit
3b4ebff2a1
@ -636,6 +636,84 @@ static int kxcjk1013_set_power_state(struct kxcjk1013_data *data, bool on)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
static bool kxj_acpi_orientation(struct device *dev,
|
||||
struct iio_mount_matrix *orientation)
|
||||
{
|
||||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
struct acpi_device *adev = ACPI_COMPANION(dev);
|
||||
char *str;
|
||||
union acpi_object *obj, *elements;
|
||||
acpi_status status;
|
||||
int i, j, val[3];
|
||||
bool ret = false;
|
||||
|
||||
if (!acpi_has_method(adev->handle, "ROTM"))
|
||||
return false;
|
||||
|
||||
status = acpi_evaluate_object(adev->handle, "ROTM", NULL, &buffer);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
dev_err(dev, "Failed to get ACPI mount matrix: %d\n", status);
|
||||
return false;
|
||||
}
|
||||
|
||||
obj = buffer.pointer;
|
||||
if (obj->type != ACPI_TYPE_PACKAGE || obj->package.count != 3) {
|
||||
dev_err(dev, "Unknown ACPI mount matrix package format\n");
|
||||
goto out_free_buffer;
|
||||
}
|
||||
|
||||
elements = obj->package.elements;
|
||||
for (i = 0; i < 3; i++) {
|
||||
if (elements[i].type != ACPI_TYPE_STRING) {
|
||||
dev_err(dev, "Unknown ACPI mount matrix element format\n");
|
||||
goto out_free_buffer;
|
||||
}
|
||||
|
||||
str = elements[i].string.pointer;
|
||||
if (sscanf(str, "%d %d %d", &val[0], &val[1], &val[2]) != 3) {
|
||||
dev_err(dev, "Incorrect ACPI mount matrix string format\n");
|
||||
goto out_free_buffer;
|
||||
}
|
||||
|
||||
for (j = 0; j < 3; j++) {
|
||||
switch (val[j]) {
|
||||
case -1: str = "-1"; break;
|
||||
case 0: str = "0"; break;
|
||||
case 1: str = "1"; break;
|
||||
default:
|
||||
dev_err(dev, "Invalid value in ACPI mount matrix: %d\n", val[j]);
|
||||
goto out_free_buffer;
|
||||
}
|
||||
orientation->rotation[i * 3 + j] = str;
|
||||
}
|
||||
}
|
||||
|
||||
ret = true;
|
||||
|
||||
out_free_buffer:
|
||||
kfree(buffer.pointer);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool kxj1009_apply_acpi_orientation(struct device *dev,
|
||||
struct iio_mount_matrix *orientation)
|
||||
{
|
||||
struct acpi_device *adev = ACPI_COMPANION(dev);
|
||||
|
||||
if (adev && acpi_dev_hid_uid_match(adev, "KIOX000A", NULL))
|
||||
return kxj_acpi_orientation(dev, orientation);
|
||||
|
||||
return false;
|
||||
}
|
||||
#else
|
||||
static bool kxj1009_apply_acpi_orientation(struct device *dev,
|
||||
struct iio_mount_matrix *orientation)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int kxcjk1013_chip_update_thresholds(struct kxcjk1013_data *data)
|
||||
{
|
||||
int ret;
|
||||
@ -1466,9 +1544,12 @@ static int kxcjk1013_probe(struct i2c_client *client)
|
||||
} else {
|
||||
data->active_high_intr = true; /* default polarity */
|
||||
|
||||
ret = iio_read_mount_matrix(&client->dev, &data->orientation);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (!kxj1009_apply_acpi_orientation(&client->dev, &data->orientation)) {
|
||||
ret = iio_read_mount_matrix(&client->dev, &data->orientation);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ret = devm_regulator_bulk_get_enable(&client->dev,
|
||||
|
Loading…
Reference in New Issue
Block a user