]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
reset: imx8mp-audiomix: Extend the driver usage
authorLaurentiu Mihalcea <laurentiu.mihalcea@nxp.com>
Wed, 26 Nov 2025 12:42:16 +0000 (04:42 -0800)
committerPhilipp Zabel <p.zabel@pengutronix.de>
Sat, 24 Jan 2026 15:22:49 +0000 (16:22 +0100)
Switch to per-device reset map to allow reusing the driver for other NXP
block control IPs.

Reviewed-by: Daniel Baluta <daniel.baluta@nxp.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Signed-off-by: Laurentiu Mihalcea <laurentiu.mihalcea@nxp.com>
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
drivers/reset/reset-imx8mp-audiomix.c

index f6152c0cc5ffb6fc01fa0ace87efa9bb0ec0f664..00eee528a2d23ee59aa8ab9c996c8a138eabc5b2 100644 (file)
@@ -24,7 +24,12 @@ struct imx8mp_reset_map {
        bool active_low;
 };
 
-static const struct imx8mp_reset_map reset_map[] = {
+struct imx8mp_reset_info {
+       const struct imx8mp_reset_map *map;
+       int num_lines;
+};
+
+static const struct imx8mp_reset_map imx8mp_reset_map[] = {
        [IMX8MP_AUDIOMIX_EARC_RESET] = {
                .offset = IMX8MP_AUDIOMIX_EARC_RESET_OFFSET,
                .mask = BIT(0),
@@ -42,9 +47,15 @@ static const struct imx8mp_reset_map reset_map[] = {
        },
 };
 
+static const struct imx8mp_reset_info imx8mp_reset_info = {
+       .map = imx8mp_reset_map,
+       .num_lines = ARRAY_SIZE(imx8mp_reset_map),
+};
+
 struct imx8mp_audiomix_reset {
        struct reset_controller_dev rcdev;
        struct regmap *regmap;
+       const struct imx8mp_reset_map *map;
 };
 
 static struct imx8mp_audiomix_reset *to_imx8mp_audiomix_reset(struct reset_controller_dev *rcdev)
@@ -56,6 +67,7 @@ static int imx8mp_audiomix_update(struct reset_controller_dev *rcdev,
                                  unsigned long id, bool assert)
 {
        struct imx8mp_audiomix_reset *priv = to_imx8mp_audiomix_reset(rcdev);
+       const struct imx8mp_reset_map *reset_map = priv->map;
        unsigned int mask, offset, active_low, val;
 
        mask = reset_map[id].mask;
@@ -132,16 +144,20 @@ static int imx8mp_audiomix_reset_get_regmap(struct imx8mp_audiomix_reset *priv)
 static int imx8mp_audiomix_reset_probe(struct auxiliary_device *adev,
                                       const struct auxiliary_device_id *id)
 {
+       const struct imx8mp_reset_info *rinfo;
        struct imx8mp_audiomix_reset *priv;
        struct device *dev = &adev->dev;
        int ret;
 
+       rinfo = (void *)id->driver_data;
+
        priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
        if (!priv)
                return -ENOMEM;
 
        priv->rcdev.owner     = THIS_MODULE;
-       priv->rcdev.nr_resets = ARRAY_SIZE(reset_map);
+       priv->map             = rinfo->map;
+       priv->rcdev.nr_resets = rinfo->num_lines;
        priv->rcdev.ops       = &imx8mp_audiomix_reset_ops;
        priv->rcdev.of_node   = dev->parent->of_node;
        priv->rcdev.dev       = dev;
@@ -164,6 +180,7 @@ static int imx8mp_audiomix_reset_probe(struct auxiliary_device *adev,
 static const struct auxiliary_device_id imx8mp_audiomix_reset_ids[] = {
        {
                .name = "clk_imx8mp_audiomix.reset",
+               .driver_data = (kernel_ulong_t)&imx8mp_reset_info,
        },
        { }
 };