Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

iio: st_accel: Support sensor i2c probe using acpi

Add support to probe st_accel sensors on i2c bus using ACPI. Compatible
strings are not avaialable on ACPI based systems.

Signed-off-by: Shrirang Bagul <shrirang.bagul@canonical.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>

authored by

Shrirang Bagul and committed by
Jonathan Cameron
89a2a93f 3dc59262

+67 -24
+18
drivers/iio/accel/st_accel.h
··· 14 14 #include <linux/types.h> 15 15 #include <linux/iio/common/st_sensors.h> 16 16 17 + enum st_accel_type { 18 + LSM303DLH, 19 + LSM303DLHC, 20 + LIS3DH, 21 + LSM330D, 22 + LSM330DL, 23 + LSM330DLC, 24 + LIS331DLH, 25 + LSM303DL, 26 + LSM303DLM, 27 + LSM330, 28 + LSM303AGR, 29 + LIS2DH12, 30 + LIS3L02DQ, 31 + LNG2DM, 32 + ST_ACCEL_MAX, 33 + }; 34 + 17 35 #define H3LIS331DL_DRIVER_NAME "h3lis331dl_accel" 18 36 #define LIS3LV02DL_ACCEL_DEV_NAME "lis3lv02dl_accel" 19 37 #define LSM303DLHC_ACCEL_DEV_NAME "lsm303dlhc_accel"
+49 -24
drivers/iio/accel/st_accel_i2c.c
··· 11 11 #include <linux/kernel.h> 12 12 #include <linux/module.h> 13 13 #include <linux/slab.h> 14 + #include <linux/acpi.h> 14 15 #include <linux/i2c.h> 15 16 #include <linux/iio/iio.h> 16 17 ··· 96 95 #define st_accel_of_match NULL 97 96 #endif 98 97 98 + #ifdef CONFIG_ACPI 99 + static const struct acpi_device_id st_accel_acpi_match[] = { 100 + {"SMO8A90", LNG2DM}, 101 + { }, 102 + }; 103 + MODULE_DEVICE_TABLE(acpi, st_accel_acpi_match); 104 + #else 105 + #define st_accel_acpi_match NULL 106 + #endif 107 + 108 + static const struct i2c_device_id st_accel_id_table[] = { 109 + { LSM303DLH_ACCEL_DEV_NAME, LSM303DLH }, 110 + { LSM303DLHC_ACCEL_DEV_NAME, LSM303DLHC }, 111 + { LIS3DH_ACCEL_DEV_NAME, LIS3DH }, 112 + { LSM330D_ACCEL_DEV_NAME, LSM330D }, 113 + { LSM330DL_ACCEL_DEV_NAME, LSM330DL }, 114 + { LSM330DLC_ACCEL_DEV_NAME, LSM330DLC }, 115 + { LIS331DLH_ACCEL_DEV_NAME, LIS331DLH }, 116 + { LSM303DL_ACCEL_DEV_NAME, LSM303DL }, 117 + { LSM303DLM_ACCEL_DEV_NAME, LSM303DLM }, 118 + { LSM330_ACCEL_DEV_NAME, LSM330 }, 119 + { LSM303AGR_ACCEL_DEV_NAME, LSM303AGR }, 120 + { LIS2DH12_ACCEL_DEV_NAME, LIS2DH12 }, 121 + { LIS3L02DQ_ACCEL_DEV_NAME, LIS3L02DQ }, 122 + { LNG2DM_ACCEL_DEV_NAME, LNG2DM }, 123 + {}, 124 + }; 125 + MODULE_DEVICE_TABLE(i2c, st_accel_id_table); 126 + 99 127 static int st_accel_i2c_probe(struct i2c_client *client, 100 128 const struct i2c_device_id *id) 101 129 { 102 130 struct iio_dev *indio_dev; 103 131 struct st_sensor_data *adata; 104 - int err; 132 + int ret; 105 133 106 134 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*adata)); 107 135 if (!indio_dev) 108 136 return -ENOMEM; 109 137 110 138 adata = iio_priv(indio_dev); 111 - st_sensors_of_i2c_probe(client, st_accel_of_match); 139 + 140 + if (client->dev.of_node) { 141 + st_sensors_of_i2c_probe(client, st_accel_of_match); 142 + } else if (ACPI_HANDLE(&client->dev)) { 143 + ret = st_sensors_match_acpi_device(&client->dev); 144 + if ((ret < 0) || (ret >= ST_ACCEL_MAX)) 145 + return -ENODEV; 146 + 147 + strncpy(client->name, st_accel_id_table[ret].name, 148 + sizeof(client->name)); 149 + client->name[sizeof(client->name) - 1] = '\0'; 150 + } else if (!id) 151 + return -ENODEV; 152 + 112 153 113 154 st_sensors_i2c_configure(indio_dev, client, adata); 114 155 115 - err = st_accel_common_probe(indio_dev); 116 - if (err < 0) 117 - return err; 156 + ret = st_accel_common_probe(indio_dev); 157 + if (ret < 0) 158 + return ret; 118 159 119 160 return 0; 120 161 } ··· 168 125 return 0; 169 126 } 170 127 171 - static const struct i2c_device_id st_accel_id_table[] = { 172 - { LSM303DLH_ACCEL_DEV_NAME }, 173 - { LSM303DLHC_ACCEL_DEV_NAME }, 174 - { LIS3DH_ACCEL_DEV_NAME }, 175 - { LSM330D_ACCEL_DEV_NAME }, 176 - { LSM330DL_ACCEL_DEV_NAME }, 177 - { LSM330DLC_ACCEL_DEV_NAME }, 178 - { LIS331DLH_ACCEL_DEV_NAME }, 179 - { LSM303DL_ACCEL_DEV_NAME }, 180 - { LSM303DLM_ACCEL_DEV_NAME }, 181 - { LSM330_ACCEL_DEV_NAME }, 182 - { LSM303AGR_ACCEL_DEV_NAME }, 183 - { LIS2DH12_ACCEL_DEV_NAME }, 184 - { LIS3L02DQ_ACCEL_DEV_NAME }, 185 - { LNG2DM_ACCEL_DEV_NAME }, 186 - {}, 187 - }; 188 - MODULE_DEVICE_TABLE(i2c, st_accel_id_table); 189 - 190 128 static struct i2c_driver st_accel_driver = { 191 129 .driver = { 192 130 .name = "st-accel-i2c", 193 131 .of_match_table = of_match_ptr(st_accel_of_match), 132 + .acpi_match_table = ACPI_PTR(st_accel_acpi_match), 194 133 }, 195 134 .probe = st_accel_i2c_probe, 196 135 .remove = st_accel_i2c_remove,