diff options
Diffstat (limited to 'drivers/video/via/via-gpio.c')
-rw-r--r-- | drivers/video/via/via-gpio.c | 74 |
1 files changed, 52 insertions, 22 deletions
diff --git a/drivers/video/via/via-gpio.c b/drivers/video/via/via-gpio.c index 39acb37e7a1d..ab5341814c74 100644 --- a/drivers/video/via/via-gpio.c +++ b/drivers/video/via/via-gpio.c | |||
@@ -145,7 +145,7 @@ static int via_gpio_get(struct gpio_chip *chip, unsigned int nr) | |||
145 | } | 145 | } |
146 | 146 | ||
147 | 147 | ||
148 | static struct viafb_gpio_cfg gpio_config = { | 148 | static struct viafb_gpio_cfg viafb_gpio_config = { |
149 | .gpio_chip = { | 149 | .gpio_chip = { |
150 | .label = "VIAFB onboard GPIO", | 150 | .label = "VIAFB onboard GPIO", |
151 | .owner = THIS_MODULE, | 151 | .owner = THIS_MODULE, |
@@ -172,6 +172,28 @@ static void viafb_gpio_disable(struct viafb_gpio *gpio) | |||
172 | via_write_reg_mask(VIASR, gpio->vg_port_index, 0, 0x02); | 172 | via_write_reg_mask(VIASR, gpio->vg_port_index, 0, 0x02); |
173 | } | 173 | } |
174 | 174 | ||
175 | #ifdef CONFIG_PM | ||
176 | |||
177 | static int viafb_gpio_suspend(void *private) | ||
178 | { | ||
179 | return 0; | ||
180 | } | ||
181 | |||
182 | static int viafb_gpio_resume(void *private) | ||
183 | { | ||
184 | int i; | ||
185 | |||
186 | for (i = 0; i < viafb_gpio_config.gpio_chip.ngpio; i += 2) | ||
187 | viafb_gpio_enable(viafb_gpio_config.active_gpios[i]); | ||
188 | return 0; | ||
189 | } | ||
190 | |||
191 | static struct viafb_pm_hooks viafb_gpio_pm_hooks = { | ||
192 | .suspend = viafb_gpio_suspend, | ||
193 | .resume = viafb_gpio_resume | ||
194 | }; | ||
195 | #endif /* CONFIG_PM */ | ||
196 | |||
175 | /* | 197 | /* |
176 | * Look up a specific gpio and return the number it was assigned. | 198 | * Look up a specific gpio and return the number it was assigned. |
177 | */ | 199 | */ |
@@ -179,9 +201,9 @@ int viafb_gpio_lookup(const char *name) | |||
179 | { | 201 | { |
180 | int i; | 202 | int i; |
181 | 203 | ||
182 | for (i = 0; i < gpio_config.gpio_chip.ngpio; i++) | 204 | for (i = 0; i < viafb_gpio_config.gpio_chip.ngpio; i++) |
183 | if (!strcmp(name, gpio_config.active_gpios[i]->vg_name)) | 205 | if (!strcmp(name, viafb_gpio_config.active_gpios[i]->vg_name)) |
184 | return gpio_config.gpio_chip.base + i; | 206 | return viafb_gpio_config.gpio_chip.base + i; |
185 | return -1; | 207 | return -1; |
186 | } | 208 | } |
187 | EXPORT_SYMBOL_GPL(viafb_gpio_lookup); | 209 | EXPORT_SYMBOL_GPL(viafb_gpio_lookup); |
@@ -207,14 +229,15 @@ static __devinit int viafb_gpio_probe(struct platform_device *platdev) | |||
207 | for (gpio = viafb_all_gpios; | 229 | for (gpio = viafb_all_gpios; |
208 | gpio < viafb_all_gpios + VIAFB_NUM_GPIOS; gpio++) | 230 | gpio < viafb_all_gpios + VIAFB_NUM_GPIOS; gpio++) |
209 | if (gpio->vg_port_index == port_cfg[i].ioport_index) { | 231 | if (gpio->vg_port_index == port_cfg[i].ioport_index) { |
210 | gpio_config.active_gpios[ngpio] = gpio; | 232 | viafb_gpio_config.active_gpios[ngpio] = gpio; |
211 | gpio_config.gpio_names[ngpio] = gpio->vg_name; | 233 | viafb_gpio_config.gpio_names[ngpio] = |
234 | gpio->vg_name; | ||
212 | ngpio++; | 235 | ngpio++; |
213 | } | 236 | } |
214 | } | 237 | } |
215 | gpio_config.gpio_chip.ngpio = ngpio; | 238 | viafb_gpio_config.gpio_chip.ngpio = ngpio; |
216 | gpio_config.gpio_chip.names = gpio_config.gpio_names; | 239 | viafb_gpio_config.gpio_chip.names = viafb_gpio_config.gpio_names; |
217 | gpio_config.vdev = vdev; | 240 | viafb_gpio_config.vdev = vdev; |
218 | if (ngpio == 0) { | 241 | if (ngpio == 0) { |
219 | printk(KERN_INFO "viafb: no GPIOs configured\n"); | 242 | printk(KERN_INFO "viafb: no GPIOs configured\n"); |
220 | return 0; | 243 | return 0; |
@@ -223,19 +246,22 @@ static __devinit int viafb_gpio_probe(struct platform_device *platdev) | |||
223 | * Enable the ports. They come in pairs, with a single | 246 | * Enable the ports. They come in pairs, with a single |
224 | * enable bit for both. | 247 | * enable bit for both. |
225 | */ | 248 | */ |
226 | spin_lock_irqsave(&gpio_config.vdev->reg_lock, flags); | 249 | spin_lock_irqsave(&viafb_gpio_config.vdev->reg_lock, flags); |
227 | for (i = 0; i < ngpio; i += 2) | 250 | for (i = 0; i < ngpio; i += 2) |
228 | viafb_gpio_enable(gpio_config.active_gpios[i]); | 251 | viafb_gpio_enable(viafb_gpio_config.active_gpios[i]); |
229 | spin_unlock_irqrestore(&gpio_config.vdev->reg_lock, flags); | 252 | spin_unlock_irqrestore(&viafb_gpio_config.vdev->reg_lock, flags); |
230 | /* | 253 | /* |
231 | * Get registered. | 254 | * Get registered. |
232 | */ | 255 | */ |
233 | gpio_config.gpio_chip.base = -1; /* Dynamic */ | 256 | viafb_gpio_config.gpio_chip.base = -1; /* Dynamic */ |
234 | ret = gpiochip_add(&gpio_config.gpio_chip); | 257 | ret = gpiochip_add(&viafb_gpio_config.gpio_chip); |
235 | if (ret) { | 258 | if (ret) { |
236 | printk(KERN_ERR "viafb: failed to add gpios (%d)\n", ret); | 259 | printk(KERN_ERR "viafb: failed to add gpios (%d)\n", ret); |
237 | gpio_config.gpio_chip.ngpio = 0; | 260 | viafb_gpio_config.gpio_chip.ngpio = 0; |
238 | } | 261 | } |
262 | #ifdef CONFIG_PM | ||
263 | viafb_pm_register(&viafb_gpio_pm_hooks); | ||
264 | #endif | ||
239 | return ret; | 265 | return ret; |
240 | } | 266 | } |
241 | 267 | ||
@@ -245,11 +271,15 @@ static int viafb_gpio_remove(struct platform_device *platdev) | |||
245 | unsigned long flags; | 271 | unsigned long flags; |
246 | int ret = 0, i; | 272 | int ret = 0, i; |
247 | 273 | ||
274 | #ifdef CONFIG_PM | ||
275 | viafb_pm_unregister(&viafb_gpio_pm_hooks); | ||
276 | #endif | ||
277 | |||
248 | /* | 278 | /* |
249 | * Get unregistered. | 279 | * Get unregistered. |
250 | */ | 280 | */ |
251 | if (gpio_config.gpio_chip.ngpio > 0) { | 281 | if (viafb_gpio_config.gpio_chip.ngpio > 0) { |
252 | ret = gpiochip_remove(&gpio_config.gpio_chip); | 282 | ret = gpiochip_remove(&viafb_gpio_config.gpio_chip); |
253 | if (ret) { /* Somebody still using it? */ | 283 | if (ret) { /* Somebody still using it? */ |
254 | printk(KERN_ERR "Viafb: GPIO remove failed\n"); | 284 | printk(KERN_ERR "Viafb: GPIO remove failed\n"); |
255 | return ret; | 285 | return ret; |
@@ -258,11 +288,11 @@ static int viafb_gpio_remove(struct platform_device *platdev) | |||
258 | /* | 288 | /* |
259 | * Disable the ports. | 289 | * Disable the ports. |
260 | */ | 290 | */ |
261 | spin_lock_irqsave(&gpio_config.vdev->reg_lock, flags); | 291 | spin_lock_irqsave(&viafb_gpio_config.vdev->reg_lock, flags); |
262 | for (i = 0; i < gpio_config.gpio_chip.ngpio; i += 2) | 292 | for (i = 0; i < viafb_gpio_config.gpio_chip.ngpio; i += 2) |
263 | viafb_gpio_disable(gpio_config.active_gpios[i]); | 293 | viafb_gpio_disable(viafb_gpio_config.active_gpios[i]); |
264 | gpio_config.gpio_chip.ngpio = 0; | 294 | viafb_gpio_config.gpio_chip.ngpio = 0; |
265 | spin_unlock_irqrestore(&gpio_config.vdev->reg_lock, flags); | 295 | spin_unlock_irqrestore(&viafb_gpio_config.vdev->reg_lock, flags); |
266 | return ret; | 296 | return ret; |
267 | } | 297 | } |
268 | 298 | ||