From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sakari Ailus Subject: [PATCH v3 10/23] v4l: fwnode: Read lane inversion information despite lane numbering Date: Thu, 13 Sep 2018 00:29:29 +0300 Message-ID: <20180912212942.19641-11-sakari.ailus@linux.intel.com> References: <20180912212942.19641-1-sakari.ailus@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20180912212942.19641-1-sakari.ailus@linux.intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: linux-media@vger.kernel.org Cc: devicetree@vger.kernel.org, jacopo@jmondi.org, dri-devel@lists.freedesktop.org, slongerbeam@gmail.com, niklas.soderlund@ragnatech.se List-Id: devicetree@vger.kernel.org UmVhZCB0aGUgbGFuZSBpbnZlcnNpb24gaW5kZXBlbmRlbnRseSBvZiB3aGV0aGVyIHRoZSAiZGF0 YS1sYW5lcyIgcHJvcGVydHkKZXhpc3RzLiBUaGlzIG1ha2VzIHNlbnNlIHNpbmNlIHRoZSBjYWxs ZXIgbWF5IHBhc3MgdGhlIG51bWJlciBvZiBsYW5lcyBhcwp0aGUgZGVmYXVsdCBjb25maWd1cmF0 aW9uIHdoaWxlIHRoZSBsYW5lIGludmVyc2lvbiBjb25maWd1cmF0aW9uIG1heSBzdGlsbApiZSBh dmFpbGFibGUgaW4gZmlybXdhcmUuCgpTaWduZWQtb2ZmLWJ5OiBTYWthcmkgQWlsdXMgPHNha2Fy aS5haWx1c0BsaW51eC5pbnRlbC5jb20+ClRlc3RlZC1ieTogU3RldmUgTG9uZ2VyYmVhbSA8c3Rl dmVfbG9uZ2VyYmVhbUBtZW50b3IuY29tPgotLS0KIGRyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0 bDItZndub2RlLmMgfCA2NSArKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLQogMSBm aWxlIGNoYW5nZWQsIDM1IGluc2VydGlvbnMoKyksIDMwIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdp dCBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItZndub2RlLmMgYi9kcml2ZXJzL21lZGlh L3Y0bDItY29yZS92NGwyLWZ3bm9kZS5jCmluZGV4IDc0YzJmNGUwM2U1Mi4uY2IwYjEyZWVmZTdm IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92NGwyLWZ3bm9kZS5jCisrKyBi L2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3Y0bDItZndub2RlLmMKQEAgLTQzLDI2ICs0MywzMSBA QCBlbnVtIHY0bDJfZndub2RlX2J1c190eXBlIHsKIH07CiAKIHN0YXRpYyBpbnQgdjRsMl9md25v ZGVfZW5kcG9pbnRfcGFyc2VfY3NpMl9idXMoc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9kZSwK LQkJCQkJICAgICAgIHN0cnVjdCB2NGwyX2Z3bm9kZV9lbmRwb2ludCAqdmVwKQorCQkJCQkgICAg ICAgc3RydWN0IHY0bDJfZndub2RlX2VuZHBvaW50ICp2ZXAsCisJCQkJCSAgICAgICBlbnVtIHY0 bDJfZndub2RlX2J1c190eXBlIGJ1c190eXBlKQogewogCXN0cnVjdCB2NGwyX2Z3bm9kZV9idXNf bWlwaV9jc2kyICpidXMgPSAmdmVwLT5idXMubWlwaV9jc2kyOwogCWJvb2wgaGF2ZV9jbGtfbGFu ZSA9IGZhbHNlOwogCXVuc2lnbmVkIGludCBmbGFncyA9IDAsIGxhbmVzX3VzZWQgPSAwOworCXUz MiBhcnJheVsxICsgVjRMMl9GV05PREVfQ1NJMl9NQVhfREFUQV9MQU5FU107CisJdW5zaWduZWQg aW50IG51bV9kYXRhX2xhbmVzID0gMDsKIAl1bnNpZ25lZCBpbnQgaTsKIAl1MzIgdjsKIAlpbnQg cnZhbDsKIAorCWlmIChidXNfdHlwZSA9PSBWNEwyX0ZXTk9ERV9CVVNfVFlQRV9DU0kyX0RQSFkp CisJCW51bV9kYXRhX2xhbmVzID0gbWluX3QodTMyLCBidXMtPm51bV9kYXRhX2xhbmVzLAorCQkJ CSAgICAgICBWNEwyX0ZXTk9ERV9DU0kyX01BWF9EQVRBX0xBTkVTKTsKKwogCXJ2YWwgPSBmd25v ZGVfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkoZndub2RlLCAiZGF0YS1sYW5lcyIsIE5VTEwsIDAp OwogCWlmIChydmFsID4gMCkgewotCQl1MzIgYXJyYXlbMSArIFY0TDJfRldOT0RFX0NTSTJfTUFY X0RBVEFfTEFORVNdOwotCi0JCWJ1cy0+bnVtX2RhdGFfbGFuZXMgPQorCQludW1fZGF0YV9sYW5l cyA9CiAJCQltaW5fdChpbnQsIFY0TDJfRldOT0RFX0NTSTJfTUFYX0RBVEFfTEFORVMsIHJ2YWwp OwogCiAJCWZ3bm9kZV9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShmd25vZGUsICJkYXRhLWxhbmVz IiwgYXJyYXksCi0JCQkJCSAgICAgICBidXMtPm51bV9kYXRhX2xhbmVzKTsKKwkJCQkJICAgICAg IG51bV9kYXRhX2xhbmVzKTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgYnVzLT5udW1fZGF0YV9sYW5l czsgaSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fZGF0YV9sYW5lczsgaSsrKSB7CiAJCQlp ZiAobGFuZXNfdXNlZCAmIEJJVChhcnJheVtpXSkpCiAJCQkJcHJfd2FybigiZHVwbGljYXRlZCBs YW5lICV1IGluIGRhdGEtbGFuZXNcbiIsCiAJCQkJCWFycmF5W2ldKTsKQEAgLTcxLDMwICs3Niwy NyBAQCBzdGF0aWMgaW50IHY0bDJfZndub2RlX2VuZHBvaW50X3BhcnNlX2NzaTJfYnVzKHN0cnVj dCBmd25vZGVfaGFuZGxlICpmd25vZGUsCiAJCQlidXMtPmRhdGFfbGFuZXNbaV0gPSBhcnJheVtp XTsKIAkJCXByX2RlYnVnKCJsYW5lICV1IHBvc2l0aW9uICV1XG4iLCBpLCBhcnJheVtpXSk7CiAJ CX0KKwl9CiAKLQkJcnZhbCA9IGZ3bm9kZV9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShmd25vZGUs Ci0JCQkJCQkgICAgICAibGFuZS1wb2xhcml0aWVzIiwgTlVMTCwKLQkJCQkJCSAgICAgIDApOwot CQlpZiAocnZhbCA+IDApIHsKLQkJCWlmIChydmFsICE9IDEgKyBidXMtPm51bV9kYXRhX2xhbmVz IC8qIGNsb2NrK2RhdGEgKi8pIHsKLQkJCQlwcl93YXJuKCJpbnZhbGlkIG51bWJlciBvZiBsYW5l LXBvbGFyaXRpZXMgZW50cmllcyAobmVlZCAldSwgZ290ICV1KVxuIiwKLQkJCQkJMSArIGJ1cy0+ bnVtX2RhdGFfbGFuZXMsIHJ2YWwpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQorCXJ2YWwg PSBmd25vZGVfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkoZndub2RlLCAibGFuZS1wb2xhcml0aWVz IiwgTlVMTCwKKwkJCQkJICAgICAgMCk7CisJaWYgKHJ2YWwgPiAwKSB7CisJCWlmIChydmFsICE9 IDEgKyBudW1fZGF0YV9sYW5lcyAvKiBjbG9jaytkYXRhICovKSB7CisJCQlwcl93YXJuKCJpbnZh bGlkIG51bWJlciBvZiBsYW5lLXBvbGFyaXRpZXMgZW50cmllcyAobmVlZCAldSwgZ290ICV1KVxu IiwKKwkJCQkxICsgbnVtX2RhdGFfbGFuZXMsIHJ2YWwpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJ CX0KIAotCQkJZndub2RlX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KGZ3bm9kZSwKLQkJCQkJCSAg ICAgICAibGFuZS1wb2xhcml0aWVzIiwgYXJyYXksCi0JCQkJCQkgICAgICAgMSArIGJ1cy0+bnVt X2RhdGFfbGFuZXMpOworCQlmd25vZGVfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkoZndub2RlLCAi bGFuZS1wb2xhcml0aWVzIiwgYXJyYXksCisJCQkJCSAgICAgICAxICsgbnVtX2RhdGFfbGFuZXMp OwogCi0JCQlmb3IgKGkgPSAwOyBpIDwgMSArIGJ1cy0+bnVtX2RhdGFfbGFuZXM7IGkrKykgewot CQkJCWJ1cy0+bGFuZV9wb2xhcml0aWVzW2ldID0gYXJyYXlbaV07Ci0JCQkJcHJfZGVidWcoImxh bmUgJXUgcG9sYXJpdHkgJXNpbnZlcnRlZCIsCi0JCQkJCSBpLCBhcnJheVtpXSA/ICIiIDogIm5v dCAiKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXByX2RlYnVnKCJubyBsYW5lIHBvbGFyaXRpZXMg ZGVmaW5lZCwgYXNzdW1pbmcgbm90IGludmVydGVkXG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IDEg KyBudW1fZGF0YV9sYW5lczsgaSsrKSB7CisJCQlidXMtPmxhbmVfcG9sYXJpdGllc1tpXSA9IGFy cmF5W2ldOworCQkJcHJfZGVidWcoImxhbmUgJXUgcG9sYXJpdHkgJXNpbnZlcnRlZCIsCisJCQkJ IGksIGFycmF5W2ldID8gIiIgOiAibm90ICIpOwogCQl9Ci0KKwl9IGVsc2UgeworCQlwcl9kZWJ1 Zygibm8gbGFuZSBwb2xhcml0aWVzIGRlZmluZWQsIGFzc3VtaW5nIG5vdCBpbnZlcnRlZFxuIik7 CiAJfQogCiAJaWYgKCFmd25vZGVfcHJvcGVydHlfcmVhZF91MzIoZndub2RlLCAiY2xvY2stbGFu ZXMiLCAmdikpIHsKQEAgLTExNCwxMCArMTE2LDExIEBAIHN0YXRpYyBpbnQgdjRsMl9md25vZGVf ZW5kcG9pbnRfcGFyc2VfY3NpMl9idXMoc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9kZSwKIAkJ ZmxhZ3MgfD0gVjRMMl9NQlVTX0NTSTJfQ09OVElOVU9VU19DTE9DSzsKIAl9CiAKLQlpZiAobGFu ZXNfdXNlZCB8fCBoYXZlX2Nsa19sYW5lIHx8Ci0JICAgIChmbGFncyAmIH5WNEwyX01CVVNfQ1NJ Ml9DT05USU5VT1VTX0NMT0NLKSkgeworCWlmIChidXNfdHlwZSA9PSBWNEwyX0ZXTk9ERV9CVVNf VFlQRV9DU0kyX0RQSFkgfHwgbGFuZXNfdXNlZCB8fAorCSAgICBoYXZlX2Nsa19sYW5lIHx8IChm bGFncyAmIH5WNEwyX01CVVNfQ1NJMl9DT05USU5VT1VTX0NMT0NLKSkgewogCQlidXMtPmZsYWdz ID0gZmxhZ3M7CiAJCXZlcC0+YnVzX3R5cGUgPSBWNEwyX01CVVNfQ1NJMl9EUEhZOworCQlidXMt Pm51bV9kYXRhX2xhbmVzID0gbnVtX2RhdGFfbGFuZXM7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0y NzMsNyArMjc2LDggQEAgc3RhdGljIGludCBfX3Y0bDJfZndub2RlX2VuZHBvaW50X3BhcnNlKHN0 cnVjdCBmd25vZGVfaGFuZGxlICpmd25vZGUsCiAKIAlzd2l0Y2ggKGJ1c190eXBlKSB7CiAJY2Fz ZSBWNEwyX0ZXTk9ERV9CVVNfVFlQRV9HVUVTUzoKLQkJcnZhbCA9IHY0bDJfZndub2RlX2VuZHBv aW50X3BhcnNlX2NzaTJfYnVzKGZ3bm9kZSwgdmVwKTsKKwkJcnZhbCA9IHY0bDJfZndub2RlX2Vu ZHBvaW50X3BhcnNlX2NzaTJfYnVzKGZ3bm9kZSwgdmVwLAorCQkJCQkJCSAgIGJ1c190eXBlKTsK IAkJaWYgKHJ2YWwpCiAJCQlyZXR1cm4gcnZhbDsKIApAQCAtMjg5LDcgKzI5Myw4IEBAIHN0YXRp YyBpbnQgX192NGwyX2Z3bm9kZV9lbmRwb2ludF9wYXJzZShzdHJ1Y3QgZndub2RlX2hhbmRsZSAq Zndub2RlLAogCQlicmVhazsKIAljYXNlIFY0TDJfRldOT0RFX0JVU19UWVBFX0NTSTJfRFBIWToK IAkJdmVwLT5idXNfdHlwZSA9IFY0TDJfTUJVU19DU0kyX0RQSFk7Ci0JCXJ2YWwgPSB2NGwyX2Z3 bm9kZV9lbmRwb2ludF9wYXJzZV9jc2kyX2J1cyhmd25vZGUsIHZlcCk7CisJCXJ2YWwgPSB2NGwy X2Z3bm9kZV9lbmRwb2ludF9wYXJzZV9jc2kyX2J1cyhmd25vZGUsIHZlcCwKKwkJCQkJCQkgICBi dXNfdHlwZSk7CiAJCWlmIChydmFsKQogCQkJcmV0dXJuIHJ2YWw7CiAKLS0gCjIuMTEuMAoKX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1h aWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMu ZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from nblzone-211-213.nblnetworks.fi ([83.145.211.213]:40964 "EHLO hillosipuli.retiisi.org.uk" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1728234AbeIMCgK (ORCPT ); Wed, 12 Sep 2018 22:36:10 -0400 From: Sakari Ailus To: linux-media@vger.kernel.org Cc: devicetree@vger.kernel.org, slongerbeam@gmail.com, niklas.soderlund@ragnatech.se, jacopo@jmondi.org, p.zabel@pengutronix.de, dri-devel@lists.freedesktop.org Subject: [PATCH v3 10/23] v4l: fwnode: Read lane inversion information despite lane numbering Date: Thu, 13 Sep 2018 00:29:29 +0300 Message-Id: <20180912212942.19641-11-sakari.ailus@linux.intel.com> In-Reply-To: <20180912212942.19641-1-sakari.ailus@linux.intel.com> References: <20180912212942.19641-1-sakari.ailus@linux.intel.com> Sender: linux-media-owner@vger.kernel.org List-ID: Read the lane inversion independently of whether the "data-lanes" property exists. This makes sense since the caller may pass the number of lanes as the default configuration while the lane inversion configuration may still be available in firmware. Signed-off-by: Sakari Ailus Tested-by: Steve Longerbeam --- drivers/media/v4l2-core/v4l2-fwnode.c | 65 +++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/drivers/media/v4l2-core/v4l2-fwnode.c b/drivers/media/v4l2-core/v4l2-fwnode.c index 74c2f4e03e52..cb0b12eefe7f 100644 --- a/drivers/media/v4l2-core/v4l2-fwnode.c +++ b/drivers/media/v4l2-core/v4l2-fwnode.c @@ -43,26 +43,31 @@ enum v4l2_fwnode_bus_type { }; static int v4l2_fwnode_endpoint_parse_csi2_bus(struct fwnode_handle *fwnode, - struct v4l2_fwnode_endpoint *vep) + struct v4l2_fwnode_endpoint *vep, + enum v4l2_fwnode_bus_type bus_type) { struct v4l2_fwnode_bus_mipi_csi2 *bus = &vep->bus.mipi_csi2; bool have_clk_lane = false; unsigned int flags = 0, lanes_used = 0; + u32 array[1 + V4L2_FWNODE_CSI2_MAX_DATA_LANES]; + unsigned int num_data_lanes = 0; unsigned int i; u32 v; int rval; + if (bus_type == V4L2_FWNODE_BUS_TYPE_CSI2_DPHY) + num_data_lanes = min_t(u32, bus->num_data_lanes, + V4L2_FWNODE_CSI2_MAX_DATA_LANES); + rval = fwnode_property_read_u32_array(fwnode, "data-lanes", NULL, 0); if (rval > 0) { - u32 array[1 + V4L2_FWNODE_CSI2_MAX_DATA_LANES]; - - bus->num_data_lanes = + num_data_lanes = min_t(int, V4L2_FWNODE_CSI2_MAX_DATA_LANES, rval); fwnode_property_read_u32_array(fwnode, "data-lanes", array, - bus->num_data_lanes); + num_data_lanes); - for (i = 0; i < bus->num_data_lanes; i++) { + for (i = 0; i < num_data_lanes; i++) { if (lanes_used & BIT(array[i])) pr_warn("duplicated lane %u in data-lanes\n", array[i]); @@ -71,30 +76,27 @@ static int v4l2_fwnode_endpoint_parse_csi2_bus(struct fwnode_handle *fwnode, bus->data_lanes[i] = array[i]; pr_debug("lane %u position %u\n", i, array[i]); } + } - rval = fwnode_property_read_u32_array(fwnode, - "lane-polarities", NULL, - 0); - if (rval > 0) { - if (rval != 1 + bus->num_data_lanes /* clock+data */) { - pr_warn("invalid number of lane-polarities entries (need %u, got %u)\n", - 1 + bus->num_data_lanes, rval); - return -EINVAL; - } + rval = fwnode_property_read_u32_array(fwnode, "lane-polarities", NULL, + 0); + if (rval > 0) { + if (rval != 1 + num_data_lanes /* clock+data */) { + pr_warn("invalid number of lane-polarities entries (need %u, got %u)\n", + 1 + num_data_lanes, rval); + return -EINVAL; + } - fwnode_property_read_u32_array(fwnode, - "lane-polarities", array, - 1 + bus->num_data_lanes); + fwnode_property_read_u32_array(fwnode, "lane-polarities", array, + 1 + num_data_lanes); - for (i = 0; i < 1 + bus->num_data_lanes; i++) { - bus->lane_polarities[i] = array[i]; - pr_debug("lane %u polarity %sinverted", - i, array[i] ? "" : "not "); - } - } else { - pr_debug("no lane polarities defined, assuming not inverted\n"); + for (i = 0; i < 1 + num_data_lanes; i++) { + bus->lane_polarities[i] = array[i]; + pr_debug("lane %u polarity %sinverted", + i, array[i] ? "" : "not "); } - + } else { + pr_debug("no lane polarities defined, assuming not inverted\n"); } if (!fwnode_property_read_u32(fwnode, "clock-lanes", &v)) { @@ -114,10 +116,11 @@ static int v4l2_fwnode_endpoint_parse_csi2_bus(struct fwnode_handle *fwnode, flags |= V4L2_MBUS_CSI2_CONTINUOUS_CLOCK; } - if (lanes_used || have_clk_lane || - (flags & ~V4L2_MBUS_CSI2_CONTINUOUS_CLOCK)) { + if (bus_type == V4L2_FWNODE_BUS_TYPE_CSI2_DPHY || lanes_used || + have_clk_lane || (flags & ~V4L2_MBUS_CSI2_CONTINUOUS_CLOCK)) { bus->flags = flags; vep->bus_type = V4L2_MBUS_CSI2_DPHY; + bus->num_data_lanes = num_data_lanes; } return 0; @@ -273,7 +276,8 @@ static int __v4l2_fwnode_endpoint_parse(struct fwnode_handle *fwnode, switch (bus_type) { case V4L2_FWNODE_BUS_TYPE_GUESS: - rval = v4l2_fwnode_endpoint_parse_csi2_bus(fwnode, vep); + rval = v4l2_fwnode_endpoint_parse_csi2_bus(fwnode, vep, + bus_type); if (rval) return rval; @@ -289,7 +293,8 @@ static int __v4l2_fwnode_endpoint_parse(struct fwnode_handle *fwnode, break; case V4L2_FWNODE_BUS_TYPE_CSI2_DPHY: vep->bus_type = V4L2_MBUS_CSI2_DPHY; - rval = v4l2_fwnode_endpoint_parse_csi2_bus(fwnode, vep); + rval = v4l2_fwnode_endpoint_parse_csi2_bus(fwnode, vep, + bus_type); if (rval) return rval; -- 2.11.0