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"); |