aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Cameron <jic23@cam.ac.uk>2011-09-02 12:14:40 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2011-09-06 19:02:01 -0400
commit26d25ae3f0d8ffe350aacc75b71198d6b35bd1f4 (patch)
tree8b7867c7cfb8202e5313c462256ebf7e9932a1f1
parent330c6c57e6284a755d7e8a031b3c917571ee6dc3 (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>
-rw-r--r--drivers/staging/iio/accel/adis16201_core.c16
-rw-r--r--drivers/staging/iio/accel/adis16203_core.c17
-rw-r--r--drivers/staging/iio/accel/adis16204_core.c16
-rw-r--r--drivers/staging/iio/accel/adis16209_core.c16
-rw-r--r--drivers/staging/iio/accel/adis16240_core.c15
-rw-r--r--drivers/staging/iio/accel/lis3l02dq_core.c18
-rw-r--r--drivers/staging/iio/adc/ad7150.c20
-rw-r--r--drivers/staging/iio/adc/ad7291.c12
-rw-r--r--drivers/staging/iio/adc/ad7298_core.c18
-rw-r--r--drivers/staging/iio/adc/ad7476_core.c16
-rw-r--r--drivers/staging/iio/adc/ad7606_core.c17
-rw-r--r--drivers/staging/iio/adc/ad7745.c18
-rw-r--r--drivers/staging/iio/adc/ad7793.c16
-rw-r--r--drivers/staging/iio/adc/ad7816.c15
-rw-r--r--drivers/staging/iio/adc/ad7887_core.c20
-rw-r--r--drivers/staging/iio/adc/ad799x_core.c17
-rw-r--r--drivers/staging/iio/adc/adt7310.c12
-rw-r--r--drivers/staging/iio/adc/adt7410.c11
-rw-r--r--drivers/staging/iio/adc/adt75.c12
-rw-r--r--drivers/staging/iio/adc/max1363_core.c18
-rw-r--r--drivers/staging/iio/addac/adt7316.c13
-rw-r--r--drivers/staging/iio/dac/ad5504.c40
-rw-r--r--drivers/staging/iio/dac/ad5624r_spi.c1
-rw-r--r--drivers/staging/iio/dac/ad5686.c13
-rw-r--r--drivers/staging/iio/dac/ad5791.c2
-rw-r--r--drivers/staging/iio/gyro/adis16060_core.c8
-rw-r--r--drivers/staging/iio/gyro/adis16080_core.c9
-rw-r--r--drivers/staging/iio/gyro/adis16260_core.c15
-rw-r--r--drivers/staging/iio/iio.h7
-rw-r--r--drivers/staging/iio/iio_core.h1
-rw-r--r--drivers/staging/iio/impedance-analyzer/ad5933.c16
-rw-r--r--drivers/staging/iio/imu/adis16400_core.c16
-rw-r--r--drivers/staging/iio/industrialio-core.c226
-rw-r--r--drivers/staging/iio/industrialio-ring.c107
-rw-r--r--drivers/staging/iio/industrialio-trigger.c8
-rw-r--r--drivers/staging/iio/light/tsl2563.c9
-rw-r--r--drivers/staging/iio/meter/ade7753.c15
-rw-r--r--drivers/staging/iio/meter/ade7754.c16
-rw-r--r--drivers/staging/iio/meter/ade7758_core.c18
-rw-r--r--drivers/staging/iio/meter/ade7759.c12
-rw-r--r--drivers/staging/iio/resolver/ad2s1210.c1
-rw-r--r--drivers/staging/iio/ring_generic.h3
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
464static int __devinit adis16201_probe(struct spi_device *spi) 464static 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
520error_remove_trigger: 519error_remove_trigger:
@@ -524,10 +523,7 @@ error_uninitialize_ring:
524error_unreg_ring_funcs: 523error_unreg_ring_funcs:
525 adis16201_unconfigure_ring(indio_dev); 524 adis16201_unconfigure_ring(indio_dev);
526error_free_dev: 525error_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);
531error_ret: 527error_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
420static int __devinit adis16203_probe(struct spi_device *spi) 420static 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
474error_remove_trigger: 474error_remove_trigger:
@@ -478,10 +478,7 @@ error_uninitialize_ring:
478error_unreg_ring_funcs: 478error_unreg_ring_funcs:
479 adis16203_unconfigure_ring(indio_dev); 479 adis16203_unconfigure_ring(indio_dev);
480error_free_dev: 480error_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);
485error_ret: 482error_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
495static int __devinit adis16204_probe(struct spi_device *spi) 495static 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
549error_remove_trigger: 548error_remove_trigger:
@@ -553,10 +552,7 @@ error_uninitialize_ring:
553error_unreg_ring_funcs: 552error_unreg_ring_funcs:
554 adis16204_unconfigure_ring(indio_dev); 553 adis16204_unconfigure_ring(indio_dev);
555error_free_dev: 554error_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);
560error_ret: 556error_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
468static int __devinit adis16209_probe(struct spi_device *spi) 468static 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
522error_remove_trigger: 521error_remove_trigger:
@@ -526,10 +525,7 @@ error_uninitialize_ring:
526error_unreg_ring_funcs: 525error_unreg_ring_funcs:
527 adis16209_unconfigure_ring(indio_dev); 526 adis16209_unconfigure_ring(indio_dev);
528error_free_dev: 527error_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);
533error_ret: 529error_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
520static int __devinit adis16240_probe(struct spi_device *spi) 520static 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
575error_remove_trigger: 573error_remove_trigger:
@@ -579,10 +577,7 @@ error_uninitialize_ring:
579error_unreg_ring_funcs: 577error_unreg_ring_funcs:
580 adis16240_unconfigure_ring(indio_dev); 578 adis16240_unconfigure_ring(indio_dev);
581error_free_dev: 579error_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);
586error_ret: 581error_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
664static int __devinit lis3l02dq_probe(struct spi_device *spi) 664static 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
727error_remove_trigger: 727error_remove_trigger:
@@ -735,9 +735,6 @@ error_uninitialize_ring:
735error_unreg_ring_funcs: 735error_unreg_ring_funcs:
736 lis3l02dq_unconfigure_ring(indio_dev); 736 lis3l02dq_unconfigure_ring(indio_dev);
737error_free_dev: 737error_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);
742error_ret: 739error_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
797err_ret: 793err_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 = {
719static int __devinit ad7150_probe(struct i2c_client *client, 719static 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;
765error_free_irq:
766 if (client->irq)
767 free_irq(client->irq, indio_dev);
765 768
766error_free_dev: 769error_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);
771error_ret: 771error_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
843error_unreg_irq: 843error_unreg_irq:
844 free_irq(client->irq, indio_dev); 844 free_irq(client->irq, indio_dev);
845error_unreg_dev:
846 iio_device_unregister(indio_dev);
847error_free_dev: 845error_free_dev:
848 iio_free_device(indio_dev); 846 iio_free_device(indio_dev);
849error_ret: 847error_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
232error_unregister_ring:
233 iio_ring_buffer_unregister(indio_dev);
234error_cleanup_ring: 234error_cleanup_ring:
235 ad7298_ring_cleanup(indio_dev); 235 ad7298_ring_cleanup(indio_dev);
236error_disable_reg: 236error_disable_reg:
@@ -239,11 +239,7 @@ error_disable_reg:
239error_put_reg: 239error_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
193error_ring_unregister:
194 iio_ring_buffer_unregister(indio_dev);
194error_cleanup_ring: 195error_cleanup_ring:
195 ad7476_ring_cleanup(indio_dev); 196 ad7476_ring_cleanup(indio_dev);
196 iio_device_unregister(indio_dev);
197error_disable_reg: 197error_disable_reg:
198 if (!IS_ERR(st->reg)) 198 if (!IS_ERR(st->reg))
199 regulator_disable(st->reg); 199 regulator_disable(st->reg);
200error_put_reg: 200error_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
205error_ret: 205error_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;
514error_unregister_ring:
515 iio_ring_buffer_unregister(indio_dev);
516 516
517error_cleanup_ring: 517error_cleanup_ring:
518 ad7606_ring_cleanup(indio_dev); 518 ad7606_ring_cleanup(indio_dev);
@@ -529,10 +529,7 @@ error_disable_reg:
529error_put_reg: 529error_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);
536error_ret: 533error_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 = {
578static int __devinit ad774x_probe(struct i2c_client *client, 578static 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
621error_free_irq:
622 free_irq(client->irq, indio_dev);
622error_free_dev: 623error_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);
627error_ret: 625error_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
914error_uninitialize_ring: 913error_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 419error_free_irq:
420error_unreg_dev: 420 free_irq(spi_dev->irq, indio_dev);
421 iio_device_unregister(indio_dev);
422error_free_gpio: 421error_free_gpio:
423 gpio_free(chip->busy_pin); 422 gpio_free(chip->busy_pin);
424error_free_gpio_convert: 423error_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;
203error_unregister_ring:
204 iio_ring_buffer_unregister(indio_dev);
204error_cleanup_ring: 205error_cleanup_ring:
205 ad7887_ring_cleanup(indio_dev); 206 ad7887_ring_cleanup(indio_dev);
206error_disable_reg: 207error_disable_reg:
@@ -209,10 +210,7 @@ error_disable_reg:
209error_put_reg: 210error_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[] = {
657static int __devinit ad799x_probe(struct i2c_client *client, 657static 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
727error_free_irq:
728 free_irq(client->irq, indio_dev);
729error_cleanup_ring: 729error_cleanup_ring:
730 ad799x_ring_cleanup(indio_dev); 730 ad799x_ring_cleanup(indio_dev);
731error_disable_reg: 731error_disable_reg:
@@ -734,10 +734,7 @@ error_disable_reg:
734error_put_reg: 734error_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);
846error_unreg_ct_irq: 846error_unreg_ct_irq:
847 free_irq(spi_dev->irq, indio_dev); 847 free_irq(spi_dev->irq, indio_dev);
848error_unreg_dev:
849 iio_device_unregister(indio_dev);
850error_free_dev: 848error_free_dev:
851 iio_free_device(indio_dev); 849 iio_free_device(indio_dev);
852error_ret: 850error_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);
810error_unreg_ct_irq: 809error_unreg_ct_irq:
811 free_irq(client->irq, indio_dev); 810 free_irq(client->irq, indio_dev);
812error_unreg_dev:
813 iio_device_unregister(indio_dev);
814error_free_dev: 811error_free_dev:
815 iio_free_device(indio_dev); 812 iio_free_device(indio_dev);
816error_ret: 813error_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;
604error_unreg_irq: 604error_unreg_irq:
605 free_irq(client->irq, indio_dev); 605 free_irq(client->irq, indio_dev);
606error_unreg_dev:
607 iio_device_unregister(indio_dev);
608error_free_dev: 606error_free_dev:
609 iio_free_device(indio_dev); 607 iio_free_device(indio_dev);
610error_ret: 608error_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)
1254static int __devinit max1363_probe(struct i2c_client *client, 1254static 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;
1338error_free_irq:
1339 free_irq(st->client->irq, indio_dev);
1339error_uninit_ring: 1340error_uninit_ring:
1340 iio_ring_buffer_unregister(indio_dev); 1341 iio_ring_buffer_unregister(indio_dev);
1341error_cleanup_ring: 1342error_cleanup_ring:
@@ -1343,10 +1344,7 @@ error_cleanup_ring:
1343error_free_available_scan_masks: 1344error_free_available_scan_masks:
1344 kfree(indio_dev->available_scan_masks); 1345 kfree(indio_dev->available_scan_masks);
1345error_free_device: 1346error_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);
1350error_disable_reg: 1348error_disable_reg:
1351 regulator_disable(reg); 1349 regulator_disable(reg);
1352error_put_reg: 1350error_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
2208error_unreg_irq: 2208error_unreg_irq:
2209 free_irq(chip->bus.irq, indio_dev); 2209 free_irq(chip->bus.irq, indio_dev);
2210error_unreg_dev:
2211 iio_device_unregister(indio_dev);
2212error_free_dev: 2210error_free_dev:
2213 iio_free_device(indio_dev); 2211 iio_free_device(indio_dev);
2214error_ret: 2212error_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
335error_unreg_iio_device: 335error_free_irq:
336 iio_device_unregister(indio_dev); 336 free_irq(spi->irq, indio_dev);
337error_free_dev:
338 iio_free_device(indio_dev);
339error_disable_reg: 337error_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);
345error_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
276error_disable_reg: 275error_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
408error_disable_reg: 408error_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
144static int __devinit adis16060_r_probe(struct spi_device *spi) 144static 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
177error_free_dev: 176error_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);
182error_ret: 178error_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
138static int __devinit adis16080_probe(struct spi_device *spi) 138static 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
172error_free_dev: 170error_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);
177error_ret: 172error_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
578static int __devinit adis16260_probe(struct spi_device *spi) 578static 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
659error_remove_trigger: 659error_remove_trigger:
@@ -663,10 +663,7 @@ error_uninitialize_ring:
663error_unreg_ring_funcs: 663error_unreg_ring_funcs:
664 adis16260_unconfigure_ring(indio_dev); 664 adis16260_unconfigure_ring(indio_dev);
665error_free_dev: 665error_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);
670error_ret: 667error_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 **/
290struct iio_dev { 293struct 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
16int __iio_add_chan_devattr(const char *postfix, 16int __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)
675static int __devinit ad5933_probe(struct i2c_client *client, 675static 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
750error_uninitialize_ring: 749error_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
822static int __devinit adis16400_probe(struct spi_device *spi) 822static 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
876error_remove_trigger: 875error_remove_trigger:
@@ -881,10 +880,7 @@ error_uninitialize_ring:
881error_unreg_ring_funcs: 880error_unreg_ring_funcs:
882 adis16400_unconfigure_ring(indio_dev); 881 adis16400_unconfigure_ring(indio_dev);
883error_free_dev: 882error_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);
888error_ret: 884error_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
124int iio_push_event(struct iio_dev *dev_info, u64 ev_code, s64 timestamp) 125int 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
508int __iio_add_chan_devattr(const char *postfix, 509int __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:
565static int iio_device_add_channel_sysfs(struct iio_dev *dev_info, 559static 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;
601error_ret: 598error_ret:
602 return ret; 599 return ret;
603} 600}
@@ -605,8 +602,6 @@ error_ret:
605static void iio_device_remove_and_free_read_attr(struct iio_dev *dev_info, 602static 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
622static DEVICE_ATTR(name, S_IRUGO, iio_show_dev_name, NULL); 617static DEVICE_ATTR(name, S_IRUGO, iio_show_dev_name, NULL);
623 618
624static struct attribute *iio_base_dummy_attrs[] = {
625 NULL
626};
627static struct attribute_group iio_base_dummy_group = {
628 .attrs = iio_base_dummy_attrs,
629};
630
631static int iio_device_register_sysfs(struct iio_dev *dev_info) 619static 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
671error_clear_attrs: 676error_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);
681error_ret:
682 return ret;
683 682
683 return ret;
684} 684}
685 685
686static void iio_device_unregister_sysfs(struct iio_dev *dev_info) 686static 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
705static const char * const iio_ev_type_text[] = { 698static const char * const iio_ev_type_text[] = {
@@ -790,7 +783,7 @@ static ssize_t iio_ev_value_store(struct device *dev,
790static int iio_device_add_event_sysfs(struct iio_dev *dev_info, 783static 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;
857error_ret: 849error_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
875static inline int __iio_add_event_config_attrs(struct iio_dev *dev_info) 864static 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
890error_clear_attrs: 879error_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
896static struct attribute *iio_events_dummy_attrs[] = {
897 NULL
898};
899
900static struct attribute_group iio_events_dummy_group = {
901 .name = "events",
902 .attrs = iio_events_dummy_attrs
903};
904
905static bool iio_check_for_dynamic_events(struct iio_dev *dev_info) 885static 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
905static const char *iio_event_group_name = "events";
925static int iio_device_register_eventset(struct iio_dev *dev_info) 906static 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
968error_free_setup_event_lines: 964error_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);
977error_ret: 967error_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
1130error_free_sysfs:
1131 iio_device_unregister_sysfs(dev_info);
1132error_del_device: 1123error_del_device:
1133 device_del(&dev_info->dev); 1124 device_del(&dev_info->dev);
1125error_unreg_eventset:
1126 iio_device_unregister_eventset(dev_info);
1127error_free_sysfs:
1128 iio_device_unregister_sysfs(dev_info);
1134error_free_ida: 1129error_free_ida:
1135 ida_simple_remove(&iio_ida, dev_info->id); 1130 ida_simple_remove(&iio_ida, dev_info->id);
1136error_ret: 1131error_ret:
@@ -1140,11 +1135,6 @@ EXPORT_SYMBOL(iio_device_register);
1140 1135
1141void iio_device_unregister(struct iio_dev *dev_info) 1136void 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}
1150EXPORT_SYMBOL(iio_device_unregister); 1140EXPORT_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:
207static int iio_ring_add_channel_sysfs(struct iio_dev *indio_dev, 207static 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;
253error_ret: 255error_ret:
254 return ret; 256 return ret;
255} 257}
@@ -257,66 +259,40 @@ error_ret:
257static void iio_ring_remove_and_free_scan_dev_attr(struct iio_dev *indio_dev, 259static 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
266static struct attribute *iio_scan_el_dummy_attrs[] = {
267 NULL
268};
269
270static struct attribute_group iio_scan_el_dummy_group = {
271 .name = "scan_elements",
272 .attrs = iio_scan_el_dummy_attrs
273};
274
275static void __iio_ring_attr_cleanup(struct iio_dev *indio_dev) 266static 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
276static const char * const iio_scan_elements_group_name = "scan_elements";
277
292int iio_ring_buffer_register(struct iio_dev *indio_dev, 278int 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;
348error_cleanup_group: 343
349 if (ring->attrs) 344error_free_scan_mask:
350 sysfs_remove_group(&indio_dev->dev.kobj, ring->attrs); 345 kfree(ring->scan_mask);
351error_cleanup_dynamic: 346error_cleanup_dynamic:
352 __iio_ring_attr_cleanup(indio_dev); 347 __iio_ring_attr_cleanup(indio_dev);
353error_ret: 348
354 return ret; 349 return ret;
355} 350}
356EXPORT_SYMBOL(iio_ring_buffer_register); 351EXPORT_SYMBOL(iio_ring_buffer_register);
@@ -358,9 +353,7 @@ EXPORT_SYMBOL(iio_ring_buffer_register);
358void iio_ring_buffer_unregister(struct iio_dev *indio_dev) 353void 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}
366EXPORT_SYMBOL(iio_ring_buffer_unregister); 359EXPORT_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
476int iio_device_register_trigger_consumer(struct iio_dev *dev_info) 476int 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
482void iio_device_unregister_trigger_consumer(struct iio_dev *dev_info) 484void 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
491int iio_triggered_ring_postenable(struct iio_dev *indio_dev) 491int 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;
776fail3: 777fail3:
777 if (client->irq) 778 if (client->irq)
778 free_irq(client->irq, indio_dev); 779 free_irq(client->irq, indio_dev);
779fail2: 780fail2:
780 iio_device_unregister(indio_dev); 781 iio_free_device(indio_dev);
781fail1: 782fail1:
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
514static int __devinit ade7753_probe(struct spi_device *spi) 514static 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
549error_free_dev: 549error_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
555error_ret: 552error_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
537static int __devinit ade7754_probe(struct spi_device *spi) 537static 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
572error_free_dev: 571error_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
578error_ret: 574error_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
734static int __devinit ade7758_probe(struct spi_device *spi) 734static 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
804error_remove_trigger: 803error_remove_trigger:
@@ -813,10 +812,7 @@ error_free_tx:
813error_free_rx: 812error_free_rx:
814 kfree(st->rx); 813 kfree(st->rx);
815error_free_dev: 814error_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);
820error_ret: 816error_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
494error_unreg_dev:
495 iio_device_unregister(indio_dev);
496error_free_dev: 494error_free_dev:
497 iio_free_device(indio_dev); 495 iio_free_device(indio_dev);
498error_ret: 496error_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;