xref: /linux/include/linux/mfd/nct6694.h (revision ec2e0fb07d789976c601bec19ecced7a501c3705)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) 2025 Nuvoton Technology Corp.
4  *
5  * Nuvoton NCT6694 USB transaction and data structure.
6  */
7 
8 #ifndef __MFD_NCT6694_H
9 #define __MFD_NCT6694_H
10 
11 #define NCT6694_VENDOR_ID	0x0416
12 #define NCT6694_PRODUCT_ID	0x200B
13 #define NCT6694_INT_IN_EP	0x81
14 #define NCT6694_BULK_IN_EP	0x02
15 #define NCT6694_BULK_OUT_EP	0x03
16 
17 #define NCT6694_HCTRL_SET	0x40
18 #define NCT6694_HCTRL_GET	0x80
19 
20 #define NCT6694_URB_TIMEOUT	1000
21 
22 enum nct6694_irq_id {
23 	NCT6694_IRQ_GPIO0 = 0,
24 	NCT6694_IRQ_GPIO1,
25 	NCT6694_IRQ_GPIO2,
26 	NCT6694_IRQ_GPIO3,
27 	NCT6694_IRQ_GPIO4,
28 	NCT6694_IRQ_GPIO5,
29 	NCT6694_IRQ_GPIO6,
30 	NCT6694_IRQ_GPIO7,
31 	NCT6694_IRQ_GPIO8,
32 	NCT6694_IRQ_GPIO9,
33 	NCT6694_IRQ_GPIOA,
34 	NCT6694_IRQ_GPIOB,
35 	NCT6694_IRQ_GPIOC,
36 	NCT6694_IRQ_GPIOD,
37 	NCT6694_IRQ_GPIOE,
38 	NCT6694_IRQ_GPIOF,
39 	NCT6694_IRQ_CAN0,
40 	NCT6694_IRQ_CAN1,
41 	NCT6694_IRQ_RTC,
42 	NCT6694_NR_IRQS,
43 };
44 
45 enum nct6694_response_err_status {
46 	NCT6694_NO_ERROR = 0,
47 	NCT6694_FORMAT_ERROR,
48 	NCT6694_RESERVED1,
49 	NCT6694_RESERVED2,
50 	NCT6694_NOT_SUPPORT_ERROR,
51 	NCT6694_NO_RESPONSE_ERROR,
52 	NCT6694_TIMEOUT_ERROR,
53 	NCT6694_PENDING,
54 };
55 
56 struct __packed nct6694_cmd_header {
57 	u8 rsv1;
58 	u8 mod;
59 	union __packed {
60 		__le16 offset;
61 		struct __packed {
62 			u8 cmd;
63 			u8 sel;
64 		};
65 	};
66 	u8 hctrl;
67 	u8 rsv2;
68 	__le16 len;
69 };
70 
71 struct __packed nct6694_response_header {
72 	u8 sequence_id;
73 	u8 sts;
74 	u8 reserved[4];
75 	__le16 len;
76 };
77 
78 union __packed nct6694_usb_msg {
79 	struct nct6694_cmd_header cmd_header;
80 	struct nct6694_response_header response_header;
81 };
82 
83 struct nct6694 {
84 	struct device *dev;
85 	struct ida gpio_ida;
86 	struct ida i2c_ida;
87 	struct ida canfd_ida;
88 	struct ida wdt_ida;
89 	struct irq_domain *domain;
90 	struct mutex access_lock;
91 	spinlock_t irq_lock;
92 	struct urb *int_in_urb;
93 	struct usb_device *udev;
94 	union nct6694_usb_msg *usb_msg;
95 	__le32 *int_buffer;
96 	unsigned int irq_enable;
97 };
98 
99 int nct6694_read_msg(struct nct6694 *nct6694, const struct nct6694_cmd_header *cmd_hd, void *buf);
100 int nct6694_write_msg(struct nct6694 *nct6694, const struct nct6694_cmd_header *cmd_hd, void *buf);
101 
102 #endif
103