This source file includes following definitions.
- at24_translate_offset
- at24_base_client_dev
- at24_adjust_read_count
- at24_regmap_read
- at24_adjust_write_count
- at24_regmap_write
- at24_read
- at24_write
- at24_get_chip_data
- at24_make_dummy_client
- at24_get_offset_adj
- at24_probe
- at24_remove
- at24_init
- at24_exit
1
2
3
4
5
6
7
8
9 #include <linux/kernel.h>
10 #include <linux/init.h>
11 #include <linux/module.h>
12 #include <linux/of_device.h>
13 #include <linux/slab.h>
14 #include <linux/delay.h>
15 #include <linux/mutex.h>
16 #include <linux/mod_devicetable.h>
17 #include <linux/bitops.h>
18 #include <linux/jiffies.h>
19 #include <linux/property.h>
20 #include <linux/acpi.h>
21 #include <linux/i2c.h>
22 #include <linux/nvmem-provider.h>
23 #include <linux/regmap.h>
24 #include <linux/pm_runtime.h>
25 #include <linux/gpio/consumer.h>
26
27
28 #define AT24_FLAG_ADDR16 BIT(7)
29
30 #define AT24_FLAG_READONLY BIT(6)
31
32 #define AT24_FLAG_IRUGO BIT(5)
33
34 #define AT24_FLAG_TAKE8ADDR BIT(4)
35
36 #define AT24_FLAG_SERIAL BIT(3)
37
38 #define AT24_FLAG_MAC BIT(2)
39
40 #define AT24_FLAG_NO_RDROL BIT(1)
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 struct at24_client {
71 struct i2c_client *client;
72 struct regmap *regmap;
73 };
74
75 struct at24_data {
76
77
78
79
80 struct mutex lock;
81
82 unsigned int write_max;
83 unsigned int num_addresses;
84 unsigned int offset_adj;
85
86 u32 byte_len;
87 u16 page_size;
88 u8 flags;
89
90 struct nvmem_device *nvmem;
91
92 struct gpio_desc *wp_gpio;
93
94
95
96
97
98 struct at24_client client[];
99 };
100
101
102
103
104
105
106
107
108
109
110 static unsigned int at24_io_limit = 128;
111 module_param_named(io_limit, at24_io_limit, uint, 0);
112 MODULE_PARM_DESC(at24_io_limit, "Maximum bytes per I/O (default 128)");
113
114
115
116
117
118 static unsigned int at24_write_timeout = 25;
119 module_param_named(write_timeout, at24_write_timeout, uint, 0);
120 MODULE_PARM_DESC(at24_write_timeout, "Time (in ms) to try writes (default 25)");
121
122 struct at24_chip_data {
123 u32 byte_len;
124 u8 flags;
125 };
126
127 #define AT24_CHIP_DATA(_name, _len, _flags) \
128 static const struct at24_chip_data _name = { \
129 .byte_len = _len, .flags = _flags, \
130 }
131
132
133 AT24_CHIP_DATA(at24_data_24c00, 128 / 8, AT24_FLAG_TAKE8ADDR);
134
135 AT24_CHIP_DATA(at24_data_24c01, 1024 / 8, 0);
136 AT24_CHIP_DATA(at24_data_24cs01, 16,
137 AT24_FLAG_SERIAL | AT24_FLAG_READONLY);
138 AT24_CHIP_DATA(at24_data_24c02, 2048 / 8, 0);
139 AT24_CHIP_DATA(at24_data_24cs02, 16,
140 AT24_FLAG_SERIAL | AT24_FLAG_READONLY);
141 AT24_CHIP_DATA(at24_data_24mac402, 48 / 8,
142 AT24_FLAG_MAC | AT24_FLAG_READONLY);
143 AT24_CHIP_DATA(at24_data_24mac602, 64 / 8,
144 AT24_FLAG_MAC | AT24_FLAG_READONLY);
145
146 AT24_CHIP_DATA(at24_data_spd, 2048 / 8,
147 AT24_FLAG_READONLY | AT24_FLAG_IRUGO);
148 AT24_CHIP_DATA(at24_data_24c04, 4096 / 8, 0);
149 AT24_CHIP_DATA(at24_data_24cs04, 16,
150 AT24_FLAG_SERIAL | AT24_FLAG_READONLY);
151
152 AT24_CHIP_DATA(at24_data_24c08, 8192 / 8, 0);
153 AT24_CHIP_DATA(at24_data_24cs08, 16,
154 AT24_FLAG_SERIAL | AT24_FLAG_READONLY);
155 AT24_CHIP_DATA(at24_data_24c16, 16384 / 8, 0);
156 AT24_CHIP_DATA(at24_data_24cs16, 16,
157 AT24_FLAG_SERIAL | AT24_FLAG_READONLY);
158 AT24_CHIP_DATA(at24_data_24c32, 32768 / 8, AT24_FLAG_ADDR16);
159 AT24_CHIP_DATA(at24_data_24cs32, 16,
160 AT24_FLAG_ADDR16 | AT24_FLAG_SERIAL | AT24_FLAG_READONLY);
161 AT24_CHIP_DATA(at24_data_24c64, 65536 / 8, AT24_FLAG_ADDR16);
162 AT24_CHIP_DATA(at24_data_24cs64, 16,
163 AT24_FLAG_ADDR16 | AT24_FLAG_SERIAL | AT24_FLAG_READONLY);
164 AT24_CHIP_DATA(at24_data_24c128, 131072 / 8, AT24_FLAG_ADDR16);
165 AT24_CHIP_DATA(at24_data_24c256, 262144 / 8, AT24_FLAG_ADDR16);
166 AT24_CHIP_DATA(at24_data_24c512, 524288 / 8, AT24_FLAG_ADDR16);
167 AT24_CHIP_DATA(at24_data_24c1024, 1048576 / 8, AT24_FLAG_ADDR16);
168 AT24_CHIP_DATA(at24_data_24c2048, 2097152 / 8, AT24_FLAG_ADDR16);
169
170 AT24_CHIP_DATA(at24_data_INT3499, 8192 / 8, 0);
171
172 static const struct i2c_device_id at24_ids[] = {
173 { "24c00", (kernel_ulong_t)&at24_data_24c00 },
174 { "24c01", (kernel_ulong_t)&at24_data_24c01 },
175 { "24cs01", (kernel_ulong_t)&at24_data_24cs01 },
176 { "24c02", (kernel_ulong_t)&at24_data_24c02 },
177 { "24cs02", (kernel_ulong_t)&at24_data_24cs02 },
178 { "24mac402", (kernel_ulong_t)&at24_data_24mac402 },
179 { "24mac602", (kernel_ulong_t)&at24_data_24mac602 },
180 { "spd", (kernel_ulong_t)&at24_data_spd },
181 { "24c04", (kernel_ulong_t)&at24_data_24c04 },
182 { "24cs04", (kernel_ulong_t)&at24_data_24cs04 },
183 { "24c08", (kernel_ulong_t)&at24_data_24c08 },
184 { "24cs08", (kernel_ulong_t)&at24_data_24cs08 },
185 { "24c16", (kernel_ulong_t)&at24_data_24c16 },
186 { "24cs16", (kernel_ulong_t)&at24_data_24cs16 },
187 { "24c32", (kernel_ulong_t)&at24_data_24c32 },
188 { "24cs32", (kernel_ulong_t)&at24_data_24cs32 },
189 { "24c64", (kernel_ulong_t)&at24_data_24c64 },
190 { "24cs64", (kernel_ulong_t)&at24_data_24cs64 },
191 { "24c128", (kernel_ulong_t)&at24_data_24c128 },
192 { "24c256", (kernel_ulong_t)&at24_data_24c256 },
193 { "24c512", (kernel_ulong_t)&at24_data_24c512 },
194 { "24c1024", (kernel_ulong_t)&at24_data_24c1024 },
195 { "24c2048", (kernel_ulong_t)&at24_data_24c2048 },
196 { "at24", 0 },
197 { }
198 };
199 MODULE_DEVICE_TABLE(i2c, at24_ids);
200
201 static const struct of_device_id at24_of_match[] = {
202 { .compatible = "atmel,24c00", .data = &at24_data_24c00 },
203 { .compatible = "atmel,24c01", .data = &at24_data_24c01 },
204 { .compatible = "atmel,24cs01", .data = &at24_data_24cs01 },
205 { .compatible = "atmel,24c02", .data = &at24_data_24c02 },
206 { .compatible = "atmel,24cs02", .data = &at24_data_24cs02 },
207 { .compatible = "atmel,24mac402", .data = &at24_data_24mac402 },
208 { .compatible = "atmel,24mac602", .data = &at24_data_24mac602 },
209 { .compatible = "atmel,spd", .data = &at24_data_spd },
210 { .compatible = "atmel,24c04", .data = &at24_data_24c04 },
211 { .compatible = "atmel,24cs04", .data = &at24_data_24cs04 },
212 { .compatible = "atmel,24c08", .data = &at24_data_24c08 },
213 { .compatible = "atmel,24cs08", .data = &at24_data_24cs08 },
214 { .compatible = "atmel,24c16", .data = &at24_data_24c16 },
215 { .compatible = "atmel,24cs16", .data = &at24_data_24cs16 },
216 { .compatible = "atmel,24c32", .data = &at24_data_24c32 },
217 { .compatible = "atmel,24cs32", .data = &at24_data_24cs32 },
218 { .compatible = "atmel,24c64", .data = &at24_data_24c64 },
219 { .compatible = "atmel,24cs64", .data = &at24_data_24cs64 },
220 { .compatible = "atmel,24c128", .data = &at24_data_24c128 },
221 { .compatible = "atmel,24c256", .data = &at24_data_24c256 },
222 { .compatible = "atmel,24c512", .data = &at24_data_24c512 },
223 { .compatible = "atmel,24c1024", .data = &at24_data_24c1024 },
224 { .compatible = "atmel,24c2048", .data = &at24_data_24c2048 },
225 { },
226 };
227 MODULE_DEVICE_TABLE(of, at24_of_match);
228
229 static const struct acpi_device_id at24_acpi_ids[] = {
230 { "INT3499", (kernel_ulong_t)&at24_data_INT3499 },
231 { }
232 };
233 MODULE_DEVICE_TABLE(acpi, at24_acpi_ids);
234
235
236
237
238
239
240
241
242
243
244 static struct at24_client *at24_translate_offset(struct at24_data *at24,
245 unsigned int *offset)
246 {
247 unsigned int i;
248
249 if (at24->flags & AT24_FLAG_ADDR16) {
250 i = *offset >> 16;
251 *offset &= 0xffff;
252 } else {
253 i = *offset >> 8;
254 *offset &= 0xff;
255 }
256
257 return &at24->client[i];
258 }
259
260 static struct device *at24_base_client_dev(struct at24_data *at24)
261 {
262 return &at24->client[0].client->dev;
263 }
264
265 static size_t at24_adjust_read_count(struct at24_data *at24,
266 unsigned int offset, size_t count)
267 {
268 unsigned int bits;
269 size_t remainder;
270
271
272
273
274
275
276 if (at24->flags & AT24_FLAG_NO_RDROL) {
277 bits = (at24->flags & AT24_FLAG_ADDR16) ? 16 : 8;
278 remainder = BIT(bits) - offset;
279 if (count > remainder)
280 count = remainder;
281 }
282
283 if (count > at24_io_limit)
284 count = at24_io_limit;
285
286 return count;
287 }
288
289 static ssize_t at24_regmap_read(struct at24_data *at24, char *buf,
290 unsigned int offset, size_t count)
291 {
292 unsigned long timeout, read_time;
293 struct at24_client *at24_client;
294 struct i2c_client *client;
295 struct regmap *regmap;
296 int ret;
297
298 at24_client = at24_translate_offset(at24, &offset);
299 regmap = at24_client->regmap;
300 client = at24_client->client;
301 count = at24_adjust_read_count(at24, offset, count);
302
303
304 offset += at24->offset_adj;
305
306 timeout = jiffies + msecs_to_jiffies(at24_write_timeout);
307 do {
308
309
310
311
312 read_time = jiffies;
313
314 ret = regmap_bulk_read(regmap, offset, buf, count);
315 dev_dbg(&client->dev, "read %zu@%d --> %d (%ld)\n",
316 count, offset, ret, jiffies);
317 if (!ret)
318 return count;
319
320 usleep_range(1000, 1500);
321 } while (time_before(read_time, timeout));
322
323 return -ETIMEDOUT;
324 }
325
326
327
328
329
330
331
332
333
334
335 static size_t at24_adjust_write_count(struct at24_data *at24,
336 unsigned int offset, size_t count)
337 {
338 unsigned int next_page;
339
340
341 if (count > at24->write_max)
342 count = at24->write_max;
343
344
345 next_page = roundup(offset + 1, at24->page_size);
346 if (offset + count > next_page)
347 count = next_page - offset;
348
349 return count;
350 }
351
352 static ssize_t at24_regmap_write(struct at24_data *at24, const char *buf,
353 unsigned int offset, size_t count)
354 {
355 unsigned long timeout, write_time;
356 struct at24_client *at24_client;
357 struct i2c_client *client;
358 struct regmap *regmap;
359 int ret;
360
361 at24_client = at24_translate_offset(at24, &offset);
362 regmap = at24_client->regmap;
363 client = at24_client->client;
364 count = at24_adjust_write_count(at24, offset, count);
365 timeout = jiffies + msecs_to_jiffies(at24_write_timeout);
366
367 do {
368
369
370
371
372 write_time = jiffies;
373
374 ret = regmap_bulk_write(regmap, offset, buf, count);
375 dev_dbg(&client->dev, "write %zu@%d --> %d (%ld)\n",
376 count, offset, ret, jiffies);
377 if (!ret)
378 return count;
379
380 usleep_range(1000, 1500);
381 } while (time_before(write_time, timeout));
382
383 return -ETIMEDOUT;
384 }
385
386 static int at24_read(void *priv, unsigned int off, void *val, size_t count)
387 {
388 struct at24_data *at24;
389 struct device *dev;
390 char *buf = val;
391 int ret;
392
393 at24 = priv;
394 dev = at24_base_client_dev(at24);
395
396 if (unlikely(!count))
397 return count;
398
399 if (off + count > at24->byte_len)
400 return -EINVAL;
401
402 ret = pm_runtime_get_sync(dev);
403 if (ret < 0) {
404 pm_runtime_put_noidle(dev);
405 return ret;
406 }
407
408
409
410
411
412 mutex_lock(&at24->lock);
413
414 while (count) {
415 ret = at24_regmap_read(at24, buf, off, count);
416 if (ret < 0) {
417 mutex_unlock(&at24->lock);
418 pm_runtime_put(dev);
419 return ret;
420 }
421 buf += ret;
422 off += ret;
423 count -= ret;
424 }
425
426 mutex_unlock(&at24->lock);
427
428 pm_runtime_put(dev);
429
430 return 0;
431 }
432
433 static int at24_write(void *priv, unsigned int off, void *val, size_t count)
434 {
435 struct at24_data *at24;
436 struct device *dev;
437 char *buf = val;
438 int ret;
439
440 at24 = priv;
441 dev = at24_base_client_dev(at24);
442
443 if (unlikely(!count))
444 return -EINVAL;
445
446 if (off + count > at24->byte_len)
447 return -EINVAL;
448
449 ret = pm_runtime_get_sync(dev);
450 if (ret < 0) {
451 pm_runtime_put_noidle(dev);
452 return ret;
453 }
454
455
456
457
458
459 mutex_lock(&at24->lock);
460 gpiod_set_value_cansleep(at24->wp_gpio, 0);
461
462 while (count) {
463 ret = at24_regmap_write(at24, buf, off, count);
464 if (ret < 0) {
465 gpiod_set_value_cansleep(at24->wp_gpio, 1);
466 mutex_unlock(&at24->lock);
467 pm_runtime_put(dev);
468 return ret;
469 }
470 buf += ret;
471 off += ret;
472 count -= ret;
473 }
474
475 gpiod_set_value_cansleep(at24->wp_gpio, 1);
476 mutex_unlock(&at24->lock);
477
478 pm_runtime_put(dev);
479
480 return 0;
481 }
482
483 static const struct at24_chip_data *at24_get_chip_data(struct device *dev)
484 {
485 struct device_node *of_node = dev->of_node;
486 const struct at24_chip_data *cdata;
487 const struct i2c_device_id *id;
488
489 id = i2c_match_id(at24_ids, to_i2c_client(dev));
490
491
492
493
494
495
496 if (of_node && of_match_device(at24_of_match, dev))
497 cdata = of_device_get_match_data(dev);
498 else if (id)
499 cdata = (void *)id->driver_data;
500 else
501 cdata = acpi_device_get_match_data(dev);
502
503 if (!cdata)
504 return ERR_PTR(-ENODEV);
505
506 return cdata;
507 }
508
509 static int at24_make_dummy_client(struct at24_data *at24, unsigned int index,
510 struct regmap_config *regmap_config)
511 {
512 struct i2c_client *base_client, *dummy_client;
513 struct regmap *regmap;
514 struct device *dev;
515
516 base_client = at24->client[0].client;
517 dev = &base_client->dev;
518
519 dummy_client = devm_i2c_new_dummy_device(dev, base_client->adapter,
520 base_client->addr + index);
521 if (IS_ERR(dummy_client))
522 return PTR_ERR(dummy_client);
523
524 regmap = devm_regmap_init_i2c(dummy_client, regmap_config);
525 if (IS_ERR(regmap))
526 return PTR_ERR(regmap);
527
528 at24->client[index].client = dummy_client;
529 at24->client[index].regmap = regmap;
530
531 return 0;
532 }
533
534 static unsigned int at24_get_offset_adj(u8 flags, unsigned int byte_len)
535 {
536 if (flags & AT24_FLAG_MAC) {
537
538 return 0xa0 - byte_len;
539 } else if (flags & AT24_FLAG_SERIAL && flags & AT24_FLAG_ADDR16) {
540
541
542
543
544
545 return 0x0800;
546 } else if (flags & AT24_FLAG_SERIAL) {
547
548
549
550
551 return 0x0080;
552 } else {
553 return 0;
554 }
555 }
556
557 static int at24_probe(struct i2c_client *client)
558 {
559 struct regmap_config regmap_config = { };
560 struct nvmem_config nvmem_config = { };
561 u32 byte_len, page_size, flags, addrw;
562 const struct at24_chip_data *cdata;
563 struct device *dev = &client->dev;
564 bool i2c_fn_i2c, i2c_fn_block;
565 unsigned int i, num_addresses;
566 struct at24_data *at24;
567 struct regmap *regmap;
568 bool writable;
569 u8 test_byte;
570 int err;
571
572 i2c_fn_i2c = i2c_check_functionality(client->adapter, I2C_FUNC_I2C);
573 i2c_fn_block = i2c_check_functionality(client->adapter,
574 I2C_FUNC_SMBUS_WRITE_I2C_BLOCK);
575
576 cdata = at24_get_chip_data(dev);
577 if (IS_ERR(cdata))
578 return PTR_ERR(cdata);
579
580 err = device_property_read_u32(dev, "pagesize", &page_size);
581 if (err)
582
583
584
585
586
587 page_size = 1;
588
589 flags = cdata->flags;
590 if (device_property_present(dev, "read-only"))
591 flags |= AT24_FLAG_READONLY;
592 if (device_property_present(dev, "no-read-rollover"))
593 flags |= AT24_FLAG_NO_RDROL;
594
595 err = device_property_read_u32(dev, "address-width", &addrw);
596 if (!err) {
597 switch (addrw) {
598 case 8:
599 if (flags & AT24_FLAG_ADDR16)
600 dev_warn(dev,
601 "Override address width to be 8, while default is 16\n");
602 flags &= ~AT24_FLAG_ADDR16;
603 break;
604 case 16:
605 flags |= AT24_FLAG_ADDR16;
606 break;
607 default:
608 dev_warn(dev, "Bad \"address-width\" property: %u\n",
609 addrw);
610 }
611 }
612
613 err = device_property_read_u32(dev, "size", &byte_len);
614 if (err)
615 byte_len = cdata->byte_len;
616
617 if (!i2c_fn_i2c && !i2c_fn_block)
618 page_size = 1;
619
620 if (!page_size) {
621 dev_err(dev, "page_size must not be 0!\n");
622 return -EINVAL;
623 }
624
625 if (!is_power_of_2(page_size))
626 dev_warn(dev, "page_size looks suspicious (no power of 2)!\n");
627
628 err = device_property_read_u32(dev, "num-addresses", &num_addresses);
629 if (err) {
630 if (flags & AT24_FLAG_TAKE8ADDR)
631 num_addresses = 8;
632 else
633 num_addresses = DIV_ROUND_UP(byte_len,
634 (flags & AT24_FLAG_ADDR16) ? 65536 : 256);
635 }
636
637 if ((flags & AT24_FLAG_SERIAL) && (flags & AT24_FLAG_MAC)) {
638 dev_err(dev,
639 "invalid device data - cannot have both AT24_FLAG_SERIAL & AT24_FLAG_MAC.");
640 return -EINVAL;
641 }
642
643 regmap_config.val_bits = 8;
644 regmap_config.reg_bits = (flags & AT24_FLAG_ADDR16) ? 16 : 8;
645 regmap_config.disable_locking = true;
646
647 regmap = devm_regmap_init_i2c(client, ®map_config);
648 if (IS_ERR(regmap))
649 return PTR_ERR(regmap);
650
651 at24 = devm_kzalloc(dev, struct_size(at24, client, num_addresses),
652 GFP_KERNEL);
653 if (!at24)
654 return -ENOMEM;
655
656 mutex_init(&at24->lock);
657 at24->byte_len = byte_len;
658 at24->page_size = page_size;
659 at24->flags = flags;
660 at24->num_addresses = num_addresses;
661 at24->offset_adj = at24_get_offset_adj(flags, byte_len);
662 at24->client[0].client = client;
663 at24->client[0].regmap = regmap;
664
665 at24->wp_gpio = devm_gpiod_get_optional(dev, "wp", GPIOD_OUT_HIGH);
666 if (IS_ERR(at24->wp_gpio))
667 return PTR_ERR(at24->wp_gpio);
668
669 writable = !(flags & AT24_FLAG_READONLY);
670 if (writable) {
671 at24->write_max = min_t(unsigned int,
672 page_size, at24_io_limit);
673 if (!i2c_fn_i2c && at24->write_max > I2C_SMBUS_BLOCK_MAX)
674 at24->write_max = I2C_SMBUS_BLOCK_MAX;
675 }
676
677
678 for (i = 1; i < num_addresses; i++) {
679 err = at24_make_dummy_client(at24, i, ®map_config);
680 if (err)
681 return err;
682 }
683
684 nvmem_config.name = dev_name(dev);
685 nvmem_config.dev = dev;
686 nvmem_config.read_only = !writable;
687 nvmem_config.root_only = !(flags & AT24_FLAG_IRUGO);
688 nvmem_config.owner = THIS_MODULE;
689 nvmem_config.compat = true;
690 nvmem_config.base_dev = dev;
691 nvmem_config.reg_read = at24_read;
692 nvmem_config.reg_write = at24_write;
693 nvmem_config.priv = at24;
694 nvmem_config.stride = 1;
695 nvmem_config.word_size = 1;
696 nvmem_config.size = byte_len;
697
698 at24->nvmem = devm_nvmem_register(dev, &nvmem_config);
699 if (IS_ERR(at24->nvmem))
700 return PTR_ERR(at24->nvmem);
701
702 i2c_set_clientdata(client, at24);
703
704
705 pm_runtime_set_active(dev);
706 pm_runtime_enable(dev);
707
708
709
710
711
712 err = at24_read(at24, 0, &test_byte, 1);
713 pm_runtime_idle(dev);
714 if (err) {
715 pm_runtime_disable(dev);
716 return -ENODEV;
717 }
718
719 dev_info(dev, "%u byte %s EEPROM, %s, %u bytes/write\n",
720 byte_len, client->name,
721 writable ? "writable" : "read-only", at24->write_max);
722
723 return 0;
724 }
725
726 static int at24_remove(struct i2c_client *client)
727 {
728 pm_runtime_disable(&client->dev);
729 pm_runtime_set_suspended(&client->dev);
730
731 return 0;
732 }
733
734 static struct i2c_driver at24_driver = {
735 .driver = {
736 .name = "at24",
737 .of_match_table = at24_of_match,
738 .acpi_match_table = ACPI_PTR(at24_acpi_ids),
739 },
740 .probe_new = at24_probe,
741 .remove = at24_remove,
742 .id_table = at24_ids,
743 };
744
745 static int __init at24_init(void)
746 {
747 if (!at24_io_limit) {
748 pr_err("at24: at24_io_limit must not be 0!\n");
749 return -EINVAL;
750 }
751
752 at24_io_limit = rounddown_pow_of_two(at24_io_limit);
753 return i2c_add_driver(&at24_driver);
754 }
755 module_init(at24_init);
756
757 static void __exit at24_exit(void)
758 {
759 i2c_del_driver(&at24_driver);
760 }
761 module_exit(at24_exit);
762
763 MODULE_DESCRIPTION("Driver for most I2C EEPROMs");
764 MODULE_AUTHOR("David Brownell and Wolfram Sang");
765 MODULE_LICENSE("GPL");