drm/vc4: Remove the need for the GPU-subsystem DT node.
Subsystems (7)
PATCH 1/3 drm/vc4: Remove the need for the GPU-subsystem DT node.
The GPU subsystem node was a workaround to have a central device to bind V3D and display to. Following the lead of 246774d17fc0 ("drm/etnaviv: remove the need for a gpu-subsystem DT node"), remove the subsystem node usage and just create a platform device for the DRM device to attach to if any of the subsystem devices are present.
--- .../bindings/display/brcm,bcm-vc4.txt | 7 ---- drivers/gpu/drm/vc4/vc4_drv.c | 33 ++++++++++++++----- drivers/gpu/drm/vc4/vc4_hvs.c | 1 + drivers/gpu/drm/vc4/vc4_v3d.c | 1 + 4 files changed, 27 insertions(+), 15 deletions(-)
Documentation/devicetree/bindings/display/brcm,bcm-vc4.txt +0 -7
@@ -4,9 +4,6 @@ The VC4 device present on the Raspberry Pi includes a display system with HDMI output and the HVS (Hardware Video Scaler) for compositing display planes. -Required properties for VC4: -- compatible: Should be "brcm,bcm2835-vc4" or "brcm,cygnus-vc4" - Required properties for Pixel Valve: - compatible: Should be one of "brcm,bcm2835-pixelvalve0", "brcm,bcm2835-pixelvalve1", or "brcm,bcm2835-pixelvalve2"
@@ -153,10 +150,6 @@ v3d: v3d at 7ec00000 { interrupts = <1 10>; }; -vc4: gpu { - compatible = "brcm,bcm2835-vc4"; -}; - panel: panel { compatible = "ontat,yx700wv03", "simple-panel";
drivers/gpu/drm/vc4/vc4_drv.c +25 -8
@@ -364,22 +364,34 @@ static int vc4_platform_drm_remove(struct platform_device *pdev)return 0 ; } -static const struct of_device_id vc4_of_match[] = { - { .compatible ="brcm,bcm2835-vc4" , }, - { .compatible ="brcm,cygnus-vc4" , }, - {}, -}; -MODULE_DEVICE_TABLE (of, vc4_of_match); -static struct platform_driver vc4_platform_driver = { .probe = vc4_platform_drm_probe, .remove = vc4_platform_drm_remove, .driver = { .name ="vc4-drm" , - .of_match_table = vc4_of_match, }, }; +static bool +driver_of_table_has_a_match (const struct platform_driver *driver) +{ +int i; + +for (i =0 ; driver->driver.of_match_table[i].compatible; i++) { +const char *compat = driver->driver.of_match_table[i].compatible; +struct device_node *node; + +while ((node =of_find_compatible_node (node,NULL , compat))) { +if (of_device_is_available (node)) { +of_node_put (node); +return true; + } + } + } + +return false; +} +static int __init vc4_drm_register (void ) {int ret;
@@ -389,6 +401,11 @@ static int __init vc4_drm_register(void)if (ret)return ret; +if (driver_of_table_has_a_match (&vc4_v3d_driver) || +driver_of_table_has_a_match (&vc4_hvs_driver)) { +platform_device_register_simple ("vc4-drm" ,-1 ,NULL ,0 ); + } +return platform_driver_register (&vc4_platform_driver); }
drivers/gpu/drm/vc4/vc4_hvs.c +1 -0
@@ -262,6 +262,7 @@ static const struct of_device_id vc4_hvs_dt_match[] = { { .compatible = "brcm,bcm2835-hvs" }, {} }; +MODULE_DEVICE_TABLE (of, vc4_hvs_dt_match);struct platform_driver vc4_hvs_driver = { .probe = vc4_hvs_dev_probe,
drivers/gpu/drm/vc4/vc4_v3d.c +1 -0
@@ -459,6 +459,7 @@ static const struct of_device_id vc4_v3d_dt_match[] = { { .compatible = "brcm,vc4-v3d" }, {} }; +MODULE_DEVICE_TABLE (of, vc4_v3d_dt_match);struct platform_driver vc4_v3d_driver = { .probe = vc4_v3d_dev_probe,
Signature · 1 line
2.17.0
PATCH 2/3 ARM: dts: bcm283x: Remove the vc4 GPU subsystem node.
This is no longer required by the DRM driver, and was just a temporary hack for it.
--- arch/arm/boot/dts/bcm283x.dtsi | 4 ---- 1 file changed, 4 deletions(-)
arch/arm/boot/dts/bcm283x.dtsi +0 -4
@@ -609,10 +609,6 @@ reg = <0x7ec00000 0x1000>; interrupts = <1 10>; }; - - vc4: gpu { - compatible = "brcm,bcm2835-vc4"; - }; }; clocks {
Signature · 1 line
2.17.0
PATCH 3/3 ARM: dts: cygnus: Remove the vc4 GPU subsystem node.
In reply to Eric AnholtThis is no longer required by the DRM driver, and was just a temporary hack for it.
--- arch/arm/boot/dts/bcm-cygnus.dtsi | 4 ---- 1 file changed, 4 deletions(-)
arch/arm/boot/dts/bcm-cygnus.dtsi +0 -4
@@ -492,10 +492,6 @@ status = "disabled"; }; - vc4: gpu { - compatible = "brcm,cygnus-vc4"; - }; - gpio_asiu: gpio at 180a5000 { compatible = "brcm,cygnus-asiu-gpio"; reg = <0x180a5000 0x668>;
Signature · 1 line
2.17.0
Hi Eric,
Quoted 8 lines
Eric Anholt <[email protected]> hat am 10. April 2018 um 01:00 geschrieben:
The GPU subsystem node was a workaround to have a central device to bind V3D and display to. Following the lead of
246774d17fc0("drm/etnaviv: remove the need for a gpu-subsystem DT node"), remove the subsystem node usage and just create a platform device for the DRM device to attach to if any of the subsystem devices are present.
i didn't test it. Does the code change keep the backward compatibility with older DT?
Quoted 5 lines · Stefan Wahren
Hi Eric,
Quoted 3 lines
Eric Anholt <[email protected]> hat am 10. April 2018 um 01:00 geschrieben:
Quoted 7 lines
Quoted 5 lines
The GPU subsystem node was a workaround to have a central device to bind V3D and display to. Following the lead of
246774d17fc0("drm/etnaviv: remove the need for a gpu-subsystem DT node"), remove the subsystem node usage and just create a platform device for the DRM device to attach to if any of the subsystem devices are present.i didn't test it. Does the code change keep the backward compatibility with older DT?
Yes.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 832 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20180410/77e2b6df/attachment.sig>
Rob Herring
maintainerQuoted 70 lines · Eric Anholt
The GPU subsystem node was a workaround to have a central device to bind V3D and display to. Following the lead of
246774d17fc0("drm/etnaviv: remove the need for a gpu-subsystem DT node"), remove the subsystem node usage and just create a platform device for the DRM device to attach to if any of the subsystem devices are present.Signed-off-by Eric Anholt <[email protected]>--- .../bindings/display/brcm,bcm-vc4.txt | 7 ---- drivers/gpu/drm/vc4/vc4_drv.c | 33 ++++++++++++++----- drivers/gpu/drm/vc4/vc4_hvs.c | 1 + drivers/gpu/drm/vc4/vc4_v3d.c | 1 + 4 files changed, 27 insertions(+), 15 deletions(-)Documentation/devicetree/bindings/display/brcm,bcm-vc4.txt +0
-7@@ -4,9 +4,6 @@ The VC4 device present on the Raspberry Pi includes a display system with HDMI output and the HVS (Hardware Video Scaler) for compositing display planes. -Required properties for VC4: -- compatible: Should be "brcm,bcm2835-vc4" or "brcm,cygnus-vc4" - Required properties for Pixel Valve: - compatible: Should be one of "brcm,bcm2835-pixelvalve0", "brcm,bcm2835-pixelvalve1", or "brcm,bcm2835-pixelvalve2"@@ -153,10 +150,6 @@ v3d: v3d at 7ec00000 { interrupts = <1 10>; }; -vc4: gpu { - compatible = "brcm,bcm2835-vc4"; -}; - panel: panel { compatible = "ontat,yx700wv03", "simple-panel";drivers/gpu/drm/vc4/vc4_drv.c +6
-8@@ -364,22 +364,34 @@ static int vc4_platform_drm_remove(struct platform_device *pdev)return 0 ; } -static const struct of_device_id vc4_of_match[] = { - { .compatible ="brcm,bcm2835-vc4" , }, - { .compatible ="brcm,cygnus-vc4" , }, - {}, -}; -MODULE_DEVICE_TABLE (of, vc4_of_match); -static struct platform_driver vc4_platform_driver = { .probe = vc4_platform_drm_probe, .remove = vc4_platform_drm_remove, .driver = { .name ="vc4-drm" , - .of_match_table = vc4_of_match, }, }; +static bool +driver_of_table_has_a_match (const struct platform_driver *driver) +{ +int i; + +for (i =0 ; driver->driver.of_match_table[i].compatible; i++) {
drivers/gpu/drm/vc4/vc4_drv.c static int vc4_platform_drm_remove(struct platform_device *pdev) · line 391
Quoted 10 lines
drivers/gpu/drm/vc4/vc4_drv.c +10
-0+const char *compat = driver->driver.of_match_table[i].compatible; +struct device_node *node; + +while ((node =of_find_compatible_node (node,NULL , compat))) { +if (of_device_is_available (node)) { +of_node_put (node); +return true; + } + } + }
All this can be replaced with:
node = of_find_matching_node_and_match(NULL, driver->driver.of_match_table, NULL);
if (of_device_is_available(node)) {
of_node_put(node);
return true;
}Quoted 4 lines
drivers/gpu/drm/vc4/vc4_drv.c +4
-0+ +return false; +} +
PATCH v2 1/3 drm/vc4: Remove the need for the GPU-subsystem DT node.
The GPU subsystem node was a workaround to have a central device to bind V3D and display to. Following the lead of 246774d17fc0 ("drm/etnaviv: remove the need for a gpu-subsystem DT node"), remove the subsystem node usage and just create a platform device for the DRM device to attach to if any of the subsystem devices are present.
v2: Simplify the DT walking code.
--- .../bindings/display/brcm,bcm-vc4.txt | 7 ----- drivers/gpu/drm/vc4/vc4_drv.c | 29 ++++++++++++++----- drivers/gpu/drm/vc4/vc4_hvs.c | 1 + drivers/gpu/drm/vc4/vc4_v3d.c | 1 + 4 files changed, 23 insertions(+), 15 deletions(-)
Documentation/devicetree/bindings/display/brcm,bcm-vc4.txt +0 -7
@@ -4,9 +4,6 @@ The VC4 device present on the Raspberry Pi includes a display system with HDMI output and the HVS (Hardware Video Scaler) for compositing display planes. -Required properties for VC4: -- compatible: Should be "brcm,bcm2835-vc4" or "brcm,cygnus-vc4" - Required properties for Pixel Valve: - compatible: Should be one of "brcm,bcm2835-pixelvalve0", "brcm,bcm2835-pixelvalve1", or "brcm,bcm2835-pixelvalve2"
@@ -153,10 +150,6 @@ v3d: v3d at 7ec00000 { interrupts = <1 10>; }; -vc4: gpu { - compatible = "brcm,bcm2835-vc4"; -}; - panel: panel { compatible = "ontat,yx700wv03", "simple-panel";
drivers/gpu/drm/vc4/vc4_drv.c +21 -8
@@ -364,22 +364,30 @@ static int vc4_platform_drm_remove(struct platform_device *pdev)return 0 ; } -static const struct of_device_id vc4_of_match[] = { - { .compatible ="brcm,bcm2835-vc4" , }, - { .compatible ="brcm,cygnus-vc4" , }, - {}, -}; -MODULE_DEVICE_TABLE (of, vc4_of_match); -static struct platform_driver vc4_platform_driver = { .probe = vc4_platform_drm_probe, .remove = vc4_platform_drm_remove, .driver = { .name ="vc4-drm" , - .of_match_table = vc4_of_match, }, }; +static bool +driver_of_table_has_a_match (const struct platform_driver *driver) +{ +struct device_node *node; + + node =of_find_matching_node_and_match (NULL , + driver->driver.of_match_table, +NULL ); +if (of_device_is_available (node)) { +of_node_put (node); +return true; + } + +return false; +} +static int __init vc4_drm_register (void ) {int ret;
@@ -389,6 +397,11 @@ static int __init vc4_drm_register(void)if (ret)return ret; +if (driver_of_table_has_a_match (&vc4_v3d_driver) || +driver_of_table_has_a_match (&vc4_hvs_driver)) { +platform_device_register_simple ("vc4-drm" ,-1 ,NULL ,0 ); + } +return platform_driver_register (&vc4_platform_driver); }
drivers/gpu/drm/vc4/vc4_hvs.c +1 -0
@@ -262,6 +262,7 @@ static const struct of_device_id vc4_hvs_dt_match[] = { { .compatible = "brcm,bcm2835-hvs" }, {} }; +MODULE_DEVICE_TABLE (of, vc4_hvs_dt_match);struct platform_driver vc4_hvs_driver = { .probe = vc4_hvs_dev_probe,
drivers/gpu/drm/vc4/vc4_v3d.c +1 -0
@@ -459,6 +459,7 @@ static const struct of_device_id vc4_v3d_dt_match[] = { { .compatible = "brcm,vc4-v3d" }, {} }; +MODULE_DEVICE_TABLE (of, vc4_v3d_dt_match);struct platform_driver vc4_v3d_driver = { .probe = vc4_v3d_dev_probe,
Signature · 1 line
2.17.0
Quoted 8 lines · Eric Anholt
The GPU subsystem node was a workaround to have a central device to bind V3D and display to. Following the lead of
246774d17fc0("drm/etnaviv: remove the need for a gpu-subsystem DT node"), remove the subsystem node usage and just create a platform device for the DRM device to attach to if any of the subsystem devices are present.v2: Simplify the DT walking code.
drivers/gpu/drm/vc4/vc4_drv.c static int vc4_platform_drm_remove(struct platform_device *pdev) · line 384
Quoted 10 lines
drivers/gpu/drm/vc4/vc4_drv.c +10
-0+static bool +driver_of_table_has_a_match (const struct platform_driver *driver) +{ +struct device_node *node; + + node =of_find_matching_node_and_match (NULL , + driver->driver.of_match_table, +NULL ); +if (of_device_is_available (node)) { +of_node_put (node);
You need to put the node regardless.
Quoted 5 lines
drivers/gpu/drm/vc4/vc4_drv.c +5
-0+return true; + } + +return false; +}
PATCH v3 1/3 drm/vc4: Remove the need for the GPU-subsystem DT node.
The GPU subsystem node was a workaround to have a central device to bind V3D and display to. Following the lead of 246774d17fc0 ("drm/etnaviv: remove the need for a gpu-subsystem DT node"), remove the subsystem node usage and just create a platform device for the DRM device to attach to if any of the subsystem devices are present.
v2: Simplify the DT walking code.
v3: Always put the node.
--- .../bindings/display/brcm,bcm-vc4.txt | 7 ----- drivers/gpu/drm/vc4/vc4_drv.c | 28 +++++++++++++------ drivers/gpu/drm/vc4/vc4_hvs.c | 1 + drivers/gpu/drm/vc4/vc4_v3d.c | 1 + 4 files changed, 22 insertions(+), 15 deletions(-)
Documentation/devicetree/bindings/display/brcm,bcm-vc4.txt +0 -7
@@ -4,9 +4,6 @@ The VC4 device present on the Raspberry Pi includes a display system with HDMI output and the HVS (Hardware Video Scaler) for compositing display planes. -Required properties for VC4: -- compatible: Should be "brcm,bcm2835-vc4" or "brcm,cygnus-vc4" - Required properties for Pixel Valve: - compatible: Should be one of "brcm,bcm2835-pixelvalve0", "brcm,bcm2835-pixelvalve1", or "brcm,bcm2835-pixelvalve2"
@@ -153,10 +150,6 @@ v3d: v3d@7ec00000 { interrupts = <1 10>; }; -vc4: gpu { - compatible = "brcm,bcm2835-vc4"; -}; - panel: panel { compatible = "ontat,yx700wv03", "simple-panel";
drivers/gpu/drm/vc4/vc4_drv.c +20 -8
@@ -364,22 +364,29 @@ static int vc4_platform_drm_remove(struct platform_device *pdev)return 0 ; } -static const struct of_device_id vc4_of_match[] = { - { .compatible ="brcm,bcm2835-vc4" , }, - { .compatible ="brcm,cygnus-vc4" , }, - {}, -}; -MODULE_DEVICE_TABLE (of, vc4_of_match); -static struct platform_driver vc4_platform_driver = { .probe = vc4_platform_drm_probe, .remove = vc4_platform_drm_remove, .driver = { .name ="vc4-drm" , - .of_match_table = vc4_of_match, }, }; +static bool +driver_of_table_has_a_match (const struct platform_driver *driver) +{ +struct device_node *node; +bool ret; + + node =of_find_matching_node_and_match (NULL , + driver->driver.of_match_table, +NULL ); + ret =of_device_is_available (node); +of_node_put (node); + +return ret; +} +static int __init vc4_drm_register (void ) {int ret;
@@ -389,6 +396,11 @@ static int __init vc4_drm_register(void)if (ret)return ret; +if (driver_of_table_has_a_match (&vc4_v3d_driver) || +driver_of_table_has_a_match (&vc4_hvs_driver)) { +platform_device_register_simple ("vc4-drm" ,-1 ,NULL ,0 ); + } +return platform_driver_register (&vc4_platform_driver); }
drivers/gpu/drm/vc4/vc4_hvs.c +1 -0
@@ -262,6 +262,7 @@ static const struct of_device_id vc4_hvs_dt_match[] = { { .compatible = "brcm,bcm2835-hvs" }, {} }; +MODULE_DEVICE_TABLE (of, vc4_hvs_dt_match);struct platform_driver vc4_hvs_driver = { .probe = vc4_hvs_dev_probe,
drivers/gpu/drm/vc4/vc4_v3d.c +1 -0
@@ -459,6 +459,7 @@ static const struct of_device_id vc4_v3d_dt_match[] = { { .compatible = "brcm,vc4-v3d" }, {} }; +MODULE_DEVICE_TABLE (of, vc4_v3d_dt_match);struct platform_driver vc4_v3d_driver = { .probe = vc4_v3d_dev_probe,
Signature · 1 line
2.17.0
Quoted 9 lines · Eric Anholt
The GPU subsystem node was a workaround to have a central device to bind V3D and display to. Following the lead of
246774d17fc0("drm/etnaviv: remove the need for a gpu-subsystem DT node"), remove the subsystem node usage and just create a platform device for the DRM device to attach to if any of the subsystem devices are present.v2: Simplify the DT walking code.
v3: Always put the node.
Quoted 7 lines
Signed-off-by Eric Anholt <[email protected]>--- .../bindings/display/brcm,bcm-vc4.txt | 7 ----- drivers/gpu/drm/vc4/vc4_drv.c | 28 +++++++++++++------ drivers/gpu/drm/vc4/vc4_hvs.c | 1 + drivers/gpu/drm/vc4/vc4_v3d.c | 1 + 4 files changed, 22 insertions(+), 15 deletions(-)
Quoted 18 lines · Rob Herring
Quoted 9 lines · Eric Anholt
The GPU subsystem node was a workaround to have a central device to bind V3D and display to. Following the lead of
246774d17fc0("drm/etnaviv: remove the need for a gpu-subsystem DT node"), remove the subsystem node usage and just create a platform device for the DRM device to attach to if any of the subsystem devices are present.v2: Simplify the DT walking code.
v3: Always put the node.Quoted 7 lines
Signed-off-by Eric Anholt <[email protected]>--- .../bindings/display/brcm,bcm-vc4.txt | 7 ----- drivers/gpu/drm/vc4/vc4_drv.c | 28 +++++++++++++------ drivers/gpu/drm/vc4/vc4_hvs.c | 1 + drivers/gpu/drm/vc4/vc4_v3d.c | 1 + 4 files changed, 22 insertions(+), 15 deletions(-)
Quoted 1 line
Reviewed-by Rob Herring <[email protected]>
Unfortunately, on further testing, this ends up broken. My guess is
that our new platform device isn't on the same bus, so we don't get our
dma-ranges translation when we use drm->dev, and that breaks caching
behavior.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 832 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20180417/496ebf3b/attachment-0001.sig>