1638eae9bSVadim Pasternak /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
21f976f69SVadim Pasternak /*
3638eae9bSVadim Pasternak  * Copyright (C) 2017-2020 Mellanox Technologies Ltd.
41f976f69SVadim Pasternak  */
51f976f69SVadim Pasternak 
61f976f69SVadim Pasternak #ifndef __LINUX_PLATFORM_DATA_MLXREG_H
71f976f69SVadim Pasternak #define __LINUX_PLATFORM_DATA_MLXREG_H
81f976f69SVadim Pasternak 
9c6acad68SVadim Pasternak #define MLXREG_CORE_LABEL_MAX_SIZE	32
109f03161aSMichael Shych #define MLXREG_CORE_WD_FEATURE_NOWAYOUT		BIT(0)
119f03161aSMichael Shych #define MLXREG_CORE_WD_FEATURE_START_AT_BOOT	BIT(1)
129f03161aSMichael Shych 
139f03161aSMichael Shych /**
149f03161aSMichael Shych  * enum mlxreg_wdt_type - type of HW watchdog
159f03161aSMichael Shych  *
169f03161aSMichael Shych  * TYPE1 HW watchdog implementation exist in old systems.
179f03161aSMichael Shych  * All new systems have TYPE2 HW watchdog.
18923a3a86SMichael Shych  * TYPE3 HW watchdog can exist on all systems with new CPLD.
19923a3a86SMichael Shych  * TYPE3 is selected by WD capability bit.
209f03161aSMichael Shych  */
219f03161aSMichael Shych enum mlxreg_wdt_type {
229f03161aSMichael Shych 	MLX_WDT_TYPE1,
239f03161aSMichael Shych 	MLX_WDT_TYPE2,
24923a3a86SMichael Shych 	MLX_WDT_TYPE3,
259f03161aSMichael Shych };
26c6acad68SVadim Pasternak 
271f976f69SVadim Pasternak /**
28aafa1cafSVadim Pasternak  * enum mlxreg_hotplug_kind - kind of hotplug entry
29aafa1cafSVadim Pasternak  *
30aafa1cafSVadim Pasternak  * @MLXREG_HOTPLUG_DEVICE_NA: do not care;
31aafa1cafSVadim Pasternak  * @MLXREG_HOTPLUG_LC_PRESENT: entry for line card presence in/out events;
32aafa1cafSVadim Pasternak  * @MLXREG_HOTPLUG_LC_VERIFIED: entry for line card verification status events
33aafa1cafSVadim Pasternak  *				coming after line card security signature validation;
34aafa1cafSVadim Pasternak  * @MLXREG_HOTPLUG_LC_POWERED: entry for line card power on/off events;
35aafa1cafSVadim Pasternak  * @MLXREG_HOTPLUG_LC_SYNCED: entry for line card synchronization events, coming
36aafa1cafSVadim Pasternak  *			      after hardware-firmware synchronization handshake;
37aafa1cafSVadim Pasternak  * @MLXREG_HOTPLUG_LC_READY: entry for line card ready events, indicating line card
38aafa1cafSVadim Pasternak 			     PHYs ready / unready state;
39aafa1cafSVadim Pasternak  * @MLXREG_HOTPLUG_LC_ACTIVE: entry for line card active events, indicating firmware
40aafa1cafSVadim Pasternak  *			      availability / unavailability for the ports on line card;
41aafa1cafSVadim Pasternak  * @MLXREG_HOTPLUG_LC_THERMAL: entry for line card thermal shutdown events, positive
42aafa1cafSVadim Pasternak  *			       event indicates that system should power off the line
43aafa1cafSVadim Pasternak  *			       card for which this event has been received;
44aafa1cafSVadim Pasternak  */
45aafa1cafSVadim Pasternak enum mlxreg_hotplug_kind {
46aafa1cafSVadim Pasternak 	MLXREG_HOTPLUG_DEVICE_NA = 0,
47aafa1cafSVadim Pasternak 	MLXREG_HOTPLUG_LC_PRESENT = 1,
48aafa1cafSVadim Pasternak 	MLXREG_HOTPLUG_LC_VERIFIED = 2,
49aafa1cafSVadim Pasternak 	MLXREG_HOTPLUG_LC_POWERED = 3,
50aafa1cafSVadim Pasternak 	MLXREG_HOTPLUG_LC_SYNCED = 4,
51aafa1cafSVadim Pasternak 	MLXREG_HOTPLUG_LC_READY = 5,
52aafa1cafSVadim Pasternak 	MLXREG_HOTPLUG_LC_ACTIVE = 6,
53aafa1cafSVadim Pasternak 	MLXREG_HOTPLUG_LC_THERMAL = 7,
54aafa1cafSVadim Pasternak };
55aafa1cafSVadim Pasternak 
56aafa1cafSVadim Pasternak /**
57aafa1cafSVadim Pasternak  * enum mlxreg_hotplug_device_action - hotplug device action required for
58aafa1cafSVadim Pasternak  *				       driver's connectivity
59aafa1cafSVadim Pasternak  *
60aafa1cafSVadim Pasternak  * @MLXREG_HOTPLUG_DEVICE_DEFAULT_ACTION: probe device for 'on' event, remove
61aafa1cafSVadim Pasternak  *					  for 'off' event;
62aafa1cafSVadim Pasternak  * @MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION: probe platform device for 'on'
63aafa1cafSVadim Pasternak  *					   event, remove for 'off' event;
64aafa1cafSVadim Pasternak  * @MLXREG_HOTPLUG_DEVICE_NO_ACTION: no connectivity action is required;
65aafa1cafSVadim Pasternak  */
66aafa1cafSVadim Pasternak enum mlxreg_hotplug_device_action {
67aafa1cafSVadim Pasternak 	MLXREG_HOTPLUG_DEVICE_DEFAULT_ACTION = 0,
68aafa1cafSVadim Pasternak 	MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION = 1,
69aafa1cafSVadim Pasternak 	MLXREG_HOTPLUG_DEVICE_NO_ACTION = 2,
70aafa1cafSVadim Pasternak };
71aafa1cafSVadim Pasternak 
72aafa1cafSVadim Pasternak /**
73bb1023b6SVadim Pasternak  * struct mlxreg_core_hotplug_notifier - hotplug notifier block:
74bb1023b6SVadim Pasternak  *
75bb1023b6SVadim Pasternak  * @identity: notifier identity name;
76bb1023b6SVadim Pasternak  * @handle: user handle to be passed by user handler function;
77bb1023b6SVadim Pasternak  * @user_handler: user handler function associated with the event;
78bb1023b6SVadim Pasternak  */
79bb1023b6SVadim Pasternak struct mlxreg_core_hotplug_notifier {
80bb1023b6SVadim Pasternak 	char identity[MLXREG_CORE_LABEL_MAX_SIZE];
81bb1023b6SVadim Pasternak 	void *handle;
82bb1023b6SVadim Pasternak 	int (*user_handler)(void *handle, enum mlxreg_hotplug_kind kind, u8 action);
83bb1023b6SVadim Pasternak };
84bb1023b6SVadim Pasternak 
85bb1023b6SVadim Pasternak /**
861f976f69SVadim Pasternak  * struct mlxreg_hotplug_device - I2C device data:
87c6acad68SVadim Pasternak  *
881f976f69SVadim Pasternak  * @adapter: I2C device adapter;
891f976f69SVadim Pasternak  * @client: I2C device client;
901f976f69SVadim Pasternak  * @brdinfo: device board information;
913d838f55SVadim Pasternak  * @nr: I2C device adapter number, to which device is to be attached;
92bb1023b6SVadim Pasternak  * @pdev: platform device, if device is instantiated as a platform device;
93aafa1cafSVadim Pasternak  * @action: action to be performed upon event receiving;
94bb1023b6SVadim Pasternak  * @handle: user handle to be passed by user handler function;
95bb1023b6SVadim Pasternak  * @user_handler: user handler function associated with the event;
96bb1023b6SVadim Pasternak  * @notifier: pointer to event notifier block;
971f976f69SVadim Pasternak  *
981f976f69SVadim Pasternak  * Structure represents I2C hotplug device static data (board topology) and
991f976f69SVadim Pasternak  * dynamic data (related kernel objects handles).
1001f976f69SVadim Pasternak  */
1011f976f69SVadim Pasternak struct mlxreg_hotplug_device {
1021f976f69SVadim Pasternak 	struct i2c_adapter *adapter;
1031f976f69SVadim Pasternak 	struct i2c_client *client;
104c6acad68SVadim Pasternak 	struct i2c_board_info *brdinfo;
1053d838f55SVadim Pasternak 	int nr;
106bb1023b6SVadim Pasternak 	struct platform_device *pdev;
107aafa1cafSVadim Pasternak 	enum mlxreg_hotplug_device_action action;
108bb1023b6SVadim Pasternak 	void *handle;
109bb1023b6SVadim Pasternak 	int (*user_handler)(void *handle, enum mlxreg_hotplug_kind kind, u8 action);
110bb1023b6SVadim Pasternak 	struct mlxreg_core_hotplug_notifier *notifier;
1111f976f69SVadim Pasternak };
1121f976f69SVadim Pasternak 
1131f976f69SVadim Pasternak /**
114c6acad68SVadim Pasternak  * struct mlxreg_core_data - attributes control data:
1151f976f69SVadim Pasternak  *
116c6acad68SVadim Pasternak  * @label: attribute label;
117c6acad68SVadim Pasternak  * @reg: attribute register;
118c6acad68SVadim Pasternak  * @mask: attribute access mask;
119c6acad68SVadim Pasternak  * @bit: attribute effective bit;
120946e4e02SVadim Pasternak  * @capability: attribute capability register;
12117727a3bSVadim Pasternak  * @reg_prsnt: attribute presence register;
122aafa1cafSVadim Pasternak  * @reg_sync: attribute synch register;
123aafa1cafSVadim Pasternak  * @reg_pwr: attribute power register;
124aafa1cafSVadim Pasternak  * @reg_ena: attribute enable register;
12598004a78SVadim Pasternak  * @mode: access mode;
126c6acad68SVadim Pasternak  * @np - pointer to node platform associated with attribute;
127c6acad68SVadim Pasternak  * @hpdev - hotplug device data;
128bb1023b6SVadim Pasternak  * @notifier: pointer to event notifier block;
129c6acad68SVadim Pasternak  * @health_cntr: dynamic device health indication counter;
130c6acad68SVadim Pasternak  * @attached: true if device has been attached after good health indication;
13113e52e63SVadim Pasternak  * @regnum: number of registers occupied by multi-register attribute;
132aafa1cafSVadim Pasternak  * @slot: slot number, at which device is located;
133bb1023b6SVadim Pasternak  * @secured: if set indicates that entry access is secured;
1341f976f69SVadim Pasternak  */
135c6acad68SVadim Pasternak struct mlxreg_core_data {
136c6acad68SVadim Pasternak 	char label[MLXREG_CORE_LABEL_MAX_SIZE];
137c6acad68SVadim Pasternak 	u32 reg;
138c6acad68SVadim Pasternak 	u32 mask;
139c6acad68SVadim Pasternak 	u32 bit;
140946e4e02SVadim Pasternak 	u32 capability;
14117727a3bSVadim Pasternak 	u32 reg_prsnt;
142aafa1cafSVadim Pasternak 	u32 reg_sync;
143aafa1cafSVadim Pasternak 	u32 reg_pwr;
144aafa1cafSVadim Pasternak 	u32 reg_ena;
145c6acad68SVadim Pasternak 	umode_t	mode;
146c6acad68SVadim Pasternak 	struct device_node *np;
147c6acad68SVadim Pasternak 	struct mlxreg_hotplug_device hpdev;
148bb1023b6SVadim Pasternak 	struct mlxreg_core_hotplug_notifier *notifier;
149923a3a86SMichael Shych 	u32 health_cntr;
150c6acad68SVadim Pasternak 	bool attached;
15113e52e63SVadim Pasternak 	u8 regnum;
152aafa1cafSVadim Pasternak 	u8 slot;
1539d93d787SVadim Pasternak 	u8 secured;
154c6acad68SVadim Pasternak };
155c6acad68SVadim Pasternak 
156c6acad68SVadim Pasternak /**
157c6acad68SVadim Pasternak  * struct mlxreg_core_item - same type components controlled by the driver:
158c6acad68SVadim Pasternak  *
159c6acad68SVadim Pasternak  * @data: component data;
160aafa1cafSVadim Pasternak  * @kind: kind of hotplug attribute;
161c6acad68SVadim Pasternak  * @aggr_mask: group aggregation mask;
162c6acad68SVadim Pasternak  * @reg: group interrupt status register;
163c6acad68SVadim Pasternak  * @mask: group interrupt mask;
1640e41bf06SVadim Pasternak  * @capability: group capability register;
165c6acad68SVadim Pasternak  * @cache: last status value for elements fro the same group;
166c6acad68SVadim Pasternak  * @count: number of available elements in the group;
167c6acad68SVadim Pasternak  * @ind: element's index inside the group;
168c6acad68SVadim Pasternak  * @inversed: if 0: 0 for signal status is OK, if 1 - 1 is OK;
169c6acad68SVadim Pasternak  * @health: true if device has health indication, false in other case;
170c6acad68SVadim Pasternak  */
171c6acad68SVadim Pasternak struct mlxreg_core_item {
172c6acad68SVadim Pasternak 	struct mlxreg_core_data *data;
173aafa1cafSVadim Pasternak 	enum mlxreg_hotplug_kind kind;
174c6acad68SVadim Pasternak 	u32 aggr_mask;
175c6acad68SVadim Pasternak 	u32 reg;
176c6acad68SVadim Pasternak 	u32 mask;
1770e41bf06SVadim Pasternak 	u32 capability;
178c6acad68SVadim Pasternak 	u32 cache;
179c6acad68SVadim Pasternak 	u8 count;
180c6acad68SVadim Pasternak 	u8 ind;
181c6acad68SVadim Pasternak 	u8 inversed;
182c6acad68SVadim Pasternak 	u8 health;
183c6acad68SVadim Pasternak };
184c6acad68SVadim Pasternak 
185c6acad68SVadim Pasternak /**
186c6acad68SVadim Pasternak  * struct mlxreg_core_platform_data - platform data:
187c6acad68SVadim Pasternak  *
1889b28aa1dSVadim Pasternak  * @data: instance private data;
189c6acad68SVadim Pasternak  * @regmap: register map of parent device;
1909b28aa1dSVadim Pasternak  * @counter: number of instances;
1919f03161aSMichael Shych  * @features: supported features of device;
1929f03161aSMichael Shych  * @version: implementation version;
1939f03161aSMichael Shych  * @identity: device identity name;
194d2f3ab5bSVadim Pasternak  * @capability: device capability register;
195c6acad68SVadim Pasternak  */
196c6acad68SVadim Pasternak struct mlxreg_core_platform_data {
197c6acad68SVadim Pasternak 	struct mlxreg_core_data *data;
198c6acad68SVadim Pasternak 	void *regmap;
199c6acad68SVadim Pasternak 	int counter;
2009f03161aSMichael Shych 	u32 features;
2019f03161aSMichael Shych 	u32 version;
2029f03161aSMichael Shych 	char identity[MLXREG_CORE_LABEL_MAX_SIZE];
203d2f3ab5bSVadim Pasternak 	u32 capability;
204c6acad68SVadim Pasternak };
205c6acad68SVadim Pasternak 
206c6acad68SVadim Pasternak /**
207c6acad68SVadim Pasternak  * struct mlxreg_core_hotplug_platform_data - hotplug platform data:
208c6acad68SVadim Pasternak  *
209c6acad68SVadim Pasternak  * @items: same type components with the hotplug capability;
210c6acad68SVadim Pasternak  * @irq: platform interrupt number;
211c6acad68SVadim Pasternak  * @regmap: register map of parent device;
212c6acad68SVadim Pasternak  * @counter: number of the components with the hotplug capability;
213c6acad68SVadim Pasternak  * @cell: location of top aggregation interrupt register;
214c6acad68SVadim Pasternak  * @mask: top aggregation interrupt common mask;
215c6acad68SVadim Pasternak  * @cell_low: location of low aggregation interrupt register;
216c6acad68SVadim Pasternak  * @mask_low: low aggregation interrupt common mask;
217d726f6b1SVadim Pasternak  * @deferred_nr: I2C adapter number must be exist prior probing execution;
218ef0f6226SVadim Pasternak  * @shift_nr: I2C adapter numbers must be incremented by this value;
219*26917eabSVadim Pasternak  * @addr: mapped resource address;
220abcebcd3SMichael Shych  * @handle: handle to be passed by callback;
221abcebcd3SMichael Shych  * @completion_notify: callback to notify when platform driver probing is done;
222c6acad68SVadim Pasternak  */
223c6acad68SVadim Pasternak struct mlxreg_core_hotplug_platform_data {
224c6acad68SVadim Pasternak 	struct mlxreg_core_item *items;
225c6acad68SVadim Pasternak 	int irq;
226c6acad68SVadim Pasternak 	void *regmap;
227c6acad68SVadim Pasternak 	int counter;
228c6acad68SVadim Pasternak 	u32 cell;
229c6acad68SVadim Pasternak 	u32 mask;
230c6acad68SVadim Pasternak 	u32 cell_low;
231c6acad68SVadim Pasternak 	u32 mask_low;
232d726f6b1SVadim Pasternak 	int deferred_nr;
233ef0f6226SVadim Pasternak 	int shift_nr;
234*26917eabSVadim Pasternak 	void __iomem *addr;
235abcebcd3SMichael Shych 	void *handle;
236abcebcd3SMichael Shych 	int (*completion_notify)(void *handle, int id);
2371f976f69SVadim Pasternak };
2381f976f69SVadim Pasternak 
2391f976f69SVadim Pasternak #endif /* __LINUX_PLATFORM_DATA_MLXREG_H */
240