@@ -58,6 +58,7 @@ struct aspeed_lpc_snoop_model_data {
5858};
5959
6060struct aspeed_lpc_snoop_channel {
61+ bool enabled ;
6162 struct kfifo fifo ;
6263 wait_queue_head_t wq ;
6364 struct miscdevice miscdev ;
@@ -190,6 +191,9 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_snoop *lpc_snoop,
190191 const struct aspeed_lpc_snoop_model_data * model_data =
191192 of_device_get_match_data (dev );
192193
194+ if (WARN_ON (lpc_snoop -> chan [channel ].enabled ))
195+ return - EBUSY ;
196+
193197 init_waitqueue_head (& lpc_snoop -> chan [channel ].wq );
194198 /* Create FIFO datastructure */
195199 rc = kfifo_alloc (& lpc_snoop -> chan [channel ].fifo ,
@@ -236,6 +240,8 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_snoop *lpc_snoop,
236240 regmap_update_bits (lpc_snoop -> regmap , HICRB ,
237241 hicrb_en , hicrb_en );
238242
243+ lpc_snoop -> chan [channel ].enabled = true;
244+
239245 return 0 ;
240246
241247err_misc_deregister :
@@ -248,6 +254,9 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_snoop *lpc_snoop,
248254static void aspeed_lpc_disable_snoop (struct aspeed_lpc_snoop * lpc_snoop ,
249255 int channel )
250256{
257+ if (!lpc_snoop -> chan [channel ].enabled )
258+ return ;
259+
251260 switch (channel ) {
252261 case 0 :
253262 regmap_update_bits (lpc_snoop -> regmap , HICR5 ,
@@ -263,6 +272,8 @@ static void aspeed_lpc_disable_snoop(struct aspeed_lpc_snoop *lpc_snoop,
263272 return ;
264273 }
265274
275+ lpc_snoop -> chan [channel ].enabled = false;
276+ /* Consider improving safety wrt concurrent reader(s) */
266277 misc_deregister (& lpc_snoop -> chan [channel ].miscdev );
267278 kfifo_free (& lpc_snoop -> chan [channel ].fifo );
268279}
0 commit comments