diff options
author | Dominik Brodowski <linux@dominikbrodowski.net> | 2006-03-31 10:26:06 -0500 |
---|---|---|
committer | Dominik Brodowski <linux@dominikbrodowski.net> | 2006-03-31 10:26:06 -0500 |
commit | 15b99ac1729503db9e6dc642a50b9b6cb3bf51f9 (patch) | |
tree | cfb8897487beba502aac2b28bc35066a87e34299 /drivers/char | |
parent | fba395eee7d3f342ca739c20f5b3ee635d0420a0 (diff) |
[PATCH] pcmcia: add return value to _config() functions
Most of the driver initialization isn't done in the .probe function, but in
the internal _config() functions. Make them return a value, so that .probe
can properly report whether the probing of the device succeeded or not.
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/pcmcia/cm4000_cs.c | 15 | ||||
-rw-r--r-- | drivers/char/pcmcia/cm4040_cs.c | 15 | ||||
-rw-r--r-- | drivers/char/pcmcia/synclink_cs.c | 16 |
3 files changed, 28 insertions, 18 deletions
diff --git a/drivers/char/pcmcia/cm4000_cs.c b/drivers/char/pcmcia/cm4000_cs.c index 79b8ad0e32d..22dce9d47b2 100644 --- a/drivers/char/pcmcia/cm4000_cs.c +++ b/drivers/char/pcmcia/cm4000_cs.c | |||
@@ -1759,7 +1759,7 @@ static void cmm_cm4000_release(struct pcmcia_device * link) | |||
1759 | 1759 | ||
1760 | /*==== Interface to PCMCIA Layer =======================================*/ | 1760 | /*==== Interface to PCMCIA Layer =======================================*/ |
1761 | 1761 | ||
1762 | static void cm4000_config(struct pcmcia_device * link, int devno) | 1762 | static int cm4000_config(struct pcmcia_device * link, int devno) |
1763 | { | 1763 | { |
1764 | struct cm4000_dev *dev; | 1764 | struct cm4000_dev *dev; |
1765 | tuple_t tuple; | 1765 | tuple_t tuple; |
@@ -1846,7 +1846,7 @@ static void cm4000_config(struct pcmcia_device * link, int devno) | |||
1846 | link->dev_node = &dev->node; | 1846 | link->dev_node = &dev->node; |
1847 | link->state &= ~DEV_CONFIG_PENDING; | 1847 | link->state &= ~DEV_CONFIG_PENDING; |
1848 | 1848 | ||
1849 | return; | 1849 | return 0; |
1850 | 1850 | ||
1851 | cs_failed: | 1851 | cs_failed: |
1852 | cs_error(link, fail_fn, fail_rc); | 1852 | cs_error(link, fail_fn, fail_rc); |
@@ -1854,6 +1854,7 @@ cs_release: | |||
1854 | cm4000_release(link); | 1854 | cm4000_release(link); |
1855 | 1855 | ||
1856 | link->state &= ~DEV_CONFIG_PENDING; | 1856 | link->state &= ~DEV_CONFIG_PENDING; |
1857 | return -ENODEV; | ||
1857 | } | 1858 | } |
1858 | 1859 | ||
1859 | static int cm4000_suspend(struct pcmcia_device *link) | 1860 | static int cm4000_suspend(struct pcmcia_device *link) |
@@ -1883,10 +1884,10 @@ static void cm4000_release(struct pcmcia_device *link) | |||
1883 | pcmcia_disable_device(link); | 1884 | pcmcia_disable_device(link); |
1884 | } | 1885 | } |
1885 | 1886 | ||
1886 | static int cm4000_attach(struct pcmcia_device *link) | 1887 | static int cm4000_probe(struct pcmcia_device *link) |
1887 | { | 1888 | { |
1888 | struct cm4000_dev *dev; | 1889 | struct cm4000_dev *dev; |
1889 | int i; | 1890 | int i, ret; |
1890 | 1891 | ||
1891 | for (i = 0; i < CM4000_MAX_DEV; i++) | 1892 | for (i = 0; i < CM4000_MAX_DEV; i++) |
1892 | if (dev_table[i] == NULL) | 1893 | if (dev_table[i] == NULL) |
@@ -1913,7 +1914,9 @@ static int cm4000_attach(struct pcmcia_device *link) | |||
1913 | init_waitqueue_head(&dev->readq); | 1914 | init_waitqueue_head(&dev->readq); |
1914 | 1915 | ||
1915 | link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; | 1916 | link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; |
1916 | cm4000_config(link, i); | 1917 | ret = cm4000_config(link, i); |
1918 | if (ret) | ||
1919 | return ret; | ||
1917 | 1920 | ||
1918 | class_device_create(cmm_class, NULL, MKDEV(major, i), NULL, | 1921 | class_device_create(cmm_class, NULL, MKDEV(major, i), NULL, |
1919 | "cmm%d", i); | 1922 | "cmm%d", i); |
@@ -1968,7 +1971,7 @@ static struct pcmcia_driver cm4000_driver = { | |||
1968 | .drv = { | 1971 | .drv = { |
1969 | .name = "cm4000_cs", | 1972 | .name = "cm4000_cs", |
1970 | }, | 1973 | }, |
1971 | .probe = cm4000_attach, | 1974 | .probe = cm4000_probe, |
1972 | .remove = cm4000_detach, | 1975 | .remove = cm4000_detach, |
1973 | .suspend = cm4000_suspend, | 1976 | .suspend = cm4000_suspend, |
1974 | .resume = cm4000_resume, | 1977 | .resume = cm4000_resume, |
diff --git a/drivers/char/pcmcia/cm4040_cs.c b/drivers/char/pcmcia/cm4040_cs.c index 8334226e103..6ccca8cbabc 100644 --- a/drivers/char/pcmcia/cm4040_cs.c +++ b/drivers/char/pcmcia/cm4040_cs.c | |||
@@ -514,7 +514,7 @@ static void cm4040_reader_release(struct pcmcia_device *link) | |||
514 | return; | 514 | return; |
515 | } | 515 | } |
516 | 516 | ||
517 | static void reader_config(struct pcmcia_device *link, int devno) | 517 | static int reader_config(struct pcmcia_device *link, int devno) |
518 | { | 518 | { |
519 | struct reader_dev *dev; | 519 | struct reader_dev *dev; |
520 | tuple_t tuple; | 520 | tuple_t tuple; |
@@ -610,13 +610,14 @@ static void reader_config(struct pcmcia_device *link, int devno) | |||
610 | link->io.BasePort1, link->io.BasePort1+link->io.NumPorts1); | 610 | link->io.BasePort1, link->io.BasePort1+link->io.NumPorts1); |
611 | DEBUGP(2, dev, "<- reader_config (succ)\n"); | 611 | DEBUGP(2, dev, "<- reader_config (succ)\n"); |
612 | 612 | ||
613 | return; | 613 | return 0; |
614 | 614 | ||
615 | cs_failed: | 615 | cs_failed: |
616 | cs_error(link, fail_fn, fail_rc); | 616 | cs_error(link, fail_fn, fail_rc); |
617 | cs_release: | 617 | cs_release: |
618 | reader_release(link); | 618 | reader_release(link); |
619 | link->state &= ~DEV_CONFIG_PENDING; | 619 | link->state &= ~DEV_CONFIG_PENDING; |
620 | return -ENODEV; | ||
620 | } | 621 | } |
621 | 622 | ||
622 | static void reader_release(struct pcmcia_device *link) | 623 | static void reader_release(struct pcmcia_device *link) |
@@ -625,10 +626,10 @@ static void reader_release(struct pcmcia_device *link) | |||
625 | pcmcia_disable_device(link); | 626 | pcmcia_disable_device(link); |
626 | } | 627 | } |
627 | 628 | ||
628 | static int reader_attach(struct pcmcia_device *link) | 629 | static int reader_probe(struct pcmcia_device *link) |
629 | { | 630 | { |
630 | struct reader_dev *dev; | 631 | struct reader_dev *dev; |
631 | int i; | 632 | int i, ret; |
632 | 633 | ||
633 | for (i = 0; i < CM_MAX_DEV; i++) { | 634 | for (i = 0; i < CM_MAX_DEV; i++) { |
634 | if (dev_table[i] == NULL) | 635 | if (dev_table[i] == NULL) |
@@ -659,7 +660,9 @@ static int reader_attach(struct pcmcia_device *link) | |||
659 | dev->poll_timer.function = &cm4040_do_poll; | 660 | dev->poll_timer.function = &cm4040_do_poll; |
660 | 661 | ||
661 | link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; | 662 | link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; |
662 | reader_config(link, i); | 663 | ret = reader_config(link, i); |
664 | if (ret) | ||
665 | return ret; | ||
663 | 666 | ||
664 | class_device_create(cmx_class, NULL, MKDEV(major, i), NULL, | 667 | class_device_create(cmx_class, NULL, MKDEV(major, i), NULL, |
665 | "cmx%d", i); | 668 | "cmx%d", i); |
@@ -715,7 +718,7 @@ static struct pcmcia_driver reader_driver = { | |||
715 | .drv = { | 718 | .drv = { |
716 | .name = "cm4040_cs", | 719 | .name = "cm4040_cs", |
717 | }, | 720 | }, |
718 | .probe = reader_attach, | 721 | .probe = reader_probe, |
719 | .remove = reader_detach, | 722 | .remove = reader_detach, |
720 | .id_table = cm4040_ids, | 723 | .id_table = cm4040_ids, |
721 | }; | 724 | }; |
diff --git a/drivers/char/pcmcia/synclink_cs.c b/drivers/char/pcmcia/synclink_cs.c index 9bfd90e5d6b..ef7a81314f0 100644 --- a/drivers/char/pcmcia/synclink_cs.c +++ b/drivers/char/pcmcia/synclink_cs.c | |||
@@ -484,7 +484,7 @@ static void mgslpc_wait_until_sent(struct tty_struct *tty, int timeout); | |||
484 | 484 | ||
485 | /* PCMCIA prototypes */ | 485 | /* PCMCIA prototypes */ |
486 | 486 | ||
487 | static void mgslpc_config(struct pcmcia_device *link); | 487 | static int mgslpc_config(struct pcmcia_device *link); |
488 | static void mgslpc_release(u_long arg); | 488 | static void mgslpc_release(u_long arg); |
489 | static void mgslpc_detach(struct pcmcia_device *p_dev); | 489 | static void mgslpc_detach(struct pcmcia_device *p_dev); |
490 | 490 | ||
@@ -533,9 +533,10 @@ static void ldisc_receive_buf(struct tty_struct *tty, | |||
533 | } | 533 | } |
534 | } | 534 | } |
535 | 535 | ||
536 | static int mgslpc_attach(struct pcmcia_device *link) | 536 | static int mgslpc_probe(struct pcmcia_device *link) |
537 | { | 537 | { |
538 | MGSLPC_INFO *info; | 538 | MGSLPC_INFO *info; |
539 | int ret; | ||
539 | 540 | ||
540 | if (debug_level >= DEBUG_LEVEL_INFO) | 541 | if (debug_level >= DEBUG_LEVEL_INFO) |
541 | printk("mgslpc_attach\n"); | 542 | printk("mgslpc_attach\n"); |
@@ -578,7 +579,9 @@ static int mgslpc_attach(struct pcmcia_device *link) | |||
578 | link->conf.IntType = INT_MEMORY_AND_IO; | 579 | link->conf.IntType = INT_MEMORY_AND_IO; |
579 | 580 | ||
580 | link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; | 581 | link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; |
581 | mgslpc_config(link); | 582 | ret = mgslpc_config(link); |
583 | if (ret) | ||
584 | return ret; | ||
582 | 585 | ||
583 | mgslpc_add_device(info); | 586 | mgslpc_add_device(info); |
584 | 587 | ||
@@ -591,7 +594,7 @@ static int mgslpc_attach(struct pcmcia_device *link) | |||
591 | #define CS_CHECK(fn, ret) \ | 594 | #define CS_CHECK(fn, ret) \ |
592 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) | 595 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) |
593 | 596 | ||
594 | static void mgslpc_config(struct pcmcia_device *link) | 597 | static int mgslpc_config(struct pcmcia_device *link) |
595 | { | 598 | { |
596 | MGSLPC_INFO *info = link->priv; | 599 | MGSLPC_INFO *info = link->priv; |
597 | tuple_t tuple; | 600 | tuple_t tuple; |
@@ -680,11 +683,12 @@ static void mgslpc_config(struct pcmcia_device *link) | |||
680 | printk("\n"); | 683 | printk("\n"); |
681 | 684 | ||
682 | link->state &= ~DEV_CONFIG_PENDING; | 685 | link->state &= ~DEV_CONFIG_PENDING; |
683 | return; | 686 | return 0; |
684 | 687 | ||
685 | cs_failed: | 688 | cs_failed: |
686 | cs_error(link, last_fn, last_ret); | 689 | cs_error(link, last_fn, last_ret); |
687 | mgslpc_release((u_long)link); | 690 | mgslpc_release((u_long)link); |
691 | return -ENODEV; | ||
688 | } | 692 | } |
689 | 693 | ||
690 | /* Card has been removed. | 694 | /* Card has been removed. |
@@ -3003,7 +3007,7 @@ static struct pcmcia_driver mgslpc_driver = { | |||
3003 | .drv = { | 3007 | .drv = { |
3004 | .name = "synclink_cs", | 3008 | .name = "synclink_cs", |
3005 | }, | 3009 | }, |
3006 | .probe = mgslpc_attach, | 3010 | .probe = mgslpc_probe, |
3007 | .remove = mgslpc_detach, | 3011 | .remove = mgslpc_detach, |
3008 | .id_table = mgslpc_ids, | 3012 | .id_table = mgslpc_ids, |
3009 | .suspend = mgslpc_suspend, | 3013 | .suspend = mgslpc_suspend, |