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, csrval_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 csrval_len = strnlen(csrval_str, count - csraddr_len);
978 } else {
979 csraddr_str = (char *)buf;
980 csraddr_len = strnlen(csraddr_str, count);
981 csrval_str = NULL;
982 csrval_len = 0;
983 }
984
985
986 ret = kstrtou32(csraddr_str, 0, &csraddr);
987 if (ret != 0)
988 goto free_csraddr_str;
989
990
991 if (csraddr > CSR_MAX || !IS_ALIGNED(csraddr, SZ_4)) {
992 ret = -EINVAL;
993 goto free_csraddr_str;
994 }
995
996
997 pdev->csr = (csraddr >> 2);
998
999
1000 if (colon_ch != NULL) {
1001 ret = kstrtou32(csrval_str, 0, &csrval);
1002 if (ret != 0)
1003 goto free_csraddr_str;
1004
1005 ret = idt_csr_write(pdev, pdev->csr, csrval);
1006 if (ret != 0)
1007 goto free_csraddr_str;
1008 }
1009
1010
1011free_csraddr_str:
1012 if (colon_ch != NULL)
1013 kfree(csraddr_str);
1014
1015
1016free_buf:
1017 kfree(buf);
1018
1019 return (ret != 0 ? ret : count);
1020}
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031#define CSRBUF_SIZE ((size_t)32)
1032static ssize_t idt_dbgfs_csr_read(struct file *filep, char __user *ubuf,
1033 size_t count, loff_t *offp)
1034{
1035 struct idt_89hpesx_dev *pdev = filep->private_data;
1036 u32 csraddr, csrval;
1037 char buf[CSRBUF_SIZE];
1038 int ret, size;
1039
1040
1041 ret = idt_csr_read(pdev, pdev->csr, &csrval);
1042 if (ret != 0)
1043 return ret;
1044
1045
1046 csraddr = ((u32)pdev->csr << 2);
1047
1048
1049 size = snprintf(buf, CSRBUF_SIZE, "0x%05x:0x%08x\n",
1050 (unsigned int)csraddr, (unsigned int)csrval);
1051
1052
1053 return simple_read_from_buffer(ubuf, count, offp, buf, size);
1054}
1055
1056
1057
1058
1059
1060
1061
1062static BIN_ATTR_RW(eeprom, EEPROM_DEF_SIZE);
1063
1064
1065
1066
1067static const struct file_operations csr_dbgfs_ops = {
1068 .owner = THIS_MODULE,
1069 .open = simple_open,
1070 .write = idt_dbgfs_csr_write,
1071 .read = idt_dbgfs_csr_read
1072};
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083static void idt_set_defval(struct idt_89hpesx_dev *pdev)
1084{
1085
1086 pdev->eesize = 0;
1087 pdev->eero = true;
1088 pdev->inieecmd = 0;
1089 pdev->eeaddr = 0;
1090}
1091
1092static const struct i2c_device_id ee_ids[];
1093
1094
1095
1096
1097static const struct i2c_device_id *idt_ee_match_id(struct fwnode_handle *fwnode)
1098{
1099 const struct i2c_device_id *id = ee_ids;
1100 const char *compatible, *p;
1101 char devname[I2C_NAME_SIZE];
1102 int ret;
1103
1104 ret = fwnode_property_read_string(fwnode, "compatible", &compatible);
1105 if (ret)
1106 return NULL;
1107
1108 p = strchr(compatible, ',');
1109 strlcpy(devname, p ? p + 1 : compatible, sizeof(devname));
1110
1111 while (id->name[0]) {
1112 if (strcmp(devname, id->name) == 0)
1113 return id;
1114 id++;
1115 }
1116 return NULL;
1117}
1118
1119
1120
1121
1122
1123static void idt_get_fw_data(struct idt_89hpesx_dev *pdev)
1124{
1125 struct device *dev = &pdev->client->dev;
1126 struct fwnode_handle *fwnode;
1127 const struct i2c_device_id *ee_id = NULL;
1128 u32 eeprom_addr;
1129 int ret;
1130
1131 device_for_each_child_node(dev, fwnode) {
1132 ee_id = idt_ee_match_id(fwnode);
1133 if (IS_ERR_OR_NULL(ee_id)) {
1134 dev_warn(dev, "Skip unsupported EEPROM device");
1135 continue;
1136 } else
1137 break;
1138 }
1139
1140
1141 if (!ee_id) {
1142 dev_warn(dev, "No fwnode, EEPROM access disabled");
1143 idt_set_defval(pdev);
1144 return;
1145 }
1146
1147
1148 pdev->eesize = (u32)ee_id->driver_data;
1149
1150
1151 ret = fwnode_property_read_u32(fwnode, "reg", &eeprom_addr);
1152 if (ret || (eeprom_addr == 0)) {
1153 dev_warn(dev, "No EEPROM reg found, use default address 0x%x",
1154 EEPROM_DEF_ADDR);
1155 pdev->inieecmd = 0;
1156 pdev->eeaddr = EEPROM_DEF_ADDR << 1;
1157 } else {
1158 pdev->inieecmd = EEPROM_USA;
1159 pdev->eeaddr = eeprom_addr << 1;
1160 }
1161
1162
1163 if (fwnode_property_read_bool(fwnode, "read-only"))
1164 pdev->eero = true;
1165 else
1166 pdev->eero = false;
1167
1168 dev_info(dev, "EEPROM of %d bytes found by 0x%x",
1169 pdev->eesize, pdev->eeaddr);
1170}
1171
1172
1173
1174
1175
1176static struct idt_89hpesx_dev *idt_create_pdev(struct i2c_client *client)
1177{
1178 struct idt_89hpesx_dev *pdev;
1179
1180
1181 pdev = devm_kmalloc(&client->dev, sizeof(struct idt_89hpesx_dev),
1182 GFP_KERNEL);
1183 if (pdev == NULL)
1184 return ERR_PTR(-ENOMEM);
1185
1186
1187 pdev->client = client;
1188 i2c_set_clientdata(client, pdev);
1189
1190
1191 idt_get_fw_data(pdev);
1192
1193
1194 pdev->inicsrcmd = CSR_DWE;
1195 pdev->csr = CSR_DEF;
1196
1197
1198 if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_PEC)) {
1199 pdev->iniccode = CCODE_PEC;
1200 client->flags |= I2C_CLIENT_PEC;
1201 } else {
1202 pdev->iniccode = 0;
1203 }
1204
1205 return pdev;
1206}
1207
1208
1209
1210
1211
1212static void idt_free_pdev(struct idt_89hpesx_dev *pdev)
1213{
1214
1215 i2c_set_clientdata(pdev->client, NULL);
1216}
1217
1218
1219
1220
1221
1222
1223static int idt_set_smbus_ops(struct idt_89hpesx_dev *pdev)
1224{
1225 struct i2c_adapter *adapter = pdev->client->adapter;
1226 struct device *dev = &pdev->client->dev;
1227
1228
1229 if (i2c_check_functionality(adapter,
1230 I2C_FUNC_SMBUS_READ_BLOCK_DATA)) {
1231 pdev->smb_read = idt_smb_read_block;
1232 dev_dbg(dev, "SMBus block-read op chosen");
1233 } else if (i2c_check_functionality(adapter,
1234 I2C_FUNC_SMBUS_READ_I2C_BLOCK)) {
1235 pdev->smb_read = idt_smb_read_i2c_block;
1236 dev_dbg(dev, "SMBus i2c-block-read op chosen");
1237 } else if (i2c_check_functionality(adapter,
1238 I2C_FUNC_SMBUS_READ_WORD_DATA) &&
1239 i2c_check_functionality(adapter,
1240 I2C_FUNC_SMBUS_READ_BYTE_DATA)) {
1241 pdev->smb_read = idt_smb_read_word;
1242 dev_warn(dev, "Use slow word/byte SMBus read ops");
1243 } else if (i2c_check_functionality(adapter,
1244 I2C_FUNC_SMBUS_READ_BYTE_DATA)) {
1245 pdev->smb_read = idt_smb_read_byte;
1246 dev_warn(dev, "Use slow byte SMBus read op");
1247 } else {
1248 dev_err(dev, "No supported SMBus read op");
1249 return -EPFNOSUPPORT;
1250 }
1251
1252
1253 if (i2c_check_functionality(adapter,
1254 I2C_FUNC_SMBUS_WRITE_BLOCK_DATA)) {
1255 pdev->smb_write = idt_smb_write_block;
1256 dev_dbg(dev, "SMBus block-write op chosen");
1257 } else if (i2c_check_functionality(adapter,
1258 I2C_FUNC_SMBUS_WRITE_I2C_BLOCK)) {
1259 pdev->smb_write = idt_smb_write_i2c_block;
1260 dev_dbg(dev, "SMBus i2c-block-write op chosen");
1261 } else if (i2c_check_functionality(adapter,
1262 I2C_FUNC_SMBUS_WRITE_WORD_DATA) &&
1263 i2c_check_functionality(adapter,
1264 I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) {
1265 pdev->smb_write = idt_smb_write_word;
1266 dev_warn(dev, "Use slow word/byte SMBus write op");
1267 } else if (i2c_check_functionality(adapter,
1268 I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) {
1269 pdev->smb_write = idt_smb_write_byte;
1270 dev_warn(dev, "Use slow byte SMBus write op");
1271 } else {
1272 dev_err(dev, "No supported SMBus write op");
1273 return -EPFNOSUPPORT;
1274 }
1275
1276
1277 mutex_init(&pdev->smb_mtx);
1278
1279 return 0;
1280}
1281
1282
1283
1284
1285
1286
1287static int idt_check_dev(struct idt_89hpesx_dev *pdev)
1288{
1289 struct device *dev = &pdev->client->dev;
1290 u32 viddid;
1291 int ret;
1292
1293
1294 ret = idt_csr_read(pdev, IDT_VIDDID_CSR, &viddid);
1295 if (ret != 0) {
1296 dev_err(dev, "Failed to read VID/DID");
1297 return ret;
1298 }
1299
1300
1301 if ((viddid & IDT_VID_MASK) != PCI_VENDOR_ID_IDT) {
1302 dev_err(dev, "Got unsupported VID/DID: 0x%08x", viddid);
1303 return -ENODEV;
1304 }
1305
1306 dev_info(dev, "Found IDT 89HPES device VID:0x%04x, DID:0x%04x",
1307 (viddid & IDT_VID_MASK), (viddid >> 16));
1308
1309 return 0;
1310}
1311
1312
1313
1314
1315
1316
1317static int idt_create_sysfs_files(struct idt_89hpesx_dev *pdev)
1318{
1319 struct device *dev = &pdev->client->dev;
1320 int ret;
1321
1322
1323 if (pdev->eesize == 0) {
1324 dev_dbg(dev, "Skip creating sysfs-files");
1325 return 0;
1326 }
1327
1328
1329 pdev->ee_file = devm_kmalloc(dev, sizeof(*pdev->ee_file), GFP_KERNEL);
1330 if (!pdev->ee_file)
1331 return -ENOMEM;
1332
1333
1334 memcpy(pdev->ee_file, &bin_attr_eeprom, sizeof(*pdev->ee_file));
1335
1336
1337 if (pdev->eero) {
1338 pdev->ee_file->attr.mode &= ~0200;
1339 pdev->ee_file->write = NULL;
1340 }
1341
1342 pdev->ee_file->size = pdev->eesize;
1343 ret = sysfs_create_bin_file(&dev->kobj, pdev->ee_file);
1344 if (ret != 0) {
1345 dev_err(dev, "Failed to create EEPROM sysfs-node");
1346 return ret;
1347 }
1348
1349 return 0;
1350}
1351
1352
1353
1354
1355
1356static void idt_remove_sysfs_files(struct idt_89hpesx_dev *pdev)
1357{
1358 struct device *dev = &pdev->client->dev;
1359
1360
1361 if (pdev->eesize == 0)
1362 return;
1363
1364
1365 sysfs_remove_bin_file(&dev->kobj, pdev->ee_file);
1366}
1367
1368
1369
1370
1371
1372#define CSRNAME_LEN ((size_t)32)
1373static void idt_create_dbgfs_files(struct idt_89hpesx_dev *pdev)
1374{
1375 struct i2c_client *cli = pdev->client;
1376 char fname[CSRNAME_LEN];
1377
1378
1379 snprintf(fname, CSRNAME_LEN, "%d-%04hx", cli->adapter->nr, cli->addr);
1380 pdev->csr_dir = debugfs_create_dir(fname, csr_dbgdir);
1381
1382
1383 pdev->csr_file = debugfs_create_file(cli->name, 0600,
1384 pdev->csr_dir, pdev, &csr_dbgfs_ops);
1385}
1386
1387
1388
1389
1390
1391static void idt_remove_dbgfs_files(struct idt_89hpesx_dev *pdev)
1392{
1393
1394 debugfs_remove_recursive(pdev->csr_dir);
1395}
1396
1397
1398
1399
1400static int idt_probe(struct i2c_client *client, const struct i2c_device_id *id)
1401{
1402 struct idt_89hpesx_dev *pdev;
1403 int ret;
1404
1405
1406 pdev = idt_create_pdev(client);
1407 if (IS_ERR(pdev))
1408 return PTR_ERR(pdev);
1409
1410
1411 ret = idt_set_smbus_ops(pdev);
1412 if (ret != 0)
1413 goto err_free_pdev;
1414
1415
1416 ret = idt_check_dev(pdev);
1417 if (ret != 0)
1418 goto err_free_pdev;
1419
1420
1421 ret = idt_create_sysfs_files(pdev);
1422 if (ret != 0)
1423 goto err_free_pdev;
1424
1425
1426 idt_create_dbgfs_files(pdev);
1427
1428 return 0;
1429
1430err_free_pdev:
1431 idt_free_pdev(pdev);
1432
1433 return ret;
1434}
1435
1436
1437
1438
1439static int idt_remove(struct i2c_client *client)
1440{
1441 struct idt_89hpesx_dev *pdev = i2c_get_clientdata(client);
1442
1443
1444 idt_remove_dbgfs_files(pdev);
1445
1446
1447 idt_remove_sysfs_files(pdev);
1448
1449
1450 idt_free_pdev(pdev);
1451
1452 return 0;
1453}
1454
1455
1456
1457
1458static const struct i2c_device_id ee_ids[] = {
1459 { "24c32", 4096},
1460 { "24c64", 8192},
1461 { "24c128", 16384},
1462 { "24c256", 32768},
1463 { "24c512", 65536},
1464 {}
1465};
1466MODULE_DEVICE_TABLE(i2c, ee_ids);
1467
1468
1469
1470
1471static const struct i2c_device_id idt_ids[] = {
1472 { "89hpes8nt2", 0 },
1473 { "89hpes12nt3", 0 },
1474
1475 { "89hpes24nt6ag2", 0 },
1476 { "89hpes32nt8ag2", 0 },
1477 { "89hpes32nt8bg2", 0 },
1478 { "89hpes12nt12g2", 0 },
1479 { "89hpes16nt16g2", 0 },
1480 { "89hpes24nt24g2", 0 },
1481 { "89hpes32nt24ag2", 0 },
1482 { "89hpes32nt24bg2", 0 },
1483
1484 { "89hpes12n3", 0 },
1485 { "89hpes12n3a", 0 },
1486 { "89hpes24n3", 0 },
1487 { "89hpes24n3a", 0 },
1488
1489 { "89hpes32h8", 0 },
1490 { "89hpes32h8g2", 0 },
1491 { "89hpes48h12", 0 },
1492 { "89hpes48h12g2", 0 },
1493 { "89hpes48h12ag2", 0 },
1494 { "89hpes16h16", 0 },
1495 { "89hpes22h16", 0 },
1496 { "89hpes22h16g2", 0 },
1497 { "89hpes34h16", 0 },
1498 { "89hpes34h16g2", 0 },
1499 { "89hpes64h16", 0 },
1500 { "89hpes64h16g2", 0 },
1501 { "89hpes64h16ag2", 0 },
1502
1503
1504 { "89hpes12t3g2", 0 },
1505 { "89hpes24t3g2", 0 },
1506
1507 { "89hpes16t4", 0 },
1508 { "89hpes4t4g2", 0 },
1509 { "89hpes10t4g2", 0 },
1510 { "89hpes16t4g2", 0 },
1511 { "89hpes16t4ag2", 0 },
1512 { "89hpes5t5", 0 },
1513 { "89hpes6t5", 0 },
1514 { "89hpes8t5", 0 },
1515 { "89hpes8t5a", 0 },
1516 { "89hpes24t6", 0 },
1517 { "89hpes6t6g2", 0 },
1518 { "89hpes24t6g2", 0 },
1519 { "89hpes16t7", 0 },
1520 { "89hpes32t8", 0 },
1521 { "89hpes32t8g2", 0 },
1522 { "89hpes48t12", 0 },
1523 { "89hpes48t12g2", 0 },
1524 { }
1525};
1526MODULE_DEVICE_TABLE(i2c, idt_ids);
1527
1528static const struct of_device_id idt_of_match[] = {
1529 { .compatible = "idt,89hpes8nt2", },
1530 { .compatible = "idt,89hpes12nt3", },
1531
1532 { .compatible = "idt,89hpes24nt6ag2", },
1533 { .compatible = "idt,89hpes32nt8ag2", },
1534 { .compatible = "idt,89hpes32nt8bg2", },
1535 { .compatible = "idt,89hpes12nt12g2", },
1536 { .compatible = "idt,89hpes16nt16g2", },
1537 { .compatible = "idt,89hpes24nt24g2", },
1538 { .compatible = "idt,89hpes32nt24ag2", },
1539 { .compatible = "idt,89hpes32nt24bg2", },
1540
1541 { .compatible = "idt,89hpes12n3", },
1542 { .compatible = "idt,89hpes12n3a", },
1543 { .compatible = "idt,89hpes24n3", },
1544 { .compatible = "idt,89hpes24n3a", },
1545
1546 { .compatible = "idt,89hpes32h8", },
1547 { .compatible = "idt,89hpes32h8g2", },
1548 { .compatible = "idt,89hpes48h12", },
1549 { .compatible = "idt,89hpes48h12g2", },
1550 { .compatible = "idt,89hpes48h12ag2", },
1551 { .compatible = "idt,89hpes16h16", },
1552 { .compatible = "idt,89hpes22h16", },
1553 { .compatible = "idt,89hpes22h16g2", },
1554 { .compatible = "idt,89hpes34h16", },
1555 { .compatible = "idt,89hpes34h16g2", },
1556 { .compatible = "idt,89hpes64h16", },
1557 { .compatible = "idt,89hpes64h16g2", },
1558 { .compatible = "idt,89hpes64h16ag2", },
1559
1560 { .compatible = "idt,89hpes12t3g2", },
1561 { .compatible = "idt,89hpes24t3g2", },
1562
1563 { .compatible = "idt,89hpes16t4", },
1564 { .compatible = "idt,89hpes4t4g2", },
1565 { .compatible = "idt,89hpes10t4g2", },
1566 { .compatible = "idt,89hpes16t4g2", },
1567 { .compatible = "idt,89hpes16t4ag2", },
1568 { .compatible = "idt,89hpes5t5", },
1569 { .compatible = "idt,89hpes6t5", },
1570 { .compatible = "idt,89hpes8t5", },
1571 { .compatible = "idt,89hpes8t5a", },
1572 { .compatible = "idt,89hpes24t6", },
1573 { .compatible = "idt,89hpes6t6g2", },
1574 { .compatible = "idt,89hpes24t6g2", },
1575 { .compatible = "idt,89hpes16t7", },
1576 { .compatible = "idt,89hpes32t8", },
1577 { .compatible = "idt,89hpes32t8g2", },
1578 { .compatible = "idt,89hpes48t12", },
1579 { .compatible = "idt,89hpes48t12g2", },
1580 { },
1581};
1582MODULE_DEVICE_TABLE(of, idt_of_match);
1583
1584
1585
1586
1587static struct i2c_driver idt_driver = {
1588 .driver = {
1589 .name = IDT_NAME,
1590 .of_match_table = idt_of_match,
1591 },
1592 .probe = idt_probe,
1593 .remove = idt_remove,
1594 .id_table = idt_ids,
1595};
1596
1597
1598
1599
1600static int __init idt_init(void)
1601{
1602
1603 if (debugfs_initialized())
1604 csr_dbgdir = debugfs_create_dir("idt_csr", NULL);
1605
1606
1607 return i2c_add_driver(&idt_driver);
1608}
1609module_init(idt_init);
1610
1611
1612
1613
1614static void __exit idt_exit(void)
1615{
1616
1617 debugfs_remove_recursive(csr_dbgdir);
1618
1619
1620 i2c_del_driver(&idt_driver);
1621}
1622module_exit(idt_exit);
1623