From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 2FF91C54EE9 for ; Fri, 16 Sep 2022 14:35:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=r57A6OjzWt+a8v9WKp7gl6NVebosAWdZZJRzA43TJbM=; b=K0yEyhlnLxrwTW yCa19nA85YnBEPAQVjRY0n2SD/iK0cXIHUsBwu1ZpXbRRn724xb5HCT8SC/CUY9sBdK/RtrUGoz8K gIcq5IUhH62VksFHTZjCv5fPN97/B0XjfuldrVC7uSAv/2X++yJIDUqatH0aZYCnQE24Shhfw2CuD fQUXEF9LpHI8ND6wHm55JtW3ESrfURHQvSgxVvF74ojZ9zuQBBhv9UC45Ymas9Szq1VzPoiTycT+a IpR9F3l6Ao6RBhSzFH6Oi2xsaf60lmV81S1B/7605W/xB3l86MwUcnano9DEEQG4e6WPvtuUCep/D 6KWPtgSwLi59tYv9KJ1w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oZCRO-00EEx5-7h; Fri, 16 Sep 2022 14:35:38 +0000 Received: from perceval.ideasonboard.com ([213.167.242.64]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oZCPI-00ED5u-DI for linux-phy@lists.infradead.org; Fri, 16 Sep 2022 14:33:31 +0000 Received: from pendragon.ideasonboard.com (unknown [104.132.8.103]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 4B372440; Fri, 16 Sep 2022 16:33:26 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1663338806; bh=0mq6iLjBRXE5LO1vAZY1gNiVywyq6U+Bz30w2WEJ6W0=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=FFOXZCjlrBQLXWQVyj4ZYr+ig3ENlC0wfxUIL2C3aKei8hr+pAgbpWkDF8+4BdlCl +yeOJcWbv60wj4es3VfrER/TBurm/yyeKBuZDwpAvEpFIHDMJquJEvOXgHLbRECoUQ RGBlyg0gbDBV0jRAIpxOs0l+95zluKk/tPnRbRvs= Date: Fri, 16 Sep 2022 17:33:12 +0300 From: Laurent Pinchart To: Marco Felsch Cc: mchehab@kernel.org, robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, vkoul@kernel.org, kishon@ti.com, sakari.ailus@linux.intel.com, hverkuil@xs4all.nl, jacopo@jmondi.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, devicetree@vger.kernel.org, linux-media@vger.kernel.org, kernel@pengutronix.de Subject: Re: [PATCH 4/4] media: tc358746: add Toshiba TC358746 Parallel to CSI-2 bridge driver Message-ID: References: <20220818143307.967150-1-m.felsch@pengutronix.de> <20220818143307.967150-5-m.felsch@pengutronix.de> <20220915165404.ghcjntxom7kzqyuy@pengutronix.de> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20220915165404.ghcjntxom7kzqyuy@pengutronix.de> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220916_073328_800175_B678A137 X-CRM114-Status: GOOD ( 51.19 ) X-BeenThere: linux-phy@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux Phy Mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-phy" Errors-To: linux-phy-bounces+linux-phy=archiver.kernel.org@lists.infradead.org SGkgTWFyY28sCgpPbiBUaHUsIFNlcCAxNSwgMjAyMiBhdCAwNjo1NDowNFBNICswMjAwLCBNYXJj byBGZWxzY2ggd3JvdGU6Cj4gT24gMjItMDktMDUsIExhdXJlbnQgUGluY2hhcnQgd3JvdGU6Cj4g PiBPbiBUaHUsIEF1ZyAxOCwgMjAyMiBhdCAwNDozMzowN1BNICswMjAwLCBNYXJjbyBGZWxzY2gg d3JvdGU6Cj4gPiA+IEFkZGluZyBzdXBwb3J0IGZvciB0aGUgVEMzNTg3NDYgcGFyYWxsZWwgPC0+ IE1JUEkgQ1NJIGJyaWRnZS4gVGhpcyBjaGlwCj4gPiA+IHN1cHBvcnRzIHR3byBvcGVyYXRpbmcg bW9kZXM6Cj4gPiA+ICAgMXN0KSBwYXJhbGxlbC1pbiAtPiBtaXBpLWNzaSBvdXQKPiA+ID4gICAy bmQpIG1pcGktY3NpIGluIC0+IHBhcmFsbGVsIG91dAo+ID4gPiAKPiA+ID4gVGhpcyBwYXRjaCBv bmx5IGFkZHMgdGhlIHN1cHBvcnQgZm9yIHRoZSAxc3QgbW9kZS4KPiA+ID4gCj4gPiA+IFNpZ25l ZC1vZmYtYnk6IE1hcmNvIEZlbHNjaCA8bS5mZWxzY2hAcGVuZ3V0cm9uaXguZGU+Cj4gPiA+IC0t LQo+ID4gPiAgZHJpdmVycy9tZWRpYS9pMmMvS2NvbmZpZyAgICB8ICAgMTcgKwo+ID4gPiAgZHJp dmVycy9tZWRpYS9pMmMvTWFrZWZpbGUgICB8ICAgIDEgKwo+ID4gPiAgZHJpdmVycy9tZWRpYS9p MmMvdGMzNTg3NDYuYyB8IDE2NDUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ ID4gPiAgMyBmaWxlcyBjaGFuZ2VkLCAxNjYzIGluc2VydGlvbnMoKykKPiA+ID4gIGNyZWF0ZSBt b2RlIDEwMDY0NCBkcml2ZXJzL21lZGlhL2kyYy90YzM1ODc0Ni5jCgpbc25pcF0KCj4gPiA+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2kyYy90YzM1ODc0Ni5jIGIvZHJpdmVycy9tZWRpYS9p MmMvdGMzNTg3NDYuYwo+ID4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4gPiBpbmRleCAwMDAw MDAwMDAwMDAuLjdiNzFkMGNmNzJhOQo+ID4gPiAtLS0gL2Rldi9udWxsCj4gPiA+ICsrKyBiL2Ry aXZlcnMvbWVkaWEvaTJjL3RjMzU4NzQ2LmMKCltzbmlwXQoKPiA+ID4gK3N0cnVjdCB0YzM1ODc0 NiB7Cj4gPiA+ICsJc3RydWN0IHY0bDJfc3ViZGV2CQlzZDsKPiA+ID4gKwlzdHJ1Y3QgbWVkaWFf cGFkCQlwYWRzW1RDMzU4NzQ2X05SX1BBRFNdOwo+ID4gPiArCXN0cnVjdCB2NGwyX2FzeW5jX25v dGlmaWVyCW5vdGlmaWVyOwo+ID4gPiArCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQJbWJ1c2Zt dDsKPiA+IAo+ID4gQ291bGQgeW91IHVzZSB0aGUgYWN0aXZlIHN0YXRlIEFQSSBpbnN0ZWFkIG9m IG1hbnVhbGx5IHN0b3JpbmcgbWJ1c2ZtdAo+ID4gaGVyZSA/IEl0IGludm9sdmVzCj4gCj4gSSB3 aWxsIGRvIHRoYXQsIHRoYW5rcyBmb3IgdGhlIGhpbnQgYW5kIGl0IGFsc28gZWxpbWF0ZXMgYSBm ZXcgYmFzaWMKPiBjaGVja3MgbGlrZSB0aGUgcGFkLW51bSBjaGVjay4KCkV2ZW4gbmljZXIgOi0p Cgo+ID4gLSBJbXBsZW1lbnRpbmcgdGhlIC5pbml0X2NmZygpIG9wZXJhdGlvbgo+ID4gLSBDYWxs aW5nIHY0bDJfc3ViZGV2X2luaXRfZmluYWxpemUoKSBpbiBwcm9iZQo+ID4gLSBSZXBsYWNpbmcg Y2FsbHMgdG8gX190YzM1ODc0Nl9nZXRfcGFkX2Zvcm1hdCgpIHdpdGgKPiA+ICAgdjRsMl9zdWJk ZXZfZ2V0X3BhZF9mb3JtYXQoKQo+ID4gLSBQcm9wYWdhdGluZyB0aGUgZm9ybWF0IGZyb20gc2lu ayB0byBzb3VyY2UgaW4gdGMzNTg3NDZfc2V0X2ZtdCgpCj4gPiAtIERyb3BwaW5nIHRjMzU4NzQ2 X3NyY19tYnVzX2NvZGUoKSBmcm9tIHRjMzU4NzQ2X2dldF9mbXQoKSBhbmQgc2ltcGx5Cj4gPiAg IHJldHJpZXZpbmcgdGhlIGZvcm1hdCB1c2luZyB2NGwyX3N1YmRldl9nZXRfcGFkX2Zvcm1hdCgp IHRoZXJlCj4gPiAtIERyb3BwaW5nIHRoaXMgZmllbGQKPiA+IAo+ID4gVGhlIGZvcm1hdHMgZm9y IGJvdGggdGhlIEFDVElWRSBhbmQgVFJZIHN0YXRlcyB3aWxsIHRoZW4gYmUgc3RvcmVkIGluCj4g PiB0aGUgc3ViZGV2IHN0YXRlLCB1bmNvbmRpdGlvbmFsbHkuIFlvdSBjYW4gcmV0cmlldmUgdGhl IGFjdGl2ZSBzdGF0ZQo+ID4gd2l0aCB2NGwyX3N1YmRldl9nZXRfbG9ja2VkX2FjdGl2ZV9zdGF0 ZSgpIGluIHRjMzU4NzQ2X3Nfc3RyZWFtKCkuCj4gPiAKPiA+ID4gKwlzdHJ1Y3QgdjRsMl9md25v ZGVfZW5kcG9pbnQJY3NpX3ZlcDsKPiA+ID4gKwo+ID4gPiArCXN0cnVjdCB2NGwyX2N0cmxfaGFu ZGxlcgljdHJsX2hkbDsKPiA+ID4gKwo+ID4gPiArCXN0cnVjdCByZWdtYXAJCQkqcmVnbWFwOwo+ ID4gPiArCXN0cnVjdCBjbGsJCQkqcmVmY2xrOwo+ID4gPiArCXN0cnVjdCBncGlvX2Rlc2MJCSpy ZXNldF9ncGlvOwo+ID4gPiArCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhCXN1cHBsaWVzW0FS UkFZX1NJWkUodGMzNTg3NDZfc3VwcGxpZXMpXTsKPiA+ID4gKwo+ID4gPiArCXN0cnVjdCBjbGtf aHcJCQltY2xrX2h3Owo+ID4gPiArCXVuc2lnbmVkIGxvbmcJCQltY2xrX3JhdGU7Cj4gPiA+ICsJ dTgJCQkJbWNsa19wcmVkaXY7Cj4gPiA+ICsJdTE2CQkJCW1jbGtfcG9zdGRpdjsKPiA+ID4gKwo+ ID4gPiArCXVuc2lnbmVkIGxvbmcJCQlwbGxfcmF0ZTsKPiA+ID4gKwl1OAkJCQlwbGxfcG9zdF9k aXY7Cj4gPiA+ICsJdTE2CQkJCXBsbF9wcmVfZGl2Owo+ID4gPiArCXUxNgkJCQlwbGxfbXVsOwo+ ID4gPiArCj4gPiA+ICsJc3RydWN0IHY0bDJfY3RybAkJKnNlbnNvcl9wY2xrX2N0cmw7Cj4gPiA+ ICsKPiA+ID4gKyNkZWZpbmUgVEMzNTg3NDZfVkJfTUFYX1NJWkUJCSg1MTEgKiAzMikKPiA+ID4g KyNkZWZpbmUgVEMzNTg3NDZfVkJfREVGQVVMVF9TSVpFCSAgKDEgKiAzMikKPiA+ID4gKwl1bnNp Z25lZCBpbnQJCQl2Yl9zaXplOyAvKiBWaWRlbyBidWZmZXIgc2l6ZSBpbiBiaXRzICovCj4gPiA+ ICsKPiA+ID4gKwlzdHJ1Y3QgcGh5X2NvbmZpZ3VyZV9vcHRzX21pcGlfZHBoeSBkcGh5X2NmZzsK PiA+ID4gK307Cgpbc25pcF0KCj4gPiA+ICsjaWZuZGVmIE1IWgo+ID4gCj4gPiBXaGVyZSB3b3Vs ZCBpdCBiZSBwcmV2aW91c2x5IGRlZmluZWQgPyBUaGlzIHNvdW5kcyBsaWtlIGFza2luZyBmb3IK PiA+IHRyb3VibGUgbGF0ZXIuCj4gCj4gU29ycnkgSSBkb24ndCBnZXQgdGhhdCwgZG8geW91IG1l YW4gdGhhdCBJIHNob3VsZCBkZWZpbmUgaXQgYXQgdGhlIHZlcnkKPiBiZWdpbm5pbmc/CgpJIG1l YW4gdGhhdCBlaXRoZXIgTUhaIGlzIGRlZmluZWQgc29tZXdoZXJlIGluIHRoZSBrZXJuZWwgYWxy ZWFkeSwgaW4KY2FzZSB3ZSBzaG91bGQgaW5jbHVkZSB0aGUgY29ycmVzcG9uZGluZyBoZWFkZXIs IG9yIGl0J3Mgbm90LCBhbmQgSQp3b3VsZG4ndCBhZGQgYW4gI2lmbmRldiBoZXJlLiBPdGhlcndp c2UsIGlmIHNvbWVvbmUgYWRkcyBhIE1IWiBtYWNybwpsYXRlciB0aGF0IGdldHMgcHVsbGVkIGlu IHRocm91Z2ggb25lIG9mIHRoZSBrZXJuZWwgaGVhZGVycyB1c2VkIGJ5IHRoZQpkcml2ZXIsIGl0 IG1heSBjYXVzZSBzdWJ0bGUgYnVncyBpZiB0aGUgZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQuIE9m CmNvdXJzZSBub2JvZHkgd2lsbAoKI2RlZmluZSBNSFoJCTQyCgpidXQgd2UgY291bGQgZ2V0Cgoj ZGVmaW5lIE1IWgkJMTAwMCAqIDEwMDAKCmFuZCBzb21ldGhpbmcgY291bGQgYnJlYWsgaGVyZS4g SSdkIGRyb3AgdGhlICNpZm5kZWYgdG8gZ2V0IHRoZSBjb21waWxlcgp0byBjb21wbGFpbiBpZiB0 aGVyZSdzIGEgcmVkZWZpbml0aW9uLgoKPiA+ID4gKyNkZWZpbmUgTUhaCQkoMTAwMCAqIDEwMDAp Cj4gPiA+ICsjZW5kaWYKCltzbmlwXQoKPiA+ID4gK3N0YXRpYyBpbnQKPiA+ID4gK3RjMzU4NzQ2 X2xpbmtfdmFsaWRhdGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IG1lZGlhX2xpbmsg KmxpbmssCj4gPiA+ICsJCSAgICAgICBzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0ICpzb3VyY2Vf Zm10LAo+ID4gPiArCQkgICAgICAgc3RydWN0IHY0bDJfc3ViZGV2X2Zvcm1hdCAqc2lua19mbXQp Cj4gPiA+ICt7Cj4gPiA+ICsJc3RydWN0IHRjMzU4NzQ2ICp0YzM1ODc0NiA9IHRvX3RjMzU4NzQ2 KHNkKTsKPiA+ID4gKwl1bnNpZ25lZCBsb25nIGNzaV9iaXRyYXRlLCBzZW5zb3JfYml0cmF0ZTsK PiA+ID4gKwljb25zdCBzdHJ1Y3QgdGMzNTg3NDZfZm9ybWF0ICpmbXQ7Cj4gPiA+ICsJdW5zaWdu ZWQgaW50IGZpZm9fc3osIHRtcCwgbjsKPiA+ID4gKwlzNjQgc2Vuc29yX3BjbGtfcmF0ZTsKPiA+ ID4gKwo+ID4gPiArCS8qIENoZWNrIHRoZSBGSUZPIHNldHRpbmdzICovCj4gPiA+ICsJZm10ID0g dGMzNTg3NDZfZ2V0X2Zvcm1hdF9ieV9jb2RlKFRDMzU4NzQ2X1NJTkssIHRjMzU4NzQ2LT5tYnVz Zm10LmNvZGUpOwo+ID4gPiArCWlmIChJU19FUlIoZm10KSkKPiA+ID4gKwkJcmV0dXJuIFBUUl9F UlIoZm10KTsKPiA+ID4gKwo+ID4gPiArCXNlbnNvcl9wY2xrX3JhdGUgPSB2NGwyX2N0cmxfZ19j dHJsX2ludDY0KHRjMzU4NzQ2LT5zZW5zb3JfcGNsa19jdHJsKTsKPiA+ID4gKwlzZW5zb3JfYml0 cmF0ZSA9IHNlbnNvcl9wY2xrX3JhdGUgKiBmbXQtPmJ1c193aWR0aDsKPiA+ID4gKwo+ID4gPiAr CWNzaV9iaXRyYXRlID0gdGMzNTg3NDYtPmRwaHlfY2ZnLmxhbmVzICogdGMzNTg3NDYtPnBsbF9y YXRlOwo+ID4gPiArCj4gPiA+ICsJZGV2X2RiZyh0YzM1ODc0Ni0+c2QuZGV2LAo+ID4gPiArCQki RmlmbyBzZXR0aW5ncyBwYXJhbXM6IHNlbnNvci1iaXRyYXRlOiVsdSBjc2ktYml0cmF0ZTolbHUi LAo+ID4gPiArCQlzZW5zb3JfYml0cmF0ZSwgY3NpX2JpdHJhdGUpOwo+ID4gPiArCj4gPiA+ICsJ LyogQXZvaWQgcG9zc2libGUgRklGTyBvdmVyZmxvd3MgKi8KPiA+ID4gKwlpZiAoY3NpX2JpdHJh dGUgPCBzZW5zb3JfYml0cmF0ZSkgewo+ID4gPiArCQlkZXZfZXJyKHNkLT5kZXYsCj4gPiA+ICsJ CQkiTGluayB2YWxpZGF0aW9uIGZhaWxlZCBjc2ktYml0cmF0ZTolbHUgPCBzZW5zb3ItYml0cmF0 ZTolbHVcbiIsCj4gPiA+ICsJCQljc2lfYml0cmF0ZSwgc2Vuc29yX2JpdHJhdGUpOwo+ID4gPiAr CQlyZXR1cm4gLUVJTlZBTDsKPiA+ID4gKwl9Cj4gPiA+ICsKPiA+ID4gKwkvKiBCZXN0IGNhc2Ug Ki8KPiA+ID4gKwlpZiAoY3NpX2JpdHJhdGUgPT0gc2Vuc29yX2JpdHJhdGUpIHsKPiA+ID4gKwkJ dGMzNTg3NDYtPnZiX3NpemUgPSBUQzM1ODc0Nl9WQl9ERUZBVUxUX1NJWkU7Cj4gPiA+ICsJCWdv dG8gb3V0Owo+ID4gPiArCX0KPiA+ID4gKwo+ID4gPiArCS8qCj4gPiA+ICsJICogQXZvaWQgcG9z c2libGUgRklGTyB1bmRlcmZsb3cgaW4gY2FzZSBvZgo+ID4gPiArCSAqIGNzaV9iaXRyYXRlID4g c2Vuc29yX2JpdHJhdGUuIEZvciBzdWNoIGNhc2UgdGhlIGNoaXAgaGFzIGEgaW50ZXJuYWwKPiA+ ID4gKwkgKiBmaWZvIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGRlbGF5IHRoZSBsaW5lIG91dHB1dC4K PiA+ID4gKwkgKgo+ID4gPiArCSAqIEZpZm8gc2l6ZSBjYWxjdWxhdGlvbjoKPiA+ID4gKwkgKgo+ ID4gPiArCSAqIGZpZm8tc3osIGltYWdlLXdpZHRoIC0gaW4gYml0cwo+ID4gPiArCSAqIHNiciAg ICAgICAgICAgICAgICAgIC0gc2Vuc29yX2JpdHJhdGUgaW4gYml0cy9zCj4gPiA+ICsJICogY3Np ciAgICAgICAgICAgICAgICAgLSBjc2lfYml0cmF0ZSBpbiBiaXRzL3MKPiA+ID4gKwkgKgo+ID4g PiArCSAqICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgMSAgICAgIDEKPiA+ID4gKwkgKiBp bWFnZS13aWR0aCAqIC0tLSArIGZpZm8tc3ogLS0tID49IC0tLS0gKiBpbWFnZS13aWR0aAo+ID4g PiArCSAqICAgICAgICAgICAgICAgc2JyICAgICAgICAgICBzYnIgICAgY3Npcgo+ID4gPiArCSAq Cj4gPiA+ICsJICogZmlmby1zeiA+PSBhYnMoc2JyL2NzaXIgKiBpbWFnZS13aWR0aCAtIGltYWdl LXdpZHRoKQo+ID4gPiArCSAqICAgICAgICAgICAgICAgIGAtLS0tLcK0Cj4gPiA+ICsJICogICAg ICAgICAgICAgICAgICAgbgo+ID4gPiArCSAqCj4gPiA+ICsJICovCj4gPiA+ICsKPiA+ID4gKwlz ZW5zb3JfYml0cmF0ZSAvPSBUQzM1ODc0Nl9QUkVDSVNJT047Cj4gPiA+ICsJbiA9IGNzaV9iaXRy YXRlIC8gc2Vuc29yX2JpdHJhdGU7Cj4gPiA+ICsJdG1wID0gKHRjMzU4NzQ2LT5tYnVzZm10Lndp ZHRoICogVEMzNTg3NDZfUFJFQ0lTSU9OKSAvIG47Cj4gPiA+ICsJZmlmb19zeiA9IHRjMzU4NzQ2 LT5tYnVzZm10LndpZHRoIC0gdG1wOwo+ID4gPiArCWZpZm9fc3ogKj0gZm10LT5icHA7Cj4gPiA+ ICsJdGMzNTg3NDYtPnZiX3NpemUgPSByb3VuZF91cChmaWZvX3N6LCAzMik7Cj4gPiA+ICsKPiA+ IAo+ID4gUGxlYXNlIGFsc28gY2FsbCB2NGwyX3N1YmRldl9saW5rX3ZhbGlkYXRlX2RlZmF1bHQo KSBoZXJlLgo+IAo+IERpZCBpdCBpbiBteSBpbnRlcm5hbCBwcmVwYXJlZCB2MiBeXiBJIGNhbGwg aXQgbm93IGF0IHRoZSB2ZXJ5Cj4gYmVnaW5uaW5nIG9mIHRoaXMgZnVuY3Rpb24uCj4gCj4gPiBJ IHdvbmRlciBpZiB0aGUgYWJvdmUgY2FsY3VsYXRpb24gd291bGRuJ3QgYmUgYmV0dGVyIHBlcmZv cm1lZCBpbgo+ID4gLnNfc3RyZWFtKCkgKG9yIHJhdGhlciBpbiBhIGZ1bmN0aW9uIGJlaW5nIGNh bGxlZCBieSAuc19zdHJlYW0oKSkgd2hlbgo+ID4gZW5hYmxpbmcgc3RyZWFtaW5nLgo+IAo+IE5v IEkgd291bGRuJ3Qgc2hpZnQgdGhhdCwgc2luY2UgdGhlIGxpbmsgdmFsaWRhdGlvbiBpcyBpbiBJ TUhPIHRoZQo+IGNvcnJlY3QgcGxhY2UgdG8gaW5mb3JtIHRoZSB1c2VyIHRoYXQgdGhlIHBpcGVs aW5lIGNhbid0IG5lZ290aWF0ZSBpZgo+IHRoZSBmaWZvIGNhbid0IGJlIGNvbmZpZ3VyZWQgY29y cmVjdGx5LiBUaGVyZWZvcmUgSSBwbGFjZWQgaXQgaGVyZS4KClRoZSBpc3N1ZSBpcyB0aGF0IHRo ZSB1c2VyIGNvdWxkIGVuYWJsZSB0aGUgbGluayBmaXJzdCwgYW5kIHRoZW4gY2hhbmdlCnRoZSBW NEwyX0NJRF9MSU5LX0ZSRVEgb2YgdGhlIHNlbnNvciBhbmQgcHVzaCB0aGUgcGl4ZWwgcmF0ZSBh Ym92ZSB3aGF0CnRoZSBUQzM1ODc0NiBjYW4gc3VwcG9ydC4gR2l2ZW4gdGhlIG1vZGVsIHRoYXQg Y29uZmlndXJlcyBzdWJkZXZzCmluZGVwZW5kZW50bHksIHlvdSBjYW4gb25seSB2YWxpZGF0ZSB0 aGUgcGlwZWxpbmUgYXQgc3RyZWFtIG9uIHRpbWUuCgo+ID4gPiArb3V0Ogo+ID4gPiArCWRldl9k YmcodGMzNTg3NDYtPnNkLmRldiwKPiA+ID4gKwkJIkZvdW5kIEZJRk8gc2l6ZVtiaXRzXToldSAt PiBhbGlnbmVkIHRvIHNpemVbYml0c106JXVcbiIsCj4gPiA+ICsJCWZpZm9fc3osIHRjMzU4NzQ2 LT52Yl9zaXplKTsKPiA+ID4gKwo+ID4gPiArCXJldHVybiB0YzM1ODc0Ni0+dmJfc2l6ZSA+IFRD MzU4NzQ2X1ZCX01BWF9TSVpFID8gLUVJTlZBTCA6IDA7Cj4gPiA+ICt9Cgpbc25pcF0KCj4gPiA+ ICtzdGF0aWMgaW50IHRjMzU4NzQ2X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCj4g PiA+ICt7Cj4gPiA+ICsJc3RydWN0IGNsa19pbml0X2RhdGEgbWNsa19pbml0ZGF0YSA9IHsgfTsK PiA+ID4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7Cj4gPiA+ICsJc3RydWN0 IHY0bDJfZndub2RlX2VuZHBvaW50ICp2ZXA7Cj4gPiA+ICsJdW5zaWduZWQgbG9uZyBjc2lfbGlu a19yYXRlOwo+ID4gPiArCXN0cnVjdCB0YzM1ODc0NiAqdGMzNTg3NDY7Cj4gPiA+ICsJc3RydWN0 IGZ3bm9kZV9oYW5kbGUgKmVwOwo+ID4gPiArCXVuc2lnbmVkIGNoYXIgY3NpX2xhbmVzOwo+ID4g PiArCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7Cj4gPiA+ICsJc3RydWN0IHY0bDJfY3RybCAqY3Ry bDsKPiA+ID4gKwl1bnNpZ25lZCBsb25nIHJlZmNsazsKPiA+ID4gKwl1bnNpZ25lZCBpbnQgaTsK PiA+ID4gKwlpbnQgZXJyOwo+ID4gPiArCXUzMiB2YWw7Cj4gPiA+ICsKPiA+ID4gKwl0YzM1ODc0 NiA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqdGMzNTg3NDYpLCBHRlBfS0VS TkVMKTsKPiA+ID4gKwlpZiAoIXRjMzU4NzQ2KQo+ID4gPiArCQlyZXR1cm4gLUVOT01FTTsKPiA+ ID4gKwo+ID4gPiArCXRjMzU4NzQ2LT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGll bnQsICZ0YzM1ODc0Nl9yZWdtYXBfY29uZmlnKTsKPiA+ID4gKwlpZiAoSVNfRVJSKHRjMzU4NzQ2 LT5yZWdtYXApKQo+ID4gPiArCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIFBUUl9FUlIodGMz NTg3NDYtPnJlZ21hcCksCj4gPiA+ICsJCQkJICAgICAiRmFpbGVkIHRvIGluaXQgcmVnbWFwXG4i KTsKPiA+ID4gKwo+ID4gPiArCXRjMzU4NzQ2LT5yZWZjbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAi cmVmY2xrIik7Cj4gPiA+ICsJaWYgKElTX0VSUih0YzM1ODc0Ni0+cmVmY2xrKSkKPiA+ID4gKwkJ cmV0dXJuIGRldl9lcnJfcHJvYmUoZGV2LCBQVFJfRVJSKHRjMzU4NzQ2LT5yZWZjbGspLAo+ID4g PiArCQkJCSAgICAgIkZhaWxlZCB0byBnZXQgcmVmY2xrXG4iKTsKPiA+ID4gKwo+ID4gPiArCWVy ciA9IGNsa19wcmVwYXJlX2VuYWJsZSh0YzM1ODc0Ni0+cmVmY2xrKTsKPiA+ID4gKwlpZiAoZXJy KQo+ID4gPiArCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIGVyciwKPiA+ID4gKwkJCQkgICAg ICJGYWlsZWQgdG8gZW5hYmxlIHJlZmNsa1xuIik7Cj4gPiA+ICsKPiA+ID4gKwlyZWZjbGsgPSBj bGtfZ2V0X3JhdGUodGMzNTg3NDYtPnJlZmNsayk7Cj4gPiA+ICsJY2xrX2Rpc2FibGVfdW5wcmVw YXJlKHRjMzU4NzQ2LT5yZWZjbGspOwo+ID4gPiArCj4gPiA+ICsJaWYgKHJlZmNsayA8IDYgKiBN SFogfHwgcmVmY2xrID4gNDAgKiBNSFopCj4gPiA+ICsJCXJldHVybiBkZXZfZXJyX3Byb2JlKGRl diwgLUVJTlZBTCwgIkludmFsaWQgcmVmY2xrIHJhbmdlXG4iKTsKPiA+ID4gKwo+ID4gPiArCWZv ciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRjMzU4NzQ2X3N1cHBsaWVzKTsgaSsrKQo+ID4gPiAr CQl0YzM1ODc0Ni0+c3VwcGxpZXNbaV0uc3VwcGx5ID0gdGMzNTg3NDZfc3VwcGxpZXNbaV07Cj4g PiA+ICsKPiA+ID4gKwllcnIgPSBkZXZtX3JlZ3VsYXRvcl9idWxrX2dldChkZXYsIEFSUkFZX1NJ WkUodGMzNTg3NDZfc3VwcGxpZXMpLAo+ID4gPiArCQkJCSAgICAgIHRjMzU4NzQ2LT5zdXBwbGll cyk7Cj4gPiA+ICsJaWYgKGVycikKPiA+ID4gKwkJcmV0dXJuIGRldl9lcnJfcHJvYmUoZGV2LCBl cnIsICJGYWlsZWQgdG8gZ2V0IHN1cHBsaWVzXG4iKTsKPiA+ID4gKwo+ID4gPiArCXRjMzU4NzQ2 LT5yZXNldF9ncGlvID0gZGV2bV9ncGlvZF9nZXRfb3B0aW9uYWwoZGV2LCAicmVzZXQiLAo+ID4g PiArCQkJCQkJICAgICAgIEdQSU9EX09VVF9ISUdIKTsKPiA+ID4gKwlpZiAoSVNfRVJSKHRjMzU4 NzQ2LT5yZXNldF9ncGlvKSkKPiA+ID4gKwkJcmV0dXJuIGRldl9lcnJfcHJvYmUoZGV2LCBQVFJf RVJSKHRjMzU4NzQ2LT5yZXNldF9ncGlvKSwKPiA+ID4gKwkJCQkgICAgICJGYWlsZWQgdG8gZ2V0 IHJlc2V0LWdwaW9zXG4iKTsKPiA+ID4gKwo+ID4gPiArCXNkID0gJnRjMzU4NzQ2LT5zZDsKPiA+ ID4gKwl2NGwyX2kyY19zdWJkZXZfaW5pdChzZCwgY2xpZW50LCAmdGMzNTg3NDZfb3BzKTsKPiA+ ID4gKwlzZC0+ZmxhZ3MgfD0gVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREU7Cj4gPiA+ICsJc2Qt PmVudGl0eS5mdW5jdGlvbiA9IE1FRElBX0VOVF9GX1ZJRF9JRl9CUklER0U7Cj4gPiA+ICsJc2Qt PmVudGl0eS5vcHMgPSAmdGMzNTg3NDZfZW50aXR5X29wczsKPiA+ID4gKwo+ID4gPiArCXRjMzU4 NzQ2LT5wYWRzW1RDMzU4NzQ2X1NJTktdLmZsYWdzID0gTUVESUFfUEFEX0ZMX1NJTks7Cj4gPiA+ ICsJdGMzNTg3NDYtPnBhZHNbVEMzNTg3NDZfU09VUkNFXS5mbGFncyA9IE1FRElBX1BBRF9GTF9T T1VSQ0U7Cj4gPiA+ICsJZXJyID0gbWVkaWFfZW50aXR5X3BhZHNfaW5pdCgmc2QtPmVudGl0eSwg VEMzNTg3NDZfTlJfUEFEUywKPiA+ID4gKwkJCQkgICAgIHRjMzU4NzQ2LT5wYWRzKTsKPiA+ID4g KwlpZiAoZXJyKQo+ID4gPiArCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIGVyciwKPiA+ID4g KwkJCQkgICAgICJGYWlsZWQgdG8gc2V0dXAgbWVkaWEtZW50aXR5IHBhZHNcbiIpOwo+ID4gPiAr Cj4gPiA+ICsJZXAgPSBmd25vZGVfZ3JhcGhfZ2V0X2VuZHBvaW50X2J5X2lkKGRldl9md25vZGUo ZGV2KSwgVEMzNTg3NDZfU09VUkNFLAo+ID4gPiArCQkJCQkgICAgIDAsIDApOwo+ID4gPiArCWlm ICghZXApIHsKPiA+ID4gKwkJZGV2X2VycihkZXYsICJNaXNzaW5nIGVuZHBvaW50IG5vZGVcbiIp Owo+ID4gPiArCQllcnIgPSAtRUlOVkFMOwo+ID4gPiArCQlnb3RvIGVycl9tYzsKPiA+ID4gKwl9 Cj4gPiA+ICsKPiA+ID4gKwkvKiBDdXJyZW50bHkgd2Ugb25seSBzdXBwb3J0ICdwYXJhbGxlbCBp bicgLT4gJ2NzaSBvdXQnICovCj4gPiA+ICsJdmVwID0gJnRjMzU4NzQ2LT5jc2lfdmVwOwo+ID4g PiArCXZlcC0+YnVzX3R5cGUgPSBWNEwyX01CVVNfQ1NJMl9EUEhZOwo+ID4gPiArCWVyciA9IHY0 bDJfZndub2RlX2VuZHBvaW50X2FsbG9jX3BhcnNlKGVwLCB2ZXApOwo+ID4gPiArCWZ3bm9kZV9o YW5kbGVfcHV0KGVwKTsKPiA+ID4gKwlpZiAoZXJyKSB7Cj4gPiA+ICsJCWRldl9lcnIoZGV2LCAi RmFpbGVkIHRvIHBhcnNlIHNvdXJjZSBlbmRwb2ludFxuIik7Cj4gPiA+ICsJCWdvdG8gZXJyX21j Owo+ID4gPiArCX0KPiA+ID4gKwo+ID4gPiArCWNzaV9sYW5lcyA9IHZlcC0+YnVzLm1pcGlfY3Np Mi5udW1fZGF0YV9sYW5lczsKPiA+ID4gKwlpZiAoY3NpX2xhbmVzID09IDAgfHwgY3NpX2xhbmVz ID4gNCB8fAo+ID4gPiArCSAgICB2ZXAtPm5yX29mX2xpbmtfZnJlcXVlbmNpZXMgPT0gMCkgewo+ ID4gPiArCQlkZXZfZXJyKGRldiwgImVycm9yOiBJbnZhbGlkIENTSS0yIHNldHRpbmdzXG4iKTsK PiA+ID4gKwkJZXJyID0gLUVJTlZBTDsKPiA+ID4gKwkJZ290byBlcnJfdmVwOwo+ID4gPiArCX0K PiA+ID4gKwo+ID4gPiArCS8qIFRPRE86IEFkZCBzdXBwb3J0IHRvIGhhbmRsZSBtdWx0aXBsZSBs aW5rIGZyZXF1ZW5jaWVzICovCj4gPiA+ICsJY3NpX2xpbmtfcmF0ZSA9ICh1bnNpZ25lZCBsb25n KXZlcC0+bGlua19mcmVxdWVuY2llc1swXTsKPiA+ID4gKwl0YzM1ODc0Ni0+cGxsX3JhdGUgPSB0 YzM1ODc0Nl9maW5kX3BsbF9zZXR0aW5ncyh0YzM1ODc0NiwgcmVmY2xrLAo+ID4gPiArCQkJCQkJ CWNzaV9saW5rX3JhdGUgKiAyKTsKPiA+ID4gKwlpZiAoIXRjMzU4NzQ2LT5wbGxfcmF0ZSkgewo+ ID4gPiArCQllcnIgPSAtRUlOVkFMOwo+ID4gPiArCQlnb3RvIGVycl92ZXA7Cj4gPiA+ICsJfQo+ ID4gPiArCj4gPiA+ICsJZXJyID0gcGh5X21pcGlfZHBoeV9nZXRfZGVmYXVsdF9jb25maWdfZm9y X2hzY2xrKHRjMzU4NzQ2LT5wbGxfcmF0ZSwKPiA+ID4gKwkJCQkJCQkgY3NpX2xhbmVzLAo+ID4g PiArCQkJCQkJCSAmdGMzNTg3NDYtPmRwaHlfY2ZnKTsKPiA+ID4gKwlpZiAoZXJyKQo+ID4gPiAr CQlnb3RvIGVycl92ZXA7Cj4gPiA+ICsKPiA+ID4gKwl0YzM1ODc0Ni0+bWJ1c2ZtdCA9IHRjMzU4 NzQ2X2RlZl9mbXQ7Cj4gPiA+ICsJdGMzNTg3NDYtPnZiX3NpemUgPSBUQzM1ODc0Nl9WQl9ERUZB VUxUX1NJWkU7Cj4gPiA+ICsKPiA+ID4gKwlkZXZfc2V0X2RydmRhdGEoZGV2LCB0YzM1ODc0Nik7 Cj4gPiA+ICsJcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkoZGV2LCAyMDApOwo+ID4g PiArCXBtX3J1bnRpbWVfdXNlX2F1dG9zdXNwZW5kKGRldik7Cj4gPiA+ICsJcG1fcnVudGltZV9l bmFibGUoZGV2KTsKPiA+ID4gKwo+ID4gPiArCWVyciA9IHBtX3J1bnRpbWVfcmVzdW1lX2FuZF9n ZXQoZGV2KTsKPiA+ID4gKwlpZiAoZXJyIDwgMCkgewo+ID4gPiArCQlkZXZfZXJyKGRldiwgIkZh aWxlZCB0byByZXN1bWUgdGhlIGRldmljZVxuIik7Cj4gPiA+ICsJCWdvdG8gZXJyX3ZlcDsKPiA+ ID4gKwl9Cj4gPiA+ICsKPiA+ID4gKwkgLyogRW5zdXJlIHRoYXQgQ1NJIGludGVyZmFjZSBpcyBw dXQgaW50byBMUC0xMSBzdGF0ZSAqLwo+ID4gPiArCWVyciA9IHRjMzU4NzQ2X3N3X3Jlc2V0KHRj MzU4NzQ2KTsKPiA+ID4gKwlpZiAoZXJyKSB7Cj4gPiA+ICsJCXBtX3J1bnRpbWVfcHV0X25vaWRs ZShkZXYpOwo+ID4gPiArCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZXNldCB0aGUgZGV2aWNl XG4iKTsKPiA+ID4gKwkJZ290byBlcnJfcG07Cj4gPiA+ICsJfQo+ID4gPiArCj4gPiA+ICsJZXJy ID0gdGMzNTg3NDZfcmVhZCh0YzM1ODc0NiwgQ0hJUElEX1JFRywgJnZhbCk7Cj4gPiA+ICsJcG1f cnVudGltZV9tYXJrX2xhc3RfYnVzeShkZXYpOwo+ID4gPiArCXBtX3J1bnRpbWVfcHV0X3N5bmNf YXV0b3N1c3BlbmQoZGV2KTsKPiA+ID4gKwlpZiAoZXJyKSB7Cj4gPiA+ICsJCWRldl9lcnIoZGV2 LCAiRmFpbGVkIHRvIHJlYWQgY2hpcGlkXG4iKTsKPiA+ID4gKwkJZXJyID0gLUVOT0RFVjsKPiA+ ID4gKwkJZ290byBlcnJfcG07Cj4gPiA+ICsJfQo+ID4gPiArCj4gPiA+ICsJaWYgKEZJRUxEX0dF VChDSElQSUQsIHZhbCkgIT0gMHg0NCkgewo+ID4gPiArCQlkZXZfZXJyKGRldiwgIkludmFsaWQg Y2hpcGlkIDB4JTAyeFxuIiwKPiA+ID4gKwkJCSh1MzIpRklFTERfR0VUKENISVBJRCwgdmFsKSk7 Cj4gPiA+ICsJCWVyciA9IC1FTk9ERVY7Cj4gPiA+ICsJCWdvdG8gZXJyX3BtOwo+ID4gPiArCX0K PiA+ID4gKwo+ID4gPiArCS8qIE9wdGlvbmFsIE1DTEsgcHJvdmlkZXIgc3VwcG9ydCAqLwo+ID4g PiArCWlmIChkZXZpY2VfcHJvcGVydHlfcHJlc2VudChkZXYsICIjY2xvY2stY2VsbHMiKSkgewo+ ID4gPiArCQljb25zdCBjaGFyICptY2xrX25hbWU7Cj4gPiA+ICsKPiA+ID4gKwkJLyogSW5pdCB0 byBoaWdoZXN0IHBvc3NpYmVsIE1DTEsgKi8KPiA+ID4gKwkJdGMzNTg3NDYtPm1jbGtfcG9zdGRp diA9IDUxMjsKPiA+ID4gKwkJdGMzNTg3NDYtPm1jbGtfcHJlZGl2ID0gODsKPiA+ID4gKwo+ID4g PiArCQltY2xrX25hbWUgPSAidGMzNTg3NDYtbWNsayI7Cj4gPiA+ICsJCWRldmljZV9wcm9wZXJ0 eV9yZWFkX3N0cmluZyhkZXYsICJjbG9jay1vdXRwdXQtbmFtZXMiLAo+ID4gPiArCQkJCQkgICAg Jm1jbGtfbmFtZSk7Cj4gPiA+ICsKPiA+ID4gKwkJbWNsa19pbml0ZGF0YS5uYW1lID0gbWNsa19u YW1lOwo+ID4gPiArCQltY2xrX2luaXRkYXRhLm9wcyA9ICZ0YzM1ODc0Nl9tY2xrX29wczsKPiA+ ID4gKwkJdGMzNTg3NDYtPm1jbGtfaHcuaW5pdCA9ICZtY2xrX2luaXRkYXRhOwo+ID4gPiArCj4g PiA+ICsJCWVyciA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKGRldiwgJnRjMzU4NzQ2LT5tY2xrX2h3 KTsKPiA+ID4gKwkJaWYgKGVycikgewo+ID4gPiArCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8g cmVnaXN0ZXIgbWNsayBwcm92aWRlclxuIik7Cj4gPiA+ICsJCQlnb3RvIGVycl9wbTsKPiA+ID4g KwkJfQo+ID4gPiArCj4gPiA+ICsJCWVyciA9IGRldm1fb2ZfY2xrX2FkZF9od19wcm92aWRlcihk ZXYsIG9mX2Nsa19od19zaW1wbGVfZ2V0LAo+ID4gPiArCQkJCQkJICAmdGMzNTg3NDYtPm1jbGtf aHcpOwo+ID4gPiArCQlpZiAoZXJyKSB7Cj4gPiA+ICsJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0 byBhZGQgbWNsayBwcm92aWRlclxuIik7Cj4gPiA+ICsJCQlnb3RvIGVycl9wbTsKPiA+ID4gKwkJ fQo+ID4gPiArCX0KPiA+ID4gKwo+ID4gPiArCXY0bDJfY3RybF9oYW5kbGVyX2luaXQoJnRjMzU4 NzQ2LT5jdHJsX2hkbCwgMSk7Cj4gPiA+ICsKPiA+ID4gKwljdHJsID0gdjRsMl9jdHJsX25ld19p bnRfbWVudSgmdGMzNTg3NDYtPmN0cmxfaGRsLCBOVUxMLAo+ID4gPiArCQkJCSAgICAgIFY0TDJf Q0lEX0xJTktfRlJFUSwgMCwgMCwKPiA+ID4gKwkJCQkgICAgICB2ZXAtPmxpbmtfZnJlcXVlbmNp ZXMpOwo+ID4gPiArCWlmIChjdHJsKQo+ID4gPiArCQljdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxf RkxBR19SRUFEX09OTFk7Cj4gPiA+ICsKPiA+ID4gKwl0YzM1ODc0Ni0+c2QuY3RybF9oYW5kbGVy ID0gJnRjMzU4NzQ2LT5jdHJsX2hkbDsKPiA+ID4gKwlpZiAodGMzNTg3NDYtPmN0cmxfaGRsLmVy cm9yKSB7Cj4gPiA+ICsJCWVyciA9IHRjMzU4NzQ2LT5jdHJsX2hkbC5lcnJvcjsKPiA+ID4gKwkJ Z290byBlcnJfcG07Cj4gPiA+ICsJfQo+ID4gPiArCj4gPiA+ICsJdjRsMl9jdHJsX2hhbmRsZXJf c2V0dXAoJnRjMzU4NzQ2LT5jdHJsX2hkbCk7Cj4gPiA+ICsKPiA+ID4gKwllcnIgPSB0YzM1ODc0 Nl9hc3luY19yZWdpc3Rlcih0YzM1ODc0Nik7Cj4gPiA+ICsJaWYgKGVyciA8IDApCj4gPiA+ICsJ CWdvdG8gZXJyX2N0cmw7Cj4gPiA+ICsKPiA+ID4gKwlkZXZfaW5mbyhkZXYsICIlcyBmb3VuZCBA IDB4JXggKCVzKVxuIiwgY2xpZW50LT5uYW1lLAo+ID4gPiArCQkgIGNsaWVudC0+YWRkciwgY2xp ZW50LT5hZGFwdGVyLT5uYW1lKTsKPiA+IAo+ID4gSSdkIHNraXAgdGhpcyB0byBhdm9pZCBhZGRp bmcgbm9pc2UgdG8gdGhlIGtlcm5lbCBsb2cgYXQgYm9vdCB0aW1lLiBJCj4gPiB3b3VsZCBhbHNv IHByb2JhYmx5IHNwbGl0IHNvbWUgb2YgdGhlIGNvZGUgb3V0IG9mIHRoZSBwcm9iZSBmdW5jdGlv biBhcwo+ID4gaXQncyBmYWlybHkgbGFyZ2UuIFVwIHRvIHlvdS4KPiAKPiBZZXMgaXQgaXMgbGFy Z2UgYnV0IG1vc3Qgb2YgaXQgaXMganVzdCByZXF1ZXN0aW5nIHN0dWZmIGFuZCBzby4uCj4gVGhl cmVmb3JlIEkga2VwdCBpdCBoZXJlIHNpbmNlIEkgZG9uJ3QgbmVlZCBpdCBlbHNld2hlcmUuIFdo YXQgYWJvdXQKPiBzZXR0aW5nIGl0IHRvIGRldl9kYmcoKT8gU29tZXRpbWVzIGl0IGNhbiBiZSB1 c2VmdWwgZS5nLiB0byBmaW5kIHRoZQo+IHByb2JsZW0gd2h5IC9kZXYvbWVkaWEgaXMgbm90IGNv bW1pbmcgdXAuLgoKSSBmaW5kIHRoYXQgZW5hYmxpbmcgZGV2X2RiZygpIG1lc3NhZ2VzIGZyb20g ZHJpdmVycy9iYXNlL2RkLmMgYXJlCmhlbHBmdWwgZm9yIHRoYXQsIGJ1dCBhIGRldl9kYmcoKSBt ZXNzYWdlIGhlcmUgaXMgZmluZSB0b28uCgo+ID4gPiArCj4gPiA+ICsJcmV0dXJuIDA7Cj4gPiA+ ICsKPiA+ID4gK2Vycl9jdHJsOgo+ID4gPiArCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJnRjMzU4 NzQ2LT5jdHJsX2hkbCk7Cj4gPiA+ICtlcnJfcG06Cj4gPiA+ICsJcG1fcnVudGltZV9kaXNhYmxl KGRldik7Cj4gPiA+ICsJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKGRldik7Cj4gPiA+ICsJcG1f cnVudGltZV9kb250X3VzZV9hdXRvc3VzcGVuZChkZXYpOwo+ID4gPiArZXJyX3ZlcDoKPiA+ID4g Kwl2NGwyX2Z3bm9kZV9lbmRwb2ludF9mcmVlKHZlcCk7Cj4gPiA+ICtlcnJfbWM6Cj4gPiA+ICsJ bWVkaWFfZW50aXR5X2NsZWFudXAoJnNkLT5lbnRpdHkpOwo+ID4gPiArCj4gPiA+ICsJcmV0dXJu IGVycjsKPiA+ID4gK30KPiA+ID4gKwo+ID4gPiArc3RhdGljIGludCB0YzM1ODc0Nl9yZW1vdmUo c3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKPiA+ID4gK3sKPiA+ID4gKwlzdHJ1Y3QgdjRsMl9z dWJkZXYgKnNkID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Cj4gPiA+ICsJc3RydWN0IHRj MzU4NzQ2ICp0YzM1ODc0NiA9IHRvX3RjMzU4NzQ2KHNkKTsKPiA+ID4gKwo+ID4gPiArCXY0bDJf Y3RybF9oYW5kbGVyX2ZyZWUoJnRjMzU4NzQ2LT5jdHJsX2hkbCk7Cj4gPiA+ICsJdjRsMl9md25v ZGVfZW5kcG9pbnRfZnJlZSgmdGMzNTg3NDYtPmNzaV92ZXApOwo+ID4gPiArCXY0bDJfYXN5bmNf bmZfdW5yZWdpc3RlcigmdGMzNTg3NDYtPm5vdGlmaWVyKTsKPiA+ID4gKwl2NGwyX2FzeW5jX25m X2NsZWFudXAoJnRjMzU4NzQ2LT5ub3RpZmllcik7Cj4gPiA+ICsJdjRsMl9hc3luY191bnJlZ2lz dGVyX3N1YmRldihzZCk7Cj4gPiA+ICsJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoc2Qp Owo+ID4gCj4gPiBUaGlzIHNob3VsZG4ndCBiZSBuZWVkZWQgdjRsMl9hc3luY191bnJlZ2lzdGVy X3N1YmRldigpIHNob3VsZCBiZQo+ID4gZW5vdWdoLgo+IAo+IE9rYXksIHRoYW5rcy4gVGhlcmUg YXJlIGEgbG90IG9mIHVucmVnaXN0ZXIgaGVscGVycyBpbiB0aGUgdjRsMiBzcGFjZS4uCgpUb28g bWFueSBvZiB0aGVtIGluZGVlZC4gSSdkIGxpa2UgdG8gc2ltcGxpZnkgYWxsIHRoYXQuCgo+ID4g PiArCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZzZC0+ZW50aXR5KTsKPiA+ID4gKwo+ID4gPiArCXBt X3J1bnRpbWVfZGlzYWJsZShzZC0+ZGV2KTsKPiA+ID4gKwlwbV9ydW50aW1lX3NldF9zdXNwZW5k ZWQoc2QtPmRldik7Cj4gPiA+ICsJcG1fcnVudGltZV9kb250X3VzZV9hdXRvc3VzcGVuZChzZC0+ ZGV2KTsKPiA+ID4gKwo+ID4gPiArCXJldHVybiAwOwo+ID4gPiArfQo+ID4gPiArCj4gPiA+ICtz dGF0aWMgaW50IHRjMzU4NzQ2X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQo+ID4gPiArewo+ ID4gPiArCXN0cnVjdCB0YzM1ODc0NiAqdGMzNTg3NDYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsK PiA+ID4gKwo+ID4gPiArCWNsa19kaXNhYmxlX3VucHJlcGFyZSh0YzM1ODc0Ni0+cmVmY2xrKTsK PiA+ID4gKwo+ID4gPiArCXJldHVybiByZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUo dGMzNTg3NDZfc3VwcGxpZXMpLAo+ID4gPiArCQkJCSAgICAgIHRjMzU4NzQ2LT5zdXBwbGllcyk7 Cj4gPiAKPiA+IFNob3VsZG4ndCB5b3UgcmVlbmFibGUgdGhlIGNsb2NrIGlmIHRoaXMgZmFpbHMg Pwo+IAo+IEhtLi4gaWYgdGhpcyBmYWlscyBJIGNvdWxkIGVuZCBpbiBhIHVuZGVmaW5lZCBjaGlw IHN0YXRlLiBCdXQgSSBnb3QgdGhlCj4gcG9pbnQgdGhhdCB0aGUgZnJhbWV3b3JrIHdvdWxkIGJl IGluIGEgYmFkIHN0YXRlIGlmIGl0IHRyaWVzIGFnYWluIHRvCj4gc3VzcGVuZCB0aGUgZGV2aWNl LgoKSXQgd291bGQgYmUsIGFuZCB3aXRob3V0IGEgd2F5IHRvIHJlY292ZXIsIHNvIHRoYXQgY291 bGQgYmUgYW4gaXNzdWUuCgo+ID4gPiArfQo+ID4gPiArCj4gPiA+ICtzdGF0aWMgaW50IHRjMzU4 NzQ2X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCj4gPiA+ICt7Cj4gPiA+ICsJc3RydWN0IHRj MzU4NzQ2ICp0YzM1ODc0NiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+ID4gPiArCWludCBlcnI7 Cj4gPiA+ICsKPiA+ID4gKwlncGlvZF9zZXRfdmFsdWUodGMzNTg3NDYtPnJlc2V0X2dwaW8sIDEp Owo+ID4gPiArCj4gPiA+ICsJZXJyID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKEFSUkFZX1NJWkUo dGMzNTg3NDZfc3VwcGxpZXMpLAo+ID4gPiArCQkJCSAgICB0YzM1ODc0Ni0+c3VwcGxpZXMpOwo+ ID4gPiArCWlmIChlcnIpCj4gPiA+ICsJCXJldHVybiBlcnI7Cj4gPiA+ICsKPiA+ID4gKwkvKiBt aW4uIDIwMG5zICovCj4gPiA+ICsJdXNsZWVwX3JhbmdlKDEwLCAyMCk7Cj4gPiA+ICsKPiA+ID4g KwlncGlvZF9zZXRfdmFsdWUodGMzNTg3NDYtPnJlc2V0X2dwaW8sIDApOwo+ID4gPiArCj4gPiA+ ICsJZXJyID0gY2xrX3ByZXBhcmVfZW5hYmxlKHRjMzU4NzQ2LT5yZWZjbGspOwo+ID4gPiArCWlm IChlcnIpCj4gPiA+ICsJCXJldHVybiBlcnI7Cj4gPiAKPiA+IFRoZSByZWd1bGF0b3JzIG5lZWQg dG8gYmUgZGlzYWJsZWQgaW4gY2FzZSBvZiBmYWlsdXJlIGhlcmUgYW5kIGJlbG93Cj4gPiAoYW5k IHNvIGRvZXMgdGhlIGNsb2NrIGJlbG93KS4KPiAKPiBZZXMsIHlvdSdyZSByaWdodC4KPiAKPiA+ ID4gKwo+ID4gPiArCS8qIG1pbi4gNzAwdXMgLi4uIDFtcyAqLwo+ID4gPiArCXVzbGVlcF9yYW5n ZSgxMDAwLCAxNTAwKTsKPiA+ID4gKwo+ID4gPiArCS8qIFN5bmMgc3RhdGUgKi8KPiA+ID4gKwll cnIgPSB0YzM1ODc0Nl9hcHBseV9wbGxfY29uZmlnKHRjMzU4NzQ2KTsKPiA+ID4gKwlpZiAoZXJy KQo+ID4gPiArCQlyZXR1cm4gZXJyOwo+ID4gPiArCj4gPiA+ICsJZXJyID0gdGMzNTg3NDZfYXBw bHlfZHBoeV9jb25maWcodGMzNTg3NDYpOwo+ID4gPiArCWlmIChlcnIpCj4gPiA+ICsJCXJldHVy biBlcnI7Cj4gPiA+ICsKPiA+ID4gKwlyZXR1cm4gdGMzNTg3NDZfYXBwbHlfbWlzY19jb25maWco dGMzNTg3NDYpOwo+ID4gCj4gPiBEb2VzIGFsbCB0aGlzIGJlbG9uZyB0byB0aGUgUE0gcmVzdW1l IGhhbmRsZXIgPyBJdCBzZWVtcyBjb25maWd1cmF0aW9uCj4gPiBjb3VsZCBiZSBoYW5kbGVkIGlu IC5zX3N0cmVhbSgpIGluc3RlYWQuCj4gCj4gVGhpcyBnZXRzIGNhbGxlZCBieSB0aGUgc19zdHJl YW0oKSBkdXJpbmcgZ2V0dGluZyB0aGUgcG93ZXIgc3RhdGUgYnV0IEkKPiBjYW4gbW92ZSB0aGUg ZHBoeS9taXNjX2NvbmZpZyB0byB0aGUgLnNfc3RyZWFtKCkgb2YgY291cnNlLgoKVGhhdCB3b3Vs ZCBiZSBuaWNlLCB0aGFua3MuCgo+IFRoZSBwbGwKPiBuZWVkcyB0byBiZSB0aGVyZSBzaW5jZSB0 aGUgZGV2aWNlIGNhbiBiZSBhIGNsb2NrIHByb3ZpZGVyIGUuZy4gZm9yIHRoZQo+IHNlbnNvci4K Ck9LLgoKPiBUaGFua3MgZm9yIHRoZSByZXZpZXcgOikKPiAKPiA+ID4gK30KPiA+ID4gKwo+ID4g PiArREVGSU5FX1JVTlRJTUVfREVWX1BNX09QUyh0YzM1ODc0Nl9wbV9vcHMsIHRjMzU4NzQ2X3N1 c3BlbmQsCj4gPiA+ICsJCQkgIHRjMzU4NzQ2X3Jlc3VtZSwgTlVMTCk7Cj4gPiA+ICsKPiA+ID4g K3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIF9fbWF5YmVfdW51c2VkIHRjMzU4NzQ2 X29mX21hdGNoW10gPSB7Cj4gPiA+ICsJeyAuY29tcGF0aWJsZSA9ICJ0b3NoaWJhLHRjMzU4NzQ2 IiB9LAo+ID4gPiArCXsgfSwKPiA+ID4gK307Cj4gPiA+ICtNT0RVTEVfREVWSUNFX1RBQkxFKG9m LCB0YzM1ODc0Nl9vZl9tYXRjaCk7Cj4gPiA+ICsKPiA+ID4gK3N0YXRpYyBzdHJ1Y3QgaTJjX2Ry aXZlciB0YzM1ODc0Nl9kcml2ZXIgPSB7Cj4gPiA+ICsJLmRyaXZlciA9IHsKPiA+ID4gKwkJLm5h bWUgPSAidGMzNTg3NDYiLAo+ID4gPiArCQkucG0gPSBwbV9wdHIoJnRjMzU4NzQ2X3BtX29wcyks Cj4gPiA+ICsJCS5vZl9tYXRjaF90YWJsZSA9IHRjMzU4NzQ2X29mX21hdGNoLAo+ID4gPiArCX0s Cj4gPiA+ICsJLnByb2JlX25ldyA9IHRjMzU4NzQ2X3Byb2JlLAo+ID4gPiArCS5yZW1vdmUgPSB0 YzM1ODc0Nl9yZW1vdmUsCj4gPiA+ICt9Owo+ID4gPiArCj4gPiA+ICttb2R1bGVfaTJjX2RyaXZl cih0YzM1ODc0Nl9kcml2ZXIpOwo+ID4gPiArCj4gPiA+ICtNT0RVTEVfREVTQ1JJUFRJT04oIlRv c2hpYmEgVEMzNTg3NDYgUGFyYWxsZWwgdG8gQ1NJLTIgYnJpZGdlIGRyaXZlciIpOwo+ID4gPiAr TU9EVUxFX0FVVEhPUigiTWFyY28gRmVsc2NoIDxrZXJuZWxAcGVuZ3V0cm9uaXguZGU+Iik7Cj4g PiA+ICtNT0RVTEVfTElDRU5TRSgiR1BMIik7CgotLSAKUmVnYXJkcywKCkxhdXJlbnQgUGluY2hh cnQKCi0tIApsaW51eC1waHkgbWFpbGluZyBsaXN0CmxpbnV4LXBoeUBsaXN0cy5pbmZyYWRlYWQu b3JnCmh0dHBzOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXBo eQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B3A90C54EE9 for ; Fri, 16 Sep 2022 14:33:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229601AbiIPOdb (ORCPT ); Fri, 16 Sep 2022 10:33:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59350 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229581AbiIPOd3 (ORCPT ); Fri, 16 Sep 2022 10:33:29 -0400 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 175D941D12; Fri, 16 Sep 2022 07:33:28 -0700 (PDT) Received: from pendragon.ideasonboard.com (unknown [104.132.8.103]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 4B372440; Fri, 16 Sep 2022 16:33:26 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1663338806; bh=0mq6iLjBRXE5LO1vAZY1gNiVywyq6U+Bz30w2WEJ6W0=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=FFOXZCjlrBQLXWQVyj4ZYr+ig3ENlC0wfxUIL2C3aKei8hr+pAgbpWkDF8+4BdlCl +yeOJcWbv60wj4es3VfrER/TBurm/yyeKBuZDwpAvEpFIHDMJquJEvOXgHLbRECoUQ RGBlyg0gbDBV0jRAIpxOs0l+95zluKk/tPnRbRvs= Date: Fri, 16 Sep 2022 17:33:12 +0300 From: Laurent Pinchart To: Marco Felsch Cc: mchehab@kernel.org, robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, vkoul@kernel.org, kishon@ti.com, sakari.ailus@linux.intel.com, hverkuil@xs4all.nl, jacopo@jmondi.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, devicetree@vger.kernel.org, linux-media@vger.kernel.org, kernel@pengutronix.de Subject: Re: [PATCH 4/4] media: tc358746: add Toshiba TC358746 Parallel to CSI-2 bridge driver Message-ID: References: <20220818143307.967150-1-m.felsch@pengutronix.de> <20220818143307.967150-5-m.felsch@pengutronix.de> <20220915165404.ghcjntxom7kzqyuy@pengutronix.de> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20220915165404.ghcjntxom7kzqyuy@pengutronix.de> Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Hi Marco, On Thu, Sep 15, 2022 at 06:54:04PM +0200, Marco Felsch wrote: > On 22-09-05, Laurent Pinchart wrote: > > On Thu, Aug 18, 2022 at 04:33:07PM +0200, Marco Felsch wrote: > > > Adding support for the TC358746 parallel <-> MIPI CSI bridge. This chip > > > supports two operating modes: > > > 1st) parallel-in -> mipi-csi out > > > 2nd) mipi-csi in -> parallel out > > > > > > This patch only adds the support for the 1st mode. > > > > > > Signed-off-by: Marco Felsch > > > --- > > > drivers/media/i2c/Kconfig | 17 + > > > drivers/media/i2c/Makefile | 1 + > > > drivers/media/i2c/tc358746.c | 1645 ++++++++++++++++++++++++++++++++++ > > > 3 files changed, 1663 insertions(+) > > > create mode 100644 drivers/media/i2c/tc358746.c [snip] > > > diff --git a/drivers/media/i2c/tc358746.c b/drivers/media/i2c/tc358746.c > > > new file mode 100644 > > > index 000000000000..7b71d0cf72a9 > > > --- /dev/null > > > +++ b/drivers/media/i2c/tc358746.c [snip] > > > +struct tc358746 { > > > + struct v4l2_subdev sd; > > > + struct media_pad pads[TC358746_NR_PADS]; > > > + struct v4l2_async_notifier notifier; > > > + struct v4l2_mbus_framefmt mbusfmt; > > > > Could you use the active state API instead of manually storing mbusfmt > > here ? It involves > > I will do that, thanks for the hint and it also elimates a few basic > checks like the pad-num check. Even nicer :-) > > - Implementing the .init_cfg() operation > > - Calling v4l2_subdev_init_finalize() in probe > > - Replacing calls to __tc358746_get_pad_format() with > > v4l2_subdev_get_pad_format() > > - Propagating the format from sink to source in tc358746_set_fmt() > > - Dropping tc358746_src_mbus_code() from tc358746_get_fmt() and simply > > retrieving the format using v4l2_subdev_get_pad_format() there > > - Dropping this field > > > > The formats for both the ACTIVE and TRY states will then be stored in > > the subdev state, unconditionally. You can retrieve the active state > > with v4l2_subdev_get_locked_active_state() in tc358746_s_stream(). > > > > > + struct v4l2_fwnode_endpoint csi_vep; > > > + > > > + struct v4l2_ctrl_handler ctrl_hdl; > > > + > > > + struct regmap *regmap; > > > + struct clk *refclk; > > > + struct gpio_desc *reset_gpio; > > > + struct regulator_bulk_data supplies[ARRAY_SIZE(tc358746_supplies)]; > > > + > > > + struct clk_hw mclk_hw; > > > + unsigned long mclk_rate; > > > + u8 mclk_prediv; > > > + u16 mclk_postdiv; > > > + > > > + unsigned long pll_rate; > > > + u8 pll_post_div; > > > + u16 pll_pre_div; > > > + u16 pll_mul; > > > + > > > + struct v4l2_ctrl *sensor_pclk_ctrl; > > > + > > > +#define TC358746_VB_MAX_SIZE (511 * 32) > > > +#define TC358746_VB_DEFAULT_SIZE (1 * 32) > > > + unsigned int vb_size; /* Video buffer size in bits */ > > > + > > > + struct phy_configure_opts_mipi_dphy dphy_cfg; > > > +}; [snip] > > > +#ifndef MHZ > > > > Where would it be previously defined ? This sounds like asking for > > trouble later. > > Sorry I don't get that, do you mean that I should define it at the very > beginning? I mean that either MHZ is defined somewhere in the kernel already, in case we should include the corresponding header, or it's not, and I wouldn't add an #ifndev here. Otherwise, if someone adds a MHZ macro later that gets pulled in through one of the kernel headers used by the driver, it may cause subtle bugs if the definition is different. Of course nobody will #define MHZ 42 but we could get #define MHZ 1000 * 1000 and something could break here. I'd drop the #ifndef to get the compiler to complain if there's a redefinition. > > > +#define MHZ (1000 * 1000) > > > +#endif [snip] > > > +static int > > > +tc358746_link_validate(struct v4l2_subdev *sd, struct media_link *link, > > > + struct v4l2_subdev_format *source_fmt, > > > + struct v4l2_subdev_format *sink_fmt) > > > +{ > > > + struct tc358746 *tc358746 = to_tc358746(sd); > > > + unsigned long csi_bitrate, sensor_bitrate; > > > + const struct tc358746_format *fmt; > > > + unsigned int fifo_sz, tmp, n; > > > + s64 sensor_pclk_rate; > > > + > > > + /* Check the FIFO settings */ > > > + fmt = tc358746_get_format_by_code(TC358746_SINK, tc358746->mbusfmt.code); > > > + if (IS_ERR(fmt)) > > > + return PTR_ERR(fmt); > > > + > > > + sensor_pclk_rate = v4l2_ctrl_g_ctrl_int64(tc358746->sensor_pclk_ctrl); > > > + sensor_bitrate = sensor_pclk_rate * fmt->bus_width; > > > + > > > + csi_bitrate = tc358746->dphy_cfg.lanes * tc358746->pll_rate; > > > + > > > + dev_dbg(tc358746->sd.dev, > > > + "Fifo settings params: sensor-bitrate:%lu csi-bitrate:%lu", > > > + sensor_bitrate, csi_bitrate); > > > + > > > + /* Avoid possible FIFO overflows */ > > > + if (csi_bitrate < sensor_bitrate) { > > > + dev_err(sd->dev, > > > + "Link validation failed csi-bitrate:%lu < sensor-bitrate:%lu\n", > > > + csi_bitrate, sensor_bitrate); > > > + return -EINVAL; > > > + } > > > + > > > + /* Best case */ > > > + if (csi_bitrate == sensor_bitrate) { > > > + tc358746->vb_size = TC358746_VB_DEFAULT_SIZE; > > > + goto out; > > > + } > > > + > > > + /* > > > + * Avoid possible FIFO underflow in case of > > > + * csi_bitrate > sensor_bitrate. For such case the chip has a internal > > > + * fifo which can be used to delay the line output. > > > + * > > > + * Fifo size calculation: > > > + * > > > + * fifo-sz, image-width - in bits > > > + * sbr - sensor_bitrate in bits/s > > > + * csir - csi_bitrate in bits/s > > > + * > > > + * 1 1 1 > > > + * image-width * --- + fifo-sz --- >= ---- * image-width > > > + * sbr sbr csir > > > + * > > > + * fifo-sz >= abs(sbr/csir * image-width - image-width) > > > + * `-----ยด > > > + * n > > > + * > > > + */ > > > + > > > + sensor_bitrate /= TC358746_PRECISION; > > > + n = csi_bitrate / sensor_bitrate; > > > + tmp = (tc358746->mbusfmt.width * TC358746_PRECISION) / n; > > > + fifo_sz = tc358746->mbusfmt.width - tmp; > > > + fifo_sz *= fmt->bpp; > > > + tc358746->vb_size = round_up(fifo_sz, 32); > > > + > > > > Please also call v4l2_subdev_link_validate_default() here. > > Did it in my internal prepared v2 ^^ I call it now at the very > beginning of this function. > > > I wonder if the above calculation wouldn't be better performed in > > .s_stream() (or rather in a function being called by .s_stream()) when > > enabling streaming. > > No I wouldn't shift that, since the link validation is in IMHO the > correct place to inform the user that the pipeline can't negotiate if > the fifo can't be configured correctly. Therefore I placed it here. The issue is that the user could enable the link first, and then change the V4L2_CID_LINK_FREQ of the sensor and push the pixel rate above what the TC358746 can support. Given the model that configures subdevs independently, you can only validate the pipeline at stream on time. > > > +out: > > > + dev_dbg(tc358746->sd.dev, > > > + "Found FIFO size[bits]:%u -> aligned to size[bits]:%u\n", > > > + fifo_sz, tc358746->vb_size); > > > + > > > + return tc358746->vb_size > TC358746_VB_MAX_SIZE ? -EINVAL : 0; > > > +} [snip] > > > +static int tc358746_probe(struct i2c_client *client) > > > +{ > > > + struct clk_init_data mclk_initdata = { }; > > > + struct device *dev = &client->dev; > > > + struct v4l2_fwnode_endpoint *vep; > > > + unsigned long csi_link_rate; > > > + struct tc358746 *tc358746; > > > + struct fwnode_handle *ep; > > > + unsigned char csi_lanes; > > > + struct v4l2_subdev *sd; > > > + struct v4l2_ctrl *ctrl; > > > + unsigned long refclk; > > > + unsigned int i; > > > + int err; > > > + u32 val; > > > + > > > + tc358746 = devm_kzalloc(&client->dev, sizeof(*tc358746), GFP_KERNEL); > > > + if (!tc358746) > > > + return -ENOMEM; > > > + > > > + tc358746->regmap = devm_regmap_init_i2c(client, &tc358746_regmap_config); > > > + if (IS_ERR(tc358746->regmap)) > > > + return dev_err_probe(dev, PTR_ERR(tc358746->regmap), > > > + "Failed to init regmap\n"); > > > + > > > + tc358746->refclk = devm_clk_get(dev, "refclk"); > > > + if (IS_ERR(tc358746->refclk)) > > > + return dev_err_probe(dev, PTR_ERR(tc358746->refclk), > > > + "Failed to get refclk\n"); > > > + > > > + err = clk_prepare_enable(tc358746->refclk); > > > + if (err) > > > + return dev_err_probe(dev, err, > > > + "Failed to enable refclk\n"); > > > + > > > + refclk = clk_get_rate(tc358746->refclk); > > > + clk_disable_unprepare(tc358746->refclk); > > > + > > > + if (refclk < 6 * MHZ || refclk > 40 * MHZ) > > > + return dev_err_probe(dev, -EINVAL, "Invalid refclk range\n"); > > > + > > > + for (i = 0; i < ARRAY_SIZE(tc358746_supplies); i++) > > > + tc358746->supplies[i].supply = tc358746_supplies[i]; > > > + > > > + err = devm_regulator_bulk_get(dev, ARRAY_SIZE(tc358746_supplies), > > > + tc358746->supplies); > > > + if (err) > > > + return dev_err_probe(dev, err, "Failed to get supplies\n"); > > > + > > > + tc358746->reset_gpio = devm_gpiod_get_optional(dev, "reset", > > > + GPIOD_OUT_HIGH); > > > + if (IS_ERR(tc358746->reset_gpio)) > > > + return dev_err_probe(dev, PTR_ERR(tc358746->reset_gpio), > > > + "Failed to get reset-gpios\n"); > > > + > > > + sd = &tc358746->sd; > > > + v4l2_i2c_subdev_init(sd, client, &tc358746_ops); > > > + sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; > > > + sd->entity.function = MEDIA_ENT_F_VID_IF_BRIDGE; > > > + sd->entity.ops = &tc358746_entity_ops; > > > + > > > + tc358746->pads[TC358746_SINK].flags = MEDIA_PAD_FL_SINK; > > > + tc358746->pads[TC358746_SOURCE].flags = MEDIA_PAD_FL_SOURCE; > > > + err = media_entity_pads_init(&sd->entity, TC358746_NR_PADS, > > > + tc358746->pads); > > > + if (err) > > > + return dev_err_probe(dev, err, > > > + "Failed to setup media-entity pads\n"); > > > + > > > + ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(dev), TC358746_SOURCE, > > > + 0, 0); > > > + if (!ep) { > > > + dev_err(dev, "Missing endpoint node\n"); > > > + err = -EINVAL; > > > + goto err_mc; > > > + } > > > + > > > + /* Currently we only support 'parallel in' -> 'csi out' */ > > > + vep = &tc358746->csi_vep; > > > + vep->bus_type = V4L2_MBUS_CSI2_DPHY; > > > + err = v4l2_fwnode_endpoint_alloc_parse(ep, vep); > > > + fwnode_handle_put(ep); > > > + if (err) { > > > + dev_err(dev, "Failed to parse source endpoint\n"); > > > + goto err_mc; > > > + } > > > + > > > + csi_lanes = vep->bus.mipi_csi2.num_data_lanes; > > > + if (csi_lanes == 0 || csi_lanes > 4 || > > > + vep->nr_of_link_frequencies == 0) { > > > + dev_err(dev, "error: Invalid CSI-2 settings\n"); > > > + err = -EINVAL; > > > + goto err_vep; > > > + } > > > + > > > + /* TODO: Add support to handle multiple link frequencies */ > > > + csi_link_rate = (unsigned long)vep->link_frequencies[0]; > > > + tc358746->pll_rate = tc358746_find_pll_settings(tc358746, refclk, > > > + csi_link_rate * 2); > > > + if (!tc358746->pll_rate) { > > > + err = -EINVAL; > > > + goto err_vep; > > > + } > > > + > > > + err = phy_mipi_dphy_get_default_config_for_hsclk(tc358746->pll_rate, > > > + csi_lanes, > > > + &tc358746->dphy_cfg); > > > + if (err) > > > + goto err_vep; > > > + > > > + tc358746->mbusfmt = tc358746_def_fmt; > > > + tc358746->vb_size = TC358746_VB_DEFAULT_SIZE; > > > + > > > + dev_set_drvdata(dev, tc358746); > > > + pm_runtime_set_autosuspend_delay(dev, 200); > > > + pm_runtime_use_autosuspend(dev); > > > + pm_runtime_enable(dev); > > > + > > > + err = pm_runtime_resume_and_get(dev); > > > + if (err < 0) { > > > + dev_err(dev, "Failed to resume the device\n"); > > > + goto err_vep; > > > + } > > > + > > > + /* Ensure that CSI interface is put into LP-11 state */ > > > + err = tc358746_sw_reset(tc358746); > > > + if (err) { > > > + pm_runtime_put_noidle(dev); > > > + dev_err(dev, "Failed to reset the device\n"); > > > + goto err_pm; > > > + } > > > + > > > + err = tc358746_read(tc358746, CHIPID_REG, &val); > > > + pm_runtime_mark_last_busy(dev); > > > + pm_runtime_put_sync_autosuspend(dev); > > > + if (err) { > > > + dev_err(dev, "Failed to read chipid\n"); > > > + err = -ENODEV; > > > + goto err_pm; > > > + } > > > + > > > + if (FIELD_GET(CHIPID, val) != 0x44) { > > > + dev_err(dev, "Invalid chipid 0x%02x\n", > > > + (u32)FIELD_GET(CHIPID, val)); > > > + err = -ENODEV; > > > + goto err_pm; > > > + } > > > + > > > + /* Optional MCLK provider support */ > > > + if (device_property_present(dev, "#clock-cells")) { > > > + const char *mclk_name; > > > + > > > + /* Init to highest possibel MCLK */ > > > + tc358746->mclk_postdiv = 512; > > > + tc358746->mclk_prediv = 8; > > > + > > > + mclk_name = "tc358746-mclk"; > > > + device_property_read_string(dev, "clock-output-names", > > > + &mclk_name); > > > + > > > + mclk_initdata.name = mclk_name; > > > + mclk_initdata.ops = &tc358746_mclk_ops; > > > + tc358746->mclk_hw.init = &mclk_initdata; > > > + > > > + err = devm_clk_hw_register(dev, &tc358746->mclk_hw); > > > + if (err) { > > > + dev_err(dev, "Failed to register mclk provider\n"); > > > + goto err_pm; > > > + } > > > + > > > + err = devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, > > > + &tc358746->mclk_hw); > > > + if (err) { > > > + dev_err(dev, "Failed to add mclk provider\n"); > > > + goto err_pm; > > > + } > > > + } > > > + > > > + v4l2_ctrl_handler_init(&tc358746->ctrl_hdl, 1); > > > + > > > + ctrl = v4l2_ctrl_new_int_menu(&tc358746->ctrl_hdl, NULL, > > > + V4L2_CID_LINK_FREQ, 0, 0, > > > + vep->link_frequencies); > > > + if (ctrl) > > > + ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; > > > + > > > + tc358746->sd.ctrl_handler = &tc358746->ctrl_hdl; > > > + if (tc358746->ctrl_hdl.error) { > > > + err = tc358746->ctrl_hdl.error; > > > + goto err_pm; > > > + } > > > + > > > + v4l2_ctrl_handler_setup(&tc358746->ctrl_hdl); > > > + > > > + err = tc358746_async_register(tc358746); > > > + if (err < 0) > > > + goto err_ctrl; > > > + > > > + dev_info(dev, "%s found @ 0x%x (%s)\n", client->name, > > > + client->addr, client->adapter->name); > > > > I'd skip this to avoid adding noise to the kernel log at boot time. I > > would also probably split some of the code out of the probe function as > > it's fairly large. Up to you. > > Yes it is large but most of it is just requesting stuff and so.. > Therefore I kept it here since I don't need it elsewhere. What about > setting it to dev_dbg()? Sometimes it can be useful e.g. to find the > problem why /dev/media is not comming up.. I find that enabling dev_dbg() messages from drivers/base/dd.c are helpful for that, but a dev_dbg() message here is fine too. > > > + > > > + return 0; > > > + > > > +err_ctrl: > > > + v4l2_ctrl_handler_free(&tc358746->ctrl_hdl); > > > +err_pm: > > > + pm_runtime_disable(dev); > > > + pm_runtime_set_suspended(dev); > > > + pm_runtime_dont_use_autosuspend(dev); > > > +err_vep: > > > + v4l2_fwnode_endpoint_free(vep); > > > +err_mc: > > > + media_entity_cleanup(&sd->entity); > > > + > > > + return err; > > > +} > > > + > > > +static int tc358746_remove(struct i2c_client *client) > > > +{ > > > + struct v4l2_subdev *sd = i2c_get_clientdata(client); > > > + struct tc358746 *tc358746 = to_tc358746(sd); > > > + > > > + v4l2_ctrl_handler_free(&tc358746->ctrl_hdl); > > > + v4l2_fwnode_endpoint_free(&tc358746->csi_vep); > > > + v4l2_async_nf_unregister(&tc358746->notifier); > > > + v4l2_async_nf_cleanup(&tc358746->notifier); > > > + v4l2_async_unregister_subdev(sd); > > > + v4l2_device_unregister_subdev(sd); > > > > This shouldn't be needed v4l2_async_unregister_subdev() should be > > enough. > > Okay, thanks. There are a lot of unregister helpers in the v4l2 space.. Too many of them indeed. I'd like to simplify all that. > > > + media_entity_cleanup(&sd->entity); > > > + > > > + pm_runtime_disable(sd->dev); > > > + pm_runtime_set_suspended(sd->dev); > > > + pm_runtime_dont_use_autosuspend(sd->dev); > > > + > > > + return 0; > > > +} > > > + > > > +static int tc358746_suspend(struct device *dev) > > > +{ > > > + struct tc358746 *tc358746 = dev_get_drvdata(dev); > > > + > > > + clk_disable_unprepare(tc358746->refclk); > > > + > > > + return regulator_bulk_disable(ARRAY_SIZE(tc358746_supplies), > > > + tc358746->supplies); > > > > Shouldn't you reenable the clock if this fails ? > > Hm.. if this fails I could end in a undefined chip state. But I got the > point that the framework would be in a bad state if it tries again to > suspend the device. It would be, and without a way to recover, so that could be an issue. > > > +} > > > + > > > +static int tc358746_resume(struct device *dev) > > > +{ > > > + struct tc358746 *tc358746 = dev_get_drvdata(dev); > > > + int err; > > > + > > > + gpiod_set_value(tc358746->reset_gpio, 1); > > > + > > > + err = regulator_bulk_enable(ARRAY_SIZE(tc358746_supplies), > > > + tc358746->supplies); > > > + if (err) > > > + return err; > > > + > > > + /* min. 200ns */ > > > + usleep_range(10, 20); > > > + > > > + gpiod_set_value(tc358746->reset_gpio, 0); > > > + > > > + err = clk_prepare_enable(tc358746->refclk); > > > + if (err) > > > + return err; > > > > The regulators need to be disabled in case of failure here and below > > (and so does the clock below). > > Yes, you're right. > > > > + > > > + /* min. 700us ... 1ms */ > > > + usleep_range(1000, 1500); > > > + > > > + /* Sync state */ > > > + err = tc358746_apply_pll_config(tc358746); > > > + if (err) > > > + return err; > > > + > > > + err = tc358746_apply_dphy_config(tc358746); > > > + if (err) > > > + return err; > > > + > > > + return tc358746_apply_misc_config(tc358746); > > > > Does all this belong to the PM resume handler ? It seems configuration > > could be handled in .s_stream() instead. > > This gets called by the s_stream() during getting the power state but I > can move the dphy/misc_config to the .s_stream() of course. That would be nice, thanks. > The pll > needs to be there since the device can be a clock provider e.g. for the > sensor. OK. > Thanks for the review :) > > > > +} > > > + > > > +DEFINE_RUNTIME_DEV_PM_OPS(tc358746_pm_ops, tc358746_suspend, > > > + tc358746_resume, NULL); > > > + > > > +static const struct of_device_id __maybe_unused tc358746_of_match[] = { > > > + { .compatible = "toshiba,tc358746" }, > > > + { }, > > > +}; > > > +MODULE_DEVICE_TABLE(of, tc358746_of_match); > > > + > > > +static struct i2c_driver tc358746_driver = { > > > + .driver = { > > > + .name = "tc358746", > > > + .pm = pm_ptr(&tc358746_pm_ops), > > > + .of_match_table = tc358746_of_match, > > > + }, > > > + .probe_new = tc358746_probe, > > > + .remove = tc358746_remove, > > > +}; > > > + > > > +module_i2c_driver(tc358746_driver); > > > + > > > +MODULE_DESCRIPTION("Toshiba TC358746 Parallel to CSI-2 bridge driver"); > > > +MODULE_AUTHOR("Marco Felsch "); > > > +MODULE_LICENSE("GPL"); -- Regards, Laurent Pinchart