e1323e4edcece890e8df8024d4992550bdd2948d
[openembedded.git] /
1 From cbe46408b666983284e8be290950d526dbc0f0a4 Mon Sep 17 00:00:00 2001
2 From: Dmitry Baryshkov <dbaryshkov@gmail.com>
3 Date: Wed, 9 Jan 2008 02:08:16 +0300
4 Subject: [PATCH 26/64] I don't think we should check for IRQs when determining which one
5  of power supplies to register. Better use is_{ac,usb}_online
6  callbacks, this will not produce an obstacle to implement polling --
7  when irqs aren't mandatory. I'll send my two pending patches to show
8  the idea.
9
10 For this particular issue, I think something like that should work.
11 If it works for you, I'll commit that version, preserving your
12 authorship, of course.
13 ---
14  drivers/power/pda_power.c |   80 ++++++++++++++++++++++++--------------------
15  1 files changed, 44 insertions(+), 36 deletions(-)
16
17 diff --git a/drivers/power/pda_power.c b/drivers/power/pda_power.c
18 index c058f28..d98622f 100644
19 --- a/drivers/power/pda_power.c
20 +++ b/drivers/power/pda_power.c
21 @@ -168,66 +168,74 @@ static int pda_power_probe(struct platform_device *pdev)
22                 pda_power_supplies[1].num_supplicants = pdata->num_supplicants;
23         }
24  
25 -       ret = power_supply_register(&pdev->dev, &pda_power_supplies[0]);
26 -       if (ret) {
27 -               dev_err(dev, "failed to register %s power supply\n",
28 -                       pda_power_supplies[0].name);
29 -               goto supply0_failed;
30 -       }
31 +       if (pdata->is_ac_online) {
32 +               ret = power_supply_register(&pdev->dev, &pda_power_supplies[0]);
33 +               if (ret) {
34 +                       dev_err(dev, "failed to register %s power supply\n",
35 +                               pda_power_supplies[0].name);
36 +                       goto ac_supply_failed;
37 +               }
38  
39 -       ret = power_supply_register(&pdev->dev, &pda_power_supplies[1]);
40 -       if (ret) {
41 -               dev_err(dev, "failed to register %s power supply\n",
42 -                       pda_power_supplies[1].name);
43 -               goto supply1_failed;
44 +               if (ac_irq) {
45 +                       ret = request_irq(ac_irq->start, power_changed_isr,
46 +                                         get_irq_flags(ac_irq), ac_irq->name,
47 +                                         &pda_power_supplies[0]);
48 +                       if (ret) {
49 +                               dev_err(dev, "request ac irq failed\n");
50 +                               goto ac_irq_failed;
51 +                       }
52 +               }
53         }
54  
55 -       if (ac_irq) {
56 -               ret = request_irq(ac_irq->start, power_changed_isr,
57 -                                 get_irq_flags(ac_irq), ac_irq->name,
58 -                                 &pda_power_supplies[0]);
59 +       if (pdata->is_usb_online) {
60 +               ret = power_supply_register(&pdev->dev, &pda_power_supplies[1]);
61                 if (ret) {
62 -                       dev_err(dev, "request ac irq failed\n");
63 -                       goto ac_irq_failed;
64 +                       dev_err(dev, "failed to register %s power supply\n",
65 +                               pda_power_supplies[1].name);
66 +                       goto usb_supply_failed;
67                 }
68 -       }
69  
70 -       if (usb_irq) {
71 -               ret = request_irq(usb_irq->start, power_changed_isr,
72 -                                 get_irq_flags(usb_irq), usb_irq->name,
73 -                                 &pda_power_supplies[1]);
74 -               if (ret) {
75 -                       dev_err(dev, "request usb irq failed\n");
76 -                       goto usb_irq_failed;
77 +               if (usb_irq) {
78 +                       ret = request_irq(usb_irq->start, power_changed_isr,
79 +                                         get_irq_flags(usb_irq),
80 +                                         usb_irq->name,
81 +                                         &pda_power_supplies[1]);
82 +                       if (ret) {
83 +                               dev_err(dev, "request usb irq failed\n");
84 +                               goto usb_irq_failed;
85 +                       }
86                 }
87         }
88  
89 -       goto success;
90 +       return 0;
91  
92  usb_irq_failed:
93 -       if (ac_irq)
94 +       if (pdata->is_usb_online)
95 +               power_supply_unregister(&pda_power_supplies[1]);
96 +usb_supply_failed:
97 +       if (pdata->is_ac_online && ac_irq)
98                 free_irq(ac_irq->start, &pda_power_supplies[0]);
99  ac_irq_failed:
100 -       power_supply_unregister(&pda_power_supplies[1]);
101 -supply1_failed:
102 -       power_supply_unregister(&pda_power_supplies[0]);
103 -supply0_failed:
104 +       if (pdata->is_ac_online)
105 +               power_supply_unregister(&pda_power_supplies[0]);
106 +ac_supply_failed:
107  noirqs:
108  wrongid:
109 -success:
110         return ret;
111  }
112  
113  static int pda_power_remove(struct platform_device *pdev)
114  {
115 -       if (usb_irq)
116 +       if (pdata->is_usb_online && usb_irq)
117                 free_irq(usb_irq->start, &pda_power_supplies[1]);
118 -       if (ac_irq)
119 +       if (pdata->is_ac_online && ac_irq)
120                 free_irq(ac_irq->start, &pda_power_supplies[0]);
121         del_timer_sync(&charger_timer);
122         del_timer_sync(&supply_timer);
123 -       power_supply_unregister(&pda_power_supplies[1]);
124 -       power_supply_unregister(&pda_power_supplies[0]);
125 +       if (pdata->is_usb_online)
126 +               power_supply_unregister(&pda_power_supplies[1]);
127 +       if (pdata->is_ac_online)
128 +               power_supply_unregister(&pda_power_supplies[0]);
129         return 0;
130  }
131  
132 -- 
133 1.5.3.8
134