Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp4574384pxv; Tue, 20 Jul 2021 06:57:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxbUpCesKNnk9vUm6g6lOBsRIvAF5NNh74bmAkmJT82jiLhNa8wHR9FCT4e6lQevpN1dNOP X-Received: by 2002:a05:6e02:1d8d:: with SMTP id h13mr20692688ila.40.1626789477827; Tue, 20 Jul 2021 06:57:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626789477; cv=none; d=google.com; s=arc-20160816; b=Mp3M+iGDYl1ks/ZPb8uz2YilLlo/UdmfjiYo6DTWQQ3XT1cAvUd0VcDgHyL6mnsrqB YE9aja7bjxVi0hgCI7CcfkVDLNTJxgJITmxBZN9bmHqqQo56eGaIeVdtVj5s4LTmBcPO EJjl1v1GEcDsovZOjEsoHxOnUxjc8YfnBySUxoe1KJVUMSTe4xYupC3fl0j+Nxmu9xsZ JgUZtD8lERg58cpYjZdCv6tOVgBpIG3Igqm+OOfNmYqCcSZowzBfUgLapAnyzxw+OrH4 59CMcyuR2IsjQKiFaYCLkB9/nE88mccO/kS6N3skC3wkChOTPq9CJ3eq3TWUJqy46345 TV5Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:dkim-signature; bh=rpqGJA8BzP498VRthL+GNLGbJX6smf0yyUoSj3bk7lg=; b=YRMnYBoRHSr7/rMJm6r8xQEsMQrkXv7hHpeizuQoAbXCNuKXdmXbU0pfFRDvDpw7du diCXN8NVmLz1In2BmIg7ZZUAS8I3tCOkCagLB+D6gMeLXTZU/0yss+Zx/o0qL+qcxWDC Kaix9aoEbTbmzP6AQ3GsJGGp6CZqPNHVwyjiK9E++aWSwtUfXR+04Io6MssBpOkWb1MV VMkvFfNeBqfzWBVeEzliScknYpJfT2zvnTorEP/gpqWEhlqZdQo/Pu/ERd0PmDsByqij Ib1r8GYdYcPKZilEMRwF12nJO77ES/iyMt/mEG1lY/iE+BAUPTAIpod3KX6CZfANrSRr 5yHg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@cerno.tech header.s=fm3 header.b=liC6SCDa; dkim=pass header.i=@messagingengine.com header.s=fm3 header.b=OB7E272R; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=cerno.tech Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id s1si22632299jar.29.2021.07.20.06.57.45; Tue, 20 Jul 2021 06:57:57 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@cerno.tech header.s=fm3 header.b=liC6SCDa; dkim=pass header.i=@messagingengine.com header.s=fm3 header.b=OB7E272R; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=cerno.tech Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239442AbhGTNOe (ORCPT + 99 others); Tue, 20 Jul 2021 09:14:34 -0400 Received: from wnew3-smtp.messagingengine.com ([64.147.123.17]:34373 "EHLO wnew3-smtp.messagingengine.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238810AbhGTNFe (ORCPT ); Tue, 20 Jul 2021 09:05:34 -0400 Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) by mailnew.west.internal (Postfix) with ESMTP id 875022B005D0; Tue, 20 Jul 2021 09:46:11 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute5.internal (MEProxy); Tue, 20 Jul 2021 09:46:12 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cerno.tech; h= from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=fm3; bh=rpqGJA8BzP498 VRthL+GNLGbJX6smf0yyUoSj3bk7lg=; b=liC6SCDatppqQysuy4XdOdBm/hL9z rFNTqft+3e40uxFGLIAbYKAHEzFOTdo7BIdm84hYJqyDN3G1oPzQoU8SWaO6f6B2 WbVo7XRroBsx5iEl+3M3CHScJIFd4OwMoJObyMA+t2DslgWbeb82e+RRulxKpu/1 8VoWmuw6zBLJV98XhkOisFX8HALRctsGr5OV38CGPByHn07QKBwpg8/OrQWLwKRU wmPaZRVKp6qS1+oYkGbF0AMbFtzsbMKRFN8M7Y/ixlJd4nZUSKYglZbL1BztGLtx gDc8XIlaSMLLFf9UdobfZz8AmxQui6u287NKBFv9a36kJgh3oeSf1J4fA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm3; bh=rpqGJA8BzP498VRthL+GNLGbJX6smf0yyUoSj3bk7lg=; b=OB7E272R oQsMem7IvWJ2BtjDYbP6oMYR1e0zswulSjGN3eJ4QYRXkjOQlokgXKSTGWDFvxxo jbLfcVg8382wxhA65ZWi5lDyqnp7xJXaYPkSam2Gspe6umCpCvDLcamP/nqoW6sH FUwyIcii2Fea0BHdFvB5Rjavt8tUvXoeecXAaj9eIbtzaEdWzQuWpRSIn9wnAY5l mKDNUklp1oqjLZFzrqLbOj2q06xhLNMrIAXVOnUTPya9SWC6ej++3YaX2R5NsRxC /FIEJXP30ZnAVum2Swo5K2DD96o8gVUNKyq9UY2bzVWLMVvBT6HCHem4MxrY9FRh HuF5pxCkOPVM/Q== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvtddrfedvgdeijecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhvffufffkofgjfhgggfestdekredtredttdenucfhrhhomhepofgrgihimhgv ucftihhprghrugcuoehmrgigihhmvgestggvrhhnohdrthgvtghhqeenucggtffrrghtth gvrhhnpedvkeelveefffekjefhffeuleetleefudeifeehuddugffghffhffehveevheeh vdenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehmrg igihhmvgestggvrhhnohdrthgvtghh X-ME-Proxy: Received: by mail.messagingengine.com (Postfix) with ESMTPA; Tue, 20 Jul 2021 09:46:09 -0400 (EDT) From: Maxime Ripard To: Robert Foss , Andrzej Hajda , Daniel Vetter , David Airlie , Sam Ravnborg , Maarten Lankhorst , Thomas Zimmermann , Maxime Ripard , Neil Armstrong , Jonas Karlman , Jernej Skrabec , Thierry Reding , Laurent Pinchart Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: [PATCH 09/10] drm/panel: raspberrypi-touchscreen: Use the attach hook Date: Tue, 20 Jul 2021 15:45:24 +0200 Message-Id: <20210720134525.563936-10-maxime@cerno.tech> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210720134525.563936-1-maxime@cerno.tech> References: <20210720134525.563936-1-maxime@cerno.tech> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Now that we have an attach hook available for panels as well, let's use it for the RaspberryPi 7" DSI panel. This now mimics what all the other bridges in a similar situation are doing, and we avoid our probe order issue entirely. Signed-off-by: Maxime Ripard --- .../drm/panel/panel-raspberrypi-touchscreen.c | 135 ++++++++++-------- 1 file changed, 77 insertions(+), 58 deletions(-) diff --git a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c index 462faae0f446..995c5cafb970 100644 --- a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c +++ b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c @@ -346,7 +346,83 @@ static int rpi_touchscreen_get_modes(struct drm_panel *panel, return num; } +static int rpi_touchscreen_attach(struct drm_panel *panel) +{ + struct rpi_touchscreen *ts = panel_to_ts(panel); + struct device *dev = &ts->i2c->dev; + struct device_node *endpoint, *dsi_host_node; + struct mipi_dsi_device *dsi; + struct mipi_dsi_host *host; + int ret; + + struct mipi_dsi_device_info info = { + .type = RPI_DSI_DRIVER_NAME, + .channel = 0, + .node = NULL, + }; + + /* Look up the DSI host. It needs to probe before we do. */ + endpoint = of_graph_get_next_endpoint(dev->of_node, NULL); + if (!endpoint) + return -ENODEV; + + dsi_host_node = of_graph_get_remote_port_parent(endpoint); + if (!dsi_host_node) { + of_node_put(endpoint); + return -ENODEV; + } + + host = of_find_mipi_dsi_host_by_node(dsi_host_node); + of_node_put(dsi_host_node); + if (!host) { + of_node_put(endpoint); + return -EPROBE_DEFER; + } + + info.node = of_graph_get_remote_port(endpoint); + if (!info.node) { + of_node_put(endpoint); + return -ENODEV; + } + + of_node_put(endpoint); + + dsi = mipi_dsi_device_register_full(host, &info); + if (IS_ERR(dsi)) { + dev_err(dev, "DSI device registration failed: %ld\n", + PTR_ERR(dsi)); + return PTR_ERR(dsi); + } + + ts->dsi = dsi; + + dsi->mode_flags = (MIPI_DSI_MODE_VIDEO | + MIPI_DSI_MODE_VIDEO_SYNC_PULSE | + MIPI_DSI_MODE_LPM); + dsi->format = MIPI_DSI_FMT_RGB888; + dsi->lanes = 1; + + ret = mipi_dsi_attach(dsi); + if (ret) { + dev_err(&dsi->dev, "failed to attach dsi to host: %d\n", ret); + return ret; + } + + return 0; +} + +static void rpi_touchscreen_detach(struct drm_panel *panel) +{ + struct rpi_touchscreen *ts = panel_to_ts(panel); + + mipi_dsi_detach(ts->dsi); + mipi_dsi_device_unregister(ts->dsi); +} + static const struct drm_panel_funcs rpi_touchscreen_funcs = { + .attach = rpi_touchscreen_attach, + .detach = rpi_touchscreen_detach, + .disable = rpi_touchscreen_disable, .unprepare = rpi_touchscreen_noop, .prepare = rpi_touchscreen_noop, @@ -359,14 +435,7 @@ static int rpi_touchscreen_probe(struct i2c_client *i2c, { struct device *dev = &i2c->dev; struct rpi_touchscreen *ts; - struct device_node *endpoint, *dsi_host_node; - struct mipi_dsi_host *host; int ver; - struct mipi_dsi_device_info info = { - .type = RPI_DSI_DRIVER_NAME, - .channel = 0, - .node = NULL, - }; ts = devm_kzalloc(dev, sizeof(*ts), GFP_KERNEL); if (!ts) @@ -394,35 +463,6 @@ static int rpi_touchscreen_probe(struct i2c_client *i2c, /* /\* Turn off at boot, so we can cleanly sequence powering on. *\/ */ /* rpi_touchscreen_i2c_write(ts, REG_POWERON, 0); */ - /* Look up the DSI host. It needs to probe before we do. */ - endpoint = of_graph_get_next_endpoint(dev->of_node, NULL); - if (!endpoint) - return -ENODEV; - - dsi_host_node = of_graph_get_remote_port_parent(endpoint); - if (!dsi_host_node) - goto error; - - host = of_find_mipi_dsi_host_by_node(dsi_host_node); - of_node_put(dsi_host_node); - if (!host) { - of_node_put(endpoint); - return -EPROBE_DEFER; - } - - info.node = of_graph_get_remote_port(endpoint); - if (!info.node) - goto error; - - of_node_put(endpoint); - - ts->dsi = mipi_dsi_device_register_full(host, &info); - if (IS_ERR(ts->dsi)) { - dev_err(dev, "DSI device registration failed: %ld\n", - PTR_ERR(ts->dsi)); - return PTR_ERR(ts->dsi); - } - drm_panel_init(&ts->base, dev, &rpi_touchscreen_funcs, DRM_MODE_CONNECTOR_DSI); @@ -432,41 +472,20 @@ static int rpi_touchscreen_probe(struct i2c_client *i2c, drm_panel_add(&ts->base); return 0; - -error: - of_node_put(endpoint); - return -ENODEV; } static int rpi_touchscreen_remove(struct i2c_client *i2c) { struct rpi_touchscreen *ts = i2c_get_clientdata(i2c); - mipi_dsi_detach(ts->dsi); - drm_panel_remove(&ts->base); - mipi_dsi_device_unregister(ts->dsi); - return 0; } static int rpi_touchscreen_dsi_probe(struct mipi_dsi_device *dsi) { - int ret; - - dsi->mode_flags = (MIPI_DSI_MODE_VIDEO | - MIPI_DSI_MODE_VIDEO_SYNC_PULSE | - MIPI_DSI_MODE_LPM); - dsi->format = MIPI_DSI_FMT_RGB888; - dsi->lanes = 1; - - ret = mipi_dsi_attach(dsi); - - if (ret) - dev_err(&dsi->dev, "failed to attach dsi to host: %d\n", ret); - - return ret; + return 0; } static struct mipi_dsi_driver rpi_touchscreen_dsi_driver = { -- 2.31.1