| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0+ |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Renesas R-Car GyroADC driver |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Copyright 2016 Marek Vasut <marek.vasut@gmail.com> |
|---|
| 5 | | - * |
|---|
| 6 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 7 | | - * it under the terms of the GNU General Public License as published by |
|---|
| 8 | | - * the Free Software Foundation; either version 2 of the License, or |
|---|
| 9 | | - * (at your option) any later version. |
|---|
| 10 | | - * |
|---|
| 11 | | - * This program is distributed in the hope that it will be useful, |
|---|
| 12 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 13 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 14 | | - * GNU General Public License for more details. |
|---|
| 15 | 6 | */ |
|---|
| 16 | 7 | |
|---|
| 17 | 8 | #include <linux/module.h> |
|---|
| .. | .. |
|---|
| 343 | 334 | for_each_child_of_node(np, child) { |
|---|
| 344 | 335 | of_id = of_match_node(rcar_gyroadc_child_match, child); |
|---|
| 345 | 336 | if (!of_id) { |
|---|
| 346 | | - dev_err(dev, "Ignoring unsupported ADC \"%s\".", |
|---|
| 347 | | - child->name); |
|---|
| 337 | + dev_err(dev, "Ignoring unsupported ADC \"%pOFn\".", |
|---|
| 338 | + child); |
|---|
| 348 | 339 | continue; |
|---|
| 349 | 340 | } |
|---|
| 350 | 341 | |
|---|
| .. | .. |
|---|
| 366 | 357 | num_channels = ARRAY_SIZE(rcar_gyroadc_iio_channels_3); |
|---|
| 367 | 358 | break; |
|---|
| 368 | 359 | default: |
|---|
| 369 | | - return -EINVAL; |
|---|
| 360 | + goto err_e_inval; |
|---|
| 370 | 361 | } |
|---|
| 371 | 362 | |
|---|
| 372 | 363 | /* |
|---|
| .. | .. |
|---|
| 381 | 372 | ret = of_property_read_u32(child, "reg", ®); |
|---|
| 382 | 373 | if (ret) { |
|---|
| 383 | 374 | dev_err(dev, |
|---|
| 384 | | - "Failed to get child reg property of ADC \"%s\".\n", |
|---|
| 385 | | - child->name); |
|---|
| 386 | | - return ret; |
|---|
| 375 | + "Failed to get child reg property of ADC \"%pOFn\".\n", |
|---|
| 376 | + child); |
|---|
| 377 | + goto err_of_node_put; |
|---|
| 387 | 378 | } |
|---|
| 388 | 379 | |
|---|
| 389 | 380 | /* Channel number is too high. */ |
|---|
| 390 | 381 | if (reg >= num_channels) { |
|---|
| 391 | 382 | dev_err(dev, |
|---|
| 392 | | - "Only %i channels supported with %s, but reg = <%i>.\n", |
|---|
| 393 | | - num_channels, child->name, reg); |
|---|
| 394 | | - return -EINVAL; |
|---|
| 383 | + "Only %i channels supported with %pOFn, but reg = <%i>.\n", |
|---|
| 384 | + num_channels, child, reg); |
|---|
| 385 | + goto err_e_inval; |
|---|
| 395 | 386 | } |
|---|
| 396 | 387 | } |
|---|
| 397 | 388 | |
|---|
| .. | .. |
|---|
| 400 | 391 | dev_err(dev, |
|---|
| 401 | 392 | "Channel %i uses different ADC mode than the rest.\n", |
|---|
| 402 | 393 | reg); |
|---|
| 403 | | - return -EINVAL; |
|---|
| 394 | + goto err_e_inval; |
|---|
| 404 | 395 | } |
|---|
| 405 | 396 | |
|---|
| 406 | 397 | /* Channel is valid, grab the regulator. */ |
|---|
| .. | .. |
|---|
| 410 | 401 | if (IS_ERR(vref)) { |
|---|
| 411 | 402 | dev_dbg(dev, "Channel %i 'vref' supply not connected.\n", |
|---|
| 412 | 403 | reg); |
|---|
| 413 | | - return PTR_ERR(vref); |
|---|
| 404 | + ret = PTR_ERR(vref); |
|---|
| 405 | + goto err_of_node_put; |
|---|
| 414 | 406 | } |
|---|
| 415 | 407 | |
|---|
| 416 | 408 | priv->vref[reg] = vref; |
|---|
| .. | .. |
|---|
| 434 | 426 | * attached to the GyroADC at a time, so if we found it, |
|---|
| 435 | 427 | * we can stop parsing here. |
|---|
| 436 | 428 | */ |
|---|
| 437 | | - if (childmode == RCAR_GYROADC_MODE_SELECT_1_MB88101A) |
|---|
| 429 | + if (childmode == RCAR_GYROADC_MODE_SELECT_1_MB88101A) { |
|---|
| 430 | + of_node_put(child); |
|---|
| 438 | 431 | break; |
|---|
| 432 | + } |
|---|
| 439 | 433 | } |
|---|
| 440 | 434 | |
|---|
| 441 | 435 | if (first) { |
|---|
| .. | .. |
|---|
| 444 | 438 | } |
|---|
| 445 | 439 | |
|---|
| 446 | 440 | return 0; |
|---|
| 441 | + |
|---|
| 442 | +err_e_inval: |
|---|
| 443 | + ret = -EINVAL; |
|---|
| 444 | +err_of_node_put: |
|---|
| 445 | + of_node_put(child); |
|---|
| 446 | + return ret; |
|---|
| 447 | 447 | } |
|---|
| 448 | 448 | |
|---|
| 449 | 449 | static void rcar_gyroadc_deinit_supplies(struct iio_dev *indio_dev) |
|---|
| .. | .. |
|---|
| 490 | 490 | struct device *dev = &pdev->dev; |
|---|
| 491 | 491 | struct rcar_gyroadc *priv; |
|---|
| 492 | 492 | struct iio_dev *indio_dev; |
|---|
| 493 | | - struct resource *mem; |
|---|
| 494 | 493 | int ret; |
|---|
| 495 | 494 | |
|---|
| 496 | 495 | indio_dev = devm_iio_device_alloc(dev, sizeof(*priv)); |
|---|
| 497 | | - if (!indio_dev) { |
|---|
| 498 | | - dev_err(dev, "Failed to allocate IIO device.\n"); |
|---|
| 496 | + if (!indio_dev) |
|---|
| 499 | 497 | return -ENOMEM; |
|---|
| 500 | | - } |
|---|
| 501 | 498 | |
|---|
| 502 | 499 | priv = iio_priv(indio_dev); |
|---|
| 503 | 500 | priv->dev = dev; |
|---|
| 504 | 501 | |
|---|
| 505 | | - mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
|---|
| 506 | | - priv->regs = devm_ioremap_resource(dev, mem); |
|---|
| 502 | + priv->regs = devm_platform_ioremap_resource(pdev, 0); |
|---|
| 507 | 503 | if (IS_ERR(priv->regs)) |
|---|
| 508 | 504 | return PTR_ERR(priv->regs); |
|---|
| 509 | 505 | |
|---|
| 510 | 506 | priv->clk = devm_clk_get(dev, "fck"); |
|---|
| 511 | | - if (IS_ERR(priv->clk)) { |
|---|
| 512 | | - ret = PTR_ERR(priv->clk); |
|---|
| 513 | | - if (ret != -EPROBE_DEFER) |
|---|
| 514 | | - dev_err(dev, "Failed to get IF clock (ret=%i)\n", ret); |
|---|
| 515 | | - return ret; |
|---|
| 516 | | - } |
|---|
| 507 | + if (IS_ERR(priv->clk)) |
|---|
| 508 | + return dev_err_probe(dev, PTR_ERR(priv->clk), |
|---|
| 509 | + "Failed to get IF clock\n"); |
|---|
| 517 | 510 | |
|---|
| 518 | 511 | ret = rcar_gyroadc_parse_subdevs(indio_dev); |
|---|
| 519 | 512 | if (ret) |
|---|
| .. | .. |
|---|
| 529 | 522 | platform_set_drvdata(pdev, indio_dev); |
|---|
| 530 | 523 | |
|---|
| 531 | 524 | indio_dev->name = DRIVER_NAME; |
|---|
| 532 | | - indio_dev->dev.parent = dev; |
|---|
| 533 | | - indio_dev->dev.of_node = pdev->dev.of_node; |
|---|
| 534 | 525 | indio_dev->info = &rcar_gyroadc_iio_info; |
|---|
| 535 | 526 | indio_dev->modes = INDIO_DIRECT_MODE; |
|---|
| 536 | 527 | |
|---|