[U-Boot] [PATCH v4 09/15] dm: Cast away the const-ness of the global_data pointer

Simon Glass
2014-06-12T03:29:37Z

Hi Marek,

On 11 June 2014 23:26, Simon Glass <sjg@chromium.org> wrote:
> Hi Marek,
>
>
> On 8 June 2014 01:00, Marek Vasut <marex@denx.de> wrote:
>> On Friday, June 06, 2014 at 09:13:26 PM, Simon Glass wrote:
>>> In a very few cases we need to adjust the driver model root device, such as
>>> when setting it up at initialisation. Add a macro to make this easier.
>>>
>>> Signed-off-by: Simon Glass <sjg@chromium.org>
>>> ---
>>
>> [...]
>>
>>> - ret = device_bind_by_name(NULL, &root_info, &gd->dm_root);
>>> + ret = device_bind_by_name(NULL, &root_info, &DM_ROOT());
>>
>> [...]
>>
>>> +/* Cast away any volatile pointer */
>>> +#define DM_ROOT() (((gd_t *)gd)->dm_root)
>>> +#define DM_UCLASS_ROOT() (((gd_t *)gd)->uclass_root)
>>
>> Can you implement this "DM_ROOT()" macro as a function instead ? I believe
>> that'd be much nicer , would have typechecking etc., usual stuff.
>
> I had a look at this. I don't see how I can do it, but you might have ideas.
>
> In this function call I need to pass a pointer without its const bit.
> I made it const since nothing should change the dm root except driver
> model itself.
>
>>> + ret = device_bind_by_name(NULL, &root_info, &DM_ROOT());
>
> In the above line, I don't think I can make it a function. Similarly
> one good think about the function is that I can grep for it easily.
>
> So I'm thinking of using something like this:
>
> /* Cast away any volatile pointer */
> #define DM_ROOT_NON_CONST (((gd_t *)gd)->dm_root)
> #define DM_UCLASS_ROOT_NON_CONST (((gd_t *)gd)->uclass_root)
>
> It is no-longer a function, but I can easily find it. Plus it is
> explicit as to what it is for, with the NON_CONST suffix.

Also I forgot to mention that type-checking is pretty pointless since
it is a hard-coded variable. If someone changed it lots of other code
would break. Also this is an internal dm header file so cannot be
accessed outside driver model core.

Regards,
Simon