Register DPLL sub-devices to expose the functionality provided by ZL3073x chip family. Each sub-device represents one of the available DPLL channels. Signed-off-by: Ivan Vecera <ivecera@xxxxxxxxxx> --- v7->v8: * replaced zl3073x_pdata array ZL3073X_PDATA macro v6->v7: * use platform data to pass the channel to use v4->v6: * no change v3->v4: * use static mfd cells --- drivers/mfd/zl3073x-core.c | 27 +++++++++++++++++++++++++++ include/linux/mfd/zl3073x.h | 9 +++++++++ 2 files changed, 36 insertions(+) diff --git a/drivers/mfd/zl3073x-core.c b/drivers/mfd/zl3073x-core.c index 0bea696a46b8..7b140b614a63 100644 --- a/drivers/mfd/zl3073x-core.c +++ b/drivers/mfd/zl3073x-core.c @@ -7,6 +7,7 @@ #include <linux/device.h> #include <linux/export.h> #include <linux/math64.h> +#include <linux/mfd/core.h> #include <linux/mfd/zl3073x.h> #include <linux/module.h> #include <linux/netlink.h> @@ -755,6 +756,23 @@ static void zl3073x_devlink_unregister(void *ptr) devlink_unregister(ptr); } +#define ZL3073X_PDATA(_channel) \ + (&(const struct zl3073x_pdata) { \ + .channel = _channel, \ + }) + +#define ZL3073X_CELL(_name, _channel) \ + MFD_CELL_BASIC(_name, NULL, ZL3073X_PDATA(_channel), \ + sizeof(struct zl3073x_pdata), 0) + +static const struct mfd_cell zl3073x_devs[] = { + ZL3073X_CELL("zl3073x-dpll", 0), + ZL3073X_CELL("zl3073x-dpll", 1), + ZL3073X_CELL("zl3073x-dpll", 2), + ZL3073X_CELL("zl3073x-dpll", 3), + ZL3073X_CELL("zl3073x-dpll", 4), +}; + /** * zl3073x_dev_probe - initialize zl3073x device * @zldev: pointer to zl3073x device @@ -826,6 +844,15 @@ int zl3073x_dev_probe(struct zl3073x_dev *zldev, if (rc) return rc; + /* Add DPLL sub-device cell for each DPLL channel */ + rc = devm_mfd_add_devices(zldev->dev, PLATFORM_DEVID_AUTO, zl3073x_devs, + chip_info->num_channels, NULL, 0, NULL); + if (rc) { + dev_err_probe(zldev->dev, rc, + "Failed to add DPLL sub-device\n"); + return rc; + } + /* Register the device as devlink device */ devlink = priv_to_devlink(zldev); devlink_register(devlink); diff --git a/include/linux/mfd/zl3073x.h b/include/linux/mfd/zl3073x.h index 4dc68013b69f..cf4663cab72a 100644 --- a/include/linux/mfd/zl3073x.h +++ b/include/linux/mfd/zl3073x.h @@ -12,6 +12,7 @@ struct regmap; /* * Hardware limits for ZL3073x chip family */ +#define ZL3073X_MAX_CHANNELS 5 #define ZL3073X_NUM_INPUTS 10 #define ZL3073X_NUM_OUTPUTS 10 #define ZL3073X_NUM_SYNTHS 5 @@ -48,6 +49,14 @@ struct zl3073x_synth { u8 dpll; }; +/** + * struct zl3073x_pdata - zl3073x sub-device platform data + * @channel: channel to use + */ +struct zl3073x_pdata { + u8 channel; +}; + /** * struct zl3073x_dev - zl3073x device * @dev: pointer to device -- 2.49.0