On Fri, 25 Apr 2008, Takashi Iwai wrote:
I see. In this case, I would propose to add a 32-bit "magic" at the start of 'void *' data. How about this modification:
The magic number sounds OK, but funky cast to integer pointer is bad. If you have a long or a pointer after int, you can have an alignment problem on 64bit archs, for example.
Not really. First 32-bit word has offset 0 and next 64-bit word has offset 8 on x86-64. So alignment is OK.
No, suppose the data like
int magic; void *ptr;
and the code to retrive the magic is
magic = *(int*)device_data;
and thus the next data pointer is (int*)device_data + 1. This doesn't work.
+ 1 does not work, but driver can define own private structure and it will work. The point is that 32-bit magic must be always at offset 0.
Anyway, I agree that with a struct, code is more readable without hidden things. Also, drivers can define own struct with magic member as first.
Here is corrected patch:
Hm, but this allows you pass only one value and has an ugly union.
As I mentioned, this structure can be redefined. I can imagine, that drivers won't use predefined structure and create own like:
struct mydata { unsigned int magic; /* required */ unsigned long value1; char *name; int somevalue; };
The only required thing is to have 32-bit magic value at offset 0.
Jaroslav
----- Jaroslav Kysela perex@perex.cz Linux Kernel Sound Maintainer ALSA Project, Red Hat, Inc.