diff options
| -rw-r--r-- | drivers/soc/aspeed/aspeed-lpc-snoop.c | 50 |
1 files changed, 28 insertions, 22 deletions
diff --git a/drivers/soc/aspeed/aspeed-lpc-snoop.c b/drivers/soc/aspeed/aspeed-lpc-snoop.c index e9d17239163a..9e5820374328 100644 --- a/drivers/soc/aspeed/aspeed-lpc-snoop.c +++ b/drivers/soc/aspeed/aspeed-lpc-snoop.c @@ -194,28 +194,30 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_snoop *lpc_snoop, { const struct aspeed_lpc_snoop_model_data *model_data; u32 hicr5_en, snpwadr_mask, snpwadr_shift, hicrb_en; + struct aspeed_lpc_snoop_channel *channel; int rc = 0; - if (WARN_ON(lpc_snoop->chan[index].enabled)) + channel = &lpc_snoop->chan[index]; + + if (WARN_ON(channel->enabled)) return -EBUSY; - init_waitqueue_head(&lpc_snoop->chan[index].wq); - /* Create FIFO datastructure */ - rc = kfifo_alloc(&lpc_snoop->chan[index].fifo, - SNOOP_FIFO_SIZE, GFP_KERNEL); + init_waitqueue_head(&channel->wq); + + channel->miscdev.minor = MISC_DYNAMIC_MINOR; + channel->miscdev.fops = &snoop_fops; + channel->miscdev.parent = dev; + + channel->miscdev.name = + devm_kasprintf(dev, GFP_KERNEL, "%s%d", DEVICE_NAME, index); + if (!channel->miscdev.name) + return -ENOMEM; + + rc = kfifo_alloc(&channel->fifo, SNOOP_FIFO_SIZE, GFP_KERNEL); if (rc) return rc; - lpc_snoop->chan[index].miscdev.minor = MISC_DYNAMIC_MINOR; - lpc_snoop->chan[index].miscdev.name = - devm_kasprintf(dev, GFP_KERNEL, "%s%d", DEVICE_NAME, index); - if (!lpc_snoop->chan[index].miscdev.name) { - rc = -ENOMEM; - goto err_free_fifo; - } - lpc_snoop->chan[index].miscdev.fops = &snoop_fops; - lpc_snoop->chan[index].miscdev.parent = dev; - rc = misc_register(&lpc_snoop->chan[index].miscdev); + rc = misc_register(&channel->miscdev); if (rc) goto err_free_fifo; @@ -246,14 +248,14 @@ static int aspeed_lpc_enable_snoop(struct aspeed_lpc_snoop *lpc_snoop, if (model_data && model_data->has_hicrb_ensnp) regmap_update_bits(lpc_snoop->regmap, HICRB, hicrb_en, hicrb_en); - lpc_snoop->chan[index].enabled = true; + channel->enabled = true; return 0; err_misc_deregister: - misc_deregister(&lpc_snoop->chan[index].miscdev); + misc_deregister(&channel->miscdev); err_free_fifo: - kfifo_free(&lpc_snoop->chan[index].fifo); + kfifo_free(&channel->fifo); return rc; } @@ -261,7 +263,11 @@ __attribute__((nonnull)) static void aspeed_lpc_disable_snoop(struct aspeed_lpc_snoop *lpc_snoop, enum aspeed_lpc_snoop_index index) { - if (!lpc_snoop->chan[index].enabled) + struct aspeed_lpc_snoop_channel *channel; + + channel = &lpc_snoop->chan[index]; + + if (!channel->enabled) return; /* Disable interrupts along with the device */ @@ -280,10 +286,10 @@ static void aspeed_lpc_disable_snoop(struct aspeed_lpc_snoop *lpc_snoop, return; } - lpc_snoop->chan[index].enabled = false; + channel->enabled = false; /* Consider improving safety wrt concurrent reader(s) */ - misc_deregister(&lpc_snoop->chan[index].miscdev); - kfifo_free(&lpc_snoop->chan[index].fifo); + misc_deregister(&channel->miscdev); + kfifo_free(&channel->fifo); } static int aspeed_lpc_snoop_probe(struct platform_device *pdev) |
