max5821.c (320424c7d44f54c18df9812fd7c45f6963524002) max5821.c (6a25893cb0e255ab8888d6a4f40e8d1e9d554ad0)
1// SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * iio/dac/max5821.c
4 * Copyright (C) 2014 Philippe Reynes
5 */
6
7#include <linux/kernel.h>
8#include <linux/module.h>

--- 280 unchanged lines hidden (view full) ---

289
290static SIMPLE_DEV_PM_OPS(max5821_pm_ops, max5821_suspend, max5821_resume);
291
292static const struct iio_info max5821_info = {
293 .read_raw = max5821_read_raw,
294 .write_raw = max5821_write_raw,
295};
296
1// SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * iio/dac/max5821.c
4 * Copyright (C) 2014 Philippe Reynes
5 */
6
7#include <linux/kernel.h>
8#include <linux/module.h>

--- 280 unchanged lines hidden (view full) ---

289
290static SIMPLE_DEV_PM_OPS(max5821_pm_ops, max5821_suspend, max5821_resume);
291
292static const struct iio_info max5821_info = {
293 .read_raw = max5821_read_raw,
294 .write_raw = max5821_write_raw,
295};
296
297static void max5821_regulator_disable(void *reg)
298{
299 regulator_disable(reg);
300}
301
297static int max5821_probe(struct i2c_client *client,
298 const struct i2c_device_id *id)
299{
300 struct max5821_data *data;
301 struct iio_dev *indio_dev;
302 u32 tmp;
303 int ret;
304
305 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
306 if (!indio_dev)
307 return -ENOMEM;
308 data = iio_priv(indio_dev);
302static int max5821_probe(struct i2c_client *client,
303 const struct i2c_device_id *id)
304{
305 struct max5821_data *data;
306 struct iio_dev *indio_dev;
307 u32 tmp;
308 int ret;
309
310 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
311 if (!indio_dev)
312 return -ENOMEM;
313 data = iio_priv(indio_dev);
309 i2c_set_clientdata(client, indio_dev);
310 data->client = client;
311 mutex_init(&data->lock);
312
313 /* max5821 start in powerdown mode 100Kohm to ground */
314 for (tmp = 0; tmp < MAX5821_MAX_DAC_CHANNELS; tmp++) {
315 data->powerdown[tmp] = true;
316 data->powerdown_mode[tmp] = MAX5821_100KOHM_TO_GND;
317 }
318
319 data->vref_reg = devm_regulator_get(&client->dev, "vref");
320 if (IS_ERR(data->vref_reg)) {
321 ret = PTR_ERR(data->vref_reg);
322 dev_err(&client->dev,
323 "Failed to get vref regulator: %d\n", ret);
314 data->client = client;
315 mutex_init(&data->lock);
316
317 /* max5821 start in powerdown mode 100Kohm to ground */
318 for (tmp = 0; tmp < MAX5821_MAX_DAC_CHANNELS; tmp++) {
319 data->powerdown[tmp] = true;
320 data->powerdown_mode[tmp] = MAX5821_100KOHM_TO_GND;
321 }
322
323 data->vref_reg = devm_regulator_get(&client->dev, "vref");
324 if (IS_ERR(data->vref_reg)) {
325 ret = PTR_ERR(data->vref_reg);
326 dev_err(&client->dev,
327 "Failed to get vref regulator: %d\n", ret);
324 goto error_free_reg;
328 return ret;
325 }
326
327 ret = regulator_enable(data->vref_reg);
328 if (ret) {
329 dev_err(&client->dev,
330 "Failed to enable vref regulator: %d\n", ret);
329 }
330
331 ret = regulator_enable(data->vref_reg);
332 if (ret) {
333 dev_err(&client->dev,
334 "Failed to enable vref regulator: %d\n", ret);
331 goto error_free_reg;
335 return ret;
332 }
333
336 }
337
338 ret = devm_add_action_or_reset(&client->dev, max5821_regulator_disable,
339 data->vref_reg);
340 if (ret) {
341 dev_err(&client->dev,
342 "Failed to add action to managed regulator: %d\n", ret);
343 return ret;
344 }
345
334 ret = regulator_get_voltage(data->vref_reg);
335 if (ret < 0) {
336 dev_err(&client->dev,
337 "Failed to get voltage on regulator: %d\n", ret);
346 ret = regulator_get_voltage(data->vref_reg);
347 if (ret < 0) {
348 dev_err(&client->dev,
349 "Failed to get voltage on regulator: %d\n", ret);
338 goto error_disable_reg;
350 return ret;
339 }
340
341 data->vref_mv = ret / 1000;
342
343 indio_dev->name = id->name;
344 indio_dev->num_channels = ARRAY_SIZE(max5821_channels);
345 indio_dev->channels = max5821_channels;
346 indio_dev->modes = INDIO_DIRECT_MODE;
347 indio_dev->info = &max5821_info;
348
351 }
352
353 data->vref_mv = ret / 1000;
354
355 indio_dev->name = id->name;
356 indio_dev->num_channels = ARRAY_SIZE(max5821_channels);
357 indio_dev->channels = max5821_channels;
358 indio_dev->modes = INDIO_DIRECT_MODE;
359 indio_dev->info = &max5821_info;
360
349 return iio_device_register(indio_dev);
350
351error_disable_reg:
352 regulator_disable(data->vref_reg);
353
354error_free_reg:
355
356 return ret;
361 return devm_iio_device_register(&client->dev, indio_dev);
357}
358
362}
363
359static int max5821_remove(struct i2c_client *client)
360{
361 struct iio_dev *indio_dev = i2c_get_clientdata(client);
362 struct max5821_data *data = iio_priv(indio_dev);
363
364 iio_device_unregister(indio_dev);
365 regulator_disable(data->vref_reg);
366
367 return 0;
368}
369
370static const struct i2c_device_id max5821_id[] = {
371 { "max5821", ID_MAX5821 },
372 { }
373};
374MODULE_DEVICE_TABLE(i2c, max5821_id);
375
376static const struct of_device_id max5821_of_match[] = {
377 { .compatible = "maxim,max5821" },
378 { }
379};
380MODULE_DEVICE_TABLE(of, max5821_of_match);
381
382static struct i2c_driver max5821_driver = {
383 .driver = {
384 .name = "max5821",
385 .of_match_table = max5821_of_match,
386 .pm = &max5821_pm_ops,
387 },
388 .probe = max5821_probe,
364static const struct i2c_device_id max5821_id[] = {
365 { "max5821", ID_MAX5821 },
366 { }
367};
368MODULE_DEVICE_TABLE(i2c, max5821_id);
369
370static const struct of_device_id max5821_of_match[] = {
371 { .compatible = "maxim,max5821" },
372 { }
373};
374MODULE_DEVICE_TABLE(of, max5821_of_match);
375
376static struct i2c_driver max5821_driver = {
377 .driver = {
378 .name = "max5821",
379 .of_match_table = max5821_of_match,
380 .pm = &max5821_pm_ops,
381 },
382 .probe = max5821_probe,
389 .remove = max5821_remove,
390 .id_table = max5821_id,
391};
392module_i2c_driver(max5821_driver);
393
394MODULE_AUTHOR("Philippe Reynes <tremyfr@yahoo.fr>");
395MODULE_DESCRIPTION("MAX5821 DAC");
396MODULE_LICENSE("GPL v2");
383 .id_table = max5821_id,
384};
385module_i2c_driver(max5821_driver);
386
387MODULE_AUTHOR("Philippe Reynes <tremyfr@yahoo.fr>");
388MODULE_DESCRIPTION("MAX5821 DAC");
389MODULE_LICENSE("GPL v2");