Commit 859cb7f2a4244ea6da206d3fe9cc8a6810947a68

Authored by Richard Purdie
1 parent 0081e8020e

leds: Add suspend/resume to the core class

Add suspend/resume to the core class and remove all the now unneeded
code from various drivers. Originally the class code couldn't support
suspend/resume but since class_device can there is no reason for
each driver doing its own suspend/resume anymore.

Showing 13 changed files with 44 additions and 273 deletions Side-by-side Diff

drivers/leds/led-class.c
... ... @@ -91,6 +91,26 @@
91 91 }
92 92 EXPORT_SYMBOL_GPL(led_classdev_resume);
93 93  
  94 +static int led_suspend(struct device *dev, pm_message_t state)
  95 +{
  96 + struct led_classdev *led_cdev = dev_get_drvdata(dev);
  97 +
  98 + if (led_cdev->flags & LED_CORE_SUSPENDRESUME)
  99 + led_classdev_suspend(led_cdev);
  100 +
  101 + return 0;
  102 +}
  103 +
  104 +static int led_resume(struct device *dev)
  105 +{
  106 + struct led_classdev *led_cdev = dev_get_drvdata(dev);
  107 +
  108 + if (led_cdev->flags & LED_CORE_SUSPENDRESUME)
  109 + led_classdev_resume(led_cdev);
  110 +
  111 + return 0;
  112 +}
  113 +
94 114 /**
95 115 * led_classdev_register - register a new object of led_classdev class.
96 116 * @parent: The device to register.
... ... @@ -174,6 +194,8 @@
174 194 leds_class = class_create(THIS_MODULE, "leds");
175 195 if (IS_ERR(leds_class))
176 196 return PTR_ERR(leds_class);
  197 + leds_class->suspend = led_suspend;
  198 + leds_class->resume = led_resume;
177 199 return 0;
178 200 }
179 201  
drivers/leds/leds-alix2.c
... ... @@ -65,39 +65,13 @@
65 65 },
66 66 };
67 67  
68   -#ifdef CONFIG_PM
69   -
70   -static int alix_led_suspend(struct platform_device *dev, pm_message_t state)
71   -{
72   - int i;
73   -
74   - for (i = 0; i < ARRAY_SIZE(alix_leds); i++)
75   - led_classdev_suspend(&alix_leds[i].cdev);
76   - return 0;
77   -}
78   -
79   -static int alix_led_resume(struct platform_device *dev)
80   -{
81   - int i;
82   -
83   - for (i = 0; i < ARRAY_SIZE(alix_leds); i++)
84   - led_classdev_resume(&alix_leds[i].cdev);
85   - return 0;
86   -}
87   -
88   -#else
89   -
90   -#define alix_led_suspend NULL
91   -#define alix_led_resume NULL
92   -
93   -#endif
94   -
95 68 static int __init alix_led_probe(struct platform_device *pdev)
96 69 {
97 70 int i;
98 71 int ret;
99 72  
100 73 for (i = 0; i < ARRAY_SIZE(alix_leds); i++) {
  74 + alix_leds[i].cdev.flags |= LED_CORE_SUSPENDRESUME;
101 75 ret = led_classdev_register(&pdev->dev, &alix_leds[i].cdev);
102 76 if (ret < 0)
103 77 goto fail;
... ... @@ -121,8 +95,6 @@
121 95  
122 96 static struct platform_driver alix_led_driver = {
123 97 .remove = alix_led_remove,
124   - .suspend = alix_led_suspend,
125   - .resume = alix_led_resume,
126 98 .driver = {
127 99 .name = KBUILD_MODNAME,
128 100 .owner = THIS_MODULE,
drivers/leds/leds-ams-delta.c
... ... @@ -79,37 +79,12 @@
79 79 },
80 80 };
81 81  
82   -#ifdef CONFIG_PM
83   -static int ams_delta_led_suspend(struct platform_device *dev,
84   - pm_message_t state)
85   -{
86   - int i;
87   -
88   - for (i = 0; i < ARRAY_SIZE(ams_delta_leds); i++)
89   - led_classdev_suspend(&ams_delta_leds[i].cdev);
90   -
91   - return 0;
92   -}
93   -
94   -static int ams_delta_led_resume(struct platform_device *dev)
95   -{
96   - int i;
97   -
98   - for (i = 0; i < ARRAY_SIZE(ams_delta_leds); i++)
99   - led_classdev_resume(&ams_delta_leds[i].cdev);
100   -
101   - return 0;
102   -}
103   -#else
104   -#define ams_delta_led_suspend NULL
105   -#define ams_delta_led_resume NULL
106   -#endif
107   -
108 82 static int ams_delta_led_probe(struct platform_device *pdev)
109 83 {
110 84 int i, ret;
111 85  
112 86 for (i = 0; i < ARRAY_SIZE(ams_delta_leds); i++) {
  87 + ams_delta_leds[i].cdev.flags |= LED_CORE_SUSPENDRESUME;
113 88 ret = led_classdev_register(&pdev->dev,
114 89 &ams_delta_leds[i].cdev);
115 90 if (ret < 0)
... ... @@ -136,8 +111,6 @@
136 111 static struct platform_driver ams_delta_led_driver = {
137 112 .probe = ams_delta_led_probe,
138 113 .remove = ams_delta_led_remove,
139   - .suspend = ams_delta_led_suspend,
140   - .resume = ams_delta_led_resume,
141 114 .driver = {
142 115 .name = "ams-delta-led",
143 116 .owner = THIS_MODULE,
drivers/leds/leds-clevo-mail.c
... ... @@ -142,6 +142,7 @@
142 142 .name = "clevo::mail",
143 143 .brightness_set = clevo_mail_led_set,
144 144 .blink_set = clevo_mail_led_blink,
  145 + .flags = LED_CORE_SUSPENDRESUME,
145 146 };
146 147  
147 148 static int __init clevo_mail_led_probe(struct platform_device *pdev)
148 149  
... ... @@ -155,29 +156,9 @@
155 156 return 0;
156 157 }
157 158  
158   -#ifdef CONFIG_PM
159   -static int clevo_mail_led_suspend(struct platform_device *dev,
160   - pm_message_t state)
161   -{
162   - led_classdev_suspend(&clevo_mail_led);
163   - return 0;
164   -}
165   -
166   -static int clevo_mail_led_resume(struct platform_device *dev)
167   -{
168   - led_classdev_resume(&clevo_mail_led);
169   - return 0;
170   -}
171   -#else
172   -#define clevo_mail_led_suspend NULL
173   -#define clevo_mail_led_resume NULL
174   -#endif
175   -
176 159 static struct platform_driver clevo_mail_led_driver = {
177 160 .probe = clevo_mail_led_probe,
178 161 .remove = clevo_mail_led_remove,
179   - .suspend = clevo_mail_led_suspend,
180   - .resume = clevo_mail_led_resume,
181 162 .driver = {
182 163 .name = KBUILD_MODNAME,
183 164 .owner = THIS_MODULE,
drivers/leds/leds-fsg.c
... ... @@ -99,64 +99,43 @@
99 99 }
100 100  
101 101  
102   -
103 102 static struct led_classdev fsg_wlan_led = {
104 103 .name = "fsg:blue:wlan",
105 104 .brightness_set = fsg_led_wlan_set,
  105 + .flags = LED_CORE_SUSPENDRESUME,
106 106 };
107 107  
108 108 static struct led_classdev fsg_wan_led = {
109 109 .name = "fsg:blue:wan",
110 110 .brightness_set = fsg_led_wan_set,
  111 + .flags = LED_CORE_SUSPENDRESUME,
111 112 };
112 113  
113 114 static struct led_classdev fsg_sata_led = {
114 115 .name = "fsg:blue:sata",
115 116 .brightness_set = fsg_led_sata_set,
  117 + .flags = LED_CORE_SUSPENDRESUME,
116 118 };
117 119  
118 120 static struct led_classdev fsg_usb_led = {
119 121 .name = "fsg:blue:usb",
120 122 .brightness_set = fsg_led_usb_set,
  123 + .flags = LED_CORE_SUSPENDRESUME,
121 124 };
122 125  
123 126 static struct led_classdev fsg_sync_led = {
124 127 .name = "fsg:blue:sync",
125 128 .brightness_set = fsg_led_sync_set,
  129 + .flags = LED_CORE_SUSPENDRESUME,
126 130 };
127 131  
128 132 static struct led_classdev fsg_ring_led = {
129 133 .name = "fsg:blue:ring",
130 134 .brightness_set = fsg_led_ring_set,
  135 + .flags = LED_CORE_SUSPENDRESUME,
131 136 };
132 137  
133 138  
134   -
135   -#ifdef CONFIG_PM
136   -static int fsg_led_suspend(struct platform_device *dev, pm_message_t state)
137   -{
138   - led_classdev_suspend(&fsg_wlan_led);
139   - led_classdev_suspend(&fsg_wan_led);
140   - led_classdev_suspend(&fsg_sata_led);
141   - led_classdev_suspend(&fsg_usb_led);
142   - led_classdev_suspend(&fsg_sync_led);
143   - led_classdev_suspend(&fsg_ring_led);
144   - return 0;
145   -}
146   -
147   -static int fsg_led_resume(struct platform_device *dev)
148   -{
149   - led_classdev_resume(&fsg_wlan_led);
150   - led_classdev_resume(&fsg_wan_led);
151   - led_classdev_resume(&fsg_sata_led);
152   - led_classdev_resume(&fsg_usb_led);
153   - led_classdev_resume(&fsg_sync_led);
154   - led_classdev_resume(&fsg_ring_led);
155   - return 0;
156   -}
157   -#endif
158   -
159   -
160 139 static int fsg_led_probe(struct platform_device *pdev)
161 140 {
162 141 int ret;
... ... @@ -232,10 +211,6 @@
232 211 static struct platform_driver fsg_led_driver = {
233 212 .probe = fsg_led_probe,
234 213 .remove = fsg_led_remove,
235   -#ifdef CONFIG_PM
236   - .suspend = fsg_led_suspend,
237   - .resume = fsg_led_resume,
238   -#endif
239 214 .driver = {
240 215 .name = "fsg-led",
241 216 },
drivers/leds/leds-gpio.c
... ... @@ -105,6 +105,7 @@
105 105 }
106 106 led_dat->cdev.brightness_set = gpio_led_set;
107 107 led_dat->cdev.brightness = LED_OFF;
  108 + led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME;
108 109  
109 110 gpio_direction_output(led_dat->gpio, led_dat->active_low);
110 111  
111 112  
... ... @@ -154,44 +155,9 @@
154 155 return 0;
155 156 }
156 157  
157   -#ifdef CONFIG_PM
158   -static int gpio_led_suspend(struct platform_device *pdev, pm_message_t state)
159   -{
160   - struct gpio_led_platform_data *pdata = pdev->dev.platform_data;
161   - struct gpio_led_data *leds_data;
162   - int i;
163   -
164   - leds_data = platform_get_drvdata(pdev);
165   -
166   - for (i = 0; i < pdata->num_leds; i++)
167   - led_classdev_suspend(&leds_data[i].cdev);
168   -
169   - return 0;
170   -}
171   -
172   -static int gpio_led_resume(struct platform_device *pdev)
173   -{
174   - struct gpio_led_platform_data *pdata = pdev->dev.platform_data;
175   - struct gpio_led_data *leds_data;
176   - int i;
177   -
178   - leds_data = platform_get_drvdata(pdev);
179   -
180   - for (i = 0; i < pdata->num_leds; i++)
181   - led_classdev_resume(&leds_data[i].cdev);
182   -
183   - return 0;
184   -}
185   -#else
186   -#define gpio_led_suspend NULL
187   -#define gpio_led_resume NULL
188   -#endif
189   -
190 158 static struct platform_driver gpio_led_driver = {
191 159 .probe = gpio_led_probe,
192 160 .remove = __devexit_p(gpio_led_remove),
193   - .suspend = gpio_led_suspend,
194   - .resume = gpio_led_resume,
195 161 .driver = {
196 162 .name = "leds-gpio",
197 163 .owner = THIS_MODULE,
drivers/leds/leds-hp-disk.c
... ... @@ -68,25 +68,9 @@
68 68 .name = "hp:red:hddprotection",
69 69 .default_trigger = "heartbeat",
70 70 .brightness_set = hpled_set,
  71 + .flags = LED_CORE_SUSPENDRESUME,
71 72 };
72 73  
73   -#ifdef CONFIG_PM
74   -static int hpled_suspend(struct acpi_device *dev, pm_message_t state)
75   -{
76   - led_classdev_suspend(&hpled_led);
77   - return 0;
78   -}
79   -
80   -static int hpled_resume(struct acpi_device *dev)
81   -{
82   - led_classdev_resume(&hpled_led);
83   - return 0;
84   -}
85   -#else
86   -#define hpled_suspend NULL
87   -#define hpled_resume NULL
88   -#endif
89   -
90 74 static int hpled_add(struct acpi_device *device)
91 75 {
92 76 int ret;
... ... @@ -121,8 +105,6 @@
121 105 .ops = {
122 106 .add = hpled_add,
123 107 .remove = hpled_remove,
124   - .suspend = hpled_suspend,
125   - .resume = hpled_resume,
126 108 }
127 109 };
128 110  
drivers/leds/leds-hp6xx.c
... ... @@ -45,30 +45,16 @@
45 45 .name = "hp6xx:red",
46 46 .default_trigger = "hp6xx-charge",
47 47 .brightness_set = hp6xxled_red_set,
  48 + .flags = LED_CORE_SUSPENDRESUME,
48 49 };
49 50  
50 51 static struct led_classdev hp6xx_green_led = {
51 52 .name = "hp6xx:green",
52 53 .default_trigger = "ide-disk",
53 54 .brightness_set = hp6xxled_green_set,
  55 + .flags = LED_CORE_SUSPENDRESUME,
54 56 };
55 57  
56   -#ifdef CONFIG_PM
57   -static int hp6xxled_suspend(struct platform_device *dev, pm_message_t state)
58   -{
59   - led_classdev_suspend(&hp6xx_red_led);
60   - led_classdev_suspend(&hp6xx_green_led);
61   - return 0;
62   -}
63   -
64   -static int hp6xxled_resume(struct platform_device *dev)
65   -{
66   - led_classdev_resume(&hp6xx_red_led);
67   - led_classdev_resume(&hp6xx_green_led);
68   - return 0;
69   -}
70   -#endif
71   -
72 58 static int hp6xxled_probe(struct platform_device *pdev)
73 59 {
74 60 int ret;
... ... @@ -98,10 +84,6 @@
98 84 static struct platform_driver hp6xxled_driver = {
99 85 .probe = hp6xxled_probe,
100 86 .remove = hp6xxled_remove,
101   -#ifdef CONFIG_PM
102   - .suspend = hp6xxled_suspend,
103   - .resume = hp6xxled_resume,
104   -#endif
105 87 .driver = {
106 88 .name = "hp6xx-led",
107 89 .owner = THIS_MODULE,
drivers/leds/leds-net48xx.c
... ... @@ -33,26 +33,9 @@
33 33 static struct led_classdev net48xx_error_led = {
34 34 .name = "net48xx::error",
35 35 .brightness_set = net48xx_error_led_set,
  36 + .flags = LED_CORE_SUSPENDRESUME,
36 37 };
37 38  
38   -#ifdef CONFIG_PM
39   -static int net48xx_led_suspend(struct platform_device *dev,
40   - pm_message_t state)
41   -{
42   - led_classdev_suspend(&net48xx_error_led);
43   - return 0;
44   -}
45   -
46   -static int net48xx_led_resume(struct platform_device *dev)
47   -{
48   - led_classdev_resume(&net48xx_error_led);
49   - return 0;
50   -}
51   -#else
52   -#define net48xx_led_suspend NULL
53   -#define net48xx_led_resume NULL
54   -#endif
55   -
56 39 static int net48xx_led_probe(struct platform_device *pdev)
57 40 {
58 41 return led_classdev_register(&pdev->dev, &net48xx_error_led);
... ... @@ -67,8 +50,6 @@
67 50 static struct platform_driver net48xx_led_driver = {
68 51 .probe = net48xx_led_probe,
69 52 .remove = net48xx_led_remove,
70   - .suspend = net48xx_led_suspend,
71   - .resume = net48xx_led_resume,
72 53 .driver = {
73 54 .name = DRVNAME,
74 55 .owner = THIS_MODULE,
drivers/leds/leds-s3c24xx.c
... ... @@ -82,6 +82,7 @@
82 82 led->cdev.brightness_set = s3c24xx_led_set;
83 83 led->cdev.default_trigger = pdata->def_trigger;
84 84 led->cdev.name = pdata->name;
  85 + led->cdev.flags |= LED_CORE_SUSPENDRESUME;
85 86  
86 87 led->pdata = pdata;
87 88  
88 89  
... ... @@ -111,33 +112,9 @@
111 112 return ret;
112 113 }
113 114  
114   -
115   -#ifdef CONFIG_PM
116   -static int s3c24xx_led_suspend(struct platform_device *dev, pm_message_t state)
117   -{
118   - struct s3c24xx_gpio_led *led = pdev_to_gpio(dev);
119   -
120   - led_classdev_suspend(&led->cdev);
121   - return 0;
122   -}
123   -
124   -static int s3c24xx_led_resume(struct platform_device *dev)
125   -{
126   - struct s3c24xx_gpio_led *led = pdev_to_gpio(dev);
127   -
128   - led_classdev_resume(&led->cdev);
129   - return 0;
130   -}
131   -#else
132   -#define s3c24xx_led_suspend NULL
133   -#define s3c24xx_led_resume NULL
134   -#endif
135   -
136 115 static struct platform_driver s3c24xx_led_driver = {
137 116 .probe = s3c24xx_led_probe,
138 117 .remove = s3c24xx_led_remove,
139   - .suspend = s3c24xx_led_suspend,
140   - .resume = s3c24xx_led_resume,
141 118 .driver = {
142 119 .name = "s3c24xx_led",
143 120 .owner = THIS_MODULE,
drivers/leds/leds-wm8350.c
... ... @@ -184,27 +184,6 @@
184 184 spin_unlock_irqrestore(&led->value_lock, flags);
185 185 }
186 186  
187   -#ifdef CONFIG_PM
188   -static int wm8350_led_suspend(struct platform_device *pdev, pm_message_t state)
189   -{
190   - struct wm8350_led *led = platform_get_drvdata(pdev);
191   -
192   - led_classdev_suspend(&led->cdev);
193   - return 0;
194   -}
195   -
196   -static int wm8350_led_resume(struct platform_device *pdev)
197   -{
198   - struct wm8350_led *led = platform_get_drvdata(pdev);
199   -
200   - led_classdev_resume(&led->cdev);
201   - return 0;
202   -}
203   -#else
204   -#define wm8350_led_suspend NULL
205   -#define wm8350_led_resume NULL
206   -#endif
207   -
208 187 static void wm8350_led_shutdown(struct platform_device *pdev)
209 188 {
210 189 struct wm8350_led *led = platform_get_drvdata(pdev);
... ... @@ -255,6 +234,7 @@
255 234 led->cdev.brightness_set = wm8350_led_set;
256 235 led->cdev.default_trigger = pdata->default_trigger;
257 236 led->cdev.name = pdata->name;
  237 + led->cdev.flags |= LED_CORE_SUSPENDRESUME;
258 238 led->enabled = regulator_is_enabled(isink);
259 239 led->isink = isink;
260 240 led->dcdc = dcdc;
... ... @@ -311,8 +291,6 @@
311 291 .probe = wm8350_led_probe,
312 292 .remove = wm8350_led_remove,
313 293 .shutdown = wm8350_led_shutdown,
314   - .suspend = wm8350_led_suspend,
315   - .resume = wm8350_led_resume,
316 294 };
317 295  
318 296 static int __devinit wm8350_led_init(void)
drivers/leds/leds-wrap.c
... ... @@ -56,40 +56,21 @@
56 56 .name = "wrap::power",
57 57 .brightness_set = wrap_power_led_set,
58 58 .default_trigger = "default-on",
  59 + .flags = LED_CORE_SUSPENDRESUME,
59 60 };
60 61  
61 62 static struct led_classdev wrap_error_led = {
62 63 .name = "wrap::error",
63 64 .brightness_set = wrap_error_led_set,
  65 + .flags = LED_CORE_SUSPENDRESUME,
64 66 };
65 67  
66 68 static struct led_classdev wrap_extra_led = {
67 69 .name = "wrap::extra",
68 70 .brightness_set = wrap_extra_led_set,
  71 + .flags = LED_CORE_SUSPENDRESUME,
69 72 };
70 73  
71   -#ifdef CONFIG_PM
72   -static int wrap_led_suspend(struct platform_device *dev,
73   - pm_message_t state)
74   -{
75   - led_classdev_suspend(&wrap_power_led);
76   - led_classdev_suspend(&wrap_error_led);
77   - led_classdev_suspend(&wrap_extra_led);
78   - return 0;
79   -}
80   -
81   -static int wrap_led_resume(struct platform_device *dev)
82   -{
83   - led_classdev_resume(&wrap_power_led);
84   - led_classdev_resume(&wrap_error_led);
85   - led_classdev_resume(&wrap_extra_led);
86   - return 0;
87   -}
88   -#else
89   -#define wrap_led_suspend NULL
90   -#define wrap_led_resume NULL
91   -#endif
92   -
93 74 static int wrap_led_probe(struct platform_device *pdev)
94 75 {
95 76 int ret;
... ... @@ -127,8 +108,6 @@
127 108 static struct platform_driver wrap_led_driver = {
128 109 .probe = wrap_led_probe,
129 110 .remove = wrap_led_remove,
130   - .suspend = wrap_led_suspend,
131   - .resume = wrap_led_resume,
132 111 .driver = {
133 112 .name = DRVNAME,
134 113 .owner = THIS_MODULE,
include/linux/leds.h
... ... @@ -32,7 +32,10 @@
32 32 int brightness;
33 33 int flags;
34 34  
  35 + /* Lower 16 bits reflect status */
35 36 #define LED_SUSPENDED (1 << 0)
  37 + /* Upper 16 bits reflect control information */
  38 +#define LED_CORE_SUSPENDRESUME (1 << 16)
36 39  
37 40 /* Set LED brightness level */
38 41 /* Must not sleep, use a workqueue if needed */