|
@@ -48,6 +48,9 @@
|
|
|
#include <plat/clock.h>
|
|
|
#include <plat/cpu.h>
|
|
|
|
|
|
+#include <linux/serial_core.h>
|
|
|
+#include <plat/regs-serial.h> /* for s3c24xx_uart_devs */
|
|
|
+
|
|
|
/* clock information */
|
|
|
|
|
|
static LIST_HEAD(clocks);
|
|
@@ -65,6 +68,28 @@ static int clk_null_enable(struct clk *clk, int enable)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int dev_is_s3c_uart(struct device *dev)
|
|
|
+{
|
|
|
+ struct platform_device **pdev = s3c24xx_uart_devs;
|
|
|
+ int i;
|
|
|
+ for (i = 0; i < ARRAY_SIZE(s3c24xx_uart_devs); i++, pdev++)
|
|
|
+ if (*pdev && dev == &(*pdev)->dev)
|
|
|
+ return 1;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Serial drivers call get_clock() very early, before platform bus
|
|
|
+ * has been set up, this requires a special check to let them get
|
|
|
+ * a proper clock
|
|
|
+ */
|
|
|
+
|
|
|
+static int dev_is_platform_device(struct device *dev)
|
|
|
+{
|
|
|
+ return dev->bus == &platform_bus_type ||
|
|
|
+ (dev->bus == NULL && dev_is_s3c_uart(dev));
|
|
|
+}
|
|
|
+
|
|
|
/* Clock API calls */
|
|
|
|
|
|
struct clk *clk_get(struct device *dev, const char *id)
|
|
@@ -73,7 +98,7 @@ struct clk *clk_get(struct device *dev, const char *id)
|
|
|
struct clk *clk = ERR_PTR(-ENOENT);
|
|
|
int idno;
|
|
|
|
|
|
- if (dev == NULL || dev->bus != &platform_bus_type)
|
|
|
+ if (dev == NULL || !dev_is_platform_device(dev))
|
|
|
idno = -1;
|
|
|
else
|
|
|
idno = to_platform_device(dev)->id;
|