summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/clk/clk-bulk.c80
-rw-r--r--drivers/clk/clk.c50
-rw-r--r--drivers/clk/mvebu/armada-38x.c2
-rw-r--r--drivers/clk/mvebu/armada-xp.c2
-rw-r--r--drivers/mci/Kconfig1
-rw-r--r--drivers/remoteproc/imx_rproc.c8
-rw-r--r--drivers/remoteproc/remoteproc_core.c2
-rw-r--r--drivers/usb/dwc3/dwc3-of-simple.c60
-rw-r--r--drivers/video/imx-ipu-v3/imx-pd.c31
-rw-r--r--drivers/video/simple-panel.c2
-rw-r--r--drivers/watchdog/efi_wdt.c2
-rw-r--r--drivers/watchdog/stpmic1_wdt.c2
12 files changed, 168 insertions, 74 deletions
diff --git a/drivers/clk/clk-bulk.c b/drivers/clk/clk-bulk.c
index ddbe32f9c2..b8db60dcbc 100644
--- a/drivers/clk/clk-bulk.c
+++ b/drivers/clk/clk-bulk.c
@@ -53,6 +53,86 @@ err:
}
EXPORT_SYMBOL(clk_bulk_get);
+static int __must_check of_clk_bulk_get(struct device_node *np, int num_clks,
+ struct clk_bulk_data *clks)
+{
+ int ret;
+ int i;
+
+ for (i = 0; i < num_clks; i++) {
+ clks[i].id = NULL;
+ clks[i].clk = NULL;
+ }
+
+ for (i = 0; i < num_clks; i++) {
+ of_property_read_string_index(np, "clock-names", i, &clks[i].id);
+ clks[i].clk = of_clk_get(np, i);
+ if (IS_ERR(clks[i].clk)) {
+ ret = PTR_ERR(clks[i].clk);
+ pr_err("%pOF: Failed to get clk index: %d ret: %d\n",
+ np, i, ret);
+ clks[i].clk = NULL;
+ goto err;
+ }
+ }
+
+ return 0;
+
+err:
+ clk_bulk_put(i, clks);
+
+ return ret;
+}
+
+static int __must_check of_clk_bulk_get_all(struct device_node *np,
+ struct clk_bulk_data **clks)
+{
+ struct clk_bulk_data *clk_bulk;
+ int num_clks;
+ int ret;
+
+ num_clks = of_clk_get_parent_count(np);
+ if (!num_clks)
+ return 0;
+
+ clk_bulk = kmalloc_array(num_clks, sizeof(*clk_bulk), GFP_KERNEL);
+ if (!clk_bulk)
+ return -ENOMEM;
+
+ ret = of_clk_bulk_get(np, num_clks, clk_bulk);
+ if (ret) {
+ kfree(clk_bulk);
+ return ret;
+ }
+
+ *clks = clk_bulk;
+
+ return num_clks;
+}
+
+void clk_bulk_put_all(int num_clks, struct clk_bulk_data *clks)
+{
+ if (IS_ERR_OR_NULL(clks))
+ return;
+
+ clk_bulk_put(num_clks, clks);
+
+ kfree(clks);
+}
+EXPORT_SYMBOL(clk_bulk_put_all);
+
+int __must_check clk_bulk_get_all(struct device_d *dev,
+ struct clk_bulk_data **clks)
+{
+ struct device_node *np = dev->device_node;
+
+ if (!np)
+ return 0;
+
+ return of_clk_bulk_get_all(np, clks);
+}
+EXPORT_SYMBOL(clk_bulk_get_all);
+
/**
* clk_bulk_disable - gate a set of clocks
* @num_clks: the number of clk_bulk_data
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index f2e459a760..b04d44593b 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -678,7 +678,6 @@ static const char *clk_hw_stat(struct clk *clk)
static void dump_one(struct clk *clk, int verbose, int indent)
{
- struct clk *c;
int enabled = clk_is_enabled(clk);
const char *hwstat, *stat;
@@ -705,13 +704,19 @@ static void dump_one(struct clk *clk, int verbose, int indent)
printf("\n");
}
}
+}
+
+static void dump_subtree(struct clk *clk, int verbose, int indent)
+{
+ struct clk *c;
+
+ dump_one(clk, verbose, indent);
list_for_each_entry(c, &clks, list) {
struct clk *parent = clk_get_parent(c);
- if (parent == clk) {
- dump_one(c, verbose, indent + 1);
- }
+ if (parent == clk)
+ dump_subtree(c, verbose, indent + 1);
}
}
@@ -723,7 +728,42 @@ void clk_dump(int verbose)
struct clk *parent = clk_get_parent(c);
if (IS_ERR_OR_NULL(parent))
- dump_one(c, verbose, 0);
+ dump_subtree(c, verbose, 0);
+ }
+}
+
+static int clk_print_parent(struct clk *clk, int verbose)
+{
+ struct clk *c;
+ int indent;
+
+ c = clk_get_parent(clk);
+ if (IS_ERR_OR_NULL(c))
+ return 0;
+
+ indent = clk_print_parent(c, verbose);
+
+ dump_one(c, verbose, indent);
+
+ return indent + 1;
+}
+
+void clk_dump_one(struct clk *clk, int verbose)
+{
+ int indent;
+ struct clk *c;
+
+ indent = clk_print_parent(clk, verbose);
+
+ printf("\033[1m");
+ dump_one(clk, verbose, indent);
+ printf("\033[0m");
+
+ list_for_each_entry(c, &clks, list) {
+ struct clk *parent = clk_get_parent(c);
+
+ if (parent == clk)
+ dump_subtree(c, verbose, indent + 1);
}
}
diff --git a/drivers/clk/mvebu/armada-38x.c b/drivers/clk/mvebu/armada-38x.c
index 627de7de6c..80865965e1 100644
--- a/drivers/clk/mvebu/armada-38x.c
+++ b/drivers/clk/mvebu/armada-38x.c
@@ -17,7 +17,7 @@
/*
* Core Clocks
*
- * Armada XP Sample At Reset is a 64 bit bitfiled split in two
+ * Armada XP Sample At Reset is a 64 bit bitfield split in two
* register of 32 bits
*/
diff --git a/drivers/clk/mvebu/armada-xp.c b/drivers/clk/mvebu/armada-xp.c
index d79f846d3f..f0276d32f5 100644
--- a/drivers/clk/mvebu/armada-xp.c
+++ b/drivers/clk/mvebu/armada-xp.c
@@ -16,7 +16,7 @@
/*
* Core Clocks
*
- * Armada XP Sample At Reset is a 64 bit bitfiled split in two
+ * Armada XP Sample At Reset is a 64 bit bitfield split in two
* register of 32 bits
*/
diff --git a/drivers/mci/Kconfig b/drivers/mci/Kconfig
index f7dc5c5089..09c0569286 100644
--- a/drivers/mci/Kconfig
+++ b/drivers/mci/Kconfig
@@ -69,6 +69,7 @@ config MCI_S3C
config MCI_BCM283X
bool "MCI support for BCM283X"
depends on ARCH_BCM283X || COMPILE_TEST
+ select MCI_SDHCI
config MCI_BCM283X_SDHOST
bool "BCM283X sdhost"
diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c
index c5cba3711a..370bebe6e2 100644
--- a/drivers/remoteproc/imx_rproc.c
+++ b/drivers/remoteproc/imx_rproc.c
@@ -172,7 +172,7 @@ static int imx_rproc_start(struct rproc *rproc)
ret = regmap_update_bits(priv->regmap, dcfg->src_reg,
dcfg->src_mask, dcfg->src_start);
if (ret)
- dev_err(dev, "Filed to enable M4!\n");
+ dev_err(dev, "Failed to enable M4!\n");
return ret;
}
@@ -187,7 +187,7 @@ static int imx_rproc_stop(struct rproc *rproc)
ret = regmap_update_bits(priv->regmap, dcfg->src_reg,
dcfg->src_mask, dcfg->src_stop);
if (ret)
- dev_err(dev, "Filed to stop M4!\n");
+ dev_err(dev, "Failed to stop M4!\n");
return ret;
}
@@ -210,7 +210,7 @@ static int imx_rproc_da_to_sys(struct imx_rproc *priv, u64 da,
}
}
- dev_warn(priv->dev, "Translation filed: da = 0x%llx len = 0x%x\n",
+ dev_warn(priv->dev, "Translation failed: da = 0x%llx len = 0x%x\n",
da, len);
return -ENOENT;
}
@@ -353,7 +353,7 @@ static int imx_rproc_probe(struct device_d *dev)
ret = imx_rproc_addr_init(priv, dev);
if (ret) {
- dev_err(dev, "filed on imx_rproc_addr_init\n");
+ dev_err(dev, "failed on imx_rproc_addr_init\n");
goto err_put_rproc;
}
diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c
index 8a28c1bafc..a81787bc6c 100644
--- a/drivers/remoteproc/remoteproc_core.c
+++ b/drivers/remoteproc/remoteproc_core.c
@@ -143,7 +143,7 @@ int rproc_add(struct rproc *rproc)
ret = firmwaremgr_register(fh);
if (ret)
- dev_err(dev, "filed to register firmware handler %s\n", rproc->name);
+ dev_err(dev, "failed to register firmware handler %s\n", rproc->name);
else
dev_info(dev, "%s is available\n", rproc->name);
diff --git a/drivers/usb/dwc3/dwc3-of-simple.c b/drivers/usb/dwc3/dwc3-of-simple.c
index e58d9f95fe..ac16d22624 100644
--- a/drivers/usb/dwc3/dwc3-of-simple.c
+++ b/drivers/usb/dwc3/dwc3-of-simple.c
@@ -21,85 +21,47 @@
struct dwc3_of_simple {
struct device_d *dev;
- struct clk **clks;
+ struct clk_bulk_data *clks;
int num_clocks;
};
-static int dwc3_of_simple_clk_init(struct dwc3_of_simple *simple, int count)
-{
- struct device_d *dev = simple->dev;
- struct device_node *np = dev->device_node;
- int i;
-
- simple->num_clocks = count;
-
- if (!count)
- return 0;
-
- simple->clks = xzalloc(sizeof(struct clk *));
- if (!simple->clks)
- return -ENOMEM;
-
- for (i = 0; i < simple->num_clocks; i++) {
- struct clk *clk;
-
- clk = of_clk_get(np, i);
- if (IS_ERR(clk)) {
- while (--i >= 0) {
- clk_disable(simple->clks[i]);
- clk_put(simple->clks[i]);
- }
- return PTR_ERR(clk);
- }
-
- simple->clks[i] = clk;
- }
-
- return 0;
-}
-
static int dwc3_of_simple_probe(struct device_d *dev)
{
struct dwc3_of_simple *simple;
struct device_node *np = dev->device_node;
int ret;
- int i;
simple = xzalloc(sizeof(*simple));
if (!simple)
return -ENOMEM;
- dev->priv = simple;
+ dev->priv = simple;
simple->dev = dev;
- ret = dwc3_of_simple_clk_init(simple, of_count_phandle_with_args(np,
- "clocks", "#clock-cells"));
+ ret = clk_bulk_get_all(simple->dev, &simple->clks);
+ if (ret < 0)
+ return ret;
+
+ simple->num_clocks = ret;
+ ret = clk_bulk_enable(simple->num_clocks, simple->clks);
if (ret)
return ret;
ret = of_platform_populate(np, NULL, dev);
if (ret) {
- for (i = 0; i < simple->num_clocks; i++) {
- clk_disable(simple->clks[i]);
- clk_put(simple->clks[i]);
- }
+ clk_bulk_disable(simple->num_clocks, simple->clks);
return ret;
}
- return 0;
+ return 0;
}
static void dwc3_of_simple_remove(struct device_d *dev)
{
struct dwc3_of_simple *simple = dev->priv;
- int i;
- for (i = 0; i < simple->num_clocks; i++) {
- clk_disable(simple->clks[i]);
- clk_put(simple->clks[i]);
- }
- simple->num_clocks = 0;
+ clk_bulk_disable(simple->num_clocks, simple->clks);
}
static const struct of_device_id of_dwc3_simple_match[] = {
diff --git a/drivers/video/imx-ipu-v3/imx-pd.c b/drivers/video/imx-ipu-v3/imx-pd.c
index 601be35880..fa6314c044 100644
--- a/drivers/video/imx-ipu-v3/imx-pd.c
+++ b/drivers/video/imx-ipu-v3/imx-pd.c
@@ -27,6 +27,8 @@
#include "imx-ipu-v3.h"
+#define IMX_PD_OUTPUT_PORT 1
+
struct imx_pd {
struct device_d *dev;
struct display_timings *timings;
@@ -39,7 +41,6 @@ static int imx_pd_ioctl(struct vpl *vpl, unsigned int port,
{
struct imx_pd *imx_pd = container_of(vpl, struct imx_pd, vpl);
struct ipu_di_mode *mode;
- struct display_timings *timings;
switch (cmd) {
case IMX_IPU_VPL_DI_MODE:
@@ -50,15 +51,21 @@ static int imx_pd_ioctl(struct vpl *vpl, unsigned int port,
return 0;
case VPL_GET_VIDEOMODES:
- timings = data;
-
- timings->num_modes = imx_pd->timings->num_modes;
- timings->native_mode = imx_pd->timings->native_mode;
- timings->modes = imx_pd->timings->modes;
- timings->edid = NULL;
- return 0;
+ if (imx_pd->timings) {
+ struct display_timings *timings = data;
+
+ timings->num_modes = imx_pd->timings->num_modes;
+ timings->native_mode = imx_pd->timings->native_mode;
+ timings->modes = imx_pd->timings->modes;
+ timings->edid = NULL;
+ return 0;
+ }
+ break;
}
+ if (!imx_pd->timings)
+ return vpl_ioctl(vpl, IMX_PD_OUTPUT_PORT, cmd, data);
+
return 0;
}
@@ -66,6 +73,7 @@ static int imx_pd_probe(struct device_d *dev)
{
struct device_node *node = dev->device_node;
struct imx_pd *imx_pd;
+ struct device_node *port;
const char *fmt;
int ret;
@@ -88,8 +96,11 @@ static int imx_pd_probe(struct device_d *dev)
imx_pd->timings = of_get_display_timings(node);
if (!imx_pd->timings) {
- dev_err(dev, "No display timings panel found\n");
- return -EINVAL;
+ port = of_graph_get_port_by_id(node, IMX_PD_OUTPUT_PORT);
+ if (!port) {
+ dev_err(dev, "Neither display timings in nor remote panel found in node\n");
+ return -EINVAL;
+ }
}
imx_pd->vpl.node = node;
diff --git a/drivers/video/simple-panel.c b/drivers/video/simple-panel.c
index 1d05153d16..2f904a7b2b 100644
--- a/drivers/video/simple-panel.c
+++ b/drivers/video/simple-panel.c
@@ -135,7 +135,7 @@ static int simple_panel_ioctl(struct vpl *vpl, unsigned int port,
case VPL_GET_VIDEOMODES:
return simple_panel_get_modes(panel, ptr);
default:
- return -ENOSYS;
+ return 0;
}
}
diff --git a/drivers/watchdog/efi_wdt.c b/drivers/watchdog/efi_wdt.c
index ea1ede1381..1512b1d99a 100644
--- a/drivers/watchdog/efi_wdt.c
+++ b/drivers/watchdog/efi_wdt.c
@@ -24,7 +24,7 @@ static int efi_wdt_set_timeout(struct watchdog *wd, unsigned timeout)
efiret = BS->set_watchdog_timer(timeout, 0, 0, NULL);
if (EFI_ERROR(efiret)) {
- dev_err(priv->dev, "filed to set EFI watchdog: %lx\n", efiret);
+ dev_err(priv->dev, "failed to set EFI watchdog: %lx\n", efiret);
return -EINVAL;
}
diff --git a/drivers/watchdog/stpmic1_wdt.c b/drivers/watchdog/stpmic1_wdt.c
index 458c5c16a3..12280f1447 100644
--- a/drivers/watchdog/stpmic1_wdt.c
+++ b/drivers/watchdog/stpmic1_wdt.c
@@ -200,7 +200,7 @@ static int stpmic1_wdt_probe(struct device_d *dev)
if (ret)
dev_warn(dev, "Cannot register poweroff handler\n");
- stpmic1_set_reset_reason(wdt->regmap);
+ ret = stpmic1_set_reset_reason(wdt->regmap);
if (ret)
dev_warn(dev, "Cannot query reset reason\n");