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