[PATCH v5] I2C: add CSR SiRFprimaII on-chip I2C controllers driver

Barry Song 21cnbao at gmail.com
Tue Feb 7 03:47:40 EST 2012


hi Wolfram,

2012/2/7 Wolfram Sang <w.sang at pengutronix.de>:
>
>> > Thanks for your contribution! Is there a free datasheet for this controller
>> > available?
>>
>> sorry. not available to public yet.
>
> :( Can you cite what "SIRFSOC_I2C_NACK" does?

if ACK is not received, an interrupt will be got and related register
status can show this error. that is just a common feature in almost
all i2c controllers? so the naming is confused. i just copied it from
the spec.

>>
>> >> +struct sirfsoc_i2c {
>> >> +     void __iomem *base;
>> >> +     struct clk *clk;
>> >> +     unsigned long speed;    /* I2C SCL frequency */
>> >> +     int irq;
>> >
>> > Do you really need those two?
>>
>> irq can be deleted. speed is not really needed if you don't like.
>
> It is not about "like". It is not needed, or?

it is not needed.

>
>> >> +static void i2c_sirfsoc_queue_cmd(struct sirfsoc_i2c *siic)
>> >> +{
>> >> +     u32 regval;
>> >> +     int i = 0;
>> >> +
>> >> +     if (siic->msg_read) {
>> >> +             while (((siic->finished_len + i) < siic->msg_len)
>> >> +                     && (siic->cmd_ptr < SIRFSOC_I2C_CMD_BUF_MAX)) {
>> >
>> > Either use a different indentation for the above line or add a newline below.
>> > It is hard to see where the while() ends and the code block starts.
>>
>> i just want to make sure what you want is:
>>
>>              while (((siic->finished_len + i) < siic->msg_len)
>>                      &&(siic->cmd_ptr < SIRFSOC_I2C_CMD_BUF_MAX)
>>                      ) {
>> ?
>> or something else?
>
> I thought of (which is simpler IMO):
>
>>              while (((siic->finished_len + i) < siic->msg_len)
>>                      &&(siic->cmd_ptr < SIRFSOC_I2C_CMD_BUF_MAX)) {
>>
>>                      regval = SIRFSOC_I2C_READ | SIRFSOC_I2C_CMD_RP(0);
>
>
> The other solution would be (not sure if it fits the line length):
>
>> >> +             while (((siic->finished_len + i) < siic->msg_len)
>> >> +                            && (siic->cmd_ptr < SIRFSOC_I2C_CMD_BUF_MAX)) {
>> >> +                     regval = SIRFSOC_I2C_READ | SIRFSOC_I2C_CMD_RP(0);
>
> The idea is to make it easier (visually) what is the while-condition and where
> is the code of the while-block. I thought that was difficult in original version.

the mail webpages and clients really fails to show the difference. i
guess you mean:
 while (((siic->finished_len + i) < siic->msg_len)
 [ tab ][ tab ]&& (siic->cmd_ptr < SIRFSOC_I2C_CMD_BUF_MAX)) {
?

or can you describle the indentation by something like [space][space][tab][tab]?

>
>> >> +static int i2c_sirfsoc_xfer_msg(struct sirfsoc_i2c *siic, struct i2c_msg *msg)
>> >> +{
>> >> +     u32 regval = readl(siic->base + SIRFSOC_I2C_CTRL);
>> >> +     int timeout = (msg->len + 1) * 50;
>> >
>> > That looks broken. What is 50 here?
>>
>> just multiple of xfer bytes for defining a timeout. i might have a comment here.
>
> That probably won't help. I'd think you want a *_to_jiffies() here to define a
> proper timeout value in usecs/msecs?

ok. make sense.

>
>> >> +     siic->irq = platform_get_irq(pdev, 0);
>> >> +     if (siic->irq < 0) {
>> >> +             err = -EINVAL;
>> >> +             goto out;
>> >> +     }
>> >
>> > return the error code here?
>>
>> out lable will free resources and return error code.
>
> Sorry, I meant the error code you received which is in siic->irq.

ok. err = -ENXIO

>
> Regards,
>
>   Wolfram

-barry



More information about the linux-arm-kernel mailing list