diff options
Diffstat (limited to 'drivers/iio/light')
-rw-r--r-- | drivers/iio/light/adjd_s311.c | 53 | ||||
-rw-r--r-- | drivers/iio/light/cm3323.c | 7 | ||||
-rw-r--r-- | drivers/iio/light/hid-sensor-als.c | 11 | ||||
-rw-r--r-- | drivers/iio/light/hid-sensor-prox.c | 11 | ||||
-rw-r--r-- | drivers/iio/light/si1145.c | 1 | ||||
-rw-r--r-- | drivers/iio/light/tcs3414.c | 48 |
6 files changed, 43 insertions, 88 deletions
diff --git a/drivers/iio/light/adjd_s311.c b/drivers/iio/light/adjd_s311.c index 17dac8d0e11d..6b33975c8d73 100644 --- a/drivers/iio/light/adjd_s311.c +++ b/drivers/iio/light/adjd_s311.c @@ -54,7 +54,10 @@ struct adjd_s311_data { struct i2c_client *client; - u16 *buffer; + struct { + s16 chans[4]; + s64 ts __aligned(8); + } scan; }; enum adjd_s311_channel_idx { @@ -129,10 +132,10 @@ static irqreturn_t adjd_s311_trigger_handler(int irq, void *p) if (ret < 0) goto done; - data->buffer[j++] = ret & ADJD_S311_DATA_MASK; + data->scan.chans[j++] = ret & ADJD_S311_DATA_MASK; } - iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, time_ns); + iio_push_to_buffers_with_timestamp(indio_dev, &data->scan, time_ns); done: iio_trigger_notify_done(indio_dev->trig); @@ -225,23 +228,9 @@ static int adjd_s311_write_raw(struct iio_dev *indio_dev, return -EINVAL; } -static int adjd_s311_update_scan_mode(struct iio_dev *indio_dev, - const unsigned long *scan_mask) -{ - struct adjd_s311_data *data = iio_priv(indio_dev); - - kfree(data->buffer); - data->buffer = kmalloc(indio_dev->scan_bytes, GFP_KERNEL); - if (data->buffer == NULL) - return -ENOMEM; - - return 0; -} - static const struct iio_info adjd_s311_info = { .read_raw = adjd_s311_read_raw, .write_raw = adjd_s311_write_raw, - .update_scan_mode = adjd_s311_update_scan_mode, }; static int adjd_s311_probe(struct i2c_client *client, @@ -256,7 +245,6 @@ static int adjd_s311_probe(struct i2c_client *client, return -ENOMEM; data = iio_priv(indio_dev); - i2c_set_clientdata(client, indio_dev); data->client = client; indio_dev->info = &adjd_s311_info; @@ -265,34 +253,12 @@ static int adjd_s311_probe(struct i2c_client *client, indio_dev->num_channels = ARRAY_SIZE(adjd_s311_channels); indio_dev->modes = INDIO_DIRECT_MODE; - err = iio_triggered_buffer_setup(indio_dev, NULL, - adjd_s311_trigger_handler, NULL); + err = devm_iio_triggered_buffer_setup(&client->dev, indio_dev, NULL, + adjd_s311_trigger_handler, NULL); if (err < 0) return err; - err = iio_device_register(indio_dev); - if (err) - goto exit_unreg_buffer; - - dev_info(&client->dev, "ADJD-S311 color sensor registered\n"); - - return 0; - -exit_unreg_buffer: - iio_triggered_buffer_cleanup(indio_dev); - return err; -} - -static int adjd_s311_remove(struct i2c_client *client) -{ - struct iio_dev *indio_dev = i2c_get_clientdata(client); - struct adjd_s311_data *data = iio_priv(indio_dev); - - iio_device_unregister(indio_dev); - iio_triggered_buffer_cleanup(indio_dev); - kfree(data->buffer); - - return 0; + return devm_iio_device_register(&client->dev, indio_dev); } static const struct i2c_device_id adjd_s311_id[] = { @@ -306,7 +272,6 @@ static struct i2c_driver adjd_s311_driver = { .name = ADJD_S311_DRV_NAME, }, .probe = adjd_s311_probe, - .remove = adjd_s311_remove, .id_table = adjd_s311_id, }; module_i2c_driver(adjd_s311_driver); diff --git a/drivers/iio/light/cm3323.c b/drivers/iio/light/cm3323.c index 6d1b0ffd144b..fd9a8c27de2e 100644 --- a/drivers/iio/light/cm3323.c +++ b/drivers/iio/light/cm3323.c @@ -256,9 +256,16 @@ static const struct i2c_device_id cm3323_id[] = { }; MODULE_DEVICE_TABLE(i2c, cm3323_id); +static const struct of_device_id cm3323_of_match[] = { + { .compatible = "capella,cm3323", }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, cm3323_of_match); + static struct i2c_driver cm3323_driver = { .driver = { .name = CM3323_DRV_NAME, + .of_match_table = cm3323_of_match, }, .probe = cm3323_probe, .id_table = cm3323_id, diff --git a/drivers/iio/light/hid-sensor-als.c b/drivers/iio/light/hid-sensor-als.c index 2ff252c75c03..5a1a625d8d16 100644 --- a/drivers/iio/light/hid-sensor-als.c +++ b/drivers/iio/light/hid-sensor-als.c @@ -294,8 +294,8 @@ static int hid_als_probe(struct platform_device *pdev) return ret; } - indio_dev->channels = kmemdup(als_channels, - sizeof(als_channels), GFP_KERNEL); + indio_dev->channels = devm_kmemdup(&pdev->dev, als_channels, + sizeof(als_channels), GFP_KERNEL); if (!indio_dev->channels) { dev_err(&pdev->dev, "failed to duplicate channels\n"); return -ENOMEM; @@ -306,7 +306,7 @@ static int hid_als_probe(struct platform_device *pdev) HID_USAGE_SENSOR_ALS, als_state); if (ret) { dev_err(&pdev->dev, "failed to setup attributes\n"); - goto error_free_dev_mem; + return ret; } indio_dev->num_channels = @@ -321,7 +321,7 @@ static int hid_als_probe(struct platform_device *pdev) &als_state->common_attributes); if (ret < 0) { dev_err(&pdev->dev, "trigger setup failed\n"); - goto error_free_dev_mem; + return ret; } ret = iio_device_register(indio_dev); @@ -346,8 +346,6 @@ error_iio_unreg: iio_device_unregister(indio_dev); error_remove_trigger: hid_sensor_remove_trigger(indio_dev, &als_state->common_attributes); -error_free_dev_mem: - kfree(indio_dev->channels); return ret; } @@ -361,7 +359,6 @@ static int hid_als_remove(struct platform_device *pdev) sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_ALS); iio_device_unregister(indio_dev); hid_sensor_remove_trigger(indio_dev, &als_state->common_attributes); - kfree(indio_dev->channels); return 0; } diff --git a/drivers/iio/light/hid-sensor-prox.c b/drivers/iio/light/hid-sensor-prox.c index 1621530f5f61..f10fa2abfe72 100644 --- a/drivers/iio/light/hid-sensor-prox.c +++ b/drivers/iio/light/hid-sensor-prox.c @@ -253,8 +253,8 @@ static int hid_prox_probe(struct platform_device *pdev) return ret; } - indio_dev->channels = kmemdup(prox_channels, sizeof(prox_channels), - GFP_KERNEL); + indio_dev->channels = devm_kmemdup(&pdev->dev, prox_channels, + sizeof(prox_channels), GFP_KERNEL); if (!indio_dev->channels) { dev_err(&pdev->dev, "failed to duplicate channels\n"); return -ENOMEM; @@ -265,7 +265,7 @@ static int hid_prox_probe(struct platform_device *pdev) HID_USAGE_SENSOR_PROX, prox_state); if (ret) { dev_err(&pdev->dev, "failed to setup attributes\n"); - goto error_free_dev_mem; + return ret; } indio_dev->num_channels = ARRAY_SIZE(prox_channels); @@ -279,7 +279,7 @@ static int hid_prox_probe(struct platform_device *pdev) &prox_state->common_attributes); if (ret) { dev_err(&pdev->dev, "trigger setup failed\n"); - goto error_free_dev_mem; + return ret; } ret = iio_device_register(indio_dev); @@ -304,8 +304,6 @@ error_iio_unreg: iio_device_unregister(indio_dev); error_remove_trigger: hid_sensor_remove_trigger(indio_dev, &prox_state->common_attributes); -error_free_dev_mem: - kfree(indio_dev->channels); return ret; } @@ -319,7 +317,6 @@ static int hid_prox_remove(struct platform_device *pdev) sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_PROX); iio_device_unregister(indio_dev); hid_sensor_remove_trigger(indio_dev, &prox_state->common_attributes); - kfree(indio_dev->channels); return 0; } diff --git a/drivers/iio/light/si1145.c b/drivers/iio/light/si1145.c index e2abad48b9f4..e8f6cdf26f22 100644 --- a/drivers/iio/light/si1145.c +++ b/drivers/iio/light/si1145.c @@ -220,7 +220,6 @@ static int __si1145_command_reset(struct si1145_data *data) return -ETIMEDOUT; } msleep(SI1145_COMMAND_MINSLEEP_MS); - continue; } } diff --git a/drivers/iio/light/tcs3414.c b/drivers/iio/light/tcs3414.c index 0593abd600ec..b87222141429 100644 --- a/drivers/iio/light/tcs3414.c +++ b/drivers/iio/light/tcs3414.c @@ -267,6 +267,18 @@ static const struct iio_buffer_setup_ops tcs3414_buffer_setup_ops = { .predisable = tcs3414_buffer_predisable, }; +static int tcs3414_powerdown(struct tcs3414_data *data) +{ + return i2c_smbus_write_byte_data(data->client, TCS3414_CONTROL, + data->control & ~(TCS3414_CONTROL_POWER | + TCS3414_CONTROL_ADC_EN)); +} + +static void tcs3414_powerdown_cleanup(void *data) +{ + tcs3414_powerdown(data); +} + static int tcs3414_probe(struct i2c_client *client, const struct i2c_device_id *id) { @@ -309,6 +321,11 @@ static int tcs3414_probe(struct i2c_client *client, if (ret < 0) return ret; + ret = devm_add_action_or_reset(&client->dev, tcs3414_powerdown_cleanup, + data); + if (ret < 0) + return ret; + data->timing = TCS3414_INTEG_12MS; /* free running */ ret = i2c_smbus_write_byte_data(data->client, TCS3414_TIMING, data->timing); @@ -320,38 +337,12 @@ static int tcs3414_probe(struct i2c_client *client, return ret; data->gain = ret; - ret = iio_triggered_buffer_setup(indio_dev, NULL, + ret = devm_iio_triggered_buffer_setup(&client->dev, indio_dev, NULL, tcs3414_trigger_handler, &tcs3414_buffer_setup_ops); if (ret < 0) return ret; - ret = iio_device_register(indio_dev); - if (ret < 0) - goto buffer_cleanup; - - return 0; - -buffer_cleanup: - iio_triggered_buffer_cleanup(indio_dev); - return ret; -} - -static int tcs3414_powerdown(struct tcs3414_data *data) -{ - return i2c_smbus_write_byte_data(data->client, TCS3414_CONTROL, - data->control & ~(TCS3414_CONTROL_POWER | - TCS3414_CONTROL_ADC_EN)); -} - -static int tcs3414_remove(struct i2c_client *client) -{ - struct iio_dev *indio_dev = i2c_get_clientdata(client); - - iio_device_unregister(indio_dev); - iio_triggered_buffer_cleanup(indio_dev); - tcs3414_powerdown(iio_priv(indio_dev)); - - return 0; + return devm_iio_device_register(&client->dev, indio_dev); } #ifdef CONFIG_PM_SLEEP @@ -385,7 +376,6 @@ static struct i2c_driver tcs3414_driver = { .pm = &tcs3414_pm_ops, }, .probe = tcs3414_probe, - .remove = tcs3414_remove, .id_table = tcs3414_id, }; module_i2c_driver(tcs3414_driver); |