From: Chris Morgan <macroalpha82@gmail.com>
To: dri-devel@lists.freedesktop.org
Cc: linux-rockchip@lists.infradead.org, devicetree@vger.kernel.org,
maccraft123mc@gmail.com, tzimmermann@suse.de, mripard@kernel.org,
maarten.lankhorst@linux.intel.com, heiko@sntech.de,
krzysztof.kozlowski+dt@linaro.org, robh+dt@kernel.org,
daniel@ffwll.ch, airlied@gmail.com, sam@ravnborg.org,
thierry.reding@gmail.com, linus.walleij@linaro.org,
Chris Morgan <macromorgan@hotmail.com>
Subject: [PATCH v8 1/4] drm: of: Add drm_of_get_dsi_bus helper function
Date: Tue, 10 Jan 2023 14:02:52 -0600 [thread overview]
Message-ID: <20230110200255.1218738-2-macroalpha82@gmail.com> (raw)
In-Reply-To: <20230110200255.1218738-1-macroalpha82@gmail.com>
From: Chris Morgan <macromorgan@hotmail.com>
Add helper function to find DSI host for devices where DSI panel is not
a minor of a DSI bus (such as the Samsung AMS495QA01 panel or the
official Raspberry Pi touchscreen display).
Signed-off-by: Chris Morgan <macromorgan@hotmail.com>
Signed-off-by: Maya Matuszczyk <maccraft123mc@gmail.com>
---
drivers/gpu/drm/drm_of.c | 70 ++++++++++++++++++++++++++++++++++++++++
include/drm/drm_of.h | 9 ++++++
2 files changed, 79 insertions(+)
diff --git a/drivers/gpu/drm/drm_of.c b/drivers/gpu/drm/drm_of.c
index 7bbcb999bb75..4ebb5bc4b595 100644
--- a/drivers/gpu/drm/drm_of.c
+++ b/drivers/gpu/drm/drm_of.c
@@ -10,6 +10,7 @@
#include <drm/drm_crtc.h>
#include <drm/drm_device.h>
#include <drm/drm_encoder.h>
+#include <drm/drm_mipi_dsi.h>
#include <drm/drm_of.h>
#include <drm/drm_panel.h>
@@ -493,3 +494,72 @@ int drm_of_get_data_lanes_count_ep(const struct device_node *port,
return ret;
}
EXPORT_SYMBOL_GPL(drm_of_get_data_lanes_count_ep);
+
+/**
+ * drm_of_get_dsi_bus - find the DSI bus for a given device
+ * @dev: parent device of display (SPI, I2C)
+ * @info: DSI device info to be updated with correct DSI node
+ *
+ * Gets parent DSI bus for a DSI device controlled through a bus other
+ * than MIPI-DCS (SPI, I2C, etc.) using the Device Tree.
+ *
+ * Returns pointer to mipi_dsi_host if successful, -EINVAL if the
+ * request is unsupported, -EPROBE_DEFER if the DSI host is found but
+ * not available, or -ENODEV otherwise.
+ */
+struct mipi_dsi_host *drm_of_get_dsi_bus(struct device *dev,
+ struct mipi_dsi_device_info *info)
+{
+ struct mipi_dsi_host *dsi_host;
+ struct device_node *endpoint, *dsi_host_node;
+
+ /*
+ * Exit immediately if we attempt to call this function when
+ * DRM_MIPI_DSI is not enabled, in the event CONFIG_OF is
+ * enabled.
+ */
+ if (!IS_ENABLED(CONFIG_DRM_MIPI_DSI))
+ return ERR_PTR(-EINVAL);
+
+ /*
+ * Get first endpoint child from device.
+ */
+ endpoint = of_graph_get_next_endpoint(dev->of_node, NULL);
+ if (!endpoint)
+ return ERR_PTR(-ENODEV);
+
+ /*
+ * Follow the first endpoint to get the DSI host node.
+ */
+ dsi_host_node = of_graph_get_remote_port_parent(endpoint);
+ if (!dsi_host_node)
+ goto error;
+
+ /*
+ * Get the DSI host from the DSI host node. If we get an error
+ * or the return is null assume we're not ready to probe just
+ * yet. Release the DSI host node since we're done with it.
+ */
+ dsi_host = of_find_mipi_dsi_host_by_node(dsi_host_node);
+ of_node_put(dsi_host_node);
+ if (IS_ERR_OR_NULL(dsi_host)) {
+ of_node_put(endpoint);
+ return ERR_PTR(-EPROBE_DEFER);
+ }
+
+ /*
+ * Set the node of the mipi_dsi_device_info to the correct node
+ * and then release the endpoint node since we're done with it.
+ */
+ info->node = of_graph_get_remote_port(endpoint);
+ if (IS_ERR_OR_NULL(info->node))
+ goto error;
+
+ of_node_put(endpoint);
+ return dsi_host;
+
+error:
+ of_node_put(endpoint);
+ return ERR_PTR(-ENODEV);
+}
+EXPORT_SYMBOL_GPL(drm_of_get_dsi_bus);
diff --git a/include/drm/drm_of.h b/include/drm/drm_of.h
index 10ab58c40746..f5511e0d1822 100644
--- a/include/drm/drm_of.h
+++ b/include/drm/drm_of.h
@@ -15,6 +15,8 @@ struct drm_encoder;
struct drm_panel;
struct drm_bridge;
struct device_node;
+struct mipi_dsi_device_info;
+struct mipi_dsi_host;
/**
* enum drm_lvds_dual_link_pixels - Pixel order of an LVDS dual-link connection
@@ -56,6 +58,8 @@ int drm_of_get_data_lanes_count_ep(const struct device_node *port,
int port_reg, int reg,
const unsigned int min,
const unsigned int max);
+struct mipi_dsi_host *drm_of_get_dsi_bus(struct device *dev,
+ struct mipi_dsi_device_info *info);
#else
static inline uint32_t drm_of_crtc_port_mask(struct drm_device *dev,
struct device_node *port)
@@ -127,6 +131,11 @@ drm_of_get_data_lanes_count_ep(const struct device_node *port,
{
return -EINVAL;
}
+struct mipi_dsi_host *drm_of_get_dsi_bus(struct device *dev,
+ struct mipi_dsi_device_info *info)
+{
+ return ERR_PTR(-EINVAL);
+}
#endif
/*
--
2.34.1
_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip
WARNING: multiple messages have this Message-ID (diff)
From: Chris Morgan <macroalpha82@gmail.com>
To: dri-devel@lists.freedesktop.org
Cc: linux-rockchip@lists.infradead.org, devicetree@vger.kernel.org,
maccraft123mc@gmail.com, tzimmermann@suse.de, mripard@kernel.org,
maarten.lankhorst@linux.intel.com, heiko@sntech.de,
krzysztof.kozlowski+dt@linaro.org, robh+dt@kernel.org,
daniel@ffwll.ch, airlied@gmail.com, sam@ravnborg.org,
thierry.reding@gmail.com, linus.walleij@linaro.org,
Chris Morgan <macromorgan@hotmail.com>
Subject: [PATCH v8 1/4] drm: of: Add drm_of_get_dsi_bus helper function
Date: Tue, 10 Jan 2023 14:02:52 -0600 [thread overview]
Message-ID: <20230110200255.1218738-2-macroalpha82@gmail.com> (raw)
In-Reply-To: <20230110200255.1218738-1-macroalpha82@gmail.com>
From: Chris Morgan <macromorgan@hotmail.com>
Add helper function to find DSI host for devices where DSI panel is not
a minor of a DSI bus (such as the Samsung AMS495QA01 panel or the
official Raspberry Pi touchscreen display).
Signed-off-by: Chris Morgan <macromorgan@hotmail.com>
Signed-off-by: Maya Matuszczyk <maccraft123mc@gmail.com>
---
drivers/gpu/drm/drm_of.c | 70 ++++++++++++++++++++++++++++++++++++++++
include/drm/drm_of.h | 9 ++++++
2 files changed, 79 insertions(+)
diff --git a/drivers/gpu/drm/drm_of.c b/drivers/gpu/drm/drm_of.c
index 7bbcb999bb75..4ebb5bc4b595 100644
--- a/drivers/gpu/drm/drm_of.c
+++ b/drivers/gpu/drm/drm_of.c
@@ -10,6 +10,7 @@
#include <drm/drm_crtc.h>
#include <drm/drm_device.h>
#include <drm/drm_encoder.h>
+#include <drm/drm_mipi_dsi.h>
#include <drm/drm_of.h>
#include <drm/drm_panel.h>
@@ -493,3 +494,72 @@ int drm_of_get_data_lanes_count_ep(const struct device_node *port,
return ret;
}
EXPORT_SYMBOL_GPL(drm_of_get_data_lanes_count_ep);
+
+/**
+ * drm_of_get_dsi_bus - find the DSI bus for a given device
+ * @dev: parent device of display (SPI, I2C)
+ * @info: DSI device info to be updated with correct DSI node
+ *
+ * Gets parent DSI bus for a DSI device controlled through a bus other
+ * than MIPI-DCS (SPI, I2C, etc.) using the Device Tree.
+ *
+ * Returns pointer to mipi_dsi_host if successful, -EINVAL if the
+ * request is unsupported, -EPROBE_DEFER if the DSI host is found but
+ * not available, or -ENODEV otherwise.
+ */
+struct mipi_dsi_host *drm_of_get_dsi_bus(struct device *dev,
+ struct mipi_dsi_device_info *info)
+{
+ struct mipi_dsi_host *dsi_host;
+ struct device_node *endpoint, *dsi_host_node;
+
+ /*
+ * Exit immediately if we attempt to call this function when
+ * DRM_MIPI_DSI is not enabled, in the event CONFIG_OF is
+ * enabled.
+ */
+ if (!IS_ENABLED(CONFIG_DRM_MIPI_DSI))
+ return ERR_PTR(-EINVAL);
+
+ /*
+ * Get first endpoint child from device.
+ */
+ endpoint = of_graph_get_next_endpoint(dev->of_node, NULL);
+ if (!endpoint)
+ return ERR_PTR(-ENODEV);
+
+ /*
+ * Follow the first endpoint to get the DSI host node.
+ */
+ dsi_host_node = of_graph_get_remote_port_parent(endpoint);
+ if (!dsi_host_node)
+ goto error;
+
+ /*
+ * Get the DSI host from the DSI host node. If we get an error
+ * or the return is null assume we're not ready to probe just
+ * yet. Release the DSI host node since we're done with it.
+ */
+ dsi_host = of_find_mipi_dsi_host_by_node(dsi_host_node);
+ of_node_put(dsi_host_node);
+ if (IS_ERR_OR_NULL(dsi_host)) {
+ of_node_put(endpoint);
+ return ERR_PTR(-EPROBE_DEFER);
+ }
+
+ /*
+ * Set the node of the mipi_dsi_device_info to the correct node
+ * and then release the endpoint node since we're done with it.
+ */
+ info->node = of_graph_get_remote_port(endpoint);
+ if (IS_ERR_OR_NULL(info->node))
+ goto error;
+
+ of_node_put(endpoint);
+ return dsi_host;
+
+error:
+ of_node_put(endpoint);
+ return ERR_PTR(-ENODEV);
+}
+EXPORT_SYMBOL_GPL(drm_of_get_dsi_bus);
diff --git a/include/drm/drm_of.h b/include/drm/drm_of.h
index 10ab58c40746..f5511e0d1822 100644
--- a/include/drm/drm_of.h
+++ b/include/drm/drm_of.h
@@ -15,6 +15,8 @@ struct drm_encoder;
struct drm_panel;
struct drm_bridge;
struct device_node;
+struct mipi_dsi_device_info;
+struct mipi_dsi_host;
/**
* enum drm_lvds_dual_link_pixels - Pixel order of an LVDS dual-link connection
@@ -56,6 +58,8 @@ int drm_of_get_data_lanes_count_ep(const struct device_node *port,
int port_reg, int reg,
const unsigned int min,
const unsigned int max);
+struct mipi_dsi_host *drm_of_get_dsi_bus(struct device *dev,
+ struct mipi_dsi_device_info *info);
#else
static inline uint32_t drm_of_crtc_port_mask(struct drm_device *dev,
struct device_node *port)
@@ -127,6 +131,11 @@ drm_of_get_data_lanes_count_ep(const struct device_node *port,
{
return -EINVAL;
}
+struct mipi_dsi_host *drm_of_get_dsi_bus(struct device *dev,
+ struct mipi_dsi_device_info *info)
+{
+ return ERR_PTR(-EINVAL);
+}
#endif
/*
--
2.34.1
WARNING: multiple messages have this Message-ID (diff)
From: Chris Morgan <macroalpha82@gmail.com>
To: dri-devel@lists.freedesktop.org
Cc: devicetree@vger.kernel.org,
Chris Morgan <macromorgan@hotmail.com>,
krzysztof.kozlowski+dt@linaro.org, sam@ravnborg.org,
linux-rockchip@lists.infradead.org, robh+dt@kernel.org,
thierry.reding@gmail.com, tzimmermann@suse.de,
maccraft123mc@gmail.com
Subject: [PATCH v8 1/4] drm: of: Add drm_of_get_dsi_bus helper function
Date: Tue, 10 Jan 2023 14:02:52 -0600 [thread overview]
Message-ID: <20230110200255.1218738-2-macroalpha82@gmail.com> (raw)
In-Reply-To: <20230110200255.1218738-1-macroalpha82@gmail.com>
From: Chris Morgan <macromorgan@hotmail.com>
Add helper function to find DSI host for devices where DSI panel is not
a minor of a DSI bus (such as the Samsung AMS495QA01 panel or the
official Raspberry Pi touchscreen display).
Signed-off-by: Chris Morgan <macromorgan@hotmail.com>
Signed-off-by: Maya Matuszczyk <maccraft123mc@gmail.com>
---
drivers/gpu/drm/drm_of.c | 70 ++++++++++++++++++++++++++++++++++++++++
include/drm/drm_of.h | 9 ++++++
2 files changed, 79 insertions(+)
diff --git a/drivers/gpu/drm/drm_of.c b/drivers/gpu/drm/drm_of.c
index 7bbcb999bb75..4ebb5bc4b595 100644
--- a/drivers/gpu/drm/drm_of.c
+++ b/drivers/gpu/drm/drm_of.c
@@ -10,6 +10,7 @@
#include <drm/drm_crtc.h>
#include <drm/drm_device.h>
#include <drm/drm_encoder.h>
+#include <drm/drm_mipi_dsi.h>
#include <drm/drm_of.h>
#include <drm/drm_panel.h>
@@ -493,3 +494,72 @@ int drm_of_get_data_lanes_count_ep(const struct device_node *port,
return ret;
}
EXPORT_SYMBOL_GPL(drm_of_get_data_lanes_count_ep);
+
+/**
+ * drm_of_get_dsi_bus - find the DSI bus for a given device
+ * @dev: parent device of display (SPI, I2C)
+ * @info: DSI device info to be updated with correct DSI node
+ *
+ * Gets parent DSI bus for a DSI device controlled through a bus other
+ * than MIPI-DCS (SPI, I2C, etc.) using the Device Tree.
+ *
+ * Returns pointer to mipi_dsi_host if successful, -EINVAL if the
+ * request is unsupported, -EPROBE_DEFER if the DSI host is found but
+ * not available, or -ENODEV otherwise.
+ */
+struct mipi_dsi_host *drm_of_get_dsi_bus(struct device *dev,
+ struct mipi_dsi_device_info *info)
+{
+ struct mipi_dsi_host *dsi_host;
+ struct device_node *endpoint, *dsi_host_node;
+
+ /*
+ * Exit immediately if we attempt to call this function when
+ * DRM_MIPI_DSI is not enabled, in the event CONFIG_OF is
+ * enabled.
+ */
+ if (!IS_ENABLED(CONFIG_DRM_MIPI_DSI))
+ return ERR_PTR(-EINVAL);
+
+ /*
+ * Get first endpoint child from device.
+ */
+ endpoint = of_graph_get_next_endpoint(dev->of_node, NULL);
+ if (!endpoint)
+ return ERR_PTR(-ENODEV);
+
+ /*
+ * Follow the first endpoint to get the DSI host node.
+ */
+ dsi_host_node = of_graph_get_remote_port_parent(endpoint);
+ if (!dsi_host_node)
+ goto error;
+
+ /*
+ * Get the DSI host from the DSI host node. If we get an error
+ * or the return is null assume we're not ready to probe just
+ * yet. Release the DSI host node since we're done with it.
+ */
+ dsi_host = of_find_mipi_dsi_host_by_node(dsi_host_node);
+ of_node_put(dsi_host_node);
+ if (IS_ERR_OR_NULL(dsi_host)) {
+ of_node_put(endpoint);
+ return ERR_PTR(-EPROBE_DEFER);
+ }
+
+ /*
+ * Set the node of the mipi_dsi_device_info to the correct node
+ * and then release the endpoint node since we're done with it.
+ */
+ info->node = of_graph_get_remote_port(endpoint);
+ if (IS_ERR_OR_NULL(info->node))
+ goto error;
+
+ of_node_put(endpoint);
+ return dsi_host;
+
+error:
+ of_node_put(endpoint);
+ return ERR_PTR(-ENODEV);
+}
+EXPORT_SYMBOL_GPL(drm_of_get_dsi_bus);
diff --git a/include/drm/drm_of.h b/include/drm/drm_of.h
index 10ab58c40746..f5511e0d1822 100644
--- a/include/drm/drm_of.h
+++ b/include/drm/drm_of.h
@@ -15,6 +15,8 @@ struct drm_encoder;
struct drm_panel;
struct drm_bridge;
struct device_node;
+struct mipi_dsi_device_info;
+struct mipi_dsi_host;
/**
* enum drm_lvds_dual_link_pixels - Pixel order of an LVDS dual-link connection
@@ -56,6 +58,8 @@ int drm_of_get_data_lanes_count_ep(const struct device_node *port,
int port_reg, int reg,
const unsigned int min,
const unsigned int max);
+struct mipi_dsi_host *drm_of_get_dsi_bus(struct device *dev,
+ struct mipi_dsi_device_info *info);
#else
static inline uint32_t drm_of_crtc_port_mask(struct drm_device *dev,
struct device_node *port)
@@ -127,6 +131,11 @@ drm_of_get_data_lanes_count_ep(const struct device_node *port,
{
return -EINVAL;
}
+struct mipi_dsi_host *drm_of_get_dsi_bus(struct device *dev,
+ struct mipi_dsi_device_info *info)
+{
+ return ERR_PTR(-EINVAL);
+}
#endif
/*
--
2.34.1
next prev parent reply other threads:[~2023-01-10 20:03 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-10 20:02 [PATCH v8 0/4] drm/panel: Add Magnachip D53E6EA8966 Panel Controller Chris Morgan
2023-01-10 20:02 ` Chris Morgan
2023-01-10 20:02 ` Chris Morgan
2023-01-10 20:02 ` Chris Morgan [this message]
2023-01-10 20:02 ` [PATCH v8 1/4] drm: of: Add drm_of_get_dsi_bus helper function Chris Morgan
2023-01-10 20:02 ` Chris Morgan
2023-01-11 3:01 ` kernel test robot
2023-01-11 3:01 ` kernel test robot
2023-01-11 3:01 ` kernel test robot
2023-01-16 12:35 ` Linus Walleij
2023-01-16 12:35 ` Linus Walleij
2023-01-16 12:35 ` Linus Walleij
2023-01-11 3:21 ` kernel test robot
2023-01-11 3:21 ` kernel test robot
2023-01-11 3:21 ` kernel test robot
2023-01-11 5:02 ` kernel test robot
2023-01-11 5:02 ` kernel test robot
2023-01-11 5:02 ` kernel test robot
2023-01-11 5:33 ` kernel test robot
2023-01-11 5:33 ` kernel test robot
2023-01-11 5:33 ` kernel test robot
2023-01-10 20:02 ` [PATCH v8 2/4] dt-bindings: display: panel: Add Samsung AMS495QA01 Chris Morgan
2023-01-10 20:02 ` Chris Morgan
2023-01-10 20:02 ` Chris Morgan
2023-01-10 20:02 ` [PATCH v8 3/4] drm/panel: Add Magnachip D53E6EA8966 Panel Driver Chris Morgan
2023-01-10 20:02 ` Chris Morgan
2023-01-10 20:02 ` Chris Morgan
2023-01-10 20:02 ` [PATCH v8 4/4] arm64: dts: rockchip: add display to RG503 Chris Morgan
2023-01-10 20:02 ` Chris Morgan
2023-01-10 20:02 ` Chris Morgan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230110200255.1218738-2-macroalpha82@gmail.com \
--to=macroalpha82@gmail.com \
--cc=airlied@gmail.com \
--cc=daniel@ffwll.ch \
--cc=devicetree@vger.kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=heiko@sntech.de \
--cc=krzysztof.kozlowski+dt@linaro.org \
--cc=linus.walleij@linaro.org \
--cc=linux-rockchip@lists.infradead.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=maccraft123mc@gmail.com \
--cc=macromorgan@hotmail.com \
--cc=mripard@kernel.org \
--cc=robh+dt@kernel.org \
--cc=sam@ravnborg.org \
--cc=thierry.reding@gmail.com \
--cc=tzimmermann@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.