On Wed, Nov 30, 2022 at 05:12:13PM +0100, Hans de Goede wrote: > On 11/30/22 16:55, Andy Shevchenko wrote: > > The ->get() callback depending on other settings and hardware support > > may return different values, while the line outside the chip is kept > > in the same state. Let's discuss that in the documentation. ... > > +Considerations of the ->get() returned value > > +-------------------------------------------- > > + > > +Due to different possible electrical configurations and software applications > > +the value that ->get() callback returns may vary depending on the other settings. > > +This will allow to use pins in the I2C emulation mode or other not so standard > > +uses. > > + > > +The below table gathered the most used cases. > > + > > +========== ========== =============== ======================= > > + Input Output State What value to return? > > +========== ========== =============== ======================= > > + Disabled Disabled Hi-Z input buffer > > + Disabled OS/OD/etc Single ended [cached] output buffer > > You need to clarify what single-ended means here. You mean a pin > which is only capable of output I guess ? So now way to figure > out if another participant in the OS/OD bus has its transistor > in the "on" state this pulling the bus high / low agains the bias > resistor(s) which determine the state of the bus in rest ? > > Or you mean that the bus is uni-directional, even then being > able to detect a short-circuit is useful. It's described in the previous chapter(s). > > + x Push-Pull Out [cached] output buffer > > Why, most GPIO drivers are protected against short-circuit to > GND / Vdd and actually reading the input-buffer here will allow > GPIO API consumers to detect such short-circuits if they are > interested in this. This would e.g. be useful to detect > mis-wiring on devices like the Raspberry Pi were users often > connect extra peripherals through breadboards. I think it is nonsense from electronics point of view. > IMHO for pins with an input buffer get() should simply > always return the contents of the input buffer. This is what > I believe almost all GPIO drivers currently do and also > keeps the get() methods KISS. As you can see, I disagree on this. > Actually implementing the behavior you suggest here requires > the get() method to differentiate between push-pull and > other mode. This makes the get() method implementation > needlessly complicated and will likely be a source of bugs > as people will get this wrong in some cases and people > will very likely not test all possible combinations from > this big table you are adding here. People already are getting wrong this and here is no documentation on what to do to get it right. > IHMO the rules for get() should simply be: > > 1. Device has an input buffer: > Return input-buffer value for the pin. I disagree on this. It makes no sense to read real hw wire state when output is enabled. If somebody does a short circuit, it's not a Linux issue and should be recognized on the PCB side (using oscilloscope, multi-meter, etc). > 2. Devices does not have an input buffer: > Return last set output-buffer value > > + Enabled Disabled In input buffer > > + Enabled OS/OD/etc Bidirectional input buffer > > +========== ========== =============== ======================= > > + > > +The [cached] here is used in a broader sense: either pure software cache, or > > +read back value from the GPIO output buffer (not all hardware support that). -- With Best Regards, Andy Shevchenko