From: Zev Weiss <zweiss@equinix.com>
To: linux-aspeed@lists.ozlabs.org
Subject: [PATCH v3 01/16] ipmi: kcs_bmc_aspeed: Use of match data to extract KCS properties
Date: Fri, 21 May 2021 07:17:36 +0000 [thread overview]
Message-ID: <YKdej27PuU1cgaCh@packtop> (raw)
In-Reply-To: <20210510054213.1610760-2-andrew@aj.id.au>
On Mon, May 10, 2021 at 12:41:58AM CDT, Andrew Jeffery wrote:
>Unpack and remove the aspeed_kcs_probe_of_v[12]() functions to aid
>rearranging how the private device-driver memory is allocated.
>
>Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
>---
> drivers/char/ipmi/kcs_bmc_aspeed.c | 154 ++++++++++++++---------------
> 1 file changed, 76 insertions(+), 78 deletions(-)
>
>diff --git a/drivers/char/ipmi/kcs_bmc_aspeed.c b/drivers/char/ipmi/kcs_bmc_aspeed.c
>index eefe362f65f0..c94d36e195be 100644
>--- a/drivers/char/ipmi/kcs_bmc_aspeed.c
>+++ b/drivers/char/ipmi/kcs_bmc_aspeed.c
>@@ -13,6 +13,7 @@
> #include <linux/module.h>
> #include <linux/of.h>
> #include <linux/of_address.h>
>+#include <linux/of_device.h>
> #include <linux/platform_device.h>
> #include <linux/poll.h>
> #include <linux/regmap.h>
>@@ -63,6 +64,10 @@ struct aspeed_kcs_bmc {
> struct regmap *map;
> };
>
>+struct aspeed_kcs_of_ops {
>+ int (*get_channel)(struct platform_device *pdev);
>+ int (*get_io_address)(struct platform_device *pdev);
>+};
>
> static u8 aspeed_kcs_inb(struct kcs_bmc *kcs_bmc, u32 reg)
> {
>@@ -231,13 +236,10 @@ static const struct kcs_ioreg ast_kcs_bmc_ioregs[KCS_CHANNEL_MAX] = {
> { .idr = LPC_IDR4, .odr = LPC_ODR4, .str = LPC_STR4 },
> };
>
>-static struct kcs_bmc *aspeed_kcs_probe_of_v1(struct platform_device *pdev)
>+static int aspeed_kcs_of_v1_get_channel(struct platform_device *pdev)
> {
>- struct aspeed_kcs_bmc *priv;
> struct device_node *np;
>- struct kcs_bmc *kcs;
> u32 channel;
>- u32 slave;
> int rc;
>
> np = pdev->dev.of_node;
>@@ -245,105 +247,79 @@ static struct kcs_bmc *aspeed_kcs_probe_of_v1(struct platform_device *pdev)
> rc = of_property_read_u32(np, "kcs_chan", &channel);
> if ((rc != 0) || (channel == 0 || channel > KCS_CHANNEL_MAX)) {
> dev_err(&pdev->dev, "no valid 'kcs_chan' configured\n");
>- return ERR_PTR(-EINVAL);
>+ return -EINVAL;
> }
>
>- kcs = kcs_bmc_alloc(&pdev->dev, sizeof(struct aspeed_kcs_bmc), channel);
>- if (!kcs)
>- return ERR_PTR(-ENOMEM);
>+ return channel;
>+}
>
>- priv = kcs_bmc_priv(kcs);
>- priv->map = syscon_node_to_regmap(pdev->dev.parent->of_node);
>- if (IS_ERR(priv->map)) {
>- dev_err(&pdev->dev, "Couldn't get regmap\n");
>- return ERR_PTR(-ENODEV);
>- }
>+static int aspeed_kcs_of_v1_get_io_address(struct platform_device *pdev)
>+{
>+ u32 slave;
>+ int rc;
>
>- rc = of_property_read_u32(np, "kcs_addr", &slave);
>- if (rc) {
>+ rc = of_property_read_u32(pdev->dev.of_node, "kcs_addr", &slave);
>+ if (rc || slave > 0xffff) {
> dev_err(&pdev->dev, "no valid 'kcs_addr' configured\n");
>- return ERR_PTR(-EINVAL);
>+ return -EINVAL;
> }
>
>- kcs->ioreg = ast_kcs_bmc_ioregs[channel - 1];
>- aspeed_kcs_set_address(kcs, slave);
>-
>- return kcs;
>-}
>-
>-static int aspeed_kcs_calculate_channel(const struct kcs_ioreg *regs)
>-{
>- int i;
>-
>- for (i = 0; i < ARRAY_SIZE(ast_kcs_bmc_ioregs); i++) {
>- if (!memcmp(&ast_kcs_bmc_ioregs[i], regs, sizeof(*regs)))
>- return i + 1;
>- }
>-
>- return -EINVAL;
>+ return slave;
> }
>
>-static struct kcs_bmc *aspeed_kcs_probe_of_v2(struct platform_device *pdev)
>+static int aspeed_kcs_of_v2_get_channel(struct platform_device *pdev)
> {
>- struct aspeed_kcs_bmc *priv;
> struct device_node *np;
> struct kcs_ioreg ioreg;
>- struct kcs_bmc *kcs;
> const __be32 *reg;
>- int channel;
>- u32 slave;
>- int rc;
>+ int i;
>
> np = pdev->dev.of_node;
>
> /* Don't translate addresses, we want offsets for the regmaps */
> reg = of_get_address(np, 0, NULL, NULL);
> if (!reg)
>- return ERR_PTR(-EINVAL);
>+ return -EINVAL;
> ioreg.idr = be32_to_cpup(reg);
>
> reg = of_get_address(np, 1, NULL, NULL);
> if (!reg)
>- return ERR_PTR(-EINVAL);
>+ return -EINVAL;
> ioreg.odr = be32_to_cpup(reg);
>
> reg = of_get_address(np, 2, NULL, NULL);
> if (!reg)
>- return ERR_PTR(-EINVAL);
>+ return -EINVAL;
> ioreg.str = be32_to_cpup(reg);
>
>- channel = aspeed_kcs_calculate_channel(&ioreg);
>- if (channel < 0)
>- return ERR_PTR(channel);
>-
>- kcs = kcs_bmc_alloc(&pdev->dev, sizeof(struct aspeed_kcs_bmc), channel);
>- if (!kcs)
>- return ERR_PTR(-ENOMEM);
>-
>- kcs->ioreg = ioreg;
>-
>- priv = kcs_bmc_priv(kcs);
>- priv->map = syscon_node_to_regmap(pdev->dev.parent->of_node);
>- if (IS_ERR(priv->map)) {
>- dev_err(&pdev->dev, "Couldn't get regmap\n");
>- return ERR_PTR(-ENODEV);
>+ for (i = 0; i < ARRAY_SIZE(ast_kcs_bmc_ioregs); i++) {
>+ if (!memcmp(&ast_kcs_bmc_ioregs[i], &ioreg, sizeof(ioreg)))
>+ return i + 1;
> }
>
>- rc = of_property_read_u32(np, "aspeed,lpc-io-reg", &slave);
>- if (rc)
>- return ERR_PTR(rc);
>+ return -EINVAL;
>+}
>
>- aspeed_kcs_set_address(kcs, slave);
>+static int aspeed_kcs_of_v2_get_io_address(struct platform_device *pdev)
>+{
>+ uint32_t slave;
>+ int rc;
>
>- return kcs;
>+ rc = of_property_read_u32(pdev->dev.of_node, "aspeed,lpc-io-reg", &slave);
>+ if (rc || slave > 0xffff)
>+ return -EINVAL;
The v1 get_io_address() function prints an error in this case; it might
be nice to do so here as well? (Ideally maintained/extended as
appropriate when this function gets adjusted in patch 16.)
>+
>+ return slave;
> }
>
> static int aspeed_kcs_probe(struct platform_device *pdev)
> {
>+ const struct aspeed_kcs_of_ops *ops;
> struct device *dev = &pdev->dev;
>+ struct aspeed_kcs_bmc *priv;
> struct kcs_bmc *kcs_bmc;
> struct device_node *np;
>- int rc;
>+ int rc, channel, addr;
>
> np = dev->of_node->parent;
> if (!of_device_is_compatible(np, "aspeed,ast2400-lpc-v2") &&
>@@ -352,23 +328,35 @@ static int aspeed_kcs_probe(struct platform_device *pdev)
> dev_err(dev, "unsupported LPC device binding\n");
> return -ENODEV;
> }
>-
>- np = dev->of_node;
>- if (of_device_is_compatible(np, "aspeed,ast2400-kcs-bmc") ||
>- of_device_is_compatible(np, "aspeed,ast2500-kcs-bmc"))
>- kcs_bmc = aspeed_kcs_probe_of_v1(pdev);
>- else if (of_device_is_compatible(np, "aspeed,ast2400-kcs-bmc-v2") ||
>- of_device_is_compatible(np, "aspeed,ast2500-kcs-bmc-v2"))
>- kcs_bmc = aspeed_kcs_probe_of_v2(pdev);
>- else
>+ ops = of_device_get_match_data(&pdev->dev);
>+ if (!ops)
> return -EINVAL;
>
>- if (IS_ERR(kcs_bmc))
>- return PTR_ERR(kcs_bmc);
>+ channel = ops->get_channel(pdev);
>+ if (channel < 0)
>+ return channel;
>
>+ kcs_bmc = kcs_bmc_alloc(&pdev->dev, sizeof(struct aspeed_kcs_bmc), channel);
>+ if (!kcs_bmc)
>+ return -ENOMEM;
>+
>+ kcs_bmc->ioreg = ast_kcs_bmc_ioregs[channel - 1];
> kcs_bmc->io_inputb = aspeed_kcs_inb;
> kcs_bmc->io_outputb = aspeed_kcs_outb;
>
>+ addr = ops->get_io_address(pdev);
>+ if (addr < 0)
>+ return addr;
>+
>+ priv = kcs_bmc_priv(kcs_bmc);
>+ priv->map = syscon_node_to_regmap(pdev->dev.parent->of_node);
>+ if (IS_ERR(priv->map)) {
>+ dev_err(&pdev->dev, "Couldn't get regmap\n");
>+ return -ENODEV;
>+ }
>+
>+ aspeed_kcs_set_address(kcs_bmc, addr);
>+
> rc = aspeed_kcs_config_irq(kcs_bmc, pdev);
> if (rc)
> return rc;
>@@ -400,11 +388,21 @@ static int aspeed_kcs_remove(struct platform_device *pdev)
> return 0;
> }
>
>+static const struct aspeed_kcs_of_ops of_v1_ops = {
>+ .get_channel = aspeed_kcs_of_v1_get_channel,
>+ .get_io_address = aspeed_kcs_of_v1_get_io_address,
>+};
>+
>+static const struct aspeed_kcs_of_ops of_v2_ops = {
>+ .get_channel = aspeed_kcs_of_v2_get_channel,
>+ .get_io_address = aspeed_kcs_of_v2_get_io_address,
>+};
>+
> static const struct of_device_id ast_kcs_bmc_match[] = {
>- { .compatible = "aspeed,ast2400-kcs-bmc" },
>- { .compatible = "aspeed,ast2500-kcs-bmc" },
>- { .compatible = "aspeed,ast2400-kcs-bmc-v2" },
>- { .compatible = "aspeed,ast2500-kcs-bmc-v2" },
>+ { .compatible = "aspeed,ast2400-kcs-bmc", .data = &of_v1_ops },
>+ { .compatible = "aspeed,ast2500-kcs-bmc", .data = &of_v1_ops },
>+ { .compatible = "aspeed,ast2400-kcs-bmc-v2", .data = &of_v2_ops },
>+ { .compatible = "aspeed,ast2500-kcs-bmc-v2", .data = &of_v2_ops },
> { }
> };
> MODULE_DEVICE_TABLE(of, ast_kcs_bmc_match);
>--
>2.27.0
>
WARNING: multiple messages have this Message-ID (diff)
From: Zev Weiss <zweiss@equinix.com>
To: Andrew Jeffery <andrew@aj.id.au>
Cc: "devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
"minyard@acm.org" <minyard@acm.org>,
"linux-aspeed@lists.ozlabs.org" <linux-aspeed@lists.ozlabs.org>,
"avifishman70@gmail.com" <avifishman70@gmail.com>,
"venture@google.com" <venture@google.com>,
"openbmc@lists.ozlabs.org" <openbmc@lists.ozlabs.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"tali.perry1@gmail.com" <tali.perry1@gmail.com>,
"robh+dt@kernel.org" <robh+dt@kernel.org>,
"arnd@arndb.de" <arnd@arndb.de>,
"benjaminfair@google.com" <benjaminfair@google.com>,
"openipmi-developer@lists.sourceforge.net"
<openipmi-developer@lists.sourceforge.net>,
"chiawei_wang@aspeedtech.com" <chiawei_wang@aspeedtech.com>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
"tmaimon77@gmail.com" <tmaimon77@gmail.com>
Subject: Re: [PATCH v3 01/16] ipmi: kcs_bmc_aspeed: Use of match data to extract KCS properties
Date: Fri, 21 May 2021 07:17:36 +0000 [thread overview]
Message-ID: <YKdej27PuU1cgaCh@packtop> (raw)
In-Reply-To: <20210510054213.1610760-2-andrew@aj.id.au>
On Mon, May 10, 2021 at 12:41:58AM CDT, Andrew Jeffery wrote:
>Unpack and remove the aspeed_kcs_probe_of_v[12]() functions to aid
>rearranging how the private device-driver memory is allocated.
>
>Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
>---
> drivers/char/ipmi/kcs_bmc_aspeed.c | 154 ++++++++++++++---------------
> 1 file changed, 76 insertions(+), 78 deletions(-)
>
>diff --git a/drivers/char/ipmi/kcs_bmc_aspeed.c b/drivers/char/ipmi/kcs_bmc_aspeed.c
>index eefe362f65f0..c94d36e195be 100644
>--- a/drivers/char/ipmi/kcs_bmc_aspeed.c
>+++ b/drivers/char/ipmi/kcs_bmc_aspeed.c
>@@ -13,6 +13,7 @@
> #include <linux/module.h>
> #include <linux/of.h>
> #include <linux/of_address.h>
>+#include <linux/of_device.h>
> #include <linux/platform_device.h>
> #include <linux/poll.h>
> #include <linux/regmap.h>
>@@ -63,6 +64,10 @@ struct aspeed_kcs_bmc {
> struct regmap *map;
> };
>
>+struct aspeed_kcs_of_ops {
>+ int (*get_channel)(struct platform_device *pdev);
>+ int (*get_io_address)(struct platform_device *pdev);
>+};
>
> static u8 aspeed_kcs_inb(struct kcs_bmc *kcs_bmc, u32 reg)
> {
>@@ -231,13 +236,10 @@ static const struct kcs_ioreg ast_kcs_bmc_ioregs[KCS_CHANNEL_MAX] = {
> { .idr = LPC_IDR4, .odr = LPC_ODR4, .str = LPC_STR4 },
> };
>
>-static struct kcs_bmc *aspeed_kcs_probe_of_v1(struct platform_device *pdev)
>+static int aspeed_kcs_of_v1_get_channel(struct platform_device *pdev)
> {
>- struct aspeed_kcs_bmc *priv;
> struct device_node *np;
>- struct kcs_bmc *kcs;
> u32 channel;
>- u32 slave;
> int rc;
>
> np = pdev->dev.of_node;
>@@ -245,105 +247,79 @@ static struct kcs_bmc *aspeed_kcs_probe_of_v1(struct platform_device *pdev)
> rc = of_property_read_u32(np, "kcs_chan", &channel);
> if ((rc != 0) || (channel == 0 || channel > KCS_CHANNEL_MAX)) {
> dev_err(&pdev->dev, "no valid 'kcs_chan' configured\n");
>- return ERR_PTR(-EINVAL);
>+ return -EINVAL;
> }
>
>- kcs = kcs_bmc_alloc(&pdev->dev, sizeof(struct aspeed_kcs_bmc), channel);
>- if (!kcs)
>- return ERR_PTR(-ENOMEM);
>+ return channel;
>+}
>
>- priv = kcs_bmc_priv(kcs);
>- priv->map = syscon_node_to_regmap(pdev->dev.parent->of_node);
>- if (IS_ERR(priv->map)) {
>- dev_err(&pdev->dev, "Couldn't get regmap\n");
>- return ERR_PTR(-ENODEV);
>- }
>+static int aspeed_kcs_of_v1_get_io_address(struct platform_device *pdev)
>+{
>+ u32 slave;
>+ int rc;
>
>- rc = of_property_read_u32(np, "kcs_addr", &slave);
>- if (rc) {
>+ rc = of_property_read_u32(pdev->dev.of_node, "kcs_addr", &slave);
>+ if (rc || slave > 0xffff) {
> dev_err(&pdev->dev, "no valid 'kcs_addr' configured\n");
>- return ERR_PTR(-EINVAL);
>+ return -EINVAL;
> }
>
>- kcs->ioreg = ast_kcs_bmc_ioregs[channel - 1];
>- aspeed_kcs_set_address(kcs, slave);
>-
>- return kcs;
>-}
>-
>-static int aspeed_kcs_calculate_channel(const struct kcs_ioreg *regs)
>-{
>- int i;
>-
>- for (i = 0; i < ARRAY_SIZE(ast_kcs_bmc_ioregs); i++) {
>- if (!memcmp(&ast_kcs_bmc_ioregs[i], regs, sizeof(*regs)))
>- return i + 1;
>- }
>-
>- return -EINVAL;
>+ return slave;
> }
>
>-static struct kcs_bmc *aspeed_kcs_probe_of_v2(struct platform_device *pdev)
>+static int aspeed_kcs_of_v2_get_channel(struct platform_device *pdev)
> {
>- struct aspeed_kcs_bmc *priv;
> struct device_node *np;
> struct kcs_ioreg ioreg;
>- struct kcs_bmc *kcs;
> const __be32 *reg;
>- int channel;
>- u32 slave;
>- int rc;
>+ int i;
>
> np = pdev->dev.of_node;
>
> /* Don't translate addresses, we want offsets for the regmaps */
> reg = of_get_address(np, 0, NULL, NULL);
> if (!reg)
>- return ERR_PTR(-EINVAL);
>+ return -EINVAL;
> ioreg.idr = be32_to_cpup(reg);
>
> reg = of_get_address(np, 1, NULL, NULL);
> if (!reg)
>- return ERR_PTR(-EINVAL);
>+ return -EINVAL;
> ioreg.odr = be32_to_cpup(reg);
>
> reg = of_get_address(np, 2, NULL, NULL);
> if (!reg)
>- return ERR_PTR(-EINVAL);
>+ return -EINVAL;
> ioreg.str = be32_to_cpup(reg);
>
>- channel = aspeed_kcs_calculate_channel(&ioreg);
>- if (channel < 0)
>- return ERR_PTR(channel);
>-
>- kcs = kcs_bmc_alloc(&pdev->dev, sizeof(struct aspeed_kcs_bmc), channel);
>- if (!kcs)
>- return ERR_PTR(-ENOMEM);
>-
>- kcs->ioreg = ioreg;
>-
>- priv = kcs_bmc_priv(kcs);
>- priv->map = syscon_node_to_regmap(pdev->dev.parent->of_node);
>- if (IS_ERR(priv->map)) {
>- dev_err(&pdev->dev, "Couldn't get regmap\n");
>- return ERR_PTR(-ENODEV);
>+ for (i = 0; i < ARRAY_SIZE(ast_kcs_bmc_ioregs); i++) {
>+ if (!memcmp(&ast_kcs_bmc_ioregs[i], &ioreg, sizeof(ioreg)))
>+ return i + 1;
> }
>
>- rc = of_property_read_u32(np, "aspeed,lpc-io-reg", &slave);
>- if (rc)
>- return ERR_PTR(rc);
>+ return -EINVAL;
>+}
>
>- aspeed_kcs_set_address(kcs, slave);
>+static int aspeed_kcs_of_v2_get_io_address(struct platform_device *pdev)
>+{
>+ uint32_t slave;
>+ int rc;
>
>- return kcs;
>+ rc = of_property_read_u32(pdev->dev.of_node, "aspeed,lpc-io-reg", &slave);
>+ if (rc || slave > 0xffff)
>+ return -EINVAL;
The v1 get_io_address() function prints an error in this case; it might
be nice to do so here as well? (Ideally maintained/extended as
appropriate when this function gets adjusted in patch 16.)
>+
>+ return slave;
> }
>
> static int aspeed_kcs_probe(struct platform_device *pdev)
> {
>+ const struct aspeed_kcs_of_ops *ops;
> struct device *dev = &pdev->dev;
>+ struct aspeed_kcs_bmc *priv;
> struct kcs_bmc *kcs_bmc;
> struct device_node *np;
>- int rc;
>+ int rc, channel, addr;
>
> np = dev->of_node->parent;
> if (!of_device_is_compatible(np, "aspeed,ast2400-lpc-v2") &&
>@@ -352,23 +328,35 @@ static int aspeed_kcs_probe(struct platform_device *pdev)
> dev_err(dev, "unsupported LPC device binding\n");
> return -ENODEV;
> }
>-
>- np = dev->of_node;
>- if (of_device_is_compatible(np, "aspeed,ast2400-kcs-bmc") ||
>- of_device_is_compatible(np, "aspeed,ast2500-kcs-bmc"))
>- kcs_bmc = aspeed_kcs_probe_of_v1(pdev);
>- else if (of_device_is_compatible(np, "aspeed,ast2400-kcs-bmc-v2") ||
>- of_device_is_compatible(np, "aspeed,ast2500-kcs-bmc-v2"))
>- kcs_bmc = aspeed_kcs_probe_of_v2(pdev);
>- else
>+ ops = of_device_get_match_data(&pdev->dev);
>+ if (!ops)
> return -EINVAL;
>
>- if (IS_ERR(kcs_bmc))
>- return PTR_ERR(kcs_bmc);
>+ channel = ops->get_channel(pdev);
>+ if (channel < 0)
>+ return channel;
>
>+ kcs_bmc = kcs_bmc_alloc(&pdev->dev, sizeof(struct aspeed_kcs_bmc), channel);
>+ if (!kcs_bmc)
>+ return -ENOMEM;
>+
>+ kcs_bmc->ioreg = ast_kcs_bmc_ioregs[channel - 1];
> kcs_bmc->io_inputb = aspeed_kcs_inb;
> kcs_bmc->io_outputb = aspeed_kcs_outb;
>
>+ addr = ops->get_io_address(pdev);
>+ if (addr < 0)
>+ return addr;
>+
>+ priv = kcs_bmc_priv(kcs_bmc);
>+ priv->map = syscon_node_to_regmap(pdev->dev.parent->of_node);
>+ if (IS_ERR(priv->map)) {
>+ dev_err(&pdev->dev, "Couldn't get regmap\n");
>+ return -ENODEV;
>+ }
>+
>+ aspeed_kcs_set_address(kcs_bmc, addr);
>+
> rc = aspeed_kcs_config_irq(kcs_bmc, pdev);
> if (rc)
> return rc;
>@@ -400,11 +388,21 @@ static int aspeed_kcs_remove(struct platform_device *pdev)
> return 0;
> }
>
>+static const struct aspeed_kcs_of_ops of_v1_ops = {
>+ .get_channel = aspeed_kcs_of_v1_get_channel,
>+ .get_io_address = aspeed_kcs_of_v1_get_io_address,
>+};
>+
>+static const struct aspeed_kcs_of_ops of_v2_ops = {
>+ .get_channel = aspeed_kcs_of_v2_get_channel,
>+ .get_io_address = aspeed_kcs_of_v2_get_io_address,
>+};
>+
> static const struct of_device_id ast_kcs_bmc_match[] = {
>- { .compatible = "aspeed,ast2400-kcs-bmc" },
>- { .compatible = "aspeed,ast2500-kcs-bmc" },
>- { .compatible = "aspeed,ast2400-kcs-bmc-v2" },
>- { .compatible = "aspeed,ast2500-kcs-bmc-v2" },
>+ { .compatible = "aspeed,ast2400-kcs-bmc", .data = &of_v1_ops },
>+ { .compatible = "aspeed,ast2500-kcs-bmc", .data = &of_v1_ops },
>+ { .compatible = "aspeed,ast2400-kcs-bmc-v2", .data = &of_v2_ops },
>+ { .compatible = "aspeed,ast2500-kcs-bmc-v2", .data = &of_v2_ops },
> { }
> };
> MODULE_DEVICE_TABLE(of, ast_kcs_bmc_match);
>--
>2.27.0
>
WARNING: multiple messages have this Message-ID (diff)
From: Zev Weiss <zweiss@equinix.com>
To: Andrew Jeffery <andrew@aj.id.au>
Cc: "openipmi-developer@lists.sourceforge.net"
<openipmi-developer@lists.sourceforge.net>,
"openbmc@lists.ozlabs.org" <openbmc@lists.ozlabs.org>,
"minyard@acm.org" <minyard@acm.org>,
"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
"tmaimon77@gmail.com" <tmaimon77@gmail.com>,
"linux-aspeed@lists.ozlabs.org" <linux-aspeed@lists.ozlabs.org>,
"avifishman70@gmail.com" <avifishman70@gmail.com>,
"venture@google.com" <venture@google.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"tali.perry1@gmail.com" <tali.perry1@gmail.com>,
"robh+dt@kernel.org" <robh+dt@kernel.org>,
"chiawei_wang@aspeedtech.com" <chiawei_wang@aspeedtech.com>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
"benjaminfair@google.com" <benjaminfair@google.com>,
"arnd@arndb.de" <arnd@arndb.de>
Subject: Re: [PATCH v3 01/16] ipmi: kcs_bmc_aspeed: Use of match data to extract KCS properties
Date: Fri, 21 May 2021 07:17:36 +0000 [thread overview]
Message-ID: <YKdej27PuU1cgaCh@packtop> (raw)
In-Reply-To: <20210510054213.1610760-2-andrew@aj.id.au>
On Mon, May 10, 2021 at 12:41:58AM CDT, Andrew Jeffery wrote:
>Unpack and remove the aspeed_kcs_probe_of_v[12]() functions to aid
>rearranging how the private device-driver memory is allocated.
>
>Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
>---
> drivers/char/ipmi/kcs_bmc_aspeed.c | 154 ++++++++++++++---------------
> 1 file changed, 76 insertions(+), 78 deletions(-)
>
>diff --git a/drivers/char/ipmi/kcs_bmc_aspeed.c b/drivers/char/ipmi/kcs_bmc_aspeed.c
>index eefe362f65f0..c94d36e195be 100644
>--- a/drivers/char/ipmi/kcs_bmc_aspeed.c
>+++ b/drivers/char/ipmi/kcs_bmc_aspeed.c
>@@ -13,6 +13,7 @@
> #include <linux/module.h>
> #include <linux/of.h>
> #include <linux/of_address.h>
>+#include <linux/of_device.h>
> #include <linux/platform_device.h>
> #include <linux/poll.h>
> #include <linux/regmap.h>
>@@ -63,6 +64,10 @@ struct aspeed_kcs_bmc {
> struct regmap *map;
> };
>
>+struct aspeed_kcs_of_ops {
>+ int (*get_channel)(struct platform_device *pdev);
>+ int (*get_io_address)(struct platform_device *pdev);
>+};
>
> static u8 aspeed_kcs_inb(struct kcs_bmc *kcs_bmc, u32 reg)
> {
>@@ -231,13 +236,10 @@ static const struct kcs_ioreg ast_kcs_bmc_ioregs[KCS_CHANNEL_MAX] = {
> { .idr = LPC_IDR4, .odr = LPC_ODR4, .str = LPC_STR4 },
> };
>
>-static struct kcs_bmc *aspeed_kcs_probe_of_v1(struct platform_device *pdev)
>+static int aspeed_kcs_of_v1_get_channel(struct platform_device *pdev)
> {
>- struct aspeed_kcs_bmc *priv;
> struct device_node *np;
>- struct kcs_bmc *kcs;
> u32 channel;
>- u32 slave;
> int rc;
>
> np = pdev->dev.of_node;
>@@ -245,105 +247,79 @@ static struct kcs_bmc *aspeed_kcs_probe_of_v1(struct platform_device *pdev)
> rc = of_property_read_u32(np, "kcs_chan", &channel);
> if ((rc != 0) || (channel == 0 || channel > KCS_CHANNEL_MAX)) {
> dev_err(&pdev->dev, "no valid 'kcs_chan' configured\n");
>- return ERR_PTR(-EINVAL);
>+ return -EINVAL;
> }
>
>- kcs = kcs_bmc_alloc(&pdev->dev, sizeof(struct aspeed_kcs_bmc), channel);
>- if (!kcs)
>- return ERR_PTR(-ENOMEM);
>+ return channel;
>+}
>
>- priv = kcs_bmc_priv(kcs);
>- priv->map = syscon_node_to_regmap(pdev->dev.parent->of_node);
>- if (IS_ERR(priv->map)) {
>- dev_err(&pdev->dev, "Couldn't get regmap\n");
>- return ERR_PTR(-ENODEV);
>- }
>+static int aspeed_kcs_of_v1_get_io_address(struct platform_device *pdev)
>+{
>+ u32 slave;
>+ int rc;
>
>- rc = of_property_read_u32(np, "kcs_addr", &slave);
>- if (rc) {
>+ rc = of_property_read_u32(pdev->dev.of_node, "kcs_addr", &slave);
>+ if (rc || slave > 0xffff) {
> dev_err(&pdev->dev, "no valid 'kcs_addr' configured\n");
>- return ERR_PTR(-EINVAL);
>+ return -EINVAL;
> }
>
>- kcs->ioreg = ast_kcs_bmc_ioregs[channel - 1];
>- aspeed_kcs_set_address(kcs, slave);
>-
>- return kcs;
>-}
>-
>-static int aspeed_kcs_calculate_channel(const struct kcs_ioreg *regs)
>-{
>- int i;
>-
>- for (i = 0; i < ARRAY_SIZE(ast_kcs_bmc_ioregs); i++) {
>- if (!memcmp(&ast_kcs_bmc_ioregs[i], regs, sizeof(*regs)))
>- return i + 1;
>- }
>-
>- return -EINVAL;
>+ return slave;
> }
>
>-static struct kcs_bmc *aspeed_kcs_probe_of_v2(struct platform_device *pdev)
>+static int aspeed_kcs_of_v2_get_channel(struct platform_device *pdev)
> {
>- struct aspeed_kcs_bmc *priv;
> struct device_node *np;
> struct kcs_ioreg ioreg;
>- struct kcs_bmc *kcs;
> const __be32 *reg;
>- int channel;
>- u32 slave;
>- int rc;
>+ int i;
>
> np = pdev->dev.of_node;
>
> /* Don't translate addresses, we want offsets for the regmaps */
> reg = of_get_address(np, 0, NULL, NULL);
> if (!reg)
>- return ERR_PTR(-EINVAL);
>+ return -EINVAL;
> ioreg.idr = be32_to_cpup(reg);
>
> reg = of_get_address(np, 1, NULL, NULL);
> if (!reg)
>- return ERR_PTR(-EINVAL);
>+ return -EINVAL;
> ioreg.odr = be32_to_cpup(reg);
>
> reg = of_get_address(np, 2, NULL, NULL);
> if (!reg)
>- return ERR_PTR(-EINVAL);
>+ return -EINVAL;
> ioreg.str = be32_to_cpup(reg);
>
>- channel = aspeed_kcs_calculate_channel(&ioreg);
>- if (channel < 0)
>- return ERR_PTR(channel);
>-
>- kcs = kcs_bmc_alloc(&pdev->dev, sizeof(struct aspeed_kcs_bmc), channel);
>- if (!kcs)
>- return ERR_PTR(-ENOMEM);
>-
>- kcs->ioreg = ioreg;
>-
>- priv = kcs_bmc_priv(kcs);
>- priv->map = syscon_node_to_regmap(pdev->dev.parent->of_node);
>- if (IS_ERR(priv->map)) {
>- dev_err(&pdev->dev, "Couldn't get regmap\n");
>- return ERR_PTR(-ENODEV);
>+ for (i = 0; i < ARRAY_SIZE(ast_kcs_bmc_ioregs); i++) {
>+ if (!memcmp(&ast_kcs_bmc_ioregs[i], &ioreg, sizeof(ioreg)))
>+ return i + 1;
> }
>
>- rc = of_property_read_u32(np, "aspeed,lpc-io-reg", &slave);
>- if (rc)
>- return ERR_PTR(rc);
>+ return -EINVAL;
>+}
>
>- aspeed_kcs_set_address(kcs, slave);
>+static int aspeed_kcs_of_v2_get_io_address(struct platform_device *pdev)
>+{
>+ uint32_t slave;
>+ int rc;
>
>- return kcs;
>+ rc = of_property_read_u32(pdev->dev.of_node, "aspeed,lpc-io-reg", &slave);
>+ if (rc || slave > 0xffff)
>+ return -EINVAL;
The v1 get_io_address() function prints an error in this case; it might
be nice to do so here as well? (Ideally maintained/extended as
appropriate when this function gets adjusted in patch 16.)
>+
>+ return slave;
> }
>
> static int aspeed_kcs_probe(struct platform_device *pdev)
> {
>+ const struct aspeed_kcs_of_ops *ops;
> struct device *dev = &pdev->dev;
>+ struct aspeed_kcs_bmc *priv;
> struct kcs_bmc *kcs_bmc;
> struct device_node *np;
>- int rc;
>+ int rc, channel, addr;
>
> np = dev->of_node->parent;
> if (!of_device_is_compatible(np, "aspeed,ast2400-lpc-v2") &&
>@@ -352,23 +328,35 @@ static int aspeed_kcs_probe(struct platform_device *pdev)
> dev_err(dev, "unsupported LPC device binding\n");
> return -ENODEV;
> }
>-
>- np = dev->of_node;
>- if (of_device_is_compatible(np, "aspeed,ast2400-kcs-bmc") ||
>- of_device_is_compatible(np, "aspeed,ast2500-kcs-bmc"))
>- kcs_bmc = aspeed_kcs_probe_of_v1(pdev);
>- else if (of_device_is_compatible(np, "aspeed,ast2400-kcs-bmc-v2") ||
>- of_device_is_compatible(np, "aspeed,ast2500-kcs-bmc-v2"))
>- kcs_bmc = aspeed_kcs_probe_of_v2(pdev);
>- else
>+ ops = of_device_get_match_data(&pdev->dev);
>+ if (!ops)
> return -EINVAL;
>
>- if (IS_ERR(kcs_bmc))
>- return PTR_ERR(kcs_bmc);
>+ channel = ops->get_channel(pdev);
>+ if (channel < 0)
>+ return channel;
>
>+ kcs_bmc = kcs_bmc_alloc(&pdev->dev, sizeof(struct aspeed_kcs_bmc), channel);
>+ if (!kcs_bmc)
>+ return -ENOMEM;
>+
>+ kcs_bmc->ioreg = ast_kcs_bmc_ioregs[channel - 1];
> kcs_bmc->io_inputb = aspeed_kcs_inb;
> kcs_bmc->io_outputb = aspeed_kcs_outb;
>
>+ addr = ops->get_io_address(pdev);
>+ if (addr < 0)
>+ return addr;
>+
>+ priv = kcs_bmc_priv(kcs_bmc);
>+ priv->map = syscon_node_to_regmap(pdev->dev.parent->of_node);
>+ if (IS_ERR(priv->map)) {
>+ dev_err(&pdev->dev, "Couldn't get regmap\n");
>+ return -ENODEV;
>+ }
>+
>+ aspeed_kcs_set_address(kcs_bmc, addr);
>+
> rc = aspeed_kcs_config_irq(kcs_bmc, pdev);
> if (rc)
> return rc;
>@@ -400,11 +388,21 @@ static int aspeed_kcs_remove(struct platform_device *pdev)
> return 0;
> }
>
>+static const struct aspeed_kcs_of_ops of_v1_ops = {
>+ .get_channel = aspeed_kcs_of_v1_get_channel,
>+ .get_io_address = aspeed_kcs_of_v1_get_io_address,
>+};
>+
>+static const struct aspeed_kcs_of_ops of_v2_ops = {
>+ .get_channel = aspeed_kcs_of_v2_get_channel,
>+ .get_io_address = aspeed_kcs_of_v2_get_io_address,
>+};
>+
> static const struct of_device_id ast_kcs_bmc_match[] = {
>- { .compatible = "aspeed,ast2400-kcs-bmc" },
>- { .compatible = "aspeed,ast2500-kcs-bmc" },
>- { .compatible = "aspeed,ast2400-kcs-bmc-v2" },
>- { .compatible = "aspeed,ast2500-kcs-bmc-v2" },
>+ { .compatible = "aspeed,ast2400-kcs-bmc", .data = &of_v1_ops },
>+ { .compatible = "aspeed,ast2500-kcs-bmc", .data = &of_v1_ops },
>+ { .compatible = "aspeed,ast2400-kcs-bmc-v2", .data = &of_v2_ops },
>+ { .compatible = "aspeed,ast2500-kcs-bmc-v2", .data = &of_v2_ops },
> { }
> };
> MODULE_DEVICE_TABLE(of, ast_kcs_bmc_match);
>--
>2.27.0
>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
WARNING: multiple messages have this Message-ID (diff)
From: Zev Weiss <zweiss@equinix.com>
To: Andrew Jeffery <andrew@aj.id.au>
Cc: "openipmi-developer@lists.sourceforge.net"
<openipmi-developer@lists.sourceforge.net>,
"openbmc@lists.ozlabs.org" <openbmc@lists.ozlabs.org>,
"minyard@acm.org" <minyard@acm.org>,
"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
"tmaimon77@gmail.com" <tmaimon77@gmail.com>,
"linux-aspeed@lists.ozlabs.org" <linux-aspeed@lists.ozlabs.org>,
"avifishman70@gmail.com" <avifishman70@gmail.com>,
"venture@google.com" <venture@google.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"tali.perry1@gmail.com" <tali.perry1@gmail.com>,
"robh+dt@kernel.org" <robh+dt@kernel.org>,
"chiawei_wang@aspeedtech.com" <chiawei_wang@aspeedtech.com>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
"benjaminfair@google.com" <benjaminfair@google.com>,
"arnd@arndb.de" <arnd@arndb.de>
Subject: Re: [PATCH v3 01/16] ipmi: kcs_bmc_aspeed: Use of match data to extract KCS properties
Date: Fri, 21 May 2021 07:17:36 +0000 [thread overview]
Message-ID: <YKdej27PuU1cgaCh@packtop> (raw)
In-Reply-To: <20210510054213.1610760-2-andrew@aj.id.au>
On Mon, May 10, 2021 at 12:41:58AM CDT, Andrew Jeffery wrote:
>Unpack and remove the aspeed_kcs_probe_of_v[12]() functions to aid
>rearranging how the private device-driver memory is allocated.
>
>Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
>---
> drivers/char/ipmi/kcs_bmc_aspeed.c | 154 ++++++++++++++---------------
> 1 file changed, 76 insertions(+), 78 deletions(-)
>
>diff --git a/drivers/char/ipmi/kcs_bmc_aspeed.c b/drivers/char/ipmi/kcs_bmc_aspeed.c
>index eefe362f65f0..c94d36e195be 100644
>--- a/drivers/char/ipmi/kcs_bmc_aspeed.c
>+++ b/drivers/char/ipmi/kcs_bmc_aspeed.c
>@@ -13,6 +13,7 @@
> #include <linux/module.h>
> #include <linux/of.h>
> #include <linux/of_address.h>
>+#include <linux/of_device.h>
> #include <linux/platform_device.h>
> #include <linux/poll.h>
> #include <linux/regmap.h>
>@@ -63,6 +64,10 @@ struct aspeed_kcs_bmc {
> struct regmap *map;
> };
>
>+struct aspeed_kcs_of_ops {
>+ int (*get_channel)(struct platform_device *pdev);
>+ int (*get_io_address)(struct platform_device *pdev);
>+};
>
> static u8 aspeed_kcs_inb(struct kcs_bmc *kcs_bmc, u32 reg)
> {
>@@ -231,13 +236,10 @@ static const struct kcs_ioreg ast_kcs_bmc_ioregs[KCS_CHANNEL_MAX] = {
> { .idr = LPC_IDR4, .odr = LPC_ODR4, .str = LPC_STR4 },
> };
>
>-static struct kcs_bmc *aspeed_kcs_probe_of_v1(struct platform_device *pdev)
>+static int aspeed_kcs_of_v1_get_channel(struct platform_device *pdev)
> {
>- struct aspeed_kcs_bmc *priv;
> struct device_node *np;
>- struct kcs_bmc *kcs;
> u32 channel;
>- u32 slave;
> int rc;
>
> np = pdev->dev.of_node;
>@@ -245,105 +247,79 @@ static struct kcs_bmc *aspeed_kcs_probe_of_v1(struct platform_device *pdev)
> rc = of_property_read_u32(np, "kcs_chan", &channel);
> if ((rc != 0) || (channel == 0 || channel > KCS_CHANNEL_MAX)) {
> dev_err(&pdev->dev, "no valid 'kcs_chan' configured\n");
>- return ERR_PTR(-EINVAL);
>+ return -EINVAL;
> }
>
>- kcs = kcs_bmc_alloc(&pdev->dev, sizeof(struct aspeed_kcs_bmc), channel);
>- if (!kcs)
>- return ERR_PTR(-ENOMEM);
>+ return channel;
>+}
>
>- priv = kcs_bmc_priv(kcs);
>- priv->map = syscon_node_to_regmap(pdev->dev.parent->of_node);
>- if (IS_ERR(priv->map)) {
>- dev_err(&pdev->dev, "Couldn't get regmap\n");
>- return ERR_PTR(-ENODEV);
>- }
>+static int aspeed_kcs_of_v1_get_io_address(struct platform_device *pdev)
>+{
>+ u32 slave;
>+ int rc;
>
>- rc = of_property_read_u32(np, "kcs_addr", &slave);
>- if (rc) {
>+ rc = of_property_read_u32(pdev->dev.of_node, "kcs_addr", &slave);
>+ if (rc || slave > 0xffff) {
> dev_err(&pdev->dev, "no valid 'kcs_addr' configured\n");
>- return ERR_PTR(-EINVAL);
>+ return -EINVAL;
> }
>
>- kcs->ioreg = ast_kcs_bmc_ioregs[channel - 1];
>- aspeed_kcs_set_address(kcs, slave);
>-
>- return kcs;
>-}
>-
>-static int aspeed_kcs_calculate_channel(const struct kcs_ioreg *regs)
>-{
>- int i;
>-
>- for (i = 0; i < ARRAY_SIZE(ast_kcs_bmc_ioregs); i++) {
>- if (!memcmp(&ast_kcs_bmc_ioregs[i], regs, sizeof(*regs)))
>- return i + 1;
>- }
>-
>- return -EINVAL;
>+ return slave;
> }
>
>-static struct kcs_bmc *aspeed_kcs_probe_of_v2(struct platform_device *pdev)
>+static int aspeed_kcs_of_v2_get_channel(struct platform_device *pdev)
> {
>- struct aspeed_kcs_bmc *priv;
> struct device_node *np;
> struct kcs_ioreg ioreg;
>- struct kcs_bmc *kcs;
> const __be32 *reg;
>- int channel;
>- u32 slave;
>- int rc;
>+ int i;
>
> np = pdev->dev.of_node;
>
> /* Don't translate addresses, we want offsets for the regmaps */
> reg = of_get_address(np, 0, NULL, NULL);
> if (!reg)
>- return ERR_PTR(-EINVAL);
>+ return -EINVAL;
> ioreg.idr = be32_to_cpup(reg);
>
> reg = of_get_address(np, 1, NULL, NULL);
> if (!reg)
>- return ERR_PTR(-EINVAL);
>+ return -EINVAL;
> ioreg.odr = be32_to_cpup(reg);
>
> reg = of_get_address(np, 2, NULL, NULL);
> if (!reg)
>- return ERR_PTR(-EINVAL);
>+ return -EINVAL;
> ioreg.str = be32_to_cpup(reg);
>
>- channel = aspeed_kcs_calculate_channel(&ioreg);
>- if (channel < 0)
>- return ERR_PTR(channel);
>-
>- kcs = kcs_bmc_alloc(&pdev->dev, sizeof(struct aspeed_kcs_bmc), channel);
>- if (!kcs)
>- return ERR_PTR(-ENOMEM);
>-
>- kcs->ioreg = ioreg;
>-
>- priv = kcs_bmc_priv(kcs);
>- priv->map = syscon_node_to_regmap(pdev->dev.parent->of_node);
>- if (IS_ERR(priv->map)) {
>- dev_err(&pdev->dev, "Couldn't get regmap\n");
>- return ERR_PTR(-ENODEV);
>+ for (i = 0; i < ARRAY_SIZE(ast_kcs_bmc_ioregs); i++) {
>+ if (!memcmp(&ast_kcs_bmc_ioregs[i], &ioreg, sizeof(ioreg)))
>+ return i + 1;
> }
>
>- rc = of_property_read_u32(np, "aspeed,lpc-io-reg", &slave);
>- if (rc)
>- return ERR_PTR(rc);
>+ return -EINVAL;
>+}
>
>- aspeed_kcs_set_address(kcs, slave);
>+static int aspeed_kcs_of_v2_get_io_address(struct platform_device *pdev)
>+{
>+ uint32_t slave;
>+ int rc;
>
>- return kcs;
>+ rc = of_property_read_u32(pdev->dev.of_node, "aspeed,lpc-io-reg", &slave);
>+ if (rc || slave > 0xffff)
>+ return -EINVAL;
The v1 get_io_address() function prints an error in this case; it might
be nice to do so here as well? (Ideally maintained/extended as
appropriate when this function gets adjusted in patch 16.)
>+
>+ return slave;
> }
>
> static int aspeed_kcs_probe(struct platform_device *pdev)
> {
>+ const struct aspeed_kcs_of_ops *ops;
> struct device *dev = &pdev->dev;
>+ struct aspeed_kcs_bmc *priv;
> struct kcs_bmc *kcs_bmc;
> struct device_node *np;
>- int rc;
>+ int rc, channel, addr;
>
> np = dev->of_node->parent;
> if (!of_device_is_compatible(np, "aspeed,ast2400-lpc-v2") &&
>@@ -352,23 +328,35 @@ static int aspeed_kcs_probe(struct platform_device *pdev)
> dev_err(dev, "unsupported LPC device binding\n");
> return -ENODEV;
> }
>-
>- np = dev->of_node;
>- if (of_device_is_compatible(np, "aspeed,ast2400-kcs-bmc") ||
>- of_device_is_compatible(np, "aspeed,ast2500-kcs-bmc"))
>- kcs_bmc = aspeed_kcs_probe_of_v1(pdev);
>- else if (of_device_is_compatible(np, "aspeed,ast2400-kcs-bmc-v2") ||
>- of_device_is_compatible(np, "aspeed,ast2500-kcs-bmc-v2"))
>- kcs_bmc = aspeed_kcs_probe_of_v2(pdev);
>- else
>+ ops = of_device_get_match_data(&pdev->dev);
>+ if (!ops)
> return -EINVAL;
>
>- if (IS_ERR(kcs_bmc))
>- return PTR_ERR(kcs_bmc);
>+ channel = ops->get_channel(pdev);
>+ if (channel < 0)
>+ return channel;
>
>+ kcs_bmc = kcs_bmc_alloc(&pdev->dev, sizeof(struct aspeed_kcs_bmc), channel);
>+ if (!kcs_bmc)
>+ return -ENOMEM;
>+
>+ kcs_bmc->ioreg = ast_kcs_bmc_ioregs[channel - 1];
> kcs_bmc->io_inputb = aspeed_kcs_inb;
> kcs_bmc->io_outputb = aspeed_kcs_outb;
>
>+ addr = ops->get_io_address(pdev);
>+ if (addr < 0)
>+ return addr;
>+
>+ priv = kcs_bmc_priv(kcs_bmc);
>+ priv->map = syscon_node_to_regmap(pdev->dev.parent->of_node);
>+ if (IS_ERR(priv->map)) {
>+ dev_err(&pdev->dev, "Couldn't get regmap\n");
>+ return -ENODEV;
>+ }
>+
>+ aspeed_kcs_set_address(kcs_bmc, addr);
>+
> rc = aspeed_kcs_config_irq(kcs_bmc, pdev);
> if (rc)
> return rc;
>@@ -400,11 +388,21 @@ static int aspeed_kcs_remove(struct platform_device *pdev)
> return 0;
> }
>
>+static const struct aspeed_kcs_of_ops of_v1_ops = {
>+ .get_channel = aspeed_kcs_of_v1_get_channel,
>+ .get_io_address = aspeed_kcs_of_v1_get_io_address,
>+};
>+
>+static const struct aspeed_kcs_of_ops of_v2_ops = {
>+ .get_channel = aspeed_kcs_of_v2_get_channel,
>+ .get_io_address = aspeed_kcs_of_v2_get_io_address,
>+};
>+
> static const struct of_device_id ast_kcs_bmc_match[] = {
>- { .compatible = "aspeed,ast2400-kcs-bmc" },
>- { .compatible = "aspeed,ast2500-kcs-bmc" },
>- { .compatible = "aspeed,ast2400-kcs-bmc-v2" },
>- { .compatible = "aspeed,ast2500-kcs-bmc-v2" },
>+ { .compatible = "aspeed,ast2400-kcs-bmc", .data = &of_v1_ops },
>+ { .compatible = "aspeed,ast2500-kcs-bmc", .data = &of_v1_ops },
>+ { .compatible = "aspeed,ast2400-kcs-bmc-v2", .data = &of_v2_ops },
>+ { .compatible = "aspeed,ast2500-kcs-bmc-v2", .data = &of_v2_ops },
> { }
> };
> MODULE_DEVICE_TABLE(of, ast_kcs_bmc_match);
>--
>2.27.0
>
next prev parent reply other threads:[~2021-05-21 7:17 UTC|newest]
Thread overview: 148+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-10 5:41 [PATCH v3 00/16] ipmi: Allow raw access to KCS devices Andrew Jeffery
2021-05-10 5:41 ` Andrew Jeffery
2021-05-10 5:41 ` Andrew Jeffery
2021-05-10 5:41 ` Andrew Jeffery
2021-05-10 5:41 ` [PATCH v3 01/16] ipmi: kcs_bmc_aspeed: Use of match data to extract KCS properties Andrew Jeffery
2021-05-10 5:41 ` Andrew Jeffery
2021-05-10 5:41 ` Andrew Jeffery
2021-05-10 5:41 ` Andrew Jeffery
2021-05-21 7:17 ` Zev Weiss [this message]
2021-05-21 7:17 ` Zev Weiss
2021-05-21 7:17 ` Zev Weiss
2021-05-21 7:17 ` Zev Weiss
2021-05-10 5:41 ` [PATCH v3 02/16] ipmi: kcs_bmc: Make status update atomic Andrew Jeffery
2021-05-10 5:41 ` Andrew Jeffery
2021-05-10 5:41 ` Andrew Jeffery
2021-05-10 5:41 ` Andrew Jeffery
2021-05-10 5:42 ` [PATCH v3 03/16] ipmi: kcs_bmc: Rename {read, write}_{status, data}() functions Andrew Jeffery
2021-05-10 5:42 ` [PATCH v3 03/16] ipmi: kcs_bmc: Rename {read,write}_{status,data}() functions Andrew Jeffery
2021-05-10 5:42 ` [PATCH v3 03/16] ipmi: kcs_bmc: Rename {read, write}_{status, data}() functions Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` [PATCH v3 04/16] ipmi: kcs_bmc: Split out kcs_bmc_cdev_ipmi Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` [PATCH v3 05/16] ipmi: kcs_bmc: Turn the driver data-structures inside-out Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-21 17:14 ` Corey Minyard
2021-05-21 17:14 ` Corey Minyard
2021-05-21 17:14 ` Corey Minyard
2021-05-21 17:14 ` Corey Minyard
2021-05-24 0:53 ` Andrew Jeffery
2021-05-24 0:53 ` Andrew Jeffery
2021-05-24 0:53 ` Andrew Jeffery
2021-05-24 0:53 ` Andrew Jeffery
2021-05-24 15:41 ` [Openipmi-developer] " Corey Minyard
2021-05-24 15:41 ` Corey Minyard
2021-05-24 15:41 ` Corey Minyard
2021-05-24 15:41 ` Corey Minyard
2021-05-25 0:12 ` Andrew Jeffery
2021-05-25 0:12 ` Andrew Jeffery
2021-05-25 0:12 ` Andrew Jeffery
2021-05-25 0:12 ` Andrew Jeffery
2021-05-10 5:42 ` [PATCH v3 06/16] ipmi: kcs_bmc: Split headers into device and client Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-21 7:18 ` Zev Weiss
2021-05-21 7:18 ` Zev Weiss
2021-05-21 7:18 ` Zev Weiss
2021-05-21 7:18 ` Zev Weiss
2021-05-10 5:42 ` [PATCH v3 07/16] ipmi: kcs_bmc: Strip private client data from struct kcs_bmc Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-21 7:18 ` Zev Weiss
2021-05-21 7:18 ` Zev Weiss
2021-05-21 7:18 ` Zev Weiss
2021-05-21 7:18 ` Zev Weiss
2021-05-10 5:42 ` [PATCH v3 08/16] ipmi: kcs_bmc: Decouple the IPMI chardev from the core Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-21 7:19 ` Zev Weiss
2021-05-21 7:19 ` Zev Weiss
2021-05-21 7:19 ` Zev Weiss
2021-05-21 7:19 ` Zev Weiss
2021-05-10 5:42 ` [PATCH v3 09/16] ipmi: kcs_bmc: Allow clients to control KCS IRQ state Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-21 7:19 ` Zev Weiss
2021-05-21 7:19 ` Zev Weiss
2021-05-21 7:19 ` Zev Weiss
2021-05-21 7:19 ` Zev Weiss
2021-05-10 5:42 ` [PATCH v3 10/16] ipmi: kcs_bmc: Don't enforce single-open policy in the kernel Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-21 17:30 ` Corey Minyard
2021-05-21 17:30 ` Corey Minyard
2021-05-21 17:30 ` Corey Minyard
2021-05-21 17:30 ` Corey Minyard
2021-05-24 0:39 ` Andrew Jeffery
2021-05-24 0:39 ` Andrew Jeffery
2021-05-24 0:39 ` Andrew Jeffery
2021-05-24 0:39 ` Andrew Jeffery
2021-05-10 5:42 ` [PATCH v3 11/16] ipmi: kcs_bmc: Add serio adaptor Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-21 7:20 ` Zev Weiss
2021-05-21 7:20 ` Zev Weiss
2021-05-21 7:20 ` Zev Weiss
2021-05-21 7:20 ` Zev Weiss
2021-06-08 0:37 ` Andrew Jeffery
2021-06-08 0:37 ` Andrew Jeffery
2021-06-08 0:37 ` Andrew Jeffery
2021-06-08 0:37 ` Andrew Jeffery
2021-05-10 5:42 ` [PATCH v3 12/16] dt-bindings: ipmi: Convert ASPEED KCS binding to schema Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` [PATCH v3 13/16] dt-bindings: ipmi: Add optional SerIRQ property to ASPEED KCS devices Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` [PATCH v3 14/16] ipmi: kcs_bmc_aspeed: Implement KCS SerIRQ configuration Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-21 7:21 ` Zev Weiss
2021-05-21 7:21 ` Zev Weiss
2021-05-21 7:21 ` Zev Weiss
2021-05-21 7:21 ` Zev Weiss
2021-06-08 0:41 ` Andrew Jeffery
2021-06-08 0:41 ` Andrew Jeffery
2021-06-08 0:41 ` Andrew Jeffery
2021-06-08 0:41 ` Andrew Jeffery
2021-06-08 0:55 ` Andrew Jeffery
2021-06-08 0:55 ` Andrew Jeffery
2021-06-08 0:55 ` Andrew Jeffery
2021-06-08 0:55 ` Andrew Jeffery
2021-05-10 5:42 ` [PATCH v3 15/16] ipmi: kcs_bmc_aspeed: Fix IBFIE typo from datasheet Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` [PATCH v3 16/16] ipmi: kcs_bmc_aspeed: Optionally apply status address Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-10 5:42 ` Andrew Jeffery
2021-05-20 6:51 ` [PATCH v3 00/16] ipmi: Allow raw access to KCS devices Andrew Jeffery
2021-05-20 6:51 ` Andrew Jeffery
2021-05-20 6:51 ` Andrew Jeffery
2021-05-20 6:51 ` Andrew Jeffery
2021-05-20 13:33 ` Corey Minyard
2021-05-20 13:33 ` Corey Minyard
2021-05-20 13:33 ` Corey Minyard
2021-05-20 13:33 ` Corey Minyard
2021-05-21 17:36 ` Corey Minyard
2021-05-21 17:36 ` Corey Minyard
2021-05-21 17:36 ` Corey Minyard
2021-05-21 17:36 ` Corey Minyard
2021-05-24 0:36 ` Andrew Jeffery
2021-05-24 0:36 ` Andrew Jeffery
2021-05-24 0:36 ` Andrew Jeffery
2021-05-24 0:36 ` Andrew Jeffery
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YKdej27PuU1cgaCh@packtop \
--to=zweiss@equinix.com \
--cc=linux-aspeed@lists.ozlabs.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.