| /* 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 |