aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video/via/via-gpio.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video/via/via-gpio.c')
-rw-r--r--drivers/video/via/via-gpio.c74
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
148static struct viafb_gpio_cfg gpio_config = { 148static 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
177static int viafb_gpio_suspend(void *private)
178{
179 return 0;
180}
181
182static 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
191static 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}
187EXPORT_SYMBOL_GPL(viafb_gpio_lookup); 209EXPORT_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