Lines Matching +full:eeprom +full:- +full:data
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2016 T-Platforms. All Rights Reserved.
5 * IDT PCIe-switch NTB Linux driver
8 * Serge Semin <fancer.lancer@gmail.com>, <Sergey.Semin@t-platforms.ru>
11 * NOTE of the IDT 89HPESx SMBus-slave interface driver
12 * This driver primarily is developed to have an access to EEPROM device of
13 * IDT PCIe-switches. IDT provides a simple SMBus interface to perform IO-
14 * operations from/to EEPROM, which is located at private (so called Master)
16 * binary sysfs-file in the device directory:
17 * /sys/bus/i2c/devices/<bus>-<devaddr>/eeprom
18 * In case if read-only flag is specified in the dts-node of device desription,
19 * User-space applications won't be able to write to the EEPROM sysfs-node.
21 * data of device CSRs. This driver exposes debugf-file to perform simple IO
23 * next file is created in the specific debugfs-directory:
25 * Format of the debugfs-node is:
26 * $ cat /sys/kernel/debug/idt_csr/<bus>-<devaddr>/<devname>;
29 * If User-space application wishes to change current CSR address,
30 * it can just write a proper value to the sysfs-file:
31 * $ echo "<CSR address>" > /sys/kernel/debug/idt_csr/<bus>-<devaddr>/<devname>
35 * /sys/kernel/debug/idt_csr/<bus>-<devaddr>/<devname>;
55 #define IDT_89HPESX_DESC "IDT 89HPESx SMBus-slave interface driver"
61 MODULE_AUTHOR("T-platforms");
64 * csr_dbgdir - CSR read/write operations Debugfs directory
69 * struct idt_89hpesx_dev - IDT 89HPESx device data structure
70 * @eesize: Size of EEPROM in bytes (calculated from "idt,eecompatible")
71 * @eero: EEPROM Read-only flag
72 * @eeaddr: EEPROM custom address
74 * @inieecmd: Initial cmd value for EEPROM read/write operations
76 * @iniccode: Initialial command code value for IO-operations
86 * @ee_file: EEPROM read/write sysfs-file
111 * struct idt_smb_seq - sequence of data to be read/written from/to IDT 89HPESx
114 * @data: Data to by written
119 u8 *data; member
123 * struct idt_eeprom_seq - sequence of data to be read/written from/to EEPROM
125 * @eeaddr: EEPROM custom address
126 * @memaddr: Internal memory address of EEPROM
127 * @data: Data to be written at the memory address
133 u8 data; member
137 * struct idt_csr_seq - sequence of data to be read/written from/to CSR
140 * @data: Data to be read/written from/to the CSR address
145 u32 data; member
153 * @CCODE_EEPROM: EEPROM read/write transaction
154 * @CCODE_BYTE: Supplied data has BYTE length
155 * @CCODE_WORD: Supplied data has WORD length
156 * @CCODE_BLOCK: Supplied data has variable length passed in bytecnt
169 * EEPROM command macros
170 * @EEPROM_OP_WRITE: EEPROM write operation
171 * @EEPROM_OP_READ: EEPROM read operation
172 * @EEPROM_USA: Use specified address of EEPROM
173 * @EEPROM_NAERR: EEPROM device is not ready to respond
174 * @EEPROM_LAERR: EEPROM arbitration loss error
175 * @EEPROM_MSS: EEPROM misplace start & stop bits error
179 * @EEPROM_DEF_SIZE: Fall back size of EEPROM
180 * @EEPROM_DEF_ADDR: Defatul EEPROM address
181 * @EEPROM_TOUT: Timeout before retry read operation if eeprom is busy
243 } while (__retry-- && __sts < 0); \
248 * i2c bus level IO-operations
253 * idt_smb_write_byte() - SMBus write method when I2C_SMBUS_BYTE_DATA operation
255 * @pdev: Pointer to the driver data
256 * @seq: Sequence of data to be written
265 /* Loop over the supplied data sending byte one-by-one */ in idt_smb_write_byte()
266 for (idx = 0; idx < seq->bytecnt; idx++) { in idt_smb_write_byte()
268 ccode = seq->ccode | CCODE_BYTE; in idt_smb_write_byte()
271 if (idx == seq->bytecnt - 1) in idt_smb_write_byte()
274 /* Send data to the device */ in idt_smb_write_byte()
275 sts = idt_smb_safe(write_byte, pdev->client, ccode, in idt_smb_write_byte()
276 seq->data[idx]); in idt_smb_write_byte()
285 * idt_smb_read_byte() - SMBus read method when I2C_SMBUS_BYTE_DATA operation
287 * @pdev: Pointer to the driver data
288 * @seq: Buffer to read data to
297 /* Loop over the supplied buffer receiving byte one-by-one */ in idt_smb_read_byte()
298 for (idx = 0; idx < seq->bytecnt; idx++) { in idt_smb_read_byte()
300 ccode = seq->ccode | CCODE_BYTE; in idt_smb_read_byte()
303 if (idx == seq->bytecnt - 1) in idt_smb_read_byte()
306 /* Read data from the device */ in idt_smb_read_byte()
307 sts = idt_smb_safe(read_byte, pdev->client, ccode); in idt_smb_read_byte()
311 seq->data[idx] = (u8)sts; in idt_smb_read_byte()
318 * idt_smb_write_word() - SMBus write method when I2C_SMBUS_BYTE_DATA and
320 * @pdev: Pointer to the driver data
321 * @seq: Sequence of data to be written
330 /* Calculate the even count of data to send */ in idt_smb_write_word()
331 evencnt = seq->bytecnt - (seq->bytecnt % 2); in idt_smb_write_word()
333 /* Loop over the supplied data sending two bytes at a time */ in idt_smb_write_word()
336 ccode = seq->ccode | CCODE_WORD; in idt_smb_write_word()
339 if (idx == evencnt - 2) in idt_smb_write_word()
342 /* Send word data to the device */ in idt_smb_write_word()
343 sts = idt_smb_safe(write_word, pdev->client, ccode, in idt_smb_write_word()
344 *(u16 *)&seq->data[idx]); in idt_smb_write_word()
350 if (seq->bytecnt != evencnt) { in idt_smb_write_word()
352 ccode = seq->ccode | CCODE_BYTE | CCODE_END; in idt_smb_write_word()
356 /* Send byte data to the device */ in idt_smb_write_word()
357 sts = idt_smb_safe(write_byte, pdev->client, ccode, in idt_smb_write_word()
358 seq->data[idx]); in idt_smb_write_word()
367 * idt_smb_read_word() - SMBus read method when I2C_SMBUS_BYTE_DATA and
369 * @pdev: Pointer to the driver data
370 * @seq: Buffer to read data to
379 /* Calculate the even count of data to send */ in idt_smb_read_word()
380 evencnt = seq->bytecnt - (seq->bytecnt % 2); in idt_smb_read_word()
382 /* Loop over the supplied data reading two bytes at a time */ in idt_smb_read_word()
385 ccode = seq->ccode | CCODE_WORD; in idt_smb_read_word()
388 if (idx == evencnt - 2) in idt_smb_read_word()
391 /* Read word data from the device */ in idt_smb_read_word()
392 sts = idt_smb_safe(read_word, pdev->client, ccode); in idt_smb_read_word()
396 *(u16 *)&seq->data[idx] = (u16)sts; in idt_smb_read_word()
400 if (seq->bytecnt != evencnt) { in idt_smb_read_word()
402 ccode = seq->ccode | CCODE_BYTE | CCODE_END; in idt_smb_read_word()
406 /* Read last data byte from the device */ in idt_smb_read_word()
407 sts = idt_smb_safe(read_byte, pdev->client, ccode); in idt_smb_read_word()
411 seq->data[idx] = (u8)sts; in idt_smb_read_word()
418 * idt_smb_write_block() - SMBus write method when I2C_SMBUS_BLOCK_DATA
420 * @pdev: Pointer to the driver data
421 * @seq: Sequence of data to be written
428 /* Return error if too much data passed to send */ in idt_smb_write_block()
429 if (seq->bytecnt > I2C_SMBUS_BLOCK_MAX) in idt_smb_write_block()
430 return -EINVAL; in idt_smb_write_block()
433 ccode = seq->ccode | CCODE_BLOCK | CCODE_START | CCODE_END; in idt_smb_write_block()
435 /* Send block of data to the device */ in idt_smb_write_block()
436 return idt_smb_safe(write_block, pdev->client, ccode, seq->bytecnt, in idt_smb_write_block()
437 seq->data); in idt_smb_write_block()
441 * idt_smb_read_block() - SMBus read method when I2C_SMBUS_BLOCK_DATA
443 * @pdev: Pointer to the driver data
444 * @seq: Buffer to read data to
452 /* Return error if too much data passed to send */ in idt_smb_read_block()
453 if (seq->bytecnt > I2C_SMBUS_BLOCK_MAX) in idt_smb_read_block()
454 return -EINVAL; in idt_smb_read_block()
457 ccode = seq->ccode | CCODE_BLOCK | CCODE_START | CCODE_END; in idt_smb_read_block()
459 /* Read block of data from the device */ in idt_smb_read_block()
460 sts = idt_smb_safe(read_block, pdev->client, ccode, seq->data); in idt_smb_read_block()
461 if (sts != seq->bytecnt) in idt_smb_read_block()
462 return (sts < 0 ? sts : -ENODATA); in idt_smb_read_block()
468 * idt_smb_write_i2c_block() - SMBus write method when I2C_SMBUS_I2C_BLOCK_DATA
470 * @pdev: Pointer to the driver data
471 * @seq: Sequence of data to be written
473 * NOTE It's usual SMBus write block operation, except the actual data length is
474 * sent as first byte of data
481 /* Return error if too much data passed to send */ in idt_smb_write_i2c_block()
482 if (seq->bytecnt > I2C_SMBUS_BLOCK_MAX) in idt_smb_write_i2c_block()
483 return -EINVAL; in idt_smb_write_i2c_block()
485 /* Collect the data to send. Length byte must be added prior the data */ in idt_smb_write_i2c_block()
486 buf[0] = seq->bytecnt; in idt_smb_write_i2c_block()
487 memcpy(&buf[1], seq->data, seq->bytecnt); in idt_smb_write_i2c_block()
490 ccode = seq->ccode | CCODE_BLOCK | CCODE_START | CCODE_END; in idt_smb_write_i2c_block()
492 /* Send length and block of data to the device */ in idt_smb_write_i2c_block()
493 return idt_smb_safe(write_i2c_block, pdev->client, ccode, in idt_smb_write_i2c_block()
494 seq->bytecnt + 1, buf); in idt_smb_write_i2c_block()
498 * idt_smb_read_i2c_block() - SMBus read method when I2C_SMBUS_I2C_BLOCK_DATA
500 * @pdev: Pointer to the driver data
501 * @seq: Buffer to read data to
503 * NOTE It's usual SMBus read block operation, except the actual data length is
504 * retrieved as first byte of data
512 /* Return error if too much data passed to send */ in idt_smb_read_i2c_block()
513 if (seq->bytecnt > I2C_SMBUS_BLOCK_MAX) in idt_smb_read_i2c_block()
514 return -EINVAL; in idt_smb_read_i2c_block()
517 ccode = seq->ccode | CCODE_BLOCK | CCODE_START | CCODE_END; in idt_smb_read_i2c_block()
519 /* Read length and block of data from the device */ in idt_smb_read_i2c_block()
520 sts = idt_smb_safe(read_i2c_block, pdev->client, ccode, in idt_smb_read_i2c_block()
521 seq->bytecnt + 1, buf); in idt_smb_read_i2c_block()
522 if (sts != seq->bytecnt + 1) in idt_smb_read_i2c_block()
523 return (sts < 0 ? sts : -ENODATA); in idt_smb_read_i2c_block()
524 if (buf[0] != seq->bytecnt) in idt_smb_read_i2c_block()
525 return -ENODATA; in idt_smb_read_i2c_block()
527 /* Copy retrieved data to the output data buffer */ in idt_smb_read_i2c_block()
528 memcpy(seq->data, &buf[1], seq->bytecnt); in idt_smb_read_i2c_block()
534 * EEPROM IO-operations
539 * idt_eeprom_read_byte() - read just one byte from EEPROM
540 * @pdev: Pointer to the driver data
541 * @memaddr: Start EEPROM memory address
542 * @data: Data to be written to EEPROM
545 u8 *data) in idt_eeprom_read_byte() argument
547 struct device *dev = &pdev->client->dev; in idt_eeprom_read_byte()
553 smbseq.ccode = pdev->iniccode | CCODE_EEPROM; in idt_eeprom_read_byte()
554 smbseq.data = (u8 *)&eeseq; in idt_eeprom_read_byte()
557 * Sometimes EEPROM may respond with NACK if it's busy with previous in idt_eeprom_read_byte()
562 /* Send EEPROM memory address to read data from */ in idt_eeprom_read_byte()
564 eeseq.cmd = pdev->inieecmd | EEPROM_OP_READ; in idt_eeprom_read_byte()
565 eeseq.eeaddr = pdev->eeaddr; in idt_eeprom_read_byte()
567 ret = pdev->smb_write(pdev, &smbseq); in idt_eeprom_read_byte()
569 dev_err(dev, "Failed to init eeprom addr 0x%02x", in idt_eeprom_read_byte()
576 ret = pdev->smb_read(pdev, &smbseq); in idt_eeprom_read_byte()
578 dev_err(dev, "Failed to read eeprom data 0x%02x", in idt_eeprom_read_byte()
585 dev_dbg(dev, "EEPROM busy, retry reading after %d ms", in idt_eeprom_read_byte()
591 /* Check whether IDT successfully read data from EEPROM */ in idt_eeprom_read_byte()
594 "Communication with eeprom failed, cmd 0x%hhx", in idt_eeprom_read_byte()
596 ret = -EREMOTEIO; in idt_eeprom_read_byte()
600 /* Save retrieved data and exit the loop */ in idt_eeprom_read_byte()
601 *data = eeseq.data; in idt_eeprom_read_byte()
603 } while (retry--); in idt_eeprom_read_byte()
610 * idt_eeprom_write() - EEPROM write operation
611 * @pdev: Pointer to the driver data
612 * @memaddr: Start EEPROM memory address
613 * @len: Length of data to be written
614 * @data: Data to be written to EEPROM
617 const u8 *data) in idt_eeprom_write() argument
619 struct device *dev = &pdev->client->dev; in idt_eeprom_write()
626 smbseq.ccode = pdev->iniccode | CCODE_EEPROM; in idt_eeprom_write()
627 smbseq.data = (u8 *)&eeseq; in idt_eeprom_write()
629 /* Send data byte-by-byte, checking if it is successfully written */ in idt_eeprom_write()
632 mutex_lock(&pdev->smb_mtx); in idt_eeprom_write()
636 eeseq.cmd = pdev->inieecmd | EEPROM_OP_WRITE; in idt_eeprom_write()
637 eeseq.eeaddr = pdev->eeaddr; in idt_eeprom_write()
639 eeseq.data = data[idx]; in idt_eeprom_write()
640 ret = pdev->smb_write(pdev, &smbseq); in idt_eeprom_write()
643 "Failed to write 0x%04hx:0x%02hhx to eeprom", in idt_eeprom_write()
644 memaddr, data[idx]); in idt_eeprom_write()
649 * Check whether the data is successfully written by reading in idt_eeprom_write()
650 * from the same EEPROM memory address. in idt_eeprom_write()
652 eeseq.data = ~data[idx]; in idt_eeprom_write()
653 ret = idt_eeprom_read_byte(pdev, memaddr, &eeseq.data); in idt_eeprom_write()
658 if (eeseq.data != data[idx]) { in idt_eeprom_write()
660 eeseq.data, data[idx]); in idt_eeprom_write()
661 ret = -EREMOTEIO; in idt_eeprom_write()
667 mutex_unlock(&pdev->smb_mtx); in idt_eeprom_write()
676 * idt_eeprom_read() - EEPROM read operation
677 * @pdev: Pointer to the driver data
678 * @memaddr: Start EEPROM memory address
679 * @len: Length of data to read
680 * @buf: Buffer to read data to
688 /* Read data byte-by-byte, retrying if it wasn't successful */ in idt_eeprom_read()
691 mutex_lock(&pdev->smb_mtx); in idt_eeprom_read()
697 mutex_unlock(&pdev->smb_mtx); in idt_eeprom_read()
708 * CSR IO-operations
713 * idt_csr_write() - CSR write operation
714 * @pdev: Pointer to the driver data
716 * @data: Data to be written to CSR
719 const u32 data) in idt_csr_write() argument
721 struct device *dev = &pdev->client->dev; in idt_csr_write()
727 smbseq.ccode = pdev->iniccode | CCODE_CSR; in idt_csr_write()
728 smbseq.data = (u8 *)&csrseq; in idt_csr_write()
731 mutex_lock(&pdev->smb_mtx); in idt_csr_write()
735 csrseq.cmd = pdev->inicsrcmd | CSR_OP_WRITE; in idt_csr_write()
737 csrseq.data = cpu_to_le32(data); in idt_csr_write()
738 ret = pdev->smb_write(pdev, &smbseq); in idt_csr_write()
741 CSR_REAL_ADDR(csraddr), data); in idt_csr_write()
745 /* Send CSR address to read data from */ in idt_csr_write()
747 csrseq.cmd = pdev->inicsrcmd | CSR_OP_READ; in idt_csr_write()
748 ret = pdev->smb_write(pdev, &smbseq); in idt_csr_write()
757 ret = pdev->smb_read(pdev, &smbseq); in idt_csr_write()
764 /* Check whether IDT successfully retrieved CSR data */ in idt_csr_write()
767 ret = -EREMOTEIO; in idt_csr_write()
773 mutex_unlock(&pdev->smb_mtx); in idt_csr_write()
779 * idt_csr_read() - CSR read operation
780 * @pdev: Pointer to the driver data
782 * @data: Data to be written to CSR
784 static int idt_csr_read(struct idt_89hpesx_dev *pdev, u16 csraddr, u32 *data) in idt_csr_read() argument
786 struct device *dev = &pdev->client->dev; in idt_csr_read()
792 smbseq.ccode = pdev->iniccode | CCODE_CSR; in idt_csr_read()
793 smbseq.data = (u8 *)&csrseq; in idt_csr_read()
796 mutex_lock(&pdev->smb_mtx); in idt_csr_read()
800 csrseq.cmd = pdev->inicsrcmd | CSR_OP_READ; in idt_csr_read()
802 ret = pdev->smb_write(pdev, &smbseq); in idt_csr_read()
811 ret = pdev->smb_read(pdev, &smbseq); in idt_csr_read()
818 /* Check whether IDT successfully retrieved CSR data */ in idt_csr_read()
821 ret = -EREMOTEIO; in idt_csr_read()
825 /* Save data retrieved from IDT */ in idt_csr_read()
826 *data = le32_to_cpu(csrseq.data); in idt_csr_read()
830 mutex_unlock(&pdev->smb_mtx); in idt_csr_read()
836 * Sysfs/debugfs-nodes IO-operations
841 * eeprom_write() - EEPROM sysfs-node write callback
843 * @kobj: Pointer to the kernel object related to the sysfs-node
845 * @buf: Buffer to write data to
846 * @off: Offset at which data should be written to
856 /* Retrieve driver data */ in eeprom_write()
859 /* Perform EEPROM write operation */ in eeprom_write()
865 * eeprom_read() - EEPROM sysfs-node read callback
867 * @kobj: Pointer to the kernel object related to the sysfs-node
869 * @buf: Buffer to write data to
870 * @off: Offset at which data should be written to
880 /* Retrieve driver data */ in eeprom_read()
883 /* Perform EEPROM read operation */ in eeprom_read()
889 * idt_dbgfs_csr_write() - CSR debugfs-node write callback
891 * @buf: Buffer to read data from
906 struct idt_89hpesx_dev *pdev = filep->private_data; in idt_dbgfs_csr_write()
915 /* Copy data from User-space */ in idt_dbgfs_csr_write()
930 csraddr_len = colon_ch - buf; in idt_dbgfs_csr_write()
934 ret = -ENOMEM; in idt_dbgfs_csr_write()
955 ret = -EINVAL; in idt_dbgfs_csr_write()
960 pdev->csr = (csraddr >> 2); in idt_dbgfs_csr_write()
968 ret = idt_csr_write(pdev, pdev->csr, csrval); in idt_dbgfs_csr_write()
978 /* Free buffer allocated for data retrieved from User-space */ in idt_dbgfs_csr_write()
986 * idt_dbgfs_csr_read() - CSR debugfs-node read callback
988 * @buf: Buffer to write data to
998 struct idt_89hpesx_dev *pdev = filep->private_data; in idt_dbgfs_csr_read()
1004 ret = idt_csr_read(pdev, pdev->csr, &csrval); in idt_dbgfs_csr_read()
1009 csraddr = ((u32)pdev->csr << 2); in idt_dbgfs_csr_read()
1015 /* Copy data to User-space */ in idt_dbgfs_csr_read()
1020 * eeprom_attribute - EEPROM sysfs-node attributes
1022 * NOTE Size will be changed in compliance with OF node. EEPROM attribute will
1023 * be read-only as well if the corresponding flag is specified in OF node.
1025 static BIN_ATTR_RW(eeprom, EEPROM_DEF_SIZE);
1028 * csr_dbgfs_ops - CSR debugfs-node read/write operations
1043 * idt_set_defval() - disable EEPROM access by default
1044 * @pdev: Pointer to the driver data
1049 pdev->eesize = 0; in idt_set_defval()
1050 pdev->eero = true; in idt_set_defval()
1051 pdev->inieecmd = 0; in idt_set_defval()
1052 pdev->eeaddr = 0; in idt_set_defval()
1058 * idt_ee_match_id() - check whether the node belongs to compatible EEPROMs
1074 while (id->name[0]) { in idt_ee_match_id()
1075 if (strcmp(devname, id->name) == 0) in idt_ee_match_id()
1083 * idt_get_fw_data() - get IDT i2c-device parameters from device tree
1084 * @pdev: Pointer to the driver data
1088 struct device *dev = &pdev->client->dev; in idt_get_fw_data()
1099 dev_warn(dev, "Skip unsupported EEPROM device %pfw\n", fwnode); in idt_get_fw_data()
1102 /* If there is no fwnode EEPROM device, then set zero size */ in idt_get_fw_data()
1104 dev_warn(dev, "No fwnode, EEPROM access disabled"); in idt_get_fw_data()
1109 /* Retrieve EEPROM size */ in idt_get_fw_data()
1110 pdev->eesize = (u32)ee_id->driver_data; in idt_get_fw_data()
1112 /* Get custom EEPROM address from 'reg' attribute */ in idt_get_fw_data()
1115 dev_warn(dev, "No EEPROM reg found, use default address 0x%x", in idt_get_fw_data()
1117 pdev->inieecmd = 0; in idt_get_fw_data()
1118 pdev->eeaddr = EEPROM_DEF_ADDR << 1; in idt_get_fw_data()
1120 pdev->inieecmd = EEPROM_USA; in idt_get_fw_data()
1121 pdev->eeaddr = eeprom_addr << 1; in idt_get_fw_data()
1124 /* Check EEPROM 'read-only' flag */ in idt_get_fw_data()
1125 if (fwnode_property_read_bool(fwnode, "read-only")) in idt_get_fw_data()
1126 pdev->eero = true; in idt_get_fw_data()
1127 else /* if (!fwnode_property_read_bool(node, "read-only")) */ in idt_get_fw_data()
1128 pdev->eero = false; in idt_get_fw_data()
1131 dev_info(dev, "EEPROM of %d bytes found by 0x%x", in idt_get_fw_data()
1132 pdev->eesize, pdev->eeaddr); in idt_get_fw_data()
1136 * idt_create_pdev() - create and init data structure of the driver
1137 * @client: i2c client of IDT PCIe-switch device
1143 /* Allocate memory for driver data */ in idt_create_pdev()
1144 pdev = devm_kmalloc(&client->dev, sizeof(struct idt_89hpesx_dev), in idt_create_pdev()
1147 return ERR_PTR(-ENOMEM); in idt_create_pdev()
1149 /* Initialize basic fields of the data */ in idt_create_pdev()
1150 pdev->client = client; in idt_create_pdev()
1156 /* Initialize basic CSR CMD field - use full DWORD-sized r/w ops */ in idt_create_pdev()
1157 pdev->inicsrcmd = CSR_DWE; in idt_create_pdev()
1158 pdev->csr = CSR_DEF; in idt_create_pdev()
1161 if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_PEC)) { in idt_create_pdev()
1162 pdev->iniccode = CCODE_PEC; in idt_create_pdev()
1163 client->flags |= I2C_CLIENT_PEC; in idt_create_pdev()
1165 pdev->iniccode = 0; in idt_create_pdev()
1172 * idt_free_pdev() - free data structure of the driver
1173 * @pdev: Pointer to the driver data
1177 /* Clear driver data from device private field */ in idt_free_pdev()
1178 i2c_set_clientdata(pdev->client, NULL); in idt_free_pdev()
1182 * idt_set_smbus_ops() - set supported SMBus operations
1183 * @pdev: Pointer to the driver data
1188 struct i2c_adapter *adapter = pdev->client->adapter; in idt_set_smbus_ops()
1189 struct device *dev = &pdev->client->dev; in idt_set_smbus_ops()
1194 pdev->smb_read = idt_smb_read_block; in idt_set_smbus_ops()
1195 dev_dbg(dev, "SMBus block-read op chosen"); in idt_set_smbus_ops()
1198 pdev->smb_read = idt_smb_read_i2c_block; in idt_set_smbus_ops()
1199 dev_dbg(dev, "SMBus i2c-block-read op chosen"); in idt_set_smbus_ops()
1204 pdev->smb_read = idt_smb_read_word; in idt_set_smbus_ops()
1208 pdev->smb_read = idt_smb_read_byte; in idt_set_smbus_ops()
1212 return -EPFNOSUPPORT; in idt_set_smbus_ops()
1218 pdev->smb_write = idt_smb_write_block; in idt_set_smbus_ops()
1219 dev_dbg(dev, "SMBus block-write op chosen"); in idt_set_smbus_ops()
1222 pdev->smb_write = idt_smb_write_i2c_block; in idt_set_smbus_ops()
1223 dev_dbg(dev, "SMBus i2c-block-write op chosen"); in idt_set_smbus_ops()
1228 pdev->smb_write = idt_smb_write_word; in idt_set_smbus_ops()
1232 pdev->smb_write = idt_smb_write_byte; in idt_set_smbus_ops()
1236 return -EPFNOSUPPORT; in idt_set_smbus_ops()
1240 mutex_init(&pdev->smb_mtx); in idt_set_smbus_ops()
1246 * idt_check_dev() - check whether it's really IDT 89HPESx device
1247 * @pdev: Pointer to the driver data
1252 struct device *dev = &pdev->client->dev; in idt_check_dev()
1266 return -ENODEV; in idt_check_dev()
1276 * idt_create_sysfs_files() - create sysfs attribute files
1277 * @pdev: Pointer to the driver data
1282 struct device *dev = &pdev->client->dev; in idt_create_sysfs_files()
1285 /* Don't do anything if EEPROM isn't accessible */ in idt_create_sysfs_files()
1286 if (pdev->eesize == 0) { in idt_create_sysfs_files()
1287 dev_dbg(dev, "Skip creating sysfs-files"); in idt_create_sysfs_files()
1292 * Allocate memory for attribute file and copy the declared EEPROM attr in idt_create_sysfs_files()
1295 pdev->ee_file = devm_kmemdup(dev, &bin_attr_eeprom, in idt_create_sysfs_files()
1296 sizeof(*pdev->ee_file), GFP_KERNEL); in idt_create_sysfs_files()
1297 if (!pdev->ee_file) in idt_create_sysfs_files()
1298 return -ENOMEM; in idt_create_sysfs_files()
1300 /* In case of read-only EEPROM get rid of write ability */ in idt_create_sysfs_files()
1301 if (pdev->eero) { in idt_create_sysfs_files()
1302 pdev->ee_file->attr.mode &= ~0200; in idt_create_sysfs_files()
1303 pdev->ee_file->write = NULL; in idt_create_sysfs_files()
1305 /* Create EEPROM sysfs file */ in idt_create_sysfs_files()
1306 pdev->ee_file->size = pdev->eesize; in idt_create_sysfs_files()
1307 ret = sysfs_create_bin_file(&dev->kobj, pdev->ee_file); in idt_create_sysfs_files()
1309 dev_err(dev, "Failed to create EEPROM sysfs-node"); in idt_create_sysfs_files()
1317 * idt_remove_sysfs_files() - remove sysfs attribute files
1318 * @pdev: Pointer to the driver data
1322 struct device *dev = &pdev->client->dev; in idt_remove_sysfs_files()
1324 /* Don't do anything if EEPROM wasn't accessible */ in idt_remove_sysfs_files()
1325 if (pdev->eesize == 0) in idt_remove_sysfs_files()
1328 /* Remove EEPROM sysfs file */ in idt_remove_sysfs_files()
1329 sysfs_remove_bin_file(&dev->kobj, pdev->ee_file); in idt_remove_sysfs_files()
1333 * idt_create_dbgfs_files() - create debugfs files
1334 * @pdev: Pointer to the driver data
1339 struct i2c_client *cli = pdev->client; in idt_create_dbgfs_files()
1343 snprintf(fname, CSRNAME_LEN, "%d-%04hx", cli->adapter->nr, cli->addr); in idt_create_dbgfs_files()
1344 pdev->csr_dir = debugfs_create_dir(fname, csr_dbgdir); in idt_create_dbgfs_files()
1347 debugfs_create_file(cli->name, 0600, pdev->csr_dir, pdev, in idt_create_dbgfs_files()
1352 * idt_remove_dbgfs_files() - remove debugfs files
1353 * @pdev: Pointer to the driver data
1357 /* Remove CSR directory and it sysfs-node */ in idt_remove_dbgfs_files()
1358 debugfs_remove_recursive(pdev->csr_dir); in idt_remove_dbgfs_files()
1362 * idt_probe() - IDT 89HPESx driver probe() callback method
1369 /* Create driver data */ in idt_probe()
1401 * idt_remove() - IDT 89HPESx driver remove() callback method
1413 /* Discard driver data structure */ in idt_remove()
1418 * ee_ids - array of supported EEPROMs
1431 * idt_ids - supported IDT 89HPESx devices
1465 /* { "89hpes3t3", 0 }, // No SMBus-slave iface */
1468 /* { "89hpes4t4", 0 }, // No SMBus-slave iface */
1547 * idt_driver - IDT 89HPESx driver structure
1560 * idt_init() - IDT 89HPESx driver init() callback method
1570 /* Add new i2c-device driver */ in idt_init()
1582 * idt_exit() - IDT 89HPESx driver exit() callback method
1589 /* Unregister i2c-device driver */ in idt_exit()