| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * CM3323 - Capella Color Light Sensor |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Copyright (c) 2015, Intel Corporation. |
|---|
| 5 | | - * |
|---|
| 6 | | - * This file is subject to the terms and conditions of version 2 of |
|---|
| 7 | | - * the GNU General Public License. See the file COPYING in the main |
|---|
| 8 | | - * directory of this archive for more details. |
|---|
| 9 | 6 | * |
|---|
| 10 | 7 | * IIO driver for CM3323 (7-bit I2C slave address 0x10) |
|---|
| 11 | 8 | * |
|---|
| .. | .. |
|---|
| 104 | 101 | return 0; |
|---|
| 105 | 102 | } |
|---|
| 106 | 103 | |
|---|
| 107 | | -static void cm3323_disable(struct iio_dev *indio_dev) |
|---|
| 104 | +static void cm3323_disable(void *data) |
|---|
| 108 | 105 | { |
|---|
| 109 | 106 | int ret; |
|---|
| 110 | | - struct cm3323_data *data = iio_priv(indio_dev); |
|---|
| 107 | + struct iio_dev *indio_dev = data; |
|---|
| 108 | + struct cm3323_data *cm_data = iio_priv(indio_dev); |
|---|
| 111 | 109 | |
|---|
| 112 | | - ret = i2c_smbus_write_word_data(data->client, CM3323_CMD_CONF, |
|---|
| 110 | + ret = i2c_smbus_write_word_data(cm_data->client, CM3323_CMD_CONF, |
|---|
| 113 | 111 | CM3323_CONF_SD_BIT); |
|---|
| 114 | 112 | if (ret < 0) |
|---|
| 115 | | - dev_err(&data->client->dev, "Error writing reg_conf\n"); |
|---|
| 113 | + dev_err(&cm_data->client->dev, "Error writing reg_conf\n"); |
|---|
| 116 | 114 | } |
|---|
| 117 | 115 | |
|---|
| 118 | 116 | static int cm3323_set_it_bits(struct cm3323_data *data, int val, int val2) |
|---|
| .. | .. |
|---|
| 233 | 231 | |
|---|
| 234 | 232 | mutex_init(&data->mutex); |
|---|
| 235 | 233 | |
|---|
| 236 | | - indio_dev->dev.parent = &client->dev; |
|---|
| 237 | 234 | indio_dev->info = &cm3323_info; |
|---|
| 238 | 235 | indio_dev->name = CM3323_DRV_NAME; |
|---|
| 239 | 236 | indio_dev->channels = cm3323_channels; |
|---|
| .. | .. |
|---|
| 246 | 243 | return ret; |
|---|
| 247 | 244 | } |
|---|
| 248 | 245 | |
|---|
| 249 | | - ret = iio_device_register(indio_dev); |
|---|
| 250 | | - if (ret < 0) { |
|---|
| 251 | | - dev_err(&client->dev, "failed to register iio dev\n"); |
|---|
| 252 | | - goto err_init; |
|---|
| 253 | | - } |
|---|
| 246 | + ret = devm_add_action_or_reset(&client->dev, cm3323_disable, indio_dev); |
|---|
| 247 | + if (ret < 0) |
|---|
| 248 | + return ret; |
|---|
| 254 | 249 | |
|---|
| 255 | | - return 0; |
|---|
| 256 | | -err_init: |
|---|
| 257 | | - cm3323_disable(indio_dev); |
|---|
| 258 | | - return ret; |
|---|
| 259 | | -} |
|---|
| 260 | | - |
|---|
| 261 | | -static int cm3323_remove(struct i2c_client *client) |
|---|
| 262 | | -{ |
|---|
| 263 | | - struct iio_dev *indio_dev = i2c_get_clientdata(client); |
|---|
| 264 | | - |
|---|
| 265 | | - iio_device_unregister(indio_dev); |
|---|
| 266 | | - cm3323_disable(indio_dev); |
|---|
| 267 | | - |
|---|
| 268 | | - return 0; |
|---|
| 250 | + return devm_iio_device_register(&client->dev, indio_dev); |
|---|
| 269 | 251 | } |
|---|
| 270 | 252 | |
|---|
| 271 | 253 | static const struct i2c_device_id cm3323_id[] = { |
|---|
| .. | .. |
|---|
| 279 | 261 | .name = CM3323_DRV_NAME, |
|---|
| 280 | 262 | }, |
|---|
| 281 | 263 | .probe = cm3323_probe, |
|---|
| 282 | | - .remove = cm3323_remove, |
|---|
| 283 | 264 | .id_table = cm3323_id, |
|---|
| 284 | 265 | }; |
|---|
| 285 | 266 | |
|---|