summaryrefslogtreecommitdiffstats
path: root/drivers/clk
diff options
context:
space:
mode:
authorLucas Stach <dev@lynxeye.de>2014-05-14 22:45:31 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2014-05-15 14:17:12 +0200
commitee493a6152a57ca56cace80fada726e5bf4f4bd5 (patch)
tree83f86a504df41a048e6f757f97c6a4fdb86f40c5 /drivers/clk
parent77d45d43c22ca5aa0a6bcf97e88508355073959b (diff)
downloadbarebox-ee493a6152a57ca56cace80fada726e5bf4f4bd5.tar.gz
barebox-ee493a6152a57ca56cace80fada726e5bf4f4bd5.tar.xz
clk: tegra: reset UARTS from clock controller
The console devices are the only ones that can't use the reset controller properly, as they get registered from platform code. Reset those devices from the clock controller. Signed-off-by: Lucas Stach <dev@lynxeye.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/clk')
-rw-r--r--drivers/clk/tegra/clk-tegra20.c1
-rw-r--r--drivers/clk/tegra/clk-tegra30.c1
-rw-r--r--drivers/clk/tegra/clk.c11
-rw-r--r--drivers/clk/tegra/clk.h2
4 files changed, 15 insertions, 0 deletions
diff --git a/drivers/clk/tegra/clk-tegra20.c b/drivers/clk/tegra/clk-tegra20.c
index 7c7a915b40..cb0a57181d 100644
--- a/drivers/clk/tegra/clk-tegra20.c
+++ b/drivers/clk/tegra/clk-tegra20.c
@@ -348,6 +348,7 @@ static int tegra20_car_probe(struct device_d *dev)
&clk_data);
tegra_clk_init_rst_controller(car_base, dev->device_node, 3 * 32);
+ tegra_clk_reset_uarts();
return 0;
}
diff --git a/drivers/clk/tegra/clk-tegra30.c b/drivers/clk/tegra/clk-tegra30.c
index adb5824e4b..9536288f89 100644
--- a/drivers/clk/tegra/clk-tegra30.c
+++ b/drivers/clk/tegra/clk-tegra30.c
@@ -342,6 +342,7 @@ static int tegra30_car_probe(struct device_d *dev)
&clk_data);
tegra_clk_init_rst_controller(car_base, dev->device_node, 6 * 32);
+ tegra_clk_reset_uarts();
return 0;
}
diff --git a/drivers/clk/tegra/clk.c b/drivers/clk/tegra/clk.c
index a6b81d029b..cb4d920203 100644
--- a/drivers/clk/tegra/clk.c
+++ b/drivers/clk/tegra/clk.c
@@ -187,3 +187,14 @@ void tegra_clk_init_rst_controller(void __iomem *base, struct device_node *np,
rst_ctlr.nr_resets = num;
reset_controller_register(&rst_ctlr);
}
+
+void tegra_clk_reset_uarts(void) {
+ int i;
+ int console_device_ids[] = {6, 7, 55, 65, 66};
+
+ for (i = 0; i < ARRAY_SIZE(console_device_ids); i++) {
+ rst_ops.assert(&rst_ctlr, console_device_ids[i]);
+ udelay(2);
+ rst_ops.deassert(&rst_ctlr, console_device_ids[i]);
+ }
+};
diff --git a/drivers/clk/tegra/clk.h b/drivers/clk/tegra/clk.h
index 29d5249b2e..6ce9f7e26d 100644
--- a/drivers/clk/tegra/clk.h
+++ b/drivers/clk/tegra/clk.h
@@ -160,3 +160,5 @@ struct tegra_clk_periph_regs {
void tegra_clk_init_rst_controller(void __iomem *base, struct device_node *np,
unsigned int num);
+
+void tegra_clk_reset_uarts(void);