FILE
exynos_adc.c
File preview with syntax highlighting.
linux-6.19.14/drivers/iio/adc/exynos_adc.c
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * exynos_adc.c - Support for ADC in EXYNOS SoCs 4 * 5 * 8 ~ 10 channel, 10/12-bit ADC 6 * 7 * Copyright (C) 2013 Naveen Krishna Chatradhi <ch.naveen@samsung.com> 8 */ 9 10#include <linux/compiler.h> 11#include <linux/module.h> 12#include <linux/platform_device.h> 13#include <linux/interrupt.h> 14#include <linux/delay.h> 15#include <linux/errno.h> 16#include <linux/kernel.h> 17#include <linux/slab.h> 18#include <linux/io.h> 19#include <linux/clk.h> 20#include <linux/completion.h> 21#include <linux/of.h> 22#include <linux/regulator/consumer.h> 23#include <linux/of_platform.h> 24#include <linux/err.h> 25 26#include <linux/iio/iio.h> 27#include <linux/iio/machine.h> 28#include <linux/iio/driver.h> 29#include <linux/mfd/syscon.h> 30#include <linux/regmap.h> 31 32/* S3C/EXYNOS4412/5250 ADC_V1 registers definitions */ 33#define ADC_V1_CON(x) ((x) + 0x00) 34#define ADC_V1_DLY(x) ((x) + 0x08) 35#define ADC_V1_DATX(x) ((x) + 0x0C) 36#define ADC_V1_DATY(x) ((x) + 0x10) 37#define ADC_V1_UPDN(x) ((x) + 0x14) 38#define ADC_V1_INTCLR(x) ((x) + 0x18) 39#define ADC_V1_MUX(x) ((x) + 0x1c) 40 41/* Future ADC_V2 registers definitions */ 42#define ADC_V2_CON1(x) ((x) + 0x00) 43#define ADC_V2_CON2(x) ((x) + 0x04) 44#define ADC_V2_STAT(x) ((x) + 0x08) 45#define ADC_V2_INT_EN(x) ((x) + 0x10) 46#define ADC_V2_INT_ST(x) ((x) + 0x14) 47#define ADC_V2_VER(x) ((x) + 0x20) 48 49/* Bit definitions for ADC_V1 */ 50#define ADC_V1_CON_RES (1u << 16) 51#define ADC_V1_CON_PRSCEN (1u << 14) 52#define ADC_V1_CON_PRSCLV(x) (((x) & 0xFF) << 6) 53#define ADC_V1_CON_STANDBY (1u << 2) 54 55/* Bit definitions for S3C2410 / S3C6410 ADC */ 56#define ADC_S3C2410_CON_SELMUX(x) (((x) & 7) << 3) 57 58/* ADCTSC Register Bits */ 59#define ADC_S3C2443_TSC_UD_SEN (1u << 8) 60#define ADC_S3C2410_TSC_YM_SEN (1u << 7) 61#define ADC_S3C2410_TSC_YP_SEN (1u << 6) 62#define ADC_S3C2410_TSC_XM_SEN (1u << 5) 63#define ADC_S3C2410_TSC_XP_SEN (1u << 4) 64#define ADC_S3C2410_TSC_XY_PST(x) (((x) & 0x3) << 0) 65 66#define ADC_TSC_WAIT4INT (ADC_S3C2410_TSC_YM_SEN | \ 67 ADC_S3C2410_TSC_YP_SEN | \ 68 ADC_S3C2410_TSC_XP_SEN | \ 69 ADC_S3C2410_TSC_XY_PST(3)) 70 71/* Bit definitions for ADC_V2 */ 72#define ADC_V2_CON1_SOFT_RESET (1u << 2) 73 74#define ADC_V2_CON2_OSEL (1u << 10) 75#define ADC_V2_CON2_ESEL (1u << 9) 76#define ADC_V2_CON2_HIGHF (1u << 8) 77#define ADC_V2_CON2_C_TIME(x) (((x) & 7) << 4) 78#define ADC_V2_CON2_ACH_SEL(x) (((x) & 0xF) << 0) 79#define ADC_V2_CON2_ACH_MASK 0xF 80 81#define MAX_ADC_V2_CHANNELS 10 82#define MAX_ADC_V1_CHANNELS 8 83#define MAX_EXYNOS3250_ADC_CHANNELS 2 84#define MAX_EXYNOS4212_ADC_CHANNELS 4 85#define MAX_S5PV210_ADC_CHANNELS 10 86 87/* Bit definitions common for ADC_V1 and ADC_V2 */ 88#define ADC_CON_EN_START (1u << 0) 89#define ADC_CON_EN_START_MASK (0x3 << 0) 90#define ADC_DATX_PRESSED (1u << 15) 91#define ADC_DATX_MASK 0xFFF 92#define ADC_DATY_MASK 0xFFF 93 94#define EXYNOS_ADC_TIMEOUT (msecs_to_jiffies(100)) 95 96#define EXYNOS_ADCV1_PHY_OFFSET 0x0718 97#define EXYNOS_ADCV2_PHY_OFFSET 0x0720 98 99struct exynos_adc { 100 struct exynos_adc_data *data; 101 struct device *dev; 102 void __iomem *regs; 103 struct regmap *pmu_map; 104 struct clk *clk; 105 struct clk *sclk; 106 unsigned int irq; 107 struct regulator *vdd; 108 109 struct completion completion; 110 111 u32 value; 112 unsigned int version; 113 114 /* 115 * Lock to protect from potential concurrent access to the 116 * completion callback during a manual conversion. For this driver 117 * a wait-callback is used to wait for the conversion result, 118 * so in the meantime no other read request (or conversion start) 119 * must be performed, otherwise it would interfere with the 120 * current conversion result. 121 */ 122 struct mutex lock; 123}; 124 125struct exynos_adc_data { 126 int num_channels; 127 bool needs_sclk; 128 bool needs_adc_phy; 129 int phy_offset; 130 u32 mask; 131 132 void (*init_hw)(struct exynos_adc *info); 133 void (*exit_hw)(struct exynos_adc *info); 134 void (*clear_irq)(struct exynos_adc *info); 135 void (*start_conv)(struct exynos_adc *info, unsigned long addr); 136}; 137 138static void exynos_adc_unprepare_clk(struct exynos_adc *info) 139{ 140 if (info->data->needs_sclk) 141 clk_unprepare(info->sclk); 142 clk_unprepare(info->clk); 143} 144 145static int exynos_adc_prepare_clk(struct exynos_adc *info) 146{ 147 int ret; 148 149 ret = clk_prepare(info->clk); 150 if (ret) { 151 dev_err(info->dev, "failed preparing adc clock: %d\n", ret); 152 return ret; 153 } 154 155 if (info->data->needs_sclk) { 156 ret = clk_prepare(info->sclk); 157 if (ret) { 158 clk_unprepare(info->clk); 159 dev_err(info->dev, 160 "failed preparing sclk_adc clock: %d\n", ret); 161 return ret; 162 } 163 } 164 165 return 0; 166} 167 168static void exynos_adc_disable_clk(struct exynos_adc *info) 169{ 170 if (info->data->needs_sclk) 171 clk_disable(info->sclk); 172 clk_disable(info->clk); 173} 174 175static int exynos_adc_enable_clk(struct exynos_adc *info) 176{ 177 int ret; 178 179 ret = clk_enable(info->clk); 180 if (ret) { 181 dev_err(info->dev, "failed enabling adc clock: %d\n", ret); 182 return ret; 183 } 184 185 if (info->data->needs_sclk) { 186 ret = clk_enable(info->sclk); 187 if (ret) { 188 clk_disable(info->clk); 189 dev_err(info->dev, 190 "failed enabling sclk_adc clock: %d\n", ret); 191 return ret; 192 } 193 } 194 195 return 0; 196} 197 198static void exynos_adc_v1_init_hw(struct exynos_adc *info) 199{ 200 u32 con1; 201 202 if (info->data->needs_adc_phy) 203 regmap_write(info->pmu_map, info->data->phy_offset, 1); 204 205 /* set default prescaler values and Enable prescaler */ 206 con1 = ADC_V1_CON_PRSCLV(49) | ADC_V1_CON_PRSCEN; 207 208 /* Enable 12-bit ADC resolution */ 209 con1 |= ADC_V1_CON_RES; 210 writel(con1, ADC_V1_CON(info->regs)); 211 212 /* set touchscreen delay */ 213 writel(10000, ADC_V1_DLY(info->regs)); 214} 215 216static void exynos_adc_v1_exit_hw(struct exynos_adc *info) 217{ 218 u32 con; 219 220 if (info->data->needs_adc_phy) 221 regmap_write(info->pmu_map, info->data->phy_offset, 0); 222 223 con = readl(ADC_V1_CON(info->regs)); 224 con |= ADC_V1_CON_STANDBY; 225 writel(con, ADC_V1_CON(info->regs)); 226} 227 228static void exynos_adc_v1_clear_irq(struct exynos_adc *info) 229{ 230 writel(1, ADC_V1_INTCLR(info->regs)); 231} 232 233static void exynos_adc_v1_start_conv(struct exynos_adc *info, 234 unsigned long addr) 235{ 236 u32 con1; 237 238 writel(addr, ADC_V1_MUX(info->regs)); 239 240 con1 = readl(ADC_V1_CON(info->regs)); 241 writel(con1 | ADC_CON_EN_START, ADC_V1_CON(info->regs)); 242} 243 244/* Exynos4212 and 4412 is like ADCv1 but with four channels only */ 245static const struct exynos_adc_data exynos4212_adc_data = { 246 .num_channels = MAX_EXYNOS4212_ADC_CHANNELS, 247 .mask = ADC_DATX_MASK, /* 12 bit ADC resolution */ 248 .needs_adc_phy = true, 249 .phy_offset = EXYNOS_ADCV1_PHY_OFFSET, 250 251 .init_hw = exynos_adc_v1_init_hw, 252 .exit_hw = exynos_adc_v1_exit_hw, 253 .clear_irq = exynos_adc_v1_clear_irq, 254 .start_conv = exynos_adc_v1_start_conv, 255}; 256 257static const struct exynos_adc_data exynos_adc_v1_data = { 258 .num_channels = MAX_ADC_V1_CHANNELS, 259 .mask = ADC_DATX_MASK, /* 12 bit ADC resolution */ 260 .needs_adc_phy = true, 261 .phy_offset = EXYNOS_ADCV1_PHY_OFFSET, 262 263 .init_hw = exynos_adc_v1_init_hw, 264 .exit_hw = exynos_adc_v1_exit_hw, 265 .clear_irq = exynos_adc_v1_clear_irq, 266 .start_conv = exynos_adc_v1_start_conv, 267}; 268 269static const struct exynos_adc_data exynos_adc_s5pv210_data = { 270 .num_channels = MAX_S5PV210_ADC_CHANNELS, 271 .mask = ADC_DATX_MASK, /* 12 bit ADC resolution */ 272 273 .init_hw = exynos_adc_v1_init_hw, 274 .exit_hw = exynos_adc_v1_exit_hw, 275 .clear_irq = exynos_adc_v1_clear_irq, 276 .start_conv = exynos_adc_v1_start_conv, 277}; 278 279static void exynos_adc_s3c64xx_start_conv(struct exynos_adc *info, 280 unsigned long addr) 281{ 282 u32 con1; 283 284 con1 = readl(ADC_V1_CON(info->regs)); 285 con1 &= ~ADC_S3C2410_CON_SELMUX(0x7); 286 con1 |= ADC_S3C2410_CON_SELMUX(addr); 287 writel(con1 | ADC_CON_EN_START, ADC_V1_CON(info->regs)); 288} 289 290static struct exynos_adc_data const exynos_adc_s3c64xx_data = { 291 .num_channels = MAX_ADC_V1_CHANNELS, 292 .mask = ADC_DATX_MASK, /* 12 bit ADC resolution */ 293 294 .init_hw = exynos_adc_v1_init_hw, 295 .exit_hw = exynos_adc_v1_exit_hw, 296 .clear_irq = exynos_adc_v1_clear_irq, 297 .start_conv = exynos_adc_s3c64xx_start_conv, 298}; 299 300static void exynos_adc_v2_init_hw(struct exynos_adc *info) 301{ 302 u32 con1, con2; 303 304 if (info->data->needs_adc_phy) 305 regmap_write(info->pmu_map, info->data->phy_offset, 1); 306 307 con1 = ADC_V2_CON1_SOFT_RESET; 308 writel(con1, ADC_V2_CON1(info->regs)); 309 310 con2 = ADC_V2_CON2_OSEL | ADC_V2_CON2_ESEL | 311 ADC_V2_CON2_HIGHF | ADC_V2_CON2_C_TIME(0); 312 writel(con2, ADC_V2_CON2(info->regs)); 313 314 /* Enable interrupts */ 315 writel(1, ADC_V2_INT_EN(info->regs)); 316} 317 318static void exynos_adc_v2_exit_hw(struct exynos_adc *info) 319{ 320 u32 con; 321 322 if (info->data->needs_adc_phy) 323 regmap_write(info->pmu_map, info->data->phy_offset, 0); 324 325 con = readl(ADC_V2_CON1(info->regs)); 326 con &= ~ADC_CON_EN_START; 327 writel(con, ADC_V2_CON1(info->regs)); 328} 329 330static void exynos_adc_v2_clear_irq(struct exynos_adc *info) 331{ 332 writel(1, ADC_V2_INT_ST(info->regs)); 333} 334 335static void exynos_adc_v2_start_conv(struct exynos_adc *info, 336 unsigned long addr) 337{ 338 u32 con1, con2; 339 340 con2 = readl(ADC_V2_CON2(info->regs)); 341 con2 &= ~ADC_V2_CON2_ACH_MASK; 342 con2 |= ADC_V2_CON2_ACH_SEL(addr); 343 writel(con2, ADC_V2_CON2(info->regs)); 344 345 con1 = readl(ADC_V2_CON1(info->regs)); 346 writel(con1 | ADC_CON_EN_START, ADC_V2_CON1(info->regs)); 347} 348 349static const struct exynos_adc_data exynos_adc_v2_data = { 350 .num_channels = MAX_ADC_V2_CHANNELS, 351 .mask = ADC_DATX_MASK, /* 12 bit ADC resolution */ 352 .needs_adc_phy = true, 353 .phy_offset = EXYNOS_ADCV2_PHY_OFFSET, 354 355 .init_hw = exynos_adc_v2_init_hw, 356 .exit_hw = exynos_adc_v2_exit_hw, 357 .clear_irq = exynos_adc_v2_clear_irq, 358 .start_conv = exynos_adc_v2_start_conv, 359}; 360 361static const struct exynos_adc_data exynos3250_adc_data = { 362 .num_channels = MAX_EXYNOS3250_ADC_CHANNELS, 363 .mask = ADC_DATX_MASK, /* 12 bit ADC resolution */ 364 .needs_sclk = true, 365 .needs_adc_phy = true, 366 .phy_offset = EXYNOS_ADCV1_PHY_OFFSET, 367 368 .init_hw = exynos_adc_v2_init_hw, 369 .exit_hw = exynos_adc_v2_exit_hw, 370 .clear_irq = exynos_adc_v2_clear_irq, 371 .start_conv = exynos_adc_v2_start_conv, 372}; 373 374static void exynos_adc_exynos7_init_hw(struct exynos_adc *info) 375{ 376 u32 con1, con2; 377 378 con1 = ADC_V2_CON1_SOFT_RESET; 379 writel(con1, ADC_V2_CON1(info->regs)); 380 381 con2 = readl(ADC_V2_CON2(info->regs)); 382 con2 &= ~ADC_V2_CON2_C_TIME(7); 383 con2 |= ADC_V2_CON2_C_TIME(0); 384 writel(con2, ADC_V2_CON2(info->regs)); 385 386 /* Enable interrupts */ 387 writel(1, ADC_V2_INT_EN(info->regs)); 388} 389 390static const struct exynos_adc_data exynos7_adc_data = { 391 .num_channels = MAX_ADC_V1_CHANNELS, 392 .mask = ADC_DATX_MASK, /* 12 bit ADC resolution */ 393 394 .init_hw = exynos_adc_exynos7_init_hw, 395 .exit_hw = exynos_adc_v2_exit_hw, 396 .clear_irq = exynos_adc_v2_clear_irq, 397 .start_conv = exynos_adc_v2_start_conv, 398}; 399 400static const struct of_device_id exynos_adc_match[] = { 401 { 402 .compatible = "samsung,s3c6410-adc", 403 .data = &exynos_adc_s3c64xx_data, 404 }, { 405 .compatible = "samsung,s5pv210-adc", 406 .data = &exynos_adc_s5pv210_data, 407 }, { 408 .compatible = "samsung,exynos4212-adc", 409 .data = &exynos4212_adc_data, 410 }, { 411 .compatible = "samsung,exynos-adc-v1", 412 .data = &exynos_adc_v1_data, 413 }, { 414 .compatible = "samsung,exynos-adc-v2", 415 .data = &exynos_adc_v2_data, 416 }, { 417 .compatible = "samsung,exynos3250-adc", 418 .data = &exynos3250_adc_data, 419 }, { 420 .compatible = "samsung,exynos7-adc", 421 .data = &exynos7_adc_data, 422 }, 423 { } 424}; 425MODULE_DEVICE_TABLE(of, exynos_adc_match); 426 427static struct exynos_adc_data *exynos_adc_get_data(struct platform_device *pdev) 428{ 429 const struct of_device_id *match; 430 431 match = of_match_node(exynos_adc_match, pdev->dev.of_node); 432 return (struct exynos_adc_data *)match->data; 433} 434 435static int exynos_read_raw(struct iio_dev *indio_dev, 436 struct iio_chan_spec const *chan, 437 int *val, 438 int *val2, 439 long mask) 440{ 441 struct exynos_adc *info = iio_priv(indio_dev); 442 unsigned long time_left; 443 int ret; 444 445 if (mask == IIO_CHAN_INFO_SCALE) { 446 ret = regulator_get_voltage(info->vdd); 447 if (ret < 0) 448 return ret; 449 450 /* Regulator voltage is in uV, but need mV */ 451 *val = ret / 1000; 452 *val2 = info->data->mask; 453 454 return IIO_VAL_FRACTIONAL; 455 } else if (mask != IIO_CHAN_INFO_RAW) { 456 return -EINVAL; 457 } 458 459 mutex_lock(&info->lock); 460 reinit_completion(&info->completion); 461 462 /* Select the channel to be used and Trigger conversion */ 463 if (info->data->start_conv) 464 info->data->start_conv(info, chan->address); 465 466 time_left = wait_for_completion_timeout(&info->completion, 467 EXYNOS_ADC_TIMEOUT); 468 if (time_left == 0) { 469 dev_warn(&indio_dev->dev, "Conversion timed out! Resetting\n"); 470 if (info->data->init_hw) 471 info->data->init_hw(info); 472 ret = -ETIMEDOUT; 473 } else { 474 *val = info->value; 475 *val2 = 0; 476 ret = IIO_VAL_INT; 477 } 478 479 mutex_unlock(&info->lock); 480 481 return ret; 482} 483 484static irqreturn_t exynos_adc_isr(int irq, void *dev_id) 485{ 486 struct exynos_adc *info = dev_id; 487 u32 mask = info->data->mask; 488 489 /* Read value */ 490 info->value = readl(ADC_V1_DATX(info->regs)) & mask; 491 492 /* clear irq */ 493 if (info->data->clear_irq) 494 info->data->clear_irq(info); 495 496 complete(&info->completion); 497 498 return IRQ_HANDLED; 499} 500 501static int exynos_adc_reg_access(struct iio_dev *indio_dev, 502 unsigned reg, unsigned writeval, 503 unsigned *readval) 504{ 505 struct exynos_adc *info = iio_priv(indio_dev); 506 507 if (readval == NULL) 508 return -EINVAL; 509 510 *readval = readl(info->regs + reg); 511 512 return 0; 513} 514 515static const struct iio_info exynos_adc_iio_info = { 516 .read_raw = &exynos_read_raw, 517 .debugfs_reg_access = &exynos_adc_reg_access, 518}; 519 520#define ADC_CHANNEL(_index, _id) { \ 521 .type = IIO_VOLTAGE, \ 522 .indexed = 1, \ 523 .channel = _index, \ 524 .address = _index, \ 525 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ 526 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SCALE), \ 527 .datasheet_name = _id, \ 528} 529 530static const struct iio_chan_spec exynos_adc_iio_channels[] = { 531 ADC_CHANNEL(0, "adc0"), 532 ADC_CHANNEL(1, "adc1"), 533 ADC_CHANNEL(2, "adc2"), 534 ADC_CHANNEL(3, "adc3"), 535 ADC_CHANNEL(4, "adc4"), 536 ADC_CHANNEL(5, "adc5"), 537 ADC_CHANNEL(6, "adc6"), 538 ADC_CHANNEL(7, "adc7"), 539 ADC_CHANNEL(8, "adc8"), 540 ADC_CHANNEL(9, "adc9"), 541}; 542 543static int exynos_adc_probe(struct platform_device *pdev) 544{ 545 struct exynos_adc *info = NULL; 546 struct device_node *np = pdev->dev.of_node; 547 struct iio_dev *indio_dev = NULL; 548 int ret; 549 int irq; 550 551 indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(struct exynos_adc)); 552 if (!indio_dev) 553 return -ENOMEM; 554 555 info = iio_priv(indio_dev); 556 557 info->data = exynos_adc_get_data(pdev); 558 if (!info->data) { 559 dev_err(&pdev->dev, "failed getting exynos_adc_data\n"); 560 return -EINVAL; 561 } 562 563 info->regs = devm_platform_ioremap_resource(pdev, 0); 564 if (IS_ERR(info->regs)) 565 return PTR_ERR(info->regs); 566 567 568 if (info->data->needs_adc_phy) { 569 info->pmu_map = syscon_regmap_lookup_by_phandle( 570 pdev->dev.of_node, 571 "samsung,syscon-phandle"); 572 if (IS_ERR(info->pmu_map)) { 573 dev_err(&pdev->dev, "syscon regmap lookup failed.\n"); 574 return PTR_ERR(info->pmu_map); 575 } 576 } 577 578 irq = platform_get_irq(pdev, 0); 579 if (irq < 0) 580 return irq; 581 info->irq = irq; 582 info->dev = &pdev->dev; 583 584 init_completion(&info->completion); 585 586 info->clk = devm_clk_get(&pdev->dev, "adc"); 587 if (IS_ERR(info->clk)) { 588 dev_err(&pdev->dev, "failed getting clock, err = %ld\n", 589 PTR_ERR(info->clk)); 590 return PTR_ERR(info->clk); 591 } 592 593 if (info->data->needs_sclk) { 594 info->sclk = devm_clk_get(&pdev->dev, "sclk"); 595 if (IS_ERR(info->sclk)) { 596 dev_err(&pdev->dev, 597 "failed getting sclk clock, err = %ld\n", 598 PTR_ERR(info->sclk)); 599 return PTR_ERR(info->sclk); 600 } 601 } 602 603 info->vdd = devm_regulator_get(&pdev->dev, "vdd"); 604 if (IS_ERR(info->vdd)) 605 return dev_err_probe(&pdev->dev, PTR_ERR(info->vdd), 606 "failed getting regulator"); 607 608 ret = regulator_enable(info->vdd); 609 if (ret) 610 return ret; 611 612 ret = exynos_adc_prepare_clk(info); 613 if (ret) 614 goto err_disable_reg; 615 616 ret = exynos_adc_enable_clk(info); 617 if (ret) 618 goto err_unprepare_clk; 619 620 platform_set_drvdata(pdev, indio_dev); 621 622 indio_dev->name = dev_name(&pdev->dev); 623 indio_dev->info = &exynos_adc_iio_info; 624 indio_dev->modes = INDIO_DIRECT_MODE; 625 indio_dev->channels = exynos_adc_iio_channels; 626 indio_dev->num_channels = info->data->num_channels; 627 628 mutex_init(&info->lock); 629 630 ret = request_irq(info->irq, exynos_adc_isr, 631 0, dev_name(&pdev->dev), info); 632 if (ret < 0) { 633 dev_err(&pdev->dev, "failed requesting irq, irq = %d\n", 634 info->irq); 635 goto err_disable_clk; 636 } 637 638 ret = iio_device_register(indio_dev); 639 if (ret) 640 goto err_irq; 641 642 if (info->data->init_hw) 643 info->data->init_hw(info); 644 645 ret = of_platform_populate(np, exynos_adc_match, NULL, &indio_dev->dev); 646 if (ret < 0) { 647 dev_err(&pdev->dev, "failed adding child nodes\n"); 648 goto err_of_populate; 649 } 650 651 return 0; 652 653err_of_populate: 654 of_platform_depopulate(&indio_dev->dev); 655 iio_device_unregister(indio_dev); 656err_irq: 657 free_irq(info->irq, info); 658err_disable_clk: 659 if (info->data->exit_hw) 660 info->data->exit_hw(info); 661 exynos_adc_disable_clk(info); 662err_unprepare_clk: 663 exynos_adc_unprepare_clk(info); 664err_disable_reg: 665 regulator_disable(info->vdd); 666 return ret; 667} 668 669static void exynos_adc_remove(struct platform_device *pdev) 670{ 671 struct iio_dev *indio_dev = platform_get_drvdata(pdev); 672 struct exynos_adc *info = iio_priv(indio_dev); 673 674 of_platform_depopulate(&indio_dev->dev); 675 iio_device_unregister(indio_dev); 676 free_irq(info->irq, info); 677 if (info->data->exit_hw) 678 info->data->exit_hw(info); 679 exynos_adc_disable_clk(info); 680 exynos_adc_unprepare_clk(info); 681 regulator_disable(info->vdd); 682} 683 684static int exynos_adc_suspend(struct device *dev) 685{ 686 struct iio_dev *indio_dev = dev_get_drvdata(dev); 687 struct exynos_adc *info = iio_priv(indio_dev); 688 689 if (info->data->exit_hw) 690 info->data->exit_hw(info); 691 exynos_adc_disable_clk(info); 692 regulator_disable(info->vdd); 693 694 return 0; 695} 696 697static int exynos_adc_resume(struct device *dev) 698{ 699 struct iio_dev *indio_dev = dev_get_drvdata(dev); 700 struct exynos_adc *info = iio_priv(indio_dev); 701 int ret; 702 703 ret = regulator_enable(info->vdd); 704 if (ret) 705 return ret; 706 707 ret = exynos_adc_enable_clk(info); 708 if (ret) 709 return ret; 710 711 if (info->data->init_hw) 712 info->data->init_hw(info); 713 714 return 0; 715} 716 717static DEFINE_SIMPLE_DEV_PM_OPS(exynos_adc_pm_ops, exynos_adc_suspend, 718 exynos_adc_resume); 719 720static struct platform_driver exynos_adc_driver = { 721 .probe = exynos_adc_probe, 722 .remove = exynos_adc_remove, 723 .driver = { 724 .name = "exynos-adc", 725 .of_match_table = exynos_adc_match, 726 .pm = pm_sleep_ptr(&exynos_adc_pm_ops), 727 }, 728}; 729 730module_platform_driver(exynos_adc_driver); 731 732MODULE_AUTHOR("Naveen Krishna Chatradhi <ch.naveen@samsung.com>"); 733MODULE_DESCRIPTION("Samsung EXYNOS5 ADC driver"); 734MODULE_LICENSE("GPL v2");
~/
Read-only file preview.