|
@@ -19,10 +19,11 @@
|
|
|
|
|
|
#include <linux/clk.h>
|
|
|
#include <linux/clk-provider.h>
|
|
|
+#include <linux/init.h>
|
|
|
#include <linux/of_address.h>
|
|
|
#include <linux/of_device.h>
|
|
|
#include <linux/platform_device.h>
|
|
|
-#include <linux/init.h>
|
|
|
+#include <linux/regmap.h>
|
|
|
|
|
|
#include "clkc.h"
|
|
|
#include "gxbb.h"
|
|
@@ -1937,10 +1938,18 @@ static const struct of_device_id clkc_match_table[] = {
|
|
|
{},
|
|
|
};
|
|
|
|
|
|
+static const struct regmap_config clkc_regmap_config = {
|
|
|
+ .reg_bits = 32,
|
|
|
+ .val_bits = 32,
|
|
|
+ .reg_stride = 4,
|
|
|
+};
|
|
|
+
|
|
|
static int gxbb_clkc_probe(struct platform_device *pdev)
|
|
|
{
|
|
|
const struct clkc_data *clkc_data;
|
|
|
+ struct resource *res;
|
|
|
void __iomem *clk_base;
|
|
|
+ struct regmap *map;
|
|
|
int ret, i;
|
|
|
struct device *dev = &pdev->dev;
|
|
|
|
|
@@ -1948,13 +1957,20 @@ static int gxbb_clkc_probe(struct platform_device *pdev)
|
|
|
if (!clkc_data)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- /* Generic clocks and PLLs */
|
|
|
- clk_base = of_iomap(dev->of_node, 0);
|
|
|
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
|
+ if (!res)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ clk_base = devm_ioremap(dev, res->start, resource_size(res));
|
|
|
if (!clk_base) {
|
|
|
pr_err("%s: Unable to map clk base\n", __func__);
|
|
|
return -ENXIO;
|
|
|
}
|
|
|
|
|
|
+ map = devm_regmap_init_mmio(dev, clk_base, &clkc_regmap_config);
|
|
|
+ if (IS_ERR(map))
|
|
|
+ return PTR_ERR(map);
|
|
|
+
|
|
|
/* Populate base address for PLLs */
|
|
|
for (i = 0; i < clkc_data->clk_plls_count; i++)
|
|
|
clkc_data->clk_plls[i]->base = clk_base;
|
|
@@ -1991,17 +2007,14 @@ static int gxbb_clkc_probe(struct platform_device *pdev)
|
|
|
|
|
|
ret = devm_clk_hw_register(dev,
|
|
|
clkc_data->hw_onecell_data->hws[i]);
|
|
|
- if (ret)
|
|
|
- goto iounmap;
|
|
|
+ if (ret) {
|
|
|
+ dev_err(dev, "Clock registration failed\n");
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
-
|
|
|
return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get,
|
|
|
clkc_data->hw_onecell_data);
|
|
|
-
|
|
|
-iounmap:
|
|
|
- iounmap(clk_base);
|
|
|
- return ret;
|
|
|
}
|
|
|
|
|
|
static struct platform_driver gxbb_driver = {
|