public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Heiko Schocher <hs@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] 7/12 Multiadapter/multibus I2C, drivers part 4
Date: Wed, 18 Feb 2009 08:20:40 +0100	[thread overview]
Message-ID: <499BB6C8.5000109@denx.de> (raw)
In-Reply-To: <Pine.LNX.4.64ksi.0902171233390.30435@home-gw.koi8.net>

Hello ksi,

ksi at koi8.net wrote:
> On Mon, 16 Feb 2009, Wolfgang Denk wrote:
> 
>> Dear ksi at koi8.net,
>>
>> In message <Pine.LNX.4.64ksi.0902142019520.6240@home-gw.koi8.net> you wrote:
>>> That means you have to make changes in two places instead of one -- config
>>> file AND $(BOARD).c. Also you use functions instead of macros and you can
>>> NOT make them inline because they come from a separate object file. This
>>> essentially defeats the very purpose of that common soft_i2c.c driver. If
>>> you want to make functions for bitbanged I2C into the $(BOARD).c there is no
>>> reason to have them as a base for that driver. It is much more logical to do
>>> everything in reverse, i.e. instead of having soft_i2c.c as a bona fide
>>> drivers and those I2C_SDA and friends as its building blocks make those
>>> i2c_soft_sda() etc. in each and every $(BOARD).c into primary entities and
>>> build the actual driver in the $(BOARD).c itself. Just convert that
>>> soft_i2c.c into a header file with macros for real functions (soft_i2c_read
>>> etc.) and instantiate them in the $(BOARD).c.
>> Ecept that the code you posted is unreadable and you will need lots of
>> very good arguments to make me accept it.
> 
> What is unreadable in that code?

I wouldn;t say unreadable but unnecessary swollen.

> Take e.g. this:
> 
> === Cut ===
> #define I2C_SOFT_SEND_START(n) \
> static void send_start##n(void) \
> { \
[...]
>         I2C_DELAY2;
>         I2C_SDA2(0);
>         I2C_DELAY2;
> }
> === Cut ===
> 
> This will be generated at compile time and fed to gcc.
> 
> What is so unreadable here?
> 
> Sure I can make all the instances manually and avoid those #define's but it
> will not make that source file any more readable by simply repeating those
> functions several times with just that "##n" different. And it will make
> that source file 4 times bigger with 4 instances or twice as big if there
> are only two of them.

Again, if you use, as i proposed, this cur_adap_nr pointer, you didn;t
have to change anything in this driver (I posted such a patch as a proposal)

And again, you don;t need to do, as i did in this proposal, make this
I2C_SDA, ... in function. You can of course make this in macros. OK, you
have one more if but that shouldn;t be such a problem!

> Why should we avoid using CPP feature that is SPECIALLY made for cases like
> this?

What CPP feature?

> Not rocket science and not much of black magic, just simple and
> straightforward token pasting...
> 
>>> The only problem with that is it breaks uniformity and makes another mess.
>>> The whole idea was to bring _ALL_ I2C drivers to a single place and make
>>> them totally transparent and uniform. Something like e.g. Linux VFS.
>> This is a boot loader with limited resources, not a general purpose
>> OS.
> 
> It doesn't matter. It is much better to have a uniform API for all the
> future developers to use than to multiply horrible hacks and reinventing the
> wheel again and again.

? We didn;t want to change the API, you mix things. We only want to
prevent such a define monster in the bitbang driver.

>>> And remember, the devil is in details. How are you going to assign
>>> (initialize) that innocent looking "cur_adap_nr->hwadapnr"? How are you
>>> going to work on an adapter other that "current" in a situation when you can
>>> NOT change "current" adapter (e.g. perform all I2C layer initialization
>>> while still running from flash?) Remember, this is plain C and there is no
>> What makes you insist that we cannot change a variable if we need to
>> be able to change one?
> 
> It is NOT just variable. My approach uses i2c _BUS_, not _ADAPTER_. And
> number of busses can be bigger than number of adapters (e.g. when some
> busses a reached via muxes or switches.) When doing i2c_set_current_bus()
> you are switching _NOT_ adapters, but busses. That involves not only

What has this to do with soft_i2c.c?

> changing that global variable but also reprogramming muxes/switches for

Yes, and this is independent of changing also this current pointer.

> i2c_set_current_bus() to be consistent and hardware independent. Otherwise

It is this also with changing this current pointer!

> your code should know if that particular bus it is switching to is directly
> connected or switched and check the bus it is switching from for muxes. If
> they are switched, your code should disconnect the current bus switches,

Yes, and this you did perfectly in i2c-core.c, where is your problem?

> then do that i2c_set_current_bus() and connect the switches to the new bus
> after that.

I don;t understand you know, really. Nobody in this discussion criticize
the API, we just discuss the soft_i2c.c driver, and how we can prevent
this defines ... or I lost something ...

> That means that code MUST somehow know the topology to take appropriate
> actions and properly configure those switches. That means you should somehow
> describe that topology for each and every board in CONFIG_* terms and make
> each and every place at U-Boot that invokes _ANY_ i2c function to take care
> of that switching.

Yep, this we(you did it ;-) have this in i2c-core.c ...

(And, I want to start this discuss again, you just dropped the support for
adding new such busses per command shell ... you could not do this! But
I have a solution for this on top of your patches, but I want start this
discussion, if we have your patches in a testing branch in u-boot-i2c.git)

> My code does it transparently in the single place, i2c_set_current_bus() so
> higher level code doesn't have to bother with details.

Again, what has this to do with introducing a current pointer?

> Then, all those I2C multiplexers/switches are I2C devices theirself that
> means you can NOT talk to them if the adapter they connected to is not
> initialized.

Ok, come, read my previous EMail, you can init this adapter before
switching the muxes.

> And yes, we DO have some boards with switched I2C busses in U-Boot main tree
> so this is NOT a hypothetical situation.

Yes, and they add i2c busses frem env variables, which you dropped ...

>>> You are adding unnecessary complexity to the code. And you break uniformity.
>> He. I must have thought the same before about someone else's code ;-)
> 
> Eh, I'm trying to make things simpler... For that particular board I'm
> expecting from assembly house by the end of this week I can make its
> particular hardware work with a bunch of one-time hacks in its $(BOARD).c... 
> 
> But I think I'm not the first one to face such a problem and not the last
> one. So why wouldn't we make the proper API to get rid of all those hacks? I
> can do it now while paid by my current employer but there is no guarantee my
> next one would allow for such a waste from business standpoint...

I don;t understand why you have such problems with introducing a current
pointer. And again, that has nothing to do with the API.

bye
Heiko
-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany

  parent reply	other threads:[~2009-02-18  7:20 UTC|newest]

Thread overview: 75+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-02-13 10:17 [U-Boot] [PATCH] 7/12 Multiadapter/multibus I2C, drivers part 4 Heiko Schocher
2009-02-13 21:23 ` ksi at koi8.net
2009-02-14  8:24   ` Heiko Schocher
2009-02-15  5:03     ` ksi at koi8.net
2009-02-15  7:56       ` Heiko Schocher
2009-02-16  6:35         ` ksi at koi8.net
2009-02-16  9:03           ` Heiko Schocher
2009-02-16 22:17             ` Wolfgang Denk
2009-02-17 21:23               ` ksi at koi8.net
2009-02-16 22:16           ` Wolfgang Denk
2009-02-17 21:22             ` ksi at koi8.net
2009-02-18  7:23               ` Heiko Schocher
2009-02-16 22:11       ` Wolfgang Denk
2009-02-17 21:19         ` ksi at koi8.net
2009-02-17 22:49           ` Wolfgang Denk
2009-02-17 23:42             ` ksi at koi8.net
2009-02-18  0:13               ` Wolfgang Denk
2009-02-18  0:35                 ` ksi at koi8.net
2009-02-18  7:47                   ` Heiko Schocher
2009-02-18 18:05                     ` ksi at koi8.net
2009-02-18 18:26                       ` Wolfgang Denk
2009-02-18 19:47                         ` ksi at koi8.net
2009-02-18 22:09                           ` Wolfgang Denk
2009-02-18 23:00                             ` ksi at koi8.net
2009-02-18 23:31                               ` Wolfgang Denk
2009-02-19  0:46                                 ` ksi at koi8.net
2009-02-19  8:00                               ` Heiko Schocher
2009-02-19 19:48                                 ` ksi at koi8.net
2009-02-19 20:50                                   ` Wolfgang Denk
2009-02-19 22:26                                     ` ksi at koi8.net
2009-02-20  8:53                                       ` Heiko Schocher
2009-02-20  7:08                                     ` Heiko Schocher
2009-02-20  7:06                                   ` Heiko Schocher
2009-02-18  7:33             ` Heiko Schocher
2009-02-18  8:06               ` Wolfgang Denk
2009-02-18  8:15                 ` Heiko Schocher
2009-02-18  8:55                   ` Wolfgang Denk
2009-02-18 18:58                     ` ksi at koi8.net
2009-02-18 18:51                 ` ksi at koi8.net
2009-02-18 17:44               ` ksi at koi8.net
2009-02-19  6:10                 ` Heiko Schocher
2009-02-19 14:46                   ` ksi at koi8.net
2009-02-19 15:06                     ` Heiko Schocher
2009-02-19 19:52                       ` ksi at koi8.net
2009-02-19 20:55                         ` Wolfgang Denk
2009-02-19 22:33                           ` ksi at koi8.net
2009-02-20  7:09                           ` Heiko Schocher
2009-02-18  7:20           ` Heiko Schocher [this message]
2009-02-18 18:48             ` ksi at koi8.net
2009-02-19  6:31               ` Heiko Schocher
2009-02-19 19:35                 ` ksi at koi8.net
2009-02-19 21:22                   ` Wolfgang Denk
2009-02-20  0:13                     ` ksi at koi8.net
2009-02-20  7:01                   ` Heiko Schocher
2009-02-20 21:29                     ` ksi at koi8.net
2009-02-21  7:25                       ` Heiko Schocher
2009-02-21 18:19                         ` ksi at koi8.net
2009-02-18  8:17           ` Heiko Schocher
2009-02-18  8:58             ` Heiko Schocher
2009-02-18 18:57               ` ksi at koi8.net
2009-02-18 21:56                 ` Wolfgang Denk
2009-02-18 22:32                   ` ksi at koi8.net
2009-02-18 22:48                     ` Wolfgang Denk
2009-02-19  0:35                       ` ksi at koi8.net
2009-02-19  8:04                         ` Heiko Schocher
2009-02-19 21:29                         ` Wolfgang Denk
2009-02-19  7:39                       ` Heiko Schocher
2009-02-19 19:40                         ` ksi at koi8.net
2009-02-19  6:42                 ` Heiko Schocher
2009-02-18 18:53             ` ksi at koi8.net
2009-02-19  6:34               ` Heiko Schocher
2009-02-19 19:36                 ` ksi at koi8.net
  -- strict thread matches above, loose matches on Subject: below --
2009-02-12 22:25 ksi at koi8.net
2009-02-16 21:58 ` Wolfgang Denk
2009-02-17 20:02   ` ksi at koi8.net

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=499BB6C8.5000109@denx.de \
    --to=hs@denx.de \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox