diff options
author | Jonathan Cameron <jic23@cam.ac.uk> | 2011-09-02 12:14:40 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-09-06 19:02:01 -0400 |
commit | 26d25ae3f0d8ffe350aacc75b71198d6b35bd1f4 (patch) | |
tree | 8b7867c7cfb8202e5313c462256ebf7e9932a1f1 | |
parent | 330c6c57e6284a755d7e8a031b3c917571ee6dc3 (diff) |
staging:iio: rework of attribute registration.
This set also includes quite a number of bug fixes of particularly
remove functions.
Necessary due to issue pointed out in Bart Van Assche's patch:
docs/driver-model: Document device.groups
V2: Rebase due to patch reordering.
V3: Pull various error fixes and cleanups out into their own patches.
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
Acked-by: Michael Hennerich <Michael.Hennerich@analog.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
42 files changed, 388 insertions, 488 deletions
diff --git a/drivers/staging/iio/accel/adis16201_core.c b/drivers/staging/iio/accel/adis16201_core.c index 1e19aba115e..2785460b385 100644 --- a/drivers/staging/iio/accel/adis16201_core.c +++ b/drivers/staging/iio/accel/adis16201_core.c | |||
@@ -463,7 +463,7 @@ static const struct iio_info adis16201_info = { | |||
463 | 463 | ||
464 | static int __devinit adis16201_probe(struct spi_device *spi) | 464 | static int __devinit adis16201_probe(struct spi_device *spi) |
465 | { | 465 | { |
466 | int ret, regdone = 0; | 466 | int ret; |
467 | struct adis16201_state *st; | 467 | struct adis16201_state *st; |
468 | struct iio_dev *indio_dev; | 468 | struct iio_dev *indio_dev; |
469 | 469 | ||
@@ -492,11 +492,6 @@ static int __devinit adis16201_probe(struct spi_device *spi) | |||
492 | if (ret) | 492 | if (ret) |
493 | goto error_free_dev; | 493 | goto error_free_dev; |
494 | 494 | ||
495 | ret = iio_device_register(indio_dev); | ||
496 | if (ret) | ||
497 | goto error_unreg_ring_funcs; | ||
498 | regdone = 1; | ||
499 | |||
500 | ret = iio_ring_buffer_register(indio_dev, | 495 | ret = iio_ring_buffer_register(indio_dev, |
501 | adis16201_channels, | 496 | adis16201_channels, |
502 | ARRAY_SIZE(adis16201_channels)); | 497 | ARRAY_SIZE(adis16201_channels)); |
@@ -515,6 +510,10 @@ static int __devinit adis16201_probe(struct spi_device *spi) | |||
515 | ret = adis16201_initial_setup(indio_dev); | 510 | ret = adis16201_initial_setup(indio_dev); |
516 | if (ret) | 511 | if (ret) |
517 | goto error_remove_trigger; | 512 | goto error_remove_trigger; |
513 | |||
514 | ret = iio_device_register(indio_dev); | ||
515 | if (ret < 0) | ||
516 | goto error_remove_trigger; | ||
518 | return 0; | 517 | return 0; |
519 | 518 | ||
520 | error_remove_trigger: | 519 | error_remove_trigger: |
@@ -524,10 +523,7 @@ error_uninitialize_ring: | |||
524 | error_unreg_ring_funcs: | 523 | error_unreg_ring_funcs: |
525 | adis16201_unconfigure_ring(indio_dev); | 524 | adis16201_unconfigure_ring(indio_dev); |
526 | error_free_dev: | 525 | error_free_dev: |
527 | if (regdone) | 526 | iio_free_device(indio_dev); |
528 | iio_device_unregister(indio_dev); | ||
529 | else | ||
530 | iio_free_device(indio_dev); | ||
531 | error_ret: | 527 | error_ret: |
532 | return ret; | 528 | return ret; |
533 | } | 529 | } |
diff --git a/drivers/staging/iio/accel/adis16203_core.c b/drivers/staging/iio/accel/adis16203_core.c index 2a658f0e788..27079a95d4b 100644 --- a/drivers/staging/iio/accel/adis16203_core.c +++ b/drivers/staging/iio/accel/adis16203_core.c | |||
@@ -419,7 +419,7 @@ static const struct iio_info adis16203_info = { | |||
419 | 419 | ||
420 | static int __devinit adis16203_probe(struct spi_device *spi) | 420 | static int __devinit adis16203_probe(struct spi_device *spi) |
421 | { | 421 | { |
422 | int ret, regdone = 0; | 422 | int ret; |
423 | struct iio_dev *indio_dev; | 423 | struct iio_dev *indio_dev; |
424 | struct adis16203_state *st; | 424 | struct adis16203_state *st; |
425 | 425 | ||
@@ -446,11 +446,6 @@ static int __devinit adis16203_probe(struct spi_device *spi) | |||
446 | if (ret) | 446 | if (ret) |
447 | goto error_free_dev; | 447 | goto error_free_dev; |
448 | 448 | ||
449 | ret = iio_device_register(indio_dev); | ||
450 | if (ret) | ||
451 | goto error_unreg_ring_funcs; | ||
452 | regdone = 1; | ||
453 | |||
454 | ret = iio_ring_buffer_register(indio_dev, | 449 | ret = iio_ring_buffer_register(indio_dev, |
455 | adis16203_channels, | 450 | adis16203_channels, |
456 | ARRAY_SIZE(adis16203_channels)); | 451 | ARRAY_SIZE(adis16203_channels)); |
@@ -469,6 +464,11 @@ static int __devinit adis16203_probe(struct spi_device *spi) | |||
469 | ret = adis16203_initial_setup(indio_dev); | 464 | ret = adis16203_initial_setup(indio_dev); |
470 | if (ret) | 465 | if (ret) |
471 | goto error_remove_trigger; | 466 | goto error_remove_trigger; |
467 | |||
468 | ret = iio_device_register(indio_dev); | ||
469 | if (ret) | ||
470 | goto error_remove_trigger; | ||
471 | |||
472 | return 0; | 472 | return 0; |
473 | 473 | ||
474 | error_remove_trigger: | 474 | error_remove_trigger: |
@@ -478,10 +478,7 @@ error_uninitialize_ring: | |||
478 | error_unreg_ring_funcs: | 478 | error_unreg_ring_funcs: |
479 | adis16203_unconfigure_ring(indio_dev); | 479 | adis16203_unconfigure_ring(indio_dev); |
480 | error_free_dev: | 480 | error_free_dev: |
481 | if (regdone) | 481 | iio_free_device(indio_dev); |
482 | iio_device_unregister(indio_dev); | ||
483 | else | ||
484 | iio_free_device(indio_dev); | ||
485 | error_ret: | 482 | error_ret: |
486 | return ret; | 483 | return ret; |
487 | } | 484 | } |
diff --git a/drivers/staging/iio/accel/adis16204_core.c b/drivers/staging/iio/accel/adis16204_core.c index 42a37bb0136..e0b87840133 100644 --- a/drivers/staging/iio/accel/adis16204_core.c +++ b/drivers/staging/iio/accel/adis16204_core.c | |||
@@ -494,7 +494,7 @@ static const struct iio_info adis16204_info = { | |||
494 | 494 | ||
495 | static int __devinit adis16204_probe(struct spi_device *spi) | 495 | static int __devinit adis16204_probe(struct spi_device *spi) |
496 | { | 496 | { |
497 | int ret, regdone = 0; | 497 | int ret; |
498 | struct adis16204_state *st; | 498 | struct adis16204_state *st; |
499 | struct iio_dev *indio_dev; | 499 | struct iio_dev *indio_dev; |
500 | 500 | ||
@@ -521,11 +521,6 @@ static int __devinit adis16204_probe(struct spi_device *spi) | |||
521 | if (ret) | 521 | if (ret) |
522 | goto error_free_dev; | 522 | goto error_free_dev; |
523 | 523 | ||
524 | ret = iio_device_register(indio_dev); | ||
525 | if (ret) | ||
526 | goto error_unreg_ring_funcs; | ||
527 | regdone = 1; | ||
528 | |||
529 | ret = iio_ring_buffer_register(indio_dev, | 524 | ret = iio_ring_buffer_register(indio_dev, |
530 | adis16204_channels, | 525 | adis16204_channels, |
531 | ARRAY_SIZE(adis16204_channels)); | 526 | ARRAY_SIZE(adis16204_channels)); |
@@ -544,6 +539,10 @@ static int __devinit adis16204_probe(struct spi_device *spi) | |||
544 | ret = adis16204_initial_setup(indio_dev); | 539 | ret = adis16204_initial_setup(indio_dev); |
545 | if (ret) | 540 | if (ret) |
546 | goto error_remove_trigger; | 541 | goto error_remove_trigger; |
542 | ret = iio_device_register(indio_dev); | ||
543 | if (ret) | ||
544 | goto error_remove_trigger; | ||
545 | |||
547 | return 0; | 546 | return 0; |
548 | 547 | ||
549 | error_remove_trigger: | 548 | error_remove_trigger: |
@@ -553,10 +552,7 @@ error_uninitialize_ring: | |||
553 | error_unreg_ring_funcs: | 552 | error_unreg_ring_funcs: |
554 | adis16204_unconfigure_ring(indio_dev); | 553 | adis16204_unconfigure_ring(indio_dev); |
555 | error_free_dev: | 554 | error_free_dev: |
556 | if (regdone) | 555 | iio_free_device(indio_dev); |
557 | iio_device_unregister(indio_dev); | ||
558 | else | ||
559 | iio_free_device(indio_dev); | ||
560 | error_ret: | 556 | error_ret: |
561 | return ret; | 557 | return ret; |
562 | } | 558 | } |
diff --git a/drivers/staging/iio/accel/adis16209_core.c b/drivers/staging/iio/accel/adis16209_core.c index d59a9e4803b..377c6d790ca 100644 --- a/drivers/staging/iio/accel/adis16209_core.c +++ b/drivers/staging/iio/accel/adis16209_core.c | |||
@@ -467,7 +467,7 @@ static const struct iio_info adis16209_info = { | |||
467 | 467 | ||
468 | static int __devinit adis16209_probe(struct spi_device *spi) | 468 | static int __devinit adis16209_probe(struct spi_device *spi) |
469 | { | 469 | { |
470 | int ret, regdone = 0; | 470 | int ret; |
471 | struct adis16209_state *st; | 471 | struct adis16209_state *st; |
472 | struct iio_dev *indio_dev; | 472 | struct iio_dev *indio_dev; |
473 | 473 | ||
@@ -494,11 +494,6 @@ static int __devinit adis16209_probe(struct spi_device *spi) | |||
494 | if (ret) | 494 | if (ret) |
495 | goto error_free_dev; | 495 | goto error_free_dev; |
496 | 496 | ||
497 | ret = iio_device_register(indio_dev); | ||
498 | if (ret) | ||
499 | goto error_unreg_ring_funcs; | ||
500 | regdone = 1; | ||
501 | |||
502 | ret = iio_ring_buffer_register(indio_dev, | 497 | ret = iio_ring_buffer_register(indio_dev, |
503 | adis16209_channels, | 498 | adis16209_channels, |
504 | ARRAY_SIZE(adis16209_channels)); | 499 | ARRAY_SIZE(adis16209_channels)); |
@@ -517,6 +512,10 @@ static int __devinit adis16209_probe(struct spi_device *spi) | |||
517 | ret = adis16209_initial_setup(indio_dev); | 512 | ret = adis16209_initial_setup(indio_dev); |
518 | if (ret) | 513 | if (ret) |
519 | goto error_remove_trigger; | 514 | goto error_remove_trigger; |
515 | ret = iio_device_register(indio_dev); | ||
516 | if (ret) | ||
517 | goto error_remove_trigger; | ||
518 | |||
520 | return 0; | 519 | return 0; |
521 | 520 | ||
522 | error_remove_trigger: | 521 | error_remove_trigger: |
@@ -526,10 +525,7 @@ error_uninitialize_ring: | |||
526 | error_unreg_ring_funcs: | 525 | error_unreg_ring_funcs: |
527 | adis16209_unconfigure_ring(indio_dev); | 526 | adis16209_unconfigure_ring(indio_dev); |
528 | error_free_dev: | 527 | error_free_dev: |
529 | if (regdone) | 528 | iio_free_device(indio_dev); |
530 | iio_device_unregister(indio_dev); | ||
531 | else | ||
532 | iio_free_device(indio_dev); | ||
533 | error_ret: | 529 | error_ret: |
534 | return ret; | 530 | return ret; |
535 | } | 531 | } |
diff --git a/drivers/staging/iio/accel/adis16240_core.c b/drivers/staging/iio/accel/adis16240_core.c index b6504f1479b..0dd02a3ba15 100644 --- a/drivers/staging/iio/accel/adis16240_core.c +++ b/drivers/staging/iio/accel/adis16240_core.c | |||
@@ -519,7 +519,7 @@ static const struct iio_info adis16240_info = { | |||
519 | 519 | ||
520 | static int __devinit adis16240_probe(struct spi_device *spi) | 520 | static int __devinit adis16240_probe(struct spi_device *spi) |
521 | { | 521 | { |
522 | int ret, regdone = 0; | 522 | int ret; |
523 | struct adis16240_state *st; | 523 | struct adis16240_state *st; |
524 | struct iio_dev *indio_dev; | 524 | struct iio_dev *indio_dev; |
525 | 525 | ||
@@ -547,11 +547,6 @@ static int __devinit adis16240_probe(struct spi_device *spi) | |||
547 | if (ret) | 547 | if (ret) |
548 | goto error_free_dev; | 548 | goto error_free_dev; |
549 | 549 | ||
550 | ret = iio_device_register(indio_dev); | ||
551 | if (ret) | ||
552 | goto error_unreg_ring_funcs; | ||
553 | regdone = 1; | ||
554 | |||
555 | ret = iio_ring_buffer_register(indio_dev, | 550 | ret = iio_ring_buffer_register(indio_dev, |
556 | adis16240_channels, | 551 | adis16240_channels, |
557 | ARRAY_SIZE(adis16240_channels)); | 552 | ARRAY_SIZE(adis16240_channels)); |
@@ -570,6 +565,9 @@ static int __devinit adis16240_probe(struct spi_device *spi) | |||
570 | ret = adis16240_initial_setup(indio_dev); | 565 | ret = adis16240_initial_setup(indio_dev); |
571 | if (ret) | 566 | if (ret) |
572 | goto error_remove_trigger; | 567 | goto error_remove_trigger; |
568 | ret = iio_device_register(indio_dev); | ||
569 | if (ret) | ||
570 | goto error_remove_trigger; | ||
573 | return 0; | 571 | return 0; |
574 | 572 | ||
575 | error_remove_trigger: | 573 | error_remove_trigger: |
@@ -579,10 +577,7 @@ error_uninitialize_ring: | |||
579 | error_unreg_ring_funcs: | 577 | error_unreg_ring_funcs: |
580 | adis16240_unconfigure_ring(indio_dev); | 578 | adis16240_unconfigure_ring(indio_dev); |
581 | error_free_dev: | 579 | error_free_dev: |
582 | if (regdone) | 580 | iio_free_device(indio_dev); |
583 | iio_device_unregister(indio_dev); | ||
584 | else | ||
585 | iio_free_device(indio_dev); | ||
586 | error_ret: | 581 | error_ret: |
587 | return ret; | 582 | return ret; |
588 | } | 583 | } |
diff --git a/drivers/staging/iio/accel/lis3l02dq_core.c b/drivers/staging/iio/accel/lis3l02dq_core.c index 61d114a8b19..ee91cc719bc 100644 --- a/drivers/staging/iio/accel/lis3l02dq_core.c +++ b/drivers/staging/iio/accel/lis3l02dq_core.c | |||
@@ -663,7 +663,7 @@ static const struct iio_info lis3l02dq_info = { | |||
663 | 663 | ||
664 | static int __devinit lis3l02dq_probe(struct spi_device *spi) | 664 | static int __devinit lis3l02dq_probe(struct spi_device *spi) |
665 | { | 665 | { |
666 | int ret, regdone = 0; | 666 | int ret; |
667 | struct lis3l02dq_state *st; | 667 | struct lis3l02dq_state *st; |
668 | struct iio_dev *indio_dev; | 668 | struct iio_dev *indio_dev; |
669 | 669 | ||
@@ -690,11 +690,6 @@ static int __devinit lis3l02dq_probe(struct spi_device *spi) | |||
690 | if (ret) | 690 | if (ret) |
691 | goto error_free_dev; | 691 | goto error_free_dev; |
692 | 692 | ||
693 | ret = iio_device_register(indio_dev); | ||
694 | if (ret) | ||
695 | goto error_unreg_ring_funcs; | ||
696 | regdone = 1; | ||
697 | |||
698 | ret = iio_ring_buffer_register(indio_dev, | 693 | ret = iio_ring_buffer_register(indio_dev, |
699 | lis3l02dq_channels, | 694 | lis3l02dq_channels, |
700 | ARRAY_SIZE(lis3l02dq_channels)); | 695 | ARRAY_SIZE(lis3l02dq_channels)); |
@@ -722,6 +717,11 @@ static int __devinit lis3l02dq_probe(struct spi_device *spi) | |||
722 | ret = lis3l02dq_initial_setup(indio_dev); | 717 | ret = lis3l02dq_initial_setup(indio_dev); |
723 | if (ret) | 718 | if (ret) |
724 | goto error_remove_trigger; | 719 | goto error_remove_trigger; |
720 | |||
721 | ret = iio_device_register(indio_dev); | ||
722 | if (ret) | ||
723 | goto error_remove_trigger; | ||
724 | |||
725 | return 0; | 725 | return 0; |
726 | 726 | ||
727 | error_remove_trigger: | 727 | error_remove_trigger: |
@@ -735,9 +735,6 @@ error_uninitialize_ring: | |||
735 | error_unreg_ring_funcs: | 735 | error_unreg_ring_funcs: |
736 | lis3l02dq_unconfigure_ring(indio_dev); | 736 | lis3l02dq_unconfigure_ring(indio_dev); |
737 | error_free_dev: | 737 | error_free_dev: |
738 | if (regdone) | ||
739 | iio_device_unregister(indio_dev); | ||
740 | else | ||
741 | iio_free_device(indio_dev); | 738 | iio_free_device(indio_dev); |
742 | error_ret: | 739 | error_ret: |
743 | return ret; | 740 | return ret; |
@@ -790,9 +787,8 @@ static int lis3l02dq_remove(struct spi_device *spi) | |||
790 | lis3l02dq_remove_trigger(indio_dev); | 787 | lis3l02dq_remove_trigger(indio_dev); |
791 | iio_ring_buffer_unregister(indio_dev); | 788 | iio_ring_buffer_unregister(indio_dev); |
792 | lis3l02dq_unconfigure_ring(indio_dev); | 789 | lis3l02dq_unconfigure_ring(indio_dev); |
793 | iio_device_unregister(indio_dev); | ||
794 | 790 | ||
795 | return 0; | 791 | iio_device_unregister(indio_dev); |
796 | 792 | ||
797 | err_ret: | 793 | err_ret: |
798 | return ret; | 794 | return ret; |
diff --git a/drivers/staging/iio/adc/ad7150.c b/drivers/staging/iio/adc/ad7150.c index d70623c1048..3d154b87f55 100644 --- a/drivers/staging/iio/adc/ad7150.c +++ b/drivers/staging/iio/adc/ad7150.c | |||
@@ -719,7 +719,7 @@ static const struct iio_info ad7150_info = { | |||
719 | static int __devinit ad7150_probe(struct i2c_client *client, | 719 | static int __devinit ad7150_probe(struct i2c_client *client, |
720 | const struct i2c_device_id *id) | 720 | const struct i2c_device_id *id) |
721 | { | 721 | { |
722 | int ret = 0, regdone = 0; | 722 | int ret; |
723 | struct ad7150_chip_info *chip; | 723 | struct ad7150_chip_info *chip; |
724 | struct iio_dev *indio_dev; | 724 | struct iio_dev *indio_dev; |
725 | 725 | ||
@@ -742,11 +742,6 @@ static int __devinit ad7150_probe(struct i2c_client *client, | |||
742 | 742 | ||
743 | indio_dev->modes = INDIO_DIRECT_MODE; | 743 | indio_dev->modes = INDIO_DIRECT_MODE; |
744 | 744 | ||
745 | ret = iio_device_register(indio_dev); | ||
746 | if (ret) | ||
747 | goto error_free_dev; | ||
748 | regdone = 1; | ||
749 | |||
750 | if (client->irq) { | 745 | if (client->irq) { |
751 | ret = request_threaded_irq(client->irq, | 746 | ret = request_threaded_irq(client->irq, |
752 | NULL, | 747 | NULL, |
@@ -759,15 +754,20 @@ static int __devinit ad7150_probe(struct i2c_client *client, | |||
759 | goto error_free_dev; | 754 | goto error_free_dev; |
760 | } | 755 | } |
761 | 756 | ||
757 | ret = iio_device_register(indio_dev); | ||
758 | if (ret) | ||
759 | goto error_free_irq; | ||
760 | |||
761 | |||
762 | dev_err(&client->dev, "%s capacitive sensor registered, irq: %d\n", id->name, client->irq); | 762 | dev_err(&client->dev, "%s capacitive sensor registered, irq: %d\n", id->name, client->irq); |
763 | 763 | ||
764 | return 0; | 764 | return 0; |
765 | error_free_irq: | ||
766 | if (client->irq) | ||
767 | free_irq(client->irq, indio_dev); | ||
765 | 768 | ||
766 | error_free_dev: | 769 | error_free_dev: |
767 | if (regdone) | 770 | iio_free_device(indio_dev); |
768 | iio_device_unregister(indio_dev); | ||
769 | else | ||
770 | iio_free_device(indio_dev); | ||
771 | error_ret: | 771 | error_ret: |
772 | return ret; | 772 | return ret; |
773 | } | 773 | } |
diff --git a/drivers/staging/iio/adc/ad7291.c b/drivers/staging/iio/adc/ad7291.c index 16ddbdec912..46a891d4d2e 100644 --- a/drivers/staging/iio/adc/ad7291.c +++ b/drivers/staging/iio/adc/ad7291.c | |||
@@ -811,10 +811,6 @@ static int __devinit ad7291_probe(struct i2c_client *client, | |||
811 | indio_dev->info = &ad7291_info; | 811 | indio_dev->info = &ad7291_info; |
812 | indio_dev->modes = INDIO_DIRECT_MODE; | 812 | indio_dev->modes = INDIO_DIRECT_MODE; |
813 | 813 | ||
814 | ret = iio_device_register(indio_dev); | ||
815 | if (ret) | ||
816 | goto error_free_dev; | ||
817 | |||
818 | if (client->irq > 0) { | 814 | if (client->irq > 0) { |
819 | ret = request_threaded_irq(client->irq, | 815 | ret = request_threaded_irq(client->irq, |
820 | NULL, | 816 | NULL, |
@@ -823,7 +819,7 @@ static int __devinit ad7291_probe(struct i2c_client *client, | |||
823 | id->name, | 819 | id->name, |
824 | indio_dev); | 820 | indio_dev); |
825 | if (ret) | 821 | if (ret) |
826 | goto error_unreg_dev; | 822 | goto error_free_dev; |
827 | 823 | ||
828 | /* set irq polarity low level */ | 824 | /* set irq polarity low level */ |
829 | chip->command |= AD7291_ALART_POLARITY; | 825 | chip->command |= AD7291_ALART_POLARITY; |
@@ -835,6 +831,10 @@ static int __devinit ad7291_probe(struct i2c_client *client, | |||
835 | goto error_unreg_irq; | 831 | goto error_unreg_irq; |
836 | } | 832 | } |
837 | 833 | ||
834 | ret = iio_device_register(indio_dev); | ||
835 | if (ret) | ||
836 | goto error_unreg_irq; | ||
837 | |||
838 | dev_info(&client->dev, "%s temperature sensor registered.\n", | 838 | dev_info(&client->dev, "%s temperature sensor registered.\n", |
839 | id->name); | 839 | id->name); |
840 | 840 | ||
@@ -842,8 +842,6 @@ static int __devinit ad7291_probe(struct i2c_client *client, | |||
842 | 842 | ||
843 | error_unreg_irq: | 843 | error_unreg_irq: |
844 | free_irq(client->irq, indio_dev); | 844 | free_irq(client->irq, indio_dev); |
845 | error_unreg_dev: | ||
846 | iio_device_unregister(indio_dev); | ||
847 | error_free_dev: | 845 | error_free_dev: |
848 | iio_free_device(indio_dev); | 846 | iio_free_device(indio_dev); |
849 | error_ret: | 847 | error_ret: |
diff --git a/drivers/staging/iio/adc/ad7298_core.c b/drivers/staging/iio/adc/ad7298_core.c index 6487359dc4c..a627bfe208a 100644 --- a/drivers/staging/iio/adc/ad7298_core.c +++ b/drivers/staging/iio/adc/ad7298_core.c | |||
@@ -165,7 +165,7 @@ static int __devinit ad7298_probe(struct spi_device *spi) | |||
165 | { | 165 | { |
166 | struct ad7298_platform_data *pdata = spi->dev.platform_data; | 166 | struct ad7298_platform_data *pdata = spi->dev.platform_data; |
167 | struct ad7298_state *st; | 167 | struct ad7298_state *st; |
168 | int ret, regdone = 0; | 168 | int ret; |
169 | struct iio_dev *indio_dev = iio_allocate_device(sizeof(*st)); | 169 | struct iio_dev *indio_dev = iio_allocate_device(sizeof(*st)); |
170 | 170 | ||
171 | if (indio_dev == NULL) | 171 | if (indio_dev == NULL) |
@@ -218,19 +218,19 @@ static int __devinit ad7298_probe(struct spi_device *spi) | |||
218 | if (ret) | 218 | if (ret) |
219 | goto error_disable_reg; | 219 | goto error_disable_reg; |
220 | 220 | ||
221 | ret = iio_device_register(indio_dev); | ||
222 | if (ret) | ||
223 | goto error_disable_reg; | ||
224 | regdone = 1; | ||
225 | |||
226 | ret = iio_ring_buffer_register(indio_dev, | 221 | ret = iio_ring_buffer_register(indio_dev, |
227 | &ad7298_channels[1], /* skip temp0 */ | 222 | &ad7298_channels[1], /* skip temp0 */ |
228 | ARRAY_SIZE(ad7298_channels) - 1); | 223 | ARRAY_SIZE(ad7298_channels) - 1); |
229 | if (ret) | 224 | if (ret) |
230 | goto error_cleanup_ring; | 225 | goto error_cleanup_ring; |
226 | ret = iio_device_register(indio_dev); | ||
227 | if (ret) | ||
228 | goto error_unregister_ring; | ||
231 | 229 | ||
232 | return 0; | 230 | return 0; |
233 | 231 | ||
232 | error_unregister_ring: | ||
233 | iio_ring_buffer_unregister(indio_dev); | ||
234 | error_cleanup_ring: | 234 | error_cleanup_ring: |
235 | ad7298_ring_cleanup(indio_dev); | 235 | ad7298_ring_cleanup(indio_dev); |
236 | error_disable_reg: | 236 | error_disable_reg: |
@@ -239,11 +239,7 @@ error_disable_reg: | |||
239 | error_put_reg: | 239 | error_put_reg: |
240 | if (!IS_ERR(st->reg)) | 240 | if (!IS_ERR(st->reg)) |
241 | regulator_put(st->reg); | 241 | regulator_put(st->reg); |
242 | 242 | iio_free_device(indio_dev); | |
243 | if (regdone) | ||
244 | iio_device_unregister(indio_dev); | ||
245 | else | ||
246 | iio_free_device(indio_dev); | ||
247 | 243 | ||
248 | return ret; | 244 | return ret; |
249 | } | 245 | } |
diff --git a/drivers/staging/iio/adc/ad7476_core.c b/drivers/staging/iio/adc/ad7476_core.c index 7329b009a71..edf25ce8970 100644 --- a/drivers/staging/iio/adc/ad7476_core.c +++ b/drivers/staging/iio/adc/ad7476_core.c | |||
@@ -129,7 +129,6 @@ static int __devinit ad7476_probe(struct spi_device *spi) | |||
129 | struct ad7476_state *st; | 129 | struct ad7476_state *st; |
130 | struct iio_dev *indio_dev; | 130 | struct iio_dev *indio_dev; |
131 | int ret, voltage_uv = 0; | 131 | int ret, voltage_uv = 0; |
132 | bool reg_done = false; | ||
133 | 132 | ||
134 | indio_dev = iio_allocate_device(sizeof(*st)); | 133 | indio_dev = iio_allocate_device(sizeof(*st)); |
135 | if (indio_dev == NULL) { | 134 | if (indio_dev == NULL) { |
@@ -180,28 +179,29 @@ static int __devinit ad7476_probe(struct spi_device *spi) | |||
180 | if (ret) | 179 | if (ret) |
181 | goto error_disable_reg; | 180 | goto error_disable_reg; |
182 | 181 | ||
183 | ret = iio_device_register(indio_dev); | ||
184 | if (ret) | ||
185 | goto error_disable_reg; | ||
186 | |||
187 | ret = iio_ring_buffer_register(indio_dev, | 182 | ret = iio_ring_buffer_register(indio_dev, |
188 | st->chip_info->channel, | 183 | st->chip_info->channel, |
189 | ARRAY_SIZE(st->chip_info->channel)); | 184 | ARRAY_SIZE(st->chip_info->channel)); |
190 | if (ret) | 185 | if (ret) |
191 | goto error_cleanup_ring; | 186 | goto error_cleanup_ring; |
187 | |||
188 | ret = iio_device_register(indio_dev); | ||
189 | if (ret) | ||
190 | goto error_ring_unregister; | ||
192 | return 0; | 191 | return 0; |
193 | 192 | ||
193 | error_ring_unregister: | ||
194 | iio_ring_buffer_unregister(indio_dev); | ||
194 | error_cleanup_ring: | 195 | error_cleanup_ring: |
195 | ad7476_ring_cleanup(indio_dev); | 196 | ad7476_ring_cleanup(indio_dev); |
196 | iio_device_unregister(indio_dev); | ||
197 | error_disable_reg: | 197 | error_disable_reg: |
198 | if (!IS_ERR(st->reg)) | 198 | if (!IS_ERR(st->reg)) |
199 | regulator_disable(st->reg); | 199 | regulator_disable(st->reg); |
200 | error_put_reg: | 200 | error_put_reg: |
201 | if (!IS_ERR(st->reg)) | 201 | if (!IS_ERR(st->reg)) |
202 | regulator_put(st->reg); | 202 | regulator_put(st->reg); |
203 | if (!reg_done) | 203 | iio_free_device(indio_dev); |
204 | iio_free_device(indio_dev); | 204 | |
205 | error_ret: | 205 | error_ret: |
206 | return ret; | 206 | return ret; |
207 | } | 207 | } |
diff --git a/drivers/staging/iio/adc/ad7606_core.c b/drivers/staging/iio/adc/ad7606_core.c index 7b43da93d77..bea663dc25d 100644 --- a/drivers/staging/iio/adc/ad7606_core.c +++ b/drivers/staging/iio/adc/ad7606_core.c | |||
@@ -439,7 +439,7 @@ struct iio_dev *ad7606_probe(struct device *dev, int irq, | |||
439 | { | 439 | { |
440 | struct ad7606_platform_data *pdata = dev->platform_data; | 440 | struct ad7606_platform_data *pdata = dev->platform_data; |
441 | struct ad7606_state *st; | 441 | struct ad7606_state *st; |
442 | int ret, regdone = 0; | 442 | int ret; |
443 | struct iio_dev *indio_dev = iio_allocate_device(sizeof(*st)); | 443 | struct iio_dev *indio_dev = iio_allocate_device(sizeof(*st)); |
444 | 444 | ||
445 | if (indio_dev == NULL) { | 445 | if (indio_dev == NULL) { |
@@ -501,18 +501,18 @@ struct iio_dev *ad7606_probe(struct device *dev, int irq, | |||
501 | if (ret) | 501 | if (ret) |
502 | goto error_free_irq; | 502 | goto error_free_irq; |
503 | 503 | ||
504 | ret = iio_device_register(indio_dev); | ||
505 | if (ret) | ||
506 | goto error_free_irq; | ||
507 | regdone = 1; | ||
508 | |||
509 | ret = iio_ring_buffer_register(indio_dev, | 504 | ret = iio_ring_buffer_register(indio_dev, |
510 | indio_dev->channels, | 505 | indio_dev->channels, |
511 | indio_dev->num_channels); | 506 | indio_dev->num_channels); |
512 | if (ret) | 507 | if (ret) |
513 | goto error_cleanup_ring; | 508 | goto error_cleanup_ring; |
509 | ret = iio_device_register(indio_dev); | ||
510 | if (ret) | ||
511 | goto error_unregister_ring; | ||
514 | 512 | ||
515 | return indio_dev; | 513 | return indio_dev; |
514 | error_unregister_ring: | ||
515 | iio_ring_buffer_unregister(indio_dev); | ||
516 | 516 | ||
517 | error_cleanup_ring: | 517 | error_cleanup_ring: |
518 | ad7606_ring_cleanup(indio_dev); | 518 | ad7606_ring_cleanup(indio_dev); |
@@ -529,10 +529,7 @@ error_disable_reg: | |||
529 | error_put_reg: | 529 | error_put_reg: |
530 | if (!IS_ERR(st->reg)) | 530 | if (!IS_ERR(st->reg)) |
531 | regulator_put(st->reg); | 531 | regulator_put(st->reg); |
532 | if (regdone) | 532 | iio_free_device(indio_dev); |
533 | iio_device_unregister(indio_dev); | ||
534 | else | ||
535 | iio_free_device(indio_dev); | ||
536 | error_ret: | 533 | error_ret: |
537 | return ERR_PTR(ret); | 534 | return ERR_PTR(ret); |
538 | } | 535 | } |
diff --git a/drivers/staging/iio/adc/ad7745.c b/drivers/staging/iio/adc/ad7745.c index 41150c60c20..eea77f1603d 100644 --- a/drivers/staging/iio/adc/ad7745.c +++ b/drivers/staging/iio/adc/ad7745.c | |||
@@ -578,7 +578,7 @@ static const struct iio_info ad774x_info = { | |||
578 | static int __devinit ad774x_probe(struct i2c_client *client, | 578 | static int __devinit ad774x_probe(struct i2c_client *client, |
579 | const struct i2c_device_id *id) | 579 | const struct i2c_device_id *id) |
580 | { | 580 | { |
581 | int ret = 0, regdone = 0; | 581 | int ret; |
582 | struct ad774x_chip_info *chip; | 582 | struct ad774x_chip_info *chip; |
583 | struct iio_dev *indio_dev; | 583 | struct iio_dev *indio_dev; |
584 | 584 | ||
@@ -599,11 +599,6 @@ static int __devinit ad774x_probe(struct i2c_client *client, | |||
599 | indio_dev->info = &ad774x_info; | 599 | indio_dev->info = &ad774x_info; |
600 | indio_dev->modes = INDIO_DIRECT_MODE; | 600 | indio_dev->modes = INDIO_DIRECT_MODE; |
601 | 601 | ||
602 | ret = iio_device_register(indio_dev); | ||
603 | if (ret) | ||
604 | goto error_free_dev; | ||
605 | regdone = 1; | ||
606 | |||
607 | if (client->irq) { | 602 | if (client->irq) { |
608 | ret = request_threaded_irq(client->irq, | 603 | ret = request_threaded_irq(client->irq, |
609 | NULL, | 604 | NULL, |
@@ -615,15 +610,18 @@ static int __devinit ad774x_probe(struct i2c_client *client, | |||
615 | goto error_free_dev; | 610 | goto error_free_dev; |
616 | } | 611 | } |
617 | 612 | ||
613 | ret = iio_device_register(indio_dev); | ||
614 | if (ret) | ||
615 | goto error_free_irq; | ||
616 | |||
618 | dev_err(&client->dev, "%s capacitive sensor registered, irq: %d\n", id->name, client->irq); | 617 | dev_err(&client->dev, "%s capacitive sensor registered, irq: %d\n", id->name, client->irq); |
619 | 618 | ||
620 | return 0; | 619 | return 0; |
621 | 620 | ||
621 | error_free_irq: | ||
622 | free_irq(client->irq, indio_dev); | ||
622 | error_free_dev: | 623 | error_free_dev: |
623 | if (regdone) | 624 | iio_free_device(indio_dev); |
624 | free_irq(client->irq, indio_dev); | ||
625 | else | ||
626 | iio_free_device(indio_dev); | ||
627 | error_ret: | 625 | error_ret: |
628 | return ret; | 626 | return ret; |
629 | } | 627 | } |
diff --git a/drivers/staging/iio/adc/ad7793.c b/drivers/staging/iio/adc/ad7793.c index b42a7ace426..17d18fc7b46 100644 --- a/drivers/staging/iio/adc/ad7793.c +++ b/drivers/staging/iio/adc/ad7793.c | |||
@@ -827,7 +827,7 @@ static int __devinit ad7793_probe(struct spi_device *spi) | |||
827 | struct ad7793_platform_data *pdata = spi->dev.platform_data; | 827 | struct ad7793_platform_data *pdata = spi->dev.platform_data; |
828 | struct ad7793_state *st; | 828 | struct ad7793_state *st; |
829 | struct iio_dev *indio_dev; | 829 | struct iio_dev *indio_dev; |
830 | int ret, i, voltage_uv = 0, regdone = 0; | 830 | int ret, i, voltage_uv = 0; |
831 | 831 | ||
832 | if (!pdata) { | 832 | if (!pdata) { |
833 | dev_err(&spi->dev, "no platform data?\n"); | 833 | dev_err(&spi->dev, "no platform data?\n"); |
@@ -890,11 +890,6 @@ static int __devinit ad7793_probe(struct spi_device *spi) | |||
890 | if (ret) | 890 | if (ret) |
891 | goto error_disable_reg; | 891 | goto error_disable_reg; |
892 | 892 | ||
893 | ret = iio_device_register(indio_dev); | ||
894 | if (ret) | ||
895 | goto error_unreg_ring; | ||
896 | regdone = 1; | ||
897 | |||
898 | ret = ad7793_probe_trigger(indio_dev); | 893 | ret = ad7793_probe_trigger(indio_dev); |
899 | if (ret) | 894 | if (ret) |
900 | goto error_unreg_ring; | 895 | goto error_unreg_ring; |
@@ -909,6 +904,10 @@ static int __devinit ad7793_probe(struct spi_device *spi) | |||
909 | if (ret) | 904 | if (ret) |
910 | goto error_uninitialize_ring; | 905 | goto error_uninitialize_ring; |
911 | 906 | ||
907 | ret = iio_device_register(indio_dev); | ||
908 | if (ret) | ||
909 | goto error_uninitialize_ring; | ||
910 | |||
912 | return 0; | 911 | return 0; |
913 | 912 | ||
914 | error_uninitialize_ring: | 913 | error_uninitialize_ring: |
@@ -924,10 +923,7 @@ error_put_reg: | |||
924 | if (!IS_ERR(st->reg)) | 923 | if (!IS_ERR(st->reg)) |
925 | regulator_put(st->reg); | 924 | regulator_put(st->reg); |
926 | 925 | ||
927 | if (regdone) | 926 | iio_free_device(indio_dev); |
928 | iio_device_unregister(indio_dev); | ||
929 | else | ||
930 | iio_free_device(indio_dev); | ||
931 | 927 | ||
932 | return ret; | 928 | return ret; |
933 | } | 929 | } |
diff --git a/drivers/staging/iio/adc/ad7816.c b/drivers/staging/iio/adc/ad7816.c index 5a4586fbe14..deec8f245f9 100644 --- a/drivers/staging/iio/adc/ad7816.c +++ b/drivers/staging/iio/adc/ad7816.c | |||
@@ -396,10 +396,6 @@ static int __devinit ad7816_probe(struct spi_device *spi_dev) | |||
396 | indio_dev->info = &ad7816_info; | 396 | indio_dev->info = &ad7816_info; |
397 | indio_dev->modes = INDIO_DIRECT_MODE; | 397 | indio_dev->modes = INDIO_DIRECT_MODE; |
398 | 398 | ||
399 | ret = iio_device_register(indio_dev); | ||
400 | if (ret) | ||
401 | goto error_free_gpio; | ||
402 | |||
403 | if (spi_dev->irq) { | 399 | if (spi_dev->irq) { |
404 | /* Only low trigger is supported in ad7816/7/8 */ | 400 | /* Only low trigger is supported in ad7816/7/8 */ |
405 | ret = request_threaded_irq(spi_dev->irq, | 401 | ret = request_threaded_irq(spi_dev->irq, |
@@ -409,16 +405,19 @@ static int __devinit ad7816_probe(struct spi_device *spi_dev) | |||
409 | indio_dev->name, | 405 | indio_dev->name, |
410 | indio_dev); | 406 | indio_dev); |
411 | if (ret) | 407 | if (ret) |
412 | goto error_unreg_dev; | 408 | goto error_free_gpio; |
413 | } | 409 | } |
414 | 410 | ||
411 | ret = iio_device_register(indio_dev); | ||
412 | if (ret) | ||
413 | goto error_free_irq; | ||
414 | |||
415 | dev_info(&spi_dev->dev, "%s temperature sensor and ADC registered.\n", | 415 | dev_info(&spi_dev->dev, "%s temperature sensor and ADC registered.\n", |
416 | indio_dev->name); | 416 | indio_dev->name); |
417 | 417 | ||
418 | return 0; | 418 | return 0; |
419 | 419 | error_free_irq: | |
420 | error_unreg_dev: | 420 | free_irq(spi_dev->irq, indio_dev); |
421 | iio_device_unregister(indio_dev); | ||
422 | error_free_gpio: | 421 | error_free_gpio: |
423 | gpio_free(chip->busy_pin); | 422 | gpio_free(chip->busy_pin); |
424 | error_free_gpio_convert: | 423 | error_free_gpio_convert: |
diff --git a/drivers/staging/iio/adc/ad7887_core.c b/drivers/staging/iio/adc/ad7887_core.c index e71d0884901..cdd7c130aa1 100644 --- a/drivers/staging/iio/adc/ad7887_core.c +++ b/drivers/staging/iio/adc/ad7887_core.c | |||
@@ -93,7 +93,7 @@ static int __devinit ad7887_probe(struct spi_device *spi) | |||
93 | { | 93 | { |
94 | struct ad7887_platform_data *pdata = spi->dev.platform_data; | 94 | struct ad7887_platform_data *pdata = spi->dev.platform_data; |
95 | struct ad7887_state *st; | 95 | struct ad7887_state *st; |
96 | int ret, voltage_uv = 0, regdone = 0; | 96 | int ret, voltage_uv = 0; |
97 | struct iio_dev *indio_dev = iio_allocate_device(sizeof(*st)); | 97 | struct iio_dev *indio_dev = iio_allocate_device(sizeof(*st)); |
98 | 98 | ||
99 | if (indio_dev == NULL) | 99 | if (indio_dev == NULL) |
@@ -189,18 +189,19 @@ static int __devinit ad7887_probe(struct spi_device *spi) | |||
189 | if (ret) | 189 | if (ret) |
190 | goto error_disable_reg; | 190 | goto error_disable_reg; |
191 | 191 | ||
192 | ret = iio_device_register(indio_dev); | ||
193 | if (ret) | ||
194 | goto error_disable_reg; | ||
195 | regdone = 1; | ||
196 | |||
197 | ret = iio_ring_buffer_register(indio_dev, | 192 | ret = iio_ring_buffer_register(indio_dev, |
198 | indio_dev->channels, | 193 | indio_dev->channels, |
199 | indio_dev->num_channels); | 194 | indio_dev->num_channels); |
200 | if (ret) | 195 | if (ret) |
201 | goto error_cleanup_ring; | 196 | goto error_cleanup_ring; |
202 | return 0; | ||
203 | 197 | ||
198 | ret = iio_device_register(indio_dev); | ||
199 | if (ret) | ||
200 | goto error_unregister_ring; | ||
201 | |||
202 | return 0; | ||
203 | error_unregister_ring: | ||
204 | iio_ring_buffer_unregister(indio_dev); | ||
204 | error_cleanup_ring: | 205 | error_cleanup_ring: |
205 | ad7887_ring_cleanup(indio_dev); | 206 | ad7887_ring_cleanup(indio_dev); |
206 | error_disable_reg: | 207 | error_disable_reg: |
@@ -209,10 +210,7 @@ error_disable_reg: | |||
209 | error_put_reg: | 210 | error_put_reg: |
210 | if (!IS_ERR(st->reg)) | 211 | if (!IS_ERR(st->reg)) |
211 | regulator_put(st->reg); | 212 | regulator_put(st->reg); |
212 | if (regdone) | 213 | iio_free_device(indio_dev); |
213 | iio_device_unregister(indio_dev); | ||
214 | else | ||
215 | iio_free_device(indio_dev); | ||
216 | 214 | ||
217 | return ret; | 215 | return ret; |
218 | } | 216 | } |
diff --git a/drivers/staging/iio/adc/ad799x_core.c b/drivers/staging/iio/adc/ad799x_core.c index cfe4b2caea8..75b8c37ca1e 100644 --- a/drivers/staging/iio/adc/ad799x_core.c +++ b/drivers/staging/iio/adc/ad799x_core.c | |||
@@ -657,7 +657,7 @@ static const struct ad799x_chip_info ad799x_chip_info_tbl[] = { | |||
657 | static int __devinit ad799x_probe(struct i2c_client *client, | 657 | static int __devinit ad799x_probe(struct i2c_client *client, |
658 | const struct i2c_device_id *id) | 658 | const struct i2c_device_id *id) |
659 | { | 659 | { |
660 | int ret, regdone = 0; | 660 | int ret; |
661 | struct ad799x_platform_data *pdata = client->dev.platform_data; | 661 | struct ad799x_platform_data *pdata = client->dev.platform_data; |
662 | struct ad799x_state *st; | 662 | struct ad799x_state *st; |
663 | struct iio_dev *indio_dev = iio_allocate_device(sizeof(*st)); | 663 | struct iio_dev *indio_dev = iio_allocate_device(sizeof(*st)); |
@@ -701,11 +701,6 @@ static int __devinit ad799x_probe(struct i2c_client *client, | |||
701 | if (ret) | 701 | if (ret) |
702 | goto error_disable_reg; | 702 | goto error_disable_reg; |
703 | 703 | ||
704 | ret = iio_device_register(indio_dev); | ||
705 | if (ret) | ||
706 | goto error_cleanup_ring; | ||
707 | regdone = 1; | ||
708 | |||
709 | ret = iio_ring_buffer_register(indio_dev, | 704 | ret = iio_ring_buffer_register(indio_dev, |
710 | indio_dev->channels, | 705 | indio_dev->channels, |
711 | indio_dev->num_channels); | 706 | indio_dev->num_channels); |
@@ -723,9 +718,14 @@ static int __devinit ad799x_probe(struct i2c_client *client, | |||
723 | if (ret) | 718 | if (ret) |
724 | goto error_cleanup_ring; | 719 | goto error_cleanup_ring; |
725 | } | 720 | } |
721 | ret = iio_device_register(indio_dev); | ||
722 | if (ret) | ||
723 | goto error_free_irq; | ||
726 | 724 | ||
727 | return 0; | 725 | return 0; |
728 | 726 | ||
727 | error_free_irq: | ||
728 | free_irq(client->irq, indio_dev); | ||
729 | error_cleanup_ring: | 729 | error_cleanup_ring: |
730 | ad799x_ring_cleanup(indio_dev); | 730 | ad799x_ring_cleanup(indio_dev); |
731 | error_disable_reg: | 731 | error_disable_reg: |
@@ -734,10 +734,7 @@ error_disable_reg: | |||
734 | error_put_reg: | 734 | error_put_reg: |
735 | if (!IS_ERR(st->reg)) | 735 | if (!IS_ERR(st->reg)) |
736 | regulator_put(st->reg); | 736 | regulator_put(st->reg); |
737 | if (regdone) | 737 | iio_free_device(indio_dev); |
738 | iio_device_unregister(indio_dev); | ||
739 | else | ||
740 | iio_free_device(indio_dev); | ||
741 | 738 | ||
742 | return ret; | 739 | return ret; |
743 | } | 740 | } |
diff --git a/drivers/staging/iio/adc/adt7310.c b/drivers/staging/iio/adc/adt7310.c index edc65c517f6..cbbd34922d4 100644 --- a/drivers/staging/iio/adc/adt7310.c +++ b/drivers/staging/iio/adc/adt7310.c | |||
@@ -782,10 +782,6 @@ static int __devinit adt7310_probe(struct spi_device *spi_dev) | |||
782 | indio_dev->info = &adt7310_info; | 782 | indio_dev->info = &adt7310_info; |
783 | indio_dev->modes = INDIO_DIRECT_MODE; | 783 | indio_dev->modes = INDIO_DIRECT_MODE; |
784 | 784 | ||
785 | ret = iio_device_register(indio_dev); | ||
786 | if (ret) | ||
787 | goto error_free_dev; | ||
788 | |||
789 | /* CT critcal temperature event. line 0 */ | 785 | /* CT critcal temperature event. line 0 */ |
790 | if (spi_dev->irq) { | 786 | if (spi_dev->irq) { |
791 | if (adt7310_platform_data[2]) | 787 | if (adt7310_platform_data[2]) |
@@ -799,7 +795,7 @@ static int __devinit adt7310_probe(struct spi_device *spi_dev) | |||
799 | indio_dev->name, | 795 | indio_dev->name, |
800 | indio_dev); | 796 | indio_dev); |
801 | if (ret) | 797 | if (ret) |
802 | goto error_unreg_dev; | 798 | goto error_free_dev; |
803 | } | 799 | } |
804 | 800 | ||
805 | /* INT bound temperature alarm event. line 1 */ | 801 | /* INT bound temperature alarm event. line 1 */ |
@@ -836,6 +832,10 @@ static int __devinit adt7310_probe(struct spi_device *spi_dev) | |||
836 | } | 832 | } |
837 | } | 833 | } |
838 | 834 | ||
835 | ret = iio_device_register(indio_dev); | ||
836 | if (ret) | ||
837 | goto error_unreg_int_irq; | ||
838 | |||
839 | dev_info(&spi_dev->dev, "%s temperature sensor registered.\n", | 839 | dev_info(&spi_dev->dev, "%s temperature sensor registered.\n", |
840 | indio_dev->name); | 840 | indio_dev->name); |
841 | 841 | ||
@@ -845,8 +845,6 @@ error_unreg_int_irq: | |||
845 | free_irq(adt7310_platform_data[0], indio_dev); | 845 | free_irq(adt7310_platform_data[0], indio_dev); |
846 | error_unreg_ct_irq: | 846 | error_unreg_ct_irq: |
847 | free_irq(spi_dev->irq, indio_dev); | 847 | free_irq(spi_dev->irq, indio_dev); |
848 | error_unreg_dev: | ||
849 | iio_device_unregister(indio_dev); | ||
850 | error_free_dev: | 848 | error_free_dev: |
851 | iio_free_device(indio_dev); | 849 | iio_free_device(indio_dev); |
852 | error_ret: | 850 | error_ret: |
diff --git a/drivers/staging/iio/adc/adt7410.c b/drivers/staging/iio/adc/adt7410.c index e7e9e25d1e9..cc913bc3510 100644 --- a/drivers/staging/iio/adc/adt7410.c +++ b/drivers/staging/iio/adc/adt7410.c | |||
@@ -749,10 +749,6 @@ static int __devinit adt7410_probe(struct i2c_client *client, | |||
749 | indio_dev->info = &adt7410_info; | 749 | indio_dev->info = &adt7410_info; |
750 | indio_dev->modes = INDIO_DIRECT_MODE; | 750 | indio_dev->modes = INDIO_DIRECT_MODE; |
751 | 751 | ||
752 | ret = iio_device_register(indio_dev); | ||
753 | if (ret) | ||
754 | goto error_free_dev; | ||
755 | |||
756 | /* CT critcal temperature event. line 0 */ | 752 | /* CT critcal temperature event. line 0 */ |
757 | if (client->irq) { | 753 | if (client->irq) { |
758 | ret = request_threaded_irq(client->irq, | 754 | ret = request_threaded_irq(client->irq, |
@@ -762,7 +758,7 @@ static int __devinit adt7410_probe(struct i2c_client *client, | |||
762 | id->name, | 758 | id->name, |
763 | indio_dev); | 759 | indio_dev); |
764 | if (ret) | 760 | if (ret) |
765 | goto error_unreg_dev; | 761 | goto error_free_dev; |
766 | } | 762 | } |
767 | 763 | ||
768 | /* INT bound temperature alarm event. line 1 */ | 764 | /* INT bound temperature alarm event. line 1 */ |
@@ -799,6 +795,9 @@ static int __devinit adt7410_probe(struct i2c_client *client, | |||
799 | goto error_unreg_int_irq; | 795 | goto error_unreg_int_irq; |
800 | } | 796 | } |
801 | } | 797 | } |
798 | ret = iio_device_register(indio_dev); | ||
799 | if (ret) | ||
800 | goto error_unreg_int_irq; | ||
802 | 801 | ||
803 | dev_info(&client->dev, "%s temperature sensor registered.\n", | 802 | dev_info(&client->dev, "%s temperature sensor registered.\n", |
804 | id->name); | 803 | id->name); |
@@ -809,8 +808,6 @@ error_unreg_int_irq: | |||
809 | free_irq(adt7410_platform_data[0], indio_dev); | 808 | free_irq(adt7410_platform_data[0], indio_dev); |
810 | error_unreg_ct_irq: | 809 | error_unreg_ct_irq: |
811 | free_irq(client->irq, indio_dev); | 810 | free_irq(client->irq, indio_dev); |
812 | error_unreg_dev: | ||
813 | iio_device_unregister(indio_dev); | ||
814 | error_free_dev: | 811 | error_free_dev: |
815 | iio_free_device(indio_dev); | 812 | iio_free_device(indio_dev); |
816 | error_ret: | 813 | error_ret: |
diff --git a/drivers/staging/iio/adc/adt75.c b/drivers/staging/iio/adc/adt75.c index b56bfcdb337..08215e9edc8 100644 --- a/drivers/staging/iio/adc/adt75.c +++ b/drivers/staging/iio/adc/adt75.c | |||
@@ -567,10 +567,6 @@ static int __devinit adt75_probe(struct i2c_client *client, | |||
567 | indio_dev->info = &adt75_info; | 567 | indio_dev->info = &adt75_info; |
568 | indio_dev->modes = INDIO_DIRECT_MODE; | 568 | indio_dev->modes = INDIO_DIRECT_MODE; |
569 | 569 | ||
570 | ret = iio_device_register(indio_dev); | ||
571 | if (ret) | ||
572 | goto error_free_dev; | ||
573 | |||
574 | if (client->irq > 0) { | 570 | if (client->irq > 0) { |
575 | ret = request_threaded_irq(client->irq, | 571 | ret = request_threaded_irq(client->irq, |
576 | NULL, | 572 | NULL, |
@@ -579,7 +575,7 @@ static int __devinit adt75_probe(struct i2c_client *client, | |||
579 | indio_dev->name, | 575 | indio_dev->name, |
580 | indio_dev); | 576 | indio_dev); |
581 | if (ret) | 577 | if (ret) |
582 | goto error_unreg_dev; | 578 | goto error_free_dev; |
583 | 579 | ||
584 | ret = adt75_i2c_read(indio_dev, ADT75_CONFIG, &chip->config); | 580 | ret = adt75_i2c_read(indio_dev, ADT75_CONFIG, &chip->config); |
585 | if (ret) { | 581 | if (ret) { |
@@ -597,14 +593,16 @@ static int __devinit adt75_probe(struct i2c_client *client, | |||
597 | } | 593 | } |
598 | } | 594 | } |
599 | 595 | ||
596 | ret = iio_device_register(indio_dev); | ||
597 | if (ret) | ||
598 | goto error_unreg_irq; | ||
599 | |||
600 | dev_info(&client->dev, "%s temperature sensor registered.\n", | 600 | dev_info(&client->dev, "%s temperature sensor registered.\n", |
601 | indio_dev->name); | 601 | indio_dev->name); |
602 | 602 | ||
603 | return 0; | 603 | return 0; |
604 | error_unreg_irq: | 604 | error_unreg_irq: |
605 | free_irq(client->irq, indio_dev); | 605 | free_irq(client->irq, indio_dev); |
606 | error_unreg_dev: | ||
607 | iio_device_unregister(indio_dev); | ||
608 | error_free_dev: | 606 | error_free_dev: |
609 | iio_free_device(indio_dev); | 607 | iio_free_device(indio_dev); |
610 | error_ret: | 608 | error_ret: |
diff --git a/drivers/staging/iio/adc/max1363_core.c b/drivers/staging/iio/adc/max1363_core.c index adbd89b9a57..9962f594d3a 100644 --- a/drivers/staging/iio/adc/max1363_core.c +++ b/drivers/staging/iio/adc/max1363_core.c | |||
@@ -1254,7 +1254,7 @@ static int max1363_initial_setup(struct max1363_state *st) | |||
1254 | static int __devinit max1363_probe(struct i2c_client *client, | 1254 | static int __devinit max1363_probe(struct i2c_client *client, |
1255 | const struct i2c_device_id *id) | 1255 | const struct i2c_device_id *id) |
1256 | { | 1256 | { |
1257 | int ret, i, regdone = 0; | 1257 | int ret, i; |
1258 | struct max1363_state *st; | 1258 | struct max1363_state *st; |
1259 | struct iio_dev *indio_dev; | 1259 | struct iio_dev *indio_dev; |
1260 | struct regulator *reg; | 1260 | struct regulator *reg; |
@@ -1312,10 +1312,6 @@ static int __devinit max1363_probe(struct i2c_client *client, | |||
1312 | if (ret) | 1312 | if (ret) |
1313 | goto error_free_available_scan_masks; | 1313 | goto error_free_available_scan_masks; |
1314 | 1314 | ||
1315 | ret = iio_device_register(indio_dev); | ||
1316 | if (ret) | ||
1317 | goto error_cleanup_ring; | ||
1318 | regdone = 1; | ||
1319 | ret = iio_ring_buffer_register(indio_dev, | 1315 | ret = iio_ring_buffer_register(indio_dev, |
1320 | st->chip_info->channels, | 1316 | st->chip_info->channels, |
1321 | st->chip_info->num_channels); | 1317 | st->chip_info->num_channels); |
@@ -1334,8 +1330,13 @@ static int __devinit max1363_probe(struct i2c_client *client, | |||
1334 | goto error_uninit_ring; | 1330 | goto error_uninit_ring; |
1335 | } | 1331 | } |
1336 | 1332 | ||
1337 | return 0; | 1333 | ret = iio_device_register(indio_dev); |
1334 | if (ret < 0) | ||
1335 | goto error_free_irq; | ||
1338 | 1336 | ||
1337 | return 0; | ||
1338 | error_free_irq: | ||
1339 | free_irq(st->client->irq, indio_dev); | ||
1339 | error_uninit_ring: | 1340 | error_uninit_ring: |
1340 | iio_ring_buffer_unregister(indio_dev); | 1341 | iio_ring_buffer_unregister(indio_dev); |
1341 | error_cleanup_ring: | 1342 | error_cleanup_ring: |
@@ -1343,10 +1344,7 @@ error_cleanup_ring: | |||
1343 | error_free_available_scan_masks: | 1344 | error_free_available_scan_masks: |
1344 | kfree(indio_dev->available_scan_masks); | 1345 | kfree(indio_dev->available_scan_masks); |
1345 | error_free_device: | 1346 | error_free_device: |
1346 | if (!regdone) | 1347 | iio_free_device(indio_dev); |
1347 | iio_free_device(indio_dev); | ||
1348 | else | ||
1349 | iio_device_unregister(indio_dev); | ||
1350 | error_disable_reg: | 1348 | error_disable_reg: |
1351 | regulator_disable(reg); | 1349 | regulator_disable(reg); |
1352 | error_put_reg: | 1350 | error_put_reg: |
diff --git a/drivers/staging/iio/addac/adt7316.c b/drivers/staging/iio/addac/adt7316.c index e60a9d65821..17b6c1332ae 100644 --- a/drivers/staging/iio/addac/adt7316.c +++ b/drivers/staging/iio/addac/adt7316.c | |||
@@ -2167,10 +2167,6 @@ int __devinit adt7316_probe(struct device *dev, struct adt7316_bus *bus, | |||
2167 | indio_dev->name = name; | 2167 | indio_dev->name = name; |
2168 | indio_dev->modes = INDIO_DIRECT_MODE; | 2168 | indio_dev->modes = INDIO_DIRECT_MODE; |
2169 | 2169 | ||
2170 | ret = iio_device_register(indio_dev); | ||
2171 | if (ret) | ||
2172 | goto error_free_dev; | ||
2173 | |||
2174 | if (chip->bus.irq > 0) { | 2170 | if (chip->bus.irq > 0) { |
2175 | if (adt7316_platform_data[0]) | 2171 | if (adt7316_platform_data[0]) |
2176 | chip->bus.irq_flags = adt7316_platform_data[0]; | 2172 | chip->bus.irq_flags = adt7316_platform_data[0]; |
@@ -2182,7 +2178,7 @@ int __devinit adt7316_probe(struct device *dev, struct adt7316_bus *bus, | |||
2182 | indio_dev->name, | 2178 | indio_dev->name, |
2183 | indio_dev); | 2179 | indio_dev); |
2184 | if (ret) | 2180 | if (ret) |
2185 | goto error_unreg_dev; | 2181 | goto error_free_dev; |
2186 | 2182 | ||
2187 | if (chip->bus.irq_flags & IRQF_TRIGGER_HIGH) | 2183 | if (chip->bus.irq_flags & IRQF_TRIGGER_HIGH) |
2188 | chip->config1 |= ADT7316_INT_POLARITY; | 2184 | chip->config1 |= ADT7316_INT_POLARITY; |
@@ -2200,6 +2196,10 @@ int __devinit adt7316_probe(struct device *dev, struct adt7316_bus *bus, | |||
2200 | goto error_unreg_irq; | 2196 | goto error_unreg_irq; |
2201 | } | 2197 | } |
2202 | 2198 | ||
2199 | ret = iio_device_register(indio_dev); | ||
2200 | if (ret) | ||
2201 | goto error_unreg_irq; | ||
2202 | |||
2203 | dev_info(dev, "%s temperature sensor, ADC and DAC registered.\n", | 2203 | dev_info(dev, "%s temperature sensor, ADC and DAC registered.\n", |
2204 | indio_dev->name); | 2204 | indio_dev->name); |
2205 | 2205 | ||
@@ -2207,8 +2207,6 @@ int __devinit adt7316_probe(struct device *dev, struct adt7316_bus *bus, | |||
2207 | 2207 | ||
2208 | error_unreg_irq: | 2208 | error_unreg_irq: |
2209 | free_irq(chip->bus.irq, indio_dev); | 2209 | free_irq(chip->bus.irq, indio_dev); |
2210 | error_unreg_dev: | ||
2211 | iio_device_unregister(indio_dev); | ||
2212 | error_free_dev: | 2210 | error_free_dev: |
2213 | iio_free_device(indio_dev); | 2211 | iio_free_device(indio_dev); |
2214 | error_ret: | 2212 | error_ret: |
@@ -2221,7 +2219,6 @@ int __devexit adt7316_remove(struct device *dev) | |||
2221 | struct iio_dev *indio_dev = dev_get_drvdata(dev); | 2219 | struct iio_dev *indio_dev = dev_get_drvdata(dev); |
2222 | struct adt7316_chip_info *chip = iio_priv(indio_dev); | 2220 | struct adt7316_chip_info *chip = iio_priv(indio_dev); |
2223 | 2221 | ||
2224 | dev_set_drvdata(dev, NULL); | ||
2225 | if (chip->bus.irq) | 2222 | if (chip->bus.irq) |
2226 | free_irq(chip->bus.irq, indio_dev); | 2223 | free_irq(chip->bus.irq, indio_dev); |
2227 | iio_device_unregister(indio_dev); | 2224 | iio_device_unregister(indio_dev); |
diff --git a/drivers/staging/iio/dac/ad5504.c b/drivers/staging/iio/dac/ad5504.c index 9a421f2aceb..c528dff5b5b 100644 --- a/drivers/staging/iio/dac/ad5504.c +++ b/drivers/staging/iio/dac/ad5504.c | |||
@@ -282,6 +282,11 @@ static int __devinit ad5504_probe(struct spi_device *spi) | |||
282 | struct regulator *reg; | 282 | struct regulator *reg; |
283 | int ret, voltage_uv = 0; | 283 | int ret, voltage_uv = 0; |
284 | 284 | ||
285 | indio_dev = iio_allocate_device(sizeof(*st)); | ||
286 | if (indio_dev == NULL) { | ||
287 | ret = -ENOMEM; | ||
288 | goto error_ret; | ||
289 | } | ||
285 | reg = regulator_get(&spi->dev, "vcc"); | 290 | reg = regulator_get(&spi->dev, "vcc"); |
286 | if (!IS_ERR(reg)) { | 291 | if (!IS_ERR(reg)) { |
287 | ret = regulator_enable(reg); | 292 | ret = regulator_enable(reg); |
@@ -291,11 +296,6 @@ static int __devinit ad5504_probe(struct spi_device *spi) | |||
291 | voltage_uv = regulator_get_voltage(reg); | 296 | voltage_uv = regulator_get_voltage(reg); |
292 | } | 297 | } |
293 | 298 | ||
294 | indio_dev = iio_allocate_device(sizeof(*st)); | ||
295 | if (indio_dev == NULL) { | ||
296 | ret = -ENOMEM; | ||
297 | goto error_disable_reg; | ||
298 | } | ||
299 | spi_set_drvdata(spi, indio_dev); | 299 | spi_set_drvdata(spi, indio_dev); |
300 | st = iio_priv(indio_dev); | 300 | st = iio_priv(indio_dev); |
301 | if (voltage_uv) | 301 | if (voltage_uv) |
@@ -315,10 +315,6 @@ static int __devinit ad5504_probe(struct spi_device *spi) | |||
315 | indio_dev->info = &ad5504_info; | 315 | indio_dev->info = &ad5504_info; |
316 | indio_dev->modes = INDIO_DIRECT_MODE; | 316 | indio_dev->modes = INDIO_DIRECT_MODE; |
317 | 317 | ||
318 | ret = iio_device_register(indio_dev); | ||
319 | if (ret) | ||
320 | goto error_free_dev; | ||
321 | |||
322 | if (spi->irq) { | 318 | if (spi->irq) { |
323 | ret = request_threaded_irq(spi->irq, | 319 | ret = request_threaded_irq(spi->irq, |
324 | NULL, | 320 | NULL, |
@@ -327,15 +323,17 @@ static int __devinit ad5504_probe(struct spi_device *spi) | |||
327 | spi_get_device_id(st->spi)->name, | 323 | spi_get_device_id(st->spi)->name, |
328 | indio_dev); | 324 | indio_dev); |
329 | if (ret) | 325 | if (ret) |
330 | goto error_unreg_iio_device; | 326 | goto error_disable_reg; |
331 | } | 327 | } |
332 | 328 | ||
329 | ret = iio_device_register(indio_dev); | ||
330 | if (ret) | ||
331 | goto error_free_irq; | ||
332 | |||
333 | return 0; | 333 | return 0; |
334 | 334 | ||
335 | error_unreg_iio_device: | 335 | error_free_irq: |
336 | iio_device_unregister(indio_dev); | 336 | free_irq(spi->irq, indio_dev); |
337 | error_free_dev: | ||
338 | iio_free_device(indio_dev); | ||
339 | error_disable_reg: | 337 | error_disable_reg: |
340 | if (!IS_ERR(reg)) | 338 | if (!IS_ERR(reg)) |
341 | regulator_disable(reg); | 339 | regulator_disable(reg); |
@@ -343,6 +341,8 @@ error_put_reg: | |||
343 | if (!IS_ERR(reg)) | 341 | if (!IS_ERR(reg)) |
344 | regulator_put(reg); | 342 | regulator_put(reg); |
345 | 343 | ||
344 | iio_free_device(indio_dev); | ||
345 | error_ret: | ||
346 | return ret; | 346 | return ret; |
347 | } | 347 | } |
348 | 348 | ||
@@ -350,17 +350,17 @@ static int __devexit ad5504_remove(struct spi_device *spi) | |||
350 | { | 350 | { |
351 | struct iio_dev *indio_dev = spi_get_drvdata(spi); | 351 | struct iio_dev *indio_dev = spi_get_drvdata(spi); |
352 | struct ad5504_state *st = iio_priv(indio_dev); | 352 | struct ad5504_state *st = iio_priv(indio_dev); |
353 | struct regulator *reg = st->reg; | 353 | |
354 | if (spi->irq) | 354 | if (spi->irq) |
355 | free_irq(spi->irq, indio_dev); | 355 | free_irq(spi->irq, indio_dev); |
356 | 356 | ||
357 | iio_device_unregister(indio_dev); | 357 | if (!IS_ERR(st->reg)) { |
358 | 358 | regulator_disable(st->reg); | |
359 | if (!IS_ERR(reg)) { | 359 | regulator_put(st->reg); |
360 | regulator_disable(reg); | ||
361 | regulator_put(reg); | ||
362 | } | 360 | } |
363 | 361 | ||
362 | iio_device_unregister(indio_dev); | ||
363 | |||
364 | return 0; | 364 | return 0; |
365 | } | 365 | } |
366 | 366 | ||
diff --git a/drivers/staging/iio/dac/ad5624r_spi.c b/drivers/staging/iio/dac/ad5624r_spi.c index 0f1d431c6fa..e5edf590f92 100644 --- a/drivers/staging/iio/dac/ad5624r_spi.c +++ b/drivers/staging/iio/dac/ad5624r_spi.c | |||
@@ -272,7 +272,6 @@ static int __devinit ad5624r_probe(struct spi_device *spi) | |||
272 | 272 | ||
273 | return 0; | 273 | return 0; |
274 | 274 | ||
275 | |||
276 | error_disable_reg: | 275 | error_disable_reg: |
277 | if (!IS_ERR(st->reg)) | 276 | if (!IS_ERR(st->reg)) |
278 | regulator_disable(st->reg); | 277 | regulator_disable(st->reg); |
diff --git a/drivers/staging/iio/dac/ad5686.c b/drivers/staging/iio/dac/ad5686.c index c32789f1c15..6e768206a87 100644 --- a/drivers/staging/iio/dac/ad5686.c +++ b/drivers/staging/iio/dac/ad5686.c | |||
@@ -393,16 +393,16 @@ static int __devinit ad5686_probe(struct spi_device *spi) | |||
393 | indio_dev->channels = st->chip_info->channel; | 393 | indio_dev->channels = st->chip_info->channel; |
394 | indio_dev->num_channels = AD5686_DAC_CHANNELS; | 394 | indio_dev->num_channels = AD5686_DAC_CHANNELS; |
395 | 395 | ||
396 | ret = iio_device_register(indio_dev); | ||
397 | if (ret) | ||
398 | goto error_disable_reg; | ||
399 | |||
400 | regdone = 1; | 396 | regdone = 1; |
401 | ret = ad5686_spi_write(st, AD5686_CMD_INTERNAL_REFER_SETUP, 0, | 397 | ret = ad5686_spi_write(st, AD5686_CMD_INTERNAL_REFER_SETUP, 0, |
402 | !!voltage_uv, 0); | 398 | !!voltage_uv, 0); |
403 | if (ret) | 399 | if (ret) |
404 | goto error_disable_reg; | 400 | goto error_disable_reg; |
405 | 401 | ||
402 | ret = iio_device_register(indio_dev); | ||
403 | if (ret) | ||
404 | goto error_disable_reg; | ||
405 | |||
406 | return 0; | 406 | return 0; |
407 | 407 | ||
408 | error_disable_reg: | 408 | error_disable_reg: |
@@ -412,10 +412,7 @@ error_put_reg: | |||
412 | if (!IS_ERR(st->reg)) | 412 | if (!IS_ERR(st->reg)) |
413 | regulator_put(st->reg); | 413 | regulator_put(st->reg); |
414 | 414 | ||
415 | if (regdone) | 415 | iio_free_device(indio_dev); |
416 | iio_device_unregister(indio_dev); | ||
417 | else | ||
418 | iio_free_device(indio_dev); | ||
419 | 416 | ||
420 | return ret; | 417 | return ret; |
421 | } | 418 | } |
diff --git a/drivers/staging/iio/dac/ad5791.c b/drivers/staging/iio/dac/ad5791.c index 5a5de973139..74f54068724 100644 --- a/drivers/staging/iio/dac/ad5791.c +++ b/drivers/staging/iio/dac/ad5791.c | |||
@@ -396,6 +396,8 @@ static int __devexit ad5791_remove(struct spi_device *spi) | |||
396 | } | 396 | } |
397 | iio_device_unregister(indio_dev); | 397 | iio_device_unregister(indio_dev); |
398 | 398 | ||
399 | iio_device_unregister(indio_dev); | ||
400 | |||
399 | return 0; | 401 | return 0; |
400 | } | 402 | } |
401 | 403 | ||
diff --git a/drivers/staging/iio/gyro/adis16060_core.c b/drivers/staging/iio/gyro/adis16060_core.c index 3f5087329e5..481080588b1 100644 --- a/drivers/staging/iio/gyro/adis16060_core.c +++ b/drivers/staging/iio/gyro/adis16060_core.c | |||
@@ -143,7 +143,7 @@ static const struct iio_chan_spec adis16060_channels[] = { | |||
143 | 143 | ||
144 | static int __devinit adis16060_r_probe(struct spi_device *spi) | 144 | static int __devinit adis16060_r_probe(struct spi_device *spi) |
145 | { | 145 | { |
146 | int ret, regdone = 0; | 146 | int ret; |
147 | struct adis16060_state *st; | 147 | struct adis16060_state *st; |
148 | struct iio_dev *indio_dev; | 148 | struct iio_dev *indio_dev; |
149 | 149 | ||
@@ -169,16 +169,12 @@ static int __devinit adis16060_r_probe(struct spi_device *spi) | |||
169 | ret = iio_device_register(indio_dev); | 169 | ret = iio_device_register(indio_dev); |
170 | if (ret) | 170 | if (ret) |
171 | goto error_free_dev; | 171 | goto error_free_dev; |
172 | regdone = 1; | ||
173 | 172 | ||
174 | adis16060_iio_dev = indio_dev; | 173 | adis16060_iio_dev = indio_dev; |
175 | return 0; | 174 | return 0; |
176 | 175 | ||
177 | error_free_dev: | 176 | error_free_dev: |
178 | if (regdone) | 177 | iio_free_device(indio_dev); |
179 | iio_device_unregister(indio_dev); | ||
180 | else | ||
181 | iio_free_device(indio_dev); | ||
182 | error_ret: | 178 | error_ret: |
183 | return ret; | 179 | return ret; |
184 | } | 180 | } |
diff --git a/drivers/staging/iio/gyro/adis16080_core.c b/drivers/staging/iio/gyro/adis16080_core.c index 16ba0e11e44..826f8f1db0d 100644 --- a/drivers/staging/iio/gyro/adis16080_core.c +++ b/drivers/staging/iio/gyro/adis16080_core.c | |||
@@ -137,7 +137,7 @@ static const struct iio_info adis16080_info = { | |||
137 | 137 | ||
138 | static int __devinit adis16080_probe(struct spi_device *spi) | 138 | static int __devinit adis16080_probe(struct spi_device *spi) |
139 | { | 139 | { |
140 | int ret, regdone = 0; | 140 | int ret; |
141 | struct adis16080_state *st; | 141 | struct adis16080_state *st; |
142 | struct iio_dev *indio_dev; | 142 | struct iio_dev *indio_dev; |
143 | 143 | ||
@@ -165,15 +165,10 @@ static int __devinit adis16080_probe(struct spi_device *spi) | |||
165 | ret = iio_device_register(indio_dev); | 165 | ret = iio_device_register(indio_dev); |
166 | if (ret) | 166 | if (ret) |
167 | goto error_free_dev; | 167 | goto error_free_dev; |
168 | regdone = 1; | ||
169 | |||
170 | return 0; | 168 | return 0; |
171 | 169 | ||
172 | error_free_dev: | 170 | error_free_dev: |
173 | if (regdone) | 171 | iio_free_device(indio_dev); |
174 | iio_device_unregister(indio_dev); | ||
175 | else | ||
176 | iio_free_device(indio_dev); | ||
177 | error_ret: | 172 | error_ret: |
178 | return ret; | 173 | return ret; |
179 | } | 174 | } |
diff --git a/drivers/staging/iio/gyro/adis16260_core.c b/drivers/staging/iio/gyro/adis16260_core.c index acd17e50df5..73157b21252 100644 --- a/drivers/staging/iio/gyro/adis16260_core.c +++ b/drivers/staging/iio/gyro/adis16260_core.c | |||
@@ -577,7 +577,7 @@ static const struct iio_info adis16260_info = { | |||
577 | 577 | ||
578 | static int __devinit adis16260_probe(struct spi_device *spi) | 578 | static int __devinit adis16260_probe(struct spi_device *spi) |
579 | { | 579 | { |
580 | int ret, regdone = 0; | 580 | int ret; |
581 | struct adis16260_platform_data *pd = spi->dev.platform_data; | 581 | struct adis16260_platform_data *pd = spi->dev.platform_data; |
582 | struct adis16260_state *st; | 582 | struct adis16260_state *st; |
583 | struct iio_dev *indio_dev; | 583 | struct iio_dev *indio_dev; |
@@ -625,10 +625,6 @@ static int __devinit adis16260_probe(struct spi_device *spi) | |||
625 | if (ret) | 625 | if (ret) |
626 | goto error_free_dev; | 626 | goto error_free_dev; |
627 | 627 | ||
628 | ret = iio_device_register(indio_dev); | ||
629 | if (ret) | ||
630 | goto error_unreg_ring_funcs; | ||
631 | regdone = 1; | ||
632 | ret = iio_ring_buffer_register(indio_dev, | 628 | ret = iio_ring_buffer_register(indio_dev, |
633 | indio_dev->channels, | 629 | indio_dev->channels, |
634 | ARRAY_SIZE(adis16260_channels_x)); | 630 | ARRAY_SIZE(adis16260_channels_x)); |
@@ -654,6 +650,10 @@ static int __devinit adis16260_probe(struct spi_device *spi) | |||
654 | ret = adis16260_initial_setup(indio_dev); | 650 | ret = adis16260_initial_setup(indio_dev); |
655 | if (ret) | 651 | if (ret) |
656 | goto error_remove_trigger; | 652 | goto error_remove_trigger; |
653 | ret = iio_device_register(indio_dev); | ||
654 | if (ret) | ||
655 | goto error_remove_trigger; | ||
656 | |||
657 | return 0; | 657 | return 0; |
658 | 658 | ||
659 | error_remove_trigger: | 659 | error_remove_trigger: |
@@ -663,10 +663,7 @@ error_uninitialize_ring: | |||
663 | error_unreg_ring_funcs: | 663 | error_unreg_ring_funcs: |
664 | adis16260_unconfigure_ring(indio_dev); | 664 | adis16260_unconfigure_ring(indio_dev); |
665 | error_free_dev: | 665 | error_free_dev: |
666 | if (regdone) | 666 | iio_free_device(indio_dev); |
667 | iio_device_unregister(indio_dev); | ||
668 | else | ||
669 | iio_free_device(indio_dev); | ||
670 | error_ret: | 667 | error_ret: |
671 | return ret; | 668 | return ret; |
672 | } | 669 | } |
diff --git a/drivers/staging/iio/iio.h b/drivers/staging/iio/iio.h index fad88fcad7e..a59988fd836 100644 --- a/drivers/staging/iio/iio.h +++ b/drivers/staging/iio/iio.h | |||
@@ -283,9 +283,12 @@ struct iio_info { | |||
283 | * @num_channels: [DRIVER] number of chanels specified in @channels. | 283 | * @num_channels: [DRIVER] number of chanels specified in @channels. |
284 | * @channel_attr_list: [INTERN] keep track of automatically created channel | 284 | * @channel_attr_list: [INTERN] keep track of automatically created channel |
285 | * attributes | 285 | * attributes |
286 | * @chan_attr_group: [INTERN] group for all attrs in base directory | ||
286 | * @name: [DRIVER] name of the device. | 287 | * @name: [DRIVER] name of the device. |
287 | * @info: [DRIVER] callbacks and constant info from driver | 288 | * @info: [DRIVER] callbacks and constant info from driver |
288 | * @chrdev: [INTERN] associated character device | 289 | * @chrdev: [INTERN] associated character device |
290 | * @groups: [INTERN] attribute groups | ||
291 | * @groupcounter: [INTERN] index of next attribute group | ||
289 | **/ | 292 | **/ |
290 | struct iio_dev { | 293 | struct iio_dev { |
291 | int id; | 294 | int id; |
@@ -308,9 +311,13 @@ struct iio_dev { | |||
308 | int num_channels; | 311 | int num_channels; |
309 | 312 | ||
310 | struct list_head channel_attr_list; | 313 | struct list_head channel_attr_list; |
314 | struct attribute_group chan_attr_group; | ||
311 | const char *name; | 315 | const char *name; |
312 | const struct iio_info *info; | 316 | const struct iio_info *info; |
313 | struct cdev chrdev; | 317 | struct cdev chrdev; |
318 | #define IIO_MAX_GROUPS 6 | ||
319 | const struct attribute_group *groups[IIO_MAX_GROUPS + 1]; | ||
320 | int groupcounter; | ||
314 | }; | 321 | }; |
315 | 322 | ||
316 | /** | 323 | /** |
diff --git a/drivers/staging/iio/iio_core.h b/drivers/staging/iio/iio_core.h index d7eb0d81ee1..3a80dbf2220 100644 --- a/drivers/staging/iio/iio_core.h +++ b/drivers/staging/iio/iio_core.h | |||
@@ -14,7 +14,6 @@ | |||
14 | #define _IIO_CORE_H_ | 14 | #define _IIO_CORE_H_ |
15 | 15 | ||
16 | int __iio_add_chan_devattr(const char *postfix, | 16 | int __iio_add_chan_devattr(const char *postfix, |
17 | const char *group, | ||
18 | struct iio_chan_spec const *chan, | 17 | struct iio_chan_spec const *chan, |
19 | ssize_t (*func)(struct device *dev, | 18 | ssize_t (*func)(struct device *dev, |
20 | struct device_attribute *attr, | 19 | struct device_attribute *attr, |
diff --git a/drivers/staging/iio/impedance-analyzer/ad5933.c b/drivers/staging/iio/impedance-analyzer/ad5933.c index e199bbed75e..65399d1467c 100644 --- a/drivers/staging/iio/impedance-analyzer/ad5933.c +++ b/drivers/staging/iio/impedance-analyzer/ad5933.c | |||
@@ -675,7 +675,7 @@ static void ad5933_work(struct work_struct *work) | |||
675 | static int __devinit ad5933_probe(struct i2c_client *client, | 675 | static int __devinit ad5933_probe(struct i2c_client *client, |
676 | const struct i2c_device_id *id) | 676 | const struct i2c_device_id *id) |
677 | { | 677 | { |
678 | int ret, regdone = 0, voltage_uv = 0; | 678 | int ret, voltage_uv = 0; |
679 | struct ad5933_platform_data *pdata = client->dev.platform_data; | 679 | struct ad5933_platform_data *pdata = client->dev.platform_data; |
680 | struct ad5933_state *st; | 680 | struct ad5933_state *st; |
681 | struct iio_dev *indio_dev = iio_allocate_device(sizeof(*st)); | 681 | struct iio_dev *indio_dev = iio_allocate_device(sizeof(*st)); |
@@ -727,11 +727,6 @@ static int __devinit ad5933_probe(struct i2c_client *client, | |||
727 | if (ret) | 727 | if (ret) |
728 | goto error_disable_reg; | 728 | goto error_disable_reg; |
729 | 729 | ||
730 | ret = iio_device_register(indio_dev); | ||
731 | if (ret) | ||
732 | goto error_unreg_ring; | ||
733 | regdone = 1; | ||
734 | |||
735 | /* skip temp0_input, register in0_(real|imag)_raw */ | 730 | /* skip temp0_input, register in0_(real|imag)_raw */ |
736 | ret = iio_ring_buffer_register(indio_dev, &ad5933_channels[1], 2); | 731 | ret = iio_ring_buffer_register(indio_dev, &ad5933_channels[1], 2); |
737 | if (ret) | 732 | if (ret) |
@@ -745,6 +740,10 @@ static int __devinit ad5933_probe(struct i2c_client *client, | |||
745 | if (ret) | 740 | if (ret) |
746 | goto error_uninitialize_ring; | 741 | goto error_uninitialize_ring; |
747 | 742 | ||
743 | ret = iio_device_register(indio_dev); | ||
744 | if (ret) | ||
745 | goto error_uninitialize_ring; | ||
746 | |||
748 | return 0; | 747 | return 0; |
749 | 748 | ||
750 | error_uninitialize_ring: | 749 | error_uninitialize_ring: |
@@ -758,10 +757,7 @@ error_put_reg: | |||
758 | if (!IS_ERR(st->reg)) | 757 | if (!IS_ERR(st->reg)) |
759 | regulator_put(st->reg); | 758 | regulator_put(st->reg); |
760 | 759 | ||
761 | if (regdone) | 760 | iio_free_device(indio_dev); |
762 | iio_device_unregister(indio_dev); | ||
763 | else | ||
764 | iio_free_device(indio_dev); | ||
765 | 761 | ||
766 | return ret; | 762 | return ret; |
767 | } | 763 | } |
diff --git a/drivers/staging/iio/imu/adis16400_core.c b/drivers/staging/iio/imu/adis16400_core.c index 3e8fcd3354f..0fca3bf8ef3 100644 --- a/drivers/staging/iio/imu/adis16400_core.c +++ b/drivers/staging/iio/imu/adis16400_core.c | |||
@@ -821,7 +821,7 @@ static const struct iio_info adis16400_info = { | |||
821 | 821 | ||
822 | static int __devinit adis16400_probe(struct spi_device *spi) | 822 | static int __devinit adis16400_probe(struct spi_device *spi) |
823 | { | 823 | { |
824 | int ret, regdone = 0; | 824 | int ret; |
825 | struct adis16400_state *st; | 825 | struct adis16400_state *st; |
826 | struct iio_dev *indio_dev = iio_allocate_device(sizeof(*st)); | 826 | struct iio_dev *indio_dev = iio_allocate_device(sizeof(*st)); |
827 | if (indio_dev == NULL) { | 827 | if (indio_dev == NULL) { |
@@ -848,11 +848,6 @@ static int __devinit adis16400_probe(struct spi_device *spi) | |||
848 | if (ret) | 848 | if (ret) |
849 | goto error_free_dev; | 849 | goto error_free_dev; |
850 | 850 | ||
851 | ret = iio_device_register(indio_dev); | ||
852 | if (ret) | ||
853 | goto error_unreg_ring_funcs; | ||
854 | regdone = 1; | ||
855 | |||
856 | ret = iio_ring_buffer_register(indio_dev, | 851 | ret = iio_ring_buffer_register(indio_dev, |
857 | st->variant->channels, | 852 | st->variant->channels, |
858 | st->variant->num_channels); | 853 | st->variant->num_channels); |
@@ -871,6 +866,10 @@ static int __devinit adis16400_probe(struct spi_device *spi) | |||
871 | ret = adis16400_initial_setup(indio_dev); | 866 | ret = adis16400_initial_setup(indio_dev); |
872 | if (ret) | 867 | if (ret) |
873 | goto error_remove_trigger; | 868 | goto error_remove_trigger; |
869 | ret = iio_device_register(indio_dev); | ||
870 | if (ret) | ||
871 | goto error_remove_trigger; | ||
872 | |||
874 | return 0; | 873 | return 0; |
875 | 874 | ||
876 | error_remove_trigger: | 875 | error_remove_trigger: |
@@ -881,10 +880,7 @@ error_uninitialize_ring: | |||
881 | error_unreg_ring_funcs: | 880 | error_unreg_ring_funcs: |
882 | adis16400_unconfigure_ring(indio_dev); | 881 | adis16400_unconfigure_ring(indio_dev); |
883 | error_free_dev: | 882 | error_free_dev: |
884 | if (regdone) | 883 | iio_free_device(indio_dev); |
885 | iio_device_unregister(indio_dev); | ||
886 | else | ||
887 | iio_free_device(indio_dev); | ||
888 | error_ret: | 884 | error_ret: |
889 | return ret; | 885 | return ret; |
890 | } | 886 | } |
diff --git a/drivers/staging/iio/industrialio-core.c b/drivers/staging/iio/industrialio-core.c index 2af056cc10a..49322bf5ac3 100644 --- a/drivers/staging/iio/industrialio-core.c +++ b/drivers/staging/iio/industrialio-core.c | |||
@@ -119,6 +119,7 @@ struct iio_event_interface { | |||
119 | int current_events; | 119 | int current_events; |
120 | struct list_head dev_attr_list; | 120 | struct list_head dev_attr_list; |
121 | unsigned long flags; | 121 | unsigned long flags; |
122 | struct attribute_group group; | ||
122 | }; | 123 | }; |
123 | 124 | ||
124 | int iio_push_event(struct iio_dev *dev_info, u64 ev_code, s64 timestamp) | 125 | int iio_push_event(struct iio_dev *dev_info, u64 ev_code, s64 timestamp) |
@@ -506,7 +507,6 @@ static void __iio_device_attr_deinit(struct device_attribute *dev_attr) | |||
506 | } | 507 | } |
507 | 508 | ||
508 | int __iio_add_chan_devattr(const char *postfix, | 509 | int __iio_add_chan_devattr(const char *postfix, |
509 | const char *group, | ||
510 | struct iio_chan_spec const *chan, | 510 | struct iio_chan_spec const *chan, |
511 | ssize_t (*readfunc)(struct device *dev, | 511 | ssize_t (*readfunc)(struct device *dev, |
512 | struct device_attribute *attr, | 512 | struct device_attribute *attr, |
@@ -544,12 +544,6 @@ int __iio_add_chan_devattr(const char *postfix, | |||
544 | ret = -EBUSY; | 544 | ret = -EBUSY; |
545 | goto error_device_attr_deinit; | 545 | goto error_device_attr_deinit; |
546 | } | 546 | } |
547 | |||
548 | ret = sysfs_add_file_to_group(&dev->kobj, | ||
549 | &iio_attr->dev_attr.attr, group); | ||
550 | if (ret < 0) | ||
551 | goto error_device_attr_deinit; | ||
552 | |||
553 | list_add(&iio_attr->l, attr_list); | 547 | list_add(&iio_attr->l, attr_list); |
554 | 548 | ||
555 | return 0; | 549 | return 0; |
@@ -565,13 +559,13 @@ error_ret: | |||
565 | static int iio_device_add_channel_sysfs(struct iio_dev *dev_info, | 559 | static int iio_device_add_channel_sysfs(struct iio_dev *dev_info, |
566 | struct iio_chan_spec const *chan) | 560 | struct iio_chan_spec const *chan) |
567 | { | 561 | { |
568 | int ret, i; | 562 | int ret, i, attrcount = 0; |
569 | 563 | ||
570 | if (chan->channel < 0) | 564 | if (chan->channel < 0) |
571 | return 0; | 565 | return 0; |
572 | 566 | ||
573 | ret = __iio_add_chan_devattr(iio_data_type_name[chan->processed_val], | 567 | ret = __iio_add_chan_devattr(iio_data_type_name[chan->processed_val], |
574 | NULL, chan, | 568 | chan, |
575 | &iio_read_channel_info, | 569 | &iio_read_channel_info, |
576 | (chan->output ? | 570 | (chan->output ? |
577 | &iio_write_channel_info : NULL), | 571 | &iio_write_channel_info : NULL), |
@@ -581,10 +575,11 @@ static int iio_device_add_channel_sysfs(struct iio_dev *dev_info, | |||
581 | &dev_info->channel_attr_list); | 575 | &dev_info->channel_attr_list); |
582 | if (ret) | 576 | if (ret) |
583 | goto error_ret; | 577 | goto error_ret; |
578 | attrcount++; | ||
584 | 579 | ||
585 | for_each_set_bit(i, &chan->info_mask, sizeof(long)*8) { | 580 | for_each_set_bit(i, &chan->info_mask, sizeof(long)*8) { |
586 | ret = __iio_add_chan_devattr(iio_chan_info_postfix[i/2], | 581 | ret = __iio_add_chan_devattr(iio_chan_info_postfix[i/2], |
587 | NULL, chan, | 582 | chan, |
588 | &iio_read_channel_info, | 583 | &iio_read_channel_info, |
589 | &iio_write_channel_info, | 584 | &iio_write_channel_info, |
590 | (1 << i), | 585 | (1 << i), |
@@ -597,7 +592,9 @@ static int iio_device_add_channel_sysfs(struct iio_dev *dev_info, | |||
597 | } | 592 | } |
598 | if (ret < 0) | 593 | if (ret < 0) |
599 | goto error_ret; | 594 | goto error_ret; |
595 | attrcount++; | ||
600 | } | 596 | } |
597 | ret = attrcount; | ||
601 | error_ret: | 598 | error_ret: |
602 | return ret; | 599 | return ret; |
603 | } | 600 | } |
@@ -605,8 +602,6 @@ error_ret: | |||
605 | static void iio_device_remove_and_free_read_attr(struct iio_dev *dev_info, | 602 | static void iio_device_remove_and_free_read_attr(struct iio_dev *dev_info, |
606 | struct iio_dev_attr *p) | 603 | struct iio_dev_attr *p) |
607 | { | 604 | { |
608 | sysfs_remove_file_from_group(&dev_info->dev.kobj, | ||
609 | &p->dev_attr.attr, NULL); | ||
610 | kfree(p->dev_attr.attr.name); | 605 | kfree(p->dev_attr.attr.name); |
611 | kfree(p); | 606 | kfree(p); |
612 | } | 607 | } |
@@ -621,31 +616,19 @@ static ssize_t iio_show_dev_name(struct device *dev, | |||
621 | 616 | ||
622 | static DEVICE_ATTR(name, S_IRUGO, iio_show_dev_name, NULL); | 617 | static DEVICE_ATTR(name, S_IRUGO, iio_show_dev_name, NULL); |
623 | 618 | ||
624 | static struct attribute *iio_base_dummy_attrs[] = { | ||
625 | NULL | ||
626 | }; | ||
627 | static struct attribute_group iio_base_dummy_group = { | ||
628 | .attrs = iio_base_dummy_attrs, | ||
629 | }; | ||
630 | |||
631 | static int iio_device_register_sysfs(struct iio_dev *dev_info) | 619 | static int iio_device_register_sysfs(struct iio_dev *dev_info) |
632 | { | 620 | { |
633 | int i, ret = 0; | 621 | int i, ret = 0, attrcount, attrn, attrcount_orig = 0; |
634 | struct iio_dev_attr *p, *n; | 622 | struct iio_dev_attr *p, *n; |
623 | struct attribute **attr; | ||
635 | 624 | ||
636 | if (dev_info->info->attrs) | 625 | /* First count elements in any existing group */ |
637 | ret = sysfs_create_group(&dev_info->dev.kobj, | 626 | if (dev_info->info->attrs) { |
638 | dev_info->info->attrs); | 627 | attr = dev_info->info->attrs->attrs; |
639 | else | 628 | while (*attr++ != NULL) |
640 | ret = sysfs_create_group(&dev_info->dev.kobj, | 629 | attrcount_orig++; |
641 | &iio_base_dummy_group); | ||
642 | |||
643 | if (ret) { | ||
644 | dev_err(dev_info->dev.parent, | ||
645 | "Failed to register sysfs hooks\n"); | ||
646 | goto error_ret; | ||
647 | } | 630 | } |
648 | 631 | attrcount = attrcount_orig; | |
649 | /* | 632 | /* |
650 | * New channel registration method - relies on the fact a group does | 633 | * New channel registration method - relies on the fact a group does |
651 | * not need to be initialized if it is name is NULL. | 634 | * not need to be initialized if it is name is NULL. |
@@ -658,14 +641,36 @@ static int iio_device_register_sysfs(struct iio_dev *dev_info) | |||
658 | ->channels[i]); | 641 | ->channels[i]); |
659 | if (ret < 0) | 642 | if (ret < 0) |
660 | goto error_clear_attrs; | 643 | goto error_clear_attrs; |
644 | attrcount += ret; | ||
661 | } | 645 | } |
662 | if (dev_info->name) { | 646 | |
663 | ret = sysfs_add_file_to_group(&dev_info->dev.kobj, | 647 | if (dev_info->name) |
664 | &dev_attr_name.attr, | 648 | attrcount++; |
665 | NULL); | 649 | |
666 | if (ret) | 650 | dev_info->chan_attr_group.attrs |
667 | goto error_clear_attrs; | 651 | = kzalloc(sizeof(dev_info->chan_attr_group.attrs[0])* |
652 | (attrcount + 1), | ||
653 | GFP_KERNEL); | ||
654 | if (dev_info->chan_attr_group.attrs == NULL) { | ||
655 | ret = -ENOMEM; | ||
656 | goto error_clear_attrs; | ||
668 | } | 657 | } |
658 | /* Copy across original attributes */ | ||
659 | if (dev_info->info->attrs) | ||
660 | memcpy(dev_info->chan_attr_group.attrs, | ||
661 | dev_info->info->attrs->attrs, | ||
662 | sizeof(dev_info->chan_attr_group.attrs[0]) | ||
663 | *attrcount_orig); | ||
664 | attrn = attrcount_orig; | ||
665 | /* Add all elements from the list. */ | ||
666 | list_for_each_entry(p, &dev_info->channel_attr_list, l) | ||
667 | dev_info->chan_attr_group.attrs[attrn++] = &p->dev_attr.attr; | ||
668 | if (dev_info->name) | ||
669 | dev_info->chan_attr_group.attrs[attrn++] = &dev_attr_name.attr; | ||
670 | |||
671 | dev_info->groups[dev_info->groupcounter++] = | ||
672 | &dev_info->chan_attr_group; | ||
673 | |||
669 | return 0; | 674 | return 0; |
670 | 675 | ||
671 | error_clear_attrs: | 676 | error_clear_attrs: |
@@ -674,32 +679,20 @@ error_clear_attrs: | |||
674 | list_del(&p->l); | 679 | list_del(&p->l); |
675 | iio_device_remove_and_free_read_attr(dev_info, p); | 680 | iio_device_remove_and_free_read_attr(dev_info, p); |
676 | } | 681 | } |
677 | if (dev_info->info->attrs) | ||
678 | sysfs_remove_group(&dev_info->dev.kobj, dev_info->info->attrs); | ||
679 | else | ||
680 | sysfs_remove_group(&dev_info->dev.kobj, &iio_base_dummy_group); | ||
681 | error_ret: | ||
682 | return ret; | ||
683 | 682 | ||
683 | return ret; | ||
684 | } | 684 | } |
685 | 685 | ||
686 | static void iio_device_unregister_sysfs(struct iio_dev *dev_info) | 686 | static void iio_device_unregister_sysfs(struct iio_dev *dev_info) |
687 | { | 687 | { |
688 | 688 | ||
689 | struct iio_dev_attr *p, *n; | 689 | struct iio_dev_attr *p, *n; |
690 | if (dev_info->name) | 690 | |
691 | sysfs_remove_file_from_group(&dev_info->dev.kobj, | ||
692 | &dev_attr_name.attr, | ||
693 | NULL); | ||
694 | list_for_each_entry_safe(p, n, &dev_info->channel_attr_list, l) { | 691 | list_for_each_entry_safe(p, n, &dev_info->channel_attr_list, l) { |
695 | list_del(&p->l); | 692 | list_del(&p->l); |
696 | iio_device_remove_and_free_read_attr(dev_info, p); | 693 | iio_device_remove_and_free_read_attr(dev_info, p); |
697 | } | 694 | } |
698 | 695 | kfree(dev_info->chan_attr_group.attrs); | |
699 | if (dev_info->info->attrs) | ||
700 | sysfs_remove_group(&dev_info->dev.kobj, dev_info->info->attrs); | ||
701 | else | ||
702 | sysfs_remove_group(&dev_info->dev.kobj, &iio_base_dummy_group); | ||
703 | } | 696 | } |
704 | 697 | ||
705 | static const char * const iio_ev_type_text[] = { | 698 | static const char * const iio_ev_type_text[] = { |
@@ -790,7 +783,7 @@ static ssize_t iio_ev_value_store(struct device *dev, | |||
790 | static int iio_device_add_event_sysfs(struct iio_dev *dev_info, | 783 | static int iio_device_add_event_sysfs(struct iio_dev *dev_info, |
791 | struct iio_chan_spec const *chan) | 784 | struct iio_chan_spec const *chan) |
792 | { | 785 | { |
793 | int ret = 0, i, mask = 0; | 786 | int ret = 0, i, mask = 0, attrcount = 0; |
794 | char *postfix; | 787 | char *postfix; |
795 | if (!chan->event_mask) | 788 | if (!chan->event_mask) |
796 | return 0; | 789 | return 0; |
@@ -820,7 +813,6 @@ static int iio_device_add_event_sysfs(struct iio_dev *dev_info, | |||
820 | i%IIO_EV_TYPE_MAX); | 813 | i%IIO_EV_TYPE_MAX); |
821 | 814 | ||
822 | ret = __iio_add_chan_devattr(postfix, | 815 | ret = __iio_add_chan_devattr(postfix, |
823 | "events", | ||
824 | chan, | 816 | chan, |
825 | &iio_ev_state_show, | 817 | &iio_ev_state_show, |
826 | iio_ev_state_store, | 818 | iio_ev_state_store, |
@@ -832,7 +824,7 @@ static int iio_device_add_event_sysfs(struct iio_dev *dev_info, | |||
832 | kfree(postfix); | 824 | kfree(postfix); |
833 | if (ret) | 825 | if (ret) |
834 | goto error_ret; | 826 | goto error_ret; |
835 | 827 | attrcount++; | |
836 | postfix = kasprintf(GFP_KERNEL, "%s_%s_value", | 828 | postfix = kasprintf(GFP_KERNEL, "%s_%s_value", |
837 | iio_ev_type_text[i/IIO_EV_TYPE_MAX], | 829 | iio_ev_type_text[i/IIO_EV_TYPE_MAX], |
838 | iio_ev_dir_text[i%IIO_EV_TYPE_MAX]); | 830 | iio_ev_dir_text[i%IIO_EV_TYPE_MAX]); |
@@ -840,7 +832,7 @@ static int iio_device_add_event_sysfs(struct iio_dev *dev_info, | |||
840 | ret = -ENOMEM; | 832 | ret = -ENOMEM; |
841 | goto error_ret; | 833 | goto error_ret; |
842 | } | 834 | } |
843 | ret = __iio_add_chan_devattr(postfix, "events", chan, | 835 | ret = __iio_add_chan_devattr(postfix, chan, |
844 | iio_ev_value_show, | 836 | iio_ev_value_show, |
845 | iio_ev_value_store, | 837 | iio_ev_value_store, |
846 | mask, | 838 | mask, |
@@ -851,9 +843,9 @@ static int iio_device_add_event_sysfs(struct iio_dev *dev_info, | |||
851 | kfree(postfix); | 843 | kfree(postfix); |
852 | if (ret) | 844 | if (ret) |
853 | goto error_ret; | 845 | goto error_ret; |
854 | 846 | attrcount++; | |
855 | } | 847 | } |
856 | 848 | ret = attrcount; | |
857 | error_ret: | 849 | error_ret: |
858 | return ret; | 850 | return ret; |
859 | } | 851 | } |
@@ -864,9 +856,6 @@ static inline void __iio_remove_event_config_attrs(struct iio_dev *dev_info) | |||
864 | list_for_each_entry_safe(p, n, | 856 | list_for_each_entry_safe(p, n, |
865 | &dev_info->event_interface-> | 857 | &dev_info->event_interface-> |
866 | dev_attr_list, l) { | 858 | dev_attr_list, l) { |
867 | sysfs_remove_file_from_group(&dev_info->dev.kobj, | ||
868 | &p->dev_attr.attr, | ||
869 | NULL); | ||
870 | kfree(p->dev_attr.attr.name); | 859 | kfree(p->dev_attr.attr.name); |
871 | kfree(p); | 860 | kfree(p); |
872 | } | 861 | } |
@@ -874,18 +863,18 @@ static inline void __iio_remove_event_config_attrs(struct iio_dev *dev_info) | |||
874 | 863 | ||
875 | static inline int __iio_add_event_config_attrs(struct iio_dev *dev_info) | 864 | static inline int __iio_add_event_config_attrs(struct iio_dev *dev_info) |
876 | { | 865 | { |
877 | int j; | 866 | int j, ret, attrcount = 0; |
878 | int ret; | ||
879 | 867 | ||
880 | INIT_LIST_HEAD(&dev_info->event_interface->dev_attr_list); | 868 | INIT_LIST_HEAD(&dev_info->event_interface->dev_attr_list); |
881 | /* Dynically created from the channels array */ | 869 | /* Dynically created from the channels array */ |
882 | for (j = 0; j < dev_info->num_channels; j++) { | 870 | for (j = 0; j < dev_info->num_channels; j++) { |
883 | ret = iio_device_add_event_sysfs(dev_info, | 871 | ret = iio_device_add_event_sysfs(dev_info, |
884 | &dev_info->channels[j]); | 872 | &dev_info->channels[j]); |
885 | if (ret) | 873 | if (ret < 0) |
886 | goto error_clear_attrs; | 874 | goto error_clear_attrs; |
875 | attrcount += ret; | ||
887 | } | 876 | } |
888 | return 0; | 877 | return attrcount; |
889 | 878 | ||
890 | error_clear_attrs: | 879 | error_clear_attrs: |
891 | __iio_remove_event_config_attrs(dev_info); | 880 | __iio_remove_event_config_attrs(dev_info); |
@@ -893,15 +882,6 @@ error_clear_attrs: | |||
893 | return ret; | 882 | return ret; |
894 | } | 883 | } |
895 | 884 | ||
896 | static struct attribute *iio_events_dummy_attrs[] = { | ||
897 | NULL | ||
898 | }; | ||
899 | |||
900 | static struct attribute_group iio_events_dummy_group = { | ||
901 | .name = "events", | ||
902 | .attrs = iio_events_dummy_attrs | ||
903 | }; | ||
904 | |||
905 | static bool iio_check_for_dynamic_events(struct iio_dev *dev_info) | 885 | static bool iio_check_for_dynamic_events(struct iio_dev *dev_info) |
906 | { | 886 | { |
907 | int j; | 887 | int j; |
@@ -922,9 +902,12 @@ static void iio_setup_ev_int(struct iio_event_interface *ev_int) | |||
922 | init_waitqueue_head(&ev_int->wait); | 902 | init_waitqueue_head(&ev_int->wait); |
923 | } | 903 | } |
924 | 904 | ||
905 | static const char *iio_event_group_name = "events"; | ||
925 | static int iio_device_register_eventset(struct iio_dev *dev_info) | 906 | static int iio_device_register_eventset(struct iio_dev *dev_info) |
926 | { | 907 | { |
927 | int ret = 0; | 908 | struct iio_dev_attr *p; |
909 | int ret = 0, attrcount_orig = 0, attrcount, attrn; | ||
910 | struct attribute **attr; | ||
928 | 911 | ||
929 | if (!(dev_info->info->event_attrs || | 912 | if (!(dev_info->info->event_attrs || |
930 | iio_check_for_dynamic_events(dev_info))) | 913 | iio_check_for_dynamic_events(dev_info))) |
@@ -938,41 +921,48 @@ static int iio_device_register_eventset(struct iio_dev *dev_info) | |||
938 | } | 921 | } |
939 | 922 | ||
940 | iio_setup_ev_int(dev_info->event_interface); | 923 | iio_setup_ev_int(dev_info->event_interface); |
941 | if (dev_info->info->event_attrs != NULL) | 924 | if (dev_info->info->event_attrs != NULL) { |
942 | ret = sysfs_create_group(&dev_info->dev.kobj, | 925 | attr = dev_info->info->event_attrs->attrs; |
943 | dev_info->info->event_attrs); | 926 | while (*attr++ != NULL) |
944 | else | 927 | attrcount_orig++; |
945 | ret = sysfs_create_group(&dev_info->dev.kobj, | ||
946 | &iio_events_dummy_group); | ||
947 | if (ret) { | ||
948 | dev_err(&dev_info->dev, | ||
949 | "Failed to register sysfs for event attrs"); | ||
950 | goto error_free_setup_event_lines; | ||
951 | } | 928 | } |
929 | attrcount = attrcount_orig; | ||
952 | if (dev_info->channels) { | 930 | if (dev_info->channels) { |
953 | ret = __iio_add_event_config_attrs(dev_info); | 931 | ret = __iio_add_event_config_attrs(dev_info); |
954 | if (ret) { | 932 | if (ret < 0) |
955 | if (dev_info->info->event_attrs != NULL) | ||
956 | sysfs_remove_group(&dev_info->dev.kobj, | ||
957 | dev_info->info | ||
958 | ->event_attrs); | ||
959 | else | ||
960 | sysfs_remove_group(&dev_info->dev.kobj, | ||
961 | &iio_events_dummy_group); | ||
962 | goto error_free_setup_event_lines; | 933 | goto error_free_setup_event_lines; |
963 | } | 934 | attrcount += ret; |
964 | } | 935 | } |
965 | 936 | ||
937 | dev_info->event_interface->group.name = iio_event_group_name; | ||
938 | dev_info->event_interface->group.attrs = | ||
939 | kzalloc(sizeof(dev_info->event_interface->group.attrs[0]) | ||
940 | *(attrcount + 1), | ||
941 | GFP_KERNEL); | ||
942 | if (dev_info->event_interface->group.attrs == NULL) { | ||
943 | ret = -ENOMEM; | ||
944 | goto error_free_setup_event_lines; | ||
945 | } | ||
946 | if (dev_info->info->event_attrs) | ||
947 | memcpy(dev_info->event_interface->group.attrs, | ||
948 | dev_info->info->event_attrs->attrs, | ||
949 | sizeof(dev_info->event_interface->group.attrs[0]) | ||
950 | *attrcount_orig); | ||
951 | attrn = attrcount_orig; | ||
952 | /* Add all elements from the list. */ | ||
953 | list_for_each_entry(p, | ||
954 | &dev_info->event_interface->dev_attr_list, | ||
955 | l) | ||
956 | dev_info->event_interface->group.attrs[attrn++] = | ||
957 | &p->dev_attr.attr; | ||
958 | |||
959 | dev_info->groups[dev_info->groupcounter++] = | ||
960 | &dev_info->event_interface->group; | ||
961 | |||
966 | return 0; | 962 | return 0; |
967 | 963 | ||
968 | error_free_setup_event_lines: | 964 | error_free_setup_event_lines: |
969 | __iio_remove_event_config_attrs(dev_info); | 965 | __iio_remove_event_config_attrs(dev_info); |
970 | if (dev_info->info->event_attrs != NULL) | ||
971 | sysfs_remove_group(&dev_info->dev.kobj, | ||
972 | dev_info->info->event_attrs); | ||
973 | else | ||
974 | sysfs_remove_group(&dev_info->dev.kobj, | ||
975 | &iio_events_dummy_group); | ||
976 | kfree(dev_info->event_interface); | 966 | kfree(dev_info->event_interface); |
977 | error_ret: | 967 | error_ret: |
978 | 968 | ||
@@ -984,12 +974,7 @@ static void iio_device_unregister_eventset(struct iio_dev *dev_info) | |||
984 | if (dev_info->event_interface == NULL) | 974 | if (dev_info->event_interface == NULL) |
985 | return; | 975 | return; |
986 | __iio_remove_event_config_attrs(dev_info); | 976 | __iio_remove_event_config_attrs(dev_info); |
987 | if (dev_info->info->event_attrs != NULL) | 977 | kfree(dev_info->event_interface->group.attrs); |
988 | sysfs_remove_group(&dev_info->dev.kobj, | ||
989 | dev_info->info->event_attrs); | ||
990 | else | ||
991 | sysfs_remove_group(&dev_info->dev.kobj, | ||
992 | &iio_events_dummy_group); | ||
993 | kfree(dev_info->event_interface); | 978 | kfree(dev_info->event_interface); |
994 | } | 979 | } |
995 | 980 | ||
@@ -997,6 +982,11 @@ static void iio_dev_release(struct device *device) | |||
997 | { | 982 | { |
998 | struct iio_dev *dev_info = container_of(device, struct iio_dev, dev); | 983 | struct iio_dev *dev_info = container_of(device, struct iio_dev, dev); |
999 | cdev_del(&dev_info->chrdev); | 984 | cdev_del(&dev_info->chrdev); |
985 | if (dev_info->modes & INDIO_RING_TRIGGERED) | ||
986 | iio_device_unregister_trigger_consumer(dev_info); | ||
987 | iio_device_unregister_eventset(dev_info); | ||
988 | iio_device_unregister_sysfs(dev_info); | ||
989 | ida_simple_remove(&iio_ida, dev_info->id); | ||
1000 | kfree(dev_info); | 990 | kfree(dev_info); |
1001 | } | 991 | } |
1002 | 992 | ||
@@ -1021,6 +1011,7 @@ struct iio_dev *iio_allocate_device(int sizeof_priv) | |||
1021 | dev = kzalloc(alloc_size, GFP_KERNEL); | 1011 | dev = kzalloc(alloc_size, GFP_KERNEL); |
1022 | 1012 | ||
1023 | if (dev) { | 1013 | if (dev) { |
1014 | dev->dev.groups = dev->groups; | ||
1024 | dev->dev.type = &iio_dev_type; | 1015 | dev->dev.type = &iio_dev_type; |
1025 | dev->dev.bus = &iio_bus_type; | 1016 | dev->dev.bus = &iio_bus_type; |
1026 | device_initialize(&dev->dev); | 1017 | device_initialize(&dev->dev); |
@@ -1104,14 +1095,11 @@ int iio_device_register(struct iio_dev *dev_info) | |||
1104 | /* configure elements for the chrdev */ | 1095 | /* configure elements for the chrdev */ |
1105 | dev_info->dev.devt = MKDEV(MAJOR(iio_devt), dev_info->id); | 1096 | dev_info->dev.devt = MKDEV(MAJOR(iio_devt), dev_info->id); |
1106 | 1097 | ||
1107 | ret = device_add(&dev_info->dev); | ||
1108 | if (ret) | ||
1109 | goto error_free_ida; | ||
1110 | ret = iio_device_register_sysfs(dev_info); | 1098 | ret = iio_device_register_sysfs(dev_info); |
1111 | if (ret) { | 1099 | if (ret) { |
1112 | dev_err(dev_info->dev.parent, | 1100 | dev_err(dev_info->dev.parent, |
1113 | "Failed to register sysfs interfaces\n"); | 1101 | "Failed to register sysfs interfaces\n"); |
1114 | goto error_del_device; | 1102 | goto error_free_ida; |
1115 | } | 1103 | } |
1116 | ret = iio_device_register_eventset(dev_info); | 1104 | ret = iio_device_register_eventset(dev_info); |
1117 | if (ret) { | 1105 | if (ret) { |
@@ -1122,15 +1110,22 @@ int iio_device_register(struct iio_dev *dev_info) | |||
1122 | if (dev_info->modes & INDIO_RING_TRIGGERED) | 1110 | if (dev_info->modes & INDIO_RING_TRIGGERED) |
1123 | iio_device_register_trigger_consumer(dev_info); | 1111 | iio_device_register_trigger_consumer(dev_info); |
1124 | 1112 | ||
1113 | ret = device_add(&dev_info->dev); | ||
1114 | if (ret < 0) | ||
1115 | goto error_unreg_eventset; | ||
1125 | cdev_init(&dev_info->chrdev, &iio_ring_fileops); | 1116 | cdev_init(&dev_info->chrdev, &iio_ring_fileops); |
1126 | dev_info->chrdev.owner = dev_info->info->driver_module; | 1117 | dev_info->chrdev.owner = dev_info->info->driver_module; |
1127 | ret = cdev_add(&dev_info->chrdev, dev_info->dev.devt, 1); | 1118 | ret = cdev_add(&dev_info->chrdev, dev_info->dev.devt, 1); |
1119 | if (ret < 0) | ||
1120 | goto error_del_device; | ||
1128 | return 0; | 1121 | return 0; |
1129 | 1122 | ||
1130 | error_free_sysfs: | ||
1131 | iio_device_unregister_sysfs(dev_info); | ||
1132 | error_del_device: | 1123 | error_del_device: |
1133 | device_del(&dev_info->dev); | 1124 | device_del(&dev_info->dev); |
1125 | error_unreg_eventset: | ||
1126 | iio_device_unregister_eventset(dev_info); | ||
1127 | error_free_sysfs: | ||
1128 | iio_device_unregister_sysfs(dev_info); | ||
1134 | error_free_ida: | 1129 | error_free_ida: |
1135 | ida_simple_remove(&iio_ida, dev_info->id); | 1130 | ida_simple_remove(&iio_ida, dev_info->id); |
1136 | error_ret: | 1131 | error_ret: |
@@ -1140,11 +1135,6 @@ EXPORT_SYMBOL(iio_device_register); | |||
1140 | 1135 | ||
1141 | void iio_device_unregister(struct iio_dev *dev_info) | 1136 | void iio_device_unregister(struct iio_dev *dev_info) |
1142 | { | 1137 | { |
1143 | if (dev_info->modes & INDIO_RING_TRIGGERED) | ||
1144 | iio_device_unregister_trigger_consumer(dev_info); | ||
1145 | iio_device_unregister_eventset(dev_info); | ||
1146 | iio_device_unregister_sysfs(dev_info); | ||
1147 | ida_simple_remove(&iio_ida, dev_info->id); | ||
1148 | device_unregister(&dev_info->dev); | 1138 | device_unregister(&dev_info->dev); |
1149 | } | 1139 | } |
1150 | EXPORT_SYMBOL(iio_device_unregister); | 1140 | EXPORT_SYMBOL(iio_device_unregister); |
diff --git a/drivers/staging/iio/industrialio-ring.c b/drivers/staging/iio/industrialio-ring.c index 6f14c0d8486..7a95fbe0eed 100644 --- a/drivers/staging/iio/industrialio-ring.c +++ b/drivers/staging/iio/industrialio-ring.c | |||
@@ -207,10 +207,10 @@ error_ret: | |||
207 | static int iio_ring_add_channel_sysfs(struct iio_dev *indio_dev, | 207 | static int iio_ring_add_channel_sysfs(struct iio_dev *indio_dev, |
208 | const struct iio_chan_spec *chan) | 208 | const struct iio_chan_spec *chan) |
209 | { | 209 | { |
210 | int ret; | 210 | int ret, attrcount = 0; |
211 | struct iio_ring_buffer *ring = indio_dev->ring; | 211 | struct iio_ring_buffer *ring = indio_dev->ring; |
212 | 212 | ||
213 | ret = __iio_add_chan_devattr("index", "scan_elements", | 213 | ret = __iio_add_chan_devattr("index", |
214 | chan, | 214 | chan, |
215 | &iio_show_scan_index, | 215 | &iio_show_scan_index, |
216 | NULL, | 216 | NULL, |
@@ -220,8 +220,8 @@ static int iio_ring_add_channel_sysfs(struct iio_dev *indio_dev, | |||
220 | &ring->scan_el_dev_attr_list); | 220 | &ring->scan_el_dev_attr_list); |
221 | if (ret) | 221 | if (ret) |
222 | goto error_ret; | 222 | goto error_ret; |
223 | 223 | attrcount++; | |
224 | ret = __iio_add_chan_devattr("type", "scan_elements", | 224 | ret = __iio_add_chan_devattr("type", |
225 | chan, | 225 | chan, |
226 | &iio_show_fixed_type, | 226 | &iio_show_fixed_type, |
227 | NULL, | 227 | NULL, |
@@ -231,9 +231,9 @@ static int iio_ring_add_channel_sysfs(struct iio_dev *indio_dev, | |||
231 | &ring->scan_el_dev_attr_list); | 231 | &ring->scan_el_dev_attr_list); |
232 | if (ret) | 232 | if (ret) |
233 | goto error_ret; | 233 | goto error_ret; |
234 | 234 | attrcount++; | |
235 | if (chan->type != IIO_TIMESTAMP) | 235 | if (chan->type != IIO_TIMESTAMP) |
236 | ret = __iio_add_chan_devattr("en", "scan_elements", | 236 | ret = __iio_add_chan_devattr("en", |
237 | chan, | 237 | chan, |
238 | &iio_scan_el_show, | 238 | &iio_scan_el_show, |
239 | &iio_scan_el_store, | 239 | &iio_scan_el_store, |
@@ -242,7 +242,7 @@ static int iio_ring_add_channel_sysfs(struct iio_dev *indio_dev, | |||
242 | &indio_dev->dev, | 242 | &indio_dev->dev, |
243 | &ring->scan_el_dev_attr_list); | 243 | &ring->scan_el_dev_attr_list); |
244 | else | 244 | else |
245 | ret = __iio_add_chan_devattr("en", "scan_elements", | 245 | ret = __iio_add_chan_devattr("en", |
246 | chan, | 246 | chan, |
247 | &iio_scan_el_ts_show, | 247 | &iio_scan_el_ts_show, |
248 | &iio_scan_el_ts_store, | 248 | &iio_scan_el_ts_store, |
@@ -250,6 +250,8 @@ static int iio_ring_add_channel_sysfs(struct iio_dev *indio_dev, | |||
250 | 0, | 250 | 0, |
251 | &indio_dev->dev, | 251 | &indio_dev->dev, |
252 | &ring->scan_el_dev_attr_list); | 252 | &ring->scan_el_dev_attr_list); |
253 | attrcount++; | ||
254 | ret = attrcount; | ||
253 | error_ret: | 255 | error_ret: |
254 | return ret; | 256 | return ret; |
255 | } | 257 | } |
@@ -257,66 +259,40 @@ error_ret: | |||
257 | static void iio_ring_remove_and_free_scan_dev_attr(struct iio_dev *indio_dev, | 259 | static void iio_ring_remove_and_free_scan_dev_attr(struct iio_dev *indio_dev, |
258 | struct iio_dev_attr *p) | 260 | struct iio_dev_attr *p) |
259 | { | 261 | { |
260 | sysfs_remove_file_from_group(&indio_dev->dev.kobj, | ||
261 | &p->dev_attr.attr, "scan_elements"); | ||
262 | kfree(p->dev_attr.attr.name); | 262 | kfree(p->dev_attr.attr.name); |
263 | kfree(p); | 263 | kfree(p); |
264 | } | 264 | } |
265 | 265 | ||
266 | static struct attribute *iio_scan_el_dummy_attrs[] = { | ||
267 | NULL | ||
268 | }; | ||
269 | |||
270 | static struct attribute_group iio_scan_el_dummy_group = { | ||
271 | .name = "scan_elements", | ||
272 | .attrs = iio_scan_el_dummy_attrs | ||
273 | }; | ||
274 | |||
275 | static void __iio_ring_attr_cleanup(struct iio_dev *indio_dev) | 266 | static void __iio_ring_attr_cleanup(struct iio_dev *indio_dev) |
276 | { | 267 | { |
277 | struct iio_dev_attr *p, *n; | 268 | struct iio_dev_attr *p, *n; |
278 | struct iio_ring_buffer *ring = indio_dev->ring; | 269 | struct iio_ring_buffer *ring = indio_dev->ring; |
279 | int anydynamic = !list_empty(&ring->scan_el_dev_attr_list); | 270 | |
280 | list_for_each_entry_safe(p, n, | 271 | list_for_each_entry_safe(p, n, |
281 | &ring->scan_el_dev_attr_list, l) | 272 | &ring->scan_el_dev_attr_list, l) |
282 | iio_ring_remove_and_free_scan_dev_attr(indio_dev, p); | 273 | iio_ring_remove_and_free_scan_dev_attr(indio_dev, p); |
283 | |||
284 | if (ring->scan_el_attrs) | ||
285 | sysfs_remove_group(&indio_dev->dev.kobj, | ||
286 | ring->scan_el_attrs); | ||
287 | else if (anydynamic) | ||
288 | sysfs_remove_group(&indio_dev->dev.kobj, | ||
289 | &iio_scan_el_dummy_group); | ||
290 | } | 274 | } |
291 | 275 | ||
276 | static const char * const iio_scan_elements_group_name = "scan_elements"; | ||
277 | |||
292 | int iio_ring_buffer_register(struct iio_dev *indio_dev, | 278 | int iio_ring_buffer_register(struct iio_dev *indio_dev, |
293 | const struct iio_chan_spec *channels, | 279 | const struct iio_chan_spec *channels, |
294 | int num_channels) | 280 | int num_channels) |
295 | { | 281 | { |
282 | struct iio_dev_attr *p; | ||
283 | struct attribute **attr; | ||
296 | struct iio_ring_buffer *ring = indio_dev->ring; | 284 | struct iio_ring_buffer *ring = indio_dev->ring; |
297 | int ret, i; | 285 | int ret, i, attrn, attrcount, attrcount_orig = 0; |
298 | 286 | ||
299 | if (ring->scan_el_attrs) { | 287 | if (ring->attrs) |
300 | ret = sysfs_create_group(&indio_dev->dev.kobj, | 288 | indio_dev->groups[indio_dev->groupcounter++] = ring->attrs; |
301 | ring->scan_el_attrs); | ||
302 | if (ret) { | ||
303 | dev_err(&indio_dev->dev, | ||
304 | "Failed to add sysfs scan elements\n"); | ||
305 | goto error_ret; | ||
306 | } | ||
307 | } else if (channels) { | ||
308 | ret = sysfs_create_group(&indio_dev->dev.kobj, | ||
309 | &iio_scan_el_dummy_group); | ||
310 | if (ret) | ||
311 | goto error_ret; | ||
312 | } | ||
313 | if (ring->attrs) { | ||
314 | ret = sysfs_create_group(&indio_dev->dev.kobj, | ||
315 | ring->attrs); | ||
316 | if (ret) | ||
317 | goto error_cleanup_dynamic; | ||
318 | } | ||
319 | 289 | ||
290 | if (ring->scan_el_attrs != NULL) { | ||
291 | attr = ring->scan_el_attrs->attrs; | ||
292 | while (*attr++ != NULL) | ||
293 | attrcount_orig++; | ||
294 | } | ||
295 | attrcount = attrcount_orig; | ||
320 | INIT_LIST_HEAD(&ring->scan_el_dev_attr_list); | 296 | INIT_LIST_HEAD(&ring->scan_el_dev_attr_list); |
321 | if (channels) { | 297 | if (channels) { |
322 | /* new magic */ | 298 | /* new magic */ |
@@ -330,7 +306,8 @@ int iio_ring_buffer_register(struct iio_dev *indio_dev, | |||
330 | ret = iio_ring_add_channel_sysfs(indio_dev, | 306 | ret = iio_ring_add_channel_sysfs(indio_dev, |
331 | &channels[i]); | 307 | &channels[i]); |
332 | if (ret < 0) | 308 | if (ret < 0) |
333 | goto error_cleanup_group; | 309 | goto error_cleanup_dynamic; |
310 | attrcount += ret; | ||
334 | } | 311 | } |
335 | if (indio_dev->masklength && ring->scan_mask == NULL) { | 312 | if (indio_dev->masklength && ring->scan_mask == NULL) { |
336 | ring->scan_mask | 313 | ring->scan_mask |
@@ -339,18 +316,36 @@ int iio_ring_buffer_register(struct iio_dev *indio_dev, | |||
339 | GFP_KERNEL); | 316 | GFP_KERNEL); |
340 | if (ring->scan_mask == NULL) { | 317 | if (ring->scan_mask == NULL) { |
341 | ret = -ENOMEM; | 318 | ret = -ENOMEM; |
342 | goto error_cleanup_group; | 319 | goto error_cleanup_dynamic; |
343 | } | 320 | } |
344 | } | 321 | } |
345 | } | 322 | } |
346 | 323 | ||
324 | ring->scan_el_group.name = iio_scan_elements_group_name; | ||
325 | |||
326 | ring->scan_el_group.attrs | ||
327 | = kzalloc(sizeof(ring->scan_el_group.attrs[0])*(attrcount + 1), | ||
328 | GFP_KERNEL); | ||
329 | if (ring->scan_el_group.attrs == NULL) { | ||
330 | ret = -ENOMEM; | ||
331 | goto error_free_scan_mask; | ||
332 | } | ||
333 | if (ring->scan_el_attrs) | ||
334 | memcpy(ring->scan_el_group.attrs, ring->scan_el_attrs, | ||
335 | sizeof(ring->scan_el_group.attrs[0])*attrcount_orig); | ||
336 | attrn = attrcount_orig; | ||
337 | |||
338 | list_for_each_entry(p, &ring->scan_el_dev_attr_list, l) | ||
339 | ring->scan_el_group.attrs[attrn++] = &p->dev_attr.attr; | ||
340 | indio_dev->groups[indio_dev->groupcounter++] = &ring->scan_el_group; | ||
341 | |||
347 | return 0; | 342 | return 0; |
348 | error_cleanup_group: | 343 | |
349 | if (ring->attrs) | 344 | error_free_scan_mask: |
350 | sysfs_remove_group(&indio_dev->dev.kobj, ring->attrs); | 345 | kfree(ring->scan_mask); |
351 | error_cleanup_dynamic: | 346 | error_cleanup_dynamic: |
352 | __iio_ring_attr_cleanup(indio_dev); | 347 | __iio_ring_attr_cleanup(indio_dev); |
353 | error_ret: | 348 | |
354 | return ret; | 349 | return ret; |
355 | } | 350 | } |
356 | EXPORT_SYMBOL(iio_ring_buffer_register); | 351 | EXPORT_SYMBOL(iio_ring_buffer_register); |
@@ -358,9 +353,7 @@ EXPORT_SYMBOL(iio_ring_buffer_register); | |||
358 | void iio_ring_buffer_unregister(struct iio_dev *indio_dev) | 353 | void iio_ring_buffer_unregister(struct iio_dev *indio_dev) |
359 | { | 354 | { |
360 | kfree(indio_dev->ring->scan_mask); | 355 | kfree(indio_dev->ring->scan_mask); |
361 | if (indio_dev->ring->attrs) | 356 | kfree(indio_dev->ring->scan_el_group.attrs); |
362 | sysfs_remove_group(&indio_dev->dev.kobj, | ||
363 | indio_dev->ring->attrs); | ||
364 | __iio_ring_attr_cleanup(indio_dev); | 357 | __iio_ring_attr_cleanup(indio_dev); |
365 | } | 358 | } |
366 | EXPORT_SYMBOL(iio_ring_buffer_unregister); | 359 | EXPORT_SYMBOL(iio_ring_buffer_unregister); |
diff --git a/drivers/staging/iio/industrialio-trigger.c b/drivers/staging/iio/industrialio-trigger.c index 3e60406d8f6..a66dcf7ad62 100644 --- a/drivers/staging/iio/industrialio-trigger.c +++ b/drivers/staging/iio/industrialio-trigger.c | |||
@@ -475,8 +475,10 @@ EXPORT_SYMBOL(iio_free_trigger); | |||
475 | 475 | ||
476 | int iio_device_register_trigger_consumer(struct iio_dev *dev_info) | 476 | int iio_device_register_trigger_consumer(struct iio_dev *dev_info) |
477 | { | 477 | { |
478 | return sysfs_create_group(&dev_info->dev.kobj, | 478 | dev_info->groups[dev_info->groupcounter++] = |
479 | &iio_trigger_consumer_attr_group); | 479 | &iio_trigger_consumer_attr_group; |
480 | |||
481 | return 0; | ||
480 | } | 482 | } |
481 | 483 | ||
482 | void iio_device_unregister_trigger_consumer(struct iio_dev *dev_info) | 484 | void iio_device_unregister_trigger_consumer(struct iio_dev *dev_info) |
@@ -484,8 +486,6 @@ void iio_device_unregister_trigger_consumer(struct iio_dev *dev_info) | |||
484 | /* Clean up and associated but not attached triggers references */ | 486 | /* Clean up and associated but not attached triggers references */ |
485 | if (dev_info->trig) | 487 | if (dev_info->trig) |
486 | iio_put_trigger(dev_info->trig); | 488 | iio_put_trigger(dev_info->trig); |
487 | sysfs_remove_group(&dev_info->dev.kobj, | ||
488 | &iio_trigger_consumer_attr_group); | ||
489 | } | 489 | } |
490 | 490 | ||
491 | int iio_triggered_ring_postenable(struct iio_dev *indio_dev) | 491 | int iio_triggered_ring_postenable(struct iio_dev *indio_dev) |
diff --git a/drivers/staging/iio/light/tsl2563.c b/drivers/staging/iio/light/tsl2563.c index 7a57791521f..370777245f8 100644 --- a/drivers/staging/iio/light/tsl2563.c +++ b/drivers/staging/iio/light/tsl2563.c | |||
@@ -751,9 +751,6 @@ static int __devinit tsl2563_probe(struct i2c_client *client, | |||
751 | indio_dev->info = &tsl2563_info; | 751 | indio_dev->info = &tsl2563_info; |
752 | else | 752 | else |
753 | indio_dev->info = &tsl2563_info_no_irq; | 753 | indio_dev->info = &tsl2563_info_no_irq; |
754 | ret = iio_device_register(indio_dev); | ||
755 | if (ret) | ||
756 | goto fail1; | ||
757 | if (client->irq) { | 754 | if (client->irq) { |
758 | ret = request_threaded_irq(client->irq, | 755 | ret = request_threaded_irq(client->irq, |
759 | NULL, | 756 | NULL, |
@@ -772,12 +769,16 @@ static int __devinit tsl2563_probe(struct i2c_client *client, | |||
772 | /* The interrupt cannot yet be enabled so this is fine without lock */ | 769 | /* The interrupt cannot yet be enabled so this is fine without lock */ |
773 | schedule_delayed_work(&chip->poweroff_work, 5 * HZ); | 770 | schedule_delayed_work(&chip->poweroff_work, 5 * HZ); |
774 | 771 | ||
772 | ret = iio_device_register(indio_dev); | ||
773 | if (ret) | ||
774 | goto fail3; | ||
775 | |||
775 | return 0; | 776 | return 0; |
776 | fail3: | 777 | fail3: |
777 | if (client->irq) | 778 | if (client->irq) |
778 | free_irq(client->irq, indio_dev); | 779 | free_irq(client->irq, indio_dev); |
779 | fail2: | 780 | fail2: |
780 | iio_device_unregister(indio_dev); | 781 | iio_free_device(indio_dev); |
781 | fail1: | 782 | fail1: |
782 | kfree(chip); | 783 | kfree(chip); |
783 | return err; | 784 | return err; |
diff --git a/drivers/staging/iio/meter/ade7753.c b/drivers/staging/iio/meter/ade7753.c index bccc5798fa5..8cf7308874b 100644 --- a/drivers/staging/iio/meter/ade7753.c +++ b/drivers/staging/iio/meter/ade7753.c | |||
@@ -513,7 +513,7 @@ static const struct iio_info ade7753_info = { | |||
513 | 513 | ||
514 | static int __devinit ade7753_probe(struct spi_device *spi) | 514 | static int __devinit ade7753_probe(struct spi_device *spi) |
515 | { | 515 | { |
516 | int ret, regdone = 0; | 516 | int ret; |
517 | struct ade7753_state *st; | 517 | struct ade7753_state *st; |
518 | struct iio_dev *indio_dev; | 518 | struct iio_dev *indio_dev; |
519 | 519 | ||
@@ -535,22 +535,19 @@ static int __devinit ade7753_probe(struct spi_device *spi) | |||
535 | indio_dev->info = &ade7753_info; | 535 | indio_dev->info = &ade7753_info; |
536 | indio_dev->modes = INDIO_DIRECT_MODE; | 536 | indio_dev->modes = INDIO_DIRECT_MODE; |
537 | 537 | ||
538 | ret = iio_device_register(indio_dev); | 538 | /* Get the device into a sane initial state */ |
539 | ret = ade7753_initial_setup(indio_dev); | ||
539 | if (ret) | 540 | if (ret) |
540 | goto error_free_dev; | 541 | goto error_free_dev; |
541 | regdone = 1; | ||
542 | 542 | ||
543 | /* Get the device into a sane initial state */ | 543 | ret = iio_device_register(indio_dev); |
544 | ret = ade7753_initial_setup(indio_dev); | ||
545 | if (ret) | 544 | if (ret) |
546 | goto error_free_dev; | 545 | goto error_free_dev; |
546 | |||
547 | return 0; | 547 | return 0; |
548 | 548 | ||
549 | error_free_dev: | 549 | error_free_dev: |
550 | if (regdone) | 550 | iio_free_device(indio_dev); |
551 | iio_device_unregister(indio_dev); | ||
552 | else | ||
553 | iio_free_device(indio_dev); | ||
554 | 551 | ||
555 | error_ret: | 552 | error_ret: |
556 | return ret; | 553 | return ret; |
diff --git a/drivers/staging/iio/meter/ade7754.c b/drivers/staging/iio/meter/ade7754.c index 6f0f464aba3..8adb2a98bb3 100644 --- a/drivers/staging/iio/meter/ade7754.c +++ b/drivers/staging/iio/meter/ade7754.c | |||
@@ -536,7 +536,7 @@ static const struct iio_info ade7754_info = { | |||
536 | 536 | ||
537 | static int __devinit ade7754_probe(struct spi_device *spi) | 537 | static int __devinit ade7754_probe(struct spi_device *spi) |
538 | { | 538 | { |
539 | int ret, regdone = 0; | 539 | int ret; |
540 | struct ade7754_state *st; | 540 | struct ade7754_state *st; |
541 | struct iio_dev *indio_dev; | 541 | struct iio_dev *indio_dev; |
542 | 542 | ||
@@ -558,22 +558,18 @@ static int __devinit ade7754_probe(struct spi_device *spi) | |||
558 | indio_dev->info = &ade7754_info; | 558 | indio_dev->info = &ade7754_info; |
559 | indio_dev->modes = INDIO_DIRECT_MODE; | 559 | indio_dev->modes = INDIO_DIRECT_MODE; |
560 | 560 | ||
561 | ret = iio_device_register(indio_dev); | ||
562 | if (ret) | ||
563 | goto error_free_dev; | ||
564 | regdone = 1; | ||
565 | |||
566 | /* Get the device into a sane initial state */ | 561 | /* Get the device into a sane initial state */ |
567 | ret = ade7754_initial_setup(indio_dev); | 562 | ret = ade7754_initial_setup(indio_dev); |
568 | if (ret) | 563 | if (ret) |
569 | goto error_free_dev; | 564 | goto error_free_dev; |
565 | ret = iio_device_register(indio_dev); | ||
566 | if (ret) | ||
567 | goto error_free_dev; | ||
568 | |||
570 | return 0; | 569 | return 0; |
571 | 570 | ||
572 | error_free_dev: | 571 | error_free_dev: |
573 | if (regdone) | 572 | iio_free_device(indio_dev); |
574 | iio_device_unregister(indio_dev); | ||
575 | else | ||
576 | iio_free_device(indio_dev); | ||
577 | 573 | ||
578 | error_ret: | 574 | error_ret: |
579 | return ret; | 575 | return ret; |
diff --git a/drivers/staging/iio/meter/ade7758_core.c b/drivers/staging/iio/meter/ade7758_core.c index ce513bda021..7cbf1cb198f 100644 --- a/drivers/staging/iio/meter/ade7758_core.c +++ b/drivers/staging/iio/meter/ade7758_core.c | |||
@@ -733,7 +733,7 @@ static const struct iio_info ade7758_info = { | |||
733 | 733 | ||
734 | static int __devinit ade7758_probe(struct spi_device *spi) | 734 | static int __devinit ade7758_probe(struct spi_device *spi) |
735 | { | 735 | { |
736 | int i, ret, regdone = 0; | 736 | int i, ret; |
737 | struct ade7758_state *st; | 737 | struct ade7758_state *st; |
738 | struct iio_dev *indio_dev = iio_allocate_device(sizeof(*st)); | 738 | struct iio_dev *indio_dev = iio_allocate_device(sizeof(*st)); |
739 | 739 | ||
@@ -775,11 +775,6 @@ static int __devinit ade7758_probe(struct spi_device *spi) | |||
775 | if (ret) | 775 | if (ret) |
776 | goto error_free_tx; | 776 | goto error_free_tx; |
777 | 777 | ||
778 | ret = iio_device_register(indio_dev); | ||
779 | if (ret) | ||
780 | goto error_unreg_ring_funcs; | ||
781 | regdone = 1; | ||
782 | |||
783 | ret = iio_ring_buffer_register(indio_dev, | 778 | ret = iio_ring_buffer_register(indio_dev, |
784 | &ade7758_channels[0], | 779 | &ade7758_channels[0], |
785 | ARRAY_SIZE(ade7758_channels)); | 780 | ARRAY_SIZE(ade7758_channels)); |
@@ -796,9 +791,13 @@ static int __devinit ade7758_probe(struct spi_device *spi) | |||
796 | if (spi->irq) { | 791 | if (spi->irq) { |
797 | ret = ade7758_probe_trigger(indio_dev); | 792 | ret = ade7758_probe_trigger(indio_dev); |
798 | if (ret) | 793 | if (ret) |
799 | goto error_remove_trigger; | 794 | goto error_uninitialize_ring; |
800 | } | 795 | } |
801 | 796 | ||
797 | ret = iio_device_register(indio_dev); | ||
798 | if (ret) | ||
799 | goto error_remove_trigger; | ||
800 | |||
802 | return 0; | 801 | return 0; |
803 | 802 | ||
804 | error_remove_trigger: | 803 | error_remove_trigger: |
@@ -813,10 +812,7 @@ error_free_tx: | |||
813 | error_free_rx: | 812 | error_free_rx: |
814 | kfree(st->rx); | 813 | kfree(st->rx); |
815 | error_free_dev: | 814 | error_free_dev: |
816 | if (regdone) | 815 | iio_free_device(indio_dev); |
817 | iio_device_unregister(indio_dev); | ||
818 | else | ||
819 | iio_free_device(indio_dev); | ||
820 | error_ret: | 816 | error_ret: |
821 | return ret; | 817 | return ret; |
822 | } | 818 | } |
diff --git a/drivers/staging/iio/meter/ade7759.c b/drivers/staging/iio/meter/ade7759.c index 31723e8e64f..8e44e46d82a 100644 --- a/drivers/staging/iio/meter/ade7759.c +++ b/drivers/staging/iio/meter/ade7759.c | |||
@@ -480,19 +480,17 @@ static int __devinit ade7759_probe(struct spi_device *spi) | |||
480 | indio_dev->info = &ade7759_info; | 480 | indio_dev->info = &ade7759_info; |
481 | indio_dev->modes = INDIO_DIRECT_MODE; | 481 | indio_dev->modes = INDIO_DIRECT_MODE; |
482 | 482 | ||
483 | ret = iio_device_register(indio_dev); | 483 | /* Get the device into a sane initial state */ |
484 | ret = ade7759_initial_setup(indio_dev); | ||
484 | if (ret) | 485 | if (ret) |
485 | goto error_free_dev; | 486 | goto error_free_dev; |
486 | 487 | ||
487 | /* Get the device into a sane initial state */ | 488 | ret = iio_device_register(indio_dev); |
488 | ret = ade7759_initial_setup(indio_dev); | ||
489 | if (ret) | 489 | if (ret) |
490 | goto error_unreg_dev; | 490 | goto error_free_dev; |
491 | return 0; | ||
492 | 491 | ||
492 | return 0; | ||
493 | 493 | ||
494 | error_unreg_dev: | ||
495 | iio_device_unregister(indio_dev); | ||
496 | error_free_dev: | 494 | error_free_dev: |
497 | iio_free_device(indio_dev); | 495 | iio_free_device(indio_dev); |
498 | error_ret: | 496 | error_ret: |
diff --git a/drivers/staging/iio/resolver/ad2s1210.c b/drivers/staging/iio/resolver/ad2s1210.c index 5e83227da4b..5c9c409ec7c 100644 --- a/drivers/staging/iio/resolver/ad2s1210.c +++ b/drivers/staging/iio/resolver/ad2s1210.c | |||
@@ -784,6 +784,7 @@ static int __devexit ad2s1210_remove(struct spi_device *spi) | |||
784 | { | 784 | { |
785 | struct iio_dev *indio_dev = spi_get_drvdata(spi); | 785 | struct iio_dev *indio_dev = spi_get_drvdata(spi); |
786 | struct ad2s1210_state *st = iio_priv(indio_dev); | 786 | struct ad2s1210_state *st = iio_priv(indio_dev); |
787 | |||
787 | ad2s1210_free_gpios(st); | 788 | ad2s1210_free_gpios(st); |
788 | iio_device_unregister(indio_dev); | 789 | iio_device_unregister(indio_dev); |
789 | 790 | ||
diff --git a/drivers/staging/iio/ring_generic.h b/drivers/staging/iio/ring_generic.h index 7a47f627556..8f6ecde1061 100644 --- a/drivers/staging/iio/ring_generic.h +++ b/drivers/staging/iio/ring_generic.h | |||
@@ -9,6 +9,7 @@ | |||
9 | 9 | ||
10 | #ifndef _IIO_RING_GENERIC_H_ | 10 | #ifndef _IIO_RING_GENERIC_H_ |
11 | #define _IIO_RING_GENERIC_H_ | 11 | #define _IIO_RING_GENERIC_H_ |
12 | #include <linux/sysfs.h> | ||
12 | #include "iio.h" | 13 | #include "iio.h" |
13 | #include "chrdev.h" | 14 | #include "chrdev.h" |
14 | 15 | ||
@@ -109,7 +110,7 @@ struct iio_ring_buffer { | |||
109 | const struct iio_ring_access_funcs *access; | 110 | const struct iio_ring_access_funcs *access; |
110 | const struct iio_ring_setup_ops *setup_ops; | 111 | const struct iio_ring_setup_ops *setup_ops; |
111 | struct list_head scan_el_dev_attr_list; | 112 | struct list_head scan_el_dev_attr_list; |
112 | 113 | struct attribute_group scan_el_group; | |
113 | wait_queue_head_t pollq; | 114 | wait_queue_head_t pollq; |
114 | bool stufftoread; | 115 | bool stufftoread; |
115 | unsigned long flags; | 116 | unsigned long flags; |