Commit e149b42b authored by Gerhard Sittig's avatar Gerhard Sittig Committed by Anatolij Gustschin

serial: mpc512x: adjust for OF based clock lookup

after device tree based clock lookup became available, the peripheral
driver need no longer construct clock names which include the PSC index,
remove the "psc%d_mclk" template and unconditionally use 'mclk'

acquire and release the "ipg" clock item for register access as well

Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Jiri Slaby <jslaby@suse.cz>
Cc: linux-serial@vger.kernel.org
Acked-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarGerhard Sittig <gsi@denx.de>
Signed-off-by: default avatarAnatolij Gustschin <agust@denx.de>
parent dff148ad
...@@ -619,29 +619,55 @@ static irqreturn_t mpc512x_psc_handle_irq(struct uart_port *port) ...@@ -619,29 +619,55 @@ static irqreturn_t mpc512x_psc_handle_irq(struct uart_port *port)
} }
static struct clk *psc_mclk_clk[MPC52xx_PSC_MAXNUM]; static struct clk *psc_mclk_clk[MPC52xx_PSC_MAXNUM];
static struct clk *psc_ipg_clk[MPC52xx_PSC_MAXNUM];
/* called from within the .request_port() callback (allocation) */ /* called from within the .request_port() callback (allocation) */
static int mpc512x_psc_alloc_clock(struct uart_port *port) static int mpc512x_psc_alloc_clock(struct uart_port *port)
{ {
int psc_num; int psc_num;
char clk_name[16];
struct clk *clk; struct clk *clk;
int err; int err;
psc_num = (port->mapbase & 0xf00) >> 8; psc_num = (port->mapbase & 0xf00) >> 8;
snprintf(clk_name, sizeof(clk_name), "psc%d_mclk", psc_num);
clk = devm_clk_get(port->dev, clk_name); clk = devm_clk_get(port->dev, "mclk");
if (IS_ERR(clk)) { if (IS_ERR(clk)) {
dev_err(port->dev, "Failed to get MCLK!\n"); dev_err(port->dev, "Failed to get MCLK!\n");
return PTR_ERR(clk); err = PTR_ERR(clk);
goto out_err;
} }
err = clk_prepare_enable(clk); err = clk_prepare_enable(clk);
if (err) { if (err) {
dev_err(port->dev, "Failed to enable MCLK!\n"); dev_err(port->dev, "Failed to enable MCLK!\n");
return err; goto out_err;
} }
psc_mclk_clk[psc_num] = clk; psc_mclk_clk[psc_num] = clk;
clk = devm_clk_get(port->dev, "ipg");
if (IS_ERR(clk)) {
dev_err(port->dev, "Failed to get IPG clock!\n");
err = PTR_ERR(clk);
goto out_err;
}
err = clk_prepare_enable(clk);
if (err) {
dev_err(port->dev, "Failed to enable IPG clock!\n");
goto out_err;
}
psc_ipg_clk[psc_num] = clk;
return 0; return 0;
out_err:
if (psc_mclk_clk[psc_num]) {
clk_disable_unprepare(psc_mclk_clk[psc_num]);
psc_mclk_clk[psc_num] = NULL;
}
if (psc_ipg_clk[psc_num]) {
clk_disable_unprepare(psc_ipg_clk[psc_num]);
psc_ipg_clk[psc_num] = NULL;
}
return err;
} }
/* called from within the .release_port() callback (release) */ /* called from within the .release_port() callback (release) */
...@@ -656,6 +682,10 @@ static void mpc512x_psc_relse_clock(struct uart_port *port) ...@@ -656,6 +682,10 @@ static void mpc512x_psc_relse_clock(struct uart_port *port)
clk_disable_unprepare(clk); clk_disable_unprepare(clk);
psc_mclk_clk[psc_num] = NULL; psc_mclk_clk[psc_num] = NULL;
} }
if (psc_ipg_clk[psc_num]) {
clk_disable_unprepare(psc_ipg_clk[psc_num]);
psc_ipg_clk[psc_num] = NULL;
}
} }
/* implementation of the .clock() callback (enable/disable) */ /* implementation of the .clock() callback (enable/disable) */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment