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 X-Spam-Level: X-Spam-Status: No, score=-2.3 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS,UNPARSEABLE_RELAY,USER_AGENT_SANE_2 autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C5811C43603 for ; Wed, 11 Dec 2019 08:33:14 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 8CFA2214AF for ; Wed, 11 Dec 2019 08:33:14 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="HI5i9SIj" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727848AbfLKIdO (ORCPT ); Wed, 11 Dec 2019 03:33:14 -0500 Received: from mailgw02.mediatek.com ([1.203.163.81]:46331 "EHLO mailgw02.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1726845AbfLKIdO (ORCPT ); Wed, 11 Dec 2019 03:33:14 -0500 X-UUID: 500324c9e1284cdb9ab2648bcdfd4b88-20191211 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=YeTQWafGgn0rALH8sk+SzzKiaMxlA8NFVXXzs8C0bs8=; b=HI5i9SIj9Rzh11JlrwAsQcRhLhOCbEjNEscrFfYyX2Mv530aYtuz2f2XeSpfEWKt6AWFo7FuNqkPI+2P4IJP1VDcivbVktG8KyFmWrvRf0d/aULqjv0egjvE9vDjPaAAjGZc+M6oh94UT+FeuSZol7bpmicjRLcgBVc+oelOTng=; X-UUID: 500324c9e1284cdb9ab2648bcdfd4b88-20191211 Received: from mtkcas35.mediatek.inc [(172.27.4.253)] by mailgw02.mediatek.com (envelope-from ) (mailgw01.mediatek.com ESMTP with TLS) with ESMTP id 315170097; Wed, 11 Dec 2019 16:32:40 +0800 Received: from MTKCAS36.mediatek.inc (172.27.4.186) by MTKMBS31N1.mediatek.inc (172.27.4.69) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Wed, 11 Dec 2019 16:32:28 +0800 Received: from [10.17.3.153] (172.27.4.253) by MTKCAS36.mediatek.inc (172.27.4.170) with Microsoft SMTP Server id 15.0.1395.4 via Frontend Transport; Wed, 11 Dec 2019 16:32:48 +0800 Message-ID: <1576053159.15495.6.camel@mhfsdcap03> Subject: Re: [V5, 2/2] media: i2c: ov02a10: Add OV02A10 image sensor driver From: Dongchun Zhu To: Andy Shevchenko CC: , , , , , , , , , , , , , , , Date: Wed, 11 Dec 2019 16:32:39 +0800 In-Reply-To: <20191104122609.GI32742@smile.fi.intel.com> References: <20191104105713.24311-1-dongchun.zhu@mediatek.com> <20191104105713.24311-3-dongchun.zhu@mediatek.com> <20191104122609.GI32742@smile.fi.intel.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-TM-SNTS-SMTP: 3D6876AAE8218129BD3B244B65C93E1919CC423CA42655E27ED3A8CFAC4869B52000:8 X-MTK: N Content-Transfer-Encoding: base64 Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org SGkgQW5keSwNCg0KT24gTW9uLCAyMDE5LTExLTA0IGF0IDE0OjI2ICswMjAwLCBBbmR5IFNoZXZj aGVua28gd3JvdGU6DQo+IE9uIE1vbiwgTm92IDA0LCAyMDE5IGF0IDA2OjU3OjEzUE0gKzA4MDAs IERvbmdjaHVuIFpodSB3cm90ZToNCj4gPiBBZGQgYSBWNEwyIHN1Yi1kZXZpY2UgZHJpdmVyIGZv ciBPVjAyQTEwIGltYWdlIHNlbnNvci4NCj4gPiBUaGUgT1YwMkExMCBpcyBhIDEvNSIgQ01PUyBz ZW5zb3IgZnJvbSBPbW5pdmlzaW9uLCBzdXBwb3J0aW5nDQo+ID4gb3V0cHV0IGZvcm1hdDogMTAt Yml0IFJBVy4NCj4gPiANCj4gPiBUaGlzIGNoaXAgaGFzIGEgc2luZ2xlIE1JUEkgbGFuZSBpbnRl cmZhY2UgYW5kIHVzZSB0aGUgSTJDIGJ1cw0KPiA+IGZvciBjb250cm9sIGFuZCB0aGUgQ1NJLTIg YnVzIGZvciBkYXRhLg0KPiANCj4gPiArLyogQml0WzddIGNsb2NrIEhTIG1vZGUgZW5hYmxlDQo+ ID4gKyAqIDA6IENsb2NrIGNvbnRpbnVlDQo+ID4gKyAqIDE6IENsb2NrIEhTDQo+ID4gKyAqIEJp dFs2OjJdIEhTIFZPRCBhZGp1c3QNCj4gPiArICogQml0WzE6MF0gUCBWSEkgYWRqdXN0DQo+ID4g KyAqLw0KPiA+ICsjZGVmaW5lIFJFR19IU19NT0RFX0JMQwkJCQkJMHg5ZA0KPiA+ICsNCj4gPiAr I2RlZmluZSBDTE9DS19IU19NT0RFX0VOQUJMRQkJCQlCSVQoNykNCj4gDQo+ID4gKyNkZWZpbmUg Q0xPQ0tfSFNfVk9EX0FESlVTVAkoQklUKDYpIHwgQklUKDUpIHwgQklUKDQpIHwgQklUKDMpIHwg QklUKDIpKQ0KPiANCj4gR0VOTUFTSygpDQoNCkZpeGVkIGluIG5leHQgcmVsZWFzZS4NCg0KPiAN Cj4gPiArI2RlZmluZSBPVjAyQTEwX01BU0tfOF9CSVRTCQkJCTB4ZmYNCj4gDQo+IEdFTk1BU0so KQ0KDQpGaXhlZCBpbiBuZXh0IHJlbGVhc2UuDQoNCj4gDQo+ID4gKyNkZWZpbmUgT1YwMkExMF9M SU5LX0ZSRVFfMzkwTUhaCQkJMzkwMDAwMDAwVUxMDQo+IA0KPiBDYW4ndCB3ZSBwdWJsaXNoIEha X1BFUl9NSFogZm9yIHdpZGVyIHVzZSAoY3VycmVudGx5IGluIHBoeS1zdG0zMi11c2JwaHljLmMg YW5kDQo+IGhpZC1zZW5zb3ItYXR0cmlidXRlcy5jKSBhbmQgdXNlIGhlcmUgc29tZXRoaW5nIGxp a2UgKDM5MCAqIEhaX1BFUl9NSFopPw0KPiANCj4gPiArI2RlZmluZSBPVjAyQTEwX0VDTEtfRlJF UQkJCQkyNDAwMDAwMA0KPiANCj4gRGl0dG8uDQoNCkZpeGVkIGluIG5leHQgcmVsZWFzZS4NCg0K PiANCj4gPiArc3RhdGljIGNvbnN0IHM2NCBsaW5rX2ZyZXFfbWVudV9pdGVtc1tdID0gew0KPiAN Cj4gPiArCU9WMDJBMTBfTElOS19GUkVRXzM5ME1IWg0KPiANCj4gQmV0dGVyIHRvIGtlZXAgY29t bWEgaGVyZS4NCg0KRml4ZWQgaW4gbmV4dCByZWxlYXNlLg0KDQo+IA0KPiA+ICt9Ow0KPiANCj4g PiArew0KPiA+ICsJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRh dGEoJm92MDJhMTAtPnN1YmRldik7DQo+ID4gKwlpbnQgcmV0Ow0KPiA+ICsNCj4gPiArCXJldCA9 IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyk7DQo+ID4gKwlpZiAocmV0ID49 IDApIHsNCj4gPiArCQkqdmFsID0gKHVuc2lnbmVkIGNoYXIpcmV0Ow0KPiA+ICsJCXJldCA9IDA7 DQo+ID4gKwl9DQo+IA0KPiBXaHkgbm90IHRvIHVzZSBjbGFzc2ljYWwgcGF0dGVybg0KPiANCj4g CWlmIChyZXQgPCAwKQ0KPiAJCXJldHVybiByZXQ7DQo+IAkuLi4NCj4gCXJldHVybiAwOw0KPiAN Cj4gPw0KPiANCg0KTWFueSB0aGFua3MgZm9yIHJlbWluZGVyLiBGaXhlZCBpbiBuZXh0IHJlbGVh c2UuDQoNCj4gPiArDQo+ID4gKwlyZXR1cm4gcmV0Ow0KPiA+ICt9DQo+IA0KPiA+ICtzdGF0aWMg aW50IG92MDJhMTBfbW9kX3JlZyhzdHJ1Y3Qgb3YwMmExMCAqb3YwMmExMCwgdTggcmVnLCB1OCBt YXNrLCB1OCB2YWwpDQo+ID4gK3sNCj4gPiArCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2 NGwyX2dldF9zdWJkZXZkYXRhKCZvdjAyYTEwLT5zdWJkZXYpOw0KPiA+ICsJdTggcmVhZHZhbDsN Cj4gPiArCWludCByZXQ7DQo+ID4gKw0KPiA+ICsJcmV0ID0gb3YwMmExMF9yZWFkX3NtYnVzKG92 MDJhMTAsIHJlZywgJnJlYWR2YWwpOw0KPiA+ICsJaWYgKHJldCkNCj4gPiArCQlyZXR1cm4gcmV0 Ow0KPiA+ICsNCj4gDQo+ID4gKwlyZWFkdmFsICY9IH5tYXNrOw0KPiA+ICsJdmFsICY9IG1hc2s7 DQo+ID4gKwl2YWwgfD0gcmVhZHZhbDsNCj4gDQo+IFdoeSBub3QgdG8gdXNlIGNsYXNzaWNhbCBw YXR0ZXJuDQo+IAl2YWwgPSAocmVhZHZhbCAmIH5tYXNrKSB8ICh2YWwgJiBtYXNrKTsNCj4gPw0K PiANCg0KVGhhbmtzIGZvciByZW1pbmRlci4gRml4ZWQgaW4gbmV4dCByZWxlYXNlLg0KDQo+ID4g Kw0KPiA+ICsJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZh bCk7DQo+ID4gK30NCj4gDQo+ID4gK3sNCj4gPiArCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQg PSB2NGwyX2dldF9zdWJkZXZkYXRhKCZvdjAyYTEwLT5zdWJkZXYpOw0KPiA+ICsJdTE2IGlkOw0K PiANCj4gPiArCXU4IHBpZCA9IDA7DQo+ID4gKwl1OCB2ZXIgPSAwOw0KPiANCj4gVXNlbGVzcyBh c3NpZ25tZW50cy4NCj4gDQoNCkZpeGVkIGluIG5leHQgcmVsZWFzZS4NCg0KPiA+ICsJaW50IHJl dDsNCj4gPiArDQo+ID4gKwkvKiBDaGVjayBzZW5zb3IgcmV2aXNpb24gKi8NCj4gPiArCXJldCA9 IG92MDJhMTBfcmVhZF9zbWJ1cyhvdjAyYTEwLCBPVjAyQTEwX1JFR19DSElQX0lEX0gsICZwaWQp Ow0KPiA+ICsJaWYgKHJldCkNCj4gPiArCQlyZXR1cm4gcmV0Ow0KPiA+ICsNCj4gPiArCXJldCA9 IG92MDJhMTBfcmVhZF9zbWJ1cyhvdjAyYTEwLCBPVjAyQTEwX1JFR19DSElQX0lEX0wsICZ2ZXIp Ow0KPiA+ICsJaWYgKHJldCkNCj4gPiArCQlyZXR1cm4gcmV0Ow0KPiA+ICsNCj4gPiArCWlkID0g T1YwMkExMF9JRChwaWQsIHZlcik7DQo+ID4gKwlpZiAoaWQgIT0gQ0hJUF9JRCkgew0KPiA+ICsJ CWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiVW5leHBlY3RlZCBzZW5zb3IgaWQoJTA0eClcbiIsIGlk KTsNCj4gPiArCQlyZXR1cm4gLUVJTlZBTDsNCj4gPiArCX0NCj4gPiArDQo+ID4gKwlkZXZfZGJn KCZjbGllbnQtPmRldiwgIkRldGVjdGVkIE9WJTA0WCBzZW5zb3JcbiIsIGlkKTsNCj4gPiArDQo+ ID4gKwlyZXR1cm4gMDsNCj4gPiArfQ0KPiANCj4gPiArCWludCByZXQgPSAwOw0KPiANCj4gVXNl bGVzcyBhc3NpZ25tZW50Li4uDQo+IA0KDQpGaXhlZCBpbiBuZXh0IHJlbGVhc2UuDQoNCj4gPiAr DQo+ID4gKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIm92MDJhMTAgc19zdHJlYW0gKCVkKVxuIiwg b24pOw0KPiA+ICsJbXV0ZXhfbG9jaygmb3YwMmExMC0+bXV0ZXgpOw0KPiA+ICsNCj4gPiArCWlm IChvdjAyYTEwLT5zdHJlYW1pbmcgPT0gb24pDQo+ID4gKwkJZ290byB1bmxvY2tfYW5kX3JldHVy bjsNCj4gPiArDQo+ID4gKwlpZiAob24pIHsNCj4gPiArCQlyZXQgPSBwbV9ydW50aW1lX2dldF9z eW5jKCZjbGllbnQtPmRldik7DQo+ID4gKwkJaWYgKHJldCA8IDApIHsNCj4gPiArCQkJcG1fcnVu dGltZV9wdXRfbm9pZGxlKCZjbGllbnQtPmRldik7DQo+ID4gKwkJCWdvdG8gdW5sb2NrX2FuZF9y ZXR1cm47DQo+ID4gKwkJfQ0KPiA+ICsNCj4gPiArCQlyZXQgPSBfX292MDJhMTBfc3RhcnRfc3Ry ZWFtKG92MDJhMTApOw0KPiA+ICsJCWlmIChyZXQpIHsNCj4gPiArCQkJX19vdjAyYTEwX3N0b3Bf c3RyZWFtKG92MDJhMTApOw0KPiA+ICsJCQlvdjAyYTEwLT5zdHJlYW1pbmcgPSAhb247DQo+ID4g KwkJCWdvdG8gZXJyX3JwbV9wdXQ7DQo+ID4gKwkJfQ0KPiA+ICsJfSBlbHNlIHsNCj4gPiArCQlf X292MDJhMTBfc3RvcF9zdHJlYW0ob3YwMmExMCk7DQo+ID4gKwkJcG1fcnVudGltZV9wdXQoJmNs aWVudC0+ZGV2KTsNCj4gPiArCX0NCj4gPiArDQo+ID4gKwlvdjAyYTEwLT5zdHJlYW1pbmcgPSBv bjsNCj4gPiArCW11dGV4X3VubG9jaygmb3YwMmExMC0+bXV0ZXgpOw0KPiA+ICsNCj4gDQo+ID4g KwlyZXR1cm4gcmV0Ow0KPiANCj4gLi4uc2ltcGxlIHVzZQ0KPiAJcmV0dXJuIDA7DQo+IGhlcmUu DQo+IA0KDQpGaXhlZCBpbiBuZXh0IHJlbGVhc2UuDQoNCj4gPiArDQo+ID4gK2Vycl9ycG1fcHV0 Og0KPiA+ICsJcG1fcnVudGltZV9wdXQoJmNsaWVudC0+ZGV2KTsNCj4gPiArdW5sb2NrX2FuZF9y ZXR1cm46DQo+ID4gKwltdXRleF91bmxvY2soJm92MDJhMTAtPm11dGV4KTsNCj4gPiArDQo+ID4g KwlyZXR1cm4gcmV0Ow0KPiA+ICt9DQo+IA0KPiA+ICtzdGF0aWMgaW50IG92MDJhMTBfc2V0X2N0 cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkNCj4gPiArew0KPiA+ICsJc3RydWN0IG92MDJhMTAg Km92MDJhMTAgPSBjb250YWluZXJfb2YoY3RybC0+aGFuZGxlciwNCj4gPiArCQkJCQkgICAgICAg c3RydWN0IG92MDJhMTAsIGN0cmxfaGFuZGxlcik7DQo+ID4gKwlzdHJ1Y3QgaTJjX2NsaWVudCAq Y2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmb3YwMmExMC0+c3ViZGV2KTsNCj4gPiArCXM2 NCBtYXhfZXhwbzsNCj4gDQo+ID4gKwlpbnQgcmV0ID0gMDsNCj4gDQo+IFdvdWxkbid0IGJlIGJl dHRlciB0byBoYXZlIHRoaXMgdW5kZXIgYGRlZmF1bHRgIGNhc2UgYmVsb3c/DQo+IA0KDQpGaXhl ZCBpbiBuZXh0IHJlbGVhc2UuDQoNCj4gPiArDQo+ID4gKwkvKiBQcm9wYWdhdGUgY2hhbmdlIG9m IGN1cnJlbnQgY29udHJvbCB0byBhbGwgcmVsYXRlZCBjb250cm9scyAqLw0KPiA+ICsJaWYgKGN0 cmwtPmlkID09IFY0TDJfQ0lEX1ZCTEFOSykgew0KPiA+ICsJCS8qIFVwZGF0ZSBtYXggZXhwb3N1 cmUgd2hpbGUgbWVldGluZyBleHBlY3RlZCB2YmxhbmtpbmcgKi8NCj4gPiArCQltYXhfZXhwbyA9 IG92MDJhMTAtPmN1cl9tb2RlLT5oZWlnaHQgKyBjdHJsLT52YWwgLQ0KPiA+ICsJCQkgICBPVjAy QTEwX0VYUE9TVVJFX01BWF9NQVJHSU47DQo+ID4gKwkJX192NGwyX2N0cmxfbW9kaWZ5X3Jhbmdl KG92MDJhMTAtPmV4cG9zdXJlLA0KPiA+ICsJCQkJCSBvdjAyYTEwLT5leHBvc3VyZS0+bWluaW11 bSwgbWF4X2V4cG8sDQo+ID4gKwkJCQkJIG92MDJhMTAtPmV4cG9zdXJlLT5zdGVwLA0KPiA+ICsJ CQkJCSBvdjAyYTEwLT5leHBvc3VyZS0+ZGVmYXVsdF92YWx1ZSk7DQo+ID4gKwl9DQo+ID4gKw0K PiA+ICsJLyogVjRMMiBjb250cm9scyB2YWx1ZXMgd2lsbCBiZSBhcHBsaWVkIG9ubHkgd2hlbiBw b3dlciBpcyBhbHJlYWR5IHVwICovDQo+ID4gKwlpZiAoIXBtX3J1bnRpbWVfZ2V0X2lmX2luX3Vz ZSgmY2xpZW50LT5kZXYpKQ0KPiA+ICsJCXJldHVybiAwOw0KPiA+ICsNCj4gPiArCXN3aXRjaCAo Y3RybC0+aWQpIHsNCj4gPiArCWNhc2UgVjRMMl9DSURfRVhQT1NVUkU6DQo+ID4gKwkJcmV0ID0g b3YwMmExMF9zZXRfZXhwb3N1cmUob3YwMmExMCwgY3RybC0+dmFsKTsNCj4gPiArCQlicmVhazsN Cj4gPiArCWNhc2UgVjRMMl9DSURfQU5BTE9HVUVfR0FJTjoNCj4gPiArCQlyZXQgPSBvdjAyYTEw X3NldF9nYWluKG92MDJhMTAsIGN0cmwtPnZhbCk7DQo+ID4gKwkJYnJlYWs7DQo+ID4gKwljYXNl IFY0TDJfQ0lEX1ZCTEFOSzoNCj4gPiArCQlyZXQgPSBvdjAyYTEwX3NldF92Ymxhbmsob3YwMmEx MCwgY3RybC0+dmFsKTsNCj4gPiArCQlicmVhazsNCj4gPiArCWNhc2UgVjRMMl9DSURfVEVTVF9Q QVRURVJOOg0KPiA+ICsJCXJldCA9IG92MDJhMTBfc2V0X3Rlc3RfcGF0dGVybihvdjAyYTEwLCBj dHJsLT52YWwpOw0KPiA+ICsJCWJyZWFrOw0KPiA+ICsJfTsNCj4gPiArDQo+ID4gKwlwbV9ydW50 aW1lX3B1dCgmY2xpZW50LT5kZXYpOw0KPiA+ICsNCj4gPiArCXJldHVybiByZXQ7DQo+ID4gK30N Cj4gDQo+ID4gK3sNCj4gPiArCXN0cnVjdCBmd25vZGVfaGFuZGxlICplcDsNCj4gPiArCXN0cnVj dCBmd25vZGVfaGFuZGxlICpmd25vZGUgPSBkZXZfZndub2RlKGRldik7DQo+ID4gKwlzdHJ1Y3Qg djRsMl9md25vZGVfZW5kcG9pbnQgYnVzX2NmZyA9IHsNCj4gPiArCQkuYnVzX3R5cGUgPSBWNEwy X01CVVNfQ1NJMl9EUEhZDQo+ID4gKwl9Ow0KPiA+ICsJdW5zaWduZWQgaW50IGksIGo7DQo+ID4g KwlpbnQgcmV0Ow0KPiA+ICsNCj4gDQo+IEkgd291bGQgcmF0aGVyIGV4cGVjdCBmd25vZGUgYXNz aWdubWVudCBoZXJlIHRvIHVuZGVyc3RhbmQgaW1tZWRpYXRlbHkgZnJvbQ0KPiB3aGVyZSBpdCBo YXMgYmVlbiBkZXJpdmVkLiBUaG91Z2ggaXQncyB1cCB0byBtYWludGFpbmVycy4NCj4gDQoNClRo aXMgd291bGQgYmUgcmVtYWluZWQsIGFzIG1hbnkgb3RoZXIgZHJpdmVycyBrZWVwIHRoZSBzYW1l IHN0eWxlLg0KDQo+ID4gKwlpZiAoIWZ3bm9kZSkNCj4gPiArCQlyZXR1cm4gLUVOWElPOw0KPiA+ ICsNCj4gPiArCWVwID0gZndub2RlX2dyYXBoX2dldF9uZXh0X2VuZHBvaW50KGZ3bm9kZSwgTlVM TCk7DQo+ID4gKwlpZiAoIWVwKQ0KPiA+ICsJCXJldHVybiAtRU5YSU87DQo+ID4gKw0KPiA+ICsJ cmV0ID0gdjRsMl9md25vZGVfZW5kcG9pbnRfYWxsb2NfcGFyc2UoZXAsICZidXNfY2ZnKTsNCj4g PiArCWZ3bm9kZV9oYW5kbGVfcHV0KGVwKTsNCj4gPiArCWlmIChyZXQpDQo+ID4gKwkJcmV0dXJu IHJldDsNCj4gPiArDQo+ID4gKwkvKiBPcHRpb25hbCBpbmRpY2F0aW9uIG9mIG1pcGkgY2xvY2sg bGFuZSBtb2RlICovDQo+ID4gKwlpZiAoYnVzX2NmZy5idXMubWlwaV9jc2kyLmZsYWdzICYgVjRM Ml9NQlVTX0NTSTJfTk9OQ09OVElOVU9VU19DTE9DSykNCj4gPiArCQlvdjAyYTEwLT5taXBpX2Ns b2NrX2hzX21vZGVfZW5hYmxlID0gdHJ1ZTsNCj4gPiArDQo+IA0KPiA+ICsJaWYgKCFidXNfY2Zn Lm5yX29mX2xpbmtfZnJlcXVlbmNpZXMpIHsNCj4gPiArCQlkZXZfZXJyKGRldiwgIm5vIGxpbmsg ZnJlcXVlbmNpZXMgZGVmaW5lZCIpOw0KPiA+ICsJCXJldCA9IC1FSU5WQUw7DQo+ID4gKwkJZ290 byBjaGVja19od2NmZ19lcnJvcjsNCj4gPiArCX0NCj4gDQo+IFRoaXMgaXMgcmVkdW5kYW50IGNo ZWNrLiBZb3UgaGF2ZSBkb25lIHRoZSBzaW1pbGFyIGJlbG93IHdoZW4gY29tcGFyaW5nIGogdG8N Cj4gbnJfb2ZfbGlua19mcmVxdWVuY2llcy4NCj4gDQoNCmJ1c19jZmcubnJfb2ZfbGlua19mcmVx dWVuY2llcyBzaG91bGQgYmUgY2hlY2tlZCBmaXJzdCBiZWZvcmUgdXNpbmcgaXQuDQpGb3IgaW5z dGFuY2UsIE9WODg1NiB1c2VzIHRoZSBzYW1lIGNoZWNrIHN0eWxlLg0KDQo+ID4gKw0KPiA+ICsJ Zm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobGlua19mcmVxX21lbnVfaXRlbXMpOyBpKyspIHsN Cj4gPiArCQlmb3IgKGogPSAwOyBqIDwgYnVzX2NmZy5ucl9vZl9saW5rX2ZyZXF1ZW5jaWVzOyBq KyspIHsNCj4gPiArCQkJaWYgKGxpbmtfZnJlcV9tZW51X2l0ZW1zW2ldID09DQo+ID4gKwkJCQli dXNfY2ZnLmxpbmtfZnJlcXVlbmNpZXNbal0pDQo+ID4gKwkJCQlicmVhazsNCj4gPiArCQl9DQo+ ID4gKw0KPiA+ICsJCWlmIChqID09IGJ1c19jZmcubnJfb2ZfbGlua19mcmVxdWVuY2llcykgew0K PiA+ICsJCQlkZXZfZXJyKGRldiwgIm5vIGxpbmsgZnJlcXVlbmN5ICVsbGQgc3VwcG9ydGVkIiwN Cj4gPiArCQkJCWxpbmtfZnJlcV9tZW51X2l0ZW1zW2ldKTsNCj4gPiArCQkJcmV0ID0gLUVJTlZB TDsNCj4gPiArCQkJZ290byBjaGVja19od2NmZ19lcnJvcjsNCj4gPiArCQl9DQo+ID4gKwl9DQo+ ID4gKw0KPiA+ICtjaGVja19od2NmZ19lcnJvcjoNCj4gPiArCXY0bDJfZndub2RlX2VuZHBvaW50 X2ZyZWUoJmJ1c19jZmcpOw0KPiA+ICsNCj4gPiArCXJldHVybiByZXQ7DQo+ID4gK30NCj4gDQo+ ID4gK3N0YXRpYyBpbnQgb3YwMmExMF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQ0K PiA+ICt7DQo+IA0KPiANCj4gPiArCS8qIE9wdGlvbmFsIGluZGljYXRpb24gb2YgcGh5c2ljYWwg cm90YXRpb24gb2Ygc2Vuc29yICovDQo+ID4gKwlyZXQgPSBmd25vZGVfcHJvcGVydHlfcmVhZF91 MzIoZGV2X2Z3bm9kZShkZXYpLCAicm90YXRpb24iLA0KPiA+ICsJCQkJICAgICAgICZyb3RhdGlv bik7DQo+IA0KPiBJdCdzIHBlcmZlY3RseSBvbmUgbGluZS4NCj4gDQoNCkZpeGVkIGluIG5leHQg cmVsZWFzZS4NCg0KPiA+ICsJaWYgKCFyZXQpIHsNCj4gDQo+IEkgd291bGQgcmF0aGVyIGRvIHR3 byB0aGluZ3MgaGVyZToNCj4gMS8gdXNlIHRoZSBzaW1pbGFyIHBhdHRlcm4gYXMgYmVsb3cgd2l0 aCBtZXNzYWdpbmcNCj4gCWlmICghcmV0KSB7DQo+IAkJLi4uDQo+IAl9IGVsc2Ugew0KPiAJCWRl dl9kYmcoLi4uKTsNCj4gCX0NCj4gMi8gQWN0dWFsbHkgdXNlIHBvc2l0aXZlIGNvbmRpdGlvbmFs cw0KPiAJaWYgKHJldCkgew0KPiAJCS4uLg0KPiAJfSBlbHNlIHsNCj4gCQkuLi4NCj4gCX0NCj4g DQoNCkZpeGVkIGluIG5leHQgcmVsZWFzZS4NCg0KPiA+ICsJCXN3aXRjaCAocm90YXRpb24pIHsN Cj4gPiArCQljYXNlIDE4MDoNCj4gPiArCQkJb3YwMmExMC0+dXBzaWRlX2Rvd24gPSB0cnVlOw0K PiA+ICsJCQlvdjAyYTEwLT5mbXQuY29kZSA9IE1FRElBX0JVU19GTVRfU1JHR0IxMF8xWDEwOw0K PiA+ICsJCQlicmVhazsNCj4gPiArCQljYXNlIDA6DQo+ID4gKwkJCWJyZWFrOw0KPiA+ICsJCWRl ZmF1bHQ6DQo+ID4gKwkJCWRldl93YXJuKGRldiwgIiV1IGRlZ3JlZXMgcm90YXRpb24gaXMgbm90 IHN1cHBvcnRlZCwgaWdub3JpbmcuLi5cbiIsDQo+ID4gKwkJCQkgcm90YXRpb24pOw0KPiA+ICsJ CX0NCj4gPiArCX0NCj4gPiArDQo+ID4gKwkvKiBPcHRpb25hbCBpbmRpY2F0aW9uIG9mIEhTIFZP RCBhZGp1c3QgKi8NCj4gPiArCXJldCA9IGZ3bm9kZV9wcm9wZXJ0eV9yZWFkX3UzMihkZXZfZndu b2RlKGRldiksDQo+ID4gKwkJCQkgICAgICAgIm92dGksaHMtdm9kLWFkanVzdCIsDQo+ID4gKwkJ CQkgICAgICAgJmhzX3ZvZF9hZGp1c3RfY250KTsNCj4gPiArCWlmICghcmV0KQ0KPiA+ICsJCW92 MDJhMTAtPm1pcGlfY2xvY2tfaHNfdm9kX2FkanVzdF9jbnQgPSBoc192b2RfYWRqdXN0X2NudDsN Cj4gPiArCWVsc2UNCj4gPiArCQlkZXZfd2FybihkZXYsICJmYWlsZWQgdG8gZ2V0IGhzIHZvZCBh ZGp1c3QsIHVzaW5nIGRlZmF1bHRcbiIpOw0KPiA+ICsNCj4gPiArCS8qIE9wdGlvbmFsIGluZGlj YXRpb24gb2YgbWlwaSB0eCBzcGVlZCAqLw0KPiA+ICsJcmV0ID0gZndub2RlX3Byb3BlcnR5X3Jl YWRfdTMyKGRldl9md25vZGUoZGV2KSwNCj4gPiArCQkJCSAgICAgICAib3Z0aSxtaXBpLXR4LXNw ZWVkIiwNCj4gPiArCQkJCSAgICAgICAmY2xvY2tfbGFuZV90eF9zcGVlZCk7DQo+ID4gKw0KPiA+ ICsJaWYgKCFyZXQpDQo+ID4gKwkJb3YwMmExMC0+bWlwaV9jbG9ja190eF9zcGVlZCA9IGNsb2Nr X2xhbmVfdHhfc3BlZWQ7DQo+ID4gKwllbHNlDQo+ID4gKwkJZGV2X3dhcm4oZGV2LCAiZmFpbGVk IHRvIGdldCBtaXBpIHR4IHNwZWVkLCB1c2luZyBkZWZhdWx0XG4iKTsNCj4gDQo+ID4gKwkvKiBH ZXQgc3lzdGVtIGNsb2NrIChlY2xrKSAqLw0KPiA+ICsJb3YwMmExMC0+ZWNsayA9IGRldm1fY2xr X2dldChkZXYsICJlY2xrIik7DQo+ID4gKwlpZiAoSVNfRVJSKG92MDJhMTAtPmVjbGspKSB7DQo+ ID4gKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGVjbGtcbiIpOw0KPiANCj4gPiArCQly ZXR1cm4gLUVJTlZBTDsNCj4gDQo+IFdoeSBzaGFkb3cgZXJyb3IgY29kZT8NCj4gDQoNCk9rYXku IEZpeGVkIGluIG5leHQgcmVsZWFzZS4NCg0KPiA+ICsJfQ0KPiANCj4gPiArCW92MDJhMTAtPnBk X2dwaW8gPSBkZXZtX2dwaW9kX2dldChkZXYsICJwb3dlcmRvd24iLCBHUElPRF9PVVRfSElHSCk7 DQo+ID4gKwlpZiAoSVNfRVJSKG92MDJhMTAtPnBkX2dwaW8pKSB7DQo+ID4gKwkJZGV2X2Vycihk ZXYsICJmYWlsZWQgdG8gZ2V0IHBvd2VyZG93bi1ncGlvc1xuIik7DQo+IA0KPiA+ICsJCXJldHVy biAtRUlOVkFMOw0KPiANCj4gRGl0dG8uDQo+IA0KDQpGaXhlZCBpbiBuZXh0IHJlbGVhc2UuDQoN Cj4gPiArCX0NCj4gDQo+ID4gKwlvdjAyYTEwLT5uX3JzdF9ncGlvID0gZGV2bV9ncGlvZF9nZXQo ZGV2LCAicmVzZXQiLCBHUElPRF9PVVRfTE9XKTsNCj4gPiArCWlmIChJU19FUlIob3YwMmExMC0+ bl9yc3RfZ3BpbykpIHsNCj4gPiArCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgcmVzZXQt Z3Bpb3NcbiIpOw0KPiANCj4gPiArCQlyZXR1cm4gLUVJTlZBTDsNCj4gDQo+IERpdHRvLg0KPiAN Cg0KRml4ZWQgaW4gbmV4dCByZWxlYXNlLg0KDQo+ID4gKwl9DQo+IA0KPiA+ICt9DQo+IA0KDQo= 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 X-Spam-Level: X-Spam-Status: No, score=-2.2 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS,UNPARSEABLE_RELAY,URIBL_BLOCKED,USER_AGENT_SANE_2 autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 86B30C2BD09 for ; Wed, 11 Dec 2019 08:33:05 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 5872420836 for ; Wed, 11 Dec 2019 08:33:05 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="LA4pGgAr"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="HI5i9SIj" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5872420836 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Date:To:From:Subject:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=oDBZ9iA9y+YiaQWbgak5JMLoABXKE3k7UjDhuNheSeQ=; b=LA4pGgArVSWYpz HpZj3seFPB1mwfVTIZ4yxTrUKtvse1+GTp5GlBO5RzzcHQKl/2PEesFj2aCqfrZDc18Gx3V+8XQe9 LzJIDKso4ofQBCTxfJJGUB8u/rYCFxVrZ+zNwYQH5ipa4x//GiDs897kM9RSD1kKi9Amlw/m0Baa3 WHAFdsLviUwXbXBYvb/iFBaamlWJ+hrwWEWQ8RZLCsgDlEVy/mFQvfvzH3gd1WyeTm08pE7UdvRZz fylmsZJNixD7IZJDFhTnNSV7xaaN0jjGDRy26BOxEy4R6i6UrAQoZ8lamaiVZu/fJWMOaU+baloNo CmG+6hgHrHK19VDTTVUA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1iexQS-0000NM-3W; Wed, 11 Dec 2019 08:32:52 +0000 Received: from mailgw01.mediatek.com ([216.200.240.184]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1iexQO-0000Mv-WA; Wed, 11 Dec 2019 08:32:50 +0000 X-UUID: 089c20e5fc5d42c080e9d58bcc877486-20191211 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=YeTQWafGgn0rALH8sk+SzzKiaMxlA8NFVXXzs8C0bs8=; b=HI5i9SIj9Rzh11JlrwAsQcRhLhOCbEjNEscrFfYyX2Mv530aYtuz2f2XeSpfEWKt6AWFo7FuNqkPI+2P4IJP1VDcivbVktG8KyFmWrvRf0d/aULqjv0egjvE9vDjPaAAjGZc+M6oh94UT+FeuSZol7bpmicjRLcgBVc+oelOTng=; X-UUID: 089c20e5fc5d42c080e9d58bcc877486-20191211 Received: from mtkcas67.mediatek.inc [(172.29.193.45)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLS) with ESMTP id 754507078; Wed, 11 Dec 2019 00:32:44 -0800 Received: from MTKMBS31N1.mediatek.inc (172.27.4.69) by MTKMBS62DR.mediatek.inc (172.29.94.18) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Wed, 11 Dec 2019 00:32:58 -0800 Received: from MTKCAS36.mediatek.inc (172.27.4.186) by MTKMBS31N1.mediatek.inc (172.27.4.69) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Wed, 11 Dec 2019 16:32:28 +0800 Received: from [10.17.3.153] (172.27.4.253) by MTKCAS36.mediatek.inc (172.27.4.170) with Microsoft SMTP Server id 15.0.1395.4 via Frontend Transport; Wed, 11 Dec 2019 16:32:48 +0800 Message-ID: <1576053159.15495.6.camel@mhfsdcap03> Subject: Re: [V5, 2/2] media: i2c: ov02a10: Add OV02A10 image sensor driver From: Dongchun Zhu To: Andy Shevchenko Date: Wed, 11 Dec 2019 16:32:39 +0800 In-Reply-To: <20191104122609.GI32742@smile.fi.intel.com> References: <20191104105713.24311-1-dongchun.zhu@mediatek.com> <20191104105713.24311-3-dongchun.zhu@mediatek.com> <20191104122609.GI32742@smile.fi.intel.com> X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-TM-SNTS-SMTP: 3D6876AAE8218129BD3B244B65C93E1919CC423CA42655E27ED3A8CFAC4869B52000:8 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20191211_003249_047889_71B546BE X-CRM114-Status: GOOD ( 21.10 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mark.rutland@arm.com, devicetree@vger.kernel.org, drinkcat@chromium.org, srv_heupstream@mediatek.com, shengnan.wang@mediatek.com, tfiga@chromium.org, louis.kuo@mediatek.com, sj.huang@mediatek.com, robh+dt@kernel.org, linux-mediatek@lists.infradead.org, sakari.ailus@linux.intel.com, matthias.bgg@gmail.com, bingbu.cao@intel.com, mchehab@kernel.org, linux-arm-kernel@lists.infradead.org, linux-media@vger.kernel.org Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org Hi Andy, On Mon, 2019-11-04 at 14:26 +0200, Andy Shevchenko wrote: > On Mon, Nov 04, 2019 at 06:57:13PM +0800, Dongchun Zhu wrote: > > Add a V4L2 sub-device driver for OV02A10 image sensor. > > The OV02A10 is a 1/5" CMOS sensor from Omnivision, supporting > > output format: 10-bit RAW. > > > > This chip has a single MIPI lane interface and use the I2C bus > > for control and the CSI-2 bus for data. > > > +/* Bit[7] clock HS mode enable > > + * 0: Clock continue > > + * 1: Clock HS > > + * Bit[6:2] HS VOD adjust > > + * Bit[1:0] P VHI adjust > > + */ > > +#define REG_HS_MODE_BLC 0x9d > > + > > +#define CLOCK_HS_MODE_ENABLE BIT(7) > > > +#define CLOCK_HS_VOD_ADJUST (BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2)) > > GENMASK() Fixed in next release. > > > +#define OV02A10_MASK_8_BITS 0xff > > GENMASK() Fixed in next release. > > > +#define OV02A10_LINK_FREQ_390MHZ 390000000ULL > > Can't we publish HZ_PER_MHZ for wider use (currently in phy-stm32-usbphyc.c and > hid-sensor-attributes.c) and use here something like (390 * HZ_PER_MHZ)? > > > +#define OV02A10_ECLK_FREQ 24000000 > > Ditto. Fixed in next release. > > > +static const s64 link_freq_menu_items[] = { > > > + OV02A10_LINK_FREQ_390MHZ > > Better to keep comma here. Fixed in next release. > > > +}; > > > +{ > > + struct i2c_client *client = v4l2_get_subdevdata(&ov02a10->subdev); > > + int ret; > > + > > + ret = i2c_smbus_read_byte_data(client, reg); > > + if (ret >= 0) { > > + *val = (unsigned char)ret; > > + ret = 0; > > + } > > Why not to use classical pattern > > if (ret < 0) > return ret; > ... > return 0; > > ? > Many thanks for reminder. Fixed in next release. > > + > > + return ret; > > +} > > > +static int ov02a10_mod_reg(struct ov02a10 *ov02a10, u8 reg, u8 mask, u8 val) > > +{ > > + struct i2c_client *client = v4l2_get_subdevdata(&ov02a10->subdev); > > + u8 readval; > > + int ret; > > + > > + ret = ov02a10_read_smbus(ov02a10, reg, &readval); > > + if (ret) > > + return ret; > > + > > > + readval &= ~mask; > > + val &= mask; > > + val |= readval; > > Why not to use classical pattern > val = (readval & ~mask) | (val & mask); > ? > Thanks for reminder. Fixed in next release. > > + > > + return i2c_smbus_write_byte_data(client, reg, val); > > +} > > > +{ > > + struct i2c_client *client = v4l2_get_subdevdata(&ov02a10->subdev); > > + u16 id; > > > + u8 pid = 0; > > + u8 ver = 0; > > Useless assignments. > Fixed in next release. > > + int ret; > > + > > + /* Check sensor revision */ > > + ret = ov02a10_read_smbus(ov02a10, OV02A10_REG_CHIP_ID_H, &pid); > > + if (ret) > > + return ret; > > + > > + ret = ov02a10_read_smbus(ov02a10, OV02A10_REG_CHIP_ID_L, &ver); > > + if (ret) > > + return ret; > > + > > + id = OV02A10_ID(pid, ver); > > + if (id != CHIP_ID) { > > + dev_err(&client->dev, "Unexpected sensor id(%04x)\n", id); > > + return -EINVAL; > > + } > > + > > + dev_dbg(&client->dev, "Detected OV%04X sensor\n", id); > > + > > + return 0; > > +} > > > + int ret = 0; > > Useless assignment... > Fixed in next release. > > + > > + dev_dbg(&client->dev, "ov02a10 s_stream (%d)\n", on); > > + mutex_lock(&ov02a10->mutex); > > + > > + if (ov02a10->streaming == on) > > + goto unlock_and_return; > > + > > + if (on) { > > + ret = pm_runtime_get_sync(&client->dev); > > + if (ret < 0) { > > + pm_runtime_put_noidle(&client->dev); > > + goto unlock_and_return; > > + } > > + > > + ret = __ov02a10_start_stream(ov02a10); > > + if (ret) { > > + __ov02a10_stop_stream(ov02a10); > > + ov02a10->streaming = !on; > > + goto err_rpm_put; > > + } > > + } else { > > + __ov02a10_stop_stream(ov02a10); > > + pm_runtime_put(&client->dev); > > + } > > + > > + ov02a10->streaming = on; > > + mutex_unlock(&ov02a10->mutex); > > + > > > + return ret; > > ...simple use > return 0; > here. > Fixed in next release. > > + > > +err_rpm_put: > > + pm_runtime_put(&client->dev); > > +unlock_and_return: > > + mutex_unlock(&ov02a10->mutex); > > + > > + return ret; > > +} > > > +static int ov02a10_set_ctrl(struct v4l2_ctrl *ctrl) > > +{ > > + struct ov02a10 *ov02a10 = container_of(ctrl->handler, > > + struct ov02a10, ctrl_handler); > > + struct i2c_client *client = v4l2_get_subdevdata(&ov02a10->subdev); > > + s64 max_expo; > > > + int ret = 0; > > Wouldn't be better to have this under `default` case below? > Fixed in next release. > > + > > + /* Propagate change of current control to all related controls */ > > + if (ctrl->id == V4L2_CID_VBLANK) { > > + /* Update max exposure while meeting expected vblanking */ > > + max_expo = ov02a10->cur_mode->height + ctrl->val - > > + OV02A10_EXPOSURE_MAX_MARGIN; > > + __v4l2_ctrl_modify_range(ov02a10->exposure, > > + ov02a10->exposure->minimum, max_expo, > > + ov02a10->exposure->step, > > + ov02a10->exposure->default_value); > > + } > > + > > + /* V4L2 controls values will be applied only when power is already up */ > > + if (!pm_runtime_get_if_in_use(&client->dev)) > > + return 0; > > + > > + switch (ctrl->id) { > > + case V4L2_CID_EXPOSURE: > > + ret = ov02a10_set_exposure(ov02a10, ctrl->val); > > + break; > > + case V4L2_CID_ANALOGUE_GAIN: > > + ret = ov02a10_set_gain(ov02a10, ctrl->val); > > + break; > > + case V4L2_CID_VBLANK: > > + ret = ov02a10_set_vblank(ov02a10, ctrl->val); > > + break; > > + case V4L2_CID_TEST_PATTERN: > > + ret = ov02a10_set_test_pattern(ov02a10, ctrl->val); > > + break; > > + }; > > + > > + pm_runtime_put(&client->dev); > > + > > + return ret; > > +} > > > +{ > > + struct fwnode_handle *ep; > > + struct fwnode_handle *fwnode = dev_fwnode(dev); > > + struct v4l2_fwnode_endpoint bus_cfg = { > > + .bus_type = V4L2_MBUS_CSI2_DPHY > > + }; > > + unsigned int i, j; > > + int ret; > > + > > I would rather expect fwnode assignment here to understand immediately from > where it has been derived. Though it's up to maintainers. > This would be remained, as many other drivers keep the same style. > > + if (!fwnode) > > + return -ENXIO; > > + > > + ep = fwnode_graph_get_next_endpoint(fwnode, NULL); > > + if (!ep) > > + return -ENXIO; > > + > > + ret = v4l2_fwnode_endpoint_alloc_parse(ep, &bus_cfg); > > + fwnode_handle_put(ep); > > + if (ret) > > + return ret; > > + > > + /* Optional indication of mipi clock lane mode */ > > + if (bus_cfg.bus.mipi_csi2.flags & V4L2_MBUS_CSI2_NONCONTINUOUS_CLOCK) > > + ov02a10->mipi_clock_hs_mode_enable = true; > > + > > > + if (!bus_cfg.nr_of_link_frequencies) { > > + dev_err(dev, "no link frequencies defined"); > > + ret = -EINVAL; > > + goto check_hwcfg_error; > > + } > > This is redundant check. You have done the similar below when comparing j to > nr_of_link_frequencies. > bus_cfg.nr_of_link_frequencies should be checked first before using it. For instance, OV8856 uses the same check style. > > + > > + for (i = 0; i < ARRAY_SIZE(link_freq_menu_items); i++) { > > + for (j = 0; j < bus_cfg.nr_of_link_frequencies; j++) { > > + if (link_freq_menu_items[i] == > > + bus_cfg.link_frequencies[j]) > > + break; > > + } > > + > > + if (j == bus_cfg.nr_of_link_frequencies) { > > + dev_err(dev, "no link frequency %lld supported", > > + link_freq_menu_items[i]); > > + ret = -EINVAL; > > + goto check_hwcfg_error; > > + } > > + } > > + > > +check_hwcfg_error: > > + v4l2_fwnode_endpoint_free(&bus_cfg); > > + > > + return ret; > > +} > > > +static int ov02a10_probe(struct i2c_client *client) > > +{ > > > > + /* Optional indication of physical rotation of sensor */ > > + ret = fwnode_property_read_u32(dev_fwnode(dev), "rotation", > > + &rotation); > > It's perfectly one line. > Fixed in next release. > > + if (!ret) { > > I would rather do two things here: > 1/ use the similar pattern as below with messaging > if (!ret) { > ... > } else { > dev_dbg(...); > } > 2/ Actually use positive conditionals > if (ret) { > ... > } else { > ... > } > Fixed in next release. > > + switch (rotation) { > > + case 180: > > + ov02a10->upside_down = true; > > + ov02a10->fmt.code = MEDIA_BUS_FMT_SRGGB10_1X10; > > + break; > > + case 0: > > + break; > > + default: > > + dev_warn(dev, "%u degrees rotation is not supported, ignoring...\n", > > + rotation); > > + } > > + } > > + > > + /* Optional indication of HS VOD adjust */ > > + ret = fwnode_property_read_u32(dev_fwnode(dev), > > + "ovti,hs-vod-adjust", > > + &hs_vod_adjust_cnt); > > + if (!ret) > > + ov02a10->mipi_clock_hs_vod_adjust_cnt = hs_vod_adjust_cnt; > > + else > > + dev_warn(dev, "failed to get hs vod adjust, using default\n"); > > + > > + /* Optional indication of mipi tx speed */ > > + ret = fwnode_property_read_u32(dev_fwnode(dev), > > + "ovti,mipi-tx-speed", > > + &clock_lane_tx_speed); > > + > > + if (!ret) > > + ov02a10->mipi_clock_tx_speed = clock_lane_tx_speed; > > + else > > + dev_warn(dev, "failed to get mipi tx speed, using default\n"); > > > + /* Get system clock (eclk) */ > > + ov02a10->eclk = devm_clk_get(dev, "eclk"); > > + if (IS_ERR(ov02a10->eclk)) { > > + dev_err(dev, "failed to get eclk\n"); > > > + return -EINVAL; > > Why shadow error code? > Okay. Fixed in next release. > > + } > > > + ov02a10->pd_gpio = devm_gpiod_get(dev, "powerdown", GPIOD_OUT_HIGH); > > + if (IS_ERR(ov02a10->pd_gpio)) { > > + dev_err(dev, "failed to get powerdown-gpios\n"); > > > + return -EINVAL; > > Ditto. > Fixed in next release. > > + } > > > + ov02a10->n_rst_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); > > + if (IS_ERR(ov02a10->n_rst_gpio)) { > > + dev_err(dev, "failed to get reset-gpios\n"); > > > + return -EINVAL; > > Ditto. > Fixed in next release. > > + } > > > +} > _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek 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 X-Spam-Level: X-Spam-Status: No, score=-2.2 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS,UNPARSEABLE_RELAY,URIBL_BLOCKED,USER_AGENT_SANE_2 autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D8C13C43603 for ; Wed, 11 Dec 2019 08:33:03 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id A842620836 for ; Wed, 11 Dec 2019 08:33:03 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="r4A3X4WZ"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="HI5i9SIj" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A842620836 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Date:To:From:Subject:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=/7ipy4RHMeBTnuSfcBSPEkPCBhuwNs5NRohOTsChLrc=; b=r4A3X4WZJIIMAF cKG0EhOHlBRvO39egydkazT9l88G1haYCBj/cr5uJLLiCPOX+6cTYIOd6afBLNem9MuNqbpprD3hQ ptoTzJgZTJdNNLtIg9jNSRbppm/85k+rpz/0lul+o3p2509G02aYRkAkFc/PSUktPiDrEwM4rhdzD S9Aq1VsphE31J28i8bTQ4LGwx8oTRHvwN7uDlwVDH4aito7PYwAYG2qMYW0wNiybBrti9fDj6D9q7 ZBaZbxM63vDFkZsBYlt04OBWv68w2GnpAJUSUutSobl+BvpA1Bj+cj15mirzk+bou1OnjUrctJqRK G4O8NbUWQfCSGqEfR9oQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1iexQS-0000O1-Sf; Wed, 11 Dec 2019 08:32:52 +0000 Received: from mailgw01.mediatek.com ([216.200.240.184]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1iexQO-0000Mv-WA; Wed, 11 Dec 2019 08:32:50 +0000 X-UUID: 089c20e5fc5d42c080e9d58bcc877486-20191211 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=YeTQWafGgn0rALH8sk+SzzKiaMxlA8NFVXXzs8C0bs8=; b=HI5i9SIj9Rzh11JlrwAsQcRhLhOCbEjNEscrFfYyX2Mv530aYtuz2f2XeSpfEWKt6AWFo7FuNqkPI+2P4IJP1VDcivbVktG8KyFmWrvRf0d/aULqjv0egjvE9vDjPaAAjGZc+M6oh94UT+FeuSZol7bpmicjRLcgBVc+oelOTng=; X-UUID: 089c20e5fc5d42c080e9d58bcc877486-20191211 Received: from mtkcas67.mediatek.inc [(172.29.193.45)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLS) with ESMTP id 754507078; Wed, 11 Dec 2019 00:32:44 -0800 Received: from MTKMBS31N1.mediatek.inc (172.27.4.69) by MTKMBS62DR.mediatek.inc (172.29.94.18) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Wed, 11 Dec 2019 00:32:58 -0800 Received: from MTKCAS36.mediatek.inc (172.27.4.186) by MTKMBS31N1.mediatek.inc (172.27.4.69) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Wed, 11 Dec 2019 16:32:28 +0800 Received: from [10.17.3.153] (172.27.4.253) by MTKCAS36.mediatek.inc (172.27.4.170) with Microsoft SMTP Server id 15.0.1395.4 via Frontend Transport; Wed, 11 Dec 2019 16:32:48 +0800 Message-ID: <1576053159.15495.6.camel@mhfsdcap03> Subject: Re: [V5, 2/2] media: i2c: ov02a10: Add OV02A10 image sensor driver From: Dongchun Zhu To: Andy Shevchenko Date: Wed, 11 Dec 2019 16:32:39 +0800 In-Reply-To: <20191104122609.GI32742@smile.fi.intel.com> References: <20191104105713.24311-1-dongchun.zhu@mediatek.com> <20191104105713.24311-3-dongchun.zhu@mediatek.com> <20191104122609.GI32742@smile.fi.intel.com> X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-TM-SNTS-SMTP: 3D6876AAE8218129BD3B244B65C93E1919CC423CA42655E27ED3A8CFAC4869B52000:8 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20191211_003249_047889_71B546BE X-CRM114-Status: GOOD ( 21.10 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mark.rutland@arm.com, devicetree@vger.kernel.org, drinkcat@chromium.org, srv_heupstream@mediatek.com, shengnan.wang@mediatek.com, tfiga@chromium.org, louis.kuo@mediatek.com, sj.huang@mediatek.com, robh+dt@kernel.org, linux-mediatek@lists.infradead.org, sakari.ailus@linux.intel.com, matthias.bgg@gmail.com, bingbu.cao@intel.com, mchehab@kernel.org, linux-arm-kernel@lists.infradead.org, linux-media@vger.kernel.org Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org Hi Andy, On Mon, 2019-11-04 at 14:26 +0200, Andy Shevchenko wrote: > On Mon, Nov 04, 2019 at 06:57:13PM +0800, Dongchun Zhu wrote: > > Add a V4L2 sub-device driver for OV02A10 image sensor. > > The OV02A10 is a 1/5" CMOS sensor from Omnivision, supporting > > output format: 10-bit RAW. > > > > This chip has a single MIPI lane interface and use the I2C bus > > for control and the CSI-2 bus for data. > > > +/* Bit[7] clock HS mode enable > > + * 0: Clock continue > > + * 1: Clock HS > > + * Bit[6:2] HS VOD adjust > > + * Bit[1:0] P VHI adjust > > + */ > > +#define REG_HS_MODE_BLC 0x9d > > + > > +#define CLOCK_HS_MODE_ENABLE BIT(7) > > > +#define CLOCK_HS_VOD_ADJUST (BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2)) > > GENMASK() Fixed in next release. > > > +#define OV02A10_MASK_8_BITS 0xff > > GENMASK() Fixed in next release. > > > +#define OV02A10_LINK_FREQ_390MHZ 390000000ULL > > Can't we publish HZ_PER_MHZ for wider use (currently in phy-stm32-usbphyc.c and > hid-sensor-attributes.c) and use here something like (390 * HZ_PER_MHZ)? > > > +#define OV02A10_ECLK_FREQ 24000000 > > Ditto. Fixed in next release. > > > +static const s64 link_freq_menu_items[] = { > > > + OV02A10_LINK_FREQ_390MHZ > > Better to keep comma here. Fixed in next release. > > > +}; > > > +{ > > + struct i2c_client *client = v4l2_get_subdevdata(&ov02a10->subdev); > > + int ret; > > + > > + ret = i2c_smbus_read_byte_data(client, reg); > > + if (ret >= 0) { > > + *val = (unsigned char)ret; > > + ret = 0; > > + } > > Why not to use classical pattern > > if (ret < 0) > return ret; > ... > return 0; > > ? > Many thanks for reminder. Fixed in next release. > > + > > + return ret; > > +} > > > +static int ov02a10_mod_reg(struct ov02a10 *ov02a10, u8 reg, u8 mask, u8 val) > > +{ > > + struct i2c_client *client = v4l2_get_subdevdata(&ov02a10->subdev); > > + u8 readval; > > + int ret; > > + > > + ret = ov02a10_read_smbus(ov02a10, reg, &readval); > > + if (ret) > > + return ret; > > + > > > + readval &= ~mask; > > + val &= mask; > > + val |= readval; > > Why not to use classical pattern > val = (readval & ~mask) | (val & mask); > ? > Thanks for reminder. Fixed in next release. > > + > > + return i2c_smbus_write_byte_data(client, reg, val); > > +} > > > +{ > > + struct i2c_client *client = v4l2_get_subdevdata(&ov02a10->subdev); > > + u16 id; > > > + u8 pid = 0; > > + u8 ver = 0; > > Useless assignments. > Fixed in next release. > > + int ret; > > + > > + /* Check sensor revision */ > > + ret = ov02a10_read_smbus(ov02a10, OV02A10_REG_CHIP_ID_H, &pid); > > + if (ret) > > + return ret; > > + > > + ret = ov02a10_read_smbus(ov02a10, OV02A10_REG_CHIP_ID_L, &ver); > > + if (ret) > > + return ret; > > + > > + id = OV02A10_ID(pid, ver); > > + if (id != CHIP_ID) { > > + dev_err(&client->dev, "Unexpected sensor id(%04x)\n", id); > > + return -EINVAL; > > + } > > + > > + dev_dbg(&client->dev, "Detected OV%04X sensor\n", id); > > + > > + return 0; > > +} > > > + int ret = 0; > > Useless assignment... > Fixed in next release. > > + > > + dev_dbg(&client->dev, "ov02a10 s_stream (%d)\n", on); > > + mutex_lock(&ov02a10->mutex); > > + > > + if (ov02a10->streaming == on) > > + goto unlock_and_return; > > + > > + if (on) { > > + ret = pm_runtime_get_sync(&client->dev); > > + if (ret < 0) { > > + pm_runtime_put_noidle(&client->dev); > > + goto unlock_and_return; > > + } > > + > > + ret = __ov02a10_start_stream(ov02a10); > > + if (ret) { > > + __ov02a10_stop_stream(ov02a10); > > + ov02a10->streaming = !on; > > + goto err_rpm_put; > > + } > > + } else { > > + __ov02a10_stop_stream(ov02a10); > > + pm_runtime_put(&client->dev); > > + } > > + > > + ov02a10->streaming = on; > > + mutex_unlock(&ov02a10->mutex); > > + > > > + return ret; > > ...simple use > return 0; > here. > Fixed in next release. > > + > > +err_rpm_put: > > + pm_runtime_put(&client->dev); > > +unlock_and_return: > > + mutex_unlock(&ov02a10->mutex); > > + > > + return ret; > > +} > > > +static int ov02a10_set_ctrl(struct v4l2_ctrl *ctrl) > > +{ > > + struct ov02a10 *ov02a10 = container_of(ctrl->handler, > > + struct ov02a10, ctrl_handler); > > + struct i2c_client *client = v4l2_get_subdevdata(&ov02a10->subdev); > > + s64 max_expo; > > > + int ret = 0; > > Wouldn't be better to have this under `default` case below? > Fixed in next release. > > + > > + /* Propagate change of current control to all related controls */ > > + if (ctrl->id == V4L2_CID_VBLANK) { > > + /* Update max exposure while meeting expected vblanking */ > > + max_expo = ov02a10->cur_mode->height + ctrl->val - > > + OV02A10_EXPOSURE_MAX_MARGIN; > > + __v4l2_ctrl_modify_range(ov02a10->exposure, > > + ov02a10->exposure->minimum, max_expo, > > + ov02a10->exposure->step, > > + ov02a10->exposure->default_value); > > + } > > + > > + /* V4L2 controls values will be applied only when power is already up */ > > + if (!pm_runtime_get_if_in_use(&client->dev)) > > + return 0; > > + > > + switch (ctrl->id) { > > + case V4L2_CID_EXPOSURE: > > + ret = ov02a10_set_exposure(ov02a10, ctrl->val); > > + break; > > + case V4L2_CID_ANALOGUE_GAIN: > > + ret = ov02a10_set_gain(ov02a10, ctrl->val); > > + break; > > + case V4L2_CID_VBLANK: > > + ret = ov02a10_set_vblank(ov02a10, ctrl->val); > > + break; > > + case V4L2_CID_TEST_PATTERN: > > + ret = ov02a10_set_test_pattern(ov02a10, ctrl->val); > > + break; > > + }; > > + > > + pm_runtime_put(&client->dev); > > + > > + return ret; > > +} > > > +{ > > + struct fwnode_handle *ep; > > + struct fwnode_handle *fwnode = dev_fwnode(dev); > > + struct v4l2_fwnode_endpoint bus_cfg = { > > + .bus_type = V4L2_MBUS_CSI2_DPHY > > + }; > > + unsigned int i, j; > > + int ret; > > + > > I would rather expect fwnode assignment here to understand immediately from > where it has been derived. Though it's up to maintainers. > This would be remained, as many other drivers keep the same style. > > + if (!fwnode) > > + return -ENXIO; > > + > > + ep = fwnode_graph_get_next_endpoint(fwnode, NULL); > > + if (!ep) > > + return -ENXIO; > > + > > + ret = v4l2_fwnode_endpoint_alloc_parse(ep, &bus_cfg); > > + fwnode_handle_put(ep); > > + if (ret) > > + return ret; > > + > > + /* Optional indication of mipi clock lane mode */ > > + if (bus_cfg.bus.mipi_csi2.flags & V4L2_MBUS_CSI2_NONCONTINUOUS_CLOCK) > > + ov02a10->mipi_clock_hs_mode_enable = true; > > + > > > + if (!bus_cfg.nr_of_link_frequencies) { > > + dev_err(dev, "no link frequencies defined"); > > + ret = -EINVAL; > > + goto check_hwcfg_error; > > + } > > This is redundant check. You have done the similar below when comparing j to > nr_of_link_frequencies. > bus_cfg.nr_of_link_frequencies should be checked first before using it. For instance, OV8856 uses the same check style. > > + > > + for (i = 0; i < ARRAY_SIZE(link_freq_menu_items); i++) { > > + for (j = 0; j < bus_cfg.nr_of_link_frequencies; j++) { > > + if (link_freq_menu_items[i] == > > + bus_cfg.link_frequencies[j]) > > + break; > > + } > > + > > + if (j == bus_cfg.nr_of_link_frequencies) { > > + dev_err(dev, "no link frequency %lld supported", > > + link_freq_menu_items[i]); > > + ret = -EINVAL; > > + goto check_hwcfg_error; > > + } > > + } > > + > > +check_hwcfg_error: > > + v4l2_fwnode_endpoint_free(&bus_cfg); > > + > > + return ret; > > +} > > > +static int ov02a10_probe(struct i2c_client *client) > > +{ > > > > + /* Optional indication of physical rotation of sensor */ > > + ret = fwnode_property_read_u32(dev_fwnode(dev), "rotation", > > + &rotation); > > It's perfectly one line. > Fixed in next release. > > + if (!ret) { > > I would rather do two things here: > 1/ use the similar pattern as below with messaging > if (!ret) { > ... > } else { > dev_dbg(...); > } > 2/ Actually use positive conditionals > if (ret) { > ... > } else { > ... > } > Fixed in next release. > > + switch (rotation) { > > + case 180: > > + ov02a10->upside_down = true; > > + ov02a10->fmt.code = MEDIA_BUS_FMT_SRGGB10_1X10; > > + break; > > + case 0: > > + break; > > + default: > > + dev_warn(dev, "%u degrees rotation is not supported, ignoring...\n", > > + rotation); > > + } > > + } > > + > > + /* Optional indication of HS VOD adjust */ > > + ret = fwnode_property_read_u32(dev_fwnode(dev), > > + "ovti,hs-vod-adjust", > > + &hs_vod_adjust_cnt); > > + if (!ret) > > + ov02a10->mipi_clock_hs_vod_adjust_cnt = hs_vod_adjust_cnt; > > + else > > + dev_warn(dev, "failed to get hs vod adjust, using default\n"); > > + > > + /* Optional indication of mipi tx speed */ > > + ret = fwnode_property_read_u32(dev_fwnode(dev), > > + "ovti,mipi-tx-speed", > > + &clock_lane_tx_speed); > > + > > + if (!ret) > > + ov02a10->mipi_clock_tx_speed = clock_lane_tx_speed; > > + else > > + dev_warn(dev, "failed to get mipi tx speed, using default\n"); > > > + /* Get system clock (eclk) */ > > + ov02a10->eclk = devm_clk_get(dev, "eclk"); > > + if (IS_ERR(ov02a10->eclk)) { > > + dev_err(dev, "failed to get eclk\n"); > > > + return -EINVAL; > > Why shadow error code? > Okay. Fixed in next release. > > + } > > > + ov02a10->pd_gpio = devm_gpiod_get(dev, "powerdown", GPIOD_OUT_HIGH); > > + if (IS_ERR(ov02a10->pd_gpio)) { > > + dev_err(dev, "failed to get powerdown-gpios\n"); > > > + return -EINVAL; > > Ditto. > Fixed in next release. > > + } > > > + ov02a10->n_rst_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); > > + if (IS_ERR(ov02a10->n_rst_gpio)) { > > + dev_err(dev, "failed to get reset-gpios\n"); > > > + return -EINVAL; > > Ditto. > Fixed in next release. > > + } > > > +} > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel