3535#define MLXPLAT_CPLD_LPC_REG_CPLD3_PN1_OFFSET 0x09
3636#define MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET 0x0a
3737#define MLXPLAT_CPLD_LPC_REG_CPLD4_PN1_OFFSET 0x0b
38+ #define MLXPLAT_CPLD_LPC_REG_RESET_GP1_OFFSET 0x17
3839#define MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET 0x19
3940#define MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET 0x1c
4041#define MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET 0x1d
254255 MLXPLAT_CPLD_PWM_PG_MASK)
255256#define MLXPLAT_CPLD_I2C_CAP_BIT 0x04
256257#define MLXPLAT_CPLD_I2C_CAP_MASK GENMASK(5, MLXPLAT_CPLD_I2C_CAP_BIT)
258+ #define MLXPLAT_CPLD_SYS_RESET_MASK BIT(0)
257259
258260/* Masks for aggregation for comex carriers */
259261#define MLXPLAT_CPLD_AGGR_MASK_CARRIER BIT(1)
265267#define MLXPLAT_CPLD_LPC_LC_MASK GENMASK(7, 0)
266268
267269#define MLXPLAT_CPLD_HALT_MASK BIT(3)
270+ #define MLXPLAT_CPLD_RESET_MASK GENMASK(7, 1)
268271
269272/* Default I2C parent bus number */
270273#define MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR 1
@@ -441,6 +444,7 @@ static struct i2c_mux_reg_platform_data mlxplat_default_mux_data[] = {
441444static int mlxplat_max_adap_num ;
442445static int mlxplat_mux_num ;
443446static struct i2c_mux_reg_platform_data * mlxplat_mux_data ;
447+ static struct notifier_block * mlxplat_reboot_nb ;
444448
445449/* Platform extended mux data */
446450static struct i2c_mux_reg_platform_data mlxplat_extended_mux_data [] = {
@@ -2361,8 +2365,11 @@ static int
23612365mlxplat_mlxcpld_l1_switch_pwr_events_handler (void * handle , enum mlxreg_hotplug_kind kind ,
23622366 u8 action )
23632367{
2364- dev_info (& mlxplat_dev -> dev , "System shutdown due to short press of power button" );
2365- kernel_power_off ();
2368+ if (action ) {
2369+ dev_info (& mlxplat_dev -> dev , "System shutdown due to short press of power button" );
2370+ kernel_power_off ();
2371+ }
2372+
23662373 return 0 ;
23672374}
23682375
@@ -4957,6 +4964,7 @@ static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type3[] = {
49574964static bool mlxplat_mlxcpld_writeable_reg (struct device * dev , unsigned int reg )
49584965{
49594966 switch (reg ) {
4967+ case MLXPLAT_CPLD_LPC_REG_RESET_GP1_OFFSET :
49604968 case MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET :
49614969 case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET :
49624970 case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET :
@@ -5065,6 +5073,7 @@ static bool mlxplat_mlxcpld_readable_reg(struct device *dev, unsigned int reg)
50655073 case MLXPLAT_CPLD_LPC_REG_CPLD4_PN1_OFFSET :
50665074 case MLXPLAT_CPLD_LPC_REG_CPLD5_PN_OFFSET :
50675075 case MLXPLAT_CPLD_LPC_REG_CPLD5_PN1_OFFSET :
5076+ case MLXPLAT_CPLD_LPC_REG_RESET_GP1_OFFSET :
50685077 case MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET :
50695078 case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET :
50705079 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET :
@@ -5229,6 +5238,7 @@ static bool mlxplat_mlxcpld_volatile_reg(struct device *dev, unsigned int reg)
52295238 case MLXPLAT_CPLD_LPC_REG_CPLD4_PN1_OFFSET :
52305239 case MLXPLAT_CPLD_LPC_REG_CPLD5_PN_OFFSET :
52315240 case MLXPLAT_CPLD_LPC_REG_CPLD5_PN1_OFFSET :
5241+ case MLXPLAT_CPLD_LPC_REG_RESET_GP1_OFFSET :
52325242 case MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET :
52335243 case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET :
52345244 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET :
@@ -5533,11 +5543,33 @@ static struct mlxreg_core_platform_data
55335543 * mlxplat_wd_data [MLXPLAT_CPLD_WD_MAX_DEVS ];
55345544static const struct regmap_config * mlxplat_regmap_config ;
55355545
5546+ /* Platform default reset function */
5547+ static int mlxplat_reboot_notifier (struct notifier_block * nb , unsigned long action , void * unused )
5548+ {
5549+ struct mlxplat_priv * priv = platform_get_drvdata (mlxplat_dev );
5550+ u32 regval ;
5551+ int ret ;
5552+
5553+ ret = regmap_read (priv -> regmap , MLXPLAT_CPLD_LPC_REG_RESET_GP1_OFFSET , & regval );
5554+
5555+ if (action == SYS_RESTART && !ret && regval & MLXPLAT_CPLD_SYS_RESET_MASK )
5556+ regmap_write (priv -> regmap , MLXPLAT_CPLD_LPC_REG_RESET_GP1_OFFSET ,
5557+ MLXPLAT_CPLD_RESET_MASK );
5558+
5559+ return NOTIFY_DONE ;
5560+ }
5561+
5562+ static struct notifier_block mlxplat_reboot_default_nb = {
5563+ .notifier_call = mlxplat_reboot_notifier ,
5564+ };
5565+
55365566/* Platform default poweroff function */
55375567static void mlxplat_poweroff (void )
55385568{
55395569 struct mlxplat_priv * priv = platform_get_drvdata (mlxplat_dev );
55405570
5571+ if (mlxplat_reboot_nb )
5572+ unregister_reboot_notifier (mlxplat_reboot_nb );
55415573 regmap_write (priv -> regmap , MLXPLAT_CPLD_LPC_REG_GP1_OFFSET , MLXPLAT_CPLD_HALT_MASK );
55425574 kernel_halt ();
55435575}
@@ -5861,6 +5893,7 @@ static int __init mlxplat_dmi_l1_switch_matched(const struct dmi_system_id *dmi)
58615893 mlxplat_i2c = & mlxplat_mlxcpld_i2c_ng_data ;
58625894 mlxplat_regmap_config = & mlxplat_mlxcpld_regmap_config_rack_switch ;
58635895 pm_power_off = mlxplat_poweroff ;
5896+ mlxplat_reboot_nb = & mlxplat_reboot_default_nb ;
58645897
58655898 return 1 ;
58665899}
@@ -6410,8 +6443,15 @@ static int __init mlxplat_init(void)
64106443 if (err )
64116444 goto fail_regcache_sync ;
64126445
6446+ if (mlxplat_reboot_nb ) {
6447+ err = register_reboot_notifier (mlxplat_reboot_nb );
6448+ if (err )
6449+ goto fail_register_reboot_notifier ;
6450+ }
6451+
64136452 return 0 ;
64146453
6454+ fail_register_reboot_notifier :
64156455fail_regcache_sync :
64166456 mlxplat_pre_exit (priv );
64176457fail_mlxplat_i2c_main_init :
@@ -6429,6 +6469,8 @@ static void __exit mlxplat_exit(void)
64296469
64306470 if (pm_power_off )
64316471 pm_power_off = NULL ;
6472+ if (mlxplat_reboot_nb )
6473+ unregister_reboot_notifier (mlxplat_reboot_nb );
64326474 mlxplat_pre_exit (priv );
64336475 mlxplat_i2c_main_exit (priv );
64346476 mlxplat_post_exit ();
0 commit comments