Re: [PATCH 3/4] regmap: Add SPI bus support

Jonathan Cameron
2011-07-15T09:01:39Z

On 07/15/11 06:09, Mark Brown wrote:
> On Thu, Jul 14, 2011 at 11:04:27PM -0600, Grant Likely wrote:
>> On Thu, Jul 14, 2011 at 10:39 PM, Mark Brown
>> <broonie@opensource.wolfsonmicro.com> wrote:
>
> [Regmap API I2C bus code.]
>>> There was a bit about this in the cover mail - it's the interace
>>> stability issue again, the plan is to move them once we're more
>>> confident that the interface used will stay stable.
>
>> I've got no problem with churn in drivers/spi, and I'm fine to have
>> changes in drivers/spi merged via other trees if it means the code is
>> in the logical place.
>
> Can I add an ack from you for that? If/when it does get merged I'd
> appreciate it if you pushed any code to me for review.
>
>>>> struct spi_transfer t[2] = { {.tx_buf = reg, .len = reg_len},
>>>> {.tx_buf = val, .len = val_len}};
>
>>>> Then the memset() and t[0]/t[1] lines can all be culled.
>
>>> That does the init to zero?
>
>> You might want to double check, but I believe it gets implemented as a
>> memcpy of a static initializer.
>
> Hrm, given that neither of us is 100% sure I think it's safer to leave
> it written out long hand and avoid confusing anyone else.

It does the init to zero. The relevant bit of the spec is designated initializers.

See c99 spec (draft here as I'm not paying for it ;) WG14/N1124
6.7.8

Clause 19: The initialization shall occur in initializer list order, each initializer provided for a
particular subobject overriding any previously listed initializer for the same subobject;130)
all subobjects that are not initialized explicitly shall be initialized implicitly the same as
objects that have static storage duration.

So here they will be initialized the same as static objects. For completeness that's
covered in clause 10:
If an object that has automatic storage duration is not initialized explicitly, its value is
indeterminate. If an object that has static storage duration is not initialized explicitly,
then:
— if it has pointer type, it is initialized to a null pointer;
— if it has arithmetic type, it is initialized to (positive or unsigned) zero;
— if it is an aggregate, every member is initialized (recursively) according to these rules;
— if it is a union, the first named member is initialized (recursively) according to these
rules.

Jonathan