[U-Boot] [RFC 0/2] Generic PMIC driver
Lukasz Majewski
l.majewski at samsung.com
Tue Sep 20 14:38:07 CEST 2011
Hi Stefano,
Thanks for the reply.
> >
> > In my opinion following issues needs discussion:
> > 1. In proposed
> > int struct pmic *p, u32 *val) the val is returned by
> > pointer.
>
> And the register to be read/write is embedded in the structure. For
> readness I will let it as separate parameter, but this is my personal
> taste.
For the first version of the pmic_core.c driver we might stick to this
proposition.
> Who is responsible to allocate the pmic structure ? It could be (there
> is no use case at the moment) that the pmic can be programmed before
> the relocation, when malloc() is not available.
In my opinion on the beginning we should focus on basic scenarios.
Therefore the pmic struct is defined static at pmic_core.c as
follows:
static struct pmic pmic;
It is simple and efficient (since it's scope is limited to the
translation unit). We shall NOT use malloc() allocation for the first
version of the driver.
> > Now at fsl_pmic.c read value is returned by return clause.
>
> Yes, we can change - of course, we need to update in one-shot also the
> boards already using a pmic.
Some work for the iMX target boards (e.g. MX51evk) need to be done to
comply with new framework.
As fair as I looked into the code, only iMX power_init methods need
to be fixed.
> > I think, that passing pointer is a better approach,since errors
> > from i2c_read/spi_read can be caught in upper layers.
>
> Using a pointer is the common way to implement a read routine, so I
> cannot argue. The side effect is that the calling code will be filled
> with the same and boring check:
>
> ret = pmic_read_reg(....);
> if (ret) {
> <...error handling, most case only print>
> }
> ret = pmic_read_reg(....);
> if (ret) {
> <...error handling, most case only print>
> }
>
I think, that error checking is always welcome :-).
> > 2. Since I haven't got a chance to test SPI part of the fsl_pmic.c
> > driver, I've focused mainly on I2C and place stubs for SPI.
>
> Ok, right - this is a RFC. I will do no not review the details in your
> sample code, we are discussing the interface ;-).
>
> For the "real" patch, I think we should merge this new code with
> fsl_pmic.c, too.
>
In my opinion we shall reuse fsl_pmic.c code as much as possible
(especially the SPI code - since I cannot test it).
> >
> > 3. Suggestions for struct pmic's additional fields for SPI are more
> > than welcome :-)
>
> We should have the parameters to setup a SPUI connection:
> - SPI chipselect
> - SPI frequency
> - SPI mode
> - SPI bus
>
OK.
> > 4. Now the pmic_core.c file consist of
> > #ifdef PMIC_I2C
> > {Code for handling I2C}
> > #else
> > {Code for handling SPI}
> > #endif
> >
> > The same approach is used at fsl_pmic.c
> >
> > I'm wondering if this approach shouldn't be replaced with on-time
> > checking if SPI or I2C interface is available.
> > This check can be performed by:
> >
> > struct pmic *p;
> > if (p->interface == PMIC_I2C) {
> >
> > } else {
> >
> > }
> >
> > It would allow to remove obscure #ifdefs, but on the other hand it
> > will reduce execution speed of the driver.
>
> Well, I do not worry about time execution. The time to execute the if
> branch is maybe negligible compared to the time to make a I2C/SPI
> transfer.
>
> However, we increase the footprint, and surely only one mechanism is
> required on the same board.
>
So I will try to use switch-case construct.
switch (p->interface) {
case PMIC_I2C:
case PMIC_SPI:
}
> Best regards,
> Stefano Babic
>
--
Best regards,
Lukasz Majewski
Samsung Poland R&D Center
Platform Group
More information about the U-Boot
mailing list