162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Nvidia sn2201 driver 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2022 Nvidia Technologies Ltd. 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/device.h> 962306a36Sopenharmony_ci#include <linux/i2c.h> 1062306a36Sopenharmony_ci#include <linux/interrupt.h> 1162306a36Sopenharmony_ci#include <linux/irq.h> 1262306a36Sopenharmony_ci#include <linux/gpio.h> 1362306a36Sopenharmony_ci#include <linux/module.h> 1462306a36Sopenharmony_ci#include <linux/platform_data/mlxcpld.h> 1562306a36Sopenharmony_ci#include <linux/platform_data/mlxreg.h> 1662306a36Sopenharmony_ci#include <linux/platform_device.h> 1762306a36Sopenharmony_ci#include <linux/regmap.h> 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci/* SN2201 CPLD register offset. */ 2062306a36Sopenharmony_ci#define NVSW_SN2201_CPLD_LPC_I2C_BASE_ADRR 0x2000 2162306a36Sopenharmony_ci#define NVSW_SN2201_CPLD_LPC_IO_RANGE 0x100 2262306a36Sopenharmony_ci#define NVSW_SN2201_HW_VER_ID_OFFSET 0x00 2362306a36Sopenharmony_ci#define NVSW_SN2201_BOARD_ID_OFFSET 0x01 2462306a36Sopenharmony_ci#define NVSW_SN2201_CPLD_VER_OFFSET 0x02 2562306a36Sopenharmony_ci#define NVSW_SN2201_CPLD_MVER_OFFSET 0x03 2662306a36Sopenharmony_ci#define NVSW_SN2201_CPLD_ID_OFFSET 0x04 2762306a36Sopenharmony_ci#define NVSW_SN2201_CPLD_PN_OFFSET 0x05 2862306a36Sopenharmony_ci#define NVSW_SN2201_CPLD_PN1_OFFSET 0x06 2962306a36Sopenharmony_ci#define NVSW_SN2201_PSU_CTRL_OFFSET 0x0a 3062306a36Sopenharmony_ci#define NVSW_SN2201_QSFP28_STATUS_OFFSET 0x0b 3162306a36Sopenharmony_ci#define NVSW_SN2201_QSFP28_INT_STATUS_OFFSET 0x0c 3262306a36Sopenharmony_ci#define NVSW_SN2201_QSFP28_LP_STATUS_OFFSET 0x0d 3362306a36Sopenharmony_ci#define NVSW_SN2201_QSFP28_RST_STATUS_OFFSET 0x0e 3462306a36Sopenharmony_ci#define NVSW_SN2201_SYS_STATUS_OFFSET 0x0f 3562306a36Sopenharmony_ci#define NVSW_SN2201_FRONT_SYS_LED_CTRL_OFFSET 0x10 3662306a36Sopenharmony_ci#define NVSW_SN2201_FRONT_PSU_LED_CTRL_OFFSET 0x12 3762306a36Sopenharmony_ci#define NVSW_SN2201_FRONT_UID_LED_CTRL_OFFSET 0x13 3862306a36Sopenharmony_ci#define NVSW_SN2201_QSFP28_LED_TEST_STATUS_OFFSET 0x14 3962306a36Sopenharmony_ci#define NVSW_SN2201_SYS_RST_STATUS_OFFSET 0x15 4062306a36Sopenharmony_ci#define NVSW_SN2201_SYS_INT_STATUS_OFFSET 0x21 4162306a36Sopenharmony_ci#define NVSW_SN2201_SYS_INT_MASK_OFFSET 0x22 4262306a36Sopenharmony_ci#define NVSW_SN2201_ASIC_STATUS_OFFSET 0x24 4362306a36Sopenharmony_ci#define NVSW_SN2201_ASIC_EVENT_OFFSET 0x25 4462306a36Sopenharmony_ci#define NVSW_SN2201_ASIC_MAKS_OFFSET 0x26 4562306a36Sopenharmony_ci#define NVSW_SN2201_THML_STATUS_OFFSET 0x27 4662306a36Sopenharmony_ci#define NVSW_SN2201_THML_EVENT_OFFSET 0x28 4762306a36Sopenharmony_ci#define NVSW_SN2201_THML_MASK_OFFSET 0x29 4862306a36Sopenharmony_ci#define NVSW_SN2201_PS_ALT_STATUS_OFFSET 0x2a 4962306a36Sopenharmony_ci#define NVSW_SN2201_PS_ALT_EVENT_OFFSET 0x2b 5062306a36Sopenharmony_ci#define NVSW_SN2201_PS_ALT_MASK_OFFSET 0x2c 5162306a36Sopenharmony_ci#define NVSW_SN2201_PS_PRSNT_STATUS_OFFSET 0x30 5262306a36Sopenharmony_ci#define NVSW_SN2201_PS_PRSNT_EVENT_OFFSET 0x31 5362306a36Sopenharmony_ci#define NVSW_SN2201_PS_PRSNT_MASK_OFFSET 0x32 5462306a36Sopenharmony_ci#define NVSW_SN2201_PS_DC_OK_STATUS_OFFSET 0x33 5562306a36Sopenharmony_ci#define NVSW_SN2201_PS_DC_OK_EVENT_OFFSET 0x34 5662306a36Sopenharmony_ci#define NVSW_SN2201_PS_DC_OK_MASK_OFFSET 0x35 5762306a36Sopenharmony_ci#define NVSW_SN2201_RST_CAUSE1_OFFSET 0x36 5862306a36Sopenharmony_ci#define NVSW_SN2201_RST_CAUSE2_OFFSET 0x37 5962306a36Sopenharmony_ci#define NVSW_SN2201_RST_SW_CTRL_OFFSET 0x38 6062306a36Sopenharmony_ci#define NVSW_SN2201_FAN_PRSNT_STATUS_OFFSET 0x3a 6162306a36Sopenharmony_ci#define NVSW_SN2201_FAN_PRSNT_EVENT_OFFSET 0x3b 6262306a36Sopenharmony_ci#define NVSW_SN2201_FAN_PRSNT_MASK_OFFSET 0x3c 6362306a36Sopenharmony_ci#define NVSW_SN2201_WD_TMR_OFFSET_LSB 0x40 6462306a36Sopenharmony_ci#define NVSW_SN2201_WD_TMR_OFFSET_MSB 0x41 6562306a36Sopenharmony_ci#define NVSW_SN2201_WD_ACT_OFFSET 0x42 6662306a36Sopenharmony_ci#define NVSW_SN2201_FAN_LED1_CTRL_OFFSET 0x50 6762306a36Sopenharmony_ci#define NVSW_SN2201_FAN_LED2_CTRL_OFFSET 0x51 6862306a36Sopenharmony_ci#define NVSW_SN2201_REG_MAX 0x52 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci/* Number of physical I2C busses. */ 7162306a36Sopenharmony_ci#define NVSW_SN2201_PHY_I2C_BUS_NUM 2 7262306a36Sopenharmony_ci/* Number of main mux channels. */ 7362306a36Sopenharmony_ci#define NVSW_SN2201_MAIN_MUX_CHNL_NUM 8 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci#define NVSW_SN2201_MAIN_NR 0 7662306a36Sopenharmony_ci#define NVSW_SN2201_MAIN_MUX_NR 1 7762306a36Sopenharmony_ci#define NVSW_SN2201_MAIN_MUX_DEFER_NR (NVSW_SN2201_PHY_I2C_BUS_NUM + \ 7862306a36Sopenharmony_ci NVSW_SN2201_MAIN_MUX_CHNL_NUM - 1) 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci#define NVSW_SN2201_MAIN_MUX_CH0_NR NVSW_SN2201_PHY_I2C_BUS_NUM 8162306a36Sopenharmony_ci#define NVSW_SN2201_MAIN_MUX_CH1_NR (NVSW_SN2201_MAIN_MUX_CH0_NR + 1) 8262306a36Sopenharmony_ci#define NVSW_SN2201_MAIN_MUX_CH2_NR (NVSW_SN2201_MAIN_MUX_CH0_NR + 2) 8362306a36Sopenharmony_ci#define NVSW_SN2201_MAIN_MUX_CH3_NR (NVSW_SN2201_MAIN_MUX_CH0_NR + 3) 8462306a36Sopenharmony_ci#define NVSW_SN2201_MAIN_MUX_CH5_NR (NVSW_SN2201_MAIN_MUX_CH0_NR + 5) 8562306a36Sopenharmony_ci#define NVSW_SN2201_MAIN_MUX_CH6_NR (NVSW_SN2201_MAIN_MUX_CH0_NR + 6) 8662306a36Sopenharmony_ci#define NVSW_SN2201_MAIN_MUX_CH7_NR (NVSW_SN2201_MAIN_MUX_CH0_NR + 7) 8762306a36Sopenharmony_ci#define NVSW_SN2201_2ND_MUX_CH0_NR (NVSW_SN2201_MAIN_MUX_CH7_NR + 1) 8862306a36Sopenharmony_ci#define NVSW_SN2201_2ND_MUX_CH1_NR (NVSW_SN2201_MAIN_MUX_CH7_NR + 2) 8962306a36Sopenharmony_ci#define NVSW_SN2201_2ND_MUX_CH2_NR (NVSW_SN2201_MAIN_MUX_CH7_NR + 3) 9062306a36Sopenharmony_ci#define NVSW_SN2201_2ND_MUX_CH3_NR (NVSW_SN2201_MAIN_MUX_CH7_NR + 4) 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci#define NVSW_SN2201_CPLD_NR NVSW_SN2201_MAIN_MUX_CH0_NR 9362306a36Sopenharmony_ci#define NVSW_SN2201_NR_NONE -1 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci/* Masks for aggregation, PSU presence and power, ASIC events 9662306a36Sopenharmony_ci * in CPLD related registers. 9762306a36Sopenharmony_ci */ 9862306a36Sopenharmony_ci#define NVSW_SN2201_CPLD_AGGR_ASIC_MASK_DEF 0xe0 9962306a36Sopenharmony_ci#define NVSW_SN2201_CPLD_AGGR_PSU_MASK_DEF 0x04 10062306a36Sopenharmony_ci#define NVSW_SN2201_CPLD_AGGR_PWR_MASK_DEF 0x02 10162306a36Sopenharmony_ci#define NVSW_SN2201_CPLD_AGGR_FAN_MASK_DEF 0x10 10262306a36Sopenharmony_ci#define NVSW_SN2201_CPLD_AGGR_MASK_DEF \ 10362306a36Sopenharmony_ci (NVSW_SN2201_CPLD_AGGR_ASIC_MASK_DEF \ 10462306a36Sopenharmony_ci | NVSW_SN2201_CPLD_AGGR_PSU_MASK_DEF \ 10562306a36Sopenharmony_ci | NVSW_SN2201_CPLD_AGGR_PWR_MASK_DEF \ 10662306a36Sopenharmony_ci | NVSW_SN2201_CPLD_AGGR_FAN_MASK_DEF) 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci#define NVSW_SN2201_CPLD_ASIC_MASK GENMASK(3, 1) 10962306a36Sopenharmony_ci#define NVSW_SN2201_CPLD_PSU_MASK GENMASK(1, 0) 11062306a36Sopenharmony_ci#define NVSW_SN2201_CPLD_PWR_MASK GENMASK(1, 0) 11162306a36Sopenharmony_ci#define NVSW_SN2201_CPLD_FAN_MASK GENMASK(3, 0) 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci#define NVSW_SN2201_CPLD_SYSIRQ 26 11462306a36Sopenharmony_ci#define NVSW_SN2201_LPC_SYSIRQ 28 11562306a36Sopenharmony_ci#define NVSW_SN2201_CPLD_I2CADDR 0x41 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci#define NVSW_SN2201_WD_DFLT_TIMEOUT 600 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci/* nvsw_sn2201 - device private data 12062306a36Sopenharmony_ci * @dev: platform device; 12162306a36Sopenharmony_ci * @io_data: register access platform data; 12262306a36Sopenharmony_ci * @led_data: LED platform data; 12362306a36Sopenharmony_ci * @hotplug_data: hotplug platform data; 12462306a36Sopenharmony_ci * @i2c_data: I2C controller platform data; 12562306a36Sopenharmony_ci * @led: LED device; 12662306a36Sopenharmony_ci * @io_regs: register access device; 12762306a36Sopenharmony_ci * @pdev_hotplug: hotplug device; 12862306a36Sopenharmony_ci * @sn2201_devs: I2C devices for sn2201 devices; 12962306a36Sopenharmony_ci * @sn2201_devs_num: number of I2C devices for sn2201 device; 13062306a36Sopenharmony_ci * @main_mux_devs: I2C devices for main mux; 13162306a36Sopenharmony_ci * @main_mux_devs_num: number of I2C devices for main mux; 13262306a36Sopenharmony_ci * @cpld_devs: I2C devices for cpld; 13362306a36Sopenharmony_ci * @cpld_devs_num: number of I2C devices for cpld; 13462306a36Sopenharmony_ci * @main_mux_deferred_nr: I2C adapter number must be exist prior creating devices execution; 13562306a36Sopenharmony_ci */ 13662306a36Sopenharmony_cistruct nvsw_sn2201 { 13762306a36Sopenharmony_ci struct device *dev; 13862306a36Sopenharmony_ci struct mlxreg_core_platform_data *io_data; 13962306a36Sopenharmony_ci struct mlxreg_core_platform_data *led_data; 14062306a36Sopenharmony_ci struct mlxreg_core_platform_data *wd_data; 14162306a36Sopenharmony_ci struct mlxreg_core_hotplug_platform_data *hotplug_data; 14262306a36Sopenharmony_ci struct mlxreg_core_hotplug_platform_data *i2c_data; 14362306a36Sopenharmony_ci struct platform_device *led; 14462306a36Sopenharmony_ci struct platform_device *wd; 14562306a36Sopenharmony_ci struct platform_device *io_regs; 14662306a36Sopenharmony_ci struct platform_device *pdev_hotplug; 14762306a36Sopenharmony_ci struct platform_device *pdev_i2c; 14862306a36Sopenharmony_ci struct mlxreg_hotplug_device *sn2201_devs; 14962306a36Sopenharmony_ci int sn2201_devs_num; 15062306a36Sopenharmony_ci struct mlxreg_hotplug_device *main_mux_devs; 15162306a36Sopenharmony_ci int main_mux_devs_num; 15262306a36Sopenharmony_ci struct mlxreg_hotplug_device *cpld_devs; 15362306a36Sopenharmony_ci int cpld_devs_num; 15462306a36Sopenharmony_ci int main_mux_deferred_nr; 15562306a36Sopenharmony_ci}; 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_cistatic bool nvsw_sn2201_writeable_reg(struct device *dev, unsigned int reg) 15862306a36Sopenharmony_ci{ 15962306a36Sopenharmony_ci switch (reg) { 16062306a36Sopenharmony_ci case NVSW_SN2201_PSU_CTRL_OFFSET: 16162306a36Sopenharmony_ci case NVSW_SN2201_QSFP28_LP_STATUS_OFFSET: 16262306a36Sopenharmony_ci case NVSW_SN2201_QSFP28_RST_STATUS_OFFSET: 16362306a36Sopenharmony_ci case NVSW_SN2201_FRONT_SYS_LED_CTRL_OFFSET: 16462306a36Sopenharmony_ci case NVSW_SN2201_FRONT_PSU_LED_CTRL_OFFSET: 16562306a36Sopenharmony_ci case NVSW_SN2201_FRONT_UID_LED_CTRL_OFFSET: 16662306a36Sopenharmony_ci case NVSW_SN2201_QSFP28_LED_TEST_STATUS_OFFSET: 16762306a36Sopenharmony_ci case NVSW_SN2201_SYS_RST_STATUS_OFFSET: 16862306a36Sopenharmony_ci case NVSW_SN2201_SYS_INT_MASK_OFFSET: 16962306a36Sopenharmony_ci case NVSW_SN2201_ASIC_EVENT_OFFSET: 17062306a36Sopenharmony_ci case NVSW_SN2201_ASIC_MAKS_OFFSET: 17162306a36Sopenharmony_ci case NVSW_SN2201_THML_EVENT_OFFSET: 17262306a36Sopenharmony_ci case NVSW_SN2201_THML_MASK_OFFSET: 17362306a36Sopenharmony_ci case NVSW_SN2201_PS_ALT_EVENT_OFFSET: 17462306a36Sopenharmony_ci case NVSW_SN2201_PS_ALT_MASK_OFFSET: 17562306a36Sopenharmony_ci case NVSW_SN2201_PS_PRSNT_EVENT_OFFSET: 17662306a36Sopenharmony_ci case NVSW_SN2201_PS_PRSNT_MASK_OFFSET: 17762306a36Sopenharmony_ci case NVSW_SN2201_PS_DC_OK_EVENT_OFFSET: 17862306a36Sopenharmony_ci case NVSW_SN2201_PS_DC_OK_MASK_OFFSET: 17962306a36Sopenharmony_ci case NVSW_SN2201_RST_SW_CTRL_OFFSET: 18062306a36Sopenharmony_ci case NVSW_SN2201_FAN_PRSNT_EVENT_OFFSET: 18162306a36Sopenharmony_ci case NVSW_SN2201_FAN_PRSNT_MASK_OFFSET: 18262306a36Sopenharmony_ci case NVSW_SN2201_WD_TMR_OFFSET_LSB: 18362306a36Sopenharmony_ci case NVSW_SN2201_WD_TMR_OFFSET_MSB: 18462306a36Sopenharmony_ci case NVSW_SN2201_WD_ACT_OFFSET: 18562306a36Sopenharmony_ci case NVSW_SN2201_FAN_LED1_CTRL_OFFSET: 18662306a36Sopenharmony_ci case NVSW_SN2201_FAN_LED2_CTRL_OFFSET: 18762306a36Sopenharmony_ci return true; 18862306a36Sopenharmony_ci } 18962306a36Sopenharmony_ci return false; 19062306a36Sopenharmony_ci} 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_cistatic bool nvsw_sn2201_readable_reg(struct device *dev, unsigned int reg) 19362306a36Sopenharmony_ci{ 19462306a36Sopenharmony_ci switch (reg) { 19562306a36Sopenharmony_ci case NVSW_SN2201_HW_VER_ID_OFFSET: 19662306a36Sopenharmony_ci case NVSW_SN2201_BOARD_ID_OFFSET: 19762306a36Sopenharmony_ci case NVSW_SN2201_CPLD_VER_OFFSET: 19862306a36Sopenharmony_ci case NVSW_SN2201_CPLD_MVER_OFFSET: 19962306a36Sopenharmony_ci case NVSW_SN2201_CPLD_ID_OFFSET: 20062306a36Sopenharmony_ci case NVSW_SN2201_CPLD_PN_OFFSET: 20162306a36Sopenharmony_ci case NVSW_SN2201_CPLD_PN1_OFFSET: 20262306a36Sopenharmony_ci case NVSW_SN2201_PSU_CTRL_OFFSET: 20362306a36Sopenharmony_ci case NVSW_SN2201_QSFP28_STATUS_OFFSET: 20462306a36Sopenharmony_ci case NVSW_SN2201_QSFP28_INT_STATUS_OFFSET: 20562306a36Sopenharmony_ci case NVSW_SN2201_QSFP28_LP_STATUS_OFFSET: 20662306a36Sopenharmony_ci case NVSW_SN2201_QSFP28_RST_STATUS_OFFSET: 20762306a36Sopenharmony_ci case NVSW_SN2201_SYS_STATUS_OFFSET: 20862306a36Sopenharmony_ci case NVSW_SN2201_FRONT_SYS_LED_CTRL_OFFSET: 20962306a36Sopenharmony_ci case NVSW_SN2201_FRONT_PSU_LED_CTRL_OFFSET: 21062306a36Sopenharmony_ci case NVSW_SN2201_FRONT_UID_LED_CTRL_OFFSET: 21162306a36Sopenharmony_ci case NVSW_SN2201_QSFP28_LED_TEST_STATUS_OFFSET: 21262306a36Sopenharmony_ci case NVSW_SN2201_SYS_RST_STATUS_OFFSET: 21362306a36Sopenharmony_ci case NVSW_SN2201_RST_CAUSE1_OFFSET: 21462306a36Sopenharmony_ci case NVSW_SN2201_RST_CAUSE2_OFFSET: 21562306a36Sopenharmony_ci case NVSW_SN2201_SYS_INT_STATUS_OFFSET: 21662306a36Sopenharmony_ci case NVSW_SN2201_SYS_INT_MASK_OFFSET: 21762306a36Sopenharmony_ci case NVSW_SN2201_ASIC_STATUS_OFFSET: 21862306a36Sopenharmony_ci case NVSW_SN2201_ASIC_EVENT_OFFSET: 21962306a36Sopenharmony_ci case NVSW_SN2201_ASIC_MAKS_OFFSET: 22062306a36Sopenharmony_ci case NVSW_SN2201_THML_STATUS_OFFSET: 22162306a36Sopenharmony_ci case NVSW_SN2201_THML_EVENT_OFFSET: 22262306a36Sopenharmony_ci case NVSW_SN2201_THML_MASK_OFFSET: 22362306a36Sopenharmony_ci case NVSW_SN2201_PS_ALT_STATUS_OFFSET: 22462306a36Sopenharmony_ci case NVSW_SN2201_PS_ALT_EVENT_OFFSET: 22562306a36Sopenharmony_ci case NVSW_SN2201_PS_ALT_MASK_OFFSET: 22662306a36Sopenharmony_ci case NVSW_SN2201_PS_PRSNT_STATUS_OFFSET: 22762306a36Sopenharmony_ci case NVSW_SN2201_PS_PRSNT_EVENT_OFFSET: 22862306a36Sopenharmony_ci case NVSW_SN2201_PS_PRSNT_MASK_OFFSET: 22962306a36Sopenharmony_ci case NVSW_SN2201_PS_DC_OK_STATUS_OFFSET: 23062306a36Sopenharmony_ci case NVSW_SN2201_PS_DC_OK_EVENT_OFFSET: 23162306a36Sopenharmony_ci case NVSW_SN2201_PS_DC_OK_MASK_OFFSET: 23262306a36Sopenharmony_ci case NVSW_SN2201_RST_SW_CTRL_OFFSET: 23362306a36Sopenharmony_ci case NVSW_SN2201_FAN_PRSNT_STATUS_OFFSET: 23462306a36Sopenharmony_ci case NVSW_SN2201_FAN_PRSNT_EVENT_OFFSET: 23562306a36Sopenharmony_ci case NVSW_SN2201_FAN_PRSNT_MASK_OFFSET: 23662306a36Sopenharmony_ci case NVSW_SN2201_WD_TMR_OFFSET_LSB: 23762306a36Sopenharmony_ci case NVSW_SN2201_WD_TMR_OFFSET_MSB: 23862306a36Sopenharmony_ci case NVSW_SN2201_WD_ACT_OFFSET: 23962306a36Sopenharmony_ci case NVSW_SN2201_FAN_LED1_CTRL_OFFSET: 24062306a36Sopenharmony_ci case NVSW_SN2201_FAN_LED2_CTRL_OFFSET: 24162306a36Sopenharmony_ci return true; 24262306a36Sopenharmony_ci } 24362306a36Sopenharmony_ci return false; 24462306a36Sopenharmony_ci} 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_cistatic bool nvsw_sn2201_volatile_reg(struct device *dev, unsigned int reg) 24762306a36Sopenharmony_ci{ 24862306a36Sopenharmony_ci switch (reg) { 24962306a36Sopenharmony_ci case NVSW_SN2201_HW_VER_ID_OFFSET: 25062306a36Sopenharmony_ci case NVSW_SN2201_BOARD_ID_OFFSET: 25162306a36Sopenharmony_ci case NVSW_SN2201_CPLD_VER_OFFSET: 25262306a36Sopenharmony_ci case NVSW_SN2201_CPLD_MVER_OFFSET: 25362306a36Sopenharmony_ci case NVSW_SN2201_CPLD_ID_OFFSET: 25462306a36Sopenharmony_ci case NVSW_SN2201_CPLD_PN_OFFSET: 25562306a36Sopenharmony_ci case NVSW_SN2201_CPLD_PN1_OFFSET: 25662306a36Sopenharmony_ci case NVSW_SN2201_PSU_CTRL_OFFSET: 25762306a36Sopenharmony_ci case NVSW_SN2201_QSFP28_STATUS_OFFSET: 25862306a36Sopenharmony_ci case NVSW_SN2201_QSFP28_INT_STATUS_OFFSET: 25962306a36Sopenharmony_ci case NVSW_SN2201_QSFP28_LP_STATUS_OFFSET: 26062306a36Sopenharmony_ci case NVSW_SN2201_QSFP28_RST_STATUS_OFFSET: 26162306a36Sopenharmony_ci case NVSW_SN2201_SYS_STATUS_OFFSET: 26262306a36Sopenharmony_ci case NVSW_SN2201_FRONT_SYS_LED_CTRL_OFFSET: 26362306a36Sopenharmony_ci case NVSW_SN2201_FRONT_PSU_LED_CTRL_OFFSET: 26462306a36Sopenharmony_ci case NVSW_SN2201_FRONT_UID_LED_CTRL_OFFSET: 26562306a36Sopenharmony_ci case NVSW_SN2201_QSFP28_LED_TEST_STATUS_OFFSET: 26662306a36Sopenharmony_ci case NVSW_SN2201_SYS_RST_STATUS_OFFSET: 26762306a36Sopenharmony_ci case NVSW_SN2201_RST_CAUSE1_OFFSET: 26862306a36Sopenharmony_ci case NVSW_SN2201_RST_CAUSE2_OFFSET: 26962306a36Sopenharmony_ci case NVSW_SN2201_SYS_INT_STATUS_OFFSET: 27062306a36Sopenharmony_ci case NVSW_SN2201_SYS_INT_MASK_OFFSET: 27162306a36Sopenharmony_ci case NVSW_SN2201_ASIC_STATUS_OFFSET: 27262306a36Sopenharmony_ci case NVSW_SN2201_ASIC_EVENT_OFFSET: 27362306a36Sopenharmony_ci case NVSW_SN2201_ASIC_MAKS_OFFSET: 27462306a36Sopenharmony_ci case NVSW_SN2201_THML_STATUS_OFFSET: 27562306a36Sopenharmony_ci case NVSW_SN2201_THML_EVENT_OFFSET: 27662306a36Sopenharmony_ci case NVSW_SN2201_THML_MASK_OFFSET: 27762306a36Sopenharmony_ci case NVSW_SN2201_PS_ALT_STATUS_OFFSET: 27862306a36Sopenharmony_ci case NVSW_SN2201_PS_ALT_EVENT_OFFSET: 27962306a36Sopenharmony_ci case NVSW_SN2201_PS_ALT_MASK_OFFSET: 28062306a36Sopenharmony_ci case NVSW_SN2201_PS_PRSNT_STATUS_OFFSET: 28162306a36Sopenharmony_ci case NVSW_SN2201_PS_PRSNT_EVENT_OFFSET: 28262306a36Sopenharmony_ci case NVSW_SN2201_PS_PRSNT_MASK_OFFSET: 28362306a36Sopenharmony_ci case NVSW_SN2201_PS_DC_OK_STATUS_OFFSET: 28462306a36Sopenharmony_ci case NVSW_SN2201_PS_DC_OK_EVENT_OFFSET: 28562306a36Sopenharmony_ci case NVSW_SN2201_PS_DC_OK_MASK_OFFSET: 28662306a36Sopenharmony_ci case NVSW_SN2201_RST_SW_CTRL_OFFSET: 28762306a36Sopenharmony_ci case NVSW_SN2201_FAN_PRSNT_STATUS_OFFSET: 28862306a36Sopenharmony_ci case NVSW_SN2201_FAN_PRSNT_EVENT_OFFSET: 28962306a36Sopenharmony_ci case NVSW_SN2201_FAN_PRSNT_MASK_OFFSET: 29062306a36Sopenharmony_ci case NVSW_SN2201_WD_TMR_OFFSET_LSB: 29162306a36Sopenharmony_ci case NVSW_SN2201_WD_TMR_OFFSET_MSB: 29262306a36Sopenharmony_ci case NVSW_SN2201_FAN_LED1_CTRL_OFFSET: 29362306a36Sopenharmony_ci case NVSW_SN2201_FAN_LED2_CTRL_OFFSET: 29462306a36Sopenharmony_ci return true; 29562306a36Sopenharmony_ci } 29662306a36Sopenharmony_ci return false; 29762306a36Sopenharmony_ci} 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_cistatic const struct reg_default nvsw_sn2201_regmap_default[] = { 30062306a36Sopenharmony_ci { NVSW_SN2201_QSFP28_LED_TEST_STATUS_OFFSET, 0x00 }, 30162306a36Sopenharmony_ci { NVSW_SN2201_WD_ACT_OFFSET, 0x00 }, 30262306a36Sopenharmony_ci}; 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci/* Configuration for the register map of a device with 1 bytes address space. */ 30562306a36Sopenharmony_cistatic const struct regmap_config nvsw_sn2201_regmap_conf = { 30662306a36Sopenharmony_ci .reg_bits = 8, 30762306a36Sopenharmony_ci .val_bits = 8, 30862306a36Sopenharmony_ci .max_register = NVSW_SN2201_REG_MAX, 30962306a36Sopenharmony_ci .cache_type = REGCACHE_FLAT, 31062306a36Sopenharmony_ci .writeable_reg = nvsw_sn2201_writeable_reg, 31162306a36Sopenharmony_ci .readable_reg = nvsw_sn2201_readable_reg, 31262306a36Sopenharmony_ci .volatile_reg = nvsw_sn2201_volatile_reg, 31362306a36Sopenharmony_ci .reg_defaults = nvsw_sn2201_regmap_default, 31462306a36Sopenharmony_ci .num_reg_defaults = ARRAY_SIZE(nvsw_sn2201_regmap_default), 31562306a36Sopenharmony_ci}; 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci/* Regions for LPC I2C controller and LPC base register space. */ 31862306a36Sopenharmony_cistatic const struct resource nvsw_sn2201_lpc_io_resources[] = { 31962306a36Sopenharmony_ci [0] = DEFINE_RES_NAMED(NVSW_SN2201_CPLD_LPC_I2C_BASE_ADRR, 32062306a36Sopenharmony_ci NVSW_SN2201_CPLD_LPC_IO_RANGE, 32162306a36Sopenharmony_ci "mlxplat_cpld_lpc_i2c_ctrl", IORESOURCE_IO), 32262306a36Sopenharmony_ci}; 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_cistatic struct resource nvsw_sn2201_cpld_res[] = { 32562306a36Sopenharmony_ci [0] = DEFINE_RES_IRQ_NAMED(NVSW_SN2201_CPLD_SYSIRQ, "mlxreg-hotplug"), 32662306a36Sopenharmony_ci}; 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_cistatic struct resource nvsw_sn2201_lpc_res[] = { 32962306a36Sopenharmony_ci [0] = DEFINE_RES_IRQ_NAMED(NVSW_SN2201_LPC_SYSIRQ, "i2c-mlxcpld"), 33062306a36Sopenharmony_ci}; 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci/* SN2201 I2C platform data. */ 33362306a36Sopenharmony_cistatic struct mlxreg_core_hotplug_platform_data nvsw_sn2201_i2c_data = { 33462306a36Sopenharmony_ci .irq = NVSW_SN2201_CPLD_SYSIRQ, 33562306a36Sopenharmony_ci}; 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_ci/* SN2201 CPLD device. */ 33862306a36Sopenharmony_cistatic struct i2c_board_info nvsw_sn2201_cpld_devices[] = { 33962306a36Sopenharmony_ci { 34062306a36Sopenharmony_ci I2C_BOARD_INFO("nvsw-sn2201", 0x41), 34162306a36Sopenharmony_ci }, 34262306a36Sopenharmony_ci}; 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci/* SN2201 CPLD board info. */ 34562306a36Sopenharmony_cistatic struct mlxreg_hotplug_device nvsw_sn2201_cpld_brdinfo[] = { 34662306a36Sopenharmony_ci { 34762306a36Sopenharmony_ci .brdinfo = &nvsw_sn2201_cpld_devices[0], 34862306a36Sopenharmony_ci .nr = NVSW_SN2201_CPLD_NR, 34962306a36Sopenharmony_ci }, 35062306a36Sopenharmony_ci}; 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_ci/* SN2201 main mux device. */ 35362306a36Sopenharmony_cistatic struct i2c_board_info nvsw_sn2201_main_mux_devices[] = { 35462306a36Sopenharmony_ci { 35562306a36Sopenharmony_ci I2C_BOARD_INFO("pca9548", 0x70), 35662306a36Sopenharmony_ci }, 35762306a36Sopenharmony_ci}; 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci/* SN2201 main mux board info. */ 36062306a36Sopenharmony_cistatic struct mlxreg_hotplug_device nvsw_sn2201_main_mux_brdinfo[] = { 36162306a36Sopenharmony_ci { 36262306a36Sopenharmony_ci .brdinfo = &nvsw_sn2201_main_mux_devices[0], 36362306a36Sopenharmony_ci .nr = NVSW_SN2201_MAIN_MUX_NR, 36462306a36Sopenharmony_ci }, 36562306a36Sopenharmony_ci}; 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci/* SN2201 power devices. */ 36862306a36Sopenharmony_cistatic struct i2c_board_info nvsw_sn2201_pwr_devices[] = { 36962306a36Sopenharmony_ci { 37062306a36Sopenharmony_ci I2C_BOARD_INFO("pmbus", 0x58), 37162306a36Sopenharmony_ci }, 37262306a36Sopenharmony_ci { 37362306a36Sopenharmony_ci I2C_BOARD_INFO("pmbus", 0x58), 37462306a36Sopenharmony_ci }, 37562306a36Sopenharmony_ci}; 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_ci/* SN2201 fan devices. */ 37862306a36Sopenharmony_cistatic struct i2c_board_info nvsw_sn2201_fan_devices[] = { 37962306a36Sopenharmony_ci { 38062306a36Sopenharmony_ci I2C_BOARD_INFO("24c02", 0x50), 38162306a36Sopenharmony_ci }, 38262306a36Sopenharmony_ci { 38362306a36Sopenharmony_ci I2C_BOARD_INFO("24c02", 0x51), 38462306a36Sopenharmony_ci }, 38562306a36Sopenharmony_ci { 38662306a36Sopenharmony_ci I2C_BOARD_INFO("24c02", 0x52), 38762306a36Sopenharmony_ci }, 38862306a36Sopenharmony_ci { 38962306a36Sopenharmony_ci I2C_BOARD_INFO("24c02", 0x53), 39062306a36Sopenharmony_ci }, 39162306a36Sopenharmony_ci}; 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_ci/* SN2201 hotplug default data. */ 39462306a36Sopenharmony_cistatic struct mlxreg_core_data nvsw_sn2201_psu_items_data[] = { 39562306a36Sopenharmony_ci { 39662306a36Sopenharmony_ci .label = "psu1", 39762306a36Sopenharmony_ci .reg = NVSW_SN2201_PS_PRSNT_STATUS_OFFSET, 39862306a36Sopenharmony_ci .mask = BIT(0), 39962306a36Sopenharmony_ci .hpdev.nr = NVSW_SN2201_NR_NONE, 40062306a36Sopenharmony_ci }, 40162306a36Sopenharmony_ci { 40262306a36Sopenharmony_ci .label = "psu2", 40362306a36Sopenharmony_ci .reg = NVSW_SN2201_PS_PRSNT_STATUS_OFFSET, 40462306a36Sopenharmony_ci .mask = BIT(1), 40562306a36Sopenharmony_ci .hpdev.nr = NVSW_SN2201_NR_NONE, 40662306a36Sopenharmony_ci }, 40762306a36Sopenharmony_ci}; 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_cistatic struct mlxreg_core_data nvsw_sn2201_pwr_items_data[] = { 41062306a36Sopenharmony_ci { 41162306a36Sopenharmony_ci .label = "pwr1", 41262306a36Sopenharmony_ci .reg = NVSW_SN2201_PS_DC_OK_STATUS_OFFSET, 41362306a36Sopenharmony_ci .mask = BIT(0), 41462306a36Sopenharmony_ci .hpdev.brdinfo = &nvsw_sn2201_pwr_devices[0], 41562306a36Sopenharmony_ci .hpdev.nr = NVSW_SN2201_MAIN_MUX_CH1_NR, 41662306a36Sopenharmony_ci }, 41762306a36Sopenharmony_ci { 41862306a36Sopenharmony_ci .label = "pwr2", 41962306a36Sopenharmony_ci .reg = NVSW_SN2201_PS_DC_OK_STATUS_OFFSET, 42062306a36Sopenharmony_ci .mask = BIT(1), 42162306a36Sopenharmony_ci .hpdev.brdinfo = &nvsw_sn2201_pwr_devices[1], 42262306a36Sopenharmony_ci .hpdev.nr = NVSW_SN2201_MAIN_MUX_CH2_NR, 42362306a36Sopenharmony_ci }, 42462306a36Sopenharmony_ci}; 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_cistatic struct mlxreg_core_data nvsw_sn2201_fan_items_data[] = { 42762306a36Sopenharmony_ci { 42862306a36Sopenharmony_ci .label = "fan1", 42962306a36Sopenharmony_ci .reg = NVSW_SN2201_FAN_PRSNT_STATUS_OFFSET, 43062306a36Sopenharmony_ci .mask = BIT(0), 43162306a36Sopenharmony_ci .hpdev.brdinfo = &nvsw_sn2201_fan_devices[0], 43262306a36Sopenharmony_ci .hpdev.nr = NVSW_SN2201_2ND_MUX_CH0_NR, 43362306a36Sopenharmony_ci }, 43462306a36Sopenharmony_ci { 43562306a36Sopenharmony_ci .label = "fan2", 43662306a36Sopenharmony_ci .reg = NVSW_SN2201_FAN_PRSNT_STATUS_OFFSET, 43762306a36Sopenharmony_ci .mask = BIT(1), 43862306a36Sopenharmony_ci .hpdev.brdinfo = &nvsw_sn2201_fan_devices[1], 43962306a36Sopenharmony_ci .hpdev.nr = NVSW_SN2201_2ND_MUX_CH1_NR, 44062306a36Sopenharmony_ci }, 44162306a36Sopenharmony_ci { 44262306a36Sopenharmony_ci .label = "fan3", 44362306a36Sopenharmony_ci .reg = NVSW_SN2201_FAN_PRSNT_STATUS_OFFSET, 44462306a36Sopenharmony_ci .mask = BIT(2), 44562306a36Sopenharmony_ci .hpdev.brdinfo = &nvsw_sn2201_fan_devices[2], 44662306a36Sopenharmony_ci .hpdev.nr = NVSW_SN2201_2ND_MUX_CH2_NR, 44762306a36Sopenharmony_ci }, 44862306a36Sopenharmony_ci { 44962306a36Sopenharmony_ci .label = "fan4", 45062306a36Sopenharmony_ci .reg = NVSW_SN2201_FAN_PRSNT_STATUS_OFFSET, 45162306a36Sopenharmony_ci .mask = BIT(3), 45262306a36Sopenharmony_ci .hpdev.brdinfo = &nvsw_sn2201_fan_devices[3], 45362306a36Sopenharmony_ci .hpdev.nr = NVSW_SN2201_2ND_MUX_CH3_NR, 45462306a36Sopenharmony_ci }, 45562306a36Sopenharmony_ci}; 45662306a36Sopenharmony_ci 45762306a36Sopenharmony_cistatic struct mlxreg_core_data nvsw_sn2201_sys_items_data[] = { 45862306a36Sopenharmony_ci { 45962306a36Sopenharmony_ci .label = "nic_smb_alert", 46062306a36Sopenharmony_ci .reg = NVSW_SN2201_ASIC_STATUS_OFFSET, 46162306a36Sopenharmony_ci .mask = BIT(1), 46262306a36Sopenharmony_ci .hpdev.nr = NVSW_SN2201_NR_NONE, 46362306a36Sopenharmony_ci }, 46462306a36Sopenharmony_ci { 46562306a36Sopenharmony_ci .label = "cpu_sd", 46662306a36Sopenharmony_ci .reg = NVSW_SN2201_ASIC_STATUS_OFFSET, 46762306a36Sopenharmony_ci .mask = BIT(2), 46862306a36Sopenharmony_ci .hpdev.nr = NVSW_SN2201_NR_NONE, 46962306a36Sopenharmony_ci }, 47062306a36Sopenharmony_ci { 47162306a36Sopenharmony_ci .label = "mac_health", 47262306a36Sopenharmony_ci .reg = NVSW_SN2201_ASIC_STATUS_OFFSET, 47362306a36Sopenharmony_ci .mask = BIT(3), 47462306a36Sopenharmony_ci .hpdev.nr = NVSW_SN2201_NR_NONE, 47562306a36Sopenharmony_ci }, 47662306a36Sopenharmony_ci}; 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_cistatic struct mlxreg_core_item nvsw_sn2201_items[] = { 47962306a36Sopenharmony_ci { 48062306a36Sopenharmony_ci .data = nvsw_sn2201_psu_items_data, 48162306a36Sopenharmony_ci .aggr_mask = NVSW_SN2201_CPLD_AGGR_PSU_MASK_DEF, 48262306a36Sopenharmony_ci .reg = NVSW_SN2201_PS_PRSNT_STATUS_OFFSET, 48362306a36Sopenharmony_ci .mask = NVSW_SN2201_CPLD_PSU_MASK, 48462306a36Sopenharmony_ci .count = ARRAY_SIZE(nvsw_sn2201_psu_items_data), 48562306a36Sopenharmony_ci .inversed = 1, 48662306a36Sopenharmony_ci .health = false, 48762306a36Sopenharmony_ci }, 48862306a36Sopenharmony_ci { 48962306a36Sopenharmony_ci .data = nvsw_sn2201_pwr_items_data, 49062306a36Sopenharmony_ci .aggr_mask = NVSW_SN2201_CPLD_AGGR_PWR_MASK_DEF, 49162306a36Sopenharmony_ci .reg = NVSW_SN2201_PS_DC_OK_STATUS_OFFSET, 49262306a36Sopenharmony_ci .mask = NVSW_SN2201_CPLD_PWR_MASK, 49362306a36Sopenharmony_ci .count = ARRAY_SIZE(nvsw_sn2201_pwr_items_data), 49462306a36Sopenharmony_ci .inversed = 0, 49562306a36Sopenharmony_ci .health = false, 49662306a36Sopenharmony_ci }, 49762306a36Sopenharmony_ci { 49862306a36Sopenharmony_ci .data = nvsw_sn2201_fan_items_data, 49962306a36Sopenharmony_ci .aggr_mask = NVSW_SN2201_CPLD_AGGR_FAN_MASK_DEF, 50062306a36Sopenharmony_ci .reg = NVSW_SN2201_FAN_PRSNT_STATUS_OFFSET, 50162306a36Sopenharmony_ci .mask = NVSW_SN2201_CPLD_FAN_MASK, 50262306a36Sopenharmony_ci .count = ARRAY_SIZE(nvsw_sn2201_fan_items_data), 50362306a36Sopenharmony_ci .inversed = 1, 50462306a36Sopenharmony_ci .health = false, 50562306a36Sopenharmony_ci }, 50662306a36Sopenharmony_ci { 50762306a36Sopenharmony_ci .data = nvsw_sn2201_sys_items_data, 50862306a36Sopenharmony_ci .aggr_mask = NVSW_SN2201_CPLD_AGGR_ASIC_MASK_DEF, 50962306a36Sopenharmony_ci .reg = NVSW_SN2201_ASIC_STATUS_OFFSET, 51062306a36Sopenharmony_ci .mask = NVSW_SN2201_CPLD_ASIC_MASK, 51162306a36Sopenharmony_ci .count = ARRAY_SIZE(nvsw_sn2201_sys_items_data), 51262306a36Sopenharmony_ci .inversed = 1, 51362306a36Sopenharmony_ci .health = false, 51462306a36Sopenharmony_ci }, 51562306a36Sopenharmony_ci}; 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_cistatic 51862306a36Sopenharmony_cistruct mlxreg_core_hotplug_platform_data nvsw_sn2201_hotplug = { 51962306a36Sopenharmony_ci .items = nvsw_sn2201_items, 52062306a36Sopenharmony_ci .counter = ARRAY_SIZE(nvsw_sn2201_items), 52162306a36Sopenharmony_ci .cell = NVSW_SN2201_SYS_INT_STATUS_OFFSET, 52262306a36Sopenharmony_ci .mask = NVSW_SN2201_CPLD_AGGR_MASK_DEF, 52362306a36Sopenharmony_ci}; 52462306a36Sopenharmony_ci 52562306a36Sopenharmony_ci/* SN2201 static devices. */ 52662306a36Sopenharmony_cistatic struct i2c_board_info nvsw_sn2201_static_devices[] = { 52762306a36Sopenharmony_ci { 52862306a36Sopenharmony_ci I2C_BOARD_INFO("24c02", 0x57), 52962306a36Sopenharmony_ci }, 53062306a36Sopenharmony_ci { 53162306a36Sopenharmony_ci I2C_BOARD_INFO("lm75", 0x4b), 53262306a36Sopenharmony_ci }, 53362306a36Sopenharmony_ci { 53462306a36Sopenharmony_ci I2C_BOARD_INFO("24c64", 0x56), 53562306a36Sopenharmony_ci }, 53662306a36Sopenharmony_ci { 53762306a36Sopenharmony_ci I2C_BOARD_INFO("ads1015", 0x49), 53862306a36Sopenharmony_ci }, 53962306a36Sopenharmony_ci { 54062306a36Sopenharmony_ci I2C_BOARD_INFO("pca9546", 0x71), 54162306a36Sopenharmony_ci }, 54262306a36Sopenharmony_ci { 54362306a36Sopenharmony_ci I2C_BOARD_INFO("emc2305", 0x4d), 54462306a36Sopenharmony_ci }, 54562306a36Sopenharmony_ci { 54662306a36Sopenharmony_ci I2C_BOARD_INFO("lm75", 0x49), 54762306a36Sopenharmony_ci }, 54862306a36Sopenharmony_ci { 54962306a36Sopenharmony_ci I2C_BOARD_INFO("pca9555", 0x27), 55062306a36Sopenharmony_ci }, 55162306a36Sopenharmony_ci { 55262306a36Sopenharmony_ci I2C_BOARD_INFO("powr1014", 0x37), 55362306a36Sopenharmony_ci }, 55462306a36Sopenharmony_ci { 55562306a36Sopenharmony_ci I2C_BOARD_INFO("lm75", 0x4f), 55662306a36Sopenharmony_ci }, 55762306a36Sopenharmony_ci { 55862306a36Sopenharmony_ci I2C_BOARD_INFO("pmbus", 0x40), 55962306a36Sopenharmony_ci }, 56062306a36Sopenharmony_ci}; 56162306a36Sopenharmony_ci 56262306a36Sopenharmony_ci/* SN2201 default static board info. */ 56362306a36Sopenharmony_cistatic struct mlxreg_hotplug_device nvsw_sn2201_static_brdinfo[] = { 56462306a36Sopenharmony_ci { 56562306a36Sopenharmony_ci .brdinfo = &nvsw_sn2201_static_devices[0], 56662306a36Sopenharmony_ci .nr = NVSW_SN2201_MAIN_NR, 56762306a36Sopenharmony_ci }, 56862306a36Sopenharmony_ci { 56962306a36Sopenharmony_ci .brdinfo = &nvsw_sn2201_static_devices[1], 57062306a36Sopenharmony_ci .nr = NVSW_SN2201_MAIN_MUX_CH0_NR, 57162306a36Sopenharmony_ci }, 57262306a36Sopenharmony_ci { 57362306a36Sopenharmony_ci .brdinfo = &nvsw_sn2201_static_devices[2], 57462306a36Sopenharmony_ci .nr = NVSW_SN2201_MAIN_MUX_CH0_NR, 57562306a36Sopenharmony_ci }, 57662306a36Sopenharmony_ci { 57762306a36Sopenharmony_ci .brdinfo = &nvsw_sn2201_static_devices[3], 57862306a36Sopenharmony_ci .nr = NVSW_SN2201_MAIN_MUX_CH0_NR, 57962306a36Sopenharmony_ci }, 58062306a36Sopenharmony_ci { 58162306a36Sopenharmony_ci .brdinfo = &nvsw_sn2201_static_devices[4], 58262306a36Sopenharmony_ci .nr = NVSW_SN2201_MAIN_MUX_CH3_NR, 58362306a36Sopenharmony_ci }, 58462306a36Sopenharmony_ci { 58562306a36Sopenharmony_ci .brdinfo = &nvsw_sn2201_static_devices[5], 58662306a36Sopenharmony_ci .nr = NVSW_SN2201_MAIN_MUX_CH5_NR, 58762306a36Sopenharmony_ci }, 58862306a36Sopenharmony_ci { 58962306a36Sopenharmony_ci .brdinfo = &nvsw_sn2201_static_devices[6], 59062306a36Sopenharmony_ci .nr = NVSW_SN2201_MAIN_MUX_CH5_NR, 59162306a36Sopenharmony_ci }, 59262306a36Sopenharmony_ci { 59362306a36Sopenharmony_ci .brdinfo = &nvsw_sn2201_static_devices[7], 59462306a36Sopenharmony_ci .nr = NVSW_SN2201_MAIN_MUX_CH5_NR, 59562306a36Sopenharmony_ci }, 59662306a36Sopenharmony_ci { 59762306a36Sopenharmony_ci .brdinfo = &nvsw_sn2201_static_devices[8], 59862306a36Sopenharmony_ci .nr = NVSW_SN2201_MAIN_MUX_CH6_NR, 59962306a36Sopenharmony_ci }, 60062306a36Sopenharmony_ci { 60162306a36Sopenharmony_ci .brdinfo = &nvsw_sn2201_static_devices[9], 60262306a36Sopenharmony_ci .nr = NVSW_SN2201_MAIN_MUX_CH6_NR, 60362306a36Sopenharmony_ci }, 60462306a36Sopenharmony_ci { 60562306a36Sopenharmony_ci .brdinfo = &nvsw_sn2201_static_devices[10], 60662306a36Sopenharmony_ci .nr = NVSW_SN2201_MAIN_MUX_CH7_NR, 60762306a36Sopenharmony_ci }, 60862306a36Sopenharmony_ci}; 60962306a36Sopenharmony_ci 61062306a36Sopenharmony_ci/* LED default data. */ 61162306a36Sopenharmony_cistatic struct mlxreg_core_data nvsw_sn2201_led_data[] = { 61262306a36Sopenharmony_ci { 61362306a36Sopenharmony_ci .label = "status:green", 61462306a36Sopenharmony_ci .reg = NVSW_SN2201_FRONT_SYS_LED_CTRL_OFFSET, 61562306a36Sopenharmony_ci .mask = GENMASK(7, 4), 61662306a36Sopenharmony_ci }, 61762306a36Sopenharmony_ci { 61862306a36Sopenharmony_ci .label = "status:orange", 61962306a36Sopenharmony_ci .reg = NVSW_SN2201_FRONT_SYS_LED_CTRL_OFFSET, 62062306a36Sopenharmony_ci .mask = GENMASK(7, 4), 62162306a36Sopenharmony_ci }, 62262306a36Sopenharmony_ci { 62362306a36Sopenharmony_ci .label = "psu:green", 62462306a36Sopenharmony_ci .reg = NVSW_SN2201_FRONT_PSU_LED_CTRL_OFFSET, 62562306a36Sopenharmony_ci .mask = GENMASK(7, 4), 62662306a36Sopenharmony_ci }, 62762306a36Sopenharmony_ci { 62862306a36Sopenharmony_ci .label = "psu:orange", 62962306a36Sopenharmony_ci .reg = NVSW_SN2201_FRONT_PSU_LED_CTRL_OFFSET, 63062306a36Sopenharmony_ci .mask = GENMASK(7, 4), 63162306a36Sopenharmony_ci }, 63262306a36Sopenharmony_ci { 63362306a36Sopenharmony_ci .label = "uid:blue", 63462306a36Sopenharmony_ci .reg = NVSW_SN2201_FRONT_UID_LED_CTRL_OFFSET, 63562306a36Sopenharmony_ci .mask = GENMASK(7, 4), 63662306a36Sopenharmony_ci }, 63762306a36Sopenharmony_ci { 63862306a36Sopenharmony_ci .label = "fan1:green", 63962306a36Sopenharmony_ci .reg = NVSW_SN2201_FAN_LED1_CTRL_OFFSET, 64062306a36Sopenharmony_ci .mask = GENMASK(7, 4), 64162306a36Sopenharmony_ci }, 64262306a36Sopenharmony_ci { 64362306a36Sopenharmony_ci .label = "fan1:orange", 64462306a36Sopenharmony_ci .reg = NVSW_SN2201_FAN_LED1_CTRL_OFFSET, 64562306a36Sopenharmony_ci .mask = GENMASK(7, 4), 64662306a36Sopenharmony_ci }, 64762306a36Sopenharmony_ci { 64862306a36Sopenharmony_ci .label = "fan2:green", 64962306a36Sopenharmony_ci .reg = NVSW_SN2201_FAN_LED1_CTRL_OFFSET, 65062306a36Sopenharmony_ci .mask = GENMASK(3, 0), 65162306a36Sopenharmony_ci }, 65262306a36Sopenharmony_ci { 65362306a36Sopenharmony_ci .label = "fan2:orange", 65462306a36Sopenharmony_ci .reg = NVSW_SN2201_FAN_LED1_CTRL_OFFSET, 65562306a36Sopenharmony_ci .mask = GENMASK(3, 0), 65662306a36Sopenharmony_ci }, 65762306a36Sopenharmony_ci { 65862306a36Sopenharmony_ci .label = "fan3:green", 65962306a36Sopenharmony_ci .reg = NVSW_SN2201_FAN_LED2_CTRL_OFFSET, 66062306a36Sopenharmony_ci .mask = GENMASK(7, 4), 66162306a36Sopenharmony_ci }, 66262306a36Sopenharmony_ci { 66362306a36Sopenharmony_ci .label = "fan3:orange", 66462306a36Sopenharmony_ci .reg = NVSW_SN2201_FAN_LED2_CTRL_OFFSET, 66562306a36Sopenharmony_ci .mask = GENMASK(7, 4), 66662306a36Sopenharmony_ci }, 66762306a36Sopenharmony_ci { 66862306a36Sopenharmony_ci .label = "fan4:green", 66962306a36Sopenharmony_ci .reg = NVSW_SN2201_FAN_LED2_CTRL_OFFSET, 67062306a36Sopenharmony_ci .mask = GENMASK(3, 0), 67162306a36Sopenharmony_ci }, 67262306a36Sopenharmony_ci { 67362306a36Sopenharmony_ci .label = "fan4:orange", 67462306a36Sopenharmony_ci .reg = NVSW_SN2201_FAN_LED2_CTRL_OFFSET, 67562306a36Sopenharmony_ci .mask = GENMASK(3, 0), 67662306a36Sopenharmony_ci }, 67762306a36Sopenharmony_ci}; 67862306a36Sopenharmony_ci 67962306a36Sopenharmony_cistatic struct mlxreg_core_platform_data nvsw_sn2201_led = { 68062306a36Sopenharmony_ci .data = nvsw_sn2201_led_data, 68162306a36Sopenharmony_ci .counter = ARRAY_SIZE(nvsw_sn2201_led_data), 68262306a36Sopenharmony_ci}; 68362306a36Sopenharmony_ci 68462306a36Sopenharmony_ci/* Default register access data. */ 68562306a36Sopenharmony_cistatic struct mlxreg_core_data nvsw_sn2201_io_data[] = { 68662306a36Sopenharmony_ci { 68762306a36Sopenharmony_ci .label = "cpld1_version", 68862306a36Sopenharmony_ci .reg = NVSW_SN2201_CPLD_VER_OFFSET, 68962306a36Sopenharmony_ci .bit = GENMASK(7, 0), 69062306a36Sopenharmony_ci .mode = 0444, 69162306a36Sopenharmony_ci }, 69262306a36Sopenharmony_ci { 69362306a36Sopenharmony_ci .label = "cpld1_version_min", 69462306a36Sopenharmony_ci .reg = NVSW_SN2201_CPLD_MVER_OFFSET, 69562306a36Sopenharmony_ci .bit = GENMASK(7, 0), 69662306a36Sopenharmony_ci .mode = 0444, 69762306a36Sopenharmony_ci }, 69862306a36Sopenharmony_ci { 69962306a36Sopenharmony_ci .label = "cpld1_pn", 70062306a36Sopenharmony_ci .reg = NVSW_SN2201_CPLD_PN_OFFSET, 70162306a36Sopenharmony_ci .bit = GENMASK(15, 0), 70262306a36Sopenharmony_ci .mode = 0444, 70362306a36Sopenharmony_ci .regnum = 2, 70462306a36Sopenharmony_ci }, 70562306a36Sopenharmony_ci { 70662306a36Sopenharmony_ci .label = "psu1_on", 70762306a36Sopenharmony_ci .reg = NVSW_SN2201_PSU_CTRL_OFFSET, 70862306a36Sopenharmony_ci .mask = GENMASK(7, 0) & ~BIT(0), 70962306a36Sopenharmony_ci .mode = 0644, 71062306a36Sopenharmony_ci }, 71162306a36Sopenharmony_ci { 71262306a36Sopenharmony_ci .label = "psu2_on", 71362306a36Sopenharmony_ci .reg = NVSW_SN2201_PSU_CTRL_OFFSET, 71462306a36Sopenharmony_ci .mask = GENMASK(7, 0) & ~BIT(1), 71562306a36Sopenharmony_ci .mode = 0644, 71662306a36Sopenharmony_ci }, 71762306a36Sopenharmony_ci { 71862306a36Sopenharmony_ci .label = "pwr_cycle", 71962306a36Sopenharmony_ci .reg = NVSW_SN2201_PSU_CTRL_OFFSET, 72062306a36Sopenharmony_ci .mask = GENMASK(7, 0) & ~BIT(2), 72162306a36Sopenharmony_ci .mode = 0644, 72262306a36Sopenharmony_ci }, 72362306a36Sopenharmony_ci { 72462306a36Sopenharmony_ci .label = "asic_health", 72562306a36Sopenharmony_ci .reg = NVSW_SN2201_SYS_STATUS_OFFSET, 72662306a36Sopenharmony_ci .mask = GENMASK(4, 3), 72762306a36Sopenharmony_ci .bit = 4, 72862306a36Sopenharmony_ci .mode = 0444, 72962306a36Sopenharmony_ci }, 73062306a36Sopenharmony_ci { 73162306a36Sopenharmony_ci .label = "qsfp_pwr_good", 73262306a36Sopenharmony_ci .reg = NVSW_SN2201_SYS_STATUS_OFFSET, 73362306a36Sopenharmony_ci .mask = GENMASK(7, 0) & ~BIT(0), 73462306a36Sopenharmony_ci .mode = 0444, 73562306a36Sopenharmony_ci }, 73662306a36Sopenharmony_ci { 73762306a36Sopenharmony_ci .label = "phy_reset", 73862306a36Sopenharmony_ci .reg = NVSW_SN2201_SYS_RST_STATUS_OFFSET, 73962306a36Sopenharmony_ci .mask = GENMASK(7, 0) & ~BIT(3), 74062306a36Sopenharmony_ci .mode = 0644, 74162306a36Sopenharmony_ci }, 74262306a36Sopenharmony_ci { 74362306a36Sopenharmony_ci .label = "mac_reset", 74462306a36Sopenharmony_ci .reg = NVSW_SN2201_SYS_RST_STATUS_OFFSET, 74562306a36Sopenharmony_ci .mask = GENMASK(7, 0) & ~BIT(2), 74662306a36Sopenharmony_ci .mode = 0644, 74762306a36Sopenharmony_ci }, 74862306a36Sopenharmony_ci { 74962306a36Sopenharmony_ci .label = "pwr_down", 75062306a36Sopenharmony_ci .reg = NVSW_SN2201_RST_SW_CTRL_OFFSET, 75162306a36Sopenharmony_ci .mask = GENMASK(7, 0) & ~BIT(0), 75262306a36Sopenharmony_ci .mode = 0644, 75362306a36Sopenharmony_ci }, 75462306a36Sopenharmony_ci { 75562306a36Sopenharmony_ci .label = "reset_long_pb", 75662306a36Sopenharmony_ci .reg = NVSW_SN2201_RST_CAUSE1_OFFSET, 75762306a36Sopenharmony_ci .mask = GENMASK(7, 0) & ~BIT(0), 75862306a36Sopenharmony_ci .mode = 0444, 75962306a36Sopenharmony_ci }, 76062306a36Sopenharmony_ci { 76162306a36Sopenharmony_ci .label = "reset_short_pb", 76262306a36Sopenharmony_ci .reg = NVSW_SN2201_RST_CAUSE1_OFFSET, 76362306a36Sopenharmony_ci .mask = GENMASK(7, 0) & ~BIT(1), 76462306a36Sopenharmony_ci .mode = 0444, 76562306a36Sopenharmony_ci }, 76662306a36Sopenharmony_ci { 76762306a36Sopenharmony_ci .label = "reset_aux_pwr_or_fu", 76862306a36Sopenharmony_ci .reg = NVSW_SN2201_RST_CAUSE1_OFFSET, 76962306a36Sopenharmony_ci .mask = GENMASK(7, 0) & ~BIT(2), 77062306a36Sopenharmony_ci .mode = 0444, 77162306a36Sopenharmony_ci }, 77262306a36Sopenharmony_ci { 77362306a36Sopenharmony_ci .label = "reset_swb_dc_dc_pwr_fail", 77462306a36Sopenharmony_ci .reg = NVSW_SN2201_RST_CAUSE1_OFFSET, 77562306a36Sopenharmony_ci .mask = GENMASK(7, 0) & ~BIT(3), 77662306a36Sopenharmony_ci .mode = 0444, 77762306a36Sopenharmony_ci }, 77862306a36Sopenharmony_ci { 77962306a36Sopenharmony_ci .label = "reset_sw_reset", 78062306a36Sopenharmony_ci .reg = NVSW_SN2201_RST_CAUSE1_OFFSET, 78162306a36Sopenharmony_ci .mask = GENMASK(7, 0) & ~BIT(4), 78262306a36Sopenharmony_ci .mode = 0444, 78362306a36Sopenharmony_ci }, 78462306a36Sopenharmony_ci { 78562306a36Sopenharmony_ci .label = "reset_fw_reset", 78662306a36Sopenharmony_ci .reg = NVSW_SN2201_RST_CAUSE1_OFFSET, 78762306a36Sopenharmony_ci .mask = GENMASK(7, 0) & ~BIT(5), 78862306a36Sopenharmony_ci .mode = 0444, 78962306a36Sopenharmony_ci }, 79062306a36Sopenharmony_ci { 79162306a36Sopenharmony_ci .label = "reset_swb_wd", 79262306a36Sopenharmony_ci .reg = NVSW_SN2201_RST_CAUSE1_OFFSET, 79362306a36Sopenharmony_ci .mask = GENMASK(7, 0) & ~BIT(6), 79462306a36Sopenharmony_ci .mode = 0444, 79562306a36Sopenharmony_ci }, 79662306a36Sopenharmony_ci { 79762306a36Sopenharmony_ci .label = "reset_asic_thermal", 79862306a36Sopenharmony_ci .reg = NVSW_SN2201_RST_CAUSE1_OFFSET, 79962306a36Sopenharmony_ci .mask = GENMASK(7, 0) & ~BIT(7), 80062306a36Sopenharmony_ci .mode = 0444, 80162306a36Sopenharmony_ci }, 80262306a36Sopenharmony_ci { 80362306a36Sopenharmony_ci .label = "reset_system", 80462306a36Sopenharmony_ci .reg = NVSW_SN2201_RST_CAUSE2_OFFSET, 80562306a36Sopenharmony_ci .mask = GENMASK(7, 0) & ~BIT(1), 80662306a36Sopenharmony_ci .mode = 0444, 80762306a36Sopenharmony_ci }, 80862306a36Sopenharmony_ci { 80962306a36Sopenharmony_ci .label = "reset_sw_pwr_off", 81062306a36Sopenharmony_ci .reg = NVSW_SN2201_RST_CAUSE2_OFFSET, 81162306a36Sopenharmony_ci .mask = GENMASK(7, 0) & ~BIT(2), 81262306a36Sopenharmony_ci .mode = 0444, 81362306a36Sopenharmony_ci }, 81462306a36Sopenharmony_ci { 81562306a36Sopenharmony_ci .label = "reset_cpu_pwr_fail_thermal", 81662306a36Sopenharmony_ci .reg = NVSW_SN2201_RST_CAUSE2_OFFSET, 81762306a36Sopenharmony_ci .mask = GENMASK(7, 0) & ~BIT(4), 81862306a36Sopenharmony_ci .mode = 0444, 81962306a36Sopenharmony_ci }, 82062306a36Sopenharmony_ci { 82162306a36Sopenharmony_ci .label = "reset_reload_bios", 82262306a36Sopenharmony_ci .reg = NVSW_SN2201_RST_CAUSE2_OFFSET, 82362306a36Sopenharmony_ci .mask = GENMASK(7, 0) & ~BIT(5), 82462306a36Sopenharmony_ci .mode = 0444, 82562306a36Sopenharmony_ci }, 82662306a36Sopenharmony_ci { 82762306a36Sopenharmony_ci .label = "reset_ac_pwr_fail", 82862306a36Sopenharmony_ci .reg = NVSW_SN2201_RST_CAUSE2_OFFSET, 82962306a36Sopenharmony_ci .mask = GENMASK(7, 0) & ~BIT(6), 83062306a36Sopenharmony_ci .mode = 0444, 83162306a36Sopenharmony_ci }, 83262306a36Sopenharmony_ci { 83362306a36Sopenharmony_ci .label = "psu1", 83462306a36Sopenharmony_ci .reg = NVSW_SN2201_PS_PRSNT_STATUS_OFFSET, 83562306a36Sopenharmony_ci .mask = GENMASK(7, 0) & ~BIT(0), 83662306a36Sopenharmony_ci .mode = 0444, 83762306a36Sopenharmony_ci }, 83862306a36Sopenharmony_ci { 83962306a36Sopenharmony_ci .label = "psu2", 84062306a36Sopenharmony_ci .reg = NVSW_SN2201_PS_PRSNT_STATUS_OFFSET, 84162306a36Sopenharmony_ci .mask = GENMASK(7, 0) & ~BIT(1), 84262306a36Sopenharmony_ci .mode = 0444, 84362306a36Sopenharmony_ci }, 84462306a36Sopenharmony_ci}; 84562306a36Sopenharmony_ci 84662306a36Sopenharmony_cistatic struct mlxreg_core_platform_data nvsw_sn2201_regs_io = { 84762306a36Sopenharmony_ci .data = nvsw_sn2201_io_data, 84862306a36Sopenharmony_ci .counter = ARRAY_SIZE(nvsw_sn2201_io_data), 84962306a36Sopenharmony_ci}; 85062306a36Sopenharmony_ci 85162306a36Sopenharmony_ci/* Default watchdog data. */ 85262306a36Sopenharmony_cistatic struct mlxreg_core_data nvsw_sn2201_wd_data[] = { 85362306a36Sopenharmony_ci { 85462306a36Sopenharmony_ci .label = "action", 85562306a36Sopenharmony_ci .reg = NVSW_SN2201_WD_ACT_OFFSET, 85662306a36Sopenharmony_ci .mask = GENMASK(7, 1), 85762306a36Sopenharmony_ci .bit = 0, 85862306a36Sopenharmony_ci }, 85962306a36Sopenharmony_ci { 86062306a36Sopenharmony_ci .label = "timeout", 86162306a36Sopenharmony_ci .reg = NVSW_SN2201_WD_TMR_OFFSET_LSB, 86262306a36Sopenharmony_ci .mask = 0, 86362306a36Sopenharmony_ci .health_cntr = NVSW_SN2201_WD_DFLT_TIMEOUT, 86462306a36Sopenharmony_ci }, 86562306a36Sopenharmony_ci { 86662306a36Sopenharmony_ci .label = "timeleft", 86762306a36Sopenharmony_ci .reg = NVSW_SN2201_WD_TMR_OFFSET_LSB, 86862306a36Sopenharmony_ci .mask = 0, 86962306a36Sopenharmony_ci }, 87062306a36Sopenharmony_ci { 87162306a36Sopenharmony_ci .label = "ping", 87262306a36Sopenharmony_ci .reg = NVSW_SN2201_WD_ACT_OFFSET, 87362306a36Sopenharmony_ci .mask = GENMASK(7, 1), 87462306a36Sopenharmony_ci .bit = 0, 87562306a36Sopenharmony_ci }, 87662306a36Sopenharmony_ci { 87762306a36Sopenharmony_ci .label = "reset", 87862306a36Sopenharmony_ci .reg = NVSW_SN2201_RST_CAUSE1_OFFSET, 87962306a36Sopenharmony_ci .mask = GENMASK(7, 0) & ~BIT(6), 88062306a36Sopenharmony_ci .bit = 6, 88162306a36Sopenharmony_ci }, 88262306a36Sopenharmony_ci}; 88362306a36Sopenharmony_ci 88462306a36Sopenharmony_cistatic struct mlxreg_core_platform_data nvsw_sn2201_wd = { 88562306a36Sopenharmony_ci .data = nvsw_sn2201_wd_data, 88662306a36Sopenharmony_ci .counter = ARRAY_SIZE(nvsw_sn2201_wd_data), 88762306a36Sopenharmony_ci .version = MLX_WDT_TYPE3, 88862306a36Sopenharmony_ci .identity = "mlx-wdt-main", 88962306a36Sopenharmony_ci}; 89062306a36Sopenharmony_ci 89162306a36Sopenharmony_cistatic int 89262306a36Sopenharmony_cinvsw_sn2201_create_static_devices(struct nvsw_sn2201 *nvsw_sn2201, 89362306a36Sopenharmony_ci struct mlxreg_hotplug_device *devs, 89462306a36Sopenharmony_ci int size) 89562306a36Sopenharmony_ci{ 89662306a36Sopenharmony_ci struct mlxreg_hotplug_device *dev = devs; 89762306a36Sopenharmony_ci int ret; 89862306a36Sopenharmony_ci int i; 89962306a36Sopenharmony_ci 90062306a36Sopenharmony_ci /* Create I2C static devices. */ 90162306a36Sopenharmony_ci for (i = 0; i < size; i++, dev++) { 90262306a36Sopenharmony_ci dev->client = i2c_new_client_device(dev->adapter, dev->brdinfo); 90362306a36Sopenharmony_ci if (IS_ERR(dev->client)) { 90462306a36Sopenharmony_ci dev_err(nvsw_sn2201->dev, "Failed to create client %s at bus %d at addr 0x%02x\n", 90562306a36Sopenharmony_ci dev->brdinfo->type, 90662306a36Sopenharmony_ci dev->nr, dev->brdinfo->addr); 90762306a36Sopenharmony_ci 90862306a36Sopenharmony_ci dev->adapter = NULL; 90962306a36Sopenharmony_ci ret = PTR_ERR(dev->client); 91062306a36Sopenharmony_ci goto fail_create_static_devices; 91162306a36Sopenharmony_ci } 91262306a36Sopenharmony_ci } 91362306a36Sopenharmony_ci 91462306a36Sopenharmony_ci return 0; 91562306a36Sopenharmony_ci 91662306a36Sopenharmony_cifail_create_static_devices: 91762306a36Sopenharmony_ci while (--i >= 0) { 91862306a36Sopenharmony_ci dev = devs + i; 91962306a36Sopenharmony_ci i2c_unregister_device(dev->client); 92062306a36Sopenharmony_ci dev->client = NULL; 92162306a36Sopenharmony_ci dev->adapter = NULL; 92262306a36Sopenharmony_ci } 92362306a36Sopenharmony_ci return ret; 92462306a36Sopenharmony_ci} 92562306a36Sopenharmony_ci 92662306a36Sopenharmony_cistatic void nvsw_sn2201_destroy_static_devices(struct nvsw_sn2201 *nvsw_sn2201, 92762306a36Sopenharmony_ci struct mlxreg_hotplug_device *devs, int size) 92862306a36Sopenharmony_ci{ 92962306a36Sopenharmony_ci struct mlxreg_hotplug_device *dev = devs; 93062306a36Sopenharmony_ci int i; 93162306a36Sopenharmony_ci 93262306a36Sopenharmony_ci /* Destroy static I2C device for SN2201 static devices. */ 93362306a36Sopenharmony_ci for (i = 0; i < size; i++, dev++) { 93462306a36Sopenharmony_ci if (dev->client) { 93562306a36Sopenharmony_ci i2c_unregister_device(dev->client); 93662306a36Sopenharmony_ci dev->client = NULL; 93762306a36Sopenharmony_ci i2c_put_adapter(dev->adapter); 93862306a36Sopenharmony_ci dev->adapter = NULL; 93962306a36Sopenharmony_ci } 94062306a36Sopenharmony_ci } 94162306a36Sopenharmony_ci} 94262306a36Sopenharmony_ci 94362306a36Sopenharmony_cistatic int nvsw_sn2201_config_post_init(struct nvsw_sn2201 *nvsw_sn2201) 94462306a36Sopenharmony_ci{ 94562306a36Sopenharmony_ci struct mlxreg_hotplug_device *sn2201_dev; 94662306a36Sopenharmony_ci struct i2c_adapter *adap; 94762306a36Sopenharmony_ci struct device *dev; 94862306a36Sopenharmony_ci int i, err; 94962306a36Sopenharmony_ci 95062306a36Sopenharmony_ci dev = nvsw_sn2201->dev; 95162306a36Sopenharmony_ci adap = i2c_get_adapter(nvsw_sn2201->main_mux_deferred_nr); 95262306a36Sopenharmony_ci if (!adap) { 95362306a36Sopenharmony_ci dev_err(dev, "Failed to get adapter for bus %d\n", 95462306a36Sopenharmony_ci nvsw_sn2201->main_mux_deferred_nr); 95562306a36Sopenharmony_ci return -ENODEV; 95662306a36Sopenharmony_ci } 95762306a36Sopenharmony_ci i2c_put_adapter(adap); 95862306a36Sopenharmony_ci 95962306a36Sopenharmony_ci /* Update board info. */ 96062306a36Sopenharmony_ci sn2201_dev = nvsw_sn2201->sn2201_devs; 96162306a36Sopenharmony_ci for (i = 0; i < nvsw_sn2201->sn2201_devs_num; i++, sn2201_dev++) { 96262306a36Sopenharmony_ci sn2201_dev->adapter = i2c_get_adapter(sn2201_dev->nr); 96362306a36Sopenharmony_ci if (!sn2201_dev->adapter) 96462306a36Sopenharmony_ci return -ENODEV; 96562306a36Sopenharmony_ci i2c_put_adapter(sn2201_dev->adapter); 96662306a36Sopenharmony_ci } 96762306a36Sopenharmony_ci 96862306a36Sopenharmony_ci err = nvsw_sn2201_create_static_devices(nvsw_sn2201, nvsw_sn2201->sn2201_devs, 96962306a36Sopenharmony_ci nvsw_sn2201->sn2201_devs_num); 97062306a36Sopenharmony_ci if (err) 97162306a36Sopenharmony_ci dev_err(dev, "Failed to create static devices\n"); 97262306a36Sopenharmony_ci 97362306a36Sopenharmony_ci return err; 97462306a36Sopenharmony_ci} 97562306a36Sopenharmony_ci 97662306a36Sopenharmony_cistatic int nvsw_sn2201_config_init(struct nvsw_sn2201 *nvsw_sn2201, void *regmap) 97762306a36Sopenharmony_ci{ 97862306a36Sopenharmony_ci struct device *dev = nvsw_sn2201->dev; 97962306a36Sopenharmony_ci int err; 98062306a36Sopenharmony_ci 98162306a36Sopenharmony_ci nvsw_sn2201->io_data = &nvsw_sn2201_regs_io; 98262306a36Sopenharmony_ci nvsw_sn2201->led_data = &nvsw_sn2201_led; 98362306a36Sopenharmony_ci nvsw_sn2201->wd_data = &nvsw_sn2201_wd; 98462306a36Sopenharmony_ci nvsw_sn2201->hotplug_data = &nvsw_sn2201_hotplug; 98562306a36Sopenharmony_ci 98662306a36Sopenharmony_ci /* Register IO access driver. */ 98762306a36Sopenharmony_ci if (nvsw_sn2201->io_data) { 98862306a36Sopenharmony_ci nvsw_sn2201->io_data->regmap = regmap; 98962306a36Sopenharmony_ci nvsw_sn2201->io_regs = 99062306a36Sopenharmony_ci platform_device_register_resndata(dev, "mlxreg-io", PLATFORM_DEVID_NONE, NULL, 0, 99162306a36Sopenharmony_ci nvsw_sn2201->io_data, 99262306a36Sopenharmony_ci sizeof(*nvsw_sn2201->io_data)); 99362306a36Sopenharmony_ci if (IS_ERR(nvsw_sn2201->io_regs)) { 99462306a36Sopenharmony_ci err = PTR_ERR(nvsw_sn2201->io_regs); 99562306a36Sopenharmony_ci goto fail_register_io; 99662306a36Sopenharmony_ci } 99762306a36Sopenharmony_ci } 99862306a36Sopenharmony_ci 99962306a36Sopenharmony_ci /* Register LED driver. */ 100062306a36Sopenharmony_ci if (nvsw_sn2201->led_data) { 100162306a36Sopenharmony_ci nvsw_sn2201->led_data->regmap = regmap; 100262306a36Sopenharmony_ci nvsw_sn2201->led = 100362306a36Sopenharmony_ci platform_device_register_resndata(dev, "leds-mlxreg", PLATFORM_DEVID_NONE, NULL, 0, 100462306a36Sopenharmony_ci nvsw_sn2201->led_data, 100562306a36Sopenharmony_ci sizeof(*nvsw_sn2201->led_data)); 100662306a36Sopenharmony_ci if (IS_ERR(nvsw_sn2201->led)) { 100762306a36Sopenharmony_ci err = PTR_ERR(nvsw_sn2201->led); 100862306a36Sopenharmony_ci goto fail_register_led; 100962306a36Sopenharmony_ci } 101062306a36Sopenharmony_ci } 101162306a36Sopenharmony_ci 101262306a36Sopenharmony_ci /* Register WD driver. */ 101362306a36Sopenharmony_ci if (nvsw_sn2201->wd_data) { 101462306a36Sopenharmony_ci nvsw_sn2201->wd_data->regmap = regmap; 101562306a36Sopenharmony_ci nvsw_sn2201->wd = 101662306a36Sopenharmony_ci platform_device_register_resndata(dev, "mlx-wdt", PLATFORM_DEVID_NONE, NULL, 0, 101762306a36Sopenharmony_ci nvsw_sn2201->wd_data, 101862306a36Sopenharmony_ci sizeof(*nvsw_sn2201->wd_data)); 101962306a36Sopenharmony_ci if (IS_ERR(nvsw_sn2201->wd)) { 102062306a36Sopenharmony_ci err = PTR_ERR(nvsw_sn2201->wd); 102162306a36Sopenharmony_ci goto fail_register_wd; 102262306a36Sopenharmony_ci } 102362306a36Sopenharmony_ci } 102462306a36Sopenharmony_ci 102562306a36Sopenharmony_ci /* Register hotplug driver. */ 102662306a36Sopenharmony_ci if (nvsw_sn2201->hotplug_data) { 102762306a36Sopenharmony_ci nvsw_sn2201->hotplug_data->regmap = regmap; 102862306a36Sopenharmony_ci nvsw_sn2201->pdev_hotplug = 102962306a36Sopenharmony_ci platform_device_register_resndata(dev, "mlxreg-hotplug", PLATFORM_DEVID_NONE, 103062306a36Sopenharmony_ci nvsw_sn2201_cpld_res, 103162306a36Sopenharmony_ci ARRAY_SIZE(nvsw_sn2201_cpld_res), 103262306a36Sopenharmony_ci nvsw_sn2201->hotplug_data, 103362306a36Sopenharmony_ci sizeof(*nvsw_sn2201->hotplug_data)); 103462306a36Sopenharmony_ci if (IS_ERR(nvsw_sn2201->pdev_hotplug)) { 103562306a36Sopenharmony_ci err = PTR_ERR(nvsw_sn2201->pdev_hotplug); 103662306a36Sopenharmony_ci goto fail_register_hotplug; 103762306a36Sopenharmony_ci } 103862306a36Sopenharmony_ci } 103962306a36Sopenharmony_ci 104062306a36Sopenharmony_ci return nvsw_sn2201_config_post_init(nvsw_sn2201); 104162306a36Sopenharmony_ci 104262306a36Sopenharmony_cifail_register_hotplug: 104362306a36Sopenharmony_ci if (nvsw_sn2201->wd) 104462306a36Sopenharmony_ci platform_device_unregister(nvsw_sn2201->wd); 104562306a36Sopenharmony_cifail_register_wd: 104662306a36Sopenharmony_ci if (nvsw_sn2201->led) 104762306a36Sopenharmony_ci platform_device_unregister(nvsw_sn2201->led); 104862306a36Sopenharmony_cifail_register_led: 104962306a36Sopenharmony_ci if (nvsw_sn2201->io_regs) 105062306a36Sopenharmony_ci platform_device_unregister(nvsw_sn2201->io_regs); 105162306a36Sopenharmony_cifail_register_io: 105262306a36Sopenharmony_ci 105362306a36Sopenharmony_ci return err; 105462306a36Sopenharmony_ci} 105562306a36Sopenharmony_ci 105662306a36Sopenharmony_cistatic void nvsw_sn2201_config_exit(struct nvsw_sn2201 *nvsw_sn2201) 105762306a36Sopenharmony_ci{ 105862306a36Sopenharmony_ci /* Unregister hotplug driver. */ 105962306a36Sopenharmony_ci if (nvsw_sn2201->pdev_hotplug) 106062306a36Sopenharmony_ci platform_device_unregister(nvsw_sn2201->pdev_hotplug); 106162306a36Sopenharmony_ci /* Unregister WD driver. */ 106262306a36Sopenharmony_ci if (nvsw_sn2201->wd) 106362306a36Sopenharmony_ci platform_device_unregister(nvsw_sn2201->wd); 106462306a36Sopenharmony_ci /* Unregister LED driver. */ 106562306a36Sopenharmony_ci if (nvsw_sn2201->led) 106662306a36Sopenharmony_ci platform_device_unregister(nvsw_sn2201->led); 106762306a36Sopenharmony_ci /* Unregister IO access driver. */ 106862306a36Sopenharmony_ci if (nvsw_sn2201->io_regs) 106962306a36Sopenharmony_ci platform_device_unregister(nvsw_sn2201->io_regs); 107062306a36Sopenharmony_ci} 107162306a36Sopenharmony_ci 107262306a36Sopenharmony_ci/* 107362306a36Sopenharmony_ci * Initialization is divided into two parts: 107462306a36Sopenharmony_ci * - I2C main bus init. 107562306a36Sopenharmony_ci * - Mux creation and attaching devices to the mux, 107662306a36Sopenharmony_ci * which assumes that the main bus is already created. 107762306a36Sopenharmony_ci * This separation is required for synchronization between these two parts. 107862306a36Sopenharmony_ci * Completion notify callback is used to make this flow synchronized. 107962306a36Sopenharmony_ci */ 108062306a36Sopenharmony_cistatic int nvsw_sn2201_i2c_completion_notify(void *handle, int id) 108162306a36Sopenharmony_ci{ 108262306a36Sopenharmony_ci struct nvsw_sn2201 *nvsw_sn2201 = handle; 108362306a36Sopenharmony_ci void *regmap; 108462306a36Sopenharmony_ci int i, err; 108562306a36Sopenharmony_ci 108662306a36Sopenharmony_ci /* Create main mux. */ 108762306a36Sopenharmony_ci nvsw_sn2201->main_mux_devs->adapter = i2c_get_adapter(nvsw_sn2201->main_mux_devs->nr); 108862306a36Sopenharmony_ci if (!nvsw_sn2201->main_mux_devs->adapter) { 108962306a36Sopenharmony_ci err = -ENODEV; 109062306a36Sopenharmony_ci dev_err(nvsw_sn2201->dev, "Failed to get adapter for bus %d\n", 109162306a36Sopenharmony_ci nvsw_sn2201->cpld_devs->nr); 109262306a36Sopenharmony_ci goto i2c_get_adapter_main_fail; 109362306a36Sopenharmony_ci } 109462306a36Sopenharmony_ci 109562306a36Sopenharmony_ci nvsw_sn2201->main_mux_devs_num = ARRAY_SIZE(nvsw_sn2201_main_mux_brdinfo); 109662306a36Sopenharmony_ci err = nvsw_sn2201_create_static_devices(nvsw_sn2201, nvsw_sn2201->main_mux_devs, 109762306a36Sopenharmony_ci nvsw_sn2201->main_mux_devs_num); 109862306a36Sopenharmony_ci if (err) { 109962306a36Sopenharmony_ci dev_err(nvsw_sn2201->dev, "Failed to create main mux devices\n"); 110062306a36Sopenharmony_ci goto nvsw_sn2201_create_static_devices_fail; 110162306a36Sopenharmony_ci } 110262306a36Sopenharmony_ci 110362306a36Sopenharmony_ci nvsw_sn2201->cpld_devs->adapter = i2c_get_adapter(nvsw_sn2201->cpld_devs->nr); 110462306a36Sopenharmony_ci if (!nvsw_sn2201->cpld_devs->adapter) { 110562306a36Sopenharmony_ci err = -ENODEV; 110662306a36Sopenharmony_ci dev_err(nvsw_sn2201->dev, "Failed to get adapter for bus %d\n", 110762306a36Sopenharmony_ci nvsw_sn2201->cpld_devs->nr); 110862306a36Sopenharmony_ci goto i2c_get_adapter_fail; 110962306a36Sopenharmony_ci } 111062306a36Sopenharmony_ci 111162306a36Sopenharmony_ci /* Create CPLD device. */ 111262306a36Sopenharmony_ci nvsw_sn2201->cpld_devs->client = i2c_new_dummy_device(nvsw_sn2201->cpld_devs->adapter, 111362306a36Sopenharmony_ci NVSW_SN2201_CPLD_I2CADDR); 111462306a36Sopenharmony_ci if (IS_ERR(nvsw_sn2201->cpld_devs->client)) { 111562306a36Sopenharmony_ci err = PTR_ERR(nvsw_sn2201->cpld_devs->client); 111662306a36Sopenharmony_ci dev_err(nvsw_sn2201->dev, "Failed to create %s cpld device at bus %d at addr 0x%02x\n", 111762306a36Sopenharmony_ci nvsw_sn2201->cpld_devs->brdinfo->type, nvsw_sn2201->cpld_devs->nr, 111862306a36Sopenharmony_ci nvsw_sn2201->cpld_devs->brdinfo->addr); 111962306a36Sopenharmony_ci goto i2c_new_dummy_fail; 112062306a36Sopenharmony_ci } 112162306a36Sopenharmony_ci 112262306a36Sopenharmony_ci regmap = devm_regmap_init_i2c(nvsw_sn2201->cpld_devs->client, &nvsw_sn2201_regmap_conf); 112362306a36Sopenharmony_ci if (IS_ERR(regmap)) { 112462306a36Sopenharmony_ci err = PTR_ERR(regmap); 112562306a36Sopenharmony_ci dev_err(nvsw_sn2201->dev, "Failed to initialise managed register map\n"); 112662306a36Sopenharmony_ci goto devm_regmap_init_i2c_fail; 112762306a36Sopenharmony_ci } 112862306a36Sopenharmony_ci 112962306a36Sopenharmony_ci /* Set default registers. */ 113062306a36Sopenharmony_ci for (i = 0; i < nvsw_sn2201_regmap_conf.num_reg_defaults; i++) { 113162306a36Sopenharmony_ci err = regmap_write(regmap, nvsw_sn2201_regmap_default[i].reg, 113262306a36Sopenharmony_ci nvsw_sn2201_regmap_default[i].def); 113362306a36Sopenharmony_ci if (err) { 113462306a36Sopenharmony_ci dev_err(nvsw_sn2201->dev, "Failed to set register at offset 0x%02x to default value: 0x%02x\n", 113562306a36Sopenharmony_ci nvsw_sn2201_regmap_default[i].reg, 113662306a36Sopenharmony_ci nvsw_sn2201_regmap_default[i].def); 113762306a36Sopenharmony_ci goto regmap_write_fail; 113862306a36Sopenharmony_ci } 113962306a36Sopenharmony_ci } 114062306a36Sopenharmony_ci 114162306a36Sopenharmony_ci /* Sync registers with hardware. */ 114262306a36Sopenharmony_ci regcache_mark_dirty(regmap); 114362306a36Sopenharmony_ci err = regcache_sync(regmap); 114462306a36Sopenharmony_ci if (err) { 114562306a36Sopenharmony_ci dev_err(nvsw_sn2201->dev, "Failed to Sync registers with hardware\n"); 114662306a36Sopenharmony_ci goto regcache_sync_fail; 114762306a36Sopenharmony_ci } 114862306a36Sopenharmony_ci 114962306a36Sopenharmony_ci /* Configure SN2201 board. */ 115062306a36Sopenharmony_ci err = nvsw_sn2201_config_init(nvsw_sn2201, regmap); 115162306a36Sopenharmony_ci if (err) { 115262306a36Sopenharmony_ci dev_err(nvsw_sn2201->dev, "Failed to configure board\n"); 115362306a36Sopenharmony_ci goto nvsw_sn2201_config_init_fail; 115462306a36Sopenharmony_ci } 115562306a36Sopenharmony_ci 115662306a36Sopenharmony_ci return 0; 115762306a36Sopenharmony_ci 115862306a36Sopenharmony_cinvsw_sn2201_config_init_fail: 115962306a36Sopenharmony_ci nvsw_sn2201_config_exit(nvsw_sn2201); 116062306a36Sopenharmony_ciregcache_sync_fail: 116162306a36Sopenharmony_ciregmap_write_fail: 116262306a36Sopenharmony_cidevm_regmap_init_i2c_fail: 116362306a36Sopenharmony_cii2c_new_dummy_fail: 116462306a36Sopenharmony_ci i2c_put_adapter(nvsw_sn2201->cpld_devs->adapter); 116562306a36Sopenharmony_ci nvsw_sn2201->cpld_devs->adapter = NULL; 116662306a36Sopenharmony_cii2c_get_adapter_fail: 116762306a36Sopenharmony_ci /* Destroy SN2201 static I2C devices. */ 116862306a36Sopenharmony_ci nvsw_sn2201_destroy_static_devices(nvsw_sn2201, nvsw_sn2201->sn2201_devs, 116962306a36Sopenharmony_ci nvsw_sn2201->sn2201_devs_num); 117062306a36Sopenharmony_ci /* Destroy main mux device. */ 117162306a36Sopenharmony_ci nvsw_sn2201_destroy_static_devices(nvsw_sn2201, nvsw_sn2201->main_mux_devs, 117262306a36Sopenharmony_ci nvsw_sn2201->main_mux_devs_num); 117362306a36Sopenharmony_cinvsw_sn2201_create_static_devices_fail: 117462306a36Sopenharmony_ci i2c_put_adapter(nvsw_sn2201->main_mux_devs->adapter); 117562306a36Sopenharmony_cii2c_get_adapter_main_fail: 117662306a36Sopenharmony_ci return err; 117762306a36Sopenharmony_ci} 117862306a36Sopenharmony_ci 117962306a36Sopenharmony_cistatic int nvsw_sn2201_config_pre_init(struct nvsw_sn2201 *nvsw_sn2201) 118062306a36Sopenharmony_ci{ 118162306a36Sopenharmony_ci nvsw_sn2201->i2c_data = &nvsw_sn2201_i2c_data; 118262306a36Sopenharmony_ci 118362306a36Sopenharmony_ci /* Register I2C controller. */ 118462306a36Sopenharmony_ci nvsw_sn2201->i2c_data->handle = nvsw_sn2201; 118562306a36Sopenharmony_ci nvsw_sn2201->i2c_data->completion_notify = nvsw_sn2201_i2c_completion_notify; 118662306a36Sopenharmony_ci nvsw_sn2201->pdev_i2c = platform_device_register_resndata(nvsw_sn2201->dev, "i2c_mlxcpld", 118762306a36Sopenharmony_ci NVSW_SN2201_MAIN_MUX_NR, 118862306a36Sopenharmony_ci nvsw_sn2201_lpc_res, 118962306a36Sopenharmony_ci ARRAY_SIZE(nvsw_sn2201_lpc_res), 119062306a36Sopenharmony_ci nvsw_sn2201->i2c_data, 119162306a36Sopenharmony_ci sizeof(*nvsw_sn2201->i2c_data)); 119262306a36Sopenharmony_ci if (IS_ERR(nvsw_sn2201->pdev_i2c)) 119362306a36Sopenharmony_ci return PTR_ERR(nvsw_sn2201->pdev_i2c); 119462306a36Sopenharmony_ci 119562306a36Sopenharmony_ci return 0; 119662306a36Sopenharmony_ci} 119762306a36Sopenharmony_ci 119862306a36Sopenharmony_cistatic int nvsw_sn2201_probe(struct platform_device *pdev) 119962306a36Sopenharmony_ci{ 120062306a36Sopenharmony_ci struct nvsw_sn2201 *nvsw_sn2201; 120162306a36Sopenharmony_ci 120262306a36Sopenharmony_ci nvsw_sn2201 = devm_kzalloc(&pdev->dev, sizeof(*nvsw_sn2201), GFP_KERNEL); 120362306a36Sopenharmony_ci if (!nvsw_sn2201) 120462306a36Sopenharmony_ci return -ENOMEM; 120562306a36Sopenharmony_ci 120662306a36Sopenharmony_ci nvsw_sn2201->dev = &pdev->dev; 120762306a36Sopenharmony_ci platform_set_drvdata(pdev, nvsw_sn2201); 120862306a36Sopenharmony_ci platform_device_add_resources(pdev, nvsw_sn2201_lpc_io_resources, 120962306a36Sopenharmony_ci ARRAY_SIZE(nvsw_sn2201_lpc_io_resources)); 121062306a36Sopenharmony_ci 121162306a36Sopenharmony_ci nvsw_sn2201->main_mux_deferred_nr = NVSW_SN2201_MAIN_MUX_DEFER_NR; 121262306a36Sopenharmony_ci nvsw_sn2201->main_mux_devs = nvsw_sn2201_main_mux_brdinfo; 121362306a36Sopenharmony_ci nvsw_sn2201->cpld_devs = nvsw_sn2201_cpld_brdinfo; 121462306a36Sopenharmony_ci nvsw_sn2201->sn2201_devs = nvsw_sn2201_static_brdinfo; 121562306a36Sopenharmony_ci nvsw_sn2201->sn2201_devs_num = ARRAY_SIZE(nvsw_sn2201_static_brdinfo); 121662306a36Sopenharmony_ci 121762306a36Sopenharmony_ci return nvsw_sn2201_config_pre_init(nvsw_sn2201); 121862306a36Sopenharmony_ci} 121962306a36Sopenharmony_ci 122062306a36Sopenharmony_cistatic int nvsw_sn2201_remove(struct platform_device *pdev) 122162306a36Sopenharmony_ci{ 122262306a36Sopenharmony_ci struct nvsw_sn2201 *nvsw_sn2201 = platform_get_drvdata(pdev); 122362306a36Sopenharmony_ci 122462306a36Sopenharmony_ci /* Unregister underlying drivers. */ 122562306a36Sopenharmony_ci nvsw_sn2201_config_exit(nvsw_sn2201); 122662306a36Sopenharmony_ci 122762306a36Sopenharmony_ci /* Destroy SN2201 static I2C devices. */ 122862306a36Sopenharmony_ci nvsw_sn2201_destroy_static_devices(nvsw_sn2201, 122962306a36Sopenharmony_ci nvsw_sn2201->sn2201_devs, 123062306a36Sopenharmony_ci nvsw_sn2201->sn2201_devs_num); 123162306a36Sopenharmony_ci 123262306a36Sopenharmony_ci i2c_put_adapter(nvsw_sn2201->cpld_devs->adapter); 123362306a36Sopenharmony_ci nvsw_sn2201->cpld_devs->adapter = NULL; 123462306a36Sopenharmony_ci /* Destroy main mux device. */ 123562306a36Sopenharmony_ci nvsw_sn2201_destroy_static_devices(nvsw_sn2201, 123662306a36Sopenharmony_ci nvsw_sn2201->main_mux_devs, 123762306a36Sopenharmony_ci nvsw_sn2201->main_mux_devs_num); 123862306a36Sopenharmony_ci 123962306a36Sopenharmony_ci /* Unregister I2C controller. */ 124062306a36Sopenharmony_ci if (nvsw_sn2201->pdev_i2c) 124162306a36Sopenharmony_ci platform_device_unregister(nvsw_sn2201->pdev_i2c); 124262306a36Sopenharmony_ci 124362306a36Sopenharmony_ci return 0; 124462306a36Sopenharmony_ci} 124562306a36Sopenharmony_ci 124662306a36Sopenharmony_cistatic const struct acpi_device_id nvsw_sn2201_acpi_ids[] = { 124762306a36Sopenharmony_ci {"NVSN2201", 0}, 124862306a36Sopenharmony_ci {} 124962306a36Sopenharmony_ci}; 125062306a36Sopenharmony_ci 125162306a36Sopenharmony_ciMODULE_DEVICE_TABLE(acpi, nvsw_sn2201_acpi_ids); 125262306a36Sopenharmony_ci 125362306a36Sopenharmony_cistatic struct platform_driver nvsw_sn2201_driver = { 125462306a36Sopenharmony_ci .probe = nvsw_sn2201_probe, 125562306a36Sopenharmony_ci .remove = nvsw_sn2201_remove, 125662306a36Sopenharmony_ci .driver = { 125762306a36Sopenharmony_ci .name = "nvsw-sn2201", 125862306a36Sopenharmony_ci .acpi_match_table = nvsw_sn2201_acpi_ids, 125962306a36Sopenharmony_ci }, 126062306a36Sopenharmony_ci}; 126162306a36Sopenharmony_ci 126262306a36Sopenharmony_cimodule_platform_driver(nvsw_sn2201_driver); 126362306a36Sopenharmony_ci 126462306a36Sopenharmony_ciMODULE_AUTHOR("Nvidia"); 126562306a36Sopenharmony_ciMODULE_DESCRIPTION("Nvidia sn2201 platform driver"); 126662306a36Sopenharmony_ciMODULE_LICENSE("Dual BSD/GPL"); 126762306a36Sopenharmony_ciMODULE_ALIAS("platform:nvsw-sn2201"); 1268