Commit 66af4a9d authored by Daniel Vetter's avatar Daniel Vetter
Browse files

Merge tag 'du-next-20191218' of git://linuxtv.org/pinchartl/media into drm-next



R-Car Display Unit changes:

- Color Management Module support
- LVDS encoder dual-link support enhancements
- R8A77980 support

Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191218151710.GA13830@pendragon.ideasonboard.com
parents be452c4e c267782c
Loading
Loading
Loading
Loading
+67 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0-only
%YAML 1.2
---
$id: http://devicetree.org/schemas/display/renesas,cmm.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Renesas R-Car Color Management Module (CMM)

maintainers:
  - Laurent Pinchart <laurent.pinchart@ideasonboard.com>
  - Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
  - Jacopo Mondi <jacopo+renesas@jmondi.org>

description: |+
  Renesas R-Car color management module connected to R-Car DU video channels.
  It provides image enhancement functions such as 1-D look-up tables (LUT),
  3-D look-up tables (CLU), 1D-histogram generation (HGO), and color
  space conversion (CSC).

properties:
  compatible:
    oneOf:
      - items:
        - enum:
          - renesas,r8a7795-cmm
          - renesas,r8a7796-cmm
          - renesas,r8a77965-cmm
          - renesas,r8a77990-cmm
          - renesas,r8a77995-cmm
        - const: renesas,rcar-gen3-cmm
      - items:
        - const: renesas,rcar-gen2-cmm

  reg:
    maxItems: 1

  clocks:
    maxItems: 1

  resets:
    maxItems: 1

  power-domains:
    maxItems: 1

required:
  - compatible
  - reg
  - clocks
  - resets
  - power-domains

additionalProperties: false

examples:
  - |
    #include <dt-bindings/clock/r8a7796-cpg-mssr.h>
    #include <dt-bindings/power/r8a7796-sysc.h>

    cmm0: cmm@fea40000 {
         compatible = "renesas,r8a7796-cmm",
                      "renesas,rcar-gen3-cmm";
         reg = <0 0xfea40000 0 0x1000>;
         power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
         clocks = <&cpg CPG_MOD 711>;
         resets = <&cpg 711>;
    };
+10 −5
Original line number Diff line number Diff line
@@ -41,10 +41,14 @@ Required Properties:
      supplied they must be named "dclkin.x" with "x" being the input clock
      numerical index.

  - vsps: A list of phandle and channel index tuples to the VSPs that handle
    the memory interfaces for the DU channels. The phandle identifies the VSP
    instance that serves the DU channel, and the channel index identifies the
    LIF instance in that VSP.
  - renesas,cmms: A list of phandles to the CMM instances present in the SoC,
    one for each available DU channel. The property shall not be specified for
    SoCs that do not provide any CMM (such as V3M and V3H).

  - renesas,vsps: A list of phandle and channel index tuples to the VSPs that
    handle the memory interfaces for the DU channels. The phandle identifies the
    VSP instance that serves the DU channel, and the channel index identifies
    the LIF instance in that VSP.

Required nodes:

@@ -92,7 +96,8 @@ Example: R8A7795 (R-Car H3) ES2.0 DU
			 <&cpg CPG_MOD 722>,
			 <&cpg CPG_MOD 721>;
		clock-names = "du.0", "du.1", "du.2", "du.3";
		vsps = <&vspd0 0>, <&vspd1 0>, <&vspd2 0>, <&vspd0 1>;
		renesas,cmms = <&cmm0>, <&cmm1>, <&cmm2>, <&cmm3>;
		renesas,vsps = <&vspd0 0>, <&vspd1 0>, <&vspd2 0>, <&vspd0 1>;

		ports {
			#address-cells = <1>;
+116 −0
Original line number Diff line number Diff line
@@ -274,3 +274,119 @@ int drm_of_find_panel_or_bridge(const struct device_node *np,
	return ret;
}
EXPORT_SYMBOL_GPL(drm_of_find_panel_or_bridge);

enum drm_of_lvds_pixels {
	DRM_OF_LVDS_EVEN = BIT(0),
	DRM_OF_LVDS_ODD = BIT(1),
};

static int drm_of_lvds_get_port_pixels_type(struct device_node *port_node)
{
	bool even_pixels =
		of_property_read_bool(port_node, "dual-lvds-even-pixels");
	bool odd_pixels =
		of_property_read_bool(port_node, "dual-lvds-odd-pixels");

	return (even_pixels ? DRM_OF_LVDS_EVEN : 0) |
	       (odd_pixels ? DRM_OF_LVDS_ODD : 0);
}

static int drm_of_lvds_get_remote_pixels_type(
			const struct device_node *port_node)
{
	struct device_node *endpoint = NULL;
	int pixels_type = -EPIPE;

	for_each_child_of_node(port_node, endpoint) {
		struct device_node *remote_port;
		int current_pt;

		if (!of_node_name_eq(endpoint, "endpoint"))
			continue;

		remote_port = of_graph_get_remote_port(endpoint);
		if (!remote_port) {
			of_node_put(remote_port);
			return -EPIPE;
		}

		current_pt = drm_of_lvds_get_port_pixels_type(remote_port);
		of_node_put(remote_port);
		if (pixels_type < 0)
			pixels_type = current_pt;

		/*
		 * Sanity check, ensure that all remote endpoints have the same
		 * pixel type. We may lift this restriction later if we need to
		 * support multiple sinks with different dual-link
		 * configurations by passing the endpoints explicitly to
		 * drm_of_lvds_get_dual_link_pixel_order().
		 */
		if (!current_pt || pixels_type != current_pt) {
			of_node_put(remote_port);
			return -EINVAL;
		}
	}

	return pixels_type;
}

/**
 * drm_of_lvds_get_dual_link_pixel_order - Get LVDS dual-link pixel order
 * @port1: First DT port node of the Dual-link LVDS source
 * @port2: Second DT port node of the Dual-link LVDS source
 *
 * An LVDS dual-link connection is made of two links, with even pixels
 * transitting on one link, and odd pixels on the other link. This function
 * returns, for two ports of an LVDS dual-link source, which port shall transmit
 * the even and odd pixels, based on the requirements of the connected sink.
 *
 * The pixel order is determined from the dual-lvds-even-pixels and
 * dual-lvds-odd-pixels properties in the sink's DT port nodes. If those
 * properties are not present, or if their usage is not valid, this function
 * returns -EINVAL.
 *
 * If either port is not connected, this function returns -EPIPE.
 *
 * @port1 and @port2 are typically DT sibling nodes, but may have different
 * parents when, for instance, two separate LVDS encoders carry the even and odd
 * pixels.
 *
 * Return:
 * * DRM_LVDS_DUAL_LINK_EVEN_ODD_PIXELS - @port1 carries even pixels and @port2
 *   carries odd pixels
 * * DRM_LVDS_DUAL_LINK_ODD_EVEN_PIXELS - @port1 carries odd pixels and @port2
 *   carries even pixels
 * * -EINVAL - @port1 and @port2 are not connected to a dual-link LVDS sink, or
 *   the sink configuration is invalid
 * * -EPIPE - when @port1 or @port2 are not connected
 */
int drm_of_lvds_get_dual_link_pixel_order(const struct device_node *port1,
					  const struct device_node *port2)
{
	int remote_p1_pt, remote_p2_pt;

	if (!port1 || !port2)
		return -EINVAL;

	remote_p1_pt = drm_of_lvds_get_remote_pixels_type(port1);
	if (remote_p1_pt < 0)
		return remote_p1_pt;

	remote_p2_pt = drm_of_lvds_get_remote_pixels_type(port2);
	if (remote_p2_pt < 0)
		return remote_p2_pt;

	/*
	 * A valid dual-lVDS bus is found when one remote port is marked with
	 * "dual-lvds-even-pixels", and the other remote port is marked with
	 * "dual-lvds-odd-pixels", bail out if the markers are not right.
	 */
	if (remote_p1_pt + remote_p2_pt != DRM_OF_LVDS_EVEN + DRM_OF_LVDS_ODD)
		return -EINVAL;

	return remote_p1_pt == DRM_OF_LVDS_EVEN ?
		DRM_LVDS_DUAL_LINK_EVEN_ODD_PIXELS :
		DRM_LVDS_DUAL_LINK_ODD_EVEN_PIXELS;
}
EXPORT_SYMBOL_GPL(drm_of_lvds_get_dual_link_pixel_order);
+8 −0
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ config DRM_RCAR_DU
	depends on DRM && OF
	depends on ARM || ARM64
	depends on ARCH_RENESAS || COMPILE_TEST
	imply DRM_RCAR_CMM
	imply DRM_RCAR_LVDS
	select DRM_KMS_HELPER
	select DRM_KMS_CMA_HELPER
@@ -13,6 +14,13 @@ config DRM_RCAR_DU
	  Choose this option if you have an R-Car chipset.
	  If M is selected the module will be called rcar-du-drm.

config DRM_RCAR_CMM
	tristate "R-Car DU Color Management Module (CMM) Support"
	depends on DRM && OF
	depends on DRM_RCAR_DU
	help
	  Enable support for R-Car Color Management Module (CMM).

config DRM_RCAR_DW_HDMI
	tristate "R-Car DU Gen3 HDMI Encoder Support"
	depends on DRM && OF
+1 −0
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@ rcar-du-drm-$(CONFIG_DRM_RCAR_LVDS) += rcar_du_of.o \
rcar-du-drm-$(CONFIG_DRM_RCAR_VSP)	+= rcar_du_vsp.o
rcar-du-drm-$(CONFIG_DRM_RCAR_WRITEBACK) += rcar_du_writeback.o

obj-$(CONFIG_DRM_RCAR_CMM)		+= rcar_cmm.o
obj-$(CONFIG_DRM_RCAR_DU)		+= rcar-du-drm.o
obj-$(CONFIG_DRM_RCAR_DW_HDMI)		+= rcar_dw_hdmi.o
obj-$(CONFIG_DRM_RCAR_LVDS)		+= rcar_lvds.o
Loading