1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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#include <linux/kernel.h>
71#include <linux/init.h>
72#include <linux/module.h>
73#include <linux/types.h>
74#include <linux/sizes.h>
75#include <linux/slab.h>
76#include <linux/mutex.h>
77#include <linux/sysfs.h>
78#include <linux/debugfs.h>
79#include <linux/mod_devicetable.h>
80#include <linux/property.h>
81#include <linux/i2c.h>
82#include <linux/pci_ids.h>
83#include <linux/delay.h>
84
85#define IDT_NAME "89hpesx"
86#define IDT_89HPESX_DESC "IDT 89HPESx SMBus-slave interface driver"
87#define IDT_89HPESX_VER "1.0"
88
89MODULE_DESCRIPTION(IDT_89HPESX_DESC);
90MODULE_VERSION(IDT_89HPESX_VER);
91MODULE_LICENSE("GPL v2");
92MODULE_AUTHOR("T-platforms");
93
94
95
96
97static struct dentry *csr_dbgdir;
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120struct idt_smb_seq;
121struct idt_89hpesx_dev {
122 u32 eesize;
123 bool eero;
124 u8 eeaddr;
125
126 u8 inieecmd;
127 u8 inicsrcmd;
128 u8 iniccode;
129
130 u16 csr;
131
132 int (*smb_write)(struct idt_89hpesx_dev *, const struct idt_smb_seq *);
133 int (*smb_read)(struct idt_89hpesx_dev *, struct idt_smb_seq *);
134 struct mutex smb_mtx;
135
136 struct i2c_client *client;
137
138 struct bin_attribute *ee_file;
139 struct dentry *csr_dir;
140 struct dentry *csr_file;
141};
142
143
144
145
146
147
148
149struct idt_smb_seq {
150 u8 ccode;
151 u8 bytecnt;
152 u8 *data;
153};
154
155
156
157
158
159
160
161
162struct idt_eeprom_seq {
163 u8 cmd;
164 u8 eeaddr;
165 u16 memaddr;
166 u8 data;
167} __packed;
168
169
170
171
172
173
174
175struct idt_csr_seq {
176 u8 cmd;
177 u16 csraddr;
178 u32 data;
179} __packed;
180
181
182
183
184
185
186
187
188
189
190
191
192#define CCODE_END ((u8)0x01)
193#define CCODE_START ((u8)0x02)
194#define CCODE_CSR ((u8)0x00)
195#define CCODE_EEPROM ((u8)0x04)
196#define CCODE_BYTE ((u8)0x00)
197#define CCODE_WORD ((u8)0x20)
198#define CCODE_BLOCK ((u8)0x40)
199#define CCODE_PEC ((u8)0x80)
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216#define EEPROM_OP_WRITE ((u8)0x00)
217#define EEPROM_OP_READ ((u8)0x01)
218#define EEPROM_USA ((u8)0x02)
219#define EEPROM_NAERR ((u8)0x08)
220#define EEPROM_LAERR ((u8)0x10)
221#define EEPROM_MSS ((u8)0x20)
222#define EEPROM_WR_CNT ((u8)5)
223#define EEPROM_WRRD_CNT ((u8)4)
224#define EEPROM_RD_CNT ((u8)5)
225#define EEPROM_DEF_SIZE ((u16)4096)
226#define EEPROM_DEF_ADDR ((u8)0x50)
227#define EEPROM_TOUT (100)
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243#define CSR_DWE ((u8)0x0F)
244#define CSR_OP_WRITE ((u8)0x00)
245#define CSR_OP_READ ((u8)0x10)
246#define CSR_RERR ((u8)0x40)
247#define CSR_WERR ((u8)0x80)
248#define CSR_WR_CNT ((u8)7)
249#define CSR_WRRD_CNT ((u8)3)
250#define CSR_RD_CNT ((u8)7)
251#define CSR_MAX ((u32)0x3FFFF)
252#define CSR_DEF ((u16)0x0000)
253#define CSR_REAL_ADDR(val) ((unsigned int)val << 2)
254
255
256
257
258
259
260#define IDT_VIDDID_CSR ((u32)0x0000)
261#define IDT_VID_MASK ((u32)0xFFFF)
262
263
264
265
266
267
268
269
270#define RETRY_CNT (128)
271#define idt_smb_safe(ops, args...) ({ \
272 int __retry = RETRY_CNT; \
273 s32 __sts; \
274 do { \
275 __sts = i2c_smbus_ ## ops ## _data(args); \
276 } while (__retry-- && __sts < 0); \
277 __sts; \
278})
279
280
281
282
283
284
285
286
287
288
289
290
291static int idt_smb_write_byte(struct idt_89hpesx_dev *pdev,
292 const struct idt_smb_seq *seq)
293{
294 s32 sts;
295 u8 ccode;
296 int idx;
297
298
299 for (idx = 0; idx < seq->bytecnt; idx++) {
300
301 ccode = seq->ccode | CCODE_BYTE;
302 if (idx == 0)
303 ccode |= CCODE_START;
304 if (idx == seq->bytecnt - 1)
305 ccode |= CCODE_END;
306
307
308 sts = idt_smb_safe(write_byte, pdev->client, ccode,
309 seq->data[idx]);
310 if (sts != 0)
311 return (int)sts;
312 }
313
314 return 0;
315}
316
317
318
319
320
321
322
323static int idt_smb_read_byte(struct idt_89hpesx_dev *pdev,
324 struct idt_smb_seq *seq)
325{
326 s32 sts;
327 u8 ccode;
328 int idx;
329
330
331 for (idx = 0; idx < seq->bytecnt; idx++) {
332
333 ccode = seq->ccode | CCODE_BYTE;
334 if (idx == 0)
335 ccode |= CCODE_START;
336 if (idx == seq->bytecnt - 1)
337 ccode |= CCODE_END;
338
339
340 sts = idt_smb_safe(read_byte, pdev->client, ccode);
341 if (sts < 0)
342 return (int)sts;
343
344 seq->data[idx] = (u8)sts;
345 }
346
347 return 0;
348}
349
350
351
352
353
354
355
356static int idt_smb_write_word(struct idt_89hpesx_dev *pdev,
357 const struct idt_smb_seq *seq)
358{
359 s32 sts;
360 u8 ccode;
361 int idx, evencnt;
362
363
364 evencnt = seq->bytecnt - (seq->bytecnt % 2);
365
366
367 for (idx = 0; idx < evencnt; idx += 2) {
368
369 ccode = seq->ccode | CCODE_WORD;
370 if (idx == 0)
371 ccode |= CCODE_START;
372 if (idx == evencnt - 2)
373 ccode |= CCODE_END;
374
375
376 sts = idt_smb_safe(write_word, pdev->client, ccode,
377 *(u16 *)&seq->data[idx]);
378 if (sts != 0)
379 return (int)sts;
380 }
381
382
383 if (seq->bytecnt != evencnt) {
384
385 ccode = seq->ccode | CCODE_BYTE | CCODE_END;
386 if (idx == 0)
387 ccode |= CCODE_START;
388
389
390 sts = idt_smb_safe(write_byte, pdev->client, ccode,
391 seq->data[idx]);
392 if (sts != 0)
393 return (int)sts;
394 }
395
396 return 0;
397}
398
399
400
401
402
403
404
405static int idt_smb_read_word(struct idt_89hpesx_dev *pdev,
406 struct idt_smb_seq *seq)
407{
408 s32 sts;
409 u8 ccode;
410 int idx, evencnt;
411
412
413 evencnt = seq->bytecnt - (seq->bytecnt % 2);
414
415
416 for (idx = 0; idx < evencnt; idx += 2) {
417
418 ccode = seq->ccode | CCODE_WORD;
419 if (idx == 0)
420 ccode |= CCODE_START;
421 if (idx == evencnt - 2)
422 ccode |= CCODE_END;
423
424
425 sts = idt_smb_safe(read_word, pdev->client, ccode);
426 if (sts < 0)
427 return (int)sts;
428
429 *(u16 *)&seq->data[idx] = (u16)sts;
430 }
431
432
433 if (seq->bytecnt != evencnt) {
434
435 ccode = seq->ccode | CCODE_BYTE | CCODE_END;
436 if (idx == 0)
437 ccode |= CCODE_START;
438
439
440 sts = idt_smb_safe(read_byte, pdev->client, ccode);
441 if (sts < 0)
442 return (int)sts;
443
444 seq->data[idx] = (u8)sts;
445 }
446
447 return 0;
448}
449
450
451
452
453
454
455
456static int idt_smb_write_block(struct idt_89hpesx_dev *pdev,
457 const struct idt_smb_seq *seq)
458{
459 u8 ccode;
460
461
462 if (seq->bytecnt > I2C_SMBUS_BLOCK_MAX)
463 return -EINVAL;
464
465
466 ccode = seq->ccode | CCODE_BLOCK | CCODE_START | CCODE_END;
467
468
469 return idt_smb_safe(write_block, pdev->client, ccode, seq->bytecnt,
470 seq->data);
471}
472
473
474
475
476
477
478
479static int idt_smb_read_block(struct idt_89hpesx_dev *pdev,
480 struct idt_smb_seq *seq)
481{
482 s32 sts;
483 u8 ccode;
484
485
486 if (seq->bytecnt > I2C_SMBUS_BLOCK_MAX)
487 return -EINVAL;
488
489
490 ccode = seq->ccode | CCODE_BLOCK | CCODE_START | CCODE_END;
491
492
493 sts = idt_smb_safe(read_block, pdev->client, ccode, seq->data);
494 if (sts != seq->bytecnt)
495 return (sts < 0 ? sts : -ENODATA);
496
497 return 0;
498}
499
500
501
502
503
504
505
506
507
508
509static int idt_smb_write_i2c_block(struct idt_89hpesx_dev *pdev,
510 const struct idt_smb_seq *seq)
511{
512 u8 ccode, buf[I2C_SMBUS_BLOCK_MAX + 1];
513
514
515 if (seq->bytecnt > I2C_SMBUS_BLOCK_MAX)
516 return -EINVAL;
517
518
519 buf[0] = seq->bytecnt;
520 memcpy(&buf[1], seq->data, seq->bytecnt);
521
522
523 ccode = seq->ccode | CCODE_BLOCK | CCODE_START | CCODE_END;
524
525
526 return idt_smb_safe(write_i2c_block, pdev->client, ccode,
527 seq->bytecnt + 1, buf);
528}
529
530
531
532
533
534
535
536
537
538
539static int idt_smb_read_i2c_block(struct idt_89hpesx_dev *pdev,
540 struct idt_smb_seq *seq)
541{
542 u8 ccode, buf[I2C_SMBUS_BLOCK_MAX + 1];
543 s32 sts;
544
545
546 if (seq->bytecnt > I2C_SMBUS_BLOCK_MAX)
547 return -EINVAL;
548
549
550 ccode = seq->ccode | CCODE_BLOCK | CCODE_START | CCODE_END;
551
552
553 sts = idt_smb_safe(read_i2c_block, pdev->client, ccode,
554 seq->bytecnt + 1, buf);
555 if (sts != seq->bytecnt + 1)
556 return (sts < 0 ? sts : -ENODATA);
557 if (buf[0] != seq->bytecnt)
558 return -ENODATA;
559
560
561 memcpy(seq->data, &buf[1], seq->bytecnt);
562
563 return 0;
564}
565
566
567
568
569
570
571
572
573
574
575
576
577static int idt_eeprom_read_byte(struct idt_89hpesx_dev *pdev, u16 memaddr,
578 u8 *data)
579{
580 struct device *dev = &pdev->client->dev;
581 struct idt_eeprom_seq eeseq;
582 struct idt_smb_seq smbseq;
583 int ret, retry;
584
585
586 smbseq.ccode = pdev->iniccode | CCODE_EEPROM;
587 smbseq.data = (u8 *)&eeseq;
588
589
590
591
592
593 retry = RETRY_CNT;
594 do {
595
596 smbseq.bytecnt = EEPROM_WRRD_CNT;
597 eeseq.cmd = pdev->inieecmd | EEPROM_OP_READ;
598 eeseq.eeaddr = pdev->eeaddr;
599 eeseq.memaddr = cpu_to_le16(memaddr);
600 ret = pdev->smb_write(pdev, &smbseq);
601 if (ret != 0) {
602 dev_err(dev, "Failed to init eeprom addr 0x%02hhx",
603 memaddr);
604 break;
605 }
606
607
608 smbseq.bytecnt = EEPROM_RD_CNT;
609 ret = pdev->smb_read(pdev, &smbseq);
610 if (ret != 0) {
611 dev_err(dev, "Failed to read eeprom data 0x%02hhx",
612 memaddr);
613 break;
614 }
615
616
617 if (retry && (eeseq.cmd & EEPROM_NAERR)) {
618 dev_dbg(dev, "EEPROM busy, retry reading after %d ms",
619 EEPROM_TOUT);
620 msleep(EEPROM_TOUT);
621 continue;
622 }
623
624
625 if (eeseq.cmd & (EEPROM_NAERR | EEPROM_LAERR | EEPROM_MSS)) {
626 dev_err(dev,
627 "Communication with eeprom failed, cmd 0x%hhx",
628 eeseq.cmd);
629 ret = -EREMOTEIO;
630 break;
631 }
632
633
634 *data = eeseq.data;
635 break;
636 } while (retry--);
637
638
639 return ret;
640}
641
642
643
644
645
646
647
648
649static int idt_eeprom_write(struct idt_89hpesx_dev *pdev, u16 memaddr, u16 len,
650 const u8 *data)
651{
652 struct device *dev = &pdev->client->dev;
653 struct idt_eeprom_seq eeseq;
654 struct idt_smb_seq smbseq;
655 int ret;
656 u16 idx;
657
658
659 smbseq.ccode = pdev->iniccode | CCODE_EEPROM;
660 smbseq.data = (u8 *)&eeseq;
661
662
663 for (idx = 0; idx < len; idx++, memaddr++) {
664
665 mutex_lock(&pdev->smb_mtx);
666
667
668 smbseq.bytecnt = EEPROM_WR_CNT;
669 eeseq.cmd = pdev->inieecmd | EEPROM_OP_WRITE;
670 eeseq.eeaddr = pdev->eeaddr;
671 eeseq.memaddr = cpu_to_le16(memaddr);
672 eeseq.data = data[idx];
673 ret = pdev->smb_write(pdev, &smbseq);
674 if (ret != 0) {
675 dev_err(dev,
676 "Failed to write 0x%04hx:0x%02hhx to eeprom",
677 memaddr, data[idx]);
678 goto err_mutex_unlock;
679 }
680
681
682
683
684
685 eeseq.data = ~data[idx];
686 ret = idt_eeprom_read_byte(pdev, memaddr, &eeseq.data);
687 if (ret != 0)
688 goto err_mutex_unlock;
689
690
691 if (eeseq.data != data[idx]) {
692 dev_err(dev, "Values don't match 0x%02hhx != 0x%02hhx",
693 eeseq.data, data[idx]);
694 ret = -EREMOTEIO;
695 goto err_mutex_unlock;
696 }
697
698
699err_mutex_unlock:
700 mutex_unlock(&pdev->smb_mtx);
701 if (ret != 0)
702 return ret;
703 }
704
705 return 0;
706}
707
708
709
710
711
712
713
714
715static int idt_eeprom_read(struct idt_89hpesx_dev *pdev, u16 memaddr, u16 len,
716 u8 *buf)
717{
718 int ret;
719 u16 idx;
720
721
722 for (idx = 0; idx < len; idx++, memaddr++) {
723
724 mutex_lock(&pdev->smb_mtx);
725
726
727 ret = idt_eeprom_read_byte(pdev, memaddr, &buf[idx]);
728
729
730 mutex_unlock(&pdev->smb_mtx);
731
732
733 if (ret != 0)
734 return ret;
735 }
736
737 return 0;
738}
739
740
741
742
743
744
745
746
747
748
749
750
751static int idt_csr_write(struct idt_89hpesx_dev *pdev, u16 csraddr,
752 const u32 data)
753{
754 struct device *dev = &pdev->client->dev;
755 struct idt_csr_seq csrseq;
756 struct idt_smb_seq smbseq;
757 int ret;
758
759
760 smbseq.ccode = pdev->iniccode | CCODE_CSR;
761 smbseq.data = (u8 *)&csrseq;
762
763
764 mutex_lock(&pdev->smb_mtx);
765
766
767 smbseq.bytecnt = CSR_WR_CNT;
768 csrseq.cmd = pdev->inicsrcmd | CSR_OP_WRITE;
769 csrseq.csraddr = cpu_to_le16(csraddr);
770 csrseq.data = cpu_to_le32(data);
771 ret = pdev->smb_write(pdev, &smbseq);
772 if (ret != 0) {
773 dev_err(dev, "Failed to write 0x%04x: 0x%04x to csr",
774 CSR_REAL_ADDR(csraddr), data);
775 goto err_mutex_unlock;
776 }
777
778
779 smbseq.bytecnt = CSR_WRRD_CNT;
780 csrseq.cmd = pdev->inicsrcmd | CSR_OP_READ;
781 ret = pdev->smb_write(pdev, &smbseq);
782 if (ret != 0) {
783 dev_err(dev, "Failed to init csr address 0x%04x",
784 CSR_REAL_ADDR(csraddr));
785 goto err_mutex_unlock;
786 }
787
788
789 smbseq.bytecnt = CSR_RD_CNT;
790 ret = pdev->smb_read(pdev, &smbseq);
791 if (ret != 0) {
792 dev_err(dev, "Failed to read csr 0x%04x",
793 CSR_REAL_ADDR(csraddr));
794 goto err_mutex_unlock;
795 }
796
797
798 if (csrseq.cmd & (CSR_RERR | CSR_WERR)) {
799 dev_err(dev, "IDT failed to perform CSR r/w");
800 ret = -EREMOTEIO;
801 goto err_mutex_unlock;
802 }
803
804
805err_mutex_unlock:
806 mutex_unlock(&pdev->smb_mtx);
807
808 return ret;
809}
810
811
812
813
814
815
816
817static int idt_csr_read(struct idt_89hpesx_dev *pdev, u16 csraddr, u32 *data)
818{
819 struct device *dev = &pdev->client->dev;
820 struct idt_csr_seq csrseq;
821 struct idt_smb_seq smbseq;
822 int ret;
823
824
825 smbseq.ccode = pdev->iniccode | CCODE_CSR;
826 smbseq.data = (u8 *)&csrseq;
827
828
829 mutex_lock(&pdev->smb_mtx);
830
831
832 smbseq.bytecnt = CSR_WRRD_CNT;
833 csrseq.cmd = pdev->inicsrcmd | CSR_OP_READ;
834 csrseq.csraddr = cpu_to_le16(csraddr);
835 ret = pdev->smb_write(pdev, &smbseq);
836 if (ret != 0) {
837 dev_err(dev, "Failed to init csr address 0x%04x",
838 CSR_REAL_ADDR(csraddr));
839 goto err_mutex_unlock;
840 }
841
842
843 smbseq.bytecnt = CSR_RD_CNT;
844 ret = pdev->smb_read(pdev, &smbseq);
845 if (ret != 0) {
846 dev_err(dev, "Failed to read csr 0x%04hx",
847 CSR_REAL_ADDR(csraddr));
848 goto err_mutex_unlock;
849 }
850
851
852 if (csrseq.cmd & (CSR_RERR | CSR_WERR)) {
853 dev_err(dev, "IDT failed to perform CSR r/w");
854 ret = -EREMOTEIO;
855 goto err_mutex_unlock;
856 }
857
858
859 *data = le32_to_cpu(csrseq.data);
860
861
862err_mutex_unlock:
863 mutex_unlock(&pdev->smb_mtx);
864
865 return ret;
866}
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882static ssize_t eeprom_write(struct file *filp, struct kobject *kobj,
883 struct bin_attribute *attr,
884 char *buf, loff_t off, size_t count)
885{
886 struct idt_89hpesx_dev *pdev;
887 int ret;
888
889
890 pdev = dev_get_drvdata(kobj_to_dev(kobj));
891
892
893 ret = idt_eeprom_write(pdev, (u16)off, (u16)count, (u8 *)buf);
894 return (ret != 0 ? ret : count);
895}
896
897
898
899
900
901
902
903
904
905
906static ssize_t eeprom_read(struct file *filp, struct kobject *kobj,
907 struct bin_attribute *attr,
908 char *buf, loff_t off, size_t count)
909{
910 struct idt_89hpesx_dev *pdev;
911 int ret;
912
913
914 pdev = dev_get_drvdata(kobj_to_dev(kobj));
915
916
917 ret = idt_eeprom_read(pdev, (u16)off, (u16)count, (u8 *)buf);
918 return (ret != 0 ? ret : count);
919}
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936static ssize_t idt_dbgfs_csr_write(struct file *filep, const char __user *ubuf,
937 size_t count, loff_t *offp)
938{
939 struct idt_89hpesx_dev *pdev = filep->private_data;
940 char *colon_ch, *csraddr_str, *csrval_str;
941 int ret, csraddr_len;
942 u32 csraddr, csrval;
943 char *buf;
944
945
946 buf = kmalloc(count + 1, GFP_KERNEL);
947 if (!buf)
948 return -ENOMEM;
949
950 ret = simple_write_to_buffer(buf, count, offp, ubuf, count);
951 if (ret < 0)
952 goto free_buf;
953 buf[count] = 0;
954
955
956 colon_ch = strnchr(buf, count, ':');
957
958
959
960
961
962
963
964 if (colon_ch != NULL) {
965 csraddr_len = colon_ch - buf;
966 csraddr_str =
967 kmalloc(csraddr_len + 1, GFP_KERNEL);
968 if (csraddr_str == NULL) {
969 ret = -ENOMEM;
970 goto free_buf;
971 }
972
973 strncpy(csraddr_str, buf, csraddr_len);
974 csraddr_str[csraddr_len] = '\0';
975
976 csrval_str = colon_ch + 1;
977 } else {
978 csraddr_str = (char *)buf;
979 csraddr_len = strnlen(csraddr_str, count);
980 csrval_str = NULL;
981 }
982
983
984 ret = kstrtou32(csraddr_str, 0, &csraddr);
985 if (ret != 0)
986 goto free_csraddr_str;
987
988
989 if (csraddr > CSR_MAX || !IS_ALIGNED(csraddr, SZ_4)) {
990 ret = -EINVAL;
991 goto free_csraddr_str;
992 }
993
994
995 pdev->csr = (csraddr >> 2);
996
997
998 if (colon_ch != NULL) {
999 ret = kstrtou32(csrval_str, 0, &csrval);
1000 if (ret != 0)
1001 goto free_csraddr_str;
1002
1003 ret = idt_csr_write(pdev, pdev->csr, csrval);
1004 if (ret != 0)
1005 goto free_csraddr_str;
1006 }
1007
1008
1009free_csraddr_str:
1010 if (colon_ch != NULL)
1011 kfree(csraddr_str);
1012
1013
1014free_buf:
1015 kfree(buf);
1016
1017 return (ret != 0 ? ret : count);
1018}
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029#define CSRBUF_SIZE ((size_t)32)
1030static ssize_t idt_dbgfs_csr_read(struct file *filep, char __user *ubuf,
1031 size_t count, loff_t *offp)
1032{
1033 struct idt_89hpesx_dev *pdev = filep->private_data;
1034 u32 csraddr, csrval;
1035 char buf[CSRBUF_SIZE];
1036 int ret, size;
1037
1038
1039 ret = idt_csr_read(pdev, pdev->csr, &csrval);
1040 if (ret != 0)
1041 return ret;
1042
1043
1044 csraddr = ((u32)pdev->csr << 2);
1045
1046
1047 size = snprintf(buf, CSRBUF_SIZE, "0x%05x:0x%08x\n",
1048 (unsigned int)csraddr, (unsigned int)csrval);
1049
1050
1051 return simple_read_from_buffer(ubuf, count, offp, buf, size);
1052}
1053
1054
1055
1056
1057
1058
1059
1060static BIN_ATTR_RW(eeprom, EEPROM_DEF_SIZE);
1061
1062
1063
1064
1065static const struct file_operations csr_dbgfs_ops = {
1066 .owner = THIS_MODULE,
1067 .open = simple_open,
1068 .write = idt_dbgfs_csr_write,
1069 .read = idt_dbgfs_csr_read
1070};
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081static void idt_set_defval(struct idt_89hpesx_dev *pdev)
1082{
1083
1084 pdev->eesize = 0;
1085 pdev->eero = true;
1086 pdev->inieecmd = 0;
1087 pdev->eeaddr = 0;
1088}
1089
1090static const struct i2c_device_id ee_ids[];
1091
1092
1093
1094
1095static const struct i2c_device_id *idt_ee_match_id(struct fwnode_handle *fwnode)
1096{
1097 const struct i2c_device_id *id = ee_ids;
1098 const char *compatible, *p;
1099 char devname[I2C_NAME_SIZE];
1100 int ret;
1101
1102 ret = fwnode_property_read_string(fwnode, "compatible", &compatible);
1103 if (ret)
1104 return NULL;
1105
1106 p = strchr(compatible, ',');
1107 strlcpy(devname, p ? p + 1 : compatible, sizeof(devname));
1108
1109 while (id->name[0]) {
1110 if (strcmp(devname, id->name) == 0)
1111 return id;
1112 id++;
1113 }
1114 return NULL;
1115}
1116
1117
1118
1119
1120
1121static void idt_get_fw_data(struct idt_89hpesx_dev *pdev)
1122{
1123 struct device *dev = &pdev->client->dev;
1124 struct fwnode_handle *fwnode;
1125 const struct i2c_device_id *ee_id = NULL;
1126 u32 eeprom_addr;
1127 int ret;
1128
1129 device_for_each_child_node(dev, fwnode) {
1130 ee_id = idt_ee_match_id(fwnode);
1131 if (!ee_id) {
1132 dev_warn(dev, "Skip unsupported EEPROM device");
1133 continue;
1134 } else
1135 break;
1136 }
1137
1138
1139 if (!ee_id) {
1140 dev_warn(dev, "No fwnode, EEPROM access disabled");
1141 idt_set_defval(pdev);
1142 return;
1143 }
1144
1145
1146 pdev->eesize = (u32)ee_id->driver_data;
1147
1148
1149 ret = fwnode_property_read_u32(fwnode, "reg", &eeprom_addr);
1150 if (ret || (eeprom_addr == 0)) {
1151 dev_warn(dev, "No EEPROM reg found, use default address 0x%x",
1152 EEPROM_DEF_ADDR);
1153 pdev->inieecmd = 0;
1154 pdev->eeaddr = EEPROM_DEF_ADDR << 1;
1155 } else {
1156 pdev->inieecmd = EEPROM_USA;
1157 pdev->eeaddr = eeprom_addr << 1;
1158 }
1159
1160
1161 if (fwnode_property_read_bool(fwnode, "read-only"))
1162 pdev->eero = true;
1163 else
1164 pdev->eero = false;
1165
1166 dev_info(dev, "EEPROM of %d bytes found by 0x%x",
1167 pdev->eesize, pdev->eeaddr);
1168}
1169
1170
1171
1172
1173
1174static struct idt_89hpesx_dev *idt_create_pdev(struct i2c_client *client)
1175{
1176 struct idt_89hpesx_dev *pdev;
1177
1178
1179 pdev = devm_kmalloc(&client->dev, sizeof(struct idt_89hpesx_dev),
1180 GFP_KERNEL);
1181 if (pdev == NULL)
1182 return ERR_PTR(-ENOMEM);
1183
1184
1185 pdev->client = client;
1186 i2c_set_clientdata(client, pdev);
1187
1188
1189 idt_get_fw_data(pdev);
1190
1191
1192 pdev->inicsrcmd = CSR_DWE;
1193 pdev->csr = CSR_DEF;
1194
1195
1196 if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_PEC)) {
1197 pdev->iniccode = CCODE_PEC;
1198 client->flags |= I2C_CLIENT_PEC;
1199 } else {
1200 pdev->iniccode = 0;
1201 }
1202
1203 return pdev;
1204}
1205
1206
1207
1208
1209
1210static void idt_free_pdev(struct idt_89hpesx_dev *pdev)
1211{
1212
1213 i2c_set_clientdata(pdev->client, NULL);
1214}
1215
1216
1217
1218
1219
1220
1221static int idt_set_smbus_ops(struct idt_89hpesx_dev *pdev)
1222{
1223 struct i2c_adapter *adapter = pdev->client->adapter;
1224 struct device *dev = &pdev->client->dev;
1225
1226
1227 if (i2c_check_functionality(adapter,
1228 I2C_FUNC_SMBUS_READ_BLOCK_DATA)) {
1229 pdev->smb_read = idt_smb_read_block;
1230 dev_dbg(dev, "SMBus block-read op chosen");
1231 } else if (i2c_check_functionality(adapter,
1232 I2C_FUNC_SMBUS_READ_I2C_BLOCK)) {
1233 pdev->smb_read = idt_smb_read_i2c_block;
1234 dev_dbg(dev, "SMBus i2c-block-read op chosen");
1235 } else if (i2c_check_functionality(adapter,
1236 I2C_FUNC_SMBUS_READ_WORD_DATA) &&
1237 i2c_check_functionality(adapter,
1238 I2C_FUNC_SMBUS_READ_BYTE_DATA)) {
1239 pdev->smb_read = idt_smb_read_word;
1240 dev_warn(dev, "Use slow word/byte SMBus read ops");
1241 } else if (i2c_check_functionality(adapter,
1242 I2C_FUNC_SMBUS_READ_BYTE_DATA)) {
1243 pdev->smb_read = idt_smb_read_byte;
1244 dev_warn(dev, "Use slow byte SMBus read op");
1245 } else {
1246 dev_err(dev, "No supported SMBus read op");
1247 return -EPFNOSUPPORT;
1248 }
1249
1250
1251 if (i2c_check_functionality(adapter,
1252 I2C_FUNC_SMBUS_WRITE_BLOCK_DATA)) {
1253 pdev->smb_write = idt_smb_write_block;
1254 dev_dbg(dev, "SMBus block-write op chosen");
1255 } else if (i2c_check_functionality(adapter,
1256 I2C_FUNC_SMBUS_WRITE_I2C_BLOCK)) {
1257 pdev->smb_write = idt_smb_write_i2c_block;
1258 dev_dbg(dev, "SMBus i2c-block-write op chosen");
1259 } else if (i2c_check_functionality(adapter,
1260 I2C_FUNC_SMBUS_WRITE_WORD_DATA) &&
1261 i2c_check_functionality(adapter,
1262 I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) {
1263 pdev->smb_write = idt_smb_write_word;
1264 dev_warn(dev, "Use slow word/byte SMBus write op");
1265 } else if (i2c_check_functionality(adapter,
1266 I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) {
1267 pdev->smb_write = idt_smb_write_byte;
1268 dev_warn(dev, "Use slow byte SMBus write op");
1269 } else {
1270 dev_err(dev, "No supported SMBus write op");
1271 return -EPFNOSUPPORT;
1272 }
1273
1274
1275 mutex_init(&pdev->smb_mtx);
1276
1277 return 0;
1278}
1279
1280
1281
1282
1283
1284
1285static int idt_check_dev(struct idt_89hpesx_dev *pdev)
1286{
1287 struct device *dev = &pdev->client->dev;
1288 u32 viddid;
1289 int ret;
1290
1291
1292 ret = idt_csr_read(pdev, IDT_VIDDID_CSR, &viddid);
1293 if (ret != 0) {
1294 dev_err(dev, "Failed to read VID/DID");
1295 return ret;
1296 }
1297
1298
1299 if ((viddid & IDT_VID_MASK) != PCI_VENDOR_ID_IDT) {
1300 dev_err(dev, "Got unsupported VID/DID: 0x%08x", viddid);
1301 return -ENODEV;
1302 }
1303
1304 dev_info(dev, "Found IDT 89HPES device VID:0x%04x, DID:0x%04x",
1305 (viddid & IDT_VID_MASK), (viddid >> 16));
1306
1307 return 0;
1308}
1309
1310
1311
1312
1313
1314
1315static int idt_create_sysfs_files(struct idt_89hpesx_dev *pdev)
1316{
1317 struct device *dev = &pdev->client->dev;
1318 int ret;
1319
1320
1321 if (pdev->eesize == 0) {
1322 dev_dbg(dev, "Skip creating sysfs-files");
1323 return 0;
1324 }
1325
1326
1327 pdev->ee_file = devm_kmalloc(dev, sizeof(*pdev->ee_file), GFP_KERNEL);
1328 if (!pdev->ee_file)
1329 return -ENOMEM;
1330
1331
1332 memcpy(pdev->ee_file, &bin_attr_eeprom, sizeof(*pdev->ee_file));
1333
1334
1335 if (pdev->eero) {
1336 pdev->ee_file->attr.mode &= ~0200;
1337 pdev->ee_file->write = NULL;
1338 }
1339
1340 pdev->ee_file->size = pdev->eesize;
1341 ret = sysfs_create_bin_file(&dev->kobj, pdev->ee_file);
1342 if (ret != 0) {
1343 dev_err(dev, "Failed to create EEPROM sysfs-node");
1344 return ret;
1345 }
1346
1347 return 0;
1348}
1349
1350
1351
1352
1353
1354static void idt_remove_sysfs_files(struct idt_89hpesx_dev *pdev)
1355{
1356 struct device *dev = &pdev->client->dev;
1357
1358
1359 if (pdev->eesize == 0)
1360 return;
1361
1362
1363 sysfs_remove_bin_file(&dev->kobj, pdev->ee_file);
1364}
1365
1366
1367
1368
1369
1370#define CSRNAME_LEN ((size_t)32)
1371static void idt_create_dbgfs_files(struct idt_89hpesx_dev *pdev)
1372{
1373 struct i2c_client *cli = pdev->client;
1374 char fname[CSRNAME_LEN];
1375
1376
1377 snprintf(fname, CSRNAME_LEN, "%d-%04hx", cli->adapter->nr, cli->addr);
1378 pdev->csr_dir = debugfs_create_dir(fname, csr_dbgdir);
1379
1380
1381 pdev->csr_file = debugfs_create_file(cli->name, 0600,
1382 pdev->csr_dir, pdev, &csr_dbgfs_ops);
1383}
1384
1385
1386
1387
1388
1389static void idt_remove_dbgfs_files(struct idt_89hpesx_dev *pdev)
1390{
1391
1392 debugfs_remove_recursive(pdev->csr_dir);
1393}
1394
1395
1396
1397
1398static int idt_probe(struct i2c_client *client, const struct i2c_device_id *id)
1399{
1400 struct idt_89hpesx_dev *pdev;
1401 int ret;
1402
1403
1404 pdev = idt_create_pdev(client);
1405 if (IS_ERR(pdev))
1406 return PTR_ERR(pdev);
1407
1408
1409 ret = idt_set_smbus_ops(pdev);
1410 if (ret != 0)
1411 goto err_free_pdev;
1412
1413
1414 ret = idt_check_dev(pdev);
1415 if (ret != 0)
1416 goto err_free_pdev;
1417
1418
1419 ret = idt_create_sysfs_files(pdev);
1420 if (ret != 0)
1421 goto err_free_pdev;
1422
1423
1424 idt_create_dbgfs_files(pdev);
1425
1426 return 0;
1427
1428err_free_pdev:
1429 idt_free_pdev(pdev);
1430
1431 return ret;
1432}
1433
1434
1435
1436
1437static int idt_remove(struct i2c_client *client)
1438{
1439 struct idt_89hpesx_dev *pdev = i2c_get_clientdata(client);
1440
1441
1442 idt_remove_dbgfs_files(pdev);
1443
1444
1445 idt_remove_sysfs_files(pdev);
1446
1447
1448 idt_free_pdev(pdev);
1449
1450 return 0;
1451}
1452
1453
1454
1455
1456static const struct i2c_device_id ee_ids[] = {
1457 { "24c32", 4096},
1458 { "24c64", 8192},
1459 { "24c128", 16384},
1460 { "24c256", 32768},
1461 { "24c512", 65536},
1462 {}
1463};
1464MODULE_DEVICE_TABLE(i2c, ee_ids);
1465
1466
1467
1468
1469static const struct i2c_device_id idt_ids[] = {
1470 { "89hpes8nt2", 0 },
1471 { "89hpes12nt3", 0 },
1472
1473 { "89hpes24nt6ag2", 0 },
1474 { "89hpes32nt8ag2", 0 },
1475 { "89hpes32nt8bg2", 0 },
1476 { "89hpes12nt12g2", 0 },
1477 { "89hpes16nt16g2", 0 },
1478 { "89hpes24nt24g2", 0 },
1479 { "89hpes32nt24ag2", 0 },
1480 { "89hpes32nt24bg2", 0 },
1481
1482 { "89hpes12n3", 0 },
1483 { "89hpes12n3a", 0 },
1484 { "89hpes24n3", 0 },
1485 { "89hpes24n3a", 0 },
1486
1487 { "89hpes32h8", 0 },
1488 { "89hpes32h8g2", 0 },
1489 { "89hpes48h12", 0 },
1490 { "89hpes48h12g2", 0 },
1491 { "89hpes48h12ag2", 0 },
1492 { "89hpes16h16", 0 },
1493 { "89hpes22h16", 0 },
1494 { "89hpes22h16g2", 0 },
1495 { "89hpes34h16", 0 },
1496 { "89hpes34h16g2", 0 },
1497 { "89hpes64h16", 0 },
1498 { "89hpes64h16g2", 0 },
1499 { "89hpes64h16ag2", 0 },
1500
1501
1502 { "89hpes12t3g2", 0 },
1503 { "89hpes24t3g2", 0 },
1504
1505 { "89hpes16t4", 0 },
1506 { "89hpes4t4g2", 0 },
1507 { "89hpes10t4g2", 0 },
1508 { "89hpes16t4g2", 0 },
1509 { "89hpes16t4ag2", 0 },
1510 { "89hpes5t5", 0 },
1511 { "89hpes6t5", 0 },
1512 { "89hpes8t5", 0 },
1513 { "89hpes8t5a", 0 },
1514 { "89hpes24t6", 0 },
1515 { "89hpes6t6g2", 0 },
1516 { "89hpes24t6g2", 0 },
1517 { "89hpes16t7", 0 },
1518 { "89hpes32t8", 0 },
1519 { "89hpes32t8g2", 0 },
1520 { "89hpes48t12", 0 },
1521 { "89hpes48t12g2", 0 },
1522 { }
1523};
1524MODULE_DEVICE_TABLE(i2c, idt_ids);
1525
1526static const struct of_device_id idt_of_match[] = {
1527 { .compatible = "idt,89hpes8nt2", },
1528 { .compatible = "idt,89hpes12nt3", },
1529
1530 { .compatible = "idt,89hpes24nt6ag2", },
1531 { .compatible = "idt,89hpes32nt8ag2", },
1532 { .compatible = "idt,89hpes32nt8bg2", },
1533 { .compatible = "idt,89hpes12nt12g2", },
1534 { .compatible = "idt,89hpes16nt16g2", },
1535 { .compatible = "idt,89hpes24nt24g2", },
1536 { .compatible = "idt,89hpes32nt24ag2", },
1537 { .compatible = "idt,89hpes32nt24bg2", },
1538
1539 { .compatible = "idt,89hpes12n3", },
1540 { .compatible = "idt,89hpes12n3a", },
1541 { .compatible = "idt,89hpes24n3", },
1542 { .compatible = "idt,89hpes24n3a", },
1543
1544 { .compatible = "idt,89hpes32h8", },
1545 { .compatible = "idt,89hpes32h8g2", },
1546 { .compatible = "idt,89hpes48h12", },
1547 { .compatible = "idt,89hpes48h12g2", },
1548 { .compatible = "idt,89hpes48h12ag2", },
1549 { .compatible = "idt,89hpes16h16", },
1550 { .compatible = "idt,89hpes22h16", },
1551 { .compatible = "idt,89hpes22h16g2", },
1552 { .compatible = "idt,89hpes34h16", },
1553 { .compatible = "idt,89hpes34h16g2", },
1554 { .compatible = "idt,89hpes64h16", },
1555 { .compatible = "idt,89hpes64h16g2", },
1556 { .compatible = "idt,89hpes64h16ag2", },
1557
1558 { .compatible = "idt,89hpes12t3g2", },
1559 { .compatible = "idt,89hpes24t3g2", },
1560
1561 { .compatible = "idt,89hpes16t4", },
1562 { .compatible = "idt,89hpes4t4g2", },
1563 { .compatible = "idt,89hpes10t4g2", },
1564 { .compatible = "idt,89hpes16t4g2", },
1565 { .compatible = "idt,89hpes16t4ag2", },
1566 { .compatible = "idt,89hpes5t5", },
1567 { .compatible = "idt,89hpes6t5", },
1568 { .compatible = "idt,89hpes8t5", },
1569 { .compatible = "idt,89hpes8t5a", },
1570 { .compatible = "idt,89hpes24t6", },
1571 { .compatible = "idt,89hpes6t6g2", },
1572 { .compatible = "idt,89hpes24t6g2", },
1573 { .compatible = "idt,89hpes16t7", },
1574 { .compatible = "idt,89hpes32t8", },
1575 { .compatible = "idt,89hpes32t8g2", },
1576 { .compatible = "idt,89hpes48t12", },
1577 { .compatible = "idt,89hpes48t12g2", },
1578 { },
1579};
1580MODULE_DEVICE_TABLE(of, idt_of_match);
1581
1582
1583
1584
1585static struct i2c_driver idt_driver = {
1586 .driver = {
1587 .name = IDT_NAME,
1588 .of_match_table = idt_of_match,
1589 },
1590 .probe = idt_probe,
1591 .remove = idt_remove,
1592 .id_table = idt_ids,
1593};
1594
1595
1596
1597
1598static int __init idt_init(void)
1599{
1600
1601 if (debugfs_initialized())
1602 csr_dbgdir = debugfs_create_dir("idt_csr", NULL);
1603
1604
1605 return i2c_add_driver(&idt_driver);
1606}
1607module_init(idt_init);
1608
1609
1610
1611
1612static void __exit idt_exit(void)
1613{
1614
1615 debugfs_remove_recursive(csr_dbgdir);
1616
1617
1618 i2c_del_driver(&idt_driver);
1619}
1620module_exit(idt_exit);
1621