Skip to content

Commit

Permalink
drm/vc4: Turn the V3D clock on at runtime.
Browse files Browse the repository at this point in the history
For the Raspberry Pi's bindings, the power domain also implicitly
turns on the clock and deasserts reset, but for the new Cygnus port we
start representing the clock in the devicetree.

v2: Document the clock-names property, check for -ENOENT for no clock
    in DT.
v3: Drop NULL checks around clk calls which embed NULL checks.
v4: Drop clk-names (feedback by Rob Herring)

Signed-off-by: Eric Anholt <eric@anholt.net>
Acked-by: Rob Herring <robh@kernel.org>
Link: http://patchwork.freedesktop.org/patch/msgid/20170428224223.21904-1-eric@anholt.net
  • Loading branch information
Eric Anholt committed May 8, 2017
1 parent 52b18e3 commit b72a281
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 1 deletion.
3 changes: 3 additions & 0 deletions Documentation/devicetree/bindings/display/brcm,bcm-vc4.txt
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ Required properties for V3D:
- interrupts: The interrupt number
See bindings/interrupt-controller/brcm,bcm2835-armctrl-ic.txt

Optional properties for V3D:
- clocks: The clock the unit runs on

Required properties for DSI:
- compatible: Should be "brcm,bcm2835-dsi0" or "brcm,bcm2835-dsi1"
- reg: Physical base address and length of the DSI block's registers
Expand Down
1 change: 1 addition & 0 deletions drivers/gpu/drm/vc4/vc4_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,7 @@ struct vc4_v3d {
struct vc4_dev *vc4;
struct platform_device *pdev;
void __iomem *regs;
struct clk *clk;
};

struct vc4_hvs {
Expand Down
31 changes: 30 additions & 1 deletion drivers/gpu/drm/vc4/vc4_v3d.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
* this program. If not, see <http://www.gnu.org/licenses/>.
*/

#include "linux/clk.h"
#include "linux/component.h"
#include "linux/pm_runtime.h"
#include "vc4_drv.h"
Expand Down Expand Up @@ -305,6 +306,8 @@ static int vc4_v3d_runtime_suspend(struct device *dev)
drm_gem_object_put_unlocked(&vc4->bin_bo->base.base);
vc4->bin_bo = NULL;

clk_disable_unprepare(v3d->clk);

return 0;
}

Expand All @@ -318,6 +321,10 @@ static int vc4_v3d_runtime_resume(struct device *dev)
if (ret)
return ret;

ret = clk_prepare_enable(v3d->clk);
if (ret != 0)
return ret;

vc4_v3d_init_hw(vc4->dev);
vc4_irq_postinstall(vc4->dev);

Expand Down Expand Up @@ -348,15 +355,37 @@ static int vc4_v3d_bind(struct device *dev, struct device *master, void *data)
vc4->v3d = v3d;
v3d->vc4 = vc4;

v3d->clk = devm_clk_get(dev, NULL);
if (IS_ERR(v3d->clk)) {
int ret = PTR_ERR(v3d->clk);

if (ret == -ENOENT) {
/* bcm2835 didn't have a clock reference in the DT. */
ret = 0;
v3d->clk = NULL;
} else {
if (ret != -EPROBE_DEFER)
dev_err(dev, "Failed to get V3D clock: %d\n",
ret);
return ret;
}
}

if (V3D_READ(V3D_IDENT0) != V3D_EXPECTED_IDENT0) {
DRM_ERROR("V3D_IDENT0 read 0x%08x instead of 0x%08x\n",
V3D_READ(V3D_IDENT0), V3D_EXPECTED_IDENT0);
return -EINVAL;
}

ret = clk_prepare_enable(v3d->clk);
if (ret != 0)
return ret;

ret = vc4_allocate_bin_bo(drm);
if (ret)
if (ret) {
clk_disable_unprepare(v3d->clk);
return ret;
}

/* Reset the binner overflow address/size at setup, to be sure
* we don't reuse an old one.
Expand Down

0 comments on commit b72a281

Please sign in to comment.