diff options
Diffstat (limited to 'Documentation/i2c/writing-clients')
-rw-r--r-- | Documentation/i2c/writing-clients | 16 |
1 files changed, 5 insertions, 11 deletions
diff --git a/Documentation/i2c/writing-clients b/Documentation/i2c/writing-clients index 1882811c7f5d..e94d9c6cc522 100644 --- a/Documentation/i2c/writing-clients +++ b/Documentation/i2c/writing-clients | |||
@@ -55,6 +55,7 @@ be very useful. | |||
55 | An example structure is below. | 55 | An example structure is below. |
56 | 56 | ||
57 | struct foo_data { | 57 | struct foo_data { |
58 | struct i2c_client client; | ||
58 | struct semaphore lock; /* For ISA access in `sensors' drivers. */ | 59 | struct semaphore lock; /* For ISA access in `sensors' drivers. */ |
59 | int sysctl_id; /* To keep the /proc directory entry for | 60 | int sysctl_id; /* To keep the /proc directory entry for |
60 | `sensors' drivers. */ | 61 | `sensors' drivers. */ |
@@ -307,22 +308,15 @@ For now, you can ignore the `flags' parameter. It is there for future use. | |||
307 | client structure, even though we cannot fill it completely yet. | 308 | client structure, even though we cannot fill it completely yet. |
308 | But it allows us to access several i2c functions safely */ | 309 | But it allows us to access several i2c functions safely */ |
309 | 310 | ||
310 | /* Note that we reserve some space for foo_data too. If you don't | 311 | if (!(data = kzalloc(sizeof(struct foo_data), GFP_KERNEL))) { |
311 | need it, remove it. We do it here to help to lessen memory | ||
312 | fragmentation. */ | ||
313 | if (! (new_client = kmalloc(sizeof(struct i2c_client) + | ||
314 | sizeof(struct foo_data), | ||
315 | GFP_KERNEL))) { | ||
316 | err = -ENOMEM; | 312 | err = -ENOMEM; |
317 | goto ERROR0; | 313 | goto ERROR0; |
318 | } | 314 | } |
319 | 315 | ||
320 | /* This is tricky, but it will set the data to the right value. */ | 316 | new_client = &data->client; |
321 | client->data = new_client + 1; | 317 | i2c_set_clientdata(new_client, data); |
322 | data = (struct foo_data *) (client->data); | ||
323 | 318 | ||
324 | new_client->addr = address; | 319 | new_client->addr = address; |
325 | new_client->data = data; | ||
326 | new_client->adapter = adapter; | 320 | new_client->adapter = adapter; |
327 | new_client->driver = &foo_driver; | 321 | new_client->driver = &foo_driver; |
328 | new_client->flags = 0; | 322 | new_client->flags = 0; |
@@ -448,7 +442,7 @@ much simpler than the attachment code, fortunately! | |||
448 | release_region(client->addr,LM78_EXTENT); | 442 | release_region(client->addr,LM78_EXTENT); |
449 | /* HYBRID SENSORS CHIP ONLY END */ | 443 | /* HYBRID SENSORS CHIP ONLY END */ |
450 | 444 | ||
451 | kfree(client); /* Frees client data too, if allocated at the same time */ | 445 | kfree(data); |
452 | return 0; | 446 | return 0; |
453 | } | 447 | } |
454 | 448 | ||