| /* SPDX-License-Identifier: GPL-2.0 */ | |
| /* | |
| * Copyright (C) 2025 Nuvoton Technology Corp. | |
| * | |
| * Nuvoton NCT6694 USB transaction and data structure. | |
| */ | |
| #ifndef __MFD_NCT6694_H | |
| #define __MFD_NCT6694_H | |
| #define NCT6694_VENDOR_ID 0x0416 | |
| #define NCT6694_PRODUCT_ID 0x200B | |
| #define NCT6694_INT_IN_EP 0x81 | |
| #define NCT6694_BULK_IN_EP 0x02 | |
| #define NCT6694_BULK_OUT_EP 0x03 | |
| #define NCT6694_HCTRL_SET 0x40 | |
| #define NCT6694_HCTRL_GET 0x80 | |
| #define NCT6694_URB_TIMEOUT 1000 | |
| enum nct6694_irq_id { | |
| NCT6694_IRQ_GPIO0 = 0, | |
| NCT6694_IRQ_GPIO1, | |
| NCT6694_IRQ_GPIO2, | |
| NCT6694_IRQ_GPIO3, | |
| NCT6694_IRQ_GPIO4, | |
| NCT6694_IRQ_GPIO5, | |
| NCT6694_IRQ_GPIO6, | |
| NCT6694_IRQ_GPIO7, | |
| NCT6694_IRQ_GPIO8, | |
| NCT6694_IRQ_GPIO9, | |
| NCT6694_IRQ_GPIOA, | |
| NCT6694_IRQ_GPIOB, | |
| NCT6694_IRQ_GPIOC, | |
| NCT6694_IRQ_GPIOD, | |
| NCT6694_IRQ_GPIOE, | |
| NCT6694_IRQ_GPIOF, | |
| NCT6694_IRQ_CAN0, | |
| NCT6694_IRQ_CAN1, | |
| NCT6694_IRQ_RTC, | |
| NCT6694_NR_IRQS, | |
| }; | |
| enum nct6694_response_err_status { | |
| NCT6694_NO_ERROR = 0, | |
| NCT6694_FORMAT_ERROR, | |
| NCT6694_RESERVED1, | |
| NCT6694_RESERVED2, | |
| NCT6694_NOT_SUPPORT_ERROR, | |
| NCT6694_NO_RESPONSE_ERROR, | |
| NCT6694_TIMEOUT_ERROR, | |
| NCT6694_PENDING, | |
| }; | |
| struct __packed nct6694_cmd_header { | |
| u8 rsv1; | |
| u8 mod; | |
| union __packed { | |
| __le16 offset; | |
| struct __packed { | |
| u8 cmd; | |
| u8 sel; | |
| }; | |
| }; | |
| u8 hctrl; | |
| u8 rsv2; | |
| __le16 len; | |
| }; | |
| struct __packed nct6694_response_header { | |
| u8 sequence_id; | |
| u8 sts; | |
| u8 reserved[4]; | |
| __le16 len; | |
| }; | |
| union __packed nct6694_usb_msg { | |
| struct nct6694_cmd_header cmd_header; | |
| struct nct6694_response_header response_header; | |
| }; | |
| struct nct6694 { | |
| struct device *dev; | |
| struct ida gpio_ida; | |
| struct ida i2c_ida; | |
| struct ida canfd_ida; | |
| struct ida wdt_ida; | |
| struct irq_domain *domain; | |
| struct mutex access_lock; | |
| spinlock_t irq_lock; | |
| struct urb *int_in_urb; | |
| struct usb_device *udev; | |
| union nct6694_usb_msg *usb_msg; | |
| __le32 *int_buffer; | |
| unsigned int irq_enable; | |
| }; | |
| int nct6694_read_msg(struct nct6694 *nct6694, const struct nct6694_cmd_header *cmd_hd, void *buf); | |
| int nct6694_write_msg(struct nct6694 *nct6694, const struct nct6694_cmd_header *cmd_hd, void *buf); | |
| #endif |