bmi088: add support for Linux v6.3+

Fixes two issues when using bmi088 driver on Linux v6.3+:

- support i2c_device_id on kernel >6.3
- use dev_to_iio_dev instead of dev_get_drvdata to access iio information

Change-Id: I70ad8b5d97d7b9a349f5387dbea60baf51cbbdb9
Signed-off-by: Blake McHale <bmchale@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3310726
Reviewed-by: svcacv <svcacv@nvidia.com>
Reviewed-by: Jon Hunter <jonathanh@nvidia.com>
GVS: buildbot_gerritrpt <buildbot_gerritrpt@nvidia.com>
This commit is contained in:
Blake McHale
2025-02-26 13:12:26 -08:00
committed by Jon Hunter
parent 578e8f6700
commit 1a1812b7e7
2 changed files with 17 additions and 11 deletions

View File

@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only // SPDX-License-Identifier: GPL-2.0-only
// SPDX-FileCopyrightText: Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-FileCopyrightText: Copyright (c) 2023-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
/* Device tree example: /* Device tree example:
* *
@@ -1500,10 +1500,12 @@ static int bmi_init(struct bmi_state *st, const struct i2c_device_id *id)
#if defined(NV_I2C_DRIVER_STRUCT_PROBE_WITHOUT_I2C_DEVICE_ID_ARG) /* Linux 6.3 */ #if defined(NV_I2C_DRIVER_STRUCT_PROBE_WITHOUT_I2C_DEVICE_ID_ARG) /* Linux 6.3 */
static int bmi_probe(struct i2c_client *client) static int bmi_probe(struct i2c_client *client)
{
const struct i2c_device_id *id = i2c_match_id(bmi_i2c_device_ids, client);
#else #else
static int bmi_probe(struct i2c_client *client, const struct i2c_device_id *id) static int bmi_probe(struct i2c_client *client, const struct i2c_device_id *id)
#endif
{ {
#endif
struct bmi_state *st; struct bmi_state *st;
int ret; int ret;
@@ -1513,11 +1515,7 @@ static int bmi_probe(struct i2c_client *client, const struct i2c_device_id *id)
i2c_set_clientdata(client, st); i2c_set_clientdata(client, st);
st->i2c = client; st->i2c = client;
#if KERNEL_VERSION(6, 3, 0) <= LINUX_VERSION_CODE
ret = bmi_init(st, NULL);
#else
ret = bmi_init(st, id); ret = bmi_init(st, id);
#endif
if (ret) { if (ret) {
bmi_remove(client); bmi_remove(client);
return ret; return ret;

View File

@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only // SPDX-License-Identifier: GPL-2.0-only
// SPDX-FileCopyrightText: Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-FileCopyrightText: Copyright (c) 2023-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
#include <linux/init.h> #include <linux/init.h>
#include <linux/module.h> #include <linux/module.h>
@@ -222,7 +222,11 @@ static ssize_t bmi_iio_attr_store(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct iio_dev *indio_dev = dev_get_drvdata(dev); struct iio_dev *indio_dev = dev_to_iio_dev(dev);
if (!indio_dev)
return -EINVAL;
struct bmi_iio_state *st = iio_priv(indio_dev); struct bmi_iio_state *st = iio_priv(indio_dev);
struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
char *str; char *str;
@@ -230,7 +234,7 @@ static ssize_t bmi_iio_attr_store(struct device *dev,
unsigned int new; unsigned int new;
int ret; int ret;
if (!indio_dev || !st || !this_attr) if (!st || !this_attr)
return -EINVAL; return -EINVAL;
mutex_lock(BMI_MUTEX(indio_dev)); mutex_lock(BMI_MUTEX(indio_dev));
@@ -275,13 +279,17 @@ static ssize_t bmi_iio_attr_store(struct device *dev,
static ssize_t bmi_iio_attr_show(struct device *dev, static ssize_t bmi_iio_attr_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct iio_dev *indio_dev = dev_get_drvdata(dev); struct iio_dev *indio_dev = dev_to_iio_dev(dev);
if (!indio_dev)
return -EINVAL;
struct bmi_iio_state *st = iio_priv(indio_dev); struct bmi_iio_state *st = iio_priv(indio_dev);
struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
ssize_t t = 0; ssize_t t = 0;
unsigned int i; unsigned int i;
if (!indio_dev || !st || !this_attr) if (!st || !this_attr)
return -EINVAL; return -EINVAL;
switch (this_attr->address) { switch (this_attr->address) {