Skip to content
atmel_serial.c 26 KiB
Newer Older
	port = &atmel_ports[pdev->id];
	atmel_init_port(port, pdev);
	ret = uart_add_one_port(&atmel_uart, &port->uart);
	if (ret)
		goto err_add_port;

	device_init_wakeup(&pdev->dev, 1);
	platform_set_drvdata(pdev, port);

	return 0;

err_add_port:
	if (!atmel_is_console_port(&port->uart)) {
		clk_disable(port->clk);
		clk_put(port->clk);
		port->clk = NULL;
static int __devexit atmel_serial_remove(struct platform_device *pdev)
{
	struct uart_port *port = platform_get_drvdata(pdev);
	struct atmel_uart_port *atmel_port = (struct atmel_uart_port *)port;
	int ret = 0;

	device_init_wakeup(&pdev->dev, 0);
	platform_set_drvdata(pdev, NULL);

	ret = uart_remove_one_port(&atmel_uart, port);

	/* "port" is allocated statically, so we shouldn't free it */

	clk_disable(atmel_port->clk);
	clk_put(atmel_port->clk);
static struct platform_driver atmel_serial_driver = {
	.probe		= atmel_serial_probe,
	.remove		= __devexit_p(atmel_serial_remove),
	.suspend	= atmel_serial_suspend,
	.resume		= atmel_serial_resume,
static int __init atmel_serial_init(void)
	ret = uart_register_driver(&atmel_uart);
	ret = platform_driver_register(&atmel_serial_driver);
		uart_unregister_driver(&atmel_uart);
static void __exit atmel_serial_exit(void)
	platform_driver_unregister(&atmel_serial_driver);
	uart_unregister_driver(&atmel_uart);
module_init(atmel_serial_init);
module_exit(atmel_serial_exit);

MODULE_AUTHOR("Rick Bronson");
MODULE_DESCRIPTION("Atmel AT91 / AT32 serial port driver");
MODULE_LICENSE("GPL");