Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753677AbdGSNZm (ORCPT ); Wed, 19 Jul 2017 09:25:42 -0400 Received: from mail-lf0-f68.google.com ([209.85.215.68]:37366 "EHLO mail-lf0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753347AbdGSNZg (ORCPT ); Wed, 19 Jul 2017 09:25:36 -0400 Date: Wed, 19 Jul 2017 15:25:33 +0200 From: Johan Hovold To: Linus Walleij Cc: Laxman Dewangan , Alexandre Courbot , Rob Herring , Mark Rutland , Frank Rowand , "linux-gpio@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "devicetree@vger.kernel.org" Subject: Re: [PATCH 1/1] gpio: core: Decouple open drain/source flag with active low/high Message-ID: <20170719131640.GA2533@localhost> References: <1491485752-28030-1-git-send-email-ldewangan@nvidia.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.7.2 (2016-11-26) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2590 Lines: 67 On Fri, Apr 07, 2017 at 12:25:49PM +0200, Linus Walleij wrote: > On Thu, Apr 6, 2017 at 3:35 PM, Laxman Dewangan wrote: > > > Currently, the GPIO interface is said to Open Drain if it is Single > > Ended and active LOW. Similarly, it is said as Open Source if it is > > Single Ended and active HIGH. > > > > The active HIGH/LOW is used in the interface for setting the pin > > state to HIGH or LOW when enabling/disabling the interface. > > > > In Open Drain interface, pin is set to HIGH by putting pin in > > high impedance and LOW by driving to the LOW. > > > > In Open Source interface, pin is set to HIGH by driving pin to > > HIGH and set to LOW by putting pin in high impedance. > > > > With above, the Open Drain/Source is unrelated to the active LOW/HIGH > > in interface. There is interface where the enable/disable of interface > > is ether active LOW or HIGH but it is Open Drain type. > > > > Hence decouple the Open Drain with Single Ended + Active LOW and > > Open Source with Single Ended + Active HIGH. > > > > Adding different flag for the Open Drain/Open Source which is valid > > only when Single ended flag is enabled. > > > > Signed-off-by: Laxman Dewangan > > Patch applied. > > Good that you found this and fixed it before someone git hurt. Well, while decoupling single-endedness from polarity was the right thing to do, this change did actually break the DT binary interface. If you have an old compiled dtb whose source used GPIO_OPEN_DRAIN, you now instead get *open-source* behaviour on 4.12: GPIO_OPEN_DRAIN = GPIO_SINGLE_ENDED | GPIO_ACTIVE_LOW => active-low, but *open source* while if you recompile that source against 4.12 you do get the expected open-drain behaviour, but now with inverted polarity: GPIO_OPEN_DRAIN = GPIO_SINGLE_ENDED | GPIO_LINE_OPEN_DRAIN => open drain, but *active high* requiring the device tree to be updated by specifying (GPIO_OPEN_DRAIN | GPIO_ACTIVE_LOW) I guess the latter is fine, even if it is likely to amount to a fair bit of debugging world wide. Perhaps all this can still be avoided by adding further flags and deprecating others before people start migrating to 4.12 (after all, GPIO_OPEN_DRAIN has been around since 4.4 even if there are no in-kernel users). Or we accept the binary interface breakage -- it probably is pretty rare that people update the kernel without updating the dtb. I can just update the dts on the system that broke for me, and hopefully anyone debugging this issue while updating to 4.12 will find this mail quickly. Johan