Lines Matching +full:read +full:- +full:to +full:- +full:read

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.
20 * Additionally IDT 89HPESx SMBus interface has an ability to write/read
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>
32 * If it wants to change the CSR value as well, the format of the write
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 * struct idt_89hpesx_dev - IDT 89HPESx device data structure
66 * @eero: EEPROM Read-only flag
69 * @inieecmd: Initial cmd value for EEPROM read/write operations
70 * @inicsrcmd: Initial cmd value for CSR read/write operations
71 * @iniccode: Initialial command code value for IO-operations
73 * @csr: CSR address to perform read operation
76 * @smb_read: SMBus read method
79 * @client: i2c client used to perform IO operations
81 * @ee_file: EEPROM read/write sysfs-file
106 * struct idt_smb_seq - sequence of data to be read/written from/to IDT 89HPESx
109 * @data: Data to by written
118 * struct idt_eeprom_seq - sequence of data to be read/written from/to EEPROM
122 * @data: Data to be written at the memory address
132 * struct idt_csr_seq - sequence of data to be read/written from/to CSR
135 * @data: Data to be read/written from/to the CSR address
147 * @CCODE_CSR: CSR read/write transaction
148 * @CCODE_EEPROM: EEPROM read/write transaction
166 * @EEPROM_OP_READ: EEPROM read operation
168 * @EEPROM_NAERR: EEPROM device is not ready to respond
171 * @EEPROM_WR_CNT: Bytes count to perform write operation
172 * @EEPROM_WRRD_CNT: Bytes count to write before reading
173 * @EEPROM_RD_CNT: Bytes count to perform read operation
176 * @EEPROM_TOUT: Timeout before retry read operation if eeprom is busy
195 * @CSR_OP_READ: CSR read operation
196 * @CSR_RERR: Read operation error
198 * @CSR_WR_CNT: Bytes count to perform write operation
199 * @CSR_WRRD_CNT: Bytes count to write before reading
200 * @CSR_RD_CNT: Bytes count to perform read operation
238 } while (__retry-- && __sts < 0); \
243 * i2c bus level IO-operations
248 * idt_smb_write_byte() - SMBus write method when I2C_SMBUS_BYTE_DATA operation
250 * @pdev: Pointer to the driver data
251 * @seq: Sequence of data to be written
260 /* Loop over the supplied data sending byte one-by-one */ in idt_smb_write_byte()
261 for (idx = 0; idx < seq->bytecnt; idx++) { in idt_smb_write_byte()
263 ccode = seq->ccode | CCODE_BYTE; in idt_smb_write_byte()
266 if (idx == seq->bytecnt - 1) in idt_smb_write_byte()
269 /* Send data to the device */ in idt_smb_write_byte()
270 sts = idt_smb_safe(write_byte, pdev->client, ccode, in idt_smb_write_byte()
271 seq->data[idx]); in idt_smb_write_byte()
280 * idt_smb_read_byte() - SMBus read method when I2C_SMBUS_BYTE_DATA operation
282 * @pdev: Pointer to the driver data
283 * @seq: Buffer to read data to
292 /* Loop over the supplied buffer receiving byte one-by-one */ in idt_smb_read_byte()
293 for (idx = 0; idx < seq->bytecnt; idx++) { in idt_smb_read_byte()
295 ccode = seq->ccode | CCODE_BYTE; in idt_smb_read_byte()
298 if (idx == seq->bytecnt - 1) in idt_smb_read_byte()
301 /* Read data from the device */ in idt_smb_read_byte()
302 sts = idt_smb_safe(read_byte, pdev->client, ccode); in idt_smb_read_byte()
306 seq->data[idx] = (u8)sts; in idt_smb_read_byte()
313 * idt_smb_write_word() - SMBus write method when I2C_SMBUS_BYTE_DATA and
315 * @pdev: Pointer to the driver data
316 * @seq: Sequence of data to be written
325 /* Calculate the even count of data to send */ in idt_smb_write_word()
326 evencnt = seq->bytecnt - (seq->bytecnt % 2); in idt_smb_write_word()
331 ccode = seq->ccode | CCODE_WORD; in idt_smb_write_word()
334 if (idx == evencnt - 2) in idt_smb_write_word()
337 /* Send word data to the device */ in idt_smb_write_word()
338 sts = idt_smb_safe(write_word, pdev->client, ccode, in idt_smb_write_word()
339 *(u16 *)&seq->data[idx]); in idt_smb_write_word()
345 if (seq->bytecnt != evencnt) { in idt_smb_write_word()
347 ccode = seq->ccode | CCODE_BYTE | CCODE_END; in idt_smb_write_word()
351 /* Send byte data to the device */ in idt_smb_write_word()
352 sts = idt_smb_safe(write_byte, pdev->client, ccode, in idt_smb_write_word()
353 seq->data[idx]); in idt_smb_write_word()
362 * idt_smb_read_word() - SMBus read method when I2C_SMBUS_BYTE_DATA and
364 * @pdev: Pointer to the driver data
365 * @seq: Buffer to read data to
374 /* Calculate the even count of data to send */ in idt_smb_read_word()
375 evencnt = seq->bytecnt - (seq->bytecnt % 2); in idt_smb_read_word()
380 ccode = seq->ccode | CCODE_WORD; in idt_smb_read_word()
383 if (idx == evencnt - 2) in idt_smb_read_word()
386 /* Read word data from the device */ in idt_smb_read_word()
387 sts = idt_smb_safe(read_word, pdev->client, ccode); in idt_smb_read_word()
391 *(u16 *)&seq->data[idx] = (u16)sts; in idt_smb_read_word()
395 if (seq->bytecnt != evencnt) { in idt_smb_read_word()
397 ccode = seq->ccode | CCODE_BYTE | CCODE_END; in idt_smb_read_word()
401 /* Read last data byte from the device */ in idt_smb_read_word()
402 sts = idt_smb_safe(read_byte, pdev->client, ccode); in idt_smb_read_word()
406 seq->data[idx] = (u8)sts; in idt_smb_read_word()
413 * idt_smb_write_block() - SMBus write method when I2C_SMBUS_BLOCK_DATA
415 * @pdev: Pointer to the driver data
416 * @seq: Sequence of data to be written
423 /* Return error if too much data passed to send */ in idt_smb_write_block()
424 if (seq->bytecnt > I2C_SMBUS_BLOCK_MAX) in idt_smb_write_block()
425 return -EINVAL; in idt_smb_write_block()
428 ccode = seq->ccode | CCODE_BLOCK | CCODE_START | CCODE_END; in idt_smb_write_block()
430 /* Send block of data to the device */ in idt_smb_write_block()
431 return idt_smb_safe(write_block, pdev->client, ccode, seq->bytecnt, in idt_smb_write_block()
432 seq->data); in idt_smb_write_block()
436 * idt_smb_read_block() - SMBus read method when I2C_SMBUS_BLOCK_DATA
438 * @pdev: Pointer to the driver data
439 * @seq: Buffer to read data to
447 /* Return error if too much data passed to send */ in idt_smb_read_block()
448 if (seq->bytecnt > I2C_SMBUS_BLOCK_MAX) in idt_smb_read_block()
449 return -EINVAL; in idt_smb_read_block()
452 ccode = seq->ccode | CCODE_BLOCK | CCODE_START | CCODE_END; in idt_smb_read_block()
454 /* Read block of data from the device */ in idt_smb_read_block()
455 sts = idt_smb_safe(read_block, pdev->client, ccode, seq->data); in idt_smb_read_block()
456 if (sts != seq->bytecnt) in idt_smb_read_block()
457 return (sts < 0 ? sts : -ENODATA); in idt_smb_read_block()
463 * idt_smb_write_i2c_block() - SMBus write method when I2C_SMBUS_I2C_BLOCK_DATA
465 * @pdev: Pointer to the driver data
466 * @seq: Sequence of data to be written
476 /* Return error if too much data passed to send */ in idt_smb_write_i2c_block()
477 if (seq->bytecnt > I2C_SMBUS_BLOCK_MAX) in idt_smb_write_i2c_block()
478 return -EINVAL; in idt_smb_write_i2c_block()
480 /* Collect the data to send. Length byte must be added prior the data */ in idt_smb_write_i2c_block()
481 buf[0] = seq->bytecnt; in idt_smb_write_i2c_block()
482 memcpy(&buf[1], seq->data, seq->bytecnt); in idt_smb_write_i2c_block()
485 ccode = seq->ccode | CCODE_BLOCK | CCODE_START | CCODE_END; in idt_smb_write_i2c_block()
487 /* Send length and block of data to the device */ in idt_smb_write_i2c_block()
488 return idt_smb_safe(write_i2c_block, pdev->client, ccode, in idt_smb_write_i2c_block()
489 seq->bytecnt + 1, buf); in idt_smb_write_i2c_block()
493 * idt_smb_read_i2c_block() - SMBus read method when I2C_SMBUS_I2C_BLOCK_DATA
495 * @pdev: Pointer to the driver data
496 * @seq: Buffer to read data to
498 * NOTE It's usual SMBus read block operation, except the actual data length is
507 /* Return error if too much data passed to send */ in idt_smb_read_i2c_block()
508 if (seq->bytecnt > I2C_SMBUS_BLOCK_MAX) in idt_smb_read_i2c_block()
509 return -EINVAL; in idt_smb_read_i2c_block()
512 ccode = seq->ccode | CCODE_BLOCK | CCODE_START | CCODE_END; in idt_smb_read_i2c_block()
514 /* Read length and block of data from the device */ in idt_smb_read_i2c_block()
515 sts = idt_smb_safe(read_i2c_block, pdev->client, ccode, in idt_smb_read_i2c_block()
516 seq->bytecnt + 1, buf); in idt_smb_read_i2c_block()
517 if (sts != seq->bytecnt + 1) in idt_smb_read_i2c_block()
518 return (sts < 0 ? sts : -ENODATA); in idt_smb_read_i2c_block()
519 if (buf[0] != seq->bytecnt) in idt_smb_read_i2c_block()
520 return -ENODATA; in idt_smb_read_i2c_block()
522 /* Copy retrieved data to the output data buffer */ in idt_smb_read_i2c_block()
523 memcpy(seq->data, &buf[1], seq->bytecnt); in idt_smb_read_i2c_block()
529 * EEPROM IO-operations
534 * idt_eeprom_read_byte() - read just one byte from EEPROM
535 * @pdev: Pointer to the driver data
537 * @data: Data to be written to EEPROM
542 struct device *dev = &pdev->client->dev; in idt_eeprom_read_byte()
548 smbseq.ccode = pdev->iniccode | CCODE_EEPROM; in idt_eeprom_read_byte()
553 * operation, so we need to perform a few attempts of read cycle in idt_eeprom_read_byte()
557 /* Send EEPROM memory address to read data from */ in idt_eeprom_read_byte()
559 eeseq.cmd = pdev->inieecmd | EEPROM_OP_READ; in idt_eeprom_read_byte()
560 eeseq.eeaddr = pdev->eeaddr; in idt_eeprom_read_byte()
562 ret = pdev->smb_write(pdev, &smbseq); in idt_eeprom_read_byte()
564 dev_err(dev, "Failed to init eeprom addr 0x%02x", in idt_eeprom_read_byte()
569 /* Perform read operation */ in idt_eeprom_read_byte()
571 ret = pdev->smb_read(pdev, &smbseq); in idt_eeprom_read_byte()
573 dev_err(dev, "Failed to read eeprom data 0x%02x", in idt_eeprom_read_byte()
578 /* Restart read operation if the device is busy */ in idt_eeprom_read_byte()
586 /* Check whether IDT successfully read data from EEPROM */ in idt_eeprom_read_byte()
591 ret = -EREMOTEIO; in idt_eeprom_read_byte()
598 } while (retry--); in idt_eeprom_read_byte()
605 * idt_eeprom_write() - EEPROM write operation
606 * @pdev: Pointer to the driver data
608 * @len: Length of data to be written
609 * @data: Data to be written to EEPROM
614 struct device *dev = &pdev->client->dev; in idt_eeprom_write()
621 smbseq.ccode = pdev->iniccode | CCODE_EEPROM; in idt_eeprom_write()
624 /* Send data byte-by-byte, checking if it is successfully written */ in idt_eeprom_write()
627 mutex_lock(&pdev->smb_mtx); in idt_eeprom_write()
631 eeseq.cmd = pdev->inieecmd | EEPROM_OP_WRITE; in idt_eeprom_write()
632 eeseq.eeaddr = pdev->eeaddr; in idt_eeprom_write()
635 ret = pdev->smb_write(pdev, &smbseq); in idt_eeprom_write()
638 "Failed to write 0x%04hx:0x%02hhx to eeprom", in idt_eeprom_write()
652 /* Check whether the read byte is the same as written one */ in idt_eeprom_write()
656 ret = -EREMOTEIO; in idt_eeprom_write()
662 mutex_unlock(&pdev->smb_mtx); in idt_eeprom_write()
671 * idt_eeprom_read() - EEPROM read operation
672 * @pdev: Pointer to the driver data
674 * @len: Length of data to read
675 * @buf: Buffer to read data to
683 /* Read data byte-by-byte, retrying if it wasn't successful */ in idt_eeprom_read()
686 mutex_lock(&pdev->smb_mtx); in idt_eeprom_read()
688 /* Just read the byte to the buffer */ in idt_eeprom_read()
692 mutex_unlock(&pdev->smb_mtx); in idt_eeprom_read()
694 /* Return error if read operation failed */ in idt_eeprom_read()
703 * CSR IO-operations
708 * idt_csr_write() - CSR write operation
709 * @pdev: Pointer to the driver data
711 * @data: Data to be written to CSR
716 struct device *dev = &pdev->client->dev; in idt_csr_write()
722 smbseq.ccode = pdev->iniccode | CCODE_CSR; in idt_csr_write()
726 mutex_lock(&pdev->smb_mtx); in idt_csr_write()
730 csrseq.cmd = pdev->inicsrcmd | CSR_OP_WRITE; in idt_csr_write()
733 ret = pdev->smb_write(pdev, &smbseq); in idt_csr_write()
735 dev_err(dev, "Failed to write 0x%04x: 0x%04x to csr", in idt_csr_write()
740 /* Send CSR address to read data from */ in idt_csr_write()
742 csrseq.cmd = pdev->inicsrcmd | CSR_OP_READ; in idt_csr_write()
743 ret = pdev->smb_write(pdev, &smbseq); in idt_csr_write()
745 dev_err(dev, "Failed to init csr address 0x%04x", in idt_csr_write()
750 /* Perform read operation */ in idt_csr_write()
752 ret = pdev->smb_read(pdev, &smbseq); in idt_csr_write()
754 dev_err(dev, "Failed to read csr 0x%04x", in idt_csr_write()
761 dev_err(dev, "IDT failed to perform CSR r/w"); in idt_csr_write()
762 ret = -EREMOTEIO; in idt_csr_write()
768 mutex_unlock(&pdev->smb_mtx); in idt_csr_write()
774 * idt_csr_read() - CSR read operation
775 * @pdev: Pointer to the driver data
777 * @data: Data to be written to CSR
781 struct device *dev = &pdev->client->dev; in idt_csr_read()
787 smbseq.ccode = pdev->iniccode | CCODE_CSR; in idt_csr_read()
791 mutex_lock(&pdev->smb_mtx); in idt_csr_read()
795 csrseq.cmd = pdev->inicsrcmd | CSR_OP_READ; in idt_csr_read()
797 ret = pdev->smb_write(pdev, &smbseq); in idt_csr_read()
799 dev_err(dev, "Failed to init csr address 0x%04x", in idt_csr_read()
804 /* Perform read operation */ in idt_csr_read()
806 ret = pdev->smb_read(pdev, &smbseq); in idt_csr_read()
808 dev_err(dev, "Failed to read csr 0x%04x", in idt_csr_read()
815 dev_err(dev, "IDT failed to perform CSR r/w"); in idt_csr_read()
816 ret = -EREMOTEIO; in idt_csr_read()
825 mutex_unlock(&pdev->smb_mtx); in idt_csr_read()
831 * Sysfs/debugfs-nodes IO-operations
836 * eeprom_write() - EEPROM sysfs-node write callback
837 * @filep: Pointer to the file system node
838 * @kobj: Pointer to the kernel object related to the sysfs-node
840 * @buf: Buffer to write data to
841 * @off: Offset at which data should be written to
842 * @count: Number of bytes to write
860 * eeprom_read() - EEPROM sysfs-node read callback
861 * @filep: Pointer to the file system node
862 * @kobj: Pointer to the kernel object related to the sysfs-node
864 * @buf: Buffer to write data to
865 * @off: Offset at which data should be written to
866 * @count: Number of bytes to write
878 /* Perform EEPROM read operation */ in eeprom_read()
884 * idt_dbgfs_csr_write() - CSR debugfs-node write callback
885 * @filep: Pointer to the file system file descriptor
886 * @buf: Buffer to read data from
891 * and writing value to specified DWORD register or "0x<reg addr>" for
892 * just saving register address in order to perform next read operation.
901 struct idt_89hpesx_dev *pdev = filep->private_data; in idt_dbgfs_csr_write()
910 /* Copy data from User-space */ in idt_dbgfs_csr_write()
925 /* Copy the register address to the substring buffer */ in idt_dbgfs_csr_write()
926 csraddr_str = kmemdup_nul(buf, colon_ch - buf, GFP_KERNEL); in idt_dbgfs_csr_write()
928 ret = -ENOMEM; in idt_dbgfs_csr_write()
934 csraddr_str = (char *)buf; /* Just to shut warning up */ in idt_dbgfs_csr_write()
938 /* Convert CSR address to u32 value */ in idt_dbgfs_csr_write()
945 ret = -EINVAL; in idt_dbgfs_csr_write()
949 /* Shift register address to the right so to have u16 address */ in idt_dbgfs_csr_write()
950 pdev->csr = (csraddr >> 2); in idt_dbgfs_csr_write()
952 /* Parse new CSR value and send it to IDT, if colon has been found */ in idt_dbgfs_csr_write()
958 ret = idt_csr_write(pdev, pdev->csr, csrval); in idt_dbgfs_csr_write()
968 /* Free buffer allocated for data retrieved from User-space */ in idt_dbgfs_csr_write()
976 * idt_dbgfs_csr_read() - CSR debugfs-node read callback
977 * @filep: Pointer to the file system file descriptor
978 * @buf: Buffer to write data to
982 * It just prints the pair "0x<reg addr>:0x<value>" to passed buffer.
988 struct idt_89hpesx_dev *pdev = filep->private_data; in idt_dbgfs_csr_read()
993 /* Perform CSR read operation */ in idt_dbgfs_csr_read()
994 ret = idt_csr_read(pdev, pdev->csr, &csrval); in idt_dbgfs_csr_read()
998 /* Shift register address to the left so to have real address */ in idt_dbgfs_csr_read()
999 csraddr = ((u32)pdev->csr << 2); in idt_dbgfs_csr_read()
1001 /* Print the "0x<reg addr>:0x<value>" to buffer */ in idt_dbgfs_csr_read()
1005 /* Copy data to User-space */ in idt_dbgfs_csr_read()
1010 * eeprom_attribute - EEPROM sysfs-node attributes
1013 * be read-only as well if the corresponding flag is specified in OF node.
1018 * csr_dbgfs_ops - CSR debugfs-node read/write operations
1024 .read = idt_dbgfs_csr_read
1033 * idt_set_defval() - disable EEPROM access by default
1034 * @pdev: Pointer to the driver data
1039 pdev->eesize = 0; in idt_set_defval()
1040 pdev->eero = true; in idt_set_defval()
1041 pdev->inieecmd = 0; in idt_set_defval()
1042 pdev->eeaddr = 0; in idt_set_defval()
1048 * idt_ee_match_id() - check whether the node belongs to compatible EEPROMs
1064 while (id->name[0]) { in idt_ee_match_id()
1065 if (strcmp(devname, id->name) == 0) in idt_ee_match_id()
1073 * idt_get_fw_data() - get IDT i2c-device parameters from device tree
1074 * @pdev: Pointer to the driver data
1078 struct device *dev = &pdev->client->dev; in idt_get_fw_data()
1100 pdev->eesize = (u32)ee_id->driver_data; in idt_get_fw_data()
1107 pdev->inieecmd = 0; in idt_get_fw_data()
1108 pdev->eeaddr = EEPROM_DEF_ADDR << 1; in idt_get_fw_data()
1110 pdev->inieecmd = EEPROM_USA; in idt_get_fw_data()
1111 pdev->eeaddr = eeprom_addr << 1; in idt_get_fw_data()
1114 /* Check EEPROM 'read-only' flag */ in idt_get_fw_data()
1115 if (fwnode_property_read_bool(fwnode, "read-only")) in idt_get_fw_data()
1116 pdev->eero = true; in idt_get_fw_data()
1117 else /* if (!fwnode_property_read_bool(node, "read-only")) */ in idt_get_fw_data()
1118 pdev->eero = false; in idt_get_fw_data()
1122 pdev->eesize, pdev->eeaddr); in idt_get_fw_data()
1126 * idt_create_pdev() - create and init data structure of the driver
1127 * @client: i2c client of IDT PCIe-switch device
1134 pdev = devm_kmalloc(&client->dev, sizeof(struct idt_89hpesx_dev), in idt_create_pdev()
1137 return ERR_PTR(-ENOMEM); in idt_create_pdev()
1140 pdev->client = client; in idt_create_pdev()
1143 /* Read firmware nodes information */ in idt_create_pdev()
1146 /* Initialize basic CSR CMD field - use full DWORD-sized r/w ops */ in idt_create_pdev()
1147 pdev->inicsrcmd = CSR_DWE; in idt_create_pdev()
1148 pdev->csr = CSR_DEF; in idt_create_pdev()
1151 if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_PEC)) { in idt_create_pdev()
1152 pdev->iniccode = CCODE_PEC; in idt_create_pdev()
1153 client->flags |= I2C_CLIENT_PEC; in idt_create_pdev()
1155 pdev->iniccode = 0; in idt_create_pdev()
1162 * idt_free_pdev() - free data structure of the driver
1163 * @pdev: Pointer to the driver data
1168 i2c_set_clientdata(pdev->client, NULL); in idt_free_pdev()
1172 * idt_set_smbus_ops() - set supported SMBus operations
1173 * @pdev: Pointer to the driver data
1178 struct i2c_adapter *adapter = pdev->client->adapter; in idt_set_smbus_ops()
1179 struct device *dev = &pdev->client->dev; in idt_set_smbus_ops()
1181 /* Check i2c adapter read functionality */ in idt_set_smbus_ops()
1184 pdev->smb_read = idt_smb_read_block; in idt_set_smbus_ops()
1185 dev_dbg(dev, "SMBus block-read op chosen"); in idt_set_smbus_ops()
1188 pdev->smb_read = idt_smb_read_i2c_block; in idt_set_smbus_ops()
1189 dev_dbg(dev, "SMBus i2c-block-read op chosen"); in idt_set_smbus_ops()
1194 pdev->smb_read = idt_smb_read_word; in idt_set_smbus_ops()
1195 dev_warn(dev, "Use slow word/byte SMBus read ops"); in idt_set_smbus_ops()
1198 pdev->smb_read = idt_smb_read_byte; in idt_set_smbus_ops()
1199 dev_warn(dev, "Use slow byte SMBus read op"); in idt_set_smbus_ops()
1200 } else /* no supported smbus read operations */ { in idt_set_smbus_ops()
1201 dev_err(dev, "No supported SMBus read op"); in idt_set_smbus_ops()
1202 return -EPFNOSUPPORT; in idt_set_smbus_ops()
1208 pdev->smb_write = idt_smb_write_block; in idt_set_smbus_ops()
1209 dev_dbg(dev, "SMBus block-write op chosen"); in idt_set_smbus_ops()
1212 pdev->smb_write = idt_smb_write_i2c_block; in idt_set_smbus_ops()
1213 dev_dbg(dev, "SMBus i2c-block-write op chosen"); in idt_set_smbus_ops()
1218 pdev->smb_write = idt_smb_write_word; in idt_set_smbus_ops()
1222 pdev->smb_write = idt_smb_write_byte; in idt_set_smbus_ops()
1226 return -EPFNOSUPPORT; in idt_set_smbus_ops()
1230 mutex_init(&pdev->smb_mtx); in idt_set_smbus_ops()
1236 * idt_check_dev() - check whether it's really IDT 89HPESx device
1237 * @pdev: Pointer to the driver data
1242 struct device *dev = &pdev->client->dev; in idt_check_dev()
1246 /* Read VID and DID directly from IDT memory space */ in idt_check_dev()
1249 dev_err(dev, "Failed to read VID/DID"); in idt_check_dev()
1256 return -ENODEV; in idt_check_dev()
1266 * idt_create_sysfs_files() - create sysfs attribute files
1267 * @pdev: Pointer to the driver data
1272 struct device *dev = &pdev->client->dev; in idt_create_sysfs_files()
1276 if (pdev->eesize == 0) { in idt_create_sysfs_files()
1277 dev_dbg(dev, "Skip creating sysfs-files"); in idt_create_sysfs_files()
1283 * structure to change some of fields in idt_create_sysfs_files()
1285 pdev->ee_file = devm_kmemdup(dev, &bin_attr_eeprom, in idt_create_sysfs_files()
1286 sizeof(*pdev->ee_file), GFP_KERNEL); in idt_create_sysfs_files()
1287 if (!pdev->ee_file) in idt_create_sysfs_files()
1288 return -ENOMEM; in idt_create_sysfs_files()
1290 /* In case of read-only EEPROM get rid of write ability */ in idt_create_sysfs_files()
1291 if (pdev->eero) { in idt_create_sysfs_files()
1292 pdev->ee_file->attr.mode &= ~0200; in idt_create_sysfs_files()
1293 pdev->ee_file->write = NULL; in idt_create_sysfs_files()
1296 pdev->ee_file->size = pdev->eesize; in idt_create_sysfs_files()
1297 ret = sysfs_create_bin_file(&dev->kobj, pdev->ee_file); in idt_create_sysfs_files()
1299 dev_err(dev, "Failed to create EEPROM sysfs-node"); in idt_create_sysfs_files()
1307 * idt_remove_sysfs_files() - remove sysfs attribute files
1308 * @pdev: Pointer to the driver data
1312 struct device *dev = &pdev->client->dev; in idt_remove_sysfs_files()
1315 if (pdev->eesize == 0) in idt_remove_sysfs_files()
1319 sysfs_remove_bin_file(&dev->kobj, pdev->ee_file); in idt_remove_sysfs_files()
1323 * idt_probe() - IDT 89HPESx driver probe() callback method
1351 debugfs_create_file(pdev->client->name, 0600, client->debugfs, pdev, &csr_dbgfs_ops); in idt_probe()
1362 * idt_remove() - IDT 89HPESx driver remove() callback method
1376 * ee_ids - array of supported EEPROMs
1389 * idt_ids - supported IDT 89HPESx devices
1423 /* { "89hpes3t3" }, // No SMBus-slave iface */
1426 /* { "89hpes4t4" }, // No SMBus-slave iface */
1505 * idt_driver - IDT 89HPESx driver structure