summaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/realtek/rtw89/rtw8852cu.c
blob: 2dec9b8454815f3d826557d832275d9e3e4ee1ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
/* Copyright(c) 2025  Realtek Corporation
 */

#include <linux/module.h>
#include <linux/usb.h>
#include "rtw8852c.h"
#include "reg.h"
#include "usb.h"

static const struct rtw89_usb_info rtw8852c_usb_info = {
	.usb_host_request_2		= R_AX_USB_HOST_REQUEST_2_V1,
	.usb_wlan0_1			= R_AX_USB_WLAN0_1_V1,
	.hci_func_en			= R_AX_HCI_FUNC_EN_V1,
	.usb3_mac_npi_config_intf_0	= R_AX_USB3_MAC_NPI_CONFIG_INTF_0_V1,
	.usb_endpoint_0			= R_AX_USB_ENDPOINT_0_V1,
	.usb_endpoint_2			= R_AX_USB_ENDPOINT_2_V1,
	.rx_agg_alignment		= 8,
	.bulkout_id = {
		[RTW89_DMA_ACH0] = 3,
		[RTW89_DMA_ACH2] = 5,
		[RTW89_DMA_ACH4] = 4,
		[RTW89_DMA_ACH6] = 6,
		[RTW89_DMA_B0MG] = 0,
		[RTW89_DMA_B0HI] = 0,
		[RTW89_DMA_B1MG] = 1,
		[RTW89_DMA_B1HI] = 1,
		[RTW89_DMA_H2C] = 2,
	},
};

static const struct rtw89_driver_info rtw89_8852cu_info = {
	.chip = &rtw8852c_chip_info,
	.variant = NULL,
	.board = NULL,
	.quirks = NULL,
	.dev_id_quirks = 0,
	.bus = {
		.usb = &rtw8852c_usb_info,
	},
};

static const struct rtw89_led_gpio_entry rtw8852cu_valve_led_gpios[] = {
	{
		.pin = 8,
		.color = LED_COLOR_ID_WHITE,
		.intensity = 0,
		.pinmux = {.addr = R_AX_GPIO8_15_FUNC_SEL,
			   .mask = GENMASK(3, 0),
			   .data = 0xf},
		.mode = {.addr = R_AX_GPIO_EXT_CTRL + 2, .data = BIT(0) | BIT(8)},
		.out = {.addr = R_AX_GPIO_EXT_CTRL + 1, .data = BIT(0)},
	}, {
		.pin = 18,
		.color = LED_COLOR_ID_RED,
		.intensity = 0,
		.pinmux = {.addr = R_AX_GPIO16_23_FUNC_SEL,
			   .mask = GENMASK(11, 8),
			   .data = 0xf},
		.mode = {.addr = R_AX_GPIO_16_TO_18_EXT_CTRL + 2,
			 .data = BIT(2) | BIT(10)},
		.out = {.addr = R_AX_GPIO_16_TO_18_EXT_CTRL + 1, .data = BIT(2)},
	}, {
		.pin = 16,
		.color = LED_COLOR_ID_GREEN,
		.intensity = 1,
		.pinmux = {.addr = R_AX_GPIO16_23_FUNC_SEL,
			   .mask = GENMASK(3, 0),
			   .data = 0xf},
		.mode = {.addr = R_AX_GPIO_16_TO_18_EXT_CTRL + 2,
			 .data = BIT(0) | BIT(8)},
		.out = {.addr = R_AX_GPIO_16_TO_18_EXT_CTRL + 1, .data = BIT(0)},
	}, {
		.pin = 17,
		.color = LED_COLOR_ID_BLUE,
		.intensity = 0,
		.pinmux = {.addr = R_AX_GPIO16_23_FUNC_SEL,
			   .mask = GENMASK(7, 4),
			   .data = 0xf},
		.mode = {.addr = R_AX_GPIO_16_TO_18_EXT_CTRL + 2,
			 .data = BIT(1) | BIT(9)},
		.out = {.addr = R_AX_GPIO_16_TO_18_EXT_CTRL + 1, .data = BIT(1)},
	},
};

static const struct rtw89_led_desc rtw8852cu_valve_led_desc = {
	.gpios = rtw8852cu_valve_led_gpios,
	.n_gpio = ARRAY_SIZE(rtw8852cu_valve_led_gpios),
};

static const struct rtw89_board_variant rtw89_8852cu_valve_board = {
	.led_desc = &rtw8852cu_valve_led_desc,
};

static const struct rtw89_driver_info rtw89_8852cu_valve_info = {
	.chip = &rtw8852c_chip_info,
	.variant = NULL,
	.board = &rtw89_8852cu_valve_board,
	.quirks = NULL,
	.dev_id_quirks = BIT(RTW89_QUIRK_HW_INFO_SYSFS) |
			 BIT(RTW89_QUIRK_DISABLE_2GHZ),
	.bus = {
		.usb = &rtw8852c_usb_info,
	},
};

static const struct usb_device_id rtw_8852cu_id_table[] = {
	{ USB_DEVICE_AND_INTERFACE_INFO(0x0411, 0x03a6, 0xff, 0xff, 0xff),
	  .driver_info = (kernel_ulong_t)&rtw89_8852cu_info },
	{ USB_DEVICE_AND_INTERFACE_INFO(0x056e, 0x4024, 0xff, 0xff, 0xff),
	  .driver_info = (kernel_ulong_t)&rtw89_8852cu_info },
	{ USB_DEVICE_AND_INTERFACE_INFO(0x0bda, 0xc832, 0xff, 0xff, 0xff),
	  .driver_info = (kernel_ulong_t)&rtw89_8852cu_info },
	{ USB_DEVICE_AND_INTERFACE_INFO(0x0bda, 0xc85a, 0xff, 0xff, 0xff),
	  .driver_info = (kernel_ulong_t)&rtw89_8852cu_info },
	{ USB_DEVICE_AND_INTERFACE_INFO(0x0bda, 0xc85d, 0xff, 0xff, 0xff),
	  .driver_info = (kernel_ulong_t)&rtw89_8852cu_info },
	{ USB_DEVICE_AND_INTERFACE_INFO(0x0db0, 0x991d, 0xff, 0xff, 0xff),
	  .driver_info = (kernel_ulong_t)&rtw89_8852cu_info },
	{ USB_DEVICE_AND_INTERFACE_INFO(0x28de, 0x2432, 0xff, 0xff, 0xff),
	  .driver_info = (kernel_ulong_t)&rtw89_8852cu_valve_info },
	{ USB_DEVICE_AND_INTERFACE_INFO(0x2c7c, 0x8206, 0xff, 0xff, 0xff),
	  .driver_info = (kernel_ulong_t)&rtw89_8852cu_info },
	{ USB_DEVICE_AND_INTERFACE_INFO(0x35b2, 0x0502, 0xff, 0xff, 0xff),
	  .driver_info = (kernel_ulong_t)&rtw89_8852cu_info },
	{ USB_DEVICE_AND_INTERFACE_INFO(0x35bc, 0x0101, 0xff, 0xff, 0xff),
	  .driver_info = (kernel_ulong_t)&rtw89_8852cu_info },
	{ USB_DEVICE_AND_INTERFACE_INFO(0x35bc, 0x0102, 0xff, 0xff, 0xff),
	  .driver_info = (kernel_ulong_t)&rtw89_8852cu_info },
	{ USB_DEVICE_AND_INTERFACE_INFO(0x37ad, 0x0103, 0xff, 0xff, 0xff),
	  .driver_info = (kernel_ulong_t)&rtw89_8852cu_info },
	{},
};
MODULE_DEVICE_TABLE(usb, rtw_8852cu_id_table);

static struct usb_driver rtw_8852cu_driver = {
	.name = KBUILD_MODNAME,
	.id_table = rtw_8852cu_id_table,
	.probe = rtw89_usb_probe,
	.disconnect = rtw89_usb_disconnect,
};
module_usb_driver(rtw_8852cu_driver);

MODULE_AUTHOR("Bitterblue Smith <rtl8821cerfe2@gmail.com>");
MODULE_DESCRIPTION("Realtek 802.11ax wireless 8852CU driver");
MODULE_LICENSE("Dual BSD/GPL");