Re: [PATCH] drm/panthor: Add support for performance counters

2024-03-08 Thread Mihail Atanassov
DEV_QUERY, it's a very
roundabout way of decoding the layout of the dump buffer.

It'd be much preferable for the kernel to provide metadata to help
userspace decode which block is which type and what its offset is into
the buffer. Then all userspace needs to have is a table of which counter
is where in relation to the start of its respective block. Most of this
is static for a given device, so could be provided right here with
something like:

struct drm_panthor_perfcnt_info {
__u32 metadata_size; /** sample metadata incl.:
* the reason the sample was taken,
* the start/end timestamps,
* gpu/shadercore cycle count,
* sequence number,
* error flags,
* block offsets/indices,
* ... */
__u32 hw_size;
__u32 fw_size;
/* you probably want a sample_size, if you don't want to
 * pack the metadata tightly */
__u32 counters_per_block;
__u32 counter_size;
__u32 num_fw_blocks;
__u32 num_csg_blocks;
__u32 num_csf_blocks;
__u32 num_tiler_blocks;
__u32 num_mmu_l2_blocks;
__u32 num_shader_blocks;
};

What we would like to be able to support with panthor eventually is
HWCPipe[1], which supports both our deployed mali_kbase uAPIs (vinstr[2] 
and kinstr_prfcnt[3]) and provides a consistent API for other tooling

and game engines to work against. kinstr_prfcnt most notably returns
samples with metadata to help userspace make sense of the sample layout,
which saves a ton of headaches in userspace.


+};
+
  /**
   * struct drm_panthor_dev_query - Arguments passed to 
DRM_PANTHOR_IOCTL_DEV_QUERY
   */
@@ -938,6 +964,52 @@ struct drm_panthor_tiler_heap_destroy {
__u32 pad;
  };
  
+/**

+ * struct drm_panthor_perfcnt_config - Arguments passed to 
DRM_IOCTL_PANTHOR_PERFCNT_CONFIG
+ */
+struct drm_panthor_perfcnt_config {
+   /** @ringslots: Size of the perfcnt ring buffer in slot count. */
+   __u32 ringslots;
+
+   /** @counterset: Counter set to enable in Panthor. */
+   __u32 counterset;
+
+   /** @csg_enable: List of CSG intances enabled for perf counting */
+   __u32 csg_select;
+
+   /** @fw_enable  FW counters to be enabled */
+   __u32 fw_enable;
+
+   /** @csg_enable  CSG counters to be enabled */
+   __u32 csg_enable;
+
+   /** @csf_enable  CSF counters to be enabled */
+   __u32 csf_enable;


I wouldn't want to expose to userspace the HW quirk that counters get
enabled in blocks of 4. Currently available hardware already increases
from 64 counters per block (Gx10) to 128 (Gx15 and later), if that goes
up, you'll either get another enable register (easy fix), or you'll have 
to change uAPI semantics to be a bit per 8 counters, to make things fit.

Ideally userspace shouldn't have to worry about either option.

__u64 csf_enable_0_to_63;
__u64 csf_enable_64_to_127;
/* etc... */

The above or something similar will cover all existing CSF hardware, and
you'd simply need to add new fields without changing any semantics if
new HW grows bigger.


+
+   /** @shader_enable  Shader unit counters to be enabled */
+   __u32 shader_enable;
+
+   /** @tiler_enable  Tiler unit counters to be enabled */
+   __u32 tiler_enable;
+
+   /** @mmu_l2_enable  L2 cache MMU counters to be enabled */
+   __u32 mmu_l2_enable;
+
+   /** @pad: Padding field, MBZ. */
+   __u32 pad;
+};


A couple of extra issues with the config as a whole, though I think this
can be done as an extension in the future, assuming multicontext access
is solved:
 * you can't get as reliable a periodic trigger from userspace as you
can with an hrtimer, so it would make sense to leave enough of a hole in
the uAPI to let the kernel manage when a counter sample is collected by
specifying a desired period.
 * the HW is capable of starting/stopping the counters without rewriting
the enable masks. With the current ioctl, the config and the start/stop
are intertwined. HWCPipe allows for that use case, and while it is
possible to emulate it with this uAPI, it's not ideal.
 * as with the above, the only way to clear counters is to turn off
everything and re-enable it again, which means userspace has to remember
what the config was.


+
+/**
+ * struct drm_panthor_perfcnt_dump - Arguments passed to 
DRM_IOCTL_PANTHOR_PERFCNT_DUMP
+ */
+struct drm_panthor_perfcnt_dump {
+   /** @handle: Handle of the BO to write perfcnt dump into */
+   __u32 handle;


This requires you to memcpy(), and a dump is not a trivial amount of
data (up to 16.5KiB for a large config G715, for example). This isn't
feasible when you want to be able to get more than a handful of counter
samples per frame when your refresh rate is 120Hz. At a 10kHz sampling
rate your bandwidth will be upwards of 300MB/s for the counters alone,
just to shuttle them to userspace (assuming a 1-1 mapping between dump
request from userspace and sample generation from HW, which isn't the
case - HW will take extra samples beyond that). You can halve that if
the interface exposes a kernel maintained ringbuffer that userspace can
mmap() an entry of, use what data it needs, and munmap() it when done.


+
+   /** @pad: Padding field, MBZ. */
+   __u32 pad;
+};
+
  #if defined(__cplusplus)
  }
  #endif

base-commit: e635b7eb7062b464bbd9795308b1a80eac0b01f5


--
Mihail Atanassov 


[1] https://github.com/ARM-software/HWCPipe/tree/main/backend/device
[2] 
https://android.googlesource.com/kernel/google-modules/gpu/+/refs/tags/android-14.0.0_r0.53/common/include/uapi/gpu/arm/midgard/mali_kbase_hwcnt_reader.h?autodive=0%2F#28
[3] 
https://android.googlesource.com/kernel/google-modules/gpu/+/refs/tags/android-14.0.0_r0.53/common/include/uapi/gpu/arm/midgard/mali_kbase_hwcnt_reader.h?autodive=0%2F#105


[PATCH v3 32/35] drm/mediatek: hdmi: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change.

v3:
 - drop driver_private argument (Laurent)

Acked-by: CK Hu 
Reviewed-by: Laurent Pinchart 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/mediatek/mtk_hdmi.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_hdmi.c 
b/drivers/gpu/drm/mediatek/mtk_hdmi.c
index 5e4a4dbda443..a5fd2b68e407 100644
--- a/drivers/gpu/drm/mediatek/mtk_hdmi.c
+++ b/drivers/gpu/drm/mediatek/mtk_hdmi.c
@@ -1710,8 +1710,8 @@ static int mtk_drm_hdmi_probe(struct platform_device 
*pdev)
 
mtk_hdmi_register_audio_driver(dev);
 
-   hdmi->bridge.funcs = _hdmi_bridge_funcs;
-   hdmi->bridge.of_node = pdev->dev.of_node;
+   drm_bridge_init(>bridge, >dev, _hdmi_bridge_funcs,
+   NULL);
drm_bridge_add(>bridge);
 
ret = mtk_hdmi_clk_enable_audio(hdmi);
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 21/35] drm/bridge: sil_sii8620: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change.

v3:
 - drop driver_private argument (Laurent)

Reviewed-by: Laurent Pinchart 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/sil-sii8620.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/bridge/sil-sii8620.c 
b/drivers/gpu/drm/bridge/sil-sii8620.c
index 4c0eef406eb1..d67f9a844647 100644
--- a/drivers/gpu/drm/bridge/sil-sii8620.c
+++ b/drivers/gpu/drm/bridge/sil-sii8620.c
@@ -2337,8 +2337,7 @@ static int sii8620_probe(struct i2c_client *client,
 
i2c_set_clientdata(client, ctx);
 
-   ctx->bridge.funcs = _bridge_funcs;
-   ctx->bridge.of_node = dev->of_node;
+   drm_bridge_init(>bridge, dev, _bridge_funcs, NULL);
drm_bridge_add(>bridge);
 
if (!ctx->extcon)
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 08/35] drm/bridge: Drop driver_private from struct drm_bridge

2019-12-25 Thread Mihail Atanassov
It's no longer used, all drivers have been converted to an embedded
drm_bridge struct.

Signed-off-by: Mihail Atanassov 
---
 include/drm/drm_bridge.h | 2 --
 1 file changed, 2 deletions(-)

diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h
index 695d0898df38..ee175a2f95e6 100644
--- a/include/drm/drm_bridge.h
+++ b/include/drm/drm_bridge.h
@@ -398,8 +398,6 @@ struct drm_bridge {
const struct drm_bridge_timings *timings;
/** @funcs: control functions */
const struct drm_bridge_funcs *funcs;
-   /** @driver_private: pointer to the bridge driver's internal context */
-   void *driver_private;
 };
 
 void drm_bridge_add(struct drm_bridge *bridge);
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 26/35] drm/bridge: thc63: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change.

v3:
 - drop driver_private argument (Laurent)

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/thc63lvd1024.c | 6 ++
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/bridge/thc63lvd1024.c 
b/drivers/gpu/drm/bridge/thc63lvd1024.c
index 784f4e4eea05..30f6a76850f8 100644
--- a/drivers/gpu/drm/bridge/thc63lvd1024.c
+++ b/drivers/gpu/drm/bridge/thc63lvd1024.c
@@ -218,10 +218,8 @@ static int thc63_probe(struct platform_device *pdev)
if (ret)
return ret;
 
-   thc63->bridge.of_node = pdev->dev.of_node;
-   thc63->bridge.funcs = _bridge_func;
-   thc63->bridge.timings = >timings;
-
+   drm_bridge_init(>bridge, >dev, _bridge_func,
+   >timings);
drm_bridge_add(>bridge);
 
return 0;
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 33/35] drm: rcar-du: lvds: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change.

v3:
 - drop driver_private argument (Laurent)

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/rcar-du/rcar_lvds.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/rcar-du/rcar_lvds.c 
b/drivers/gpu/drm/rcar-du/rcar_lvds.c
index 1d6dfae8a200..30e284c3d189 100644
--- a/drivers/gpu/drm/rcar-du/rcar_lvds.c
+++ b/drivers/gpu/drm/rcar-du/rcar_lvds.c
@@ -882,8 +882,7 @@ static int rcar_lvds_probe(struct platform_device *pdev)
if (ret < 0)
return ret;
 
-   lvds->bridge.funcs = _lvds_bridge_ops;
-   lvds->bridge.of_node = pdev->dev.of_node;
+   drm_bridge_init(>bridge, >dev, _lvds_bridge_ops, NULL);
 
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
lvds->mmio = devm_ioremap_resource(>dev, mem);
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 28/35] drm/bridge: ti-tfp410: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change.

v3:
 - drop driver_private argument (Laurent)

Reviewed-by: Laurent Pinchart 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/ti-tfp410.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/bridge/ti-tfp410.c 
b/drivers/gpu/drm/bridge/ti-tfp410.c
index 76229367e2f4..6371530943a1 100644
--- a/drivers/gpu/drm/bridge/ti-tfp410.c
+++ b/drivers/gpu/drm/bridge/ti-tfp410.c
@@ -328,9 +328,7 @@ static int tfp410_init(struct device *dev, bool i2c)
return -ENOMEM;
dev_set_drvdata(dev, dvi);
 
-   dvi->bridge.funcs = _bridge_funcs;
-   dvi->bridge.of_node = dev->of_node;
-   dvi->bridge.timings = >timings;
+   drm_bridge_init(>bridge, dev, _bridge_funcs, >timings);
dvi->dev = dev;
 
ret = tfp410_parse_timings(dvi, i2c);
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 25/35] drm/bridge: tc358767: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change.

v3:
 - drop driver_private argument (Laurent)

Reviewed-by: Laurent Pinchart 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/tc358767.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c 
b/drivers/gpu/drm/bridge/tc358767.c
index ab1524c00777..7f60c6d85fb2 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -1671,8 +1671,7 @@ static int tc_probe(struct i2c_client *client, const 
struct i2c_device_id *id)
if (ret)
return ret;
 
-   tc->bridge.funcs = _bridge_funcs;
-   tc->bridge.of_node = dev->of_node;
+   drm_bridge_init(>bridge, dev, _bridge_funcs, NULL);
drm_bridge_add(>bridge);
 
i2c_set_clientdata(client, tc);
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 35/35] drm/msm: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change: drm_bridge_init() sets bridge->of_node, but that's
not used by msm anywhere, and the bridges aren't published with
drm_bridge_add() for it to matter.

v3:
 - drop driver_private argument (Laurent)

Reviewed-by: Laurent Pinchart 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/msm/dsi/dsi_manager.c  | 3 +--
 drivers/gpu/drm/msm/edp/edp_bridge.c   | 3 +--
 drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 3 +--
 3 files changed, 3 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c 
b/drivers/gpu/drm/msm/dsi/dsi_manager.c
index 0fc29f1be8cc..058f8f9a8535 100644
--- a/drivers/gpu/drm/msm/dsi/dsi_manager.c
+++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c
@@ -662,8 +662,7 @@ struct drm_bridge *msm_dsi_manager_bridge_init(u8 id)
encoder = msm_dsi->encoder;
 
bridge = _bridge->base;
-   bridge->funcs = _mgr_bridge_funcs;
-
+   drm_bridge_init(bridge, msm_dsi->dev->dev, _mgr_bridge_funcs, NULL);
ret = drm_bridge_attach(encoder, bridge, NULL);
if (ret)
goto fail;
diff --git a/drivers/gpu/drm/msm/edp/edp_bridge.c 
b/drivers/gpu/drm/msm/edp/edp_bridge.c
index 301dd7a80bde..1f1cc87d0dd2 100644
--- a/drivers/gpu/drm/msm/edp/edp_bridge.c
+++ b/drivers/gpu/drm/msm/edp/edp_bridge.c
@@ -95,8 +95,7 @@ struct drm_bridge *msm_edp_bridge_init(struct msm_edp *edp)
edp_bridge->edp = edp;
 
bridge = _bridge->base;
-   bridge->funcs = _bridge_funcs;
-
+   drm_bridge_init(bridge, edp->dev->dev, _bridge_funcs, NULL);
ret = drm_bridge_attach(edp->encoder, bridge, NULL);
if (ret)
goto fail;
diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c 
b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c
index 07c098dce310..ed62d0822615 100644
--- a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c
+++ b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c
@@ -285,8 +285,7 @@ struct drm_bridge *msm_hdmi_bridge_init(struct hdmi *hdmi)
hdmi_bridge->hdmi = hdmi;
 
bridge = _bridge->base;
-   bridge->funcs = _hdmi_bridge_funcs;
-
+   drm_bridge_init(bridge, hdmi->dev->dev, _hdmi_bridge_funcs, NULL);
ret = drm_bridge_attach(hdmi->encoder, bridge, NULL);
if (ret)
goto fail;
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 17/35] drm/bridge: panel: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change.

v3:
 - drop driver_private argument (Laurent)

Reviewed-by: Laurent Pinchart 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/panel.c | 7 ++-
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/bridge/panel.c b/drivers/gpu/drm/bridge/panel.c
index 4ba4e9d9537a..b8a87a4956b6 100644
--- a/drivers/gpu/drm/bridge/panel.c
+++ b/drivers/gpu/drm/bridge/panel.c
@@ -192,11 +192,8 @@ struct drm_bridge *drm_panel_bridge_add_typed(struct 
drm_panel *panel,
panel_bridge->connector_type = connector_type;
panel_bridge->panel = panel;
 
-   panel_bridge->bridge.funcs = _bridge_bridge_funcs;
-#ifdef CONFIG_OF
-   panel_bridge->bridge.of_node = panel->dev->of_node;
-#endif
-
+   drm_bridge_init(_bridge->bridge, panel->dev,
+   _bridge_bridge_funcs, NULL);
drm_bridge_add(_bridge->bridge);
 
return _bridge->bridge;
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 20/35] drm/bridge: sii9234: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change.

v3:
 - drop driver_private argument (Laurent)
 - update commit title prefix (Neil)

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/sii9234.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/bridge/sii9234.c b/drivers/gpu/drm/bridge/sii9234.c
index f81f81b7051f..108cff6c87b7 100644
--- a/drivers/gpu/drm/bridge/sii9234.c
+++ b/drivers/gpu/drm/bridge/sii9234.c
@@ -925,8 +925,7 @@ static int sii9234_probe(struct i2c_client *client,
 
i2c_set_clientdata(client, ctx);
 
-   ctx->bridge.funcs = _bridge_funcs;
-   ctx->bridge.of_node = dev->of_node;
+   drm_bridge_init(>bridge, dev, _bridge_funcs, NULL);
drm_bridge_add(>bridge);
 
sii9234_cable_in(ctx);
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 12/35] drm/bridge: cdns: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change.

v3:
 - drop driver_private argument (Laurent)

Reviewed-by: Laurent Pinchart 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/cdns-dsi.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/bridge/cdns-dsi.c 
b/drivers/gpu/drm/bridge/cdns-dsi.c
index 32863e3ad537..15999c971cd4 100644
--- a/drivers/gpu/drm/bridge/cdns-dsi.c
+++ b/drivers/gpu/drm/bridge/cdns-dsi.c
@@ -1233,8 +1233,8 @@ static int cdns_dsi_drm_probe(struct platform_device 
*pdev)
 * CDNS_DPI_INPUT.
 */
input->id = CDNS_DPI_INPUT;
-   input->bridge.funcs = _dsi_bridge_funcs;
-   input->bridge.of_node = pdev->dev.of_node;
+   drm_bridge_init(>bridge, >dev, _dsi_bridge_funcs,
+   NULL);
 
/* Mask all interrupts before registering the IRQ handler. */
writel(0, dsi->regs + MCTL_MAIN_STS_CTL);
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 01/35] drm: Remove drm_bridge->dev

2019-12-25 Thread Mihail Atanassov
As suggested in [1], the 'dev' field is a bit repetitive, since it 1:1
follows the setting and NULLing of the 'encoder' field. Therefore, use
drm_bridge->encoder->dev in place of drm_bridge->dev.

[1] https://patchwork.freedesktop.org/patch/343824/

v3:
 - resend as part of drm_bridge_init() series
v2:
 - fix checkpatch complaint about unnecessary parentheses in
 drm_bridge.c

Cc: Daniel Vetter 
Suggested-by: Thomas Zimmermann 
Acked-by: Thomas Zimmermann 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/adv7511/adv7511_drv.c   |  2 +-
 drivers/gpu/drm/bridge/analogix/analogix-anx6345.c |  2 +-
 drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c |  2 +-
 drivers/gpu/drm/bridge/cdns-dsi.c  |  2 +-
 drivers/gpu/drm/bridge/dumb-vga-dac.c  |  2 +-
 .../gpu/drm/bridge/megachips-stdp-ge-b850v3-fw.c   |  2 +-
 drivers/gpu/drm/bridge/nxp-ptn3460.c   |  2 +-
 drivers/gpu/drm/bridge/panel.c |  2 +-
 drivers/gpu/drm/bridge/parade-ps8622.c |  2 +-
 drivers/gpu/drm/bridge/sii902x.c   |  6 +++---
 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c  |  6 +++---
 drivers/gpu/drm/bridge/tc358764.c  |  4 ++--
 drivers/gpu/drm/bridge/tc358767.c  |  6 +++---
 drivers/gpu/drm/bridge/ti-sn65dsi86.c  |  2 +-
 drivers/gpu/drm/bridge/ti-tfp410.c |  6 +++---
 drivers/gpu/drm/drm_bridge.c   | 10 --
 drivers/gpu/drm/i2c/tda998x_drv.c  |  2 +-
 drivers/gpu/drm/mcde/mcde_dsi.c|  2 +-
 drivers/gpu/drm/msm/edp/edp_bridge.c   |  2 +-
 drivers/gpu/drm/msm/hdmi/hdmi_bridge.c |  4 ++--
 drivers/gpu/drm/rcar-du/rcar_lvds.c|  3 ++-
 include/drm/drm_bridge.h   |  2 --
 22 files changed, 35 insertions(+), 38 deletions(-)

diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c 
b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
index 9e13e466e72c..009cf1fef8d4 100644
--- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
+++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
@@ -863,7 +863,7 @@ static int adv7511_bridge_attach(struct drm_bridge *bridge)
adv->connector.polled = DRM_CONNECTOR_POLL_CONNECT |
DRM_CONNECTOR_POLL_DISCONNECT;
 
-   ret = drm_connector_init(bridge->dev, >connector,
+   ret = drm_connector_init(bridge->encoder->dev, >connector,
 _connector_funcs,
 DRM_MODE_CONNECTOR_HDMIA);
if (ret) {
diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c 
b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
index 9917ce0d86a0..5b806d23fcb3 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
@@ -541,7 +541,7 @@ static int anx6345_bridge_attach(struct drm_bridge *bridge)
return err;
}
 
-   err = drm_connector_init(bridge->dev, >connector,
+   err = drm_connector_init(bridge->encoder->dev, >connector,
 _connector_funcs,
 DRM_MODE_CONNECTOR_eDP);
if (err) {
diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c 
b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
index 41867be03751..7463537950cb 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
@@ -908,7 +908,7 @@ static int anx78xx_bridge_attach(struct drm_bridge *bridge)
return err;
}
 
-   err = drm_connector_init(bridge->dev, >connector,
+   err = drm_connector_init(bridge->encoder->dev, >connector,
 _connector_funcs,
 DRM_MODE_CONNECTOR_DisplayPort);
if (err) {
diff --git a/drivers/gpu/drm/bridge/cdns-dsi.c 
b/drivers/gpu/drm/bridge/cdns-dsi.c
index 3a5bd4e7fd1e..32863e3ad537 100644
--- a/drivers/gpu/drm/bridge/cdns-dsi.c
+++ b/drivers/gpu/drm/bridge/cdns-dsi.c
@@ -651,7 +651,7 @@ static int cdns_dsi_bridge_attach(struct drm_bridge *bridge)
struct cdns_dsi *dsi = input_to_dsi(input);
struct cdns_dsi_output *output = >output;
 
-   if (!drm_core_check_feature(bridge->dev, DRIVER_ATOMIC)) {
+   if (!drm_core_check_feature(bridge->encoder->dev, DRIVER_ATOMIC)) {
dev_err(dsi->base.dev,
"cdns-dsi driver is only compatible with DRM devices 
supporting atomic updates");
return -ENOTSUPP;
diff --git a/drivers/gpu/drm/bridge/dumb-vga-dac.c 
b/drivers/gpu/drm/bridge/dumb-vga-dac.c
index cc33dc411b9e..67ad6cecf68d 100644
--- a/drivers/gpu/drm/bridge/dumb-vga-dac.c
+++ b/drivers/g

[PATCH v3 29/35] drm/exynos: mic: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change.

v3:
 - drop driver_private argument (Laurent)

Cc: Inki Dae 
Cc: Laurent Pinchart 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/exynos/exynos_drm_mic.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_mic.c 
b/drivers/gpu/drm/exynos/exynos_drm_mic.c
index 2b5f10c3a285..3bc9f81d0170 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_mic.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_mic.c
@@ -420,9 +420,7 @@ static int exynos_mic_probe(struct platform_device *pdev)
 
platform_set_drvdata(pdev, mic);
 
-   mic->bridge.funcs = _bridge_funcs;
-   mic->bridge.of_node = dev->of_node;
-
+   drm_bridge_init(>bridge, dev, _bridge_funcs, NULL);
drm_bridge_add(>bridge);
 
pm_runtime_enable(dev);
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 16/35] drm/bridge: nxp-ptn3460: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change.

v3:
 - drop driver_private argument (Laurent)

Reviewed-by: Laurent Pinchart 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/nxp-ptn3460.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/bridge/nxp-ptn3460.c 
b/drivers/gpu/drm/bridge/nxp-ptn3460.c
index 3999bb864eb9..19f37ec8284d 100644
--- a/drivers/gpu/drm/bridge/nxp-ptn3460.c
+++ b/drivers/gpu/drm/bridge/nxp-ptn3460.c
@@ -320,8 +320,7 @@ static int ptn3460_probe(struct i2c_client *client,
return ret;
}
 
-   ptn_bridge->bridge.funcs = _bridge_funcs;
-   ptn_bridge->bridge.of_node = dev->of_node;
+   drm_bridge_init(_bridge->bridge, dev, _bridge_funcs, NULL);
drm_bridge_add(_bridge->bridge);
 
i2c_set_clientdata(client, ptn_bridge);
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 09/35] drm: Introduce drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
A simple convenience function to initialize the struct drm_bridge. The
goal is to standardize initialization for any bridge registered with
drm_bridge_add() so that we can later add device links for consumers of
those bridges.

v3:
 - drop driver_private parameter (Laurent)
 - spelling & style updates to docs (Laurent)
 - don't set drm_bridge->dev (field removed)
v2:
 - s/WARN_ON(!funcs)/WARN_ON(!funcs || !dev)/ as suggested by Daniel
 - expand on some kerneldoc comments as suggested by Daniel
 - update commit message as suggested by Daniel

Reviewed-by: Daniel Vetter 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/drm_bridge.c | 30 ++
 include/drm/drm_bridge.h | 12 
 2 files changed, 42 insertions(+)

diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c
index 258094169706..d6b64e9aec7c 100644
--- a/drivers/gpu/drm/drm_bridge.c
+++ b/drivers/gpu/drm/drm_bridge.c
@@ -67,6 +67,11 @@ static LIST_HEAD(bridge_list);
  * drm_bridge_add - add the given bridge to the global bridge list
  *
  * @bridge: bridge control structure
+ *
+ * Drivers shall call drm_bridge_init() prior to adding the bridge to the list.
+ * Before deleting a bridge (usually when the driver is unbound from the
+ * device), drivers shall call drm_bridge_remove() to remove it from the global
+ * list.
  */
 void drm_bridge_add(struct drm_bridge *bridge)
 {
@@ -89,6 +94,31 @@ void drm_bridge_remove(struct drm_bridge *bridge)
 }
 EXPORT_SYMBOL(drm_bridge_remove);
 
+/**
+ * drm_bridge_init - initialize a drm_bridge structure
+ *
+ * @bridge: bridge control structure
+ * @dev: device associated with this drm_bridge
+ * @funcs: control functions
+ * @timings: timing specification for the bridge; optional (may be NULL)
+ */
+void drm_bridge_init(struct drm_bridge *bridge, struct device *dev,
+const struct drm_bridge_funcs *funcs,
+const struct drm_bridge_timings *timings)
+{
+   WARN_ON(!funcs || !dev);
+
+   bridge->encoder = NULL;
+   INIT_LIST_HEAD(>chain_node);
+
+#ifdef CONFIG_OF
+   bridge->of_node = dev->of_node;
+#endif
+   bridge->timings = timings;
+   bridge->funcs = funcs;
+}
+EXPORT_SYMBOL(drm_bridge_init);
+
 /**
  * drm_bridge_attach - attach the bridge to an encoder's chain
  *
diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h
index ee175a2f95e6..955d9bd13805 100644
--- a/include/drm/drm_bridge.h
+++ b/include/drm/drm_bridge.h
@@ -378,6 +378,15 @@ struct drm_bridge_timings {
 
 /**
  * struct drm_bridge - central DRM bridge control structure
+ *
+ * Bridge drivers shall call drm_bridge_init() to initialize a drm_bridge
+ * structure, and then register it with drm_bridge_add().
+ *
+ * Users of bridges link a bridge driver into their overall display output
+ * pipeline by calling drm_bridge_attach().
+ *
+ * Modular drivers in OF systems can query the list of registered bridges
+ * with of_drm_find_bridge().
  */
 struct drm_bridge {
/** @encoder: encoder to which this bridge is connected */
@@ -402,6 +411,9 @@ struct drm_bridge {
 
 void drm_bridge_add(struct drm_bridge *bridge);
 void drm_bridge_remove(struct drm_bridge *bridge);
+void drm_bridge_init(struct drm_bridge *bridge, struct device *dev,
+const struct drm_bridge_funcs *funcs,
+const struct drm_bridge_timings *timings);
 struct drm_bridge *of_drm_find_bridge(struct device_node *np);
 int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
  struct drm_bridge *previous);
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 22/35] drm/bridge: dw-hdmi: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change.

v3:
 - drop driver_private argument (Laurent)

Reviewed-by: Laurent Pinchart 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 5 +
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c 
b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index 946aa1af8841..55a2a2f58783 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -2900,10 +2900,7 @@ __dw_hdmi_probe(struct platform_device *pdev,
hdmi->ddc = NULL;
}
 
-   hdmi->bridge.funcs = _hdmi_bridge_funcs;
-#ifdef CONFIG_OF
-   hdmi->bridge.of_node = pdev->dev.of_node;
-#endif
+   drm_bridge_init(>bridge, >dev, _hdmi_bridge_funcs, NULL);
 
memset(, 0, sizeof(pdevinfo));
pdevinfo.parent = dev;
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 06/35] drm: rcar-du: lvds: Don't set drm_bridge->driver_private

2019-12-25 Thread Mihail Atanassov
It's unused.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/rcar-du/rcar_lvds.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/gpu/drm/rcar-du/rcar_lvds.c 
b/drivers/gpu/drm/rcar-du/rcar_lvds.c
index 83538125a722..1d6dfae8a200 100644
--- a/drivers/gpu/drm/rcar-du/rcar_lvds.c
+++ b/drivers/gpu/drm/rcar-du/rcar_lvds.c
@@ -882,7 +882,6 @@ static int rcar_lvds_probe(struct platform_device *pdev)
if (ret < 0)
return ret;
 
-   lvds->bridge.driver_private = lvds;
lvds->bridge.funcs = _lvds_bridge_ops;
lvds->bridge.of_node = pdev->dev.of_node;
 
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 23/35] drm/bridge/synopsys: dsi: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change.

v3:
 - drop driver_private argument (Laurent)

Reviewed-by: Laurent Pinchart 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c | 6 ++
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c 
b/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
index 3aa4f9289416..40530d0a037b 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
@@ -1064,10 +1064,8 @@ __dw_mipi_dsi_probe(struct platform_device *pdev,
return ERR_PTR(ret);
}
 
-   dsi->bridge.funcs = _mipi_dsi_bridge_funcs;
-#ifdef CONFIG_OF
-   dsi->bridge.of_node = pdev->dev.of_node;
-#endif
+   drm_bridge_init(>bridge, >dev, _mipi_dsi_bridge_funcs,
+   NULL);
 
return dsi;
 }
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 05/35] drm/exynos: mic: Stop using drm_bridge->driver_private

2019-12-25 Thread Mihail Atanassov
Use a container_of wrapper instead. Note that no logic depends on
driver_private being NULL or not, so the cleanup in exynos_mic_bind is
safe to apply.

Cc: Inki Dae 
Signed-off-by: Mihail Atanassov 
---

Reviewer note: the driver_private cleanup used to be part of the
relevant drm_bridge_init() patch.

 drivers/gpu/drm/exynos/exynos_drm_mic.c | 12 +---
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_mic.c 
b/drivers/gpu/drm/exynos/exynos_drm_mic.c
index f41d75923557..2b5f10c3a285 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_mic.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_mic.c
@@ -106,6 +106,8 @@ struct exynos_mic {
bool enabled;
 };
 
+#define bridge_to_exynos_mic(b) container_of((b), struct exynos_mic, bridge)
+
 static void mic_set_path(struct exynos_mic *mic, bool enable)
 {
int ret;
@@ -232,7 +234,7 @@ static void mic_disable(struct drm_bridge *bridge) { }
 
 static void mic_post_disable(struct drm_bridge *bridge)
 {
-   struct exynos_mic *mic = bridge->driver_private;
+   struct exynos_mic *mic = bridge_to_exynos_mic(bridge);
 
mutex_lock(_mutex);
if (!mic->enabled)
@@ -251,7 +253,7 @@ static void mic_mode_set(struct drm_bridge *bridge,
 const struct drm_display_mode *mode,
 const struct drm_display_mode *adjusted_mode)
 {
-   struct exynos_mic *mic = bridge->driver_private;
+   struct exynos_mic *mic = bridge_to_exynos_mic(bridge);
 
mutex_lock(_mutex);
drm_display_mode_to_videomode(mode, >vm);
@@ -261,7 +263,7 @@ static void mic_mode_set(struct drm_bridge *bridge,
 
 static void mic_pre_enable(struct drm_bridge *bridge)
 {
-   struct exynos_mic *mic = bridge->driver_private;
+   struct exynos_mic *mic = bridge_to_exynos_mic(bridge);
int ret;
 
mutex_lock(_mutex);
@@ -309,10 +311,6 @@ static const struct drm_bridge_funcs mic_bridge_funcs = {
 static int exynos_mic_bind(struct device *dev, struct device *master,
   void *data)
 {
-   struct exynos_mic *mic = dev_get_drvdata(dev);
-
-   mic->bridge.driver_private = mic;
-
return 0;
 }
 
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 11/35] drm/bridge/analogix: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change.

The setting of bridge->of_node by drm_bridge_init() in
analogix_dp_core.c is safe, since ->of_node isn't used directly and the
bridge isn't published with drm_bridge_add().

v3:
 - drop driver_private argument (Laurent)
 - pass correct struct device pointer to drm_bridge_init (Laurent)

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/analogix/analogix-anx6345.c | 5 ++---
 drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c | 8 ++--
 drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 8 
 3 files changed, 8 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c 
b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
index 5b806d23fcb3..62404b0f2fc1 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
@@ -696,8 +696,6 @@ static int anx6345_i2c_probe(struct i2c_client *client,
 
mutex_init(>lock);
 
-   anx6345->bridge.of_node = client->dev.of_node;
-
anx6345->client = client;
i2c_set_clientdata(client, anx6345);
 
@@ -760,7 +758,8 @@ static int anx6345_i2c_probe(struct i2c_client *client,
/* Look for supported chip ID */
anx6345_poweron(anx6345);
if (anx6345_get_chip_id(anx6345)) {
-   anx6345->bridge.funcs = _bridge_funcs;
+   drm_bridge_init(>bridge, >dev,
+   _bridge_funcs, NULL);
drm_bridge_add(>bridge);
 
return 0;
diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c 
b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
index 7463537950cb..e30df40ec512 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
@@ -1214,10 +1214,6 @@ static int anx78xx_i2c_probe(struct i2c_client *client,
 
mutex_init(>lock);
 
-#if IS_ENABLED(CONFIG_OF)
-   anx78xx->bridge.of_node = client->dev.of_node;
-#endif
-
anx78xx->client = client;
i2c_set_clientdata(client, anx78xx);
 
@@ -1321,8 +1317,8 @@ static int anx78xx_i2c_probe(struct i2c_client *client,
goto err_poweroff;
}
 
-   anx78xx->bridge.funcs = _bridge_funcs;
-
+   drm_bridge_init(>bridge, >dev, _bridge_funcs,
+   NULL);
drm_bridge_add(>bridge);
 
/* If cable is pulled out, just poweroff and wait for HPD event */
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c 
b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index 56ea3be27f2b..29693d48682e 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -1571,13 +1571,13 @@ static const struct drm_bridge_funcs 
analogix_dp_bridge_funcs = {
.attach = analogix_dp_bridge_attach,
 };
 
-static int analogix_dp_attach_bridge(struct drm_device *drm_dev,
+static int analogix_dp_attach_bridge(struct device *dev,
+struct drm_device *drm_dev,
 struct analogix_dp_device *dp)
 {
int ret;
 
-   dp->bridge.funcs = _dp_bridge_funcs;
-
+   drm_bridge_init(>bridge, dev, _dp_bridge_funcs, NULL);
ret = drm_bridge_attach(dp->encoder, >bridge, NULL);
if (ret)
return -EINVAL;
@@ -1745,7 +1745,7 @@ analogix_dp_bind(struct device *dev, struct drm_device 
*drm_dev,
 
pm_runtime_enable(dev);
 
-   ret = analogix_dp_attach_bridge(drm_dev, dp);
+   ret = analogix_dp_attach_bridge(dev, drm_dev, dp);
if (ret) {
DRM_ERROR("failed to attach bridge (%d)\n", ret);
goto err_disable_pm_runtime;
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 02/35] drm/bridge: analogix_dp: Stop using drm_bridge->driver_private

2019-12-25 Thread Mihail Atanassov
Instead, embed the drm_bridge structure into analogix_dp_core and use
a container_of wrapper to access the latter.

Signed-off-by: Mihail Atanassov 
---
 .../drm/bridge/analogix/analogix_dp_core.c| 40 +++
 .../drm/bridge/analogix/analogix_dp_core.h|  8 +++-
 2 files changed, 21 insertions(+), 27 deletions(-)

diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c 
b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index 6effe532f820..56ea3be27f2b 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -1218,7 +1218,7 @@ static const struct drm_connector_funcs 
analogix_dp_connector_funcs = {
 
 static int analogix_dp_bridge_attach(struct drm_bridge *bridge)
 {
-   struct analogix_dp_device *dp = bridge->driver_private;
+   struct analogix_dp_device *dp = bridge_to_analogix_dp_device(bridge);
struct drm_encoder *encoder = dp->encoder;
struct drm_connector *connector = NULL;
int ret = 0;
@@ -1292,7 +1292,7 @@ struct drm_crtc *analogix_dp_get_new_crtc(struct 
analogix_dp_device *dp,
 static void analogix_dp_bridge_atomic_pre_enable(struct drm_bridge *bridge,
 struct drm_atomic_state *state)
 {
-   struct analogix_dp_device *dp = bridge->driver_private;
+   struct analogix_dp_device *dp = bridge_to_analogix_dp_device(bridge);
struct drm_crtc *crtc;
struct drm_crtc_state *old_crtc_state;
int ret;
@@ -1369,7 +1369,7 @@ static int analogix_dp_set_bridge(struct 
analogix_dp_device *dp)
 static void analogix_dp_bridge_atomic_enable(struct drm_bridge *bridge,
 struct drm_atomic_state *state)
 {
-   struct analogix_dp_device *dp = bridge->driver_private;
+   struct analogix_dp_device *dp = bridge_to_analogix_dp_device(bridge);
struct drm_crtc *crtc;
struct drm_crtc_state *old_crtc_state;
int timeout_loop = 0;
@@ -1406,7 +1406,7 @@ static void analogix_dp_bridge_atomic_enable(struct 
drm_bridge *bridge,
 
 static void analogix_dp_bridge_disable(struct drm_bridge *bridge)
 {
-   struct analogix_dp_device *dp = bridge->driver_private;
+   struct analogix_dp_device *dp = bridge_to_analogix_dp_device(bridge);
int ret;
 
if (dp->dpms_mode != DRM_MODE_DPMS_ON)
@@ -1443,7 +1443,7 @@ static void analogix_dp_bridge_disable(struct drm_bridge 
*bridge)
 static void analogix_dp_bridge_atomic_disable(struct drm_bridge *bridge,
  struct drm_atomic_state *state)
 {
-   struct analogix_dp_device *dp = bridge->driver_private;
+   struct analogix_dp_device *dp = bridge_to_analogix_dp_device(bridge);
struct drm_crtc *crtc;
struct drm_crtc_state *new_crtc_state = NULL;
 
@@ -1467,7 +1467,7 @@ static
 void analogix_dp_bridge_atomic_post_disable(struct drm_bridge *bridge,
struct drm_atomic_state *state)
 {
-   struct analogix_dp_device *dp = bridge->driver_private;
+   struct analogix_dp_device *dp = bridge_to_analogix_dp_device(bridge);
struct drm_crtc *crtc;
struct drm_crtc_state *new_crtc_state;
int ret;
@@ -1489,7 +1489,7 @@ static void analogix_dp_bridge_mode_set(struct drm_bridge 
*bridge,
const struct drm_display_mode *orig_mode,
const struct drm_display_mode *mode)
 {
-   struct analogix_dp_device *dp = bridge->driver_private;
+   struct analogix_dp_device *dp = bridge_to_analogix_dp_device(bridge);
struct drm_display_info *display_info = >connector.display_info;
struct video_info *video = >video_info;
struct device_node *dp_node = dp->dev->of_node;
@@ -1571,28 +1571,16 @@ static const struct drm_bridge_funcs 
analogix_dp_bridge_funcs = {
.attach = analogix_dp_bridge_attach,
 };
 
-static int analogix_dp_create_bridge(struct drm_device *drm_dev,
+static int analogix_dp_attach_bridge(struct drm_device *drm_dev,
 struct analogix_dp_device *dp)
 {
-   struct drm_bridge *bridge;
int ret;
 
-   bridge = devm_kzalloc(drm_dev->dev, sizeof(*bridge), GFP_KERNEL);
-   if (!bridge) {
-   DRM_ERROR("failed to allocate for drm bridge\n");
-   return -ENOMEM;
-   }
-
-   dp->bridge = bridge;
-
-   bridge->driver_private = dp;
-   bridge->funcs = _dp_bridge_funcs;
+   dp->bridge.funcs = _dp_bridge_funcs;
 
-   ret = drm_bridge_attach(dp->encoder, bridge, NULL);
-   if (ret) {
-   DRM_ERROR("failed to attach drm bridge\n");
+   ret = drm_bridge_attach(dp->encoder, >bridge, NULL);
+   if (ret)
return -EINVAL;
-   }
 
return 0;
 }
@@ 

[PATCH v3 13/35] drm/bridge: dumb-vga-dac: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change.

v3:
 - drop driver_private argument (Laurent)

Reviewed-by: Laurent Pinchart 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/dumb-vga-dac.c | 6 ++
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/bridge/dumb-vga-dac.c 
b/drivers/gpu/drm/bridge/dumb-vga-dac.c
index 67ad6cecf68d..a737042a350b 100644
--- a/drivers/gpu/drm/bridge/dumb-vga-dac.c
+++ b/drivers/gpu/drm/bridge/dumb-vga-dac.c
@@ -205,10 +205,8 @@ static int dumb_vga_probe(struct platform_device *pdev)
}
}
 
-   vga->bridge.funcs = _vga_bridge_funcs;
-   vga->bridge.of_node = pdev->dev.of_node;
-   vga->bridge.timings = of_device_get_match_data(>dev);
-
+   drm_bridge_init(>bridge, >dev, _vga_bridge_funcs,
+   of_device_get_match_data(>dev));
drm_bridge_add(>bridge);
 
return 0;
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 00/35] drm/bridge: Consolidate initialization

2019-12-25 Thread Mihail Atanassov
Hi all,

Version 3 of my drm_bridge_init() series here. The biggest change from
the previous version is the removal of drm_bridge->dev (1/35) and the
removal of ->driver_private (2-7/35). The rest of the patches are mostly
the same, save for dropping the driver_private argument from
drm_bridge_init().

v3:
 - remove drm_bridge->dev (Thomas)
 - convert ->driver_private users to container_of() (Laurent)
 - remove drm_bridge->driver_private (Laurent)
 - remove driver_private argument from drm_bridge_init() (Laurent)
 - clean up the wording on some comments (Laurent)
 - pass the correct struct device to drm_bridge_init in analogix
   (Laurent)
 - I've kept the rcar-du patches separate but changed their order; this
   should make it easier to take only one part of the series if needed

v2:
 - expanded commit messages and added some extra bridge-related
   documentation (Daniel)
 - dropped v1 patches 29 and 30: 29 needs more work, and 30 depends on
   it
 - added all remaining drm_bridge implementers, found by searching for
   drm_bridge_funcs which is mandatory for any bridge; new uses in
   patches 3, 27, and 28 (Sam)
 - due to the above, I've decided to squash all analogix changes into
   one patch

Mihail Atanassov (35):
  drm: Remove drm_bridge->dev
  drm/bridge: analogix_dp: Stop using drm_bridge->driver_private
  drm/bridge/synopsys: Stop using drm_bridge->driver_private
  drm/bridge: thc63lvd1024: Don't set drm_bridge->driver_private
  drm/exynos: mic: Stop using drm_bridge->driver_private
  drm: rcar-du: lvds: Don't set drm_bridge->driver_private
  drm/sti: Stop using drm_bridge->driver_private
  drm: Remove drm_bridge->driver_private
  drm: Introduce drm_bridge_init()
  drm/bridge: adv7511: Use drm_bridge_init()
  drm/bridge/analogix: Use drm_bridge_init()
  drm/bridge: cdns: Use drm_bridge_init()
  drm/bridge: dumb-vga-dac: Use drm_bridge_init()
  drm/bridge: lvds-codec: Use drm_bridge_init()
  drm/bridge: megachips-stdp-ge-b850v3-fw: Use drm_bridge_init()
  drm/bridge: nxp-ptn3460: Use drm_bridge_init()
  drm/bridge: panel: Use drm_bridge_init()
  drm/bridge: ps8622: Use drm_bridge_init()
  drm/bridge: sii902x: Use drm_bridge_init()
  drm/bridge: sii9234: Use drm_bridge_init()
  drm/bridge: sil_sii8620: Use drm_bridge_init()
  drm/bridge: dw-hdmi: Use drm_bridge_init()
  drm/bridge/synopsys: dsi: Use drm_bridge_init()
  drm/bridge: tc358764: Use drm_bridge_init()
  drm/bridge: tc358767: Use drm_bridge_init()
  drm/bridge: thc63: Use drm_bridge_init()
  drm/bridge: ti-sn65dsi86: Use drm_bridge_init()
  drm/bridge: ti-tfp410: Use drm_bridge_init()
  drm/exynos: mic: Use drm_bridge_init()
  drm/i2c: tda998x: Use drm_bridge_init()
  drm/mcde: dsi: Use drm_bridge_init()
  drm/mediatek: hdmi: Use drm_bridge_init()
  drm: rcar-du: lvds: Use drm_bridge_init()
  drm/sti: Use drm_bridge_init()
  drm/msm: Use drm_bridge_init()

 drivers/gpu/drm/bridge/adv7511/adv7511_drv.c  |  6 +--
 .../drm/bridge/analogix/analogix-anx6345.c|  7 ++--
 .../drm/bridge/analogix/analogix-anx78xx.c| 10 ++---
 .../drm/bridge/analogix/analogix_dp_core.c| 42 +++
 .../drm/bridge/analogix/analogix_dp_core.h|  8 +++-
 drivers/gpu/drm/bridge/cdns-dsi.c |  6 +--
 drivers/gpu/drm/bridge/dumb-vga-dac.c |  8 ++--
 drivers/gpu/drm/bridge/lvds-codec.c   |  8 ++--
 .../bridge/megachips-stdp-ge-b850v3-fw.c  |  6 +--
 drivers/gpu/drm/bridge/nxp-ptn3460.c  |  5 +--
 drivers/gpu/drm/bridge/panel.c|  9 ++--
 drivers/gpu/drm/bridge/parade-ps8622.c|  5 +--
 drivers/gpu/drm/bridge/sii902x.c  | 11 +++--
 drivers/gpu/drm/bridge/sii9234.c  |  3 +-
 drivers/gpu/drm/bridge/sil-sii8620.c  |  3 +-
 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 26 ++--
 drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c |  7 +---
 drivers/gpu/drm/bridge/tc358764.c |  8 ++--
 drivers/gpu/drm/bridge/tc358767.c |  9 ++--
 drivers/gpu/drm/bridge/thc63lvd1024.c |  7 +---
 drivers/gpu/drm/bridge/ti-sn65dsi86.c |  7 ++--
 drivers/gpu/drm/bridge/ti-tfp410.c| 10 ++---
 drivers/gpu/drm/drm_bridge.c  | 40 +++---
 drivers/gpu/drm/exynos/exynos_drm_mic.c   | 16 +++
 drivers/gpu/drm/i2c/tda998x_drv.c |  8 +---
 drivers/gpu/drm/mcde/mcde_dsi.c   |  5 +--
 drivers/gpu/drm/mediatek/mtk_hdmi.c   |  4 +-
 drivers/gpu/drm/msm/dsi/dsi_manager.c |  3 +-
 drivers/gpu/drm/msm/edp/edp_bridge.c  |  5 +--
 drivers/gpu/drm/msm/hdmi/hdmi_bridge.c|  7 ++--
 drivers/gpu/drm/rcar-du/rcar_lvds.c   |  7 ++--
 drivers/gpu/drm/sti/sti_dvo.c | 23 --
 drivers/gpu/drm/sti/sti_hda.c | 19 -
 drivers/gpu/drm/sti/sti_hdmi.c| 15 +++
 drivers/gpu/drm/sti/sti_hdmi.h|  5 +++
 include/drm/drm_bridge.h  

[PATCH v3 10/35] drm/bridge: adv7511: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change.

v3:
 - drop driver_private argument (Laurent)

Reviewed-by: Laurent Pinchart 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c 
b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
index 009cf1fef8d4..14a393f1c957 100644
--- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
+++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
@@ -1216,9 +1216,7 @@ static int adv7511_probe(struct i2c_client *i2c, const 
struct i2c_device_id *id)
if (ret)
goto err_unregister_cec;
 
-   adv7511->bridge.funcs = _bridge_funcs;
-   adv7511->bridge.of_node = dev->of_node;
-
+   drm_bridge_init(>bridge, dev, _bridge_funcs, NULL);
drm_bridge_add(>bridge);
 
adv7511_audio_init(dev, adv7511);
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 27/35] drm/bridge: ti-sn65dsi86: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change.

v3:
 - drop driver_private argument (Laurent)

Reviewed-by: Laurent Pinchart 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/ti-sn65dsi86.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/bridge/ti-sn65dsi86.c 
b/drivers/gpu/drm/bridge/ti-sn65dsi86.c
index 8a4e64cfca1e..b1d2690fc218 100644
--- a/drivers/gpu/drm/bridge/ti-sn65dsi86.c
+++ b/drivers/gpu/drm/bridge/ti-sn65dsi86.c
@@ -765,9 +765,8 @@ static int ti_sn_bridge_probe(struct i2c_client *client,
pdata->aux.transfer = ti_sn_aux_transfer;
drm_dp_aux_register(>aux);
 
-   pdata->bridge.funcs = _sn_bridge_funcs;
-   pdata->bridge.of_node = client->dev.of_node;
-
+   drm_bridge_init(>bridge, >dev, _sn_bridge_funcs,
+   NULL);
drm_bridge_add(>bridge);
 
ti_sn_debugfs_init(pdata);
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 31/35] drm/mcde: dsi: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change.

v3:
 - drop driver_private argument (Laurent)

Acked-by: Linus Walleij 
Reviewed-by: Laurent Pinchart 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/mcde/mcde_dsi.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/mcde/mcde_dsi.c b/drivers/gpu/drm/mcde/mcde_dsi.c
index 276a77c020c7..cf7ec4aaebd2 100644
--- a/drivers/gpu/drm/mcde/mcde_dsi.c
+++ b/drivers/gpu/drm/mcde/mcde_dsi.c
@@ -1098,8 +1098,7 @@ static int mcde_dsi_bind(struct device *dev, struct 
device *master,
d->bridge_out = bridge;
 
/* Create a bridge for this DSI channel */
-   d->bridge.funcs = _dsi_bridge_funcs;
-   d->bridge.of_node = dev->of_node;
+   drm_bridge_init(>bridge, dev, _dsi_bridge_funcs, NULL);
drm_bridge_add(>bridge);
 
/* TODO: first come first serve, use a list */
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 RESEND 01/35] drm: Remove drm_bridge->dev

2019-12-25 Thread Mihail Atanassov
As suggested in [1], the 'dev' field is a bit repetitive, since it 1:1
follows the setting and NULLing of the 'encoder' field. Therefore, use
drm_bridge->encoder->dev in place of drm_bridge->dev.

[1] https://patchwork.freedesktop.org/patch/343824/

v3:
 - resend as part of drm_bridge_init() series
v2:
 - fix checkpatch complaint about unnecessary parentheses in
 drm_bridge.c

Cc: Daniel Vetter 
Suggested-by: Thomas Zimmermann 
Acked-by: Thomas Zimmermann 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/adv7511/adv7511_drv.c   |  2 +-
 drivers/gpu/drm/bridge/analogix/analogix-anx6345.c |  2 +-
 drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c |  2 +-
 drivers/gpu/drm/bridge/cdns-dsi.c  |  2 +-
 drivers/gpu/drm/bridge/dumb-vga-dac.c  |  2 +-
 .../gpu/drm/bridge/megachips-stdp-ge-b850v3-fw.c   |  2 +-
 drivers/gpu/drm/bridge/nxp-ptn3460.c   |  2 +-
 drivers/gpu/drm/bridge/panel.c |  2 +-
 drivers/gpu/drm/bridge/parade-ps8622.c |  2 +-
 drivers/gpu/drm/bridge/sii902x.c   |  6 +++---
 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c  |  6 +++---
 drivers/gpu/drm/bridge/tc358764.c  |  4 ++--
 drivers/gpu/drm/bridge/tc358767.c  |  6 +++---
 drivers/gpu/drm/bridge/ti-sn65dsi86.c  |  2 +-
 drivers/gpu/drm/bridge/ti-tfp410.c |  6 +++---
 drivers/gpu/drm/drm_bridge.c   | 10 --
 drivers/gpu/drm/i2c/tda998x_drv.c  |  2 +-
 drivers/gpu/drm/mcde/mcde_dsi.c|  2 +-
 drivers/gpu/drm/msm/edp/edp_bridge.c   |  2 +-
 drivers/gpu/drm/msm/hdmi/hdmi_bridge.c |  4 ++--
 drivers/gpu/drm/rcar-du/rcar_lvds.c|  3 ++-
 include/drm/drm_bridge.h   |  2 --
 22 files changed, 35 insertions(+), 38 deletions(-)

diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c 
b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
index 9e13e466e72c..009cf1fef8d4 100644
--- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
+++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
@@ -863,7 +863,7 @@ static int adv7511_bridge_attach(struct drm_bridge *bridge)
adv->connector.polled = DRM_CONNECTOR_POLL_CONNECT |
DRM_CONNECTOR_POLL_DISCONNECT;
 
-   ret = drm_connector_init(bridge->dev, >connector,
+   ret = drm_connector_init(bridge->encoder->dev, >connector,
 _connector_funcs,
 DRM_MODE_CONNECTOR_HDMIA);
if (ret) {
diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c 
b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
index 9917ce0d86a0..5b806d23fcb3 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
@@ -541,7 +541,7 @@ static int anx6345_bridge_attach(struct drm_bridge *bridge)
return err;
}
 
-   err = drm_connector_init(bridge->dev, >connector,
+   err = drm_connector_init(bridge->encoder->dev, >connector,
 _connector_funcs,
 DRM_MODE_CONNECTOR_eDP);
if (err) {
diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c 
b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
index 41867be03751..7463537950cb 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
@@ -908,7 +908,7 @@ static int anx78xx_bridge_attach(struct drm_bridge *bridge)
return err;
}
 
-   err = drm_connector_init(bridge->dev, >connector,
+   err = drm_connector_init(bridge->encoder->dev, >connector,
 _connector_funcs,
 DRM_MODE_CONNECTOR_DisplayPort);
if (err) {
diff --git a/drivers/gpu/drm/bridge/cdns-dsi.c 
b/drivers/gpu/drm/bridge/cdns-dsi.c
index 3a5bd4e7fd1e..32863e3ad537 100644
--- a/drivers/gpu/drm/bridge/cdns-dsi.c
+++ b/drivers/gpu/drm/bridge/cdns-dsi.c
@@ -651,7 +651,7 @@ static int cdns_dsi_bridge_attach(struct drm_bridge *bridge)
struct cdns_dsi *dsi = input_to_dsi(input);
struct cdns_dsi_output *output = >output;
 
-   if (!drm_core_check_feature(bridge->dev, DRIVER_ATOMIC)) {
+   if (!drm_core_check_feature(bridge->encoder->dev, DRIVER_ATOMIC)) {
dev_err(dsi->base.dev,
"cdns-dsi driver is only compatible with DRM devices 
supporting atomic updates");
return -ENOTSUPP;
diff --git a/drivers/gpu/drm/bridge/dumb-vga-dac.c 
b/drivers/gpu/drm/bridge/dumb-vga-dac.c
index cc33dc411b9e..67ad6cecf68d 100644
--- a/drivers/gpu/drm/bridge/dumb-vga-dac.c
+++ b/drivers/g

[PATCH v3 19/35] drm/bridge: sii902x: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change.

v3:
 - drop driver_private argument (Laurent)

Reviewed-by: Laurent Pinchart 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/sii902x.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/bridge/sii902x.c b/drivers/gpu/drm/bridge/sii902x.c
index 6ca297d78a26..6f454e5ce258 100644
--- a/drivers/gpu/drm/bridge/sii902x.c
+++ b/drivers/gpu/drm/bridge/sii902x.c
@@ -1017,9 +1017,8 @@ static int sii902x_probe(struct i2c_client *client,
return ret;
}
 
-   sii902x->bridge.funcs = _bridge_funcs;
-   sii902x->bridge.of_node = dev->of_node;
-   sii902x->bridge.timings = _sii902x_timings;
+   drm_bridge_init(>bridge, dev, _bridge_funcs,
+   _sii902x_timings);
drm_bridge_add(>bridge);
 
sii902x_audio_codec_init(sii902x, dev);
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 24/35] drm/bridge: tc358764: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change.

v3:
 - drop driver_private argument (Laurent)

Reviewed-by: Laurent Pinchart 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/tc358764.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358764.c 
b/drivers/gpu/drm/bridge/tc358764.c
index e35e17b1f396..5525f530f2a3 100644
--- a/drivers/gpu/drm/bridge/tc358764.c
+++ b/drivers/gpu/drm/bridge/tc358764.c
@@ -457,9 +457,7 @@ static int tc358764_probe(struct mipi_dsi_device *dsi)
if (ret < 0)
return ret;
 
-   ctx->bridge.funcs = _bridge_funcs;
-   ctx->bridge.of_node = dev->of_node;
-
+   drm_bridge_init(>bridge, dev, _bridge_funcs, NULL);
drm_bridge_add(>bridge);
 
ret = mipi_dsi_attach(dsi);
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 14/35] drm/bridge: lvds-codec: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change.

v3:
 - drop driver_private argument (Laurent)

Reviewed-by: Laurent Pinchart 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/lvds-codec.c | 8 +++-
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/bridge/lvds-codec.c 
b/drivers/gpu/drm/bridge/lvds-codec.c
index 5f04cc11227e..3bdfa7cce6d9 100644
--- a/drivers/gpu/drm/bridge/lvds-codec.c
+++ b/drivers/gpu/drm/bridge/lvds-codec.c
@@ -98,12 +98,10 @@ static int lvds_codec_probe(struct platform_device *pdev)
 
/*
 * The panel_bridge bridge is attached to the panel's of_node,
-* but we need a bridge attached to our of_node for our user
-* to look up.
+* but we need a bridge attached to our of_node (in dev->of_node) for
+* our user to look up.
 */
-   lvds_codec->bridge.of_node = dev->of_node;
-   lvds_codec->bridge.funcs = 
-   drm_bridge_add(_codec->bridge);
+   drm_bridge_init(_codec->bridge, dev, , NULL);
 
platform_set_drvdata(pdev, lvds_codec);
 
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 07/35] drm/sti: Stop using drm_bridge->driver_private

2019-12-25 Thread Mihail Atanassov
Instead, embed the drm_bridge structure in the originally-pointed-to
struct and use a container_of wrapper to access it.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/sti/sti_dvo.c  | 20 
 drivers/gpu/drm/sti/sti_hda.c  | 17 -
 drivers/gpu/drm/sti/sti_hdmi.c | 13 -
 drivers/gpu/drm/sti/sti_hdmi.h |  5 +
 4 files changed, 25 insertions(+), 30 deletions(-)

diff --git a/drivers/gpu/drm/sti/sti_dvo.c b/drivers/gpu/drm/sti/sti_dvo.c
index df2ee86cd4c1..194491231de2 100644
--- a/drivers/gpu/drm/sti/sti_dvo.c
+++ b/drivers/gpu/drm/sti/sti_dvo.c
@@ -96,9 +96,11 @@ struct sti_dvo {
struct dvo_config *config;
bool enabled;
struct drm_encoder *encoder;
-   struct drm_bridge *bridge;
+   struct drm_bridge bridge;
 };
 
+#define bridge_to_sti_dvo(b) container_of((b), struct sti_dvo, bridge)
+
 struct sti_dvo_connector {
struct drm_connector drm_connector;
struct drm_encoder *encoder;
@@ -210,7 +212,7 @@ static int dvo_debugfs_init(struct sti_dvo *dvo, struct 
drm_minor *minor)
 
 static void sti_dvo_disable(struct drm_bridge *bridge)
 {
-   struct sti_dvo *dvo = bridge->driver_private;
+   struct sti_dvo *dvo = bridge_to_sti_dvo(bridge);
 
if (!dvo->enabled)
return;
@@ -233,7 +235,7 @@ static void sti_dvo_disable(struct drm_bridge *bridge)
 
 static void sti_dvo_pre_enable(struct drm_bridge *bridge)
 {
-   struct sti_dvo *dvo = bridge->driver_private;
+   struct sti_dvo *dvo = bridge_to_sti_dvo(bridge);
struct dvo_config *config = dvo->config;
u32 val;
 
@@ -280,7 +282,7 @@ static void sti_dvo_set_mode(struct drm_bridge *bridge,
 const struct drm_display_mode *mode,
 const struct drm_display_mode *adjusted_mode)
 {
-   struct sti_dvo *dvo = bridge->driver_private;
+   struct sti_dvo *dvo = bridge_to_sti_dvo(bridge);
struct sti_mixer *mixer = to_sti_mixer(dvo->encoder->crtc);
int rate = mode->clock * 1000;
struct clk *clkp;
@@ -438,11 +440,11 @@ static struct drm_encoder *sti_dvo_find_encoder(struct 
drm_device *dev)
 static int sti_dvo_bind(struct device *dev, struct device *master, void *data)
 {
struct sti_dvo *dvo = dev_get_drvdata(dev);
+   struct drm_bridge *bridge = >bridge;
struct drm_device *drm_dev = data;
struct drm_encoder *encoder;
struct sti_dvo_connector *connector;
struct drm_connector *drm_connector;
-   struct drm_bridge *bridge;
int err;
 
/* Set the drm device handle */
@@ -458,11 +460,6 @@ static int sti_dvo_bind(struct device *dev, struct device 
*master, void *data)
 
connector->dvo = dvo;
 
-   bridge = devm_kzalloc(dev, sizeof(*bridge), GFP_KERNEL);
-   if (!bridge)
-   return -ENOMEM;
-
-   bridge->driver_private = dvo;
bridge->funcs = _dvo_bridge_funcs;
bridge->of_node = dvo->dev.of_node;
drm_bridge_add(bridge);
@@ -473,7 +470,6 @@ static int sti_dvo_bind(struct device *dev, struct device 
*master, void *data)
return err;
}
 
-   dvo->bridge = bridge;
connector->encoder = encoder;
dvo->encoder = encoder;
 
@@ -504,7 +500,7 @@ static void sti_dvo_unbind(struct device *dev,
 {
struct sti_dvo *dvo = dev_get_drvdata(dev);
 
-   drm_bridge_remove(dvo->bridge);
+   drm_bridge_remove(>bridge);
 }
 
 static const struct component_ops sti_dvo_ops = {
diff --git a/drivers/gpu/drm/sti/sti_hda.c b/drivers/gpu/drm/sti/sti_hda.c
index 8f7bf33815fd..d5b569ce93d0 100644
--- a/drivers/gpu/drm/sti/sti_hda.c
+++ b/drivers/gpu/drm/sti/sti_hda.c
@@ -236,6 +236,7 @@ static const struct sti_hda_video_config 
hda_supported_modes[] = {
  *
  * @dev: driver device
  * @drm_dev: pointer to drm device
+ * @bridge: drm bridge for encoder->connector link
  * @mode: current display mode selected
  * @regs: HD analog register
  * @video_dacs_ctrl: video DACS control register
@@ -244,6 +245,7 @@ static const struct sti_hda_video_config 
hda_supported_modes[] = {
 struct sti_hda {
struct device dev;
struct drm_device *drm_dev;
+   struct drm_bridge bridge;
struct drm_display_mode mode;
void __iomem *regs;
void __iomem *video_dacs_ctrl;
@@ -252,6 +254,8 @@ struct sti_hda {
bool enabled;
 };
 
+#define bridge_to_sti_hda(b) container_of((b), struct sti_hda, bridge)
+
 struct sti_hda_connector {
struct drm_connector drm_connector;
struct drm_encoder *encoder;
@@ -400,7 +404,7 @@ static void sti_hda_configure_awg(struct sti_hda *hda, u32 
*awg_instr, int nb)
 
 static void sti_hda_disable(struct drm_bridge *bridge)
 {
-   struct sti_hda *hda = bridge->driver_private;
+   struct sti_hda *hda = bridge_to_sti_hda(bridge);
u32 val;
 
if (!hda->enabled)

[PATCH v3 18/35] drm/bridge: ps8622: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change.

v3:
 - drop driver_private argument (Laurent)

Reviewed-by: Laurent Pinchart 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/parade-ps8622.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/bridge/parade-ps8622.c 
b/drivers/gpu/drm/bridge/parade-ps8622.c
index c32af9c2bbcc..ce870f26e93d 100644
--- a/drivers/gpu/drm/bridge/parade-ps8622.c
+++ b/drivers/gpu/drm/bridge/parade-ps8622.c
@@ -588,8 +588,7 @@ static int ps8622_probe(struct i2c_client *client,
ps8622->bl->props.brightness = PS8622_MAX_BRIGHTNESS;
}
 
-   ps8622->bridge.funcs = _bridge_funcs;
-   ps8622->bridge.of_node = dev->of_node;
+   drm_bridge_init(>bridge, dev, _bridge_funcs, NULL);
drm_bridge_add(>bridge);
 
i2c_set_clientdata(client, ps8622);
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 04/35] drm/bridge: thc63lvd1024: Don't set drm_bridge->driver_private

2019-12-25 Thread Mihail Atanassov
It's unused.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/thc63lvd1024.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/gpu/drm/bridge/thc63lvd1024.c 
b/drivers/gpu/drm/bridge/thc63lvd1024.c
index 3d74129b2995..784f4e4eea05 100644
--- a/drivers/gpu/drm/bridge/thc63lvd1024.c
+++ b/drivers/gpu/drm/bridge/thc63lvd1024.c
@@ -218,7 +218,6 @@ static int thc63_probe(struct platform_device *pdev)
if (ret)
return ret;
 
-   thc63->bridge.driver_private = thc63;
thc63->bridge.of_node = pdev->dev.of_node;
thc63->bridge.funcs = _bridge_func;
thc63->bridge.timings = >timings;
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 30/35] drm/i2c: tda998x: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change.

v3:
 - drop driver_private argument (Laurent)

Reviewed-by: Laurent Pinchart 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/i2c/tda998x_drv.c | 6 +-
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i2c/tda998x_drv.c 
b/drivers/gpu/drm/i2c/tda998x_drv.c
index 17a66ef3dfd4..90475d4eec58 100644
--- a/drivers/gpu/drm/i2c/tda998x_drv.c
+++ b/drivers/gpu/drm/i2c/tda998x_drv.c
@@ -1974,11 +1974,7 @@ static int tda998x_create(struct device *dev)
goto fail;
}
 
-   priv->bridge.funcs = _bridge_funcs;
-#ifdef CONFIG_OF
-   priv->bridge.of_node = dev->of_node;
-#endif
-
+   drm_bridge_init(>bridge, dev, _bridge_funcs, NULL);
drm_bridge_add(>bridge);
 
return 0;
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 03/35] drm/bridge/synopsys: Stop using drm_bridge->driver_private

2019-12-25 Thread Mihail Atanassov
dw_hdmi: The drm_bridge struct is already embedded, so use
a container_of wrapper to access it.

dw-mipi-dsi: The field is unused, remove it.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 15 ---
 drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c |  1 -
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c 
b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index 99274ca0fdf6..946aa1af8841 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -196,6 +196,8 @@ struct dw_hdmi {
struct cec_notifier *cec_notifier;
 };
 
+#define bridge_to_dw_hdmi(b) container_of((b), struct dw_hdmi, bridge)
+
 #define HDMI_IH_PHY_STAT0_RX_SENSE \
(HDMI_IH_PHY_STAT0_RX_SENSE0 | HDMI_IH_PHY_STAT0_RX_SENSE1 | \
 HDMI_IH_PHY_STAT0_RX_SENSE2 | HDMI_IH_PHY_STAT0_RX_SENSE3)
@@ -2335,7 +2337,7 @@ static const struct drm_connector_helper_funcs 
dw_hdmi_connector_helper_funcs =
 
 static int dw_hdmi_bridge_attach(struct drm_bridge *bridge)
 {
-   struct dw_hdmi *hdmi = bridge->driver_private;
+   struct dw_hdmi *hdmi = bridge_to_dw_hdmi(bridge);
struct drm_encoder *encoder = bridge->encoder;
struct drm_connector *connector = >connector;
struct cec_connector_info conn_info;
@@ -2372,7 +2374,7 @@ static int dw_hdmi_bridge_attach(struct drm_bridge 
*bridge)
 
 static void dw_hdmi_bridge_detach(struct drm_bridge *bridge)
 {
-   struct dw_hdmi *hdmi = bridge->driver_private;
+   struct dw_hdmi *hdmi = bridge_to_dw_hdmi(bridge);
 
mutex_lock(>cec_notifier_mutex);
cec_notifier_conn_unregister(hdmi->cec_notifier);
@@ -2384,7 +2386,7 @@ static enum drm_mode_status
 dw_hdmi_bridge_mode_valid(struct drm_bridge *bridge,
  const struct drm_display_mode *mode)
 {
-   struct dw_hdmi *hdmi = bridge->driver_private;
+   struct dw_hdmi *hdmi = bridge_to_dw_hdmi(bridge);
struct drm_connector *connector = >connector;
enum drm_mode_status mode_status = MODE_OK;
 
@@ -2402,7 +2404,7 @@ static void dw_hdmi_bridge_mode_set(struct drm_bridge 
*bridge,
const struct drm_display_mode *orig_mode,
const struct drm_display_mode *mode)
 {
-   struct dw_hdmi *hdmi = bridge->driver_private;
+   struct dw_hdmi *hdmi = bridge_to_dw_hdmi(bridge);
 
mutex_lock(>mutex);
 
@@ -2414,7 +2416,7 @@ static void dw_hdmi_bridge_mode_set(struct drm_bridge 
*bridge,
 
 static void dw_hdmi_bridge_disable(struct drm_bridge *bridge)
 {
-   struct dw_hdmi *hdmi = bridge->driver_private;
+   struct dw_hdmi *hdmi = bridge_to_dw_hdmi(bridge);
 
mutex_lock(>mutex);
hdmi->disabled = true;
@@ -2425,7 +2427,7 @@ static void dw_hdmi_bridge_disable(struct drm_bridge 
*bridge)
 
 static void dw_hdmi_bridge_enable(struct drm_bridge *bridge)
 {
-   struct dw_hdmi *hdmi = bridge->driver_private;
+   struct dw_hdmi *hdmi = bridge_to_dw_hdmi(bridge);
 
mutex_lock(>mutex);
hdmi->disabled = false;
@@ -2898,7 +2900,6 @@ __dw_hdmi_probe(struct platform_device *pdev,
hdmi->ddc = NULL;
}
 
-   hdmi->bridge.driver_private = hdmi;
hdmi->bridge.funcs = _hdmi_bridge_funcs;
 #ifdef CONFIG_OF
hdmi->bridge.of_node = pdev->dev.of_node;
diff --git a/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c 
b/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
index b18351b6760a..3aa4f9289416 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
@@ -1064,7 +1064,6 @@ __dw_mipi_dsi_probe(struct platform_device *pdev,
return ERR_PTR(ret);
}
 
-   dsi->bridge.driver_private = dsi;
dsi->bridge.funcs = _mipi_dsi_bridge_funcs;
 #ifdef CONFIG_OF
dsi->bridge.of_node = pdev->dev.of_node;
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 34/35] drm/sti: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change.

v3:
 - drop driver_private argument (Laurent)
v2:
 - Also apply drm_bridge_init() in sti_hdmi.c and sti_hda.c (Sam,
   Benjamin)

Reviewed-by: Benjamin Gaignard 
Reviewed-by: Laurent Pinchart 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/sti/sti_dvo.c  | 3 +--
 drivers/gpu/drm/sti/sti_hda.c  | 2 +-
 drivers/gpu/drm/sti/sti_hdmi.c | 2 +-
 3 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/sti/sti_dvo.c b/drivers/gpu/drm/sti/sti_dvo.c
index 194491231de2..a72f4e4e60cd 100644
--- a/drivers/gpu/drm/sti/sti_dvo.c
+++ b/drivers/gpu/drm/sti/sti_dvo.c
@@ -460,8 +460,7 @@ static int sti_dvo_bind(struct device *dev, struct device 
*master, void *data)
 
connector->dvo = dvo;
 
-   bridge->funcs = _dvo_bridge_funcs;
-   bridge->of_node = dvo->dev.of_node;
+   drm_bridge_init(bridge, >dev, _dvo_bridge_funcs, NULL);
drm_bridge_add(bridge);
 
err = drm_bridge_attach(encoder, bridge, NULL);
diff --git a/drivers/gpu/drm/sti/sti_hda.c b/drivers/gpu/drm/sti/sti_hda.c
index d5b569ce93d0..b94044eb4672 100644
--- a/drivers/gpu/drm/sti/sti_hda.c
+++ b/drivers/gpu/drm/sti/sti_hda.c
@@ -699,7 +699,7 @@ static int sti_hda_bind(struct device *dev, struct device 
*master, void *data)
 
connector->hda = hda;
 
-   bridge->funcs = _hda_bridge_funcs;
+   drm_bridge_init(bridge, dev, _hda_bridge_funcs, NULL);
drm_bridge_attach(encoder, bridge, NULL);
 
connector->encoder = encoder;
diff --git a/drivers/gpu/drm/sti/sti_hdmi.c b/drivers/gpu/drm/sti/sti_hdmi.c
index 7a7b0ce7bb14..e9e5c71b7eac 100644
--- a/drivers/gpu/drm/sti/sti_hdmi.c
+++ b/drivers/gpu/drm/sti/sti_hdmi.c
@@ -1275,7 +1275,7 @@ static int sti_hdmi_bind(struct device *dev, struct 
device *master, void *data)
 
connector->hdmi = hdmi;
 
-   bridge->funcs = _hdmi_bridge_funcs;
+   drm_bridge_init(bridge, dev, _hdmi_bridge_funcs, NULL);
drm_bridge_attach(encoder, bridge, NULL);
 
connector->encoder = encoder;
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 15/35] drm/bridge: megachips-stdpxxxx-ge-b850v3-fw: Use drm_bridge_init()

2019-12-25 Thread Mihail Atanassov
No functional change.

v3:
 - drop driver_private argument (Laurent)

Reviewed-by: Laurent Pinchart 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/megachips-stdp-ge-b850v3-fw.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/bridge/megachips-stdp-ge-b850v3-fw.c 
b/drivers/gpu/drm/bridge/megachips-stdp-ge-b850v3-fw.c
index c914f01e4707..a13ba625cca8 100644
--- a/drivers/gpu/drm/bridge/megachips-stdp-ge-b850v3-fw.c
+++ b/drivers/gpu/drm/bridge/megachips-stdp-ge-b850v3-fw.c
@@ -303,8 +303,8 @@ static int stdp4028_ge_b850v3_fw_probe(struct i2c_client 
*stdp4028_i2c,
i2c_set_clientdata(stdp4028_i2c, ge_b850v3_lvds_ptr);
 
/* drm bridge initialization */
-   ge_b850v3_lvds_ptr->bridge.funcs = _b850v3_lvds_funcs;
-   ge_b850v3_lvds_ptr->bridge.of_node = dev->of_node;
+   drm_bridge_init(_b850v3_lvds_ptr->bridge, dev, _b850v3_lvds_funcs,
+   NULL);
drm_bridge_add(_b850v3_lvds_ptr->bridge);
 
/* Clear pending interrupts since power up. */
-- 
2.24.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH] drm/komeda: Add event handling for EMPTY/FULL

2019-12-23 Thread Mihail Atanassov
Hi James,

On Thursday, 12 December 2019 07:27:55 GMT james qian wang (Arm Technology 
China) wrote:
> EMPTY/FULL are HW input/output FIFO condition identifer, which are
> useful information for addressing the problem, so expose them.
> 
> Signed-off-by: james qian wang (Arm Technology China) 
> 
> ---
>  drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c  | 13 -
>  drivers/gpu/drm/arm/display/komeda/d71/d71_regs.h |  3 +++
>  drivers/gpu/drm/arm/display/komeda/komeda_dev.h   |  5 -
>  drivers/gpu/drm/arm/display/komeda/komeda_event.c |  2 ++
>  4 files changed, 21 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c 
> b/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> index dd1ecf4276d3..00fa56c29b3e 100644
> --- a/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> +++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> @@ -20,8 +20,10 @@ static u64 get_lpu_event(struct d71_pipeline *d71_pipeline)
>   evts |= KOMEDA_EVENT_IBSY;
>   if (raw_status & LPU_IRQ_EOW)
>   evts |= KOMEDA_EVENT_EOW;
> + if (raw_status & LPU_IRQ_OVR)
> + evts |= KOMEDA_EVENT_OVR;
>  
> - if (raw_status & (LPU_IRQ_ERR | LPU_IRQ_IBSY)) {
> + if (raw_status & (LPU_IRQ_ERR | LPU_IRQ_IBSY | LPU_IRQ_OVR)) {
>   u32 restore = 0, tbu_status;
>   /* Check error of LPU status */
>   status = malidp_read32(reg, BLK_STATUS);
> @@ -45,6 +47,15 @@ static u64 get_lpu_event(struct d71_pipeline *d71_pipeline)
>   restore |= LPU_STATUS_ACE3;
>   evts |= KOMEDA_ERR_ACE3;
>   }
> + if (status & LPU_STATUS_FEMPTY) {
> + restore |= LPU_STATUS_FEMPTY;
> + evts |= KOMEDA_EVENT_EMPTY;
> + }
> + if (status & LPU_STATUS_FFULL) {
> + restore |= LPU_STATUS_FFULL;
> + evts |= KOMEDA_EVENT_FULL;
> + }
> +
>   if (restore != 0)
>   malidp_write32_mask(reg, BLK_STATUS, restore, 0);
>  
> diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_regs.h 
> b/drivers/gpu/drm/arm/display/komeda/d71/d71_regs.h
> index 81de6a23e7f3..e80172a0b320 100644
> --- a/drivers/gpu/drm/arm/display/komeda/d71/d71_regs.h
> +++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_regs.h
> @@ -175,6 +175,7 @@
>  #define TBU_DOUTSTDCAPB_MASK 0x3F
>  
>  /* LPU_IRQ_BITS */
> +#define LPU_IRQ_OVR  BIT(9)
>  #define LPU_IRQ_IBSY BIT(10)
>  #define LPU_IRQ_ERR  BIT(11)
>  #define LPU_IRQ_EOW  BIT(12)
> @@ -185,6 +186,8 @@
>  #define LPU_STATUS_AXIE  BIT(4)
>  #define LPU_STATUS_AXIRP BIT(5)
>  #define LPU_STATUS_AXIWP BIT(6)
> +#define LPU_STATUS_FEMPTYBIT(11)
> +#define LPU_STATUS_FFULL BIT(14)
>  #define LPU_STATUS_ACE0  BIT(16)
>  #define LPU_STATUS_ACE1  BIT(17)
>  #define LPU_STATUS_ACE2  BIT(18)
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_dev.h 
> b/drivers/gpu/drm/arm/display/komeda/komeda_dev.h
> index 4a67a80d5fcf..ce27f2f27c24 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_dev.h
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_dev.h
> @@ -20,6 +20,8 @@
>  #define KOMEDA_EVENT_OVR BIT_ULL(4)
>  #define KOMEDA_EVENT_EOW BIT_ULL(5)
>  #define KOMEDA_EVENT_MODEBIT_ULL(6)
> +#define KOMEDA_EVENT_FULLBIT_ULL(7)
> +#define KOMEDA_EVENT_EMPTY   BIT_ULL(8)
>  
>  #define KOMEDA_ERR_TETO  BIT_ULL(14)
>  #define KOMEDA_ERR_TEMR  BIT_ULL(15)
> @@ -49,7 +51,8 @@
>   KOMEDA_ERR_ZME  | KOMEDA_ERR_MERR   | KOMEDA_ERR_TCF |\
>   KOMEDA_ERR_TTNG | KOMEDA_ERR_TTF)
>  
> -#define KOMEDA_WARN_EVENTS   KOMEDA_ERR_CSCE
> +#define KOMEDA_WARN_EVENTS   \
> + (KOMEDA_ERR_CSCE | KOMEDA_EVENT_FULL | KOMEDA_EVENT_EMPTY)
>  
>  #define KOMEDA_INFO_EVENTS (0 \
>   | KOMEDA_EVENT_VSYNC \
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_event.c 
> b/drivers/gpu/drm/arm/display/komeda/komeda_event.c
> index 977c38d516da..53f944e66dfc 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_event.c
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_event.c
> @@ -78,6 +78,8 @@ static void evt_str(struct komeda_str *str, u64 events)
>  
>   /* LPU errors or events */
>   evt_sprintf(str, events & KOMEDA_EVENT_IBSY, "IBSY|");
> + evt_sprintf(str, events & KOMEDA_EVENT_EMPTY, "EMPTY|");
> + evt_sprintf(str, events & KOM

Re: [PATCH] drm/komeda: Add runtime_pm support

2019-12-23 Thread Mihail Atanassov
 if (mdev->funcs->connect_iommu(mdev))
> + DRM_ERROR("connect iommu failed.\n");
>  
> - return ret;
> + return 0;
>  }
>  
>  int komeda_dev_suspend(struct komeda_dev *mdev)
>  {
> - int ret = 0;
> -
> - clk_prepare_enable(mdev->aclk);
> -
> - if (mdev->iommu && mdev->funcs->disconnect_iommu) {
> - ret = mdev->funcs->disconnect_iommu(mdev);
> - if (ret < 0) {
> + if (mdev->iommu && mdev->funcs->disconnect_iommu)
> + if (mdev->funcs->disconnect_iommu(mdev))
>   DRM_ERROR("disconnect iommu failed.\n");
> - goto disable_clk;
> - }
> - }
>  
> - ret = mdev->funcs->disable_irq(mdev);
> + mdev->funcs->disable_irq(mdev);
>  
> -disable_clk:
>   clk_disable_unprepare(mdev->aclk);
>  
> - return ret;
> + return 0;
>  }
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c 
> b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
> index ad38bbc7431e..ea5cd1e17304 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
> @@ -33,6 +33,12 @@ static void komeda_unbind(struct device *dev)
>   return;
>  
>   komeda_kms_detach(mdrv->kms);
> +
> + if (pm_runtime_enabled(dev))
> + pm_runtime_disable(dev);
> + else
> + komeda_dev_suspend(mdrv->mdev);
> +
>   komeda_dev_destroy(mdrv->mdev);
>  
>   dev_set_drvdata(dev, NULL);
> @@ -54,6 +60,10 @@ static int komeda_bind(struct device *dev)
>   goto free_mdrv;
>   }
>  
> + pm_runtime_enable(dev);
> + if (!pm_runtime_enabled(dev))
> + komeda_dev_resume(mdrv->mdev);
> +
>   mdrv->kms = komeda_kms_attach(mdrv->mdev);
>   if (IS_ERR(mdrv->kms)) {
>   err = PTR_ERR(mdrv->kms);
> @@ -65,6 +75,11 @@ static int komeda_bind(struct device *dev)
>   return 0;
>  
>  destroy_mdev:
> + if (pm_runtime_enabled(dev))
> + pm_runtime_disable(dev);
> + else
> + komeda_dev_suspend(mdrv->mdev);
> +
>   komeda_dev_destroy(mdrv->mdev);
>  
>  free_mdrv:
> @@ -131,15 +146,29 @@ static const struct of_device_id komeda_of_match[] = {
>  
>  MODULE_DEVICE_TABLE(of, komeda_of_match);
>  
> +static int komeda_rt_pm_suspend(struct device *dev)
> +{
> + struct komeda_drv *mdrv = dev_get_drvdata(dev);
> +
> + return komeda_dev_suspend(mdrv->mdev);
> +}
> +
> +static int komeda_rt_pm_resume(struct device *dev)
> +{
> + struct komeda_drv *mdrv = dev_get_drvdata(dev);
> +
> + return komeda_dev_resume(mdrv->mdev);
> +}
> +
>  static int __maybe_unused komeda_pm_suspend(struct device *dev)
>  {
>   struct komeda_drv *mdrv = dev_get_drvdata(dev);
> - struct drm_device *drm = >kms->base;
>   int res;
>  
> - res = drm_mode_config_helper_suspend(drm);
> + res = drm_mode_config_helper_suspend(>kms->base);
>  
> - komeda_dev_suspend(mdrv->mdev);
> + if (!pm_runtime_status_suspended(dev))
> + komeda_dev_suspend(mdrv->mdev);
>  
>   return res;
>  }
> @@ -147,15 +176,16 @@ static int __maybe_unused komeda_pm_suspend(struct 
> device *dev)
>  static int __maybe_unused komeda_pm_resume(struct device *dev)
>  {
>   struct komeda_drv *mdrv = dev_get_drvdata(dev);
> - struct drm_device *drm = >kms->base;
>  
> - komeda_dev_resume(mdrv->mdev);
> + if (!pm_runtime_status_suspended(dev))
> + komeda_dev_resume(mdrv->mdev);
>  
> - return drm_mode_config_helper_resume(drm);
> + return drm_mode_config_helper_resume(>kms->base);
>  }
>  
>  static const struct dev_pm_ops komeda_pm_ops = {
>   SET_SYSTEM_SLEEP_PM_OPS(komeda_pm_suspend, komeda_pm_resume)
> + SET_RUNTIME_PM_OPS(komeda_rt_pm_suspend, komeda_rt_pm_resume, NULL)
>  };
>  
>  static struct platform_driver komeda_platform_driver = {
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_kms.c 
> b/drivers/gpu/drm/arm/display/komeda/komeda_kms.c
> index e30a5b43caa9..9a7dcf92591a 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_kms.c
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_kms.c
> @@ -307,10 +307,6 @@ struct komeda_kms_dev *komeda_kms_attach(struct 
> komeda_dev *mdev)
>   if (err)
>   goto free_component_binding;
>  
> - err = mdev->funcs->enable_irq(mdev);
> - if (err)
> - goto free_component_binding;
> -
>   drm->irq_enabled = true;
>  
>   drm_kms_helper_poll_init(drm);
> @@ -324,7 +320,6 @@ struct komeda_kms_dev *komeda_kms_attach(struct 
> komeda_dev *mdev)
>  free_interrupts:
>   drm_kms_helper_poll_fini(drm);
>   drm->irq_enabled = false;
> - mdev->funcs->disable_irq(mdev);
>  free_component_binding:
>   component_unbind_all(mdev->dev, drm);
>  cleanup_mode_config:
> @@ -346,7 +341,6 @@ void komeda_kms_detach(struct komeda_kms_dev *kms)
>   drm_kms_helper_poll_fini(drm);
>   drm_atomic_helper_shutdown(drm);
>   drm->irq_enabled = false;
> - mdev->funcs->disable_irq(mdev);
>   component_unbind_all(mdev->dev, drm);
>   drm_mode_config_cleanup(drm);
>   komeda_kms_cleanup_private_objs(kms);
> 

Reviewed-by: Mihail Atanassov 

-- 
Mihail



___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH 1/2] drm/komeda: Add basic support for D77

2019-12-11 Thread Mihail Atanassov
Hi Tiannan,

Thanks for the patch.

On Wednesday, 11 December 2019 10:30:09 GMT Tiannan Zhu (Arm Technology China) 
wrote:
> Make komeda driver can recongise D77, D77 is arm latest display
> product, compare with D71, D77 support some new features:
> 1. Crossbar: adjust every plane's zorder
> 2. ATU: Asynchronous Timewarp Unit, which is used to support VR/AR

I don't think the new features listing is relevant for this patch. I'd just
put a simple wording along the lines of:

Add D77 support via a new DT compatible string. The existing code is
sufficient for basic bring-up.

> 
> Signed-off-by: Tiannan Zhu (Arm Technology China) 
> ---
>  .../gpu/drm/arm/display/include/malidp_product.h  |  1 +
>  .../drm/arm/display/komeda/d71/d71_component.c| 15 +++
>  drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c  |  1 +
>  drivers/gpu/drm/arm/display/komeda/d71/d71_regs.h |  4 
>  drivers/gpu/drm/arm/display/komeda/komeda_drv.c   |  1 +
>  5 files changed, 22 insertions(+)
> 
> diff --git a/drivers/gpu/drm/arm/display/include/malidp_product.h 
> b/drivers/gpu/drm/arm/display/include/malidp_product.h
> index dbd3d4765065..cbde47f06c9f 100644
> --- a/drivers/gpu/drm/arm/display/include/malidp_product.h
> +++ b/drivers/gpu/drm/arm/display/include/malidp_product.h
> @@ -19,6 +19,7 @@
>  
>  /* Mali-display product IDs */
>  #define MALIDP_D71_PRODUCT_ID0x0071
> +#define MALIDP_D77_PRODUCT_ID0x0072
>  #define MALIDP_D32_PRODUCT_ID0x0032
>  
>  union komeda_config_id {
> diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c 
> b/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
> index c7f7e9c545c7..ec96b69a5ade 100644
> --- a/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
> +++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
> @@ -1347,6 +1347,21 @@ int d71_probe_block(struct d71_dev *d71,
>   d71->glb_scl_coeff_addr[blk_id] = reg;
>   break;
>  
> + case D71_BLK_TYPE_GLB_SC_COEFF:
> + break;
> +
> + case D77_BLK_TYPE_CBU:
> + break;
> +
> + case D77_BLK_TYPE_ATU:
> + break;
> +
> + case D77_BLK_TYPE_ATU_VP:
> + break;
> +
> + case D77_BLK_TYPE_LPU_PERF:
> + break;
> +

I'd omit this from the basic enablement patch since it's effectively dead
code. Add it when you need it.

>   default:
>   DRM_ERROR("Unknown block (block_info: 0x%x) is found\n",
> blk->block_info);
> diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c 
> b/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> index 2d429e310e5b..7598e4856e0c 100644
> --- a/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> +++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> @@ -614,6 +614,7 @@ d71_identify(u32 __iomem *reg_base, struct 
> komeda_chip_info *chip)
>   switch (product_id) {
>   case MALIDP_D71_PRODUCT_ID:
>   case MALIDP_D32_PRODUCT_ID:
> + case MALIDP_D77_PRODUCT_ID:
>   funcs = _chip_funcs;
>   break;
>   default:
> diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_regs.h 
> b/drivers/gpu/drm/arm/display/komeda/d71/d71_regs.h
> index 81de6a23e7f3..01ea53918cf1 100644
> --- a/drivers/gpu/drm/arm/display/komeda/d71/d71_regs.h
> +++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_regs.h
> @@ -477,8 +477,11 @@ enum d71_blk_type {
>   D71_BLK_TYPE_PERIPH = 0x08,
>   D71_BLK_TYPE_LPU_TRUSTED= 0x09,
>   D71_BLK_TYPE_AEU_TRUSTED= 0x0A,
> + D77_BLK_TYPE_CBU= 0x0B,
> + D77_BLK_TYPE_ATU= 0x0C,
>   D71_BLK_TYPE_LPU_LAYER  = 0x10,
>   D71_BLK_TYPE_LPU_WB_LAYER   = 0x11,
> + D77_BLK_TYPE_LPU_PERF   = 0x12,
>   D71_BLK_TYPE_CU_SPLITTER= 0x20,
>   D71_BLK_TYPE_CU_SCALER  = 0x21,
>   D71_BLK_TYPE_CU_MERGER  = 0x22,
> @@ -487,6 +490,7 @@ enum d71_blk_type {
>   D71_BLK_TYPE_DOU_FT_COEFF   = 0x32,
>   D71_BLK_TYPE_AEU_DS = 0x40,
>   D71_BLK_TYPE_AEU_AES= 0x41,
> + D77_BLK_TYPE_ATU_VP = 0xC0,

Same for all these block types.

>   D71_BLK_TYPE_RESERVED   = 0xFF
>  };
>  
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c 
> b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
> index ad38bbc7431e..3ac6b43beb2c 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
> @@ -126,6 +126,7 @@ static int komeda_platform_remove(struct platform_device 
> *pdev)
>  static const struct of_device_id komeda_of_match[] = {
>   { .compatible = "arm,mali-d71", .data = d71_identify, },
>   { .compatible = "arm,mali-d32", .data = d71_identify, },
> + { .compatible = "arm,mali-d77", .data = d71_identify, },
>   {},
>  };
>  
> 


-- 
Mihail



___
dri-devel mailing list

Re: [PATCH] drm/komeda: Correct d71 register block counting

2019-12-11 Thread Mihail Atanassov
On Tuesday, 10 December 2019 06:10:34 GMT james qian wang (Arm Technology 
China) wrote:
> Per HW, d71->num_blocks includes reserved blocks but no PERIPH block,
> correct the block counting accordingly.
> D71 happens to only have one reserved block and periph block, which
> hides this counting error.
> 
> Signed-off-by: james qian wang (Arm Technology China) 
> 
> ---
>  drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c | 9 ++---
>  1 file changed, 6 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c 
> b/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> index 822b23a1ce75..d53f95dea0a1 100644
> --- a/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> +++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> @@ -414,8 +414,11 @@ static int d71_enum_resources(struct komeda_dev *mdev)
>   d71->pipes[i] = to_d71_pipeline(pipe);
>   }
>  
> - /* loop the register blks and probe */
> - i = 2; /* exclude GCU and PERIPH */
> + /* loop the register blks and probe.
> +  * NOTE: d71->num_blocks includes reserved blocks.
> +  * d71->num_blocks = GCU + valid blocks + reserved blocks
> +  */
> + i = 1; /* exclude GCU */
>   offset = D71_BLOCK_SIZE; /* skip GCU */
>   while (i < d71->num_blocks) {
>   blk_base = mdev->reg_base + (offset >> 2);
> @@ -425,9 +428,9 @@ static int d71_enum_resources(struct komeda_dev *mdev)
>   err = d71_probe_block(d71, , blk_base);
>   if (err)
>   goto err_cleanup;
> -     i++;
>   }
>  
> + i++;
>   offset += D71_BLOCK_SIZE;
>   }
>  
> 

Reviewed-by: Mihail Atanassov 

-- 
Mihail



___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH v3 2/2] drm/komeda: Enable new product D32 support

2019-12-11 Thread Mihail Atanassov
On Tuesday, 10 December 2019 08:48:51 GMT james qian wang (Arm Technology 
China) wrote:
> D32 is simple version of D71, the difference is:
> - Only has one pipeline
> - Drop the periph block and merge it to GCU
> 
> v2: Rebase.
> v3: Isolate the block counting fix to a new patch

I would've expected the fix to be a part of this series as 2/3 and this
patch as 3/3.

Otherwise, this patch is
Reviewed-by: Mihail Atanassov 

> 
> Signed-off-by: James Qian Wang (Arm Technology China) 
> 
> ---
>  .../drm/arm/display/include/malidp_product.h  |  3 +-
>  .../arm/display/komeda/d71/d71_component.c|  2 +-
>  .../gpu/drm/arm/display/komeda/d71/d71_dev.c  | 39 ---
>  .../gpu/drm/arm/display/komeda/d71/d71_regs.h | 13 +++
>  .../gpu/drm/arm/display/komeda/komeda_drv.c   |  1 +
>  5 files changed, 42 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/gpu/drm/arm/display/include/malidp_product.h 
> b/drivers/gpu/drm/arm/display/include/malidp_product.h
> index 1053b11352eb..16a8a2c22c42 100644
> --- a/drivers/gpu/drm/arm/display/include/malidp_product.h
> +++ b/drivers/gpu/drm/arm/display/include/malidp_product.h
> @@ -18,7 +18,8 @@
>  #define MALIDP_CORE_ID_STATUS(__core_id) (((__u32)(__core_id)) & 0xFF)
>  
>  /* Mali-display product IDs */
> -#define MALIDP_D71_PRODUCT_ID   0x0071
> +#define MALIDP_D71_PRODUCT_ID0x0071
> +#define MALIDP_D32_PRODUCT_ID0x0032
>  
>  union komeda_config_id {
>   struct {
> diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c 
> b/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
> index b6517c46e670..8a02ade369db 100644
> --- a/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
> +++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
> @@ -1270,7 +1270,7 @@ static int d71_timing_ctrlr_init(struct d71_dev *d71,
>  
>   ctrlr = to_ctrlr(c);
>  
> - ctrlr->supports_dual_link = true;
> + ctrlr->supports_dual_link = d71->supports_dual_link;
>  
>   return 0;
>  }
> diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c 
> b/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> index 7e79c2e88421..dd1ecf4276d3 100644
> --- a/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> +++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> @@ -371,23 +371,33 @@ static int d71_enum_resources(struct komeda_dev *mdev)
>   goto err_cleanup;
>   }
>  
> - /* probe PERIPH */
> + /* Only the legacy HW has the periph block, the newer merges the periph
> +  * into GCU
> +  */
>   value = malidp_read32(d71->periph_addr, BLK_BLOCK_INFO);
> - if (BLOCK_INFO_BLK_TYPE(value) != D71_BLK_TYPE_PERIPH) {
> - DRM_ERROR("access blk periph but got blk: %d.\n",
> -   BLOCK_INFO_BLK_TYPE(value));
> - err = -EINVAL;
> - goto err_cleanup;
> + if (BLOCK_INFO_BLK_TYPE(value) != D71_BLK_TYPE_PERIPH)
> + d71->periph_addr = NULL;
> +
> + if (d71->periph_addr) {
> + /* probe PERIPHERAL in legacy HW */
> + value = malidp_read32(d71->periph_addr, 
> PERIPH_CONFIGURATION_ID);
> +
> + d71->max_line_size  = value & PERIPH_MAX_LINE_SIZE ? 4096 : 
> 2048;
> + d71->max_vsize  = 4096;
> + d71->num_rich_layers= value & PERIPH_NUM_RICH_LAYERS ? 2 : 
> 1;
> + d71->supports_dual_link = !!(value & PERIPH_SPLIT_EN);
> + d71->integrates_tbu = !!(value & PERIPH_TBU_EN);
> + } else {
> + value = malidp_read32(d71->gcu_addr, GCU_CONFIGURATION_ID0);
> + d71->max_line_size  = GCU_MAX_LINE_SIZE(value);
> + d71->max_vsize  = GCU_MAX_NUM_LINES(value);
> +
> + value = malidp_read32(d71->gcu_addr, GCU_CONFIGURATION_ID1);
> + d71->num_rich_layers= GCU_NUM_RICH_LAYERS(value);
> + d71->supports_dual_link = GCU_DISPLAY_SPLIT_EN(value);
> + d71->integrates_tbu = GCU_DISPLAY_TBU_EN(value);
>   }
>  
> - value = malidp_read32(d71->periph_addr, PERIPH_CONFIGURATION_ID);
> -
> - d71->max_line_size  = value & PERIPH_MAX_LINE_SIZE ? 4096 : 2048;
> - d71->max_vsize  = 4096;
> - d71->num_rich_layers= value & PERIPH_NUM_RICH_LAYERS ? 2 : 1;
> - d71->supports_dual_link = value & PERIPH_SPLIT_EN ? true : false;
> - d71->integrates_tbu = value & PERIPH_TBU_EN ? true : false;
> -
>   for (i = 0; i < d71->num_pipelines; i++) {
>   pipe = komeda_pipeline_add(mdev,

[PATCH v2] drm: Remove drm_bridge->dev

2019-12-11 Thread Mihail Atanassov
As suggested in [1], the 'dev' field is a bit repetitive, since it 1:1
follows the setting and NULLing of the 'encoder' field. Therefore, use
drm_bridge->encoder->dev in place of drm_bridge->dev.

[1] https://patchwork.freedesktop.org/patch/343824/

v2:
 - fix checkpatch complaint about unnecessary parentheses in
 drm_bridge.c. I've left the other two in since they're in the patch
 context rather than in a touched line.

Cc: Daniel Vetter 
Suggested-by: Thomas Zimmermann 
Acked-by: Thomas Zimmermann 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/adv7511/adv7511_drv.c   |  2 +-
 drivers/gpu/drm/bridge/analogix/analogix-anx6345.c |  2 +-
 drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c |  2 +-
 drivers/gpu/drm/bridge/cdns-dsi.c  |  2 +-
 drivers/gpu/drm/bridge/dumb-vga-dac.c  |  2 +-
 .../gpu/drm/bridge/megachips-stdp-ge-b850v3-fw.c   |  2 +-
 drivers/gpu/drm/bridge/nxp-ptn3460.c   |  2 +-
 drivers/gpu/drm/bridge/panel.c |  2 +-
 drivers/gpu/drm/bridge/parade-ps8622.c |  2 +-
 drivers/gpu/drm/bridge/sii902x.c   |  6 +++---
 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c  |  6 +++---
 drivers/gpu/drm/bridge/tc358764.c  |  4 ++--
 drivers/gpu/drm/bridge/tc358767.c  |  6 +++---
 drivers/gpu/drm/bridge/ti-sn65dsi86.c  |  2 +-
 drivers/gpu/drm/bridge/ti-tfp410.c |  6 +++---
 drivers/gpu/drm/drm_bridge.c   | 10 --
 drivers/gpu/drm/i2c/tda998x_drv.c  |  2 +-
 drivers/gpu/drm/mcde/mcde_dsi.c|  2 +-
 drivers/gpu/drm/msm/edp/edp_bridge.c   |  2 +-
 drivers/gpu/drm/msm/hdmi/hdmi_bridge.c |  4 ++--
 drivers/gpu/drm/rcar-du/rcar_lvds.c|  3 ++-
 include/drm/drm_bridge.h   |  2 --
 22 files changed, 35 insertions(+), 38 deletions(-)

diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c 
b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
index 9e13e466e72c..009cf1fef8d4 100644
--- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
+++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
@@ -863,7 +863,7 @@ static int adv7511_bridge_attach(struct drm_bridge *bridge)
adv->connector.polled = DRM_CONNECTOR_POLL_CONNECT |
DRM_CONNECTOR_POLL_DISCONNECT;
 
-   ret = drm_connector_init(bridge->dev, >connector,
+   ret = drm_connector_init(bridge->encoder->dev, >connector,
 _connector_funcs,
 DRM_MODE_CONNECTOR_HDMIA);
if (ret) {
diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c 
b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
index 9917ce0d86a0..5b806d23fcb3 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
@@ -541,7 +541,7 @@ static int anx6345_bridge_attach(struct drm_bridge *bridge)
return err;
}
 
-   err = drm_connector_init(bridge->dev, >connector,
+   err = drm_connector_init(bridge->encoder->dev, >connector,
 _connector_funcs,
 DRM_MODE_CONNECTOR_eDP);
if (err) {
diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c 
b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
index 41867be03751..7463537950cb 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
@@ -908,7 +908,7 @@ static int anx78xx_bridge_attach(struct drm_bridge *bridge)
return err;
}
 
-   err = drm_connector_init(bridge->dev, >connector,
+   err = drm_connector_init(bridge->encoder->dev, >connector,
 _connector_funcs,
 DRM_MODE_CONNECTOR_DisplayPort);
if (err) {
diff --git a/drivers/gpu/drm/bridge/cdns-dsi.c 
b/drivers/gpu/drm/bridge/cdns-dsi.c
index 3a5bd4e7fd1e..32863e3ad537 100644
--- a/drivers/gpu/drm/bridge/cdns-dsi.c
+++ b/drivers/gpu/drm/bridge/cdns-dsi.c
@@ -651,7 +651,7 @@ static int cdns_dsi_bridge_attach(struct drm_bridge *bridge)
struct cdns_dsi *dsi = input_to_dsi(input);
struct cdns_dsi_output *output = >output;
 
-   if (!drm_core_check_feature(bridge->dev, DRIVER_ATOMIC)) {
+   if (!drm_core_check_feature(bridge->encoder->dev, DRIVER_ATOMIC)) {
dev_err(dsi->base.dev,
"cdns-dsi driver is only compatible with DRM devices 
supporting atomic updates");
return -ENOTSUPP;
diff --git a/drivers/gpu/drm/bridge/dumb-vga-dac.c 
b/drivers/gpu/drm/bridge/dumb-vga-dac.c
index cc33dc411b9e..67ad6cecf68d 100644
--- a/drivers/gpu/drm/

Re: [PATCH] drm: remove drm_bridge->dev

2019-12-11 Thread Mihail Atanassov
Hi,

On Wednesday, 11 December 2019 07:38:29 GMT Thomas Zimmermann wrote:
> Hi
> 
> Am 10.12.19 um 16:11 schrieb Mihail Atanassov:
> > As suggested in [1], the 'dev' field is a bit repetitive, since it 1:1
> > follows the setting and NULLing of the 'encoder' field. Therefore, use
> > drm_bridge->encoder->dev in place of drm_bridge->dev.
> > 
> > [1] https://patchwork.freedesktop.org/patch/343824/
> > 
> > Cc: Daniel Vetter 
> > Suggested-by: Thomas Zimmermann 
> > Signed-off-by: Mihail Atanassov 
> 
> Do you need help with merging the patch?

I've push rights to drm-misc-next, I'll handle it Soon(tm)/today. Thanks for
the offer, though :).

> 
> Best regards
> Thomas
> 
> > ---
> >  drivers/gpu/drm/bridge/adv7511/adv7511_drv.c   |  2 +-
> >  drivers/gpu/drm/bridge/analogix/analogix-anx6345.c |  2 +-
> >  drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c |  2 +-
> >  drivers/gpu/drm/bridge/cdns-dsi.c  |  2 +-
> >  drivers/gpu/drm/bridge/dumb-vga-dac.c  |  2 +-
> >  .../gpu/drm/bridge/megachips-stdp-ge-b850v3-fw.c   |  2 +-
> >  drivers/gpu/drm/bridge/nxp-ptn3460.c   |  2 +-
> >  drivers/gpu/drm/bridge/panel.c |  2 +-
> >  drivers/gpu/drm/bridge/parade-ps8622.c |  2 +-
> >  drivers/gpu/drm/bridge/sii902x.c   |  6 +++---
> >  drivers/gpu/drm/bridge/synopsys/dw-hdmi.c  |  6 +++---
> >  drivers/gpu/drm/bridge/tc358764.c  |  4 ++--
> >  drivers/gpu/drm/bridge/tc358767.c  |  6 +++---
> >  drivers/gpu/drm/bridge/ti-sn65dsi86.c  |  2 +-
> >  drivers/gpu/drm/bridge/ti-tfp410.c |  6 +++---
> >  drivers/gpu/drm/drm_bridge.c   | 10 --
> >  drivers/gpu/drm/i2c/tda998x_drv.c  |  2 +-
> >  drivers/gpu/drm/mcde/mcde_dsi.c|  2 +-
> >  drivers/gpu/drm/msm/edp/edp_bridge.c   |  2 +-
> >  drivers/gpu/drm/msm/hdmi/hdmi_bridge.c |  4 ++--
> >  drivers/gpu/drm/rcar-du/rcar_lvds.c|  3 ++-
> >  include/drm/drm_bridge.h   |  2 --
> >  22 files changed, 35 insertions(+), 38 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c 
> > b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
> > index 9e13e466e72c..009cf1fef8d4 100644
> > --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
> > +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
> > @@ -863,7 +863,7 @@ static int adv7511_bridge_attach(struct drm_bridge 
> > *bridge)
> > adv->connector.polled = DRM_CONNECTOR_POLL_CONNECT |
> > DRM_CONNECTOR_POLL_DISCONNECT;
> >  
> > -   ret = drm_connector_init(bridge->dev, >connector,
> > +   ret = drm_connector_init(bridge->encoder->dev, >connector,
> >  _connector_funcs,
> >  DRM_MODE_CONNECTOR_HDMIA);
> > if (ret) {
> > diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c 
> > b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
> > index 9917ce0d86a0..5b806d23fcb3 100644
> > --- a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
> > +++ b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
> > @@ -541,7 +541,7 @@ static int anx6345_bridge_attach(struct drm_bridge 
> > *bridge)
> > return err;
> > }
> >  
> > -   err = drm_connector_init(bridge->dev, >connector,
> > +   err = drm_connector_init(bridge->encoder->dev, >connector,
> >  _connector_funcs,
> >  DRM_MODE_CONNECTOR_eDP);
> > if (err) {
> > diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c 
> > b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
> > index 41867be03751..7463537950cb 100644
> > --- a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
> > +++ b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
> > @@ -908,7 +908,7 @@ static int anx78xx_bridge_attach(struct drm_bridge 
> > *bridge)
> > return err;
> > }
> >  
> > -   err = drm_connector_init(bridge->dev, >connector,
> > +   err = drm_connector_init(bridge->encoder->dev, >connector,
> >  _connector_funcs,
> >  DRM_MODE_CONNECTOR_DisplayPort);
> > if (err) {
> > diff --git a/drivers/gpu/drm/bridg

Re: [PATCH v3 04/50] drm/bridge: Add connector-related bridge operations and data

2019-12-11 Thread Mihail Atanassov
Hi Laurent,

On Tuesday, 10 December 2019 22:57:04 GMT Laurent Pinchart wrote:
> To support implementation of DRM connectors on top of DRM bridges
> instead of by bridges, the drm_bridge needs to expose new operations and
> data:
> 
> - Output detection, hot-plug notification, mode retrieval and EDID
>   retrieval operations
> - Bitmask of supported operations
> - Bridge output type
> - I2C adapter for DDC access
> 
> Add and document these.
> 
> Three new bridge helper functions are also added to handle hot plug
> notification in a way that is as transparent as possible for the
> bridges.
> 
> Signed-off-by: Laurent Pinchart 
> Reviewed-by: Boris Brezillon 
> ---
> Changes since v2:
> 
> - Add wrappers around the .detect(), .get_modes() and .get_edid()
>   operations
> - Warn bridge drivers about valid usage of the connector argument to
>   .get_modes() and .get_edid()
> 
> Changes since v1:
> 
> - Make .hpd_enable() and .hpd_disable() optional
> - Rename .lost_hotplug() to .hpd_notify()
> - Add ddc field to drm_bridge
> ---
>  drivers/gpu/drm/drm_bridge.c | 162 +
>  include/drm/drm_bridge.h | 193 ++-
>  2 files changed, 354 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c
> index c2cf0c90fa26..473353bd762f 100644
> --- a/drivers/gpu/drm/drm_bridge.c
> +++ b/drivers/gpu/drm/drm_bridge.c
> @@ -70,6 +70,8 @@ static LIST_HEAD(bridge_list);
>   */
>  void drm_bridge_add(struct drm_bridge *bridge)
>  {
> + mutex_init(>hpd_mutex);
> +
>   mutex_lock(_lock);
>   list_add_tail(>list, _list);
>   mutex_unlock(_lock);
> @@ -86,6 +88,8 @@ void drm_bridge_remove(struct drm_bridge *bridge)
>   mutex_lock(_lock);
>   list_del_init(>list);
>   mutex_unlock(_lock);
> +
> + mutex_destroy(>hpd_mutex);
>  }
>  EXPORT_SYMBOL(drm_bridge_remove);
>  
> @@ -516,6 +520,164 @@ void drm_atomic_bridge_chain_enable(struct drm_bridge 
> *bridge,
>  }
>  EXPORT_SYMBOL(drm_atomic_bridge_chain_enable);
>  
> +/**
> + * drm_bridge_detect - check if anything is attached to the bridge output
> + * @bridge: bridge control structure
> + *
> + * If the bridge supports output detection, as reported by the
> + * DRM_BRIDGE_OP_DETECT bridge ops flag, call _bridge_funcs.detect for 
> the
> + * bridge and return the connection status. Otherwise return
> + * connector_status_unknown.
> + *
> + * RETURNS:
> + * The detection status on success, or connector_status_unknown if the bridge
> + * doesn't support output detection.
> + */
> +enum drm_connector_status drm_bridge_detect(struct drm_bridge *bridge)
> +{
> + if (!(bridge->ops & DRM_BRIDGE_OP_DETECT))
> + return connector_status_unknown;
> +
> + return bridge->funcs->detect(bridge);
> +}
> +EXPORT_SYMBOL_GPL(drm_bridge_detect);
> +
> +/**
> + * drm_bridge_get_modes - fill all modes currently valid for the sink into 
> the
> + * @connector
> + * @bridge: bridge control structure
> + * @connector: the connector to fill with modes
> + *
> + * If the bridge supports output modes retrieval, as reported by the
> + * DRM_BRIDGE_OP_MODES bridge ops flag, call _bridge_funcs.get_modes to
> + * fill the connector with all valid modes and return the number of modes
> + * added. Otherwise return 0.
> + *
> + * RETURNS:
> + * The number of modes added to the connector.
> + */
> +int drm_bridge_get_modes(struct drm_bridge *bridge,
> +  struct drm_connector *connector)
> +{
> + if (!(bridge->ops & DRM_BRIDGE_OP_MODES))
> + return 0;
> +
> + return bridge->funcs->get_modes(bridge, connector);
> +}
> +EXPORT_SYMBOL_GPL(drm_bridge_get_modes);
> +
> +/**
> + * drm_bridge_get_edid - get the EDID data of the connected display
> + * @bridge: bridge control structure
> + * @connector: the connector to read EDID for
> + *
> + * If the bridge supports output EDID retrieval, as reported by the
> + * DRM_BRIDGE_OP_EDID bridge ops flag, call _bridge_funcs.get_edid to
> + * get the EDID and return it. Otherwise return ERR_PTR(-ENOTSUPP).
> + *
> + * RETURNS:
> + * The retrieved EDID on success, or an error pointer otherwise.
> + */
> +struct edid *drm_bridge_get_edid(struct drm_bridge *bridge,
> +  struct drm_connector *connector)
> +{
> + if (!(bridge->ops & DRM_BRIDGE_OP_EDID))
> + return ERR_PTR(-ENOTSUPP);
> +
> + return bridge->funcs->get_edid(bridge, connector);
> +}
> +EXPORT_SYMBOL_GPL(drm_bridge_get_edid);
> +
> +/**
> + * drm_bridge_hpd_enable - enable hot plug detection for the bridge
> + * @bridge: bridge control structure
> + * @cb: hot-plug detection callback
> + * @data: data to be passed to the hot-plug detection callback
> + *
> + * Call _bridge_funcs.hpd_enable if implemented and register the given 
> @cb
> + * and @data as hot plug notification callback. From now on the @cb will be
> + * called with @data when an output status change is detected by 

Re: [PATCH] drm/bridge: panel: export drm_panel_bridge_connector

2019-12-10 Thread Mihail Atanassov
On Tuesday, 10 December 2019 16:26:47 GMT Laurent Pinchart wrote:
> Hi Mihail,
> 
> Thank you for the patch.
> 
> On Tue, Dec 10, 2019 at 02:48:49PM +, Mihail Atanassov wrote:
> > The function was unexported and was causing link failures for pl111 (and
> > probably the other user tve200) in a module build.
> > 
> > Fixes: d383fb5f8add ("drm: get drm_bridge_panel connector via helper")
> > Cc: Sam Ravnborg 
> > Cc: Laurent Pinchart 
> > Cc: Linux Walleij 
> > Signed-off-by: Mihail Atanassov 
> 
> Reviewed-by: Laurent Pinchart 
> 

Thanks, applied to drm-misc-next.

> > ---
> >  drivers/gpu/drm/bridge/panel.c | 1 +
> >  1 file changed, 1 insertion(+)
> > 
> > diff --git a/drivers/gpu/drm/bridge/panel.c b/drivers/gpu/drm/bridge/panel.c
> > index 1443897f999b..f66777e24968 100644
> > --- a/drivers/gpu/drm/bridge/panel.c
> > +++ b/drivers/gpu/drm/bridge/panel.c
> > @@ -306,3 +306,4 @@ struct drm_connector *drm_panel_bridge_connector(struct 
> > drm_bridge *bridge)
> >  
> > return _bridge->connector;
> >  }
> > +EXPORT_SYMBOL(drm_panel_bridge_connector);
> 
> -- 
> Regards,
> 
> Laurent Pinchart
> 


-- 
Mihail



___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH] drm: remove drm_bridge->dev

2019-12-10 Thread Mihail Atanassov
As suggested in [1], the 'dev' field is a bit repetitive, since it 1:1
follows the setting and NULLing of the 'encoder' field. Therefore, use
drm_bridge->encoder->dev in place of drm_bridge->dev.

[1] https://patchwork.freedesktop.org/patch/343824/

Cc: Daniel Vetter 
Suggested-by: Thomas Zimmermann 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/adv7511/adv7511_drv.c   |  2 +-
 drivers/gpu/drm/bridge/analogix/analogix-anx6345.c |  2 +-
 drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c |  2 +-
 drivers/gpu/drm/bridge/cdns-dsi.c  |  2 +-
 drivers/gpu/drm/bridge/dumb-vga-dac.c  |  2 +-
 .../gpu/drm/bridge/megachips-stdp-ge-b850v3-fw.c   |  2 +-
 drivers/gpu/drm/bridge/nxp-ptn3460.c   |  2 +-
 drivers/gpu/drm/bridge/panel.c |  2 +-
 drivers/gpu/drm/bridge/parade-ps8622.c |  2 +-
 drivers/gpu/drm/bridge/sii902x.c   |  6 +++---
 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c  |  6 +++---
 drivers/gpu/drm/bridge/tc358764.c  |  4 ++--
 drivers/gpu/drm/bridge/tc358767.c  |  6 +++---
 drivers/gpu/drm/bridge/ti-sn65dsi86.c  |  2 +-
 drivers/gpu/drm/bridge/ti-tfp410.c |  6 +++---
 drivers/gpu/drm/drm_bridge.c   | 10 --
 drivers/gpu/drm/i2c/tda998x_drv.c  |  2 +-
 drivers/gpu/drm/mcde/mcde_dsi.c|  2 +-
 drivers/gpu/drm/msm/edp/edp_bridge.c   |  2 +-
 drivers/gpu/drm/msm/hdmi/hdmi_bridge.c |  4 ++--
 drivers/gpu/drm/rcar-du/rcar_lvds.c|  3 ++-
 include/drm/drm_bridge.h   |  2 --
 22 files changed, 35 insertions(+), 38 deletions(-)

diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c 
b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
index 9e13e466e72c..009cf1fef8d4 100644
--- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
+++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
@@ -863,7 +863,7 @@ static int adv7511_bridge_attach(struct drm_bridge *bridge)
adv->connector.polled = DRM_CONNECTOR_POLL_CONNECT |
DRM_CONNECTOR_POLL_DISCONNECT;
 
-   ret = drm_connector_init(bridge->dev, >connector,
+   ret = drm_connector_init(bridge->encoder->dev, >connector,
 _connector_funcs,
 DRM_MODE_CONNECTOR_HDMIA);
if (ret) {
diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c 
b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
index 9917ce0d86a0..5b806d23fcb3 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
@@ -541,7 +541,7 @@ static int anx6345_bridge_attach(struct drm_bridge *bridge)
return err;
}
 
-   err = drm_connector_init(bridge->dev, >connector,
+   err = drm_connector_init(bridge->encoder->dev, >connector,
 _connector_funcs,
 DRM_MODE_CONNECTOR_eDP);
if (err) {
diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c 
b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
index 41867be03751..7463537950cb 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
@@ -908,7 +908,7 @@ static int anx78xx_bridge_attach(struct drm_bridge *bridge)
return err;
}
 
-   err = drm_connector_init(bridge->dev, >connector,
+   err = drm_connector_init(bridge->encoder->dev, >connector,
 _connector_funcs,
 DRM_MODE_CONNECTOR_DisplayPort);
if (err) {
diff --git a/drivers/gpu/drm/bridge/cdns-dsi.c 
b/drivers/gpu/drm/bridge/cdns-dsi.c
index 3a5bd4e7fd1e..32863e3ad537 100644
--- a/drivers/gpu/drm/bridge/cdns-dsi.c
+++ b/drivers/gpu/drm/bridge/cdns-dsi.c
@@ -651,7 +651,7 @@ static int cdns_dsi_bridge_attach(struct drm_bridge *bridge)
struct cdns_dsi *dsi = input_to_dsi(input);
struct cdns_dsi_output *output = >output;
 
-   if (!drm_core_check_feature(bridge->dev, DRIVER_ATOMIC)) {
+   if (!drm_core_check_feature(bridge->encoder->dev, DRIVER_ATOMIC)) {
dev_err(dsi->base.dev,
"cdns-dsi driver is only compatible with DRM devices 
supporting atomic updates");
return -ENOTSUPP;
diff --git a/drivers/gpu/drm/bridge/dumb-vga-dac.c 
b/drivers/gpu/drm/bridge/dumb-vga-dac.c
index cc33dc411b9e..67ad6cecf68d 100644
--- a/drivers/gpu/drm/bridge/dumb-vga-dac.c
+++ b/drivers/gpu/drm/bridge/dumb-vga-dac.c
@@ -112,7 +112,7 @@ static int dumb_vga_attach(struct drm_bridge *bridge)
 
drm_connector_helper_add(>connector,
 

[PATCH] drm/bridge: panel: export drm_panel_bridge_connector

2019-12-10 Thread Mihail Atanassov
The function was unexported and was causing link failures for pl111 (and
probably the other user tve200) in a module build.

Fixes: d383fb5f8add ("drm: get drm_bridge_panel connector via helper")
Cc: Sam Ravnborg 
Cc: Laurent Pinchart 
Cc: Linux Walleij 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/panel.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/bridge/panel.c b/drivers/gpu/drm/bridge/panel.c
index 1443897f999b..f66777e24968 100644
--- a/drivers/gpu/drm/bridge/panel.c
+++ b/drivers/gpu/drm/bridge/panel.c
@@ -306,3 +306,4 @@ struct drm_connector *drm_panel_bridge_connector(struct 
drm_bridge *bridge)
 
return _bridge->connector;
 }
+EXPORT_SYMBOL(drm_panel_bridge_connector);
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH] drm: Rename drm_bridge->dev to drm

2019-12-10 Thread Mihail Atanassov
On Tuesday, 10 December 2019 10:12:50 GMT Daniel Vetter wrote:
> On Fri, Dec 06, 2019 at 12:59:04PM +0100, Thomas Zimmermann wrote:
> > Hi
> > 
> > Am 06.12.19 um 12:25 schrieb Mihail Atanassov:
> > > Hallo Thomas,
> > > 
> > > On Thursday, 5 December 2019 18:20:06 GMT Thomas Zimmermann wrote:
> > >> Hi
> > >>
> > >> Am 05.12.19 um 17:30 schrieb Mihail Atanassov:
> > >>> The 'dev' name causes some confusion with 'struct device' [1][2], so use
> > >>> 'drm' instead since this seems to be the prevalent name for 'struct
> > >>> drm_device' members.
> > >>>
> > >>> [1] https://patchwork.freedesktop.org/patch/342472/?series=70039=1
> > >>> [2] https://patchwork.freedesktop.org/patch/343643/?series=70432=1
> > >>
> > >> I read through the provided links, but can't see why is it called 'drm'.
> > >> That sounds like a reference to a DRM driver structure to me.
> > > 
> > > There are about 550 hits on 'struct drm_device *drm', so I gathered that
> > > it's the most common alternative to just naming it 'dev' (at about 4.5k
> > > hits in the codebase). There's also 'ddev', 'drm_dev', 'drmdev' with
> > > few hits.
> > > 
> > >>
> > >> What about attached_dev or consumer_dev or encoder_dev?
> > > 
> > > Those would be more descriptive, if you think it's worth sidestepping
> > > the above convention a bit. I don't mind either way.
> > 
> > Well, I don't have a say on these things, but it's worth considering a
> > more descriptive name IMHO.
> > 
> > I also wonder why that field is there in the first place. Invoking
> > drm_bridge_attach() sets the encoder and its dev field for the bridge.
> > [1] Could the dev field be removed and all users refer to encoder->dev
> > instead? If so, it seems like the better way to go.
> 
> That sounds like a pretty neat idea (if possible) ...
> -Daniel
> 

OK, I'll poke at it a bit and see what falls out. I'm guessing we don't
particularly care about the extra pointer being dereferenced in driver code?
The vast majority of the uses are in attach/detach logic so fairly benign but
we do have a few in IRQs.

> > 
> > Best regards
> > Thomas
> > 
> > [1]
> > https://elixir.bootlin.com/linux/v5.4.2/source/drivers/gpu/drm/drm_bridge.c#L128
> > 
> > > 
> > >>
> > >> Best regards
> > >> Thomas
> > >>
> > >>>
> > >>> Cc: Daniel Vetter 
> > >>> Cc: Laurent Pinchart 
> > >>> Signed-off-by: Mihail Atanassov 
> > >>> ---
> > >>>  drivers/gpu/drm/bridge/adv7511/adv7511_drv.c |  2 +-
> > >>>  drivers/gpu/drm/bridge/analogix/analogix-anx6345.c   |  2 +-
> > >>>  drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c   |  2 +-
> > >>>  drivers/gpu/drm/bridge/cdns-dsi.c|  2 +-
> > >>>  drivers/gpu/drm/bridge/dumb-vga-dac.c|  2 +-
> > >>>  .../gpu/drm/bridge/megachips-stdp-ge-b850v3-fw.c |  2 +-
> > >>>  drivers/gpu/drm/bridge/nxp-ptn3460.c |  2 +-
> > >>>  drivers/gpu/drm/bridge/panel.c   |  2 +-
> > >>>  drivers/gpu/drm/bridge/parade-ps8622.c   |  2 +-
> > >>>  drivers/gpu/drm/bridge/sii902x.c |  6 +++---
> > >>>  drivers/gpu/drm/bridge/synopsys/dw-hdmi.c|  6 +++---
> > >>>  drivers/gpu/drm/bridge/tc358764.c|  4 ++--
> > >>>  drivers/gpu/drm/bridge/tc358767.c|  6 +++---
> > >>>  drivers/gpu/drm/bridge/ti-sn65dsi86.c|  2 +-
> > >>>  drivers/gpu/drm/bridge/ti-tfp410.c   |  6 +++---
> > >>>  drivers/gpu/drm/drm_bridge.c | 12 ++--
> > >>>  drivers/gpu/drm/i2c/tda998x_drv.c|  2 +-
> > >>>  drivers/gpu/drm/mcde/mcde_dsi.c  |  2 +-
> > >>>  drivers/gpu/drm/msm/edp/edp_bridge.c |  2 +-
> > >>>  drivers/gpu/drm/msm/hdmi/hdmi_bridge.c   |  4 ++--
> > >>>  drivers/gpu/drm/rcar-du/rcar_lvds.c  |  2 +-
> > >>>  include/drm/drm_bridge.h |  4 ++--
> > >>>  22 files changed, 38 insertions(+), 38 deletions(-)
> > >>>
> > >>> diff --git a/drivers/gpu/drm/bridge/adv75

Re: [PATCH v2 00/28] drm/bridge: Consolidate initialization

2019-12-09 Thread Mihail Atanassov
On Monday, 9 December 2019 10:39:07 GMT Neil Armstrong wrote:
> Hi Mihail,

Hi Neil,

> 
> On 04/12/2019 12:48, Mihail Atanassov wrote:
> > Hi all,
> > 
> > I've dropped the fun parts of this series since they need more work, but
> > figured drm_bridge_init() as a concept is still valuable on its own (and
> > I think I'll need it to roll out device links for registered bridges),
> > so here goes.
> > 
> > v2:
> >  - expanded commit messages and added some extra bridge-related
> >documentation (Daniel)
> >  - dropped v1 patches 29 and 30: 29 needs more work, and 30 depends on
> >it
> >  - added all remaining drm_bridge implementers, found by searching for
> >drm_bridge_funcs which is mandatory for any bridge; new uses in
> >patches 3, 27, and 28 (Sam)
> >  - due to the above, I've decided to squash all analogix changes into
> >one patch
> > 
> > ---
> > v1 [https://patchwork.freedesktop.org/series/70039/] cover text below:
> > 
> > This series adds device links support to drm_bridge. The motivation
> > behind it is that a drm_bridge in a module could get removed under the
> > feet of the bridge user without warning, so we need a way to remove and
> > reprobe the client as needed to avoid peering into the void.
> > 
> > 1: Add a drm_bridge_init() function which wraps all initialisation of
> > the structure prior to calling drm_bridge_add().
> > 
> > 2-26,28: Apply the drm_bridge_init() refactor to every bridge that uses
> > drm_bridge_add().
> > 
> > 27: Minor cleanup in rcar-du.
> > 
> > 29: Add of_drm_find_bridge_devlink() which functions the same as
> > of_drm_find_bridge() plus adds a device device link from the owning
> > drm_device to the bridge device.
> > 
> > 30: As a motivating example, convert komeda to exclusively use
> > drm_bridge for its pipe outputs; this isn't a regression in usability
> > any more since device links bring the same automatic remove/reprobe
> > feature as components.
> > 
> > Mihail Atanassov (28):
> >   drm: Introduce drm_bridge_init()
> >   drm/bridge: adv7511: Use drm_bridge_init()
> >   drm/bridge/analogix: Use drm_bridge_init()
> >   drm/bridge: cdns: Use drm_bridge_init()
> >   drm/bridge: dumb-vga-dac: Use drm_bridge_init()
> >   drm/bridge: lvds-encoder: Use drm_bridge_init()
> >   drm/bridge: megachips-stdp-ge-b850v3-fw: Use drm_bridge_init()
> >   drm/bridge: nxp-ptn3460: Use drm_bridge_init()
> >   drm/bridge: panel: Use drm_bridge_init()
> >   drm/bridge: ps8622: Use drm_bridge_init()
> >   drm/bridge: sii902x: Use drm_bridge_init()
> >   gpu: drm: bridge: sii9234: Use drm_bridge_init()
> >   drm/bridge: sil_sii8620: Use drm_bridge_init()
> >   drm/bridge: dw-hdmi: Use drm_bridge_init()
> >   drm/bridge/synopsys: dsi: Use drm_bridge_init()
> >   drm/bridge: tc358764: Use drm_bridge_init()
> >   drm/bridge: tc358767: Use drm_bridge_init()
> >   drm/bridge: thc63: Use drm_bridge_init()
> >   drm/bridge: ti-sn65dsi86: Use drm_bridge_init()
> >   drm/bridge: ti-tfp410: Use drm_bridge_init()
> >   drm/exynos: mic: Use drm_bridge_init()
> >   drm/i2c: tda998x: Use drm_bridge_init()
> >   drm/mcde: dsi: Use drm_bridge_init()
> >   drm/mediatek: hdmi: Use drm_bridge_init()
> >   drm: rcar-du: lvds: Use drm_bridge_init()
> >   drm: rcar-du: lvds: Don't set drm_bridge private pointer
> >   drm/sti: Use drm_bridge_init()
> >   drm/msm: Use drm_bridge_init()
> > 
> >  drivers/gpu/drm/bridge/adv7511/adv7511_drv.c  |  5 ++-
> >  .../drm/bridge/analogix/analogix-anx6345.c|  5 ++-
> >  .../drm/bridge/analogix/analogix-anx78xx.c|  8 ++---
> >  .../drm/bridge/analogix/analogix_dp_core.c|  5 ++-
> >  drivers/gpu/drm/bridge/cdns-dsi.c |  4 +--
> >  drivers/gpu/drm/bridge/dumb-vga-dac.c |  6 ++--
> >  drivers/gpu/drm/bridge/lvds-encoder.c |  7 ++--
> >  .../bridge/megachips-stdp-ge-b850v3-fw.c  |  4 +--
> >  drivers/gpu/drm/bridge/nxp-ptn3460.c  |  4 +--
> >  drivers/gpu/drm/bridge/panel.c|  7 ++--
> >  drivers/gpu/drm/bridge/parade-ps8622.c|  3 +-
> >  drivers/gpu/drm/bridge/sii902x.c  |  5 ++-
> >  drivers/gpu/drm/bridge/sii9234.c  |  3 +-
> >  drivers/gpu/drm/bridge/sil-sii8620.c  |  3 +-
> >  drivers/gpu/drm/bridge/synopsys/dw-hdmi.c |  7 ++--
> >  drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c |  7 ++--
> >  drivers/gpu/drm/bridge/tc358764.c |  4 +--
> >  drivers/gpu/drm/bridge/tc3

Re: [PATCH] drm: Rename drm_bridge->dev to drm

2019-12-06 Thread Mihail Atanassov
Hallo Thomas,

On Thursday, 5 December 2019 18:20:06 GMT Thomas Zimmermann wrote:
> Hi
> 
> Am 05.12.19 um 17:30 schrieb Mihail Atanassov:
> > The 'dev' name causes some confusion with 'struct device' [1][2], so use
> > 'drm' instead since this seems to be the prevalent name for 'struct
> > drm_device' members.
> > 
> > [1] https://patchwork.freedesktop.org/patch/342472/?series=70039=1
> > [2] https://patchwork.freedesktop.org/patch/343643/?series=70432=1
> 
> I read through the provided links, but can't see why is it called 'drm'.
> That sounds like a reference to a DRM driver structure to me.

There are about 550 hits on 'struct drm_device *drm', so I gathered that
it's the most common alternative to just naming it 'dev' (at about 4.5k
hits in the codebase). There's also 'ddev', 'drm_dev', 'drmdev' with
few hits.

> 
> What about attached_dev or consumer_dev or encoder_dev?

Those would be more descriptive, if you think it's worth sidestepping
the above convention a bit. I don't mind either way.

> 
> Best regards
> Thomas
> 
> > 
> > Cc: Daniel Vetter 
> > Cc: Laurent Pinchart 
> > Signed-off-by: Mihail Atanassov 
> > ---
> >  drivers/gpu/drm/bridge/adv7511/adv7511_drv.c |  2 +-
> >  drivers/gpu/drm/bridge/analogix/analogix-anx6345.c   |  2 +-
> >  drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c   |  2 +-
> >  drivers/gpu/drm/bridge/cdns-dsi.c|  2 +-
> >  drivers/gpu/drm/bridge/dumb-vga-dac.c|  2 +-
> >  .../gpu/drm/bridge/megachips-stdp-ge-b850v3-fw.c |  2 +-
> >  drivers/gpu/drm/bridge/nxp-ptn3460.c |  2 +-
> >  drivers/gpu/drm/bridge/panel.c   |  2 +-
> >  drivers/gpu/drm/bridge/parade-ps8622.c   |  2 +-
> >  drivers/gpu/drm/bridge/sii902x.c |  6 +++---
> >  drivers/gpu/drm/bridge/synopsys/dw-hdmi.c|  6 +++---
> >  drivers/gpu/drm/bridge/tc358764.c|  4 ++--
> >  drivers/gpu/drm/bridge/tc358767.c|  6 +++---
> >  drivers/gpu/drm/bridge/ti-sn65dsi86.c|  2 +-
> >  drivers/gpu/drm/bridge/ti-tfp410.c   |  6 +++---
> >  drivers/gpu/drm/drm_bridge.c | 12 ++--
> >  drivers/gpu/drm/i2c/tda998x_drv.c|  2 +-
> >  drivers/gpu/drm/mcde/mcde_dsi.c  |  2 +-
> >  drivers/gpu/drm/msm/edp/edp_bridge.c |  2 +-
> >  drivers/gpu/drm/msm/hdmi/hdmi_bridge.c   |  4 ++--
> >  drivers/gpu/drm/rcar-du/rcar_lvds.c  |  2 +-
> >  include/drm/drm_bridge.h |  4 ++--
> >  22 files changed, 38 insertions(+), 38 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c 
> > b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
> > index 9e13e466e72c..db7d01cb0923 100644
> > --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
> > +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
> > @@ -863,7 +863,7 @@ static int adv7511_bridge_attach(struct drm_bridge 
> > *bridge)
> > adv->connector.polled = DRM_CONNECTOR_POLL_CONNECT |
> > DRM_CONNECTOR_POLL_DISCONNECT;
> >  
> > -   ret = drm_connector_init(bridge->dev, >connector,
> > +   ret = drm_connector_init(bridge->drm, >connector,
> >  _connector_funcs,
> >  DRM_MODE_CONNECTOR_HDMIA);
> > if (ret) {
> > diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c 
> > b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
> > index b4f3a923a52a..0e3508aeaa6c 100644
> > --- a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
> > +++ b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
> > @@ -541,7 +541,7 @@ static int anx6345_bridge_attach(struct drm_bridge 
> > *bridge)
> > return err;
> > }
> >  
> > -   err = drm_connector_init(bridge->dev, >connector,
> > +   err = drm_connector_init(bridge->drm, >connector,
> >  _connector_funcs,
> >  DRM_MODE_CONNECTOR_eDP);
> > if (err) {
> > diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c 
> > b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
> > index 41867be03751..d5722bc28933 100644
> > --- a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
> > +++ b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
> > @@ -908,7 +908,7 @@ static int anx78xx_bridge_attach(struct drm_bridge 
> > *bridge)
> > 

[PATCH] drm: Rename drm_bridge->dev to drm

2019-12-05 Thread Mihail Atanassov
The 'dev' name causes some confusion with 'struct device' [1][2], so use
'drm' instead since this seems to be the prevalent name for 'struct
drm_device' members.

[1] https://patchwork.freedesktop.org/patch/342472/?series=70039=1
[2] https://patchwork.freedesktop.org/patch/343643/?series=70432=1

Cc: Daniel Vetter 
Cc: Laurent Pinchart 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/adv7511/adv7511_drv.c |  2 +-
 drivers/gpu/drm/bridge/analogix/analogix-anx6345.c   |  2 +-
 drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c   |  2 +-
 drivers/gpu/drm/bridge/cdns-dsi.c|  2 +-
 drivers/gpu/drm/bridge/dumb-vga-dac.c|  2 +-
 .../gpu/drm/bridge/megachips-stdp-ge-b850v3-fw.c |  2 +-
 drivers/gpu/drm/bridge/nxp-ptn3460.c |  2 +-
 drivers/gpu/drm/bridge/panel.c   |  2 +-
 drivers/gpu/drm/bridge/parade-ps8622.c   |  2 +-
 drivers/gpu/drm/bridge/sii902x.c |  6 +++---
 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c|  6 +++---
 drivers/gpu/drm/bridge/tc358764.c|  4 ++--
 drivers/gpu/drm/bridge/tc358767.c|  6 +++---
 drivers/gpu/drm/bridge/ti-sn65dsi86.c|  2 +-
 drivers/gpu/drm/bridge/ti-tfp410.c   |  6 +++---
 drivers/gpu/drm/drm_bridge.c | 12 ++--
 drivers/gpu/drm/i2c/tda998x_drv.c|  2 +-
 drivers/gpu/drm/mcde/mcde_dsi.c  |  2 +-
 drivers/gpu/drm/msm/edp/edp_bridge.c |  2 +-
 drivers/gpu/drm/msm/hdmi/hdmi_bridge.c   |  4 ++--
 drivers/gpu/drm/rcar-du/rcar_lvds.c  |  2 +-
 include/drm/drm_bridge.h |  4 ++--
 22 files changed, 38 insertions(+), 38 deletions(-)

diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c 
b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
index 9e13e466e72c..db7d01cb0923 100644
--- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
+++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
@@ -863,7 +863,7 @@ static int adv7511_bridge_attach(struct drm_bridge *bridge)
adv->connector.polled = DRM_CONNECTOR_POLL_CONNECT |
DRM_CONNECTOR_POLL_DISCONNECT;
 
-   ret = drm_connector_init(bridge->dev, >connector,
+   ret = drm_connector_init(bridge->drm, >connector,
 _connector_funcs,
 DRM_MODE_CONNECTOR_HDMIA);
if (ret) {
diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c 
b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
index b4f3a923a52a..0e3508aeaa6c 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
@@ -541,7 +541,7 @@ static int anx6345_bridge_attach(struct drm_bridge *bridge)
return err;
}
 
-   err = drm_connector_init(bridge->dev, >connector,
+   err = drm_connector_init(bridge->drm, >connector,
 _connector_funcs,
 DRM_MODE_CONNECTOR_eDP);
if (err) {
diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c 
b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
index 41867be03751..d5722bc28933 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
@@ -908,7 +908,7 @@ static int anx78xx_bridge_attach(struct drm_bridge *bridge)
return err;
}
 
-   err = drm_connector_init(bridge->dev, >connector,
+   err = drm_connector_init(bridge->drm, >connector,
 _connector_funcs,
 DRM_MODE_CONNECTOR_DisplayPort);
if (err) {
diff --git a/drivers/gpu/drm/bridge/cdns-dsi.c 
b/drivers/gpu/drm/bridge/cdns-dsi.c
index 3a5bd4e7fd1e..f6d7e97de66e 100644
--- a/drivers/gpu/drm/bridge/cdns-dsi.c
+++ b/drivers/gpu/drm/bridge/cdns-dsi.c
@@ -651,7 +651,7 @@ static int cdns_dsi_bridge_attach(struct drm_bridge *bridge)
struct cdns_dsi *dsi = input_to_dsi(input);
struct cdns_dsi_output *output = >output;
 
-   if (!drm_core_check_feature(bridge->dev, DRIVER_ATOMIC)) {
+   if (!drm_core_check_feature(bridge->drm, DRIVER_ATOMIC)) {
dev_err(dsi->base.dev,
"cdns-dsi driver is only compatible with DRM devices 
supporting atomic updates");
return -ENOTSUPP;
diff --git a/drivers/gpu/drm/bridge/dumb-vga-dac.c 
b/drivers/gpu/drm/bridge/dumb-vga-dac.c
index cc33dc411b9e..30b5e54df381 100644
--- a/drivers/gpu/drm/bridge/dumb-vga-dac.c
+++ b/drivers/gpu/drm/bridge/dumb-vga-dac.c
@@ -112,7 +112,7 @@ static int dumb_vga_attach(struct drm_bridge *bridge)
 
drm_connector_helper_add(>connector,
 _vga_con_helper_funcs);
-   ret = 

Re: [PATCH v2 12/28] gpu: drm: bridge: sii9234: Use drm_bridge_init()

2019-12-05 Thread Mihail Atanassov
Hi Neil,

On Thursday, 5 December 2019 12:10:37 GMT Neil Armstrong wrote:
> Hi,
> 
> On 04/12/2019 12:48, Mihail Atanassov wrote:
> > No functional change.
> > 
> 
> Why this particular one has "gpu: drm: bridge" unlike the other patches of 
> the serie ?
> 

I took the "look at the file's git log" approach to determining the prefix.
I can change it if you prefer a "drm/bridge: sii9234" prefix instead.

> Neil
> 
> > Signed-off-by: Mihail Atanassov 
> > ---
> >  drivers/gpu/drm/bridge/sii9234.c | 3 +--
> >  1 file changed, 1 insertion(+), 2 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/bridge/sii9234.c 
> > b/drivers/gpu/drm/bridge/sii9234.c
> > index f81f81b7051f..bfd3832baa1a 100644
> > --- a/drivers/gpu/drm/bridge/sii9234.c
> > +++ b/drivers/gpu/drm/bridge/sii9234.c
> > @@ -925,8 +925,7 @@ static int sii9234_probe(struct i2c_client *client,
> >  
> > i2c_set_clientdata(client, ctx);
> >  
> > -   ctx->bridge.funcs = _bridge_funcs;
> > -   ctx->bridge.of_node = dev->of_node;
> > +   drm_bridge_init(>bridge, dev, _bridge_funcs, NULL, NULL);
> > drm_bridge_add(>bridge);
> >  
> > sii9234_cable_in(ctx);
> > 
> 
> 


-- 
Mihail



___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Re: [PATCH v2 01/28] drm: Introduce drm_bridge_init()

2019-12-05 Thread Mihail Atanassov
Hi Laurent,

On Thursday, 5 December 2019 12:40:22 GMT Laurent Pinchart wrote:
> Hi Mihail,
> 
> Thank you for the patch.

Thanks for the quick reviews :).

> 
> On Wed, Dec 04, 2019 at 11:48:02AM +, Mihail Atanassov wrote:
> > A simple convenience function to initialize the struct drm_bridge. The
> > goal is to standardize initialization for any bridge registered with
> > drm_bridge_add() so that we can later add device links for consumers of
> > those bridges.
> > 
> > v2:
> >  - s/WARN_ON(!funcs)/WARN_ON(!funcs || !dev)/ as suggested by Daniel
> >  - expand on some kerneldoc comments as suggested by Daniel
> >  - update commit message as suggested by Daniel
> > 
> > Signed-off-by: Mihail Atanassov 
> > ---
> >  drivers/gpu/drm/drm_bridge.c | 34 +-
> >  include/drm/drm_bridge.h | 15 ++-
> >  2 files changed, 47 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c
> > index cba537c99e43..50e1c1b46e20 100644
> > --- a/drivers/gpu/drm/drm_bridge.c
> > +++ b/drivers/gpu/drm/drm_bridge.c
> > @@ -64,7 +64,10 @@ static DEFINE_MUTEX(bridge_lock);
> >  static LIST_HEAD(bridge_list);
> >  
> >  /**
> > - * drm_bridge_add - add the given bridge to the global bridge list
> > + * drm_bridge_add - add the given bridge to the global bridge list.
> 
> You add a final period here and in the documentation of struct
> drm_bridge, but the new function you're adding doesn't have one :-) I'd
> drop the period here and for drm_bridge to be consistent with the rest
> of the code.
> 
> > + *
> > + * Drivers should call drm_bridge_init() prior adding it to the list.
> 
> s/should/shall/
> s/prior adding it/prior to adding the bridge/
> 
> > + * Drivers should call drm_bridge_remove() to clean up the bridge list.
> 
> I'd replace this sentence with "Before deleting a bridge (usually when
> the driver is unbound from the device), drivers shall call
> drm_bridge_remove() to remove it from the global list."
> 

> >   *
> >   * @bridge: bridge control structure
> >   */
> > @@ -89,6 +92,35 @@ void drm_bridge_remove(struct drm_bridge *bridge)
> >  }
> >  EXPORT_SYMBOL(drm_bridge_remove);
> >  
> > +/**
> > + * drm_bridge_init - initialise a drm_bridge structure
> 
> initialise or initialize ? :-)

I have absolutely no clue :). Judging by the question I'm guessing the
correct answer for the kernel is US spelling.

> 
> > + *
> > + * @bridge: bridge control structure
> > + * @funcs: control functions
> > + * @dev: device associated with this drm_bridge
> 
> dev goes before funcs
> 
> > + * @timings: timing specification for the bridge; optional (may be NULL)
> > + * @driver_private: pointer to the bridge driver internal context (may be 
> > NULL)
> 
> I'm not too sure about the last two parameters. Having NULL, NULL in
> most callers is confusing, and having a void * as one of the parameters
> means that the compiler won't catch errors if the two parameters are
> reversed. I think this is quite error prone.
> 
> There are very few drivers using driver_private (I count 6 of them, with
> 2 additional drivers that set driver_private but never use it). How
> about embedding the bridge structure in those 6 drivers and getting rid
> of the field altogether ? This could be part of a separate series, but
> in any case I'd drop driver_private from drm_bridge_init().

Ok, I'll do that first before refreshing this series.

> 
> > + */
> > +void drm_bridge_init(struct drm_bridge *bridge, struct device *dev,
> > +const struct drm_bridge_funcs *funcs,
> > +const struct drm_bridge_timings *timings,
> > +void *driver_private)
> > +{
> > +   WARN_ON(!funcs || !dev);
> > +
> > +   bridge->dev = NULL;
> 
> NULL ? Shouldn't this be dev ?

Hehe, Daniel got caught on that one, too :). This is the drm_device pointer
for the bound consumer, not the struct device that the bridge's lifetime
is tied to. I was planning to rename them with my (eventual) device_links
addition (some discussion around it here:
https://patchwork.freedesktop.org/patch/342472/?series=70039=1).

I guess if I do the drm_device part of the rename first, this patch will
look less confusing, so I'll do that too.

> 
> > +   bridge->encoder = NULL;
> > +   bridge->next = NULL;
> > +
> > +#ifdef CONFIG_OF
> > +   bridge->of_node = dev->of_node;
> > +#endif
> > +   bridge->timings = timings;
> > +   bridge->funcs = fun

Re: [PATCH v2 2/2] drm/komeda: Enable new product D32 support

2019-12-05 Thread Mihail Atanassov
On Thursday, 5 December 2019 08:53:02 GMT james qian wang (Arm Technology 
China) wrote:
> On Tue, Dec 03, 2019 at 09:59:57AM +0000, Mihail Atanassov wrote:
> > On Tuesday, 3 December 2019 06:46:06 GMT james qian wang (Arm Technology 
> > China) wrote:
> > > On Mon, Dec 02, 2019 at 11:07:52AM +, Mihail Atanassov wrote:
> > > > On Thursday, 21 November 2019 08:17:45 GMT james qian wang (Arm 
> > > > Technology China) wrote:
> > > > > D32 is simple version of D71, the difference is:
> > > > > - Only has one pipeline
> > > > > - Drop the periph block and merge it to GCU
> > > > > 
> > > > > v2: Rebase.
> > > > > 
> > > > > Signed-off-by: James Qian Wang (Arm Technology China) 
> > > > > 
> > > > > ---
> > > > >  .../drm/arm/display/include/malidp_product.h  |  3 +-
> > > > >  .../arm/display/komeda/d71/d71_component.c|  2 +-
> > > > >  .../gpu/drm/arm/display/komeda/d71/d71_dev.c  | 43 
> > > > > ---
> > > > >  .../gpu/drm/arm/display/komeda/d71/d71_regs.h | 13 ++
> > > > >  .../gpu/drm/arm/display/komeda/komeda_drv.c   |  1 +
> > > > >  5 files changed, 44 insertions(+), 18 deletions(-)
> > > > > 
> > > > > diff --git a/drivers/gpu/drm/arm/display/include/malidp_product.h 
> > > > > b/drivers/gpu/drm/arm/display/include/malidp_product.h
> > > > > index 96e2e4016250..dbd3d4765065 100644
> > > > > --- a/drivers/gpu/drm/arm/display/include/malidp_product.h
> > > > > +++ b/drivers/gpu/drm/arm/display/include/malidp_product.h
> > > > > @@ -18,7 +18,8 @@
> > > > >  #define MALIDP_CORE_ID_STATUS(__core_id) (((__u32)(__core_id)) & 
> > > > > 0xFF)
> > > > >  
> > > > >  /* Mali-display product IDs */
> > > > > -#define MALIDP_D71_PRODUCT_ID   0x0071
> > > > > +#define MALIDP_D71_PRODUCT_ID0x0071
> > > > > +#define MALIDP_D32_PRODUCT_ID0x0032
> > > > >  
> > > > >  union komeda_config_id {
> > > > >   struct {
> > > > > diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c 
> > > > > b/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
> > > > > index 6dadf4413ef3..c7f7e9c545c7 100644
> > > > > --- a/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
> > > > > +++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
> > > > > @@ -1274,7 +1274,7 @@ static int d71_timing_ctrlr_init(struct d71_dev 
> > > > > *d71,
> > > > >  
> > > > >   ctrlr = to_ctrlr(c);
> > > > >  
> > > > > - ctrlr->supports_dual_link = true;
> > > > > + ctrlr->supports_dual_link = d71->supports_dual_link;
> > > > >  
> > > > >   return 0;
> > > > >  }
> > > > > diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c 
> > > > > b/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> > > > > index 9b3bf353b6cc..2d429e310e5b 100644
> > > > > --- a/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> > > > > +++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> > > > > @@ -371,23 +371,33 @@ static int d71_enum_resources(struct komeda_dev 
> > > > > *mdev)
> > > > >   goto err_cleanup;
> > > > >   }
> > > > >  
> > > > > - /* probe PERIPH */
> > > > > + /* Only the legacy HW has the periph block, the newer merges 
> > > > > the periph
> > > > > +  * into GCU
> > > > > +  */
> > > > >   value = malidp_read32(d71->periph_addr, BLK_BLOCK_INFO);
> > > > > - if (BLOCK_INFO_BLK_TYPE(value) != D71_BLK_TYPE_PERIPH) {
> > > > > - DRM_ERROR("access blk periph but got blk: %d.\n",
> > > > > -   BLOCK_INFO_BLK_TYPE(value));
> > > > > - err = -EINVAL;
> > > > > - goto err_cleanup;
> > > > > + if (BLOCK_INFO_BLK_TYPE(value) != D71_BLK_TYPE_PERIPH)
> > > > > + d71->periph_addr = NULL;
> > > > > +
> > > > > + if (d71->periph_addr) {
> > > > > +  

[PATCH v2 03/28] drm/bridge/analogix: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change.

The setting of bridge->of_node by drm_bridge_init() in
analogix_dp_core.c is safe, since ->of_node isn't used directly and the
bridge isn't published with drm_bridge_add().

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/analogix/analogix-anx6345.c | 5 ++---
 drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c | 8 ++--
 drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 5 ++---
 3 files changed, 6 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c 
b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
index b4f3a923a52a..130d5c3a07ef 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
@@ -696,8 +696,6 @@ static int anx6345_i2c_probe(struct i2c_client *client,
 
mutex_init(>lock);
 
-   anx6345->bridge.of_node = client->dev.of_node;
-
anx6345->client = client;
i2c_set_clientdata(client, anx6345);
 
@@ -760,7 +758,8 @@ static int anx6345_i2c_probe(struct i2c_client *client,
/* Look for supported chip ID */
anx6345_poweron(anx6345);
if (anx6345_get_chip_id(anx6345)) {
-   anx6345->bridge.funcs = _bridge_funcs;
+   drm_bridge_init(>bridge, >dev,
+   _bridge_funcs, NULL, NULL);
drm_bridge_add(>bridge);
 
return 0;
diff --git a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c 
b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
index 41867be03751..e37892cdc9cf 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix-anx78xx.c
@@ -1214,10 +1214,6 @@ static int anx78xx_i2c_probe(struct i2c_client *client,
 
mutex_init(>lock);
 
-#if IS_ENABLED(CONFIG_OF)
-   anx78xx->bridge.of_node = client->dev.of_node;
-#endif
-
anx78xx->client = client;
i2c_set_clientdata(client, anx78xx);
 
@@ -1321,8 +1317,8 @@ static int anx78xx_i2c_probe(struct i2c_client *client,
goto err_poweroff;
}
 
-   anx78xx->bridge.funcs = _bridge_funcs;
-
+   drm_bridge_init(>bridge, >dev, _bridge_funcs,
+   NULL, NULL);
drm_bridge_add(>bridge);
 
/* If cable is pulled out, just poweroff and wait for HPD event */
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c 
b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index bb411fe52ae8..4042ba9a98d8 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -1585,9 +1585,8 @@ static int analogix_dp_create_bridge(struct drm_device 
*drm_dev,
 
dp->bridge = bridge;
 
-   bridge->driver_private = dp;
-   bridge->funcs = _dp_bridge_funcs;
-
+   drm_bridge_init(bridge, drm_dev->dev, _dp_bridge_funcs,
+   NULL, dp);
ret = drm_bridge_attach(dp->encoder, bridge, NULL);
if (ret) {
DRM_ERROR("failed to attach drm bridge\n");
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 00/28] drm/bridge: Consolidate initialization

2019-12-04 Thread Mihail Atanassov
Hi all,

I've dropped the fun parts of this series since they need more work, but
figured drm_bridge_init() as a concept is still valuable on its own (and
I think I'll need it to roll out device links for registered bridges),
so here goes.

v2:
 - expanded commit messages and added some extra bridge-related
   documentation (Daniel)
 - dropped v1 patches 29 and 30: 29 needs more work, and 30 depends on
   it
 - added all remaining drm_bridge implementers, found by searching for
   drm_bridge_funcs which is mandatory for any bridge; new uses in
   patches 3, 27, and 28 (Sam)
 - due to the above, I've decided to squash all analogix changes into
   one patch

---
v1 [https://patchwork.freedesktop.org/series/70039/] cover text below:

This series adds device links support to drm_bridge. The motivation
behind it is that a drm_bridge in a module could get removed under the
feet of the bridge user without warning, so we need a way to remove and
reprobe the client as needed to avoid peering into the void.

1: Add a drm_bridge_init() function which wraps all initialisation of
the structure prior to calling drm_bridge_add().

2-26,28: Apply the drm_bridge_init() refactor to every bridge that uses
drm_bridge_add().

27: Minor cleanup in rcar-du.

29: Add of_drm_find_bridge_devlink() which functions the same as
of_drm_find_bridge() plus adds a device device link from the owning
drm_device to the bridge device.

30: As a motivating example, convert komeda to exclusively use
drm_bridge for its pipe outputs; this isn't a regression in usability
any more since device links bring the same automatic remove/reprobe
feature as components.

Mihail Atanassov (28):
  drm: Introduce drm_bridge_init()
  drm/bridge: adv7511: Use drm_bridge_init()
  drm/bridge/analogix: Use drm_bridge_init()
  drm/bridge: cdns: Use drm_bridge_init()
  drm/bridge: dumb-vga-dac: Use drm_bridge_init()
  drm/bridge: lvds-encoder: Use drm_bridge_init()
  drm/bridge: megachips-stdp-ge-b850v3-fw: Use drm_bridge_init()
  drm/bridge: nxp-ptn3460: Use drm_bridge_init()
  drm/bridge: panel: Use drm_bridge_init()
  drm/bridge: ps8622: Use drm_bridge_init()
  drm/bridge: sii902x: Use drm_bridge_init()
  gpu: drm: bridge: sii9234: Use drm_bridge_init()
  drm/bridge: sil_sii8620: Use drm_bridge_init()
  drm/bridge: dw-hdmi: Use drm_bridge_init()
  drm/bridge/synopsys: dsi: Use drm_bridge_init()
  drm/bridge: tc358764: Use drm_bridge_init()
  drm/bridge: tc358767: Use drm_bridge_init()
  drm/bridge: thc63: Use drm_bridge_init()
  drm/bridge: ti-sn65dsi86: Use drm_bridge_init()
  drm/bridge: ti-tfp410: Use drm_bridge_init()
  drm/exynos: mic: Use drm_bridge_init()
  drm/i2c: tda998x: Use drm_bridge_init()
  drm/mcde: dsi: Use drm_bridge_init()
  drm/mediatek: hdmi: Use drm_bridge_init()
  drm: rcar-du: lvds: Use drm_bridge_init()
  drm: rcar-du: lvds: Don't set drm_bridge private pointer
  drm/sti: Use drm_bridge_init()
  drm/msm: Use drm_bridge_init()

 drivers/gpu/drm/bridge/adv7511/adv7511_drv.c  |  5 ++-
 .../drm/bridge/analogix/analogix-anx6345.c|  5 ++-
 .../drm/bridge/analogix/analogix-anx78xx.c|  8 ++---
 .../drm/bridge/analogix/analogix_dp_core.c|  5 ++-
 drivers/gpu/drm/bridge/cdns-dsi.c |  4 +--
 drivers/gpu/drm/bridge/dumb-vga-dac.c |  6 ++--
 drivers/gpu/drm/bridge/lvds-encoder.c |  7 ++--
 .../bridge/megachips-stdp-ge-b850v3-fw.c  |  4 +--
 drivers/gpu/drm/bridge/nxp-ptn3460.c  |  4 +--
 drivers/gpu/drm/bridge/panel.c|  7 ++--
 drivers/gpu/drm/bridge/parade-ps8622.c|  3 +-
 drivers/gpu/drm/bridge/sii902x.c  |  5 ++-
 drivers/gpu/drm/bridge/sii9234.c  |  3 +-
 drivers/gpu/drm/bridge/sil-sii8620.c  |  3 +-
 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c |  7 ++--
 drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c |  7 ++--
 drivers/gpu/drm/bridge/tc358764.c |  4 +--
 drivers/gpu/drm/bridge/tc358767.c |  3 +-
 drivers/gpu/drm/bridge/thc63lvd1024.c |  7 ++--
 drivers/gpu/drm/bridge/ti-sn65dsi86.c |  5 ++-
 drivers/gpu/drm/bridge/ti-tfp410.c|  5 ++-
 drivers/gpu/drm/drm_bridge.c  | 34 ++-
 drivers/gpu/drm/exynos/exynos_drm_mic.c   |  8 +
 drivers/gpu/drm/i2c/tda998x_drv.c |  6 +---
 drivers/gpu/drm/mcde/mcde_dsi.c   |  3 +-
 drivers/gpu/drm/mediatek/mtk_hdmi.c   |  4 +--
 drivers/gpu/drm/msm/dsi/dsi_manager.c |  4 +--
 drivers/gpu/drm/msm/edp/edp_bridge.c  |  3 +-
 drivers/gpu/drm/msm/hdmi/hdmi_bridge.c|  4 +--
 drivers/gpu/drm/rcar-du/rcar_lvds.c   |  5 ++-
 drivers/gpu/drm/sti/sti_dvo.c |  4 +--
 drivers/gpu/drm/sti/sti_hda.c |  3 +-
 drivers/gpu/drm/sti/sti_hdmi.c|  3 +-
 include/drm/drm_bridge.h  | 15 +++-
 34 files changed, 100 insertions(+), 103 deletions(-)

-- 
2.23.0

___
dri

[PATCH v2 22/28] drm/i2c: tda998x: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/i2c/tda998x_drv.c | 6 +-
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i2c/tda998x_drv.c 
b/drivers/gpu/drm/i2c/tda998x_drv.c
index a63790d32d75..f7dfa694aff7 100644
--- a/drivers/gpu/drm/i2c/tda998x_drv.c
+++ b/drivers/gpu/drm/i2c/tda998x_drv.c
@@ -1974,11 +1974,7 @@ static int tda998x_create(struct device *dev)
goto fail;
}
 
-   priv->bridge.funcs = _bridge_funcs;
-#ifdef CONFIG_OF
-   priv->bridge.of_node = dev->of_node;
-#endif
-
+   drm_bridge_init(>bridge, dev, _bridge_funcs, NULL, NULL);
drm_bridge_add(>bridge);
 
return 0;
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 26/28] drm: rcar-du: lvds: Don't set drm_bridge private pointer

2019-12-04 Thread Mihail Atanassov
No functional change: it's not used anywhere.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/rcar-du/rcar_lvds.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/rcar-du/rcar_lvds.c 
b/drivers/gpu/drm/rcar-du/rcar_lvds.c
index ac1f29bacfcb..168a718cbcbd 100644
--- a/drivers/gpu/drm/rcar-du/rcar_lvds.c
+++ b/drivers/gpu/drm/rcar-du/rcar_lvds.c
@@ -882,7 +882,7 @@ static int rcar_lvds_probe(struct platform_device *pdev)
return ret;
 
drm_bridge_init(>bridge, >dev, _lvds_bridge_ops,
-   NULL, lvds);
+   NULL, NULL);
 
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
lvds->mmio = devm_ioremap_resource(>dev, mem);
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 07/28] drm/bridge: megachips-stdpxxxx-ge-b850v3-fw: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/megachips-stdp-ge-b850v3-fw.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/bridge/megachips-stdp-ge-b850v3-fw.c 
b/drivers/gpu/drm/bridge/megachips-stdp-ge-b850v3-fw.c
index e8a49f6146c6..d567cd63810f 100644
--- a/drivers/gpu/drm/bridge/megachips-stdp-ge-b850v3-fw.c
+++ b/drivers/gpu/drm/bridge/megachips-stdp-ge-b850v3-fw.c
@@ -303,8 +303,8 @@ static int stdp4028_ge_b850v3_fw_probe(struct i2c_client 
*stdp4028_i2c,
i2c_set_clientdata(stdp4028_i2c, ge_b850v3_lvds_ptr);
 
/* drm bridge initialization */
-   ge_b850v3_lvds_ptr->bridge.funcs = _b850v3_lvds_funcs;
-   ge_b850v3_lvds_ptr->bridge.of_node = dev->of_node;
+   drm_bridge_init(_b850v3_lvds_ptr->bridge, dev, _b850v3_lvds_funcs,
+   NULL, NULL);
drm_bridge_add(_b850v3_lvds_ptr->bridge);
 
/* Clear pending interrupts since power up. */
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 25/28] drm: rcar-du: lvds: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/rcar-du/rcar_lvds.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/rcar-du/rcar_lvds.c 
b/drivers/gpu/drm/rcar-du/rcar_lvds.c
index 8c6c172bbf2e..ac1f29bacfcb 100644
--- a/drivers/gpu/drm/rcar-du/rcar_lvds.c
+++ b/drivers/gpu/drm/rcar-du/rcar_lvds.c
@@ -881,9 +881,8 @@ static int rcar_lvds_probe(struct platform_device *pdev)
if (ret < 0)
return ret;
 
-   lvds->bridge.driver_private = lvds;
-   lvds->bridge.funcs = _lvds_bridge_ops;
-   lvds->bridge.of_node = pdev->dev.of_node;
+   drm_bridge_init(>bridge, >dev, _lvds_bridge_ops,
+   NULL, lvds);
 
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
lvds->mmio = devm_ioremap_resource(>dev, mem);
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 21/28] drm/exynos: mic: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change: no logic depends on driver_private being NULL, so
it's safe to set it earlier in exynos_mic_probe.

Acked-by: Inki Dae 
Tested-by: Inki Dae 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/exynos/exynos_drm_mic.c | 8 +---
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_mic.c 
b/drivers/gpu/drm/exynos/exynos_drm_mic.c
index f41d75923557..caad348a5646 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_mic.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_mic.c
@@ -309,10 +309,6 @@ static const struct drm_bridge_funcs mic_bridge_funcs = {
 static int exynos_mic_bind(struct device *dev, struct device *master,
   void *data)
 {
-   struct exynos_mic *mic = dev_get_drvdata(dev);
-
-   mic->bridge.driver_private = mic;
-
return 0;
 }
 
@@ -422,9 +418,7 @@ static int exynos_mic_probe(struct platform_device *pdev)
 
platform_set_drvdata(pdev, mic);
 
-   mic->bridge.funcs = _bridge_funcs;
-   mic->bridge.of_node = dev->of_node;
-
+   drm_bridge_init(>bridge, dev, _bridge_funcs, NULL, mic);
drm_bridge_add(>bridge);
 
pm_runtime_enable(dev);
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 28/28] drm/msm: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change: drm_bridge_init() sets bridge->of_node, but that's
not used by msm anywhere, and the bridges aren't published with
drm_bridge_add() for it to matter.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/msm/dsi/dsi_manager.c  | 4 ++--
 drivers/gpu/drm/msm/edp/edp_bridge.c   | 3 +--
 drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 4 ++--
 3 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c 
b/drivers/gpu/drm/msm/dsi/dsi_manager.c
index 271aa7bbca92..ba54049a6338 100644
--- a/drivers/gpu/drm/msm/dsi/dsi_manager.c
+++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c
@@ -662,8 +662,8 @@ struct drm_bridge *msm_dsi_manager_bridge_init(u8 id)
encoder = msm_dsi->encoder;
 
bridge = _bridge->base;
-   bridge->funcs = _mgr_bridge_funcs;
-
+   drm_bridge_init(bridge, msm_dsi->dev->dev, _mgr_bridge_funcs,
+   NULL, NULL);
ret = drm_bridge_attach(encoder, bridge, NULL);
if (ret)
goto fail;
diff --git a/drivers/gpu/drm/msm/edp/edp_bridge.c 
b/drivers/gpu/drm/msm/edp/edp_bridge.c
index 2950bba4aca9..53d4dc591bd2 100644
--- a/drivers/gpu/drm/msm/edp/edp_bridge.c
+++ b/drivers/gpu/drm/msm/edp/edp_bridge.c
@@ -89,8 +89,7 @@ struct drm_bridge *msm_edp_bridge_init(struct msm_edp *edp)
edp_bridge->edp = edp;
 
bridge = _bridge->base;
-   bridge->funcs = _bridge_funcs;
-
+   drm_bridge_init(bridge, edp->dev->dev, _bridge_funcs, NULL, NULL);
ret = drm_bridge_attach(edp->encoder, bridge, NULL);
if (ret)
goto fail;
diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c 
b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c
index ba81338a9bf8..d038599279bc 100644
--- a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c
+++ b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c
@@ -285,8 +285,8 @@ struct drm_bridge *msm_hdmi_bridge_init(struct hdmi *hdmi)
hdmi_bridge->hdmi = hdmi;
 
bridge = _bridge->base;
-   bridge->funcs = _hdmi_bridge_funcs;
-
+   drm_bridge_init(bridge, hdmi->dev->dev, _hdmi_bridge_funcs,
+   NULL, NULL);
ret = drm_bridge_attach(hdmi->encoder, bridge, NULL);
if (ret)
goto fail;
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 11/28] drm/bridge: sii902x: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/sii902x.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/bridge/sii902x.c b/drivers/gpu/drm/bridge/sii902x.c
index b70e8c5cf2e1..2a9db621484d 100644
--- a/drivers/gpu/drm/bridge/sii902x.c
+++ b/drivers/gpu/drm/bridge/sii902x.c
@@ -1017,9 +1017,8 @@ static int sii902x_probe(struct i2c_client *client,
return ret;
}
 
-   sii902x->bridge.funcs = _bridge_funcs;
-   sii902x->bridge.of_node = dev->of_node;
-   sii902x->bridge.timings = _sii902x_timings;
+   drm_bridge_init(>bridge, dev, _bridge_funcs,
+   _sii902x_timings, NULL);
drm_bridge_add(>bridge);
 
sii902x_audio_codec_init(sii902x, dev);
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 24/28] drm/mediatek: hdmi: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/mediatek/mtk_hdmi.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_hdmi.c 
b/drivers/gpu/drm/mediatek/mtk_hdmi.c
index f684947c5243..9761a80674d9 100644
--- a/drivers/gpu/drm/mediatek/mtk_hdmi.c
+++ b/drivers/gpu/drm/mediatek/mtk_hdmi.c
@@ -1708,8 +1708,8 @@ static int mtk_drm_hdmi_probe(struct platform_device 
*pdev)
 
mtk_hdmi_register_audio_driver(dev);
 
-   hdmi->bridge.funcs = _hdmi_bridge_funcs;
-   hdmi->bridge.of_node = pdev->dev.of_node;
+   drm_bridge_init(>bridge, >dev, _hdmi_bridge_funcs,
+   NULL, NULL);
drm_bridge_add(>bridge);
 
ret = mtk_hdmi_clk_enable_audio(hdmi);
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 23/28] drm/mcde: dsi: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change.

Acked-by: Linus Walleij 
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/mcde/mcde_dsi.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/mcde/mcde_dsi.c b/drivers/gpu/drm/mcde/mcde_dsi.c
index 42fff811653e..d9b9253acccf 100644
--- a/drivers/gpu/drm/mcde/mcde_dsi.c
+++ b/drivers/gpu/drm/mcde/mcde_dsi.c
@@ -955,8 +955,7 @@ static int mcde_dsi_bind(struct device *dev, struct device 
*master,
d->bridge_out = bridge;
 
/* Create a bridge for this DSI channel */
-   d->bridge.funcs = _dsi_bridge_funcs;
-   d->bridge.of_node = dev->of_node;
+   drm_bridge_init(>bridge, dev, _dsi_bridge_funcs, NULL, NULL);
drm_bridge_add(>bridge);
 
/* TODO: first come first serve, use a list */
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 14/28] drm/bridge/synopsys: dw-hdmi: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 7 ++-
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c 
b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index dbe38a54870b..6c71ffc9df5a 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -2898,11 +2898,8 @@ __dw_hdmi_probe(struct platform_device *pdev,
hdmi->ddc = NULL;
}
 
-   hdmi->bridge.driver_private = hdmi;
-   hdmi->bridge.funcs = _hdmi_bridge_funcs;
-#ifdef CONFIG_OF
-   hdmi->bridge.of_node = pdev->dev.of_node;
-#endif
+   drm_bridge_init(>bridge, >dev, _hdmi_bridge_funcs,
+   NULL, hdmi);
 
memset(, 0, sizeof(pdevinfo));
pdevinfo.parent = dev;
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 18/28] drm/bridge: thc63: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/thc63lvd1024.c | 7 ++-
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/bridge/thc63lvd1024.c 
b/drivers/gpu/drm/bridge/thc63lvd1024.c
index 3d74129b2995..abe806db5f4d 100644
--- a/drivers/gpu/drm/bridge/thc63lvd1024.c
+++ b/drivers/gpu/drm/bridge/thc63lvd1024.c
@@ -218,11 +218,8 @@ static int thc63_probe(struct platform_device *pdev)
if (ret)
return ret;
 
-   thc63->bridge.driver_private = thc63;
-   thc63->bridge.of_node = pdev->dev.of_node;
-   thc63->bridge.funcs = _bridge_func;
-   thc63->bridge.timings = >timings;
-
+   drm_bridge_init(>bridge, >dev, _bridge_func,
+   >timings, thc63);
drm_bridge_add(>bridge);
 
return 0;
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 12/28] gpu: drm: bridge: sii9234: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/sii9234.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/bridge/sii9234.c b/drivers/gpu/drm/bridge/sii9234.c
index f81f81b7051f..bfd3832baa1a 100644
--- a/drivers/gpu/drm/bridge/sii9234.c
+++ b/drivers/gpu/drm/bridge/sii9234.c
@@ -925,8 +925,7 @@ static int sii9234_probe(struct i2c_client *client,
 
i2c_set_clientdata(client, ctx);
 
-   ctx->bridge.funcs = _bridge_funcs;
-   ctx->bridge.of_node = dev->of_node;
+   drm_bridge_init(>bridge, dev, _bridge_funcs, NULL, NULL);
drm_bridge_add(>bridge);
 
sii9234_cable_in(ctx);
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 08/28] drm/bridge: nxp-ptn3460: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/nxp-ptn3460.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/bridge/nxp-ptn3460.c 
b/drivers/gpu/drm/bridge/nxp-ptn3460.c
index 57ff01339559..2656a188b434 100644
--- a/drivers/gpu/drm/bridge/nxp-ptn3460.c
+++ b/drivers/gpu/drm/bridge/nxp-ptn3460.c
@@ -320,8 +320,8 @@ static int ptn3460_probe(struct i2c_client *client,
return ret;
}
 
-   ptn_bridge->bridge.funcs = _bridge_funcs;
-   ptn_bridge->bridge.of_node = dev->of_node;
+   drm_bridge_init(_bridge->bridge, dev, _bridge_funcs,
+   NULL, NULL);
drm_bridge_add(_bridge->bridge);
 
i2c_set_clientdata(client, ptn_bridge);
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 05/28] drm/bridge: dumb-vga-dac: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/dumb-vga-dac.c | 6 ++
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/bridge/dumb-vga-dac.c 
b/drivers/gpu/drm/bridge/dumb-vga-dac.c
index cc33dc411b9e..896f27272e38 100644
--- a/drivers/gpu/drm/bridge/dumb-vga-dac.c
+++ b/drivers/gpu/drm/bridge/dumb-vga-dac.c
@@ -205,10 +205,8 @@ static int dumb_vga_probe(struct platform_device *pdev)
}
}
 
-   vga->bridge.funcs = _vga_bridge_funcs;
-   vga->bridge.of_node = pdev->dev.of_node;
-   vga->bridge.timings = of_device_get_match_data(>dev);
-
+   drm_bridge_init(>bridge, >dev, _vga_bridge_funcs,
+   of_device_get_match_data(>dev), NULL);
drm_bridge_add(>bridge);
 
return 0;
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 27/28] drm/sti: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change.

v2:
 - Also apply drm_bridge_init() in sti_hdmi.c and sti_hda.c (Sam,
   Benjamin)

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/sti/sti_dvo.c  | 4 +---
 drivers/gpu/drm/sti/sti_hda.c  | 3 +--
 drivers/gpu/drm/sti/sti_hdmi.c | 3 +--
 3 files changed, 3 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/sti/sti_dvo.c b/drivers/gpu/drm/sti/sti_dvo.c
index 68289b0b063a..20a3956b33bc 100644
--- a/drivers/gpu/drm/sti/sti_dvo.c
+++ b/drivers/gpu/drm/sti/sti_dvo.c
@@ -462,9 +462,7 @@ static int sti_dvo_bind(struct device *dev, struct device 
*master, void *data)
if (!bridge)
return -ENOMEM;
 
-   bridge->driver_private = dvo;
-   bridge->funcs = _dvo_bridge_funcs;
-   bridge->of_node = dvo->dev.of_node;
+   drm_bridge_init(bridge, >dev, _dvo_bridge_funcs, NULL, dvo);
drm_bridge_add(bridge);
 
err = drm_bridge_attach(encoder, bridge, NULL);
diff --git a/drivers/gpu/drm/sti/sti_hda.c b/drivers/gpu/drm/sti/sti_hda.c
index 8f7bf33815fd..c7296e354a34 100644
--- a/drivers/gpu/drm/sti/sti_hda.c
+++ b/drivers/gpu/drm/sti/sti_hda.c
@@ -699,8 +699,7 @@ static int sti_hda_bind(struct device *dev, struct device 
*master, void *data)
if (!bridge)
return -ENOMEM;
 
-   bridge->driver_private = hda;
-   bridge->funcs = _hda_bridge_funcs;
+   drm_bridge_init(bridge, dev, _hda_bridge_funcs, NULL, hda);
drm_bridge_attach(encoder, bridge, NULL);
 
connector->encoder = encoder;
diff --git a/drivers/gpu/drm/sti/sti_hdmi.c b/drivers/gpu/drm/sti/sti_hdmi.c
index 814560ead4e1..c9ae3e18fa5d 100644
--- a/drivers/gpu/drm/sti/sti_hdmi.c
+++ b/drivers/gpu/drm/sti/sti_hdmi.c
@@ -1279,8 +1279,7 @@ static int sti_hdmi_bind(struct device *dev, struct 
device *master, void *data)
if (!bridge)
return -EINVAL;
 
-   bridge->driver_private = hdmi;
-   bridge->funcs = _hdmi_bridge_funcs;
+   drm_bridge_init(bridge, dev, _hdmi_bridge_funcs, NULL, hdmi);
drm_bridge_attach(encoder, bridge, NULL);
 
connector->encoder = encoder;
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 17/28] drm/bridge: tc358767: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/tc358767.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c 
b/drivers/gpu/drm/bridge/tc358767.c
index 8029478ffebb..7846c1925cbb 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -1671,8 +1671,7 @@ static int tc_probe(struct i2c_client *client, const 
struct i2c_device_id *id)
if (ret)
return ret;
 
-   tc->bridge.funcs = _bridge_funcs;
-   tc->bridge.of_node = dev->of_node;
+   drm_bridge_init(>bridge, dev, _bridge_funcs, NULL, NULL);
drm_bridge_add(>bridge);
 
i2c_set_clientdata(client, tc);
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 09/28] drm/bridge: panel: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/panel.c | 7 ++-
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/bridge/panel.c b/drivers/gpu/drm/bridge/panel.c
index f4e293e7cf64..91d68d0337cc 100644
--- a/drivers/gpu/drm/bridge/panel.c
+++ b/drivers/gpu/drm/bridge/panel.c
@@ -192,11 +192,8 @@ struct drm_bridge *drm_panel_bridge_add_typed(struct 
drm_panel *panel,
panel_bridge->connector_type = connector_type;
panel_bridge->panel = panel;
 
-   panel_bridge->bridge.funcs = _bridge_bridge_funcs;
-#ifdef CONFIG_OF
-   panel_bridge->bridge.of_node = panel->dev->of_node;
-#endif
-
+   drm_bridge_init(_bridge->bridge, panel->dev,
+   _bridge_bridge_funcs, NULL, NULL);
drm_bridge_add(_bridge->bridge);
 
return _bridge->bridge;
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 19/28] drm/bridge: ti-sn65dsi86: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/ti-sn65dsi86.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/bridge/ti-sn65dsi86.c 
b/drivers/gpu/drm/bridge/ti-sn65dsi86.c
index 43abf01ebd4c..4e236b46f913 100644
--- a/drivers/gpu/drm/bridge/ti-sn65dsi86.c
+++ b/drivers/gpu/drm/bridge/ti-sn65dsi86.c
@@ -765,9 +765,8 @@ static int ti_sn_bridge_probe(struct i2c_client *client,
pdata->aux.transfer = ti_sn_aux_transfer;
drm_dp_aux_register(>aux);
 
-   pdata->bridge.funcs = _sn_bridge_funcs;
-   pdata->bridge.of_node = client->dev.of_node;
-
+   drm_bridge_init(>bridge, >dev, _sn_bridge_funcs,
+   NULL, NULL);
drm_bridge_add(>bridge);
 
ti_sn_debugfs_init(pdata);
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 13/28] drm/bridge: sil_sii8620: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/sil-sii8620.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/bridge/sil-sii8620.c 
b/drivers/gpu/drm/bridge/sil-sii8620.c
index 4c0eef406eb1..482dc2291350 100644
--- a/drivers/gpu/drm/bridge/sil-sii8620.c
+++ b/drivers/gpu/drm/bridge/sil-sii8620.c
@@ -2337,8 +2337,7 @@ static int sii8620_probe(struct i2c_client *client,
 
i2c_set_clientdata(client, ctx);
 
-   ctx->bridge.funcs = _bridge_funcs;
-   ctx->bridge.of_node = dev->of_node;
+   drm_bridge_init(>bridge, dev, _bridge_funcs, NULL, NULL);
drm_bridge_add(>bridge);
 
if (!ctx->extcon)
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 20/28] drm/bridge: ti-tfp410: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/ti-tfp410.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/bridge/ti-tfp410.c 
b/drivers/gpu/drm/bridge/ti-tfp410.c
index aa3198dc9903..377eca989ff3 100644
--- a/drivers/gpu/drm/bridge/ti-tfp410.c
+++ b/drivers/gpu/drm/bridge/ti-tfp410.c
@@ -328,9 +328,8 @@ static int tfp410_init(struct device *dev, bool i2c)
return -ENOMEM;
dev_set_drvdata(dev, dvi);
 
-   dvi->bridge.funcs = _bridge_funcs;
-   dvi->bridge.of_node = dev->of_node;
-   dvi->bridge.timings = >timings;
+   drm_bridge_init(>bridge, dev, _bridge_funcs, >timings,
+   NULL);
dvi->dev = dev;
 
ret = tfp410_parse_timings(dvi, i2c);
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 15/28] drm/bridge/synopsys: dsi: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c | 7 ++-
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c 
b/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
index b6e793bb653c..051f9aaf5867 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
@@ -1052,11 +1052,8 @@ __dw_mipi_dsi_probe(struct platform_device *pdev,
return ERR_PTR(ret);
}
 
-   dsi->bridge.driver_private = dsi;
-   dsi->bridge.funcs = _mipi_dsi_bridge_funcs;
-#ifdef CONFIG_OF
-   dsi->bridge.of_node = pdev->dev.of_node;
-#endif
+   drm_bridge_init(>bridge, >dev, _mipi_dsi_bridge_funcs,
+   NULL, dsi);
 
return dsi;
 }
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 16/28] drm/bridge: tc358764: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/tc358764.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358764.c 
b/drivers/gpu/drm/bridge/tc358764.c
index db298f550a5a..861d4df687ee 100644
--- a/drivers/gpu/drm/bridge/tc358764.c
+++ b/drivers/gpu/drm/bridge/tc358764.c
@@ -457,9 +457,7 @@ static int tc358764_probe(struct mipi_dsi_device *dsi)
if (ret < 0)
return ret;
 
-   ctx->bridge.funcs = _bridge_funcs;
-   ctx->bridge.of_node = dev->of_node;
-
+   drm_bridge_init(>bridge, dev, _bridge_funcs, NULL, NULL);
drm_bridge_add(>bridge);
 
ret = mipi_dsi_attach(dsi);
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 10/28] drm/bridge: ps8622: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/parade-ps8622.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/bridge/parade-ps8622.c 
b/drivers/gpu/drm/bridge/parade-ps8622.c
index b7a72dfdcac3..8454dbb238bb 100644
--- a/drivers/gpu/drm/bridge/parade-ps8622.c
+++ b/drivers/gpu/drm/bridge/parade-ps8622.c
@@ -588,8 +588,7 @@ static int ps8622_probe(struct i2c_client *client,
ps8622->bl->props.brightness = PS8622_MAX_BRIGHTNESS;
}
 
-   ps8622->bridge.funcs = _bridge_funcs;
-   ps8622->bridge.of_node = dev->of_node;
+   drm_bridge_init(>bridge, dev, _bridge_funcs, NULL, NULL);
drm_bridge_add(>bridge);
 
i2c_set_clientdata(client, ps8622);
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 04/28] drm/bridge: cdns: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/cdns-dsi.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/bridge/cdns-dsi.c 
b/drivers/gpu/drm/bridge/cdns-dsi.c
index 3a5bd4e7fd1e..58b2aa8b6c24 100644
--- a/drivers/gpu/drm/bridge/cdns-dsi.c
+++ b/drivers/gpu/drm/bridge/cdns-dsi.c
@@ -1233,8 +1233,8 @@ static int cdns_dsi_drm_probe(struct platform_device 
*pdev)
 * CDNS_DPI_INPUT.
 */
input->id = CDNS_DPI_INPUT;
-   input->bridge.funcs = _dsi_bridge_funcs;
-   input->bridge.of_node = pdev->dev.of_node;
+   drm_bridge_init(>bridge, >dev, _dsi_bridge_funcs,
+   NULL, NULL);
 
/* Mask all interrupts before registering the IRQ handler. */
writel(0, dsi->regs + MCTL_MAIN_STS_CTL);
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 01/28] drm: Introduce drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
A simple convenience function to initialize the struct drm_bridge. The
goal is to standardize initialization for any bridge registered with
drm_bridge_add() so that we can later add device links for consumers of
those bridges.

v2:
 - s/WARN_ON(!funcs)/WARN_ON(!funcs || !dev)/ as suggested by Daniel
 - expand on some kerneldoc comments as suggested by Daniel
 - update commit message as suggested by Daniel

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/drm_bridge.c | 34 +-
 include/drm/drm_bridge.h | 15 ++-
 2 files changed, 47 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c
index cba537c99e43..50e1c1b46e20 100644
--- a/drivers/gpu/drm/drm_bridge.c
+++ b/drivers/gpu/drm/drm_bridge.c
@@ -64,7 +64,10 @@ static DEFINE_MUTEX(bridge_lock);
 static LIST_HEAD(bridge_list);
 
 /**
- * drm_bridge_add - add the given bridge to the global bridge list
+ * drm_bridge_add - add the given bridge to the global bridge list.
+ *
+ * Drivers should call drm_bridge_init() prior adding it to the list.
+ * Drivers should call drm_bridge_remove() to clean up the bridge list.
  *
  * @bridge: bridge control structure
  */
@@ -89,6 +92,35 @@ void drm_bridge_remove(struct drm_bridge *bridge)
 }
 EXPORT_SYMBOL(drm_bridge_remove);
 
+/**
+ * drm_bridge_init - initialise a drm_bridge structure
+ *
+ * @bridge: bridge control structure
+ * @funcs: control functions
+ * @dev: device associated with this drm_bridge
+ * @timings: timing specification for the bridge; optional (may be NULL)
+ * @driver_private: pointer to the bridge driver internal context (may be NULL)
+ */
+void drm_bridge_init(struct drm_bridge *bridge, struct device *dev,
+const struct drm_bridge_funcs *funcs,
+const struct drm_bridge_timings *timings,
+void *driver_private)
+{
+   WARN_ON(!funcs || !dev);
+
+   bridge->dev = NULL;
+   bridge->encoder = NULL;
+   bridge->next = NULL;
+
+#ifdef CONFIG_OF
+   bridge->of_node = dev->of_node;
+#endif
+   bridge->timings = timings;
+   bridge->funcs = funcs;
+   bridge->driver_private = driver_private;
+}
+EXPORT_SYMBOL(drm_bridge_init);
+
 /**
  * drm_bridge_attach - attach the bridge to an encoder's chain
  *
diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h
index c0a2286a81e9..949e4f401a53 100644
--- a/include/drm/drm_bridge.h
+++ b/include/drm/drm_bridge.h
@@ -373,7 +373,16 @@ struct drm_bridge_timings {
 };
 
 /**
- * struct drm_bridge - central DRM bridge control structure
+ * struct drm_bridge - central DRM bridge control structure.
+ *
+ * Bridge drivers should call drm_bridge_init() to initialize a bridge
+ * driver, and then register it with drm_bridge_add().
+ *
+ * Users of bridges link a bridge driver into their overall display output
+ * pipeline by calling drm_bridge_attach().
+ *
+ * Modular drivers in OF systems can query the list of registered bridges
+ * with of_drm_find_bridge().
  */
 struct drm_bridge {
/** @dev: DRM device this bridge belongs to */
@@ -402,6 +411,10 @@ struct drm_bridge {
 
 void drm_bridge_add(struct drm_bridge *bridge);
 void drm_bridge_remove(struct drm_bridge *bridge);
+void drm_bridge_init(struct drm_bridge *bridge, struct device *dev,
+const struct drm_bridge_funcs *funcs,
+const struct drm_bridge_timings *timings,
+void *driver_private);
 struct drm_bridge *of_drm_find_bridge(struct device_node *np);
 int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
  struct drm_bridge *previous);
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 02/28] drm/bridge: adv7511: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c 
b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
index 9e13e466e72c..73600d8766f8 100644
--- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
+++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
@@ -1216,9 +1216,8 @@ static int adv7511_probe(struct i2c_client *i2c, const 
struct i2c_device_id *id)
if (ret)
goto err_unregister_cec;
 
-   adv7511->bridge.funcs = _bridge_funcs;
-   adv7511->bridge.of_node = dev->of_node;
-
+   drm_bridge_init(>bridge, dev, _bridge_funcs,
+   NULL, NULL);
drm_bridge_add(>bridge);
 
adv7511_audio_init(dev, adv7511);
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2 06/28] drm/bridge: lvds-encoder: Use drm_bridge_init()

2019-12-04 Thread Mihail Atanassov
No functional change.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/lvds-encoder.c | 7 +++
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/bridge/lvds-encoder.c 
b/drivers/gpu/drm/bridge/lvds-encoder.c
index e2132a8d5106..155406510416 100644
--- a/drivers/gpu/drm/bridge/lvds-encoder.c
+++ b/drivers/gpu/drm/bridge/lvds-encoder.c
@@ -112,11 +112,10 @@ static int lvds_encoder_probe(struct platform_device 
*pdev)
return PTR_ERR(lvds_encoder->panel_bridge);
 
/* The panel_bridge bridge is attached to the panel's of_node,
-* but we need a bridge attached to our of_node for our user
-* to look up.
+* but we need a bridge attached to our of_node (in dev->of_node)
+* for our user to look up.
 */
-   lvds_encoder->bridge.of_node = dev->of_node;
-   lvds_encoder->bridge.funcs = 
+   drm_bridge_init(_encoder->bridge, dev, , NULL, NULL);
drm_bridge_add(_encoder->bridge);
 
platform_set_drvdata(pdev, lvds_encoder);
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Re: [PATCH v2 2/2] drm/komeda: Enable new product D32 support

2019-12-03 Thread Mihail Atanassov
On Tuesday, 3 December 2019 06:46:06 GMT james qian wang (Arm Technology China) 
wrote:
> On Mon, Dec 02, 2019 at 11:07:52AM +0000, Mihail Atanassov wrote:
> > On Thursday, 21 November 2019 08:17:45 GMT james qian wang (Arm Technology 
> > China) wrote:
> > > D32 is simple version of D71, the difference is:
> > > - Only has one pipeline
> > > - Drop the periph block and merge it to GCU
> > > 
> > > v2: Rebase.
> > > 
> > > Signed-off-by: James Qian Wang (Arm Technology China) 
> > > 
> > > ---
> > >  .../drm/arm/display/include/malidp_product.h  |  3 +-
> > >  .../arm/display/komeda/d71/d71_component.c|  2 +-
> > >  .../gpu/drm/arm/display/komeda/d71/d71_dev.c  | 43 ---
> > >  .../gpu/drm/arm/display/komeda/d71/d71_regs.h | 13 ++
> > >  .../gpu/drm/arm/display/komeda/komeda_drv.c   |  1 +
> > >  5 files changed, 44 insertions(+), 18 deletions(-)
> > > 
> > > diff --git a/drivers/gpu/drm/arm/display/include/malidp_product.h 
> > > b/drivers/gpu/drm/arm/display/include/malidp_product.h
> > > index 96e2e4016250..dbd3d4765065 100644
> > > --- a/drivers/gpu/drm/arm/display/include/malidp_product.h
> > > +++ b/drivers/gpu/drm/arm/display/include/malidp_product.h
> > > @@ -18,7 +18,8 @@
> > >  #define MALIDP_CORE_ID_STATUS(__core_id) (((__u32)(__core_id)) & 
> > > 0xFF)
> > >  
> > >  /* Mali-display product IDs */
> > > -#define MALIDP_D71_PRODUCT_ID   0x0071
> > > +#define MALIDP_D71_PRODUCT_ID0x0071
> > > +#define MALIDP_D32_PRODUCT_ID0x0032
> > >  
> > >  union komeda_config_id {
> > >   struct {
> > > diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c 
> > > b/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
> > > index 6dadf4413ef3..c7f7e9c545c7 100644
> > > --- a/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
> > > +++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
> > > @@ -1274,7 +1274,7 @@ static int d71_timing_ctrlr_init(struct d71_dev 
> > > *d71,
> > >  
> > >   ctrlr = to_ctrlr(c);
> > >  
> > > - ctrlr->supports_dual_link = true;
> > > + ctrlr->supports_dual_link = d71->supports_dual_link;
> > >  
> > >   return 0;
> > >  }
> > > diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c 
> > > b/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> > > index 9b3bf353b6cc..2d429e310e5b 100644
> > > --- a/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> > > +++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> > > @@ -371,23 +371,33 @@ static int d71_enum_resources(struct komeda_dev 
> > > *mdev)
> > >   goto err_cleanup;
> > >   }
> > >  
> > > - /* probe PERIPH */
> > > + /* Only the legacy HW has the periph block, the newer merges the periph
> > > +  * into GCU
> > > +  */
> > >   value = malidp_read32(d71->periph_addr, BLK_BLOCK_INFO);
> > > - if (BLOCK_INFO_BLK_TYPE(value) != D71_BLK_TYPE_PERIPH) {
> > > - DRM_ERROR("access blk periph but got blk: %d.\n",
> > > -   BLOCK_INFO_BLK_TYPE(value));
> > > - err = -EINVAL;
> > > - goto err_cleanup;
> > > + if (BLOCK_INFO_BLK_TYPE(value) != D71_BLK_TYPE_PERIPH)
> > > + d71->periph_addr = NULL;
> > > +
> > > + if (d71->periph_addr) {
> > > + /* probe PERIPHERAL in legacy HW */
> > > + value = malidp_read32(d71->periph_addr, 
> > > PERIPH_CONFIGURATION_ID);
> > > +
> > > + d71->max_line_size  = value & PERIPH_MAX_LINE_SIZE ? 4096 : 
> > > 2048;
> > > + d71->max_vsize  = 4096;
> > > + d71->num_rich_layers= value & PERIPH_NUM_RICH_LAYERS ? 2 : 
> > > 1;
> > > + d71->supports_dual_link = !!(value & PERIPH_SPLIT_EN);
> > > + d71->integrates_tbu = !!(value & PERIPH_TBU_EN);
> > > + } else {
> > > + value = malidp_read32(d71->gcu_addr, GCU_CONFIGURATION_ID0);
> > > + d71->max_line_size  = GCU_MAX_LINE_SIZE(value);
> > > + d71->max_vsize  = GCU_MAX_NUM_LINES(value);
> > > +
> > > + value = malidp_read32(d71->gcu_addr, GCU_CONFIGURATION_ID1);
> > > + d71->num_rich_layers= GCU_NUM_RICH_LAYERS(value);
> > &

Re: [PATCH v2 1/2] drm/komeda: Update the chip identify

2019-12-02 Thread Mihail Atanassov
of_node_cmp(child->name, "pipeline") == 0) {
> - ret = komeda_parse_pipe_dt(mdev, child);
> - if (ret) {
> - DRM_ERROR("parse pipeline dt error!\n");
> - of_node_put(child);
> - break;
> + if (of_node_name_eq(child, "pipeline")) {
> + of_property_read_u32(child, "reg", _id);
> + if (pipe_id >= mdev->n_pipelines) {
> + DRM_WARN("Skip the redundant DT node: 
> pipeline-%u.\n",
> +  pipe_id);
> + continue;
>   }
> + mdev->pipelines[pipe_id]->of_node = of_node_get(child);
>   }
>   }
>  
> + for (pipe_id = 0; pipe_id < mdev->n_pipelines; pipe_id++) {
> + pipe = mdev->pipelines[pipe_id];
> +
> + if (!pipe->of_node) {
> + DRM_ERROR("Omit DT node for pipeline-%d.\n", pipe->id);

[nit] "Omit DT node" doesn't sound like an error condition. How about:

"pipeline-%d doesn't have a DT node."

> + return -EINVAL;
> + }
> + ret = komeda_parse_pipe_dt(pipe);
> + if (ret)
> + return ret;
> + }
> +
>   mdev->side_by_side = !of_property_read_u32(np, "side_by_side_master",

Looks like this isn't based off drm-misc-next, and is instead based on
https://patchwork.freedesktop.org/patch/341867/

>  >side_by_side_master);
>  
> - return ret;
> + return 0;
>  }
>  
>  struct komeda_dev *komeda_dev_create(struct device *dev)
>  {
>   struct platform_device *pdev = to_platform_device(dev);
> - const struct komeda_product_data *product;
> + komeda_identify_func komeda_identify;
>   struct komeda_dev *mdev;
>   int err = 0;
>  
> - product = of_device_get_match_data(dev);
> - if (!product)
> + komeda_identify = of_device_get_match_data(dev);
> + if (!komeda_identify)
>   return ERR_PTR(-ENODEV);
>  
>   mdev = devm_kzalloc(dev, sizeof(*mdev), GFP_KERNEL);
> @@ -221,11 +227,9 @@ struct komeda_dev *komeda_dev_create(struct device *dev)
>  
>   clk_prepare_enable(mdev->aclk);
>  
> - mdev->funcs = product->identify(mdev->reg_base, >chip);
> - if (!komeda_product_match(mdev, product->product_id)) {
> - DRM_ERROR("DT configured %x mismatch with real HW %x.\n",
> -   product->product_id,
> -   MALIDP_CORE_ID_PRODUCT_ID(mdev->chip.core_id));
> + mdev->funcs = komeda_identify(mdev->reg_base, >chip);
> + if (!mdev->funcs) {
> + DRM_ERROR("Failed to identify the HW.\n");
>   err = -ENODEV;
>   goto disable_clk;
>   }
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_dev.h 
> b/drivers/gpu/drm/arm/display/komeda/komeda_dev.h
> index 471604b42431..dacdb00153e9 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_dev.h
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_dev.h
> @@ -58,11 +58,6 @@
>   | KOMEDA_EVENT_MODE \
>   )
>  
> -/* malidp device id */
> -enum {
> - MALI_D71 = 0,
> -};
> -
>  /* pipeline DT ports */
>  enum {
>   KOMEDA_OF_PORT_OUTPUT   = 0,
> @@ -76,12 +71,6 @@ struct komeda_chip_info {
>   u32 bus_width;
>  };
>  
> -struct komeda_product_data {
> - u32 product_id;
> - const struct komeda_dev_funcs *(*identify)(u32 __iomem *reg,
> -  struct komeda_chip_info *info);
> -};
> -
>  struct komeda_dev;
>  
>  struct komeda_events {
> @@ -243,6 +232,9 @@ komeda_product_match(struct komeda_dev *mdev, u32 target)
>   return MALIDP_CORE_ID_PRODUCT_ID(mdev->chip.core_id) == target;
>  }
>  
> +typedef const struct komeda_dev_funcs *
> +(*komeda_identify_func)(u32 __iomem *reg, struct komeda_chip_info *chip);
> +
>  const struct komeda_dev_funcs *
>  d71_identify(u32 __iomem *reg, struct komeda_chip_info *chip);
>  
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c 
> b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
> index d6cc5d33..b7a1097c45c4 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
> @@ -123,15 +123,8 @@ static int komeda_platform_remove(struct platform_device 
> *pdev)
>   return 0;
>  }
>  
> -static const struct komeda_product_data komeda_products[] = {
> - [MALI_D71] = {
> - .product_id = MALIDP_D71_PRODUCT_ID,
> - .identify = d71_identify,
> - },
> -};
> -
>  static const struct of_device_id komeda_of_match[] = {
> - { .compatible = "arm,mali-d71", .data = _products[MALI_D71], },
> + { .compatible = "arm,mali-d71", .data = d71_identify, },
>   {},
>  };
>  
> 

With the above two fixed (i.e. feel free to ignore the bikeshed),
Reviewed-by: Mihail Atanassov 

-- 
Mihail



___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Re: [PATCH v2 2/2] drm/komeda: Enable new product D32 support

2019-12-02 Thread Mihail Atanassov
On Thursday, 21 November 2019 08:17:45 GMT james qian wang (Arm Technology 
China) wrote:
> D32 is simple version of D71, the difference is:
> - Only has one pipeline
> - Drop the periph block and merge it to GCU
> 
> v2: Rebase.
> 
> Signed-off-by: James Qian Wang (Arm Technology China) 
> 
> ---
>  .../drm/arm/display/include/malidp_product.h  |  3 +-
>  .../arm/display/komeda/d71/d71_component.c|  2 +-
>  .../gpu/drm/arm/display/komeda/d71/d71_dev.c  | 43 ---
>  .../gpu/drm/arm/display/komeda/d71/d71_regs.h | 13 ++
>  .../gpu/drm/arm/display/komeda/komeda_drv.c   |  1 +
>  5 files changed, 44 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/gpu/drm/arm/display/include/malidp_product.h 
> b/drivers/gpu/drm/arm/display/include/malidp_product.h
> index 96e2e4016250..dbd3d4765065 100644
> --- a/drivers/gpu/drm/arm/display/include/malidp_product.h
> +++ b/drivers/gpu/drm/arm/display/include/malidp_product.h
> @@ -18,7 +18,8 @@
>  #define MALIDP_CORE_ID_STATUS(__core_id) (((__u32)(__core_id)) & 0xFF)
>  
>  /* Mali-display product IDs */
> -#define MALIDP_D71_PRODUCT_ID   0x0071
> +#define MALIDP_D71_PRODUCT_ID0x0071
> +#define MALIDP_D32_PRODUCT_ID0x0032
>  
>  union komeda_config_id {
>   struct {
> diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c 
> b/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
> index 6dadf4413ef3..c7f7e9c545c7 100644
> --- a/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
> +++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_component.c
> @@ -1274,7 +1274,7 @@ static int d71_timing_ctrlr_init(struct d71_dev *d71,
>  
>   ctrlr = to_ctrlr(c);
>  
> - ctrlr->supports_dual_link = true;
> + ctrlr->supports_dual_link = d71->supports_dual_link;
>  
>   return 0;
>  }
> diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c 
> b/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> index 9b3bf353b6cc..2d429e310e5b 100644
> --- a/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> +++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> @@ -371,23 +371,33 @@ static int d71_enum_resources(struct komeda_dev *mdev)
>   goto err_cleanup;
>   }
>  
> - /* probe PERIPH */
> + /* Only the legacy HW has the periph block, the newer merges the periph
> +  * into GCU
> +  */
>   value = malidp_read32(d71->periph_addr, BLK_BLOCK_INFO);
> - if (BLOCK_INFO_BLK_TYPE(value) != D71_BLK_TYPE_PERIPH) {
> - DRM_ERROR("access blk periph but got blk: %d.\n",
> -   BLOCK_INFO_BLK_TYPE(value));
> - err = -EINVAL;
> - goto err_cleanup;
> + if (BLOCK_INFO_BLK_TYPE(value) != D71_BLK_TYPE_PERIPH)
> + d71->periph_addr = NULL;
> +
> + if (d71->periph_addr) {
> + /* probe PERIPHERAL in legacy HW */
> + value = malidp_read32(d71->periph_addr, 
> PERIPH_CONFIGURATION_ID);
> +
> + d71->max_line_size  = value & PERIPH_MAX_LINE_SIZE ? 4096 : 
> 2048;
> + d71->max_vsize  = 4096;
> + d71->num_rich_layers= value & PERIPH_NUM_RICH_LAYERS ? 2 : 
> 1;
> + d71->supports_dual_link = !!(value & PERIPH_SPLIT_EN);
> + d71->integrates_tbu = !!(value & PERIPH_TBU_EN);
> + } else {
> + value = malidp_read32(d71->gcu_addr, GCU_CONFIGURATION_ID0);
> + d71->max_line_size  = GCU_MAX_LINE_SIZE(value);
> + d71->max_vsize  = GCU_MAX_NUM_LINES(value);
> +
> + value = malidp_read32(d71->gcu_addr, GCU_CONFIGURATION_ID1);
> + d71->num_rich_layers= GCU_NUM_RICH_LAYERS(value);
> + d71->supports_dual_link = GCU_DISPLAY_SPLIT_EN(value);
> + d71->integrates_tbu = GCU_DISPLAY_TBU_EN(value);
>   }
>  
> - value = malidp_read32(d71->periph_addr, PERIPH_CONFIGURATION_ID);
> -
> - d71->max_line_size  = value & PERIPH_MAX_LINE_SIZE ? 4096 : 2048;
> - d71->max_vsize  = 4096;
> - d71->num_rich_layers= value & PERIPH_NUM_RICH_LAYERS ? 2 : 1;
> - d71->supports_dual_link = value & PERIPH_SPLIT_EN ? true : false;
> - d71->integrates_tbu = value & PERIPH_TBU_EN ? true : false;
> -
>   for (i = 0; i < d71->num_pipelines; i++) {
>   pipe = komeda_pipeline_add(mdev, sizeof(struct d71_pipeline),
>  _pipeline_funcs);
> @@ -415,7 +425,7 @@ static int d71_enum_resources(struct komeda_dev *mdev)
>   }
>  
>   /* loop the register blks and probe */
> - i = 2; /* exclude GCU and PERIPH */
> + i = 1; /* exclude GCU */
>   offset = D71_BLOCK_SIZE; /* skip GCU */
>   while (i < d71->num_blocks) {
>   blk_base = mdev->reg_base + (offset >> 2);
> @@ -425,9 +435,9 @@ static int d71_enum_resources(struct komeda_dev *mdev)
>   err = d71_probe_block(d71, , blk_base);
>   if (err)
> 

Re: [PATCH 29/30] drm/bridge: add support for device links to bridge

2019-11-28 Thread Mihail Atanassov
On Tuesday, 26 November 2019 14:35:34 GMT Daniel Vetter wrote:
> On Tue, Nov 26, 2019 at 01:16:26PM +0000, Mihail Atanassov wrote:
> > From: Russell King 
> > 
> > Bridge devices have been a potential for kernel oops as their lifetime
> > is independent of the DRM device that they are bound to.  Hence, if a
> > bridge device is unbound while the parent DRM device is using them, the
> > parent happily continues to use the bridge device, calling the driver
> > and accessing its objects that have been freed.
> > 
> > This can cause kernel memory corruption and kernel oops.
> > 
> > To control this, use device links to ensure that the parent DRM device
> > is unbound when the bridge device is unbound, and when the bridge
> > device is re-bound, automatically rebind the parent DRM device.
> > 
> > Signed-off-by: Russell King 
> > Tested-by: Mihail Atanassov 
> > [reworked to use drm_bridge_init() for setting bridge->device]
> > Signed-off-by: Mihail Atanassov 
> 
> So I thought the big plan was to put the device_link setup into
> drm_bridge_attach, so that it's done for everyone. And we could then
> slowly go through the existing drivers that use the component framework to
> get this handled correctly.
> 
> So my questions:
> - is there a problem if we add the device_link for everyone?

So after spending time looking at the code and thinking
about it, I'm slowly coming to the conclusion that getting device
links right for everyone in one go is a much bigger task than this
opt-in quick-fix here. I've hit, at the very least, the following
snags in trying to apply it universally:

panel_bridge - removing one via drm_of_panel_bridge_remove() uses
of_drm_find_bridge(), which would add a devlink at a very inopportune
time;

mipi_dsi_host - attach/detach, where e.g. dw-mipi-dsi.c handles bridge
creation/destruction, doesn't correspond directly to a struct device's
lifetime, so the device link would linger longer than is required;

others that add/remove bridges at times different from probe/remove
(drivers using the component framework?).

I think it'd still be valuable even with limiting the scope to drivers
that get their bridge in probe() and drop it in remove() for now, and
only roll it out as an opt-in. Thoughts?

I think to get it right we need to use the links' refcount, with e.g.
of_drm_find_bridge() giving you a refcount of 1, and bridge_detach()
maybe dropping the refcount, but I can envision ways where this breaks
too, so maybe just an of_drm_{get,put}_bridge()?

> - is there an issue if we only add it at drm_bridge_attach time? I kinda
>   assumed that it's not needed before that (EPROBE_DEFER should handle
>   load dependencies as before), but it could be that some drivers ask for
>   a bridge and then check more stuff and then drop the bridge without
>   calling drm_bridge_attach. We probably don't have a case like this yet,
>   but better robust than sorry.
> 
> Anyway, I scrolled through the bridge patches, looked all good, huge
> thanks for tackling this! Once we have some agreement on the bigger
> questions here I'll try to go through them and review.
> 
> Cheers, Daniel
> > ---
> >  drivers/gpu/drm/drm_bridge.c | 49 ++--
> >  include/drm/drm_bridge.h |  4 +++
> >  2 files changed, 40 insertions(+), 13 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c
> > index cbe680aa6eac..e1f8db84651a 100644
> > --- a/drivers/gpu/drm/drm_bridge.c
> > +++ b/drivers/gpu/drm/drm_bridge.c
> > @@ -26,6 +26,7 @@
> >  #include 
> >  
> >  #include 
> > +#include 
> >  #include 
> >  
> >  #include "drm_crtc_internal.h"
> > @@ -109,6 +110,7 @@ void drm_bridge_init(struct drm_bridge *bridge, struct 
> > device *dev,
> > bridge->encoder = NULL;
> > bridge->next = NULL;
> >  
> > +   bridge->device = dev;
> >  #ifdef CONFIG_OF
> > bridge->of_node = dev->of_node;
> >  #endif
> > @@ -492,6 +494,32 @@ void drm_atomic_bridge_enable(struct drm_bridge 
> > *bridge,
> >  EXPORT_SYMBOL(drm_atomic_bridge_enable);
> >  
> >  #ifdef CONFIG_OF
> > +static struct drm_bridge *drm_bridge_find(struct drm_device *dev,
> > + struct device_node *np, bool link)
> > +{
> > +   struct drm_bridge *bridge, *found = NULL;
> > +   struct device_link *dl;
> > +
> > +   mutex_lock(_lock);
> > +
> > +   list_for_each_entry(bridge, _list, list)
> > +   if (bridge->of_node == np) {
> > +   found = bridge;
> > +   break;
> &

[PATCH] drm/mediatek: Fix build break

2019-11-27 Thread Mihail Atanassov
Caused by file removal without adjusting the Makefile.

Fixes: d268f42e6856 ("drm/mediatek: don't open-code drm_gem_fb_create")
Cc: Daniel Vetter 
Cc: CK Hu 
Cc: Philipp Zabel 
Cc: Matthias Brugger 
Cc: linux-arm-ker...@lists.infradead.org
Cc: linux-media...@lists.infradead.org
Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/mediatek/Makefile | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/gpu/drm/mediatek/Makefile 
b/drivers/gpu/drm/mediatek/Makefile
index 8067a4be8311..5044dfb8e3d6 100644
--- a/drivers/gpu/drm/mediatek/Makefile
+++ b/drivers/gpu/drm/mediatek/Makefile
@@ -7,7 +7,6 @@ mediatek-drm-y := mtk_disp_color.o \
  mtk_drm_ddp.o \
  mtk_drm_ddp_comp.o \
  mtk_drm_drv.o \
- mtk_drm_fb.o \
  mtk_drm_gem.o \
  mtk_drm_plane.o \
  mtk_dsi.o \
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Re: [PATCH 01/30] drm: Introduce drm_bridge_init()

2019-11-27 Thread Mihail Atanassov
On Tuesday, 26 November 2019 19:24:45 GMT Sam Ravnborg wrote:
> Hi Mihail.

Hi Sam,

> 
> > Ack, but with one caveat: bridge->dev is the struct drm_device that is
> > the bridge client, we need to add a bridge->device (patch 29 in this
> > series) which is the struct device that will manage the bridge lifetime.
> Other places uses the variable name "drm" for a drm_device.
> This is less confusion than the "dev" name.
> 
> It seems a recent trend to use the variable name "drm" so you can find a
> lot of places using "dev".
> 
> bike-shedding - but also about readability.
> 
>   Sam
> 

I'm okay with the idea, I can do a follow-up patch or series for the
rename; I expect it would be a bit hefty to do it prior to this.

@Daniel, thoughts on s/bridge.dev/bridge.drm/ and
s/bridge.device/bridge.dev/ after this series?

-- 
Mihail



___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Re: [PATCH 28/30] drm/sti: sti_vdo: Use drm_bridge_init()

2019-11-27 Thread Mihail Atanassov
On Tuesday, 26 November 2019 19:37:40 GMT Sam Ravnborg wrote:
> Hi Mihail.

Hi Sam,

> 
> On Tue, Nov 26, 2019 at 01:16:26PM +0000, Mihail Atanassov wrote:
> > No functional change.
> > 
> > Signed-off-by: Mihail Atanassov 
> > ---
> >  drivers/gpu/drm/sti/sti_dvo.c | 4 +---
> >  1 file changed, 1 insertion(+), 3 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/sti/sti_dvo.c b/drivers/gpu/drm/sti/sti_dvo.c
> > index 68289b0b063a..20a3956b33bc 100644
> > --- a/drivers/gpu/drm/sti/sti_dvo.c
> > +++ b/drivers/gpu/drm/sti/sti_dvo.c
> > @@ -462,9 +462,7 @@ static int sti_dvo_bind(struct device *dev, struct 
> > device *master, void *data)
> > if (!bridge)
> > return -ENOMEM;
> >  
> > -   bridge->driver_private = dvo;
> > -   bridge->funcs = _dvo_bridge_funcs;
> > -   bridge->of_node = dvo->dev.of_node;
> > +   drm_bridge_init(bridge, >dev, _dvo_bridge_funcs, NULL, dvo);
> > drm_bridge_add(bridge);
> >  
> > err = drm_bridge_attach(encoder, bridge, NULL);
> 
> I can see from grepping that bridge.driver_private is used
> in a couple of other files in sti/
> 
> Like sti_hdmi.c:
> bridge->driver_private = hdmi;
> bridge->funcs = _hdmi_bridge_funcs;
> drm_bridge_attach(encoder, bridge, NULL);
> 
> 
> I wonder if a drm_bridge_init() should be added there.
> I did not look closely - but it looked suspisiously.

My goal with drm_bridge_init() was to get devlinks sorted out for
cross-module uses of a drm_bridge (via of_drm_find_bridge()), so I only
considered locations where drm_bridge_add/remove() were used.

Would you be okay with a promise to push a cleanup of this one and the
one in sti_hda.c after patch 1/30 lands in some form? I'd rather not
make this series much longer, it's already pushing it at 30 :).

> 
>   Sam
> 


-- 
Mihail



___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Re: [PATCH 01/30] drm: Introduce drm_bridge_init()

2019-11-26 Thread Mihail Atanassov
Hi Daniel,

Thanks for the quick review.

On Tuesday, 26 November 2019 14:26:10 GMT Daniel Vetter wrote:
> On Tue, Nov 26, 2019 at 01:15:59PM +0000, Mihail Atanassov wrote:
> > A simple convenience function to initialize the struct drm_bridge.
> > 
> > Signed-off-by: Mihail Atanassov 
> 
> The commit message here leaves figuring out why we need this to the
> reader. Reading ahead the reasons seems to be to roll out bridge->dev
> setting for everyone, so that we can set the device_link. Please explain
> that in the commit message so the patch is properly motivated.

Ack, but with one caveat: bridge->dev is the struct drm_device that is
the bridge client, we need to add a bridge->device (patch 29 in this
series) which is the struct device that will manage the bridge lifetime.

> 
> > ---
> >  drivers/gpu/drm/drm_bridge.c | 29 +
> >  include/drm/drm_bridge.h |  4 
> >  2 files changed, 33 insertions(+)
> > 
> > diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c
> > index cba537c99e43..cbe680aa6eac 100644
> > --- a/drivers/gpu/drm/drm_bridge.c
> > +++ b/drivers/gpu/drm/drm_bridge.c
> > @@ -89,6 +89,35 @@ void drm_bridge_remove(struct drm_bridge *bridge)
> >  }
> >  EXPORT_SYMBOL(drm_bridge_remove);
> >  
> > +/**
> > + * drm_bridge_init - initialise a drm_bridge structure
> > + *
> > + * @bridge: bridge control structure
> > + * @funcs: control functions
> > + * @dev: device
> > + * @timings: timing specification for the bridge; optional (may be NULL)
> > + * @driver_private: pointer to the bridge driver internal context (may be 
> > NULL)
> 
> Please also sprinkle some links to this new function to relevant places,
> I'd add at least:
> 
> "Drivers should call drm_bridge_init() first." to the kerneldoc for
> drm_bridge_add. drm_bridge_add should also mention drm_bridge_remove as
> the undo function.
> 
> And perhaps a longer paragraph to  drm_bridge:
> 
> "Bridge drivers should call drm_bridge_init() to initialized a bridge
> driver, and then register it with drm_bridge_add().
> 
> "Users of bridges link a bridge driver into their overall display output
> pipeline by calling drm_bridge_attach()."

Will do.

> 
> > + */
> > +void drm_bridge_init(struct drm_bridge *bridge, struct device *dev,
> > +const struct drm_bridge_funcs *funcs,
> > +const struct drm_bridge_timings *timings,
> > +void *driver_private)
> > +{
> > +   WARN_ON(!funcs);
> > +
> > +   bridge->dev = NULL;
> 
> Given that the goal here is to get bridge->dev set up, why not
> 
>   WARN_ON(!dev);
>   bridge->dev = dev;

See above struct device vs struct drm_device. I add a

bridge->device = dev;

in patch 29, which takes care of that. I skipped the warn since
there's a dereference of dev, but I now realized it's behind CONFIG_OF,
so I'll add it in for v2.

Yes, 'device' isn't the best of names, but I took Russell's patch
almost as-is, I didn't have any better ideas for bikeshedding.

> 
> That should help us to really move forward with all this.
> -Daniel
> 
> > +   bridge->encoder = NULL;
> > +   bridge->next = NULL;
> > +
> > +#ifdef CONFIG_OF
> > +   bridge->of_node = dev->of_node;
> > +#endif
> > +   bridge->timings = timings;
> > +   bridge->funcs = funcs;
> > +   bridge->driver_private = driver_private;
> > +}
> > +EXPORT_SYMBOL(drm_bridge_init);
> > +
> >  /**
> >   * drm_bridge_attach - attach the bridge to an encoder's chain
> >   *
> > diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h
> > index c0a2286a81e9..d6d9d5301551 100644
> > --- a/include/drm/drm_bridge.h
> > +++ b/include/drm/drm_bridge.h
> > @@ -402,6 +402,10 @@ struct drm_bridge {
> >  
> >  void drm_bridge_add(struct drm_bridge *bridge);
> >  void drm_bridge_remove(struct drm_bridge *bridge);
> > +void drm_bridge_init(struct drm_bridge *bridge, struct device *dev,
> > +const struct drm_bridge_funcs *funcs,
> > +const struct drm_bridge_timings *timings,
> > +void *driver_private);
> >  struct drm_bridge *of_drm_find_bridge(struct device_node *np);
> >  int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge 
> > *bridge,
> >   struct drm_bridge *previous);
> 
> 


-- 
Mihail



___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Re: [PATCH 00/30] drm/bridge: Add device links for lifetime control

2019-11-26 Thread Mihail Atanassov
On Tuesday, 26 November 2019 15:27:16 GMT Russell King - ARM Linux admin wrote:
> What happened with the patches I posted doing exactly this?

Hi Russell,

> 
> [snip]
> > 
> > Russell King (1):
> >   drm/bridge: add support for device links to bridge

^^^
Do you mean this one? It's 29/30 in the series, you're Cc'd on it.
I've kept the non-trivial part identical to
https://patchwork.freedesktop.org/patch/337181/ , which is the only
recent patch of yours that I'm aware of on the topic. I've preserved
the authorship.

> > 
> >  .../gpu/drm/arm/display/komeda/komeda_drv.c   | 54 ++---
> >  .../gpu/drm/arm/display/komeda/komeda_kms.c   | 77 --
> >  .../gpu/drm/arm/display/komeda/komeda_kms.h   |  2 +
> >  drivers/gpu/drm/bridge/adv7511/adv7511_drv.c  |  5 +-
> >  .../drm/bridge/analogix/analogix-anx6345.c|  5 +-
> >  .../drm/bridge/analogix/analogix-anx78xx.c|  8 +-
> >  drivers/gpu/drm/bridge/cdns-dsi.c |  4 +-
> >  drivers/gpu/drm/bridge/dumb-vga-dac.c |  6 +-
> >  drivers/gpu/drm/bridge/lvds-encoder.c |  7 +-
> >  .../bridge/megachips-stdp-ge-b850v3-fw.c  |  4 +-
> >  drivers/gpu/drm/bridge/nxp-ptn3460.c  |  4 +-
> >  drivers/gpu/drm/bridge/panel.c|  7 +-
> >  drivers/gpu/drm/bridge/parade-ps8622.c|  3 +-
> >  drivers/gpu/drm/bridge/sii902x.c  |  5 +-
> >  drivers/gpu/drm/bridge/sii9234.c  |  3 +-
> >  drivers/gpu/drm/bridge/sil-sii8620.c  |  3 +-
> >  drivers/gpu/drm/bridge/synopsys/dw-hdmi.c |  7 +-
> >  drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c |  7 +-
> >  drivers/gpu/drm/bridge/tc358764.c |  4 +-
> >  drivers/gpu/drm/bridge/tc358767.c |  3 +-
> >  drivers/gpu/drm/bridge/thc63lvd1024.c |  7 +-
> >  drivers/gpu/drm/bridge/ti-sn65dsi86.c |  5 +-
> >  drivers/gpu/drm/bridge/ti-tfp410.c|  5 +-
> >  drivers/gpu/drm/drm_bridge.c  | 78 +++
> >  drivers/gpu/drm/exynos/exynos_drm_mic.c   |  8 +-
> >  drivers/gpu/drm/i2c/tda998x_drv.c |  6 +-
> >  drivers/gpu/drm/mcde/mcde_dsi.c   |  3 +-
> >  drivers/gpu/drm/mediatek/mtk_hdmi.c   |  4 +-
> >  drivers/gpu/drm/rcar-du/rcar_lvds.c   |  5 +-
> >  drivers/gpu/drm/sti/sti_dvo.c |  4 +-
> >  include/drm/drm_bridge.h  |  8 ++
> >  31 files changed, 217 insertions(+), 134 deletions(-)
> > 
> 
> 


-- 
Mihail



___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Re: [PATCH 29/30] drm/bridge: add support for device links to bridge

2019-11-26 Thread Mihail Atanassov
On Tuesday, 26 November 2019 14:35:34 GMT Daniel Vetter wrote:
> On Tue, Nov 26, 2019 at 01:16:26PM +0000, Mihail Atanassov wrote:
> > From: Russell King 
> > 
> > Bridge devices have been a potential for kernel oops as their lifetime
> > is independent of the DRM device that they are bound to.  Hence, if a
> > bridge device is unbound while the parent DRM device is using them, the
> > parent happily continues to use the bridge device, calling the driver
> > and accessing its objects that have been freed.
> > 
> > This can cause kernel memory corruption and kernel oops.
> > 
> > To control this, use device links to ensure that the parent DRM device
> > is unbound when the bridge device is unbound, and when the bridge
> > device is re-bound, automatically rebind the parent DRM device.
> > 
> > Signed-off-by: Russell King 
> > Tested-by: Mihail Atanassov 
> > [reworked to use drm_bridge_init() for setting bridge->device]
> > Signed-off-by: Mihail Atanassov 
> 
> So I thought the big plan was to put the device_link setup into
> drm_bridge_attach, so that it's done for everyone. And we could then
> slowly go through the existing drivers that use the component framework to
> get this handled correctly.
> 
> So my questions:
> - is there a problem if we add the device_link for everyone?

Possibly not, but I didn't want to stir the entire pot :). This is
safer in the sense that it's an opt-in, so a lower chance of
regressions in code and setups that I can't possibly test. If you
think it's worth sticking it in the existing code paths, I can
certainly do that too.

> - is there an issue if we only add it at drm_bridge_attach time? I kinda
>   assumed that it's not needed before that (EPROBE_DEFER should handle
>   load dependencies as before), but it could be that some drivers ask for
>   a bridge and then check more stuff and then drop the bridge without
>   calling drm_bridge_attach. We probably don't have a case like this yet,
>   but better robust than sorry.

I think there would be a race there:

- bridge driver calls drm_bridge_add() in their probe()
- client driver calls of_drm_find_bridge() in their probe()
- bridge driver gets removed, calls drm_bridge_remove()
- client driver uses the now invalid drm_bridge pointer from above to
  do drm_bridge_attach()

With of_drm_bridge_find_devlink(), you get the device_link inside the
bridge_lock so the reference to the drm_bridge will either be valid, or
your driver gets removed right after it's probed, so that the bridge
can be removed, too.

In patch 30/30 I use both the _devlink and the non-_devlink versions
of of_drm_find_bridge(), but I guess there's no harm adding another
refcount on the link, it'll get destroyed if the bridge is removed
regardless, although that may need a DL_FLAG_AUTOREMOVE_CONSUMER.

> 
> Anyway, I scrolled through the bridge patches, looked all good, huge
> thanks for tackling this! Once we have some agreement on the bigger
> questions here I'll try to go through them and review.
> 
> Cheers, Daniel
> > ---
> >  drivers/gpu/drm/drm_bridge.c | 49 ++--
> >  include/drm/drm_bridge.h |  4 +++
> >  2 files changed, 40 insertions(+), 13 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c
> > index cbe680aa6eac..e1f8db84651a 100644
> > --- a/drivers/gpu/drm/drm_bridge.c
> > +++ b/drivers/gpu/drm/drm_bridge.c
> > @@ -26,6 +26,7 @@
> >  #include 
> >  
> >  #include 
> > +#include 
> >  #include 
> >  
> >  #include "drm_crtc_internal.h"
> > @@ -109,6 +110,7 @@ void drm_bridge_init(struct drm_bridge *bridge, struct 
> > device *dev,
> > bridge->encoder = NULL;
> > bridge->next = NULL;
> >  
> > +   bridge->device = dev;
> >  #ifdef CONFIG_OF
> > bridge->of_node = dev->of_node;
> >  #endif
> > @@ -492,6 +494,32 @@ void drm_atomic_bridge_enable(struct drm_bridge 
> > *bridge,
> >  EXPORT_SYMBOL(drm_atomic_bridge_enable);
> >  
> >  #ifdef CONFIG_OF
> > +static struct drm_bridge *drm_bridge_find(struct drm_device *dev,
> > + struct device_node *np, bool link)
> > +{
> > +   struct drm_bridge *bridge, *found = NULL;
> > +   struct device_link *dl;
> > +
> > +   mutex_lock(_lock);
> > +
> > +   list_for_each_entry(bridge, _list, list)
> > +   if (bridge->of_node == np) {
> > +   found = bridge;
> > +   break;
> > +   }
> > +
> > +   if (found && link) {
> > +   dl = devi

[PATCH 30/30] drm/komeda: Use drm_bridge interface for pipe outputs

2019-11-26 Thread Mihail Atanassov
To support more transmitters, we need to allow non-component framework
bridges to be attached to a dummy drm_encoder in our driver.

A/B tested for equivalence against tda998x, and also tested ti_tfp410 as
an alternate transmitter.

Signed-off-by: Mihail Atanassov 
---
 .../gpu/drm/arm/display/komeda/komeda_drv.c   | 54 ++---
 .../gpu/drm/arm/display/komeda/komeda_kms.c   | 77 +--
 .../gpu/drm/arm/display/komeda/komeda_kms.h   |  2 +
 3 files changed, 100 insertions(+), 33 deletions(-)

diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c 
b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
index d6cc5d33..2870123bef37 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
@@ -6,10 +6,10 @@
  */
 #include 
 #include 
+#include 
 #include 
-#include 
 #include 
-#include 
+#include 
 #include "komeda_dev.h"
 #include "komeda_kms.h"
 
@@ -72,35 +72,29 @@ static int komeda_bind(struct device *dev)
return err;
 }
 
-static const struct component_master_ops komeda_master_ops = {
-   .bind   = komeda_bind,
-   .unbind = komeda_unbind,
-};
-
-static int compare_of(struct device *dev, void *data)
-{
-   return dev->of_node == data;
-}
-
-static void komeda_add_slave(struct device *master,
-struct component_match **match,
-struct device_node *np,
-u32 port, u32 endpoint)
+static int komeda_add_slave(struct device_node *np, u32 port, u32 endpoint)
 {
struct device_node *remote;
+   struct drm_bridge *bridge;
+   int ret = 0;
 
remote = of_graph_get_remote_node(np, port, endpoint);
-   if (remote) {
-   drm_of_component_match_add(master, match, compare_of, remote);
-   of_node_put(remote);
-   }
+   if (!remote)
+   return 0;
+
+   bridge = of_drm_find_bridge(remote);
+   if (!bridge)
+   ret = -EPROBE_DEFER;
+
+   of_node_put(remote);
+   return ret;
 }
 
 static int komeda_platform_probe(struct platform_device *pdev)
 {
struct device *dev = >dev;
-   struct component_match *match = NULL;
struct device_node *child;
+   int ret;
 
if (!dev->of_node)
return -ENODEV;
@@ -109,17 +103,25 @@ static int komeda_platform_probe(struct platform_device 
*pdev)
if (of_node_cmp(child->name, "pipeline") != 0)
continue;
 
-   /* add connector */
-   komeda_add_slave(dev, , child, KOMEDA_OF_PORT_OUTPUT, 0);
-   komeda_add_slave(dev, , child, KOMEDA_OF_PORT_OUTPUT, 1);
+   /* attach any remote devices if present */
+   ret = komeda_add_slave(child, KOMEDA_OF_PORT_OUTPUT, 0);
+   if (ret) {
+   of_node_put(child);
+   return ret;
+   }
+   ret = komeda_add_slave(child, KOMEDA_OF_PORT_OUTPUT, 1);
+   if (ret) {
+   of_node_put(child);
+   return ret;
+   }
}
 
-   return component_master_add_with_match(dev, _master_ops, match);
+   return komeda_bind(dev);
 }
 
 static int komeda_platform_remove(struct platform_device *pdev)
 {
-   component_master_del(>dev, _master_ops);
+   komeda_unbind(>dev);
return 0;
 }
 
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_kms.c 
b/drivers/gpu/drm/arm/display/komeda/komeda_kms.c
index e30a5b43caa9..2fc6cd9956fd 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_kms.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_kms.c
@@ -4,8 +4,8 @@
  * Author: James.Qian.Wang 
  *
  */
-#include 
 #include 
+#include 
 
 #include 
 #include 
@@ -14,6 +14,9 @@
 #include 
 #include 
 #include 
+#include 
+#include 
+#include 
 #include 
 #include 
 
@@ -257,6 +260,69 @@ static void komeda_kms_mode_config_init(struct 
komeda_kms_dev *kms,
config->helper_private = _mode_config_helpers;
 }
 
+static void komeda_encoder_destroy(struct drm_encoder *encoder)
+{
+   drm_encoder_cleanup(encoder);
+}
+
+static const struct drm_encoder_funcs komeda_dummy_enc_funcs = {
+   .destroy = komeda_encoder_destroy,
+};
+
+static int komeda_encoder_attach_bridge(struct komeda_dev *mdev,
+   struct komeda_kms_dev *kms,
+   struct drm_encoder *encoder,
+   struct device_node *np)
+{
+   struct device_node *remote;
+   struct drm_bridge *bridge;
+   u32 crtcs = 0;
+   int ret = 0;
+
+   remote = of_graph_get_remote_node(np, KOMEDA_OF_PORT_OUTPUT, 0);
+   if (!remote)
+   return 0;
+
+   bridge = of_drm_find_bridge_devlink(>base, remote);
+   if (!bridge) {
+   ret = -EINVAL

[PATCH 00/30] drm/bridge: Add device links for lifetime control

2019-11-26 Thread Mihail Atanassov
Hi all,

This series adds device links support to drm_bridge. The motivation
behind it is that a drm_bridge in a module could get removed under the
feet of the bridge user without warning, so we need a way to remove and
reprobe the client as needed to avoid peering into the void.

1: Add a drm_bridge_init() function which wraps all initialisation of
the structure prior to calling drm_bridge_add().

2-26,28: Apply the drm_bridge_init() refactor to every bridge that uses
drm_bridge_add().

27: Minor cleanup in rcar-du.

29: Add of_drm_find_bridge_devlink() which functions the same as
of_drm_find_bridge() plus adds a device device link from the owning
drm_device to the bridge device.

30: As a motivating example, convert komeda to exclusively use
drm_bridge for its pipe outputs; this isn't a regression in usability
any more since device links bring the same automatic remove/reprobe
feature as components.

Mihail Atanassov (29):
  drm: Introduce drm_bridge_init()
  drm/bridge: adv7511: Use drm_bridge_init()
  drm/bridge: anx6345: Use drm_bridge_init()
  drm/bridge: anx78xx: Use drm_bridge_init()
  drm/bridge: cdns: Use drm_bridge_init()
  drm/bridge: dumb-vga-dac: Use drm_bridge_init()
  drm/bridge: lvds-encoder: Use drm_bridge_init()
  drm/bridge: megachips-stdp-ge-b850v3-fw: Use drm_bridge_init()
  drm/bridge: nxp-ptn3460: Use drm_bridge_init()
  drm/bridge: panel: Use drm_bridge_init()
  drm/bridge: ps8622: Use drm_bridge_init()
  drm/bridge: sii902x: Use drm_bridge_init()
  gpu: drm: bridge: sii9234: Use drm_bridge_init()
  drm/bridge: sil_sii8620: Use drm_bridge_init()
  drm/bridge: dw-hdmi: Use drm_bridge_init()
  drm/bridge/synopsys: dsi: Use drm_bridge_init()
  drm/bridge: tc358764: Use drm_bridge_init()
  drm/bridge: tc358767: Use drm_bridge_init()
  drm/bridge: thc63: Use drm_bridge_init()
  drm/bridge: ti-sn65dsi86: Use drm_bridge_init()
  drm/bridge: ti-tfp410: Use drm_bridge_init()
  drm/exynos: mic: Use drm_bridge_init()
  drm/i2c: tda998x: Use drm_bridge_init()
  drm/mcde: dsi: Use drm_bridge_init()
  drm/mediatek: hdmi: Use drm_bridge_init()
  drm: rcar-du: lvds: Use drm_bridge_init()
  drm: rcar-du: lvds: Don't set drm_bridge private pointer
  drm/sti: sti_vdo: Use drm_bridge_init()
  drm/komeda: Use drm_bridge interface for pipe outputs

Russell King (1):
  drm/bridge: add support for device links to bridge

 .../gpu/drm/arm/display/komeda/komeda_drv.c   | 54 ++---
 .../gpu/drm/arm/display/komeda/komeda_kms.c   | 77 --
 .../gpu/drm/arm/display/komeda/komeda_kms.h   |  2 +
 drivers/gpu/drm/bridge/adv7511/adv7511_drv.c  |  5 +-
 .../drm/bridge/analogix/analogix-anx6345.c|  5 +-
 .../drm/bridge/analogix/analogix-anx78xx.c|  8 +-
 drivers/gpu/drm/bridge/cdns-dsi.c |  4 +-
 drivers/gpu/drm/bridge/dumb-vga-dac.c |  6 +-
 drivers/gpu/drm/bridge/lvds-encoder.c |  7 +-
 .../bridge/megachips-stdp-ge-b850v3-fw.c  |  4 +-
 drivers/gpu/drm/bridge/nxp-ptn3460.c  |  4 +-
 drivers/gpu/drm/bridge/panel.c|  7 +-
 drivers/gpu/drm/bridge/parade-ps8622.c|  3 +-
 drivers/gpu/drm/bridge/sii902x.c  |  5 +-
 drivers/gpu/drm/bridge/sii9234.c  |  3 +-
 drivers/gpu/drm/bridge/sil-sii8620.c  |  3 +-
 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c |  7 +-
 drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c |  7 +-
 drivers/gpu/drm/bridge/tc358764.c |  4 +-
 drivers/gpu/drm/bridge/tc358767.c |  3 +-
 drivers/gpu/drm/bridge/thc63lvd1024.c |  7 +-
 drivers/gpu/drm/bridge/ti-sn65dsi86.c |  5 +-
 drivers/gpu/drm/bridge/ti-tfp410.c|  5 +-
 drivers/gpu/drm/drm_bridge.c  | 78 +++
 drivers/gpu/drm/exynos/exynos_drm_mic.c   |  8 +-
 drivers/gpu/drm/i2c/tda998x_drv.c |  6 +-
 drivers/gpu/drm/mcde/mcde_dsi.c   |  3 +-
 drivers/gpu/drm/mediatek/mtk_hdmi.c   |  4 +-
 drivers/gpu/drm/rcar-du/rcar_lvds.c   |  5 +-
 drivers/gpu/drm/sti/sti_dvo.c |  4 +-
 include/drm/drm_bridge.h  |  8 ++
 31 files changed, 217 insertions(+), 134 deletions(-)

-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH 08/30] drm/bridge: megachips-stdpxxxx-ge-b850v3-fw: Use drm_bridge_init()

2019-11-26 Thread Mihail Atanassov
No functional change.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/bridge/megachips-stdp-ge-b850v3-fw.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/bridge/megachips-stdp-ge-b850v3-fw.c 
b/drivers/gpu/drm/bridge/megachips-stdp-ge-b850v3-fw.c
index e8a49f6146c6..d567cd63810f 100644
--- a/drivers/gpu/drm/bridge/megachips-stdp-ge-b850v3-fw.c
+++ b/drivers/gpu/drm/bridge/megachips-stdp-ge-b850v3-fw.c
@@ -303,8 +303,8 @@ static int stdp4028_ge_b850v3_fw_probe(struct i2c_client 
*stdp4028_i2c,
i2c_set_clientdata(stdp4028_i2c, ge_b850v3_lvds_ptr);
 
/* drm bridge initialization */
-   ge_b850v3_lvds_ptr->bridge.funcs = _b850v3_lvds_funcs;
-   ge_b850v3_lvds_ptr->bridge.of_node = dev->of_node;
+   drm_bridge_init(_b850v3_lvds_ptr->bridge, dev, _b850v3_lvds_funcs,
+   NULL, NULL);
drm_bridge_add(_b850v3_lvds_ptr->bridge);
 
/* Clear pending interrupts since power up. */
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH 27/30] drm: rcar-du: lvds: Don't set drm_bridge private pointer

2019-11-26 Thread Mihail Atanassov
No functional change: it's not used anywhere.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/rcar-du/rcar_lvds.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/rcar-du/rcar_lvds.c 
b/drivers/gpu/drm/rcar-du/rcar_lvds.c
index ac1f29bacfcb..168a718cbcbd 100644
--- a/drivers/gpu/drm/rcar-du/rcar_lvds.c
+++ b/drivers/gpu/drm/rcar-du/rcar_lvds.c
@@ -882,7 +882,7 @@ static int rcar_lvds_probe(struct platform_device *pdev)
return ret;
 
drm_bridge_init(>bridge, >dev, _lvds_bridge_ops,
-   NULL, lvds);
+   NULL, NULL);
 
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
lvds->mmio = devm_ioremap_resource(>dev, mem);
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH 28/30] drm/sti: sti_vdo: Use drm_bridge_init()

2019-11-26 Thread Mihail Atanassov
No functional change.

Signed-off-by: Mihail Atanassov 
---
 drivers/gpu/drm/sti/sti_dvo.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/sti/sti_dvo.c b/drivers/gpu/drm/sti/sti_dvo.c
index 68289b0b063a..20a3956b33bc 100644
--- a/drivers/gpu/drm/sti/sti_dvo.c
+++ b/drivers/gpu/drm/sti/sti_dvo.c
@@ -462,9 +462,7 @@ static int sti_dvo_bind(struct device *dev, struct device 
*master, void *data)
if (!bridge)
return -ENOMEM;
 
-   bridge->driver_private = dvo;
-   bridge->funcs = _dvo_bridge_funcs;
-   bridge->of_node = dvo->dev.of_node;
+   drm_bridge_init(bridge, >dev, _dvo_bridge_funcs, NULL, dvo);
drm_bridge_add(bridge);
 
err = drm_bridge_attach(encoder, bridge, NULL);
-- 
2.23.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  1   2   3   >