Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1cf93e0d authored by Huang Shijie's avatar Huang Shijie Committed by Greg Kroah-Hartman
Browse files

serial: imx: remove the uart_console() check



The uart_console() check makes the clocks(clk_per and clk_ipg) opened
even when we close the console uart.

This patch enable/disable the clocks in imx_console_write(),
so we can keep the clocks closed when the console uart is closed.

Also remove the clock enable/disable oprations in the probe, we do not
need them any more.

Signed-off-by: default avatarHuang Shijie <b32955@freescale.com>
Acked-by: default avatarShawn Guo <shawn.guo@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 43b829b3
Loading
Loading
Loading
Loading
+43 −26
Original line number Diff line number Diff line
@@ -701,7 +701,6 @@ static int imx_startup(struct uart_port *port)
	int retval;
	unsigned long flags, temp;

	if (!uart_console(port)) {
	retval = clk_prepare_enable(sport->clk_per);
	if (retval)
		goto error_out1;
@@ -710,7 +709,6 @@ static int imx_startup(struct uart_port *port)
		clk_disable_unprepare(sport->clk_per);
		goto error_out1;
	}
	}

	imx_setup_ufcr(sport, 0);

@@ -900,11 +898,9 @@ static void imx_shutdown(struct uart_port *port)
	writel(temp, sport->port.membase + UCR1);
	spin_unlock_irqrestore(&sport->port.lock, flags);

	if (!uart_console(&sport->port)) {
	clk_disable_unprepare(sport->clk_per);
	clk_disable_unprepare(sport->clk_ipg);
}
}

static void
imx_set_termios(struct uart_port *port, struct ktermios *termios,
@@ -1250,6 +1246,16 @@ imx_console_write(struct console *co, const char *s, unsigned int count)
	unsigned int ucr1;
	unsigned long flags = 0;
	int locked = 1;
	int retval;

	retval = clk_enable(sport->clk_per);
	if (retval)
		return;
	retval = clk_enable(sport->clk_ipg);
	if (retval) {
		clk_disable(sport->clk_per);
		return;
	}

	if (sport->port.sysrq)
		locked = 0;
@@ -1285,6 +1291,9 @@ imx_console_write(struct console *co, const char *s, unsigned int count)

	if (locked)
		spin_unlock_irqrestore(&sport->port.lock, flags);

	clk_disable(sport->clk_ipg);
	clk_disable(sport->clk_per);
}

/*
@@ -1358,6 +1367,7 @@ imx_console_setup(struct console *co, char *options)
	int bits = 8;
	int parity = 'n';
	int flow = 'n';
	int retval;

	/*
	 * Check whether an invalid uart number has been specified, and
@@ -1370,6 +1380,11 @@ imx_console_setup(struct console *co, char *options)
	if (sport == NULL)
		return -ENODEV;

	/* For setting the registers, we only need to enable the ipg clock. */
	retval = clk_prepare_enable(sport->clk_ipg);
	if (retval)
		goto error_console;

	if (options)
		uart_parse_options(options, &baud, &parity, &bits, &flow);
	else
@@ -1377,7 +1392,20 @@ imx_console_setup(struct console *co, char *options)

	imx_setup_ufcr(sport, 0);

	return uart_set_options(&sport->port, co, baud, parity, bits, flow);
	retval = uart_set_options(&sport->port, co, baud, parity, bits, flow);

	clk_disable(sport->clk_ipg);
	if (retval) {
		clk_unprepare(sport->clk_ipg);
		goto error_console;
	}

	retval = clk_prepare(sport->clk_per);
	if (retval)
		clk_disable_unprepare(sport->clk_ipg);

error_console:
	return retval;
}

static struct uart_driver imx_reg;
@@ -1555,9 +1583,6 @@ static int serial_imx_probe(struct platform_device *pdev)
		return ret;
	}

	clk_prepare_enable(sport->clk_per);
	clk_prepare_enable(sport->clk_ipg);

	sport->port.uartclk = clk_get_rate(sport->clk_per);

	imx_ports[sport->port.line] = sport;
@@ -1566,7 +1591,7 @@ static int serial_imx_probe(struct platform_device *pdev)
	if (pdata && pdata->init) {
		ret = pdata->init(pdev);
		if (ret)
			goto clkput;
			return ret;
	}

	ret = uart_add_one_port(&imx_reg, &sport->port);
@@ -1574,18 +1599,10 @@ static int serial_imx_probe(struct platform_device *pdev)
		goto deinit;
	platform_set_drvdata(pdev, sport);

	if (!uart_console(&sport->port)) {
		clk_disable_unprepare(sport->clk_per);
		clk_disable_unprepare(sport->clk_ipg);
	}

	return 0;
deinit:
	if (pdata && pdata->exit)
		pdata->exit(pdev);
clkput:
	clk_disable_unprepare(sport->clk_per);
	clk_disable_unprepare(sport->clk_ipg);
	return ret;
}