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=-0.9 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_PASS autolearn=ham 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 D8663ECDE5F for ; Thu, 19 Jul 2018 19:46:05 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 78B49206B7 for ; Thu, 19 Jul 2018 19:46:05 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=impinj.com header.i=@impinj.com header.b="ayaa5o4L" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 78B49206B7 Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=impinj.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730021AbeGSUak (ORCPT ); Thu, 19 Jul 2018 16:30:40 -0400 Received: from mail-by2nam01on0129.outbound.protection.outlook.com ([104.47.34.129]:45030 "EHLO NAM01-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727492AbeGSUaj (ORCPT ); Thu, 19 Jul 2018 16:30:39 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=impinj.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=OEaIIS5Ivp4/3v8nVtmgJBgLKc3jJF7s92w6CqGWpA4=; b=ayaa5o4LEs0gdBlPuLgO14TRjcx79RzAskCzhq1g8ly035866aKXtU/1GLt5JafR8z6BffAK7Sgptt0y+KZf+4XouNme8QSMgvVnY0J2jowRIWLtEl2c42OJAwwQ1WGK7ZBbMP2EtupWfTBzpGHyAFQ9gbTYp6EzNA3+l+YaUpQ= Received: from CY4PR0601MB3697.namprd06.prod.outlook.com (52.132.101.36) by CY4PR0601MB3713.namprd06.prod.outlook.com (52.132.101.138) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.973.16; Thu, 19 Jul 2018 19:45:43 +0000 Received: from CY4PR0601MB3697.namprd06.prod.outlook.com ([fe80::b436:7c9e:779e:6289]) by CY4PR0601MB3697.namprd06.prod.outlook.com ([fe80::b436:7c9e:779e:6289%4]) with mapi id 15.20.0952.021; Thu, 19 Jul 2018 19:45:43 +0000 From: Trent Piepho To: "robh+dt@kernel.org" , "devicetree@vger.kernel.org" , "hayashibara.keiji@socionext.com" , "broonie@kernel.org" , "mark.rutland@arm.com" , "linux-spi@vger.kernel.org" , "yamada.masahiro@socionext.com" , "linux-arm-kernel@lists.infradead.org" CC: "linux-kernel@vger.kernel.org" , "masami.hiramatsu@linaro.org" , "jaswinder.singh@linaro.org" , "hayashi.kunihiko@socionext.com" Subject: Re: [PATCH 2/2] spi: add SPI controller driver for UniPhier SoC Thread-Topic: [PATCH 2/2] spi: add SPI controller driver for UniPhier SoC Thread-Index: AQHUHy08NRz2JFv0PES+aYnH5dMTwqSW88wA Date: Thu, 19 Jul 2018 19:45:43 +0000 Message-ID: <1532029542.2283.157.camel@impinj.com> References: <1531983117-9443-1-git-send-email-hayashibara.keiji@socionext.com> <1531983117-9443-3-git-send-email-hayashibara.keiji@socionext.com> In-Reply-To: <1531983117-9443-3-git-send-email-hayashibara.keiji@socionext.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=tpiepho@impinj.com; x-originating-ip: [216.207.205.253] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1;CY4PR0601MB3713;6:XiH3ILKRfP6vf1L5zMZzpsnySb+4lM7KnHl0BTDrXu0kX7ilKLr1tK6BZaEPOHhsT1C8rOzvtfEGrxJ/Dygwq1KCTcxARJLOX6tqR8r3HCnacF7IIBo/eMtuWhqhYKsASs18MWHUXNwaWJHocAkQLw3dEA3VrjyVkgKjLLPy78Nb55Mdl8j6dld1gAnGduABetk3MX+IYTiaF9DQfA3GgXkPQp/n6dT/Pg777bhvKqzeerc53+Sal3BTFBCrVYP4kdGMwwAz1PciKJn/q7ABUSSyjcK9/+5yRVpKCVyex5+/UMdBY3J1bDritai53ziV7ek3acF5rE6KDWuN3klw9S0cTvoQ7ZiAXruZwPp4I1mnNgY2D11kLsTe74Z8o9DMvj2QFJ99Y9+hVYS8DROezsKXhjSy6nPz5ZacFZkNyqZ6mNB/SDMXLcg6HTzUeQxePACIXcM0K7h18xo0QERVMg==;5:z77gGcLZeKUnUItQ/PYCx2exV2skj+1P8yLmwSkix3W/Fywgwlr5k+ZB8FHG2eUhl5Q8dBVtZzJEyg0sw4qA+S5Cm6QDFvV0t/YBHoXm/yu8ppeS/Wop7qIMw8CRozwqJsMjyDmcjgcKT6oc8e/7Q/fliWPAamOHWvyfr/5xdGo=;7:XiKP4zphEQTFTEBLvAsQ0ZMcqfKgl/F20HycYB663onz9Thg205+3zb9kqWM5UJ8OAy/dLUApgc6EDTGTe/2/SlA5R+t8cKja6EwaMn3gXiophk8XV+sgHbpNH+ZA4iixIqeWPzT/QuTb6AJqDxRpmmfzdP92Ya2AZwnb05lvIXI8iGPltJGFYEJ590q1Rfw8onm2LbM3OTpAKDFvEDbIrZIu+aypMcNJ3eolTzL4XFiVMLhhuBkRZq8mrva9Ip9 x-ms-exchange-antispam-srfa-diagnostics: SOS; x-ms-office365-filtering-correlation-id: 29cccb32-3520-450c-bf4f-08d5edb036eb x-microsoft-antispam: BCL:0;PCL:0;RULEID:(7020095)(4652040)(8989117)(5600067)(711020)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(2017052603328)(7153060)(7193020);SRVR:CY4PR0601MB3713; x-ms-traffictypediagnostic: CY4PR0601MB3713: x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:; x-ms-exchange-senderadcheck: 1 x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(3002001)(93006095)(93001095)(3231311)(944501410)(52105095)(10201501046)(149027)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123564045)(20161123560045)(20161123562045)(20161123558120)(6072148)(201708071742011)(7699016);SRVR:CY4PR0601MB3713;BCL:0;PCL:0;RULEID:;SRVR:CY4PR0601MB3713; x-forefront-prvs: 0738AF4208 x-forefront-antispam-report: SFV:NSPM;SFS:(10019020)(346002)(136003)(39850400004)(396003)(376002)(366004)(189003)(199004)(316002)(14454004)(110136005)(99286004)(5250100002)(54906003)(2501003)(478600001)(106356001)(105586002)(36756003)(7416002)(2906002)(5660300001)(68736007)(26005)(2900100001)(102836004)(6506007)(11346002)(86362001)(8936002)(81156014)(3846002)(81166006)(8676002)(2201001)(76176011)(97736004)(6486002)(53936002)(6116002)(476003)(446003)(7736002)(486006)(305945005)(256004)(229853002)(103116003)(6436002)(4326008)(6246003)(25786009)(6512007)(66066001)(186003)(2616005);DIR:OUT;SFP:1102;SCL:1;SRVR:CY4PR0601MB3713;H:CY4PR0601MB3697.namprd06.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;MX:1;A:1; received-spf: None (protection.outlook.com: impinj.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: dbPqydEv3tZFqnupFnSb7jv+bUOoQnRDddT85Q7IOJ23DhTFxw3LXt1H/z0gj54TGOrHpDdrg3zYknHSOTEEbwhcAKngkc7Y6+fTmvAFL2ge8dYBPil3U1kwGY8wkoIhlYcUb2B9JPqJa491/jf4R+7WPWM76krrnav6w2nalS5le/leq0nKwYLv5P9EczMWP3+clD0HiZRoeYDf9+90wQp+wgywQA0rXxzxzCb7SCJnVm8a4KaaePQtlzX40thknTV4pMwtl1/RxUork3M/CAsXfX5DThq/XpuAOmWzBsIHx9hkU43T9MPJODqYcQl8M20V+13AnBzXJZAjVoOAPZQ1E7VH8qMMMR4ZWyF4VAw= spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="utf-8" Content-ID: <6FCCB6CBC67CC84FAF8320B6962F4146@namprd06.prod.outlook.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: impinj.com X-MS-Exchange-CrossTenant-Network-Message-Id: 29cccb32-3520-450c-bf4f-08d5edb036eb X-MS-Exchange-CrossTenant-originalarrivaltime: 19 Jul 2018 19:45:43.3219 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 6de70f0f-7357-4529-a415-d8cbb7e93e5e X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR0601MB3713 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org T24gVGh1LCAyMDE4LTA3LTE5IGF0IDE1OjUxICswOTAwLCBLZWlqaSBIYXlhc2hpYmFyYSB3cm90 ZToNCj4gDQo+ICtjb25maWcgU1BJX1VOSVBISUVSDQo+ICsJdHJpc3RhdGUgIlNvY2lvbmV4dCBV bmlQaGllciBTUEkgQ29udHJvbGxlciINCj4gKwlkZXBlbmRzIG9uIChBUkNIX1VOSVBISUVSIHx8 IENPTVBJTEVfVEVTVCkgJiYgT0YNCj4gKwloZWxwDQo+ICsJICBUaGlzIGRyaXZlciBzdXBwb3J0 cyB0aGUgU1BJIGNvbnRyb2xsZXIgb24gU29jaW9uZXh0DQo+ICsJICBVbmlQaGllciBTb0NzLg0K DQpQZXJoYXBzIGFkZCB0aGUgYml0IHRoYXQgdGhpcyBpcyBmb3IgdGhlIFNDU1NJIGFuZCBub3Qg TUNTU0kgaGVyZT8NCg0KPiANCj4gKw0KPiArI2RlZmluZSBCWVRFU19QRVJfV09SRCh4KQkJCVwN Cj4gKyh7CQkJCQkJXA0KPiArCWludCBfX3g7CQkJCVwNCj4gKwlfX3ggPSAoeCA8PSA4KSAgPyAx IDoJCQlcDQo+ICsJICAgICAgKHggPD0gMTYpID8gMiA6IDQ7CQlcDQo+ICsJX194OwkJCQkJXA0K PiArfSkNCg0KT3I6DQoNCnN0YXRpYyBpbmxpbmUgYnl0ZXNfcGVyX3dvcmQodW5zaWduZWQgaW50 IGJpdHMpIHsNCiAgIHJldHVybiBiaXRzIDw9IDggPyAxIDogKGJpdHMgPD0gMTYgPyAyIDogNCk7 DQp9DQoNCg0KDQo+ICsNCj4gK3N0YXRpYyBpbmxpbmUgdm9pZCB1bmlwaGllcl9zcGlfaXJxX2Vu YWJsZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1MzIgbWFzaykNCj4gK3sNCj4gKwlzdHJ1Y3Qg dW5pcGhpZXJfc3BpX3ByaXYgKnByaXYgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFz dGVyKTsNCj4gKwl1MzIgdmFsOw0KPiArDQo+ICsJdmFsID0gcmVhZGwocHJpdi0+YmFzZSArIFNT SV9JRSk7DQo+ICsJdmFsIHw9IG1hc2s7DQo+ICsJd3JpdGVsKHZhbCwgcHJpdi0+YmFzZSArIFNT SV9JRSk7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBpbmxpbmUgdm9pZCB1bmlwaGllcl9zcGlfaXJx X2Rpc2FibGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTMyIG1hc2spDQo+ICt7DQo+ICsJc3Ry dWN0IHVuaXBoaWVyX3NwaV9wcml2ICpwcml2ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGkt Pm1hc3Rlcik7DQo+ICsJdTMyIHZhbDsNCj4gKw0KPiArCXZhbCA9IHJlYWRsKHByaXYtPmJhc2Ug KyBTU0lfSUUpOw0KPiArCXZhbCAmPSB+bWFzazsNCj4gKwl3cml0ZWwodmFsLCBwcml2LT5iYXNl ICsgU1NJX0lFKTsNCj4gK30NCj4gKw0KPiArc3RhdGljIHZvaWQgdW5pcGhpZXJfc3BpX3NldF90 cmFuc2Zlcl9zaXplKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBzaXplKQ0KPiArew0KPiAr CXN0cnVjdCB1bmlwaGllcl9zcGlfcHJpdiAqcHJpdiA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEo c3BpLT5tYXN0ZXIpOw0KPiArCXUzMiB2YWw7DQo+ICsNCj4gKwl2YWwgPSByZWFkbChwcml2LT5i YXNlICsgU1NJX1RYV0RTKTsNCj4gKwl2YWwgJj0gfihTU0lfVFhXRFNfV0RMRU5fTUFTSyB8IFNT SV9UWFdEU19EVExFTl9NQVNLKTsNCj4gKwl2YWwgfD0gRklFTERfUFJFUChTU0lfVFhXRFNfV0RM RU5fTUFTSywgc2l6ZSk7DQo+ICsJdmFsIHw9IEZJRUxEX1BSRVAoU1NJX1RYV0RTX0RUTEVOX01B U0ssIHNpemUpOw0KPiArCXdyaXRlbCh2YWwsIHByaXYtPmJhc2UgKyBTU0lfVFhXRFMpOw0KPiAr DQo+ICsJdmFsID0gcmVhZGwocHJpdi0+YmFzZSArIFNTSV9SWFdEUyk7DQo+ICsJdmFsICY9IH5T U0lfUlhXRFNfRFRMRU5fTUFTSzsNCj4gKwl2YWwgfD0gRklFTERfUFJFUChTU0lfUlhXRFNfRFRM RU5fTUFTSywgc2l6ZSk7DQo+ICsJd3JpdGVsKHZhbCwgcHJpdi0+YmFzZSArIFNTSV9SWFdEUyk7 DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBpbnQgdW5pcGhpZXJfc3BpX3NldF9iYXVkcmF0ZShzdHJ1 Y3Qgc3BpX2RldmljZSAqc3BpLCB1bnNpZ25lZCBpbnQgc3BlZWQpDQo+ICt7DQo+ICsJc3RydWN0 IHVuaXBoaWVyX3NwaV9wcml2ICpwcml2ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1h c3Rlcik7DQo+ICsJdTMyIHZhbCwgY2tyYXQ7DQo+ICsNCj4gKwkvKg0KPiArCSAqIHRoZSBzdXBw b3J0ZWQgcmF0ZXMgYXJlIGV2ZW4gbnVtYmVycyBmcm9tIDQgdG8gMjU0LiAoNCw2LDguLi4yNTQp DQo+ICsJICogcm91bmQgdXAgYXMgd2UgbG9vayBmb3IgZXF1YWwgb3IgbGVzcyBzcGVlZA0KPiAr CSAqLw0KPiArCWNrcmF0ID0gRElWX1JPVU5EX1VQKGNsa19nZXRfcmF0ZShwcml2LT5jbGspLCBz cGVlZCk7DQo+ICsJY2tyYXQgPSByb3VuZHVwKGNrcmF0LCAyKTsNCj4gKw0KPiArCS8qIGNoZWNr IGlmIHJlcXVlc3RlZCBzcGVlZCBpcyB0b28gc21hbGwgKi8NCj4gKwlpZiAoY2tyYXQgPiBTU0lf TUFYX0NMS19ESVZJREVSKQ0KPiArCQlyZXR1cm4gLUVJTlZBTDsNCj4gKw0KPiArCWlmIChja3Jh dCA8IFNTSV9NSU5fQ0xLX0RJVklERVIpDQo+ICsJCWNrcmF0ID0gU1NJX01JTl9DTEtfRElWSURF UjsNCj4gKw0KPiArCXZhbCA9IHJlYWRsKHByaXYtPmJhc2UgKyBTU0lfQ0tTKTsNCj4gKwl2YWwg Jj0gflNTSV9DS1NfQ0tSQVRfTUFTSzsNCj4gKwl2YWwgfD0gY2tyYXQgJiBTU0lfQ0tTX0NLUkFU X01BU0s7DQo+ICsJd3JpdGVsKHZhbCwgcHJpdi0+YmFzZSArIFNTSV9DS1MpOw0KPiArDQo+ICsJ cmV0dXJuIDA7DQo+ICt9DQo+ICsNCj4gK3N0YXRpYyBpbnQgdW5pcGhpZXJfc3BpX3NldHVwX3Ry YW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksDQo+ICsJCQkJICAgICAgIHN0cnVjdCBzcGlf dHJhbnNmZXIgKnQpDQo+ICt7DQo+ICsJc3RydWN0IHVuaXBoaWVyX3NwaV9wcml2ICpwcml2ID0g c3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7DQo+ICsJdTMyIHZhbDsNCj4gKwlp bnQgcmV0Ow0KPiArDQo+ICsJcHJpdi0+ZXJyb3IgPSAwOw0KPiArCXByaXYtPnR4X2J1ZiA9IHQt PnR4X2J1ZjsNCj4gKwlwcml2LT5yeF9idWYgPSB0LT5yeF9idWY7DQo+ICsJcHJpdi0+dHhfYnl0 ZXMgPSBwcml2LT5yeF9ieXRlcyA9IHQtPmxlbjsNCj4gKw0KPiArCWlmIChwcml2LT5iaXRzX3Bl cl93b3JkICE9IHQtPmJpdHNfcGVyX3dvcmQpIHsNCj4gKwkJdW5pcGhpZXJfc3BpX3NldF90cmFu c2Zlcl9zaXplKHNwaSwgdC0+Yml0c19wZXJfd29yZCk7DQo+ICsJCXByaXYtPmJpdHNfcGVyX3dv cmQgPSB0LT5iaXRzX3Blcl93b3JkOw0KPiArCX0NCj4gKw0KPiArCWlmIChwcml2LT5zcGVlZF9o eiAhPSB0LT5zcGVlZF9oeikgew0KPiArCQlyZXQgPSB1bmlwaGllcl9zcGlfc2V0X2JhdWRyYXRl KHNwaSwgdC0+c3BlZWRfaHopOw0KPiArCQlpZiAocmV0KQ0KPiArCQkJcmV0dXJuIHJldDsNCj4g KwkJcHJpdi0+c3BlZWRfaHogPSB0LT5zcGVlZF9oejsNCj4gKwl9DQo+ICsNCj4gKwkvKiByZXNl dCBGSUZPcyAqLw0KPiArCXZhbCA9IFNTSV9GQ19UWEZGTCB8IFNTSV9GQ19SWEZGTDsNCj4gKwl3 cml0ZWwodmFsLCBwcml2LT5iYXNlICsgU1NJX0ZDKTsNCj4gKw0KPiArCXJldHVybiAwOw0KPiAr fQ0KPiArDQo+ICtzdGF0aWMgdm9pZCB1bmlwaGllcl9zcGlfc2VuZChzdHJ1Y3QgdW5pcGhpZXJf c3BpX3ByaXYgKnByaXYpDQo+ICt7DQo+ICsJaW50IGksIGxvb3A7DQo+ICsJdTMyIHZhbCA9IDA7 DQo+ICsNCj4gKwlsb29wID0gQllURVNfUEVSX1dPUkQocHJpdi0+Yml0c19wZXJfd29yZCk7DQo+ ICsJaWYgKHByaXYtPnR4X2J5dGVzIDwgbG9vcCkNCj4gKwkJbG9vcCA9IHByaXYtPnR4X2J5dGVz Ow0KPiArDQo+ICsJcHJpdi0+dHhfYnl0ZXMgLT0gbG9vcDsNCj4gKw0KPiArCWlmIChwcml2LT50 eF9idWYpDQo+ICsJCWZvciAoaSA9IDA7IGkgPCBsb29wOyBpKyspIHsNCj4gKwkJCXZhbCB8PSAo Kihjb25zdCB1OCAqKXByaXYtPnR4X2J1ZikNCj4gKwkJCQkJCTw8IChCSVRTX1BFUl9CWVRFICog aSk7DQoNCnByaXYtPnR4X2J1ZiBpcyBhbHJlYWR5IGEgY29uc3QgdTgqLCBubyBuZWVkIHRvIGNh c3QgaXQuICBBbHNvIGluIHJlY3YsDQpubyBuZWVkIHRvIGNhc3QgdGhlIHBvaW50ZXIuICBJdCds bCBqdXN0IGhpZGUgZXJyb3JzIGlmIHNvbWVvbmUgY2hhbmdlcw0KdGhlIHR5cGUgb2YgdGhlIGZp ZWxkLg0KDQo+ICsJCQkoY29uc3QgdTggKilwcml2LT50eF9idWYrKzsNCj4gKwkJfQ0KPiArDQo+ ICsJd3JpdGVsKHZhbCwgcHJpdi0+YmFzZSArIFNTSV9UWERSKTsNCj4gK30NCg0KVGhlIGxvb3Ag dG8gcmVhZCB0aGUgZGF0YSB3aWxsIGxpa2VseSBiZSBzb21ld2hhdCBzbG93LiAgSXQgbWlnaHQg YmUNCmZhc3RlciB0byB1c2U6DQoNCiAgICB2YWwgPSBnZXRfdW5hbGlnbmVkX2xlMzIocHJpdi0+ dHhfYnVmKTsNCg0KVG8gc3VwcG9ydCBkaWZmZXJlbnQgc2l6ZXMgYSBzd2l0Y2ggY2FuIGJlIHVz ZWQ6DQoNCiAgICBzd2l0Y2ggKE1JTihCWVRFU19QRVJfV09SRChwcml2LT5iaXRzX3Blcl93b3Jk KSwgcHJpdi0+dHhfYnl0ZXMpKSB7DQogICAgY2FzZSAxOg0KICAgICAgICAgdmFsID0gKnByaXYt PnR4X2J1ZjsgYnJlYWs7DQogICAgY2FzZSAyOg0KICAgICAgICAgdmFsID0gZ2V0X3VuYWxpZ25l ZF9sZTE2KHByaXYtPnR4X2J1Zik7IGJyZWFrOw0KICAgIGNhc2UgNDoNCiAgICAgICAgIHZhbCA9 IGdldF91bmFsaWduZWRfbGUzMihwcml2LT50eF9idWYpOyBicmVhazsNCiAgICB9DQoNCkhvd2V2 ZXIsIEkgZG9uJ3QgdGhpbmsgZWl0aGVyIHRoZSBleGlzdGluZyBjb2RlIG9yIHRoaXMgY29kZSBp cw0KY29ycmVjdGx5IGhhbmRsaW5nIHdvcmQgc2l6ZXMgdGhhdCBhcmUgbm90IGFuIGV2ZW4gbnVt YmVyIG9mIGJ5dGVzLiAgSQ0KdGhpbmsgaXQgbmVlZHMgdG8gbGVmdCBzaGlmdCB0aGUgZGF0YSwg YnV0IG9mIGNvdXJzZSBpdCBhbHNvIGRlcGVuZHMgb24NCndoYXQgdGhlIHVuaXBoaWVyIGhhcmR3 YXJlIGV4cGVjdGVkIGluIHRoZSBUWERSIHJlZ2lzdGVyLg0KDQoNCj4gK3N0YXRpYyB2b2lkIHVu aXBoaWVyX3NwaV9yZWN2KHN0cnVjdCB1bmlwaGllcl9zcGlfcHJpdiAqcHJpdikNCj4gK3sNCj4g KwlpbnQgaSwgbG9vcDsNCj4gKwl1MzIgdmFsOw0KPiArDQo+ICsJbG9vcCA9IEJZVEVTX1BFUl9X T1JEKHByaXYtPmJpdHNfcGVyX3dvcmQpOw0KPiArCWlmIChwcml2LT5yeF9ieXRlcyA8IGxvb3Ap DQo+ICsJCWxvb3AgPSBwcml2LT5yeF9ieXRlczsNCj4gKw0KPiArCXByaXYtPnJ4X2J5dGVzIC09 IGxvb3A7DQo+ICsNCj4gKwl2YWwgPSByZWFkbChwcml2LT5iYXNlICsgU1NJX1JYRFIpOw0KPiAr DQo+ICsJaWYgKHByaXYtPnJ4X2J1ZikNCj4gKwkJZm9yIChpID0gMDsgaSA8IGxvb3A7IGkrKykg ew0KPiArCQkJdmFsID0gdmFsID4+IChCSVRTX1BFUl9CWVRFICogaSk7DQo+ICsJCQkqKHU4ICop cHJpdi0+cnhfYnVmID0gdmFsICYgR0VOTUFTSyg3LCAwKTsNCj4gKwkJCSh1OCAqKXByaXYtPnJ4 X2J1ZisrOw0KPiArCQl9DQoNCg0KDQo+ICt9K3N0YXRpYyB2b2lkIHVuaXBoaWVyX3NwaV9maWxs X3R4X2ZpZm8oc3RydWN0IHVuaXBoaWVyX3NwaV9wcml2ICpwcml2KQ0KPiArew0KPiArCXVuc2ln bmVkIGludCB0eF9jb3VudDsNCj4gKwlpbnQgYnl0ZXNfcGVyX3dvcmQgPSBCWVRFU19QRVJfV09S RChwcml2LT5iaXRzX3Blcl93b3JkKTsNCj4gKwl1MzIgdmFsOw0KPiArDQo+ICsJdHhfY291bnQg PSBwcml2LT50eF9ieXRlcyAvIGJ5dGVzX3Blcl93b3JkOw0KPiArCWlmICh0eF9jb3VudCA+IFNT SV9GSUZPX0RFUFRIKQ0KPiArCQl0eF9jb3VudCA9IFNTSV9GSUZPX0RFUFRIOw0KPiArDQo+ICsJ Lyogc2V0IGZpZm8gdGhyZXRob2xkICovDQo+ICsJdmFsID0gcmVhZGwocHJpdi0+YmFzZSArIFNT SV9GQyk7DQo+ICsJdmFsICY9IH4oU1NJX0ZDX1RYRlRIX01BU0sgfCBTU0lfRkNfUlhGVEhfTUFT Syk7DQo+ICsJdmFsIHw9IEZJRUxEX1BSRVAoU1NJX0ZDX1RYRlRIX01BU0ssIHR4X2NvdW50KTsN Cj4gKwl2YWwgfD0gRklFTERfUFJFUChTU0lfRkNfUlhGVEhfTUFTSywgdHhfY291bnQpOw0KPiAr CXdyaXRlbCh2YWwsIHByaXYtPmJhc2UgKyBTU0lfRkMpOw0KPiArDQo+ICsJd2hpbGUgKHR4X2Nv dW50LS0pDQo+ICsJCXVuaXBoaWVyX3NwaV9zZW5kKHByaXYpOw0KPiArfQ0KDQpJZiB5b3UgaGF2 ZSAyNCBiaXRzIHBlciB3b3JkLCAzIHdvcmRzLCB0aGF0J3MgOSBieXRlcy4gDQpCWVRFU19QRVJf V09SRCgyNCkgaXMgNC4gIHR4X2NvdW50ID0gOS80ID0gMi4gIExvb2tzIGxpa2UgeW91ciB0eF9j b3VudA0Kcm91bmRzIGluY29ycmVjdGx5LCBhcyBpdCB3aWxsIG9ubHkgc2VuZCA4IG9mIHRoZSA5 IGJ5dGVzLg0KDQo+ICtzdGF0aWMgaW50IHVuaXBoaWVyX3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2Rl dmljZSAqc3BpKQ0KPiArew0KDQo+ICsNCj4gKwl3cml0ZWwodmFsMSwgcHJpdi0+YmFzZSArIFNT SV9DS1MpOw0KPiArCXdyaXRlbCh2YWwyLCBwcml2LT5iYXNlICsgU1NJX0ZQUyk7DQo+ICsNCj4g Kwl2YWwxID0gMDsNCj4gKwlpZiAoc3BpLT5tb2RlICYgU1BJX0xTQl9GSVJTVCkNCj4gKwkJdmFs MSB8PSBGSUVMRF9QUkVQKFNTSV9UWFdEU19URFRGX01BU0ssIDEpOw0KPiArCXdyaXRlbCh2YWwx LCBwcml2LT5iYXNlICsgU1NJX1RYV0RTKTsNCj4gKwl3cml0ZWwodmFsMSwgcHJpdi0+YmFzZSAr IFNTSV9SWFdEUyk7DQoNCkRpZCB5b3Ugc2VlIHRoaXMgaW4gdGhlIHNwaSBkb2NzPw0KDQogICAg ICAgIFVubGVzcyBlYWNoIFNQSSBzbGF2ZSBoYXMgaXRzIG93biBjb25maWd1cmF0aW9uIHJlZ2lz dGVycywgZG9uJ3QNCiAgICAgICAgY2hhbmdlIHRoZW0gcmlnaHQgYXdheSAuLi4gb3RoZXJ3aXNl IGRyaXZlcnMgY291bGQgY29ycnVwdCBJL08NCiAgICAgICAgdGhhdCdzIGluIHByb2dyZXNzIGZv ciBvdGhlciBTUEkgZGV2aWNlcy4NCg0KICAgICAgICAgICAgICAgICoqIEJVRyBBTEVSVDogIGZv ciBzb21lIHJlYXNvbiB0aGUgZmlyc3QgdmVyc2lvbiBvZg0KICAgICAgICAgICAgICAgICoqIG1h bnkgc3BpX21hc3RlciBkcml2ZXJzIHNlZW1zIHRvIGdldCB0aGlzIHdyb25nLg0KICAgICAgICAg ICAgICAgICoqIFdoZW4geW91IGNvZGUgc2V0dXAoKSwgQVNTVU1FIHRoYXQgdGhlIGNvbnRyb2xs ZXINCiAgICAgICAgICAgICAgICAqKiBpcyBhY3RpdmVseSBwcm9jZXNzaW5nIHRyYW5zZmVycyBm b3IgYW5vdGhlciBkZXZpY2UuDQoNCllvdSBoYXZlIG9uZSBjaGlwc2VsZWN0LCBzbyBtYXliZSB0 aGlzIGlzIG9rLiAgVW50aWwgeW91IHdhbnQgdG8NCnN1cHBvcnQgbW9yZSB0aGFuIG9uZSBjaGlw c2VsZWN0Lg0KDQpXaXRoIGdwaW8gbGluZXMgYXMgY2hpcCBzZWxlY3RzLCB0aGVyZSdzIHJlYWxs eSBubyByZWFzb24gYW55IHNwaQ0KbWFzdGVyIGNhbid0IHN1cHBvcnQgbXVsdGlwbGUgc2xhdmVz Lg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: Trent Piepho Subject: Re: [PATCH 2/2] spi: add SPI controller driver for UniPhier SoC Date: Thu, 19 Jul 2018 19:45:43 +0000 Message-ID: <1532029542.2283.157.camel@impinj.com> References: <1531983117-9443-1-git-send-email-hayashibara.keiji@socionext.com> <1531983117-9443-3-git-send-email-hayashibara.keiji@socionext.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1531983117-9443-3-git-send-email-hayashibara.keiji@socionext.com> Content-Language: en-US Content-ID: <6FCCB6CBC67CC84FAF8320B6962F4146@namprd06.prod.outlook.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=m.gmane.org@lists.infradead.org To: "robh+dt@kernel.org" , "devicetree@vger.kernel.org" , "hayashibara.keiji@socionext.com" , "broonie@kernel.org" , "mark.rutland@arm.com" , "linux-spi@vger.kernel.org" , "yamada.masahiro@socionext.com" , "linux-arm-kernel@lists.infradead.org" Cc: "jaswinder.singh@linaro.org" , "hayashi.kunihiko@socionext.com" , "linux-kernel@vger.kernel.org" , "masami.hiramatsu@linaro.org" List-Id: devicetree@vger.kernel.org On Thu, 2018-07-19 at 15:51 +0900, Keiji Hayashibara wrote: > > +config SPI_UNIPHIER > + tristate "Socionext UniPhier SPI Controller" > + depends on (ARCH_UNIPHIER || COMPILE_TEST) && OF > + help > + This driver supports the SPI controller on Socionext > + UniPhier SoCs. Perhaps add the bit that this is for the SCSSI and not MCSSI here? > > + > +#define BYTES_PER_WORD(x) \ > +({ \ > + int __x; \ > + __x = (x <= 8) ? 1 : \ > + (x <= 16) ? 2 : 4; \ > + __x; \ > +}) Or: static inline bytes_per_word(unsigned int bits) { return bits <= 8 ? 1 : (bits <= 16 ? 2 : 4); } > + > +static inline void uniphier_spi_irq_enable(struct spi_device *spi, u32 mask) > +{ > + struct uniphier_spi_priv *priv = spi_master_get_devdata(spi->master); > + u32 val; > + > + val = readl(priv->base + SSI_IE); > + val |= mask; > + writel(val, priv->base + SSI_IE); > +} > + > +static inline void uniphier_spi_irq_disable(struct spi_device *spi, u32 mask) > +{ > + struct uniphier_spi_priv *priv = spi_master_get_devdata(spi->master); > + u32 val; > + > + val = readl(priv->base + SSI_IE); > + val &= ~mask; > + writel(val, priv->base + SSI_IE); > +} > + > +static void uniphier_spi_set_transfer_size(struct spi_device *spi, int size) > +{ > + struct uniphier_spi_priv *priv = spi_master_get_devdata(spi->master); > + u32 val; > + > + val = readl(priv->base + SSI_TXWDS); > + val &= ~(SSI_TXWDS_WDLEN_MASK | SSI_TXWDS_DTLEN_MASK); > + val |= FIELD_PREP(SSI_TXWDS_WDLEN_MASK, size); > + val |= FIELD_PREP(SSI_TXWDS_DTLEN_MASK, size); > + writel(val, priv->base + SSI_TXWDS); > + > + val = readl(priv->base + SSI_RXWDS); > + val &= ~SSI_RXWDS_DTLEN_MASK; > + val |= FIELD_PREP(SSI_RXWDS_DTLEN_MASK, size); > + writel(val, priv->base + SSI_RXWDS); > +} > + > +static int uniphier_spi_set_baudrate(struct spi_device *spi, unsigned int speed) > +{ > + struct uniphier_spi_priv *priv = spi_master_get_devdata(spi->master); > + u32 val, ckrat; > + > + /* > + * the supported rates are even numbers from 4 to 254. (4,6,8...254) > + * round up as we look for equal or less speed > + */ > + ckrat = DIV_ROUND_UP(clk_get_rate(priv->clk), speed); > + ckrat = roundup(ckrat, 2); > + > + /* check if requested speed is too small */ > + if (ckrat > SSI_MAX_CLK_DIVIDER) > + return -EINVAL; > + > + if (ckrat < SSI_MIN_CLK_DIVIDER) > + ckrat = SSI_MIN_CLK_DIVIDER; > + > + val = readl(priv->base + SSI_CKS); > + val &= ~SSI_CKS_CKRAT_MASK; > + val |= ckrat & SSI_CKS_CKRAT_MASK; > + writel(val, priv->base + SSI_CKS); > + > + return 0; > +} > + > +static int uniphier_spi_setup_transfer(struct spi_device *spi, > + struct spi_transfer *t) > +{ > + struct uniphier_spi_priv *priv = spi_master_get_devdata(spi->master); > + u32 val; > + int ret; > + > + priv->error = 0; > + priv->tx_buf = t->tx_buf; > + priv->rx_buf = t->rx_buf; > + priv->tx_bytes = priv->rx_bytes = t->len; > + > + if (priv->bits_per_word != t->bits_per_word) { > + uniphier_spi_set_transfer_size(spi, t->bits_per_word); > + priv->bits_per_word = t->bits_per_word; > + } > + > + if (priv->speed_hz != t->speed_hz) { > + ret = uniphier_spi_set_baudrate(spi, t->speed_hz); > + if (ret) > + return ret; > + priv->speed_hz = t->speed_hz; > + } > + > + /* reset FIFOs */ > + val = SSI_FC_TXFFL | SSI_FC_RXFFL; > + writel(val, priv->base + SSI_FC); > + > + return 0; > +} > + > +static void uniphier_spi_send(struct uniphier_spi_priv *priv) > +{ > + int i, loop; > + u32 val = 0; > + > + loop = BYTES_PER_WORD(priv->bits_per_word); > + if (priv->tx_bytes < loop) > + loop = priv->tx_bytes; > + > + priv->tx_bytes -= loop; > + > + if (priv->tx_buf) > + for (i = 0; i < loop; i++) { > + val |= (*(const u8 *)priv->tx_buf) > + << (BITS_PER_BYTE * i); priv->tx_buf is already a const u8*, no need to cast it. Also in recv, no need to cast the pointer. It'll just hide errors if someone changes the type of the field. > + (const u8 *)priv->tx_buf++; > + } > + > + writel(val, priv->base + SSI_TXDR); > +} The loop to read the data will likely be somewhat slow. It might be faster to use: val = get_unaligned_le32(priv->tx_buf); To support different sizes a switch can be used: switch (MIN(BYTES_PER_WORD(priv->bits_per_word), priv->tx_bytes)) { case 1: val = *priv->tx_buf; break; case 2: val = get_unaligned_le16(priv->tx_buf); break; case 4: val = get_unaligned_le32(priv->tx_buf); break; } However, I don't think either the existing code or this code is correctly handling word sizes that are not an even number of bytes. I think it needs to left shift the data, but of course it also depends on what the uniphier hardware expected in the TXDR register. > +static void uniphier_spi_recv(struct uniphier_spi_priv *priv) > +{ > + int i, loop; > + u32 val; > + > + loop = BYTES_PER_WORD(priv->bits_per_word); > + if (priv->rx_bytes < loop) > + loop = priv->rx_bytes; > + > + priv->rx_bytes -= loop; > + > + val = readl(priv->base + SSI_RXDR); > + > + if (priv->rx_buf) > + for (i = 0; i < loop; i++) { > + val = val >> (BITS_PER_BYTE * i); > + *(u8 *)priv->rx_buf = val & GENMASK(7, 0); > + (u8 *)priv->rx_buf++; > + } > +}+static void uniphier_spi_fill_tx_fifo(struct uniphier_spi_priv *priv) > +{ > + unsigned int tx_count; > + int bytes_per_word = BYTES_PER_WORD(priv->bits_per_word); > + u32 val; > + > + tx_count = priv->tx_bytes / bytes_per_word; > + if (tx_count > SSI_FIFO_DEPTH) > + tx_count = SSI_FIFO_DEPTH; > + > + /* set fifo threthold */ > + val = readl(priv->base + SSI_FC); > + val &= ~(SSI_FC_TXFTH_MASK | SSI_FC_RXFTH_MASK); > + val |= FIELD_PREP(SSI_FC_TXFTH_MASK, tx_count); > + val |= FIELD_PREP(SSI_FC_RXFTH_MASK, tx_count); > + writel(val, priv->base + SSI_FC); > + > + while (tx_count--) > + uniphier_spi_send(priv); > +} If you have 24 bits per word, 3 words, that's 9 bytes. BYTES_PER_WORD(24) is 4. tx_count = 9/4 = 2. Looks like your tx_count rounds incorrectly, as it will only send 8 of the 9 bytes. > +static int uniphier_spi_setup(struct spi_device *spi) > +{ > + > + writel(val1, priv->base + SSI_CKS); > + writel(val2, priv->base + SSI_FPS); > + > + val1 = 0; > + if (spi->mode & SPI_LSB_FIRST) > + val1 |= FIELD_PREP(SSI_TXWDS_TDTF_MASK, 1); > + writel(val1, priv->base + SSI_TXWDS); > + writel(val1, priv->base + SSI_RXWDS); Did you see this in the spi docs? Unless each SPI slave has its own configuration registers, don't change them right away ... otherwise drivers could corrupt I/O that's in progress for other SPI devices. ** BUG ALERT: for some reason the first version of ** many spi_master drivers seems to get this wrong. ** When you code setup(), ASSUME that the controller ** is actively processing transfers for another device. You have one chipselect, so maybe this is ok. Until you want to support more than one chipselect. With gpio lines as chip selects, there's really no reason any spi master can't support multiple slaves. From mboxrd@z Thu Jan 1 00:00:00 1970 From: tpiepho@impinj.com (Trent Piepho) Date: Thu, 19 Jul 2018 19:45:43 +0000 Subject: [PATCH 2/2] spi: add SPI controller driver for UniPhier SoC In-Reply-To: <1531983117-9443-3-git-send-email-hayashibara.keiji@socionext.com> References: <1531983117-9443-1-git-send-email-hayashibara.keiji@socionext.com> <1531983117-9443-3-git-send-email-hayashibara.keiji@socionext.com> Message-ID: <1532029542.2283.157.camel@impinj.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Thu, 2018-07-19 at 15:51 +0900, Keiji Hayashibara wrote: > > +config SPI_UNIPHIER > + tristate "Socionext UniPhier SPI Controller" > + depends on (ARCH_UNIPHIER || COMPILE_TEST) && OF > + help > + This driver supports the SPI controller on Socionext > + UniPhier SoCs. Perhaps add the bit that this is for the SCSSI and not MCSSI here? > > + > +#define BYTES_PER_WORD(x) \ > +({ \ > + int __x; \ > + __x = (x <= 8) ? 1 : \ > + (x <= 16) ? 2 : 4; \ > + __x; \ > +}) Or: static inline bytes_per_word(unsigned int bits) { return bits <= 8 ? 1 : (bits <= 16 ? 2 : 4); } > + > +static inline void uniphier_spi_irq_enable(struct spi_device *spi, u32 mask) > +{ > + struct uniphier_spi_priv *priv = spi_master_get_devdata(spi->master); > + u32 val; > + > + val = readl(priv->base + SSI_IE); > + val |= mask; > + writel(val, priv->base + SSI_IE); > +} > + > +static inline void uniphier_spi_irq_disable(struct spi_device *spi, u32 mask) > +{ > + struct uniphier_spi_priv *priv = spi_master_get_devdata(spi->master); > + u32 val; > + > + val = readl(priv->base + SSI_IE); > + val &= ~mask; > + writel(val, priv->base + SSI_IE); > +} > + > +static void uniphier_spi_set_transfer_size(struct spi_device *spi, int size) > +{ > + struct uniphier_spi_priv *priv = spi_master_get_devdata(spi->master); > + u32 val; > + > + val = readl(priv->base + SSI_TXWDS); > + val &= ~(SSI_TXWDS_WDLEN_MASK | SSI_TXWDS_DTLEN_MASK); > + val |= FIELD_PREP(SSI_TXWDS_WDLEN_MASK, size); > + val |= FIELD_PREP(SSI_TXWDS_DTLEN_MASK, size); > + writel(val, priv->base + SSI_TXWDS); > + > + val = readl(priv->base + SSI_RXWDS); > + val &= ~SSI_RXWDS_DTLEN_MASK; > + val |= FIELD_PREP(SSI_RXWDS_DTLEN_MASK, size); > + writel(val, priv->base + SSI_RXWDS); > +} > + > +static int uniphier_spi_set_baudrate(struct spi_device *spi, unsigned int speed) > +{ > + struct uniphier_spi_priv *priv = spi_master_get_devdata(spi->master); > + u32 val, ckrat; > + > + /* > + * the supported rates are even numbers from 4 to 254. (4,6,8...254) > + * round up as we look for equal or less speed > + */ > + ckrat = DIV_ROUND_UP(clk_get_rate(priv->clk), speed); > + ckrat = roundup(ckrat, 2); > + > + /* check if requested speed is too small */ > + if (ckrat > SSI_MAX_CLK_DIVIDER) > + return -EINVAL; > + > + if (ckrat < SSI_MIN_CLK_DIVIDER) > + ckrat = SSI_MIN_CLK_DIVIDER; > + > + val = readl(priv->base + SSI_CKS); > + val &= ~SSI_CKS_CKRAT_MASK; > + val |= ckrat & SSI_CKS_CKRAT_MASK; > + writel(val, priv->base + SSI_CKS); > + > + return 0; > +} > + > +static int uniphier_spi_setup_transfer(struct spi_device *spi, > + struct spi_transfer *t) > +{ > + struct uniphier_spi_priv *priv = spi_master_get_devdata(spi->master); > + u32 val; > + int ret; > + > + priv->error = 0; > + priv->tx_buf = t->tx_buf; > + priv->rx_buf = t->rx_buf; > + priv->tx_bytes = priv->rx_bytes = t->len; > + > + if (priv->bits_per_word != t->bits_per_word) { > + uniphier_spi_set_transfer_size(spi, t->bits_per_word); > + priv->bits_per_word = t->bits_per_word; > + } > + > + if (priv->speed_hz != t->speed_hz) { > + ret = uniphier_spi_set_baudrate(spi, t->speed_hz); > + if (ret) > + return ret; > + priv->speed_hz = t->speed_hz; > + } > + > + /* reset FIFOs */ > + val = SSI_FC_TXFFL | SSI_FC_RXFFL; > + writel(val, priv->base + SSI_FC); > + > + return 0; > +} > + > +static void uniphier_spi_send(struct uniphier_spi_priv *priv) > +{ > + int i, loop; > + u32 val = 0; > + > + loop = BYTES_PER_WORD(priv->bits_per_word); > + if (priv->tx_bytes < loop) > + loop = priv->tx_bytes; > + > + priv->tx_bytes -= loop; > + > + if (priv->tx_buf) > + for (i = 0; i < loop; i++) { > + val |= (*(const u8 *)priv->tx_buf) > + << (BITS_PER_BYTE * i); priv->tx_buf is already a const u8*, no need to cast it. Also in recv, no need to cast the pointer. It'll just hide errors if someone changes the type of the field. > + (const u8 *)priv->tx_buf++; > + } > + > + writel(val, priv->base + SSI_TXDR); > +} The loop to read the data will likely be somewhat slow. It might be faster to use: val = get_unaligned_le32(priv->tx_buf); To support different sizes a switch can be used: switch (MIN(BYTES_PER_WORD(priv->bits_per_word), priv->tx_bytes)) { case 1: val = *priv->tx_buf; break; case 2: val = get_unaligned_le16(priv->tx_buf); break; case 4: val = get_unaligned_le32(priv->tx_buf); break; } However, I don't think either the existing code or this code is correctly handling word sizes that are not an even number of bytes. I think it needs to left shift the data, but of course it also depends on what the uniphier hardware expected in the TXDR register. > +static void uniphier_spi_recv(struct uniphier_spi_priv *priv) > +{ > + int i, loop; > + u32 val; > + > + loop = BYTES_PER_WORD(priv->bits_per_word); > + if (priv->rx_bytes < loop) > + loop = priv->rx_bytes; > + > + priv->rx_bytes -= loop; > + > + val = readl(priv->base + SSI_RXDR); > + > + if (priv->rx_buf) > + for (i = 0; i < loop; i++) { > + val = val >> (BITS_PER_BYTE * i); > + *(u8 *)priv->rx_buf = val & GENMASK(7, 0); > + (u8 *)priv->rx_buf++; > + } > +}+static void uniphier_spi_fill_tx_fifo(struct uniphier_spi_priv *priv) > +{ > + unsigned int tx_count; > + int bytes_per_word = BYTES_PER_WORD(priv->bits_per_word); > + u32 val; > + > + tx_count = priv->tx_bytes / bytes_per_word; > + if (tx_count > SSI_FIFO_DEPTH) > + tx_count = SSI_FIFO_DEPTH; > + > + /* set fifo threthold */ > + val = readl(priv->base + SSI_FC); > + val &= ~(SSI_FC_TXFTH_MASK | SSI_FC_RXFTH_MASK); > + val |= FIELD_PREP(SSI_FC_TXFTH_MASK, tx_count); > + val |= FIELD_PREP(SSI_FC_RXFTH_MASK, tx_count); > + writel(val, priv->base + SSI_FC); > + > + while (tx_count--) > + uniphier_spi_send(priv); > +} If you have 24 bits per word, 3 words, that's 9 bytes. BYTES_PER_WORD(24) is 4. tx_count = 9/4 = 2. Looks like your tx_count rounds incorrectly, as it will only send 8 of the 9 bytes. > +static int uniphier_spi_setup(struct spi_device *spi) > +{ > + > + writel(val1, priv->base + SSI_CKS); > + writel(val2, priv->base + SSI_FPS); > + > + val1 = 0; > + if (spi->mode & SPI_LSB_FIRST) > + val1 |= FIELD_PREP(SSI_TXWDS_TDTF_MASK, 1); > + writel(val1, priv->base + SSI_TXWDS); > + writel(val1, priv->base + SSI_RXWDS); Did you see this in the spi docs? Unless each SPI slave has its own configuration registers, don't change them right away ... otherwise drivers could corrupt I/O that's in progress for other SPI devices. ** BUG ALERT: for some reason the first version of ** many spi_master drivers seems to get this wrong. ** When you code setup(), ASSUME that the controller ** is actively processing transfers for another device. You have one chipselect, so maybe this is ok. Until you want to support more than one chipselect. With gpio lines as chip selects, there's really no reason any spi master can't support multiple slaves.