diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/misc/atmel_pwm.c | 2 | ||||
| -rw-r--r-- | drivers/net/macb.c | 37 | ||||
| -rw-r--r-- | drivers/rtc/rtc-at32ap700x.c | 3 | ||||
| -rw-r--r-- | drivers/serial/atmel_serial.c | 17 |
4 files changed, 57 insertions, 2 deletions
diff --git a/drivers/misc/atmel_pwm.c b/drivers/misc/atmel_pwm.c index 0d5ce03cdff2..5b5a14dab3d3 100644 --- a/drivers/misc/atmel_pwm.c +++ b/drivers/misc/atmel_pwm.c | |||
| @@ -332,7 +332,7 @@ static int __init pwm_probe(struct platform_device *pdev) | |||
| 332 | p->base = ioremap(r->start, r->end - r->start + 1); | 332 | p->base = ioremap(r->start, r->end - r->start + 1); |
| 333 | if (!p->base) | 333 | if (!p->base) |
| 334 | goto fail; | 334 | goto fail; |
| 335 | p->clk = clk_get(&pdev->dev, "mck"); | 335 | p->clk = clk_get(&pdev->dev, "pwm_clk"); |
| 336 | if (IS_ERR(p->clk)) { | 336 | if (IS_ERR(p->clk)) { |
| 337 | status = PTR_ERR(p->clk); | 337 | status = PTR_ERR(p->clk); |
| 338 | p->clk = NULL; | 338 | p->clk = NULL; |
diff --git a/drivers/net/macb.c b/drivers/net/macb.c index 92dccd43bdca..0a5745a854c7 100644 --- a/drivers/net/macb.c +++ b/drivers/net/macb.c | |||
| @@ -1277,8 +1277,45 @@ static int __exit macb_remove(struct platform_device *pdev) | |||
| 1277 | return 0; | 1277 | return 0; |
| 1278 | } | 1278 | } |
| 1279 | 1279 | ||
| 1280 | #ifdef CONFIG_PM | ||
| 1281 | static int macb_suspend(struct platform_device *pdev, pm_message_t state) | ||
| 1282 | { | ||
| 1283 | struct net_device *netdev = platform_get_drvdata(pdev); | ||
| 1284 | struct macb *bp = netdev_priv(netdev); | ||
| 1285 | |||
| 1286 | netif_device_detach(netdev); | ||
| 1287 | |||
| 1288 | #ifndef CONFIG_ARCH_AT91 | ||
| 1289 | clk_disable(bp->hclk); | ||
| 1290 | #endif | ||
| 1291 | clk_disable(bp->pclk); | ||
| 1292 | |||
| 1293 | return 0; | ||
| 1294 | } | ||
| 1295 | |||
| 1296 | static int macb_resume(struct platform_device *pdev) | ||
| 1297 | { | ||
| 1298 | struct net_device *netdev = platform_get_drvdata(pdev); | ||
| 1299 | struct macb *bp = netdev_priv(netdev); | ||
| 1300 | |||
| 1301 | clk_enable(bp->pclk); | ||
| 1302 | #ifndef CONFIG_ARCH_AT91 | ||
| 1303 | clk_enable(bp->hclk); | ||
| 1304 | #endif | ||
| 1305 | |||
| 1306 | netif_device_attach(netdev); | ||
| 1307 | |||
| 1308 | return 0; | ||
| 1309 | } | ||
| 1310 | #else | ||
| 1311 | #define macb_suspend NULL | ||
| 1312 | #define macb_resume NULL | ||
| 1313 | #endif | ||
| 1314 | |||
| 1280 | static struct platform_driver macb_driver = { | 1315 | static struct platform_driver macb_driver = { |
| 1281 | .remove = __exit_p(macb_remove), | 1316 | .remove = __exit_p(macb_remove), |
| 1317 | .suspend = macb_suspend, | ||
| 1318 | .resume = macb_resume, | ||
| 1282 | .driver = { | 1319 | .driver = { |
| 1283 | .name = "macb", | 1320 | .name = "macb", |
| 1284 | .owner = THIS_MODULE, | 1321 | .owner = THIS_MODULE, |
diff --git a/drivers/rtc/rtc-at32ap700x.c b/drivers/rtc/rtc-at32ap700x.c index 2ef8cdfda4a7..90b9a6503e15 100644 --- a/drivers/rtc/rtc-at32ap700x.c +++ b/drivers/rtc/rtc-at32ap700x.c | |||
| @@ -265,6 +265,7 @@ static int __init at32_rtc_probe(struct platform_device *pdev) | |||
| 265 | } | 265 | } |
| 266 | 266 | ||
| 267 | platform_set_drvdata(pdev, rtc); | 267 | platform_set_drvdata(pdev, rtc); |
| 268 | device_init_wakeup(&pdev->dev, 1); | ||
| 268 | 269 | ||
| 269 | dev_info(&pdev->dev, "Atmel RTC for AT32AP700x at %08lx irq %ld\n", | 270 | dev_info(&pdev->dev, "Atmel RTC for AT32AP700x at %08lx irq %ld\n", |
| 270 | (unsigned long)rtc->regs, rtc->irq); | 271 | (unsigned long)rtc->regs, rtc->irq); |
| @@ -284,6 +285,8 @@ static int __exit at32_rtc_remove(struct platform_device *pdev) | |||
| 284 | { | 285 | { |
| 285 | struct rtc_at32ap700x *rtc = platform_get_drvdata(pdev); | 286 | struct rtc_at32ap700x *rtc = platform_get_drvdata(pdev); |
| 286 | 287 | ||
| 288 | device_init_wakeup(&pdev->dev, 0); | ||
| 289 | |||
| 287 | free_irq(rtc->irq, rtc); | 290 | free_irq(rtc->irq, rtc); |
| 288 | iounmap(rtc->regs); | 291 | iounmap(rtc->regs); |
| 289 | rtc_device_unregister(rtc->rtc); | 292 | rtc_device_unregister(rtc->rtc); |
diff --git a/drivers/serial/atmel_serial.c b/drivers/serial/atmel_serial.c index 42be8b01a40f..6aeef22bd203 100644 --- a/drivers/serial/atmel_serial.c +++ b/drivers/serial/atmel_serial.c | |||
| @@ -1439,14 +1439,29 @@ static struct uart_driver atmel_uart = { | |||
| 1439 | }; | 1439 | }; |
| 1440 | 1440 | ||
| 1441 | #ifdef CONFIG_PM | 1441 | #ifdef CONFIG_PM |
| 1442 | static bool atmel_serial_clk_will_stop(void) | ||
| 1443 | { | ||
| 1444 | #ifdef CONFIG_ARCH_AT91 | ||
| 1445 | return at91_suspend_entering_slow_clock(); | ||
| 1446 | #else | ||
| 1447 | return false; | ||
| 1448 | #endif | ||
| 1449 | } | ||
| 1450 | |||
| 1442 | static int atmel_serial_suspend(struct platform_device *pdev, | 1451 | static int atmel_serial_suspend(struct platform_device *pdev, |
| 1443 | pm_message_t state) | 1452 | pm_message_t state) |
| 1444 | { | 1453 | { |
| 1445 | struct uart_port *port = platform_get_drvdata(pdev); | 1454 | struct uart_port *port = platform_get_drvdata(pdev); |
| 1446 | struct atmel_uart_port *atmel_port = to_atmel_uart_port(port); | 1455 | struct atmel_uart_port *atmel_port = to_atmel_uart_port(port); |
| 1447 | 1456 | ||
| 1457 | if (atmel_is_console_port(port) && console_suspend_enabled) { | ||
| 1458 | /* Drain the TX shifter */ | ||
| 1459 | while (!(UART_GET_CSR(port) & ATMEL_US_TXEMPTY)) | ||
| 1460 | cpu_relax(); | ||
| 1461 | } | ||
| 1462 | |||
| 1448 | if (device_may_wakeup(&pdev->dev) | 1463 | if (device_may_wakeup(&pdev->dev) |
| 1449 | && !at91_suspend_entering_slow_clock()) | 1464 | && !atmel_serial_clk_will_stop()) |
| 1450 | enable_irq_wake(port->irq); | 1465 | enable_irq_wake(port->irq); |
| 1451 | else { | 1466 | else { |
| 1452 | uart_suspend_port(&atmel_uart, port); | 1467 | uart_suspend_port(&atmel_uart, port); |
