ipmi: kcs_bmc: Turn the driver data-structures inside-out
[linux-block.git] / drivers / char / ipmi / kcs_bmc_npcm7xx.c
index 1f44aadec9e843fe97a50ce0a9d97ba602ad37ff..e062502851133bfdea6ad07405ce5d37d7792873 100644 (file)
@@ -65,6 +65,8 @@ struct npcm7xx_kcs_reg {
 };
 
 struct npcm7xx_kcs_bmc {
+       struct kcs_bmc kcs_bmc;
+
        struct regmap *map;
 
        const struct npcm7xx_kcs_reg *reg;
@@ -76,9 +78,14 @@ static const struct npcm7xx_kcs_reg npcm7xx_kcs_reg_tbl[KCS_CHANNEL_MAX] = {
        { .sts = KCS3ST, .dob = KCS3DO, .dib = KCS3DI, .ctl = KCS3CTL, .ie = KCS3IE },
 };
 
+static inline struct npcm7xx_kcs_bmc *to_npcm7xx_kcs_bmc(struct kcs_bmc *kcs_bmc)
+{
+       return container_of(kcs_bmc, struct npcm7xx_kcs_bmc, kcs_bmc);
+}
+
 static u8 npcm7xx_kcs_inb(struct kcs_bmc *kcs_bmc, u32 reg)
 {
-       struct npcm7xx_kcs_bmc *priv = kcs_bmc_priv(kcs_bmc);
+       struct npcm7xx_kcs_bmc *priv = to_npcm7xx_kcs_bmc(kcs_bmc);
        u32 val = 0;
        int rc;
 
@@ -90,7 +97,7 @@ static u8 npcm7xx_kcs_inb(struct kcs_bmc *kcs_bmc, u32 reg)
 
 static void npcm7xx_kcs_outb(struct kcs_bmc *kcs_bmc, u32 reg, u8 data)
 {
-       struct npcm7xx_kcs_bmc *priv = kcs_bmc_priv(kcs_bmc);
+       struct npcm7xx_kcs_bmc *priv = to_npcm7xx_kcs_bmc(kcs_bmc);
        int rc;
 
        rc = regmap_write(priv->map, reg, data);
@@ -99,7 +106,7 @@ static void npcm7xx_kcs_outb(struct kcs_bmc *kcs_bmc, u32 reg, u8 data)
 
 static void npcm7xx_kcs_updateb(struct kcs_bmc *kcs_bmc, u32 reg, u8 mask, u8 data)
 {
-       struct npcm7xx_kcs_bmc *priv = kcs_bmc_priv(kcs_bmc);
+       struct npcm7xx_kcs_bmc *priv = to_npcm7xx_kcs_bmc(kcs_bmc);
        int rc;
 
        rc = regmap_update_bits(priv->map, reg, mask, data);
@@ -108,7 +115,7 @@ static void npcm7xx_kcs_updateb(struct kcs_bmc *kcs_bmc, u32 reg, u8 mask, u8 da
 
 static void npcm7xx_kcs_enable_channel(struct kcs_bmc *kcs_bmc, bool enable)
 {
-       struct npcm7xx_kcs_bmc *priv = kcs_bmc_priv(kcs_bmc);
+       struct npcm7xx_kcs_bmc *priv = to_npcm7xx_kcs_bmc(kcs_bmc);
 
        regmap_update_bits(priv->map, priv->reg->ctl, KCS_CTL_IBFIE,
                           enable ? KCS_CTL_IBFIE : 0);
@@ -155,11 +162,10 @@ static int npcm7xx_kcs_probe(struct platform_device *pdev)
                return -ENODEV;
        }
 
-       kcs_bmc = kcs_bmc_alloc(dev, sizeof(*priv), chan);
-       if (!kcs_bmc)
+       priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
+       if (!priv)
                return -ENOMEM;
 
-       priv = kcs_bmc_priv(kcs_bmc);
        priv->map = syscon_node_to_regmap(dev->parent->of_node);
        if (IS_ERR(priv->map)) {
                dev_err(dev, "Couldn't get regmap\n");
@@ -167,6 +173,9 @@ static int npcm7xx_kcs_probe(struct platform_device *pdev)
        }
        priv->reg = &npcm7xx_kcs_reg_tbl[chan - 1];
 
+       kcs_bmc = &priv->kcs_bmc;
+       kcs_bmc->dev = &pdev->dev;
+       kcs_bmc->channel = chan;
        kcs_bmc->ioreg.idr = priv->reg->dib;
        kcs_bmc->ioreg.odr = priv->reg->dob;
        kcs_bmc->ioreg.str = priv->reg->sts;
@@ -174,16 +183,16 @@ static int npcm7xx_kcs_probe(struct platform_device *pdev)
        kcs_bmc->io_outputb = npcm7xx_kcs_outb;
        kcs_bmc->io_updateb = npcm7xx_kcs_updateb;
 
-       dev_set_drvdata(dev, kcs_bmc);
+       platform_set_drvdata(pdev, priv);
 
        npcm7xx_kcs_enable_channel(kcs_bmc, true);
        rc = npcm7xx_kcs_config_irq(kcs_bmc, pdev);
        if (rc)
                return rc;
 
-       rc = misc_register(&kcs_bmc->miscdev);
+       rc = kcs_bmc_add_device(kcs_bmc);
        if (rc) {
-               dev_err(dev, "Unable to register device\n");
+               dev_warn(&pdev->dev, "Failed to register channel %d: %d\n", kcs_bmc->channel, rc);
                return rc;
        }
 
@@ -196,9 +205,10 @@ static int npcm7xx_kcs_probe(struct platform_device *pdev)
 
 static int npcm7xx_kcs_remove(struct platform_device *pdev)
 {
-       struct kcs_bmc *kcs_bmc = dev_get_drvdata(&pdev->dev);
+       struct npcm7xx_kcs_bmc *priv = platform_get_drvdata(pdev);
+       struct kcs_bmc *kcs_bmc = &priv->kcs_bmc;
 
-       misc_deregister(&kcs_bmc->miscdev);
+       kcs_bmc_remove_device(kcs_bmc);
 
        return 0;
 }