* [PATCH v2 1/9] reset: amlogic: convert driver to regmap
2024-07-18 9:57 [PATCH v2 0/9] reset: amlogic: move audio reset drivers out of CCF Jerome Brunet
@ 2024-07-18 9:57 ` Jerome Brunet
2024-07-18 12:45 ` Neil Armstrong
2024-07-18 9:57 ` [PATCH v2 2/9] reset: amlogic: use generic data matching function Jerome Brunet
` (8 subsequent siblings)
9 siblings, 1 reply; 15+ messages in thread
From: Jerome Brunet @ 2024-07-18 9:57 UTC (permalink / raw)
To: Philipp Zabel, Stephen Boyd, Neil Armstrong
Cc: Jerome Brunet, Jan Dakinevich, linux-kernel, linux-amlogic,
linux-clk
To allow using the same driver for the main reset controller and the
auxiliary ones embedded in the clock controllers, convert the
the Amlogic reset driver to regmap.
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
---
drivers/reset/reset-meson.c | 80 ++++++++++++++++++++-----------------
1 file changed, 44 insertions(+), 36 deletions(-)
diff --git a/drivers/reset/reset-meson.c b/drivers/reset/reset-meson.c
index f78be97898bc..8f3d6e9df235 100644
--- a/drivers/reset/reset-meson.c
+++ b/drivers/reset/reset-meson.c
@@ -11,36 +11,44 @@
#include <linux/of.h>
#include <linux/module.h>
#include <linux/platform_device.h>
+#include <linux/regmap.h>
#include <linux/reset-controller.h>
#include <linux/slab.h>
#include <linux/types.h>
-#define BITS_PER_REG 32
-
struct meson_reset_param {
int reg_count;
int level_offset;
};
struct meson_reset {
- void __iomem *reg_base;
const struct meson_reset_param *param;
struct reset_controller_dev rcdev;
- spinlock_t lock;
+ struct regmap *map;
};
+static void meson_reset_offset_and_bit(struct meson_reset *data,
+ unsigned long id,
+ unsigned int *offset,
+ unsigned int *bit)
+{
+ unsigned int stride = regmap_get_reg_stride(data->map);
+
+ *offset = (id / (stride * BITS_PER_BYTE)) * stride;
+ *bit = id % (stride * BITS_PER_BYTE);
+}
+
static int meson_reset_reset(struct reset_controller_dev *rcdev,
- unsigned long id)
+ unsigned long id)
{
struct meson_reset *data =
container_of(rcdev, struct meson_reset, rcdev);
- unsigned int bank = id / BITS_PER_REG;
- unsigned int offset = id % BITS_PER_REG;
- void __iomem *reg_addr = data->reg_base + (bank << 2);
+ unsigned int offset, bit;
- writel(BIT(offset), reg_addr);
+ meson_reset_offset_and_bit(data, id, &offset, &bit);
- return 0;
+ return regmap_update_bits(data->map, offset,
+ BIT(bit), BIT(bit));
}
static int meson_reset_level(struct reset_controller_dev *rcdev,
@@ -48,25 +56,13 @@ static int meson_reset_level(struct reset_controller_dev *rcdev,
{
struct meson_reset *data =
container_of(rcdev, struct meson_reset, rcdev);
- unsigned int bank = id / BITS_PER_REG;
- unsigned int offset = id % BITS_PER_REG;
- void __iomem *reg_addr;
- unsigned long flags;
- u32 reg;
+ unsigned int offset, bit;
- reg_addr = data->reg_base + data->param->level_offset + (bank << 2);
+ meson_reset_offset_and_bit(data, id, &offset, &bit);
+ offset += data->param->level_offset;
- spin_lock_irqsave(&data->lock, flags);
-
- reg = readl(reg_addr);
- if (assert)
- writel(reg & ~BIT(offset), reg_addr);
- else
- writel(reg | BIT(offset), reg_addr);
-
- spin_unlock_irqrestore(&data->lock, flags);
-
- return 0;
+ return regmap_update_bits(data->map, offset,
+ BIT(bit), assert ? 0 : BIT(bit));
}
static int meson_reset_assert(struct reset_controller_dev *rcdev,
@@ -113,30 +109,42 @@ static const struct of_device_id meson_reset_dt_ids[] = {
};
MODULE_DEVICE_TABLE(of, meson_reset_dt_ids);
+static const struct regmap_config regmap_config = {
+ .reg_bits = 32,
+ .val_bits = 32,
+ .reg_stride = 4,
+};
+
static int meson_reset_probe(struct platform_device *pdev)
{
+ struct device *dev = &pdev->dev;
struct meson_reset *data;
+ void __iomem *base;
- data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
+ data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
if (!data)
return -ENOMEM;
- data->reg_base = devm_platform_ioremap_resource(pdev, 0);
- if (IS_ERR(data->reg_base))
- return PTR_ERR(data->reg_base);
+ base = devm_platform_ioremap_resource(pdev, 0);
+ if (IS_ERR(base))
+ return PTR_ERR(base);
- data->param = of_device_get_match_data(&pdev->dev);
+ data->param = of_device_get_match_data(dev);
if (!data->param)
return -ENODEV;
- spin_lock_init(&data->lock);
+ data->map = devm_regmap_init_mmio(dev, base, ®map_config);
+ if (IS_ERR(data->map))
+ return dev_err_probe(dev, PTR_ERR(data->map),
+ "can't init regmap mmio region\n");
data->rcdev.owner = THIS_MODULE;
- data->rcdev.nr_resets = data->param->reg_count * BITS_PER_REG;
+ data->rcdev.nr_resets = data->param->reg_count * BITS_PER_BYTE
+ * regmap_config.reg_stride;
data->rcdev.ops = &meson_reset_ops;
- data->rcdev.of_node = pdev->dev.of_node;
+ data->rcdev.of_node = dev->of_node;
- return devm_reset_controller_register(&pdev->dev, &data->rcdev);
+ return devm_reset_controller_register(dev, &data->rcdev);
}
static struct platform_driver meson_reset_driver = {
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* Re: [PATCH v2 1/9] reset: amlogic: convert driver to regmap
2024-07-18 9:57 ` [PATCH v2 1/9] reset: amlogic: convert driver to regmap Jerome Brunet
@ 2024-07-18 12:45 ` Neil Armstrong
2024-07-18 17:19 ` Jerome Brunet
0 siblings, 1 reply; 15+ messages in thread
From: Neil Armstrong @ 2024-07-18 12:45 UTC (permalink / raw)
To: Jerome Brunet, Philipp Zabel, Stephen Boyd
Cc: Jan Dakinevich, linux-kernel, linux-amlogic, linux-clk
On 18/07/2024 11:57, Jerome Brunet wrote:
> To allow using the same driver for the main reset controller and the
> auxiliary ones embedded in the clock controllers, convert the
> the Amlogic reset driver to regmap.
>
> Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
> ---
> drivers/reset/reset-meson.c | 80 ++++++++++++++++++++-----------------
> 1 file changed, 44 insertions(+), 36 deletions(-)
>
> diff --git a/drivers/reset/reset-meson.c b/drivers/reset/reset-meson.c
> index f78be97898bc..8f3d6e9df235 100644
> --- a/drivers/reset/reset-meson.c
> +++ b/drivers/reset/reset-meson.c
> @@ -11,36 +11,44 @@
> #include <linux/of.h>
> #include <linux/module.h>
> #include <linux/platform_device.h>
> +#include <linux/regmap.h>
> #include <linux/reset-controller.h>
> #include <linux/slab.h>
> #include <linux/types.h>
>
> -#define BITS_PER_REG 32
> -
> struct meson_reset_param {
> int reg_count;
> int level_offset;
> };
>
> struct meson_reset {
> - void __iomem *reg_base;
> const struct meson_reset_param *param;
> struct reset_controller_dev rcdev;
> - spinlock_t lock;
> + struct regmap *map;
> };
>
> +static void meson_reset_offset_and_bit(struct meson_reset *data,
> + unsigned long id,
> + unsigned int *offset,
> + unsigned int *bit)
> +{
> + unsigned int stride = regmap_get_reg_stride(data->map);
> +
> + *offset = (id / (stride * BITS_PER_BYTE)) * stride;
> + *bit = id % (stride * BITS_PER_BYTE);
> +}
> +
> static int meson_reset_reset(struct reset_controller_dev *rcdev,
> - unsigned long id)
> + unsigned long id)
> {
> struct meson_reset *data =
> container_of(rcdev, struct meson_reset, rcdev);
> - unsigned int bank = id / BITS_PER_REG;
> - unsigned int offset = id % BITS_PER_REG;
> - void __iomem *reg_addr = data->reg_base + (bank << 2);
> + unsigned int offset, bit;
>
> - writel(BIT(offset), reg_addr);
> + meson_reset_offset_and_bit(data, id, &offset, &bit);
>
> - return 0;
> + return regmap_update_bits(data->map, offset,
> + BIT(bit), BIT(bit));
Here, you're converting a:
writel(BIT())
to a:
reg = readl()
reg |= BIT()
writel(reg)
so indeed you should use regmap_write(data->map, offset, BIT(bit))
> }
>
> static int meson_reset_level(struct reset_controller_dev *rcdev,
> @@ -48,25 +56,13 @@ static int meson_reset_level(struct reset_controller_dev *rcdev,
> {
> struct meson_reset *data =
> container_of(rcdev, struct meson_reset, rcdev);
> - unsigned int bank = id / BITS_PER_REG;
> - unsigned int offset = id % BITS_PER_REG;
> - void __iomem *reg_addr;
> - unsigned long flags;
> - u32 reg;
> + unsigned int offset, bit;
>
> - reg_addr = data->reg_base + data->param->level_offset + (bank << 2);
> + meson_reset_offset_and_bit(data, id, &offset, &bit);
> + offset += data->param->level_offset;
>
> - spin_lock_irqsave(&data->lock, flags);
> -
> - reg = readl(reg_addr);
> - if (assert)
> - writel(reg & ~BIT(offset), reg_addr);
> - else
> - writel(reg | BIT(offset), reg_addr);
> -
> - spin_unlock_irqrestore(&data->lock, flags);
> -
> - return 0;
> + return regmap_update_bits(data->map, offset,
> + BIT(bit), assert ? 0 : BIT(bit));
This one if fine
> }
>
> static int meson_reset_assert(struct reset_controller_dev *rcdev,
> @@ -113,30 +109,42 @@ static const struct of_device_id meson_reset_dt_ids[] = {
> };
> MODULE_DEVICE_TABLE(of, meson_reset_dt_ids);
>
> +static const struct regmap_config regmap_config = {
> + .reg_bits = 32,
> + .val_bits = 32,
> + .reg_stride = 4,
> +};
> +
> static int meson_reset_probe(struct platform_device *pdev)
> {
> + struct device *dev = &pdev->dev;
> struct meson_reset *data;
> + void __iomem *base;
>
> - data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
> + data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
> if (!data)
> return -ENOMEM;
>
> - data->reg_base = devm_platform_ioremap_resource(pdev, 0);
> - if (IS_ERR(data->reg_base))
> - return PTR_ERR(data->reg_base);
> + base = devm_platform_ioremap_resource(pdev, 0);
> + if (IS_ERR(base))
> + return PTR_ERR(base);
>
> - data->param = of_device_get_match_data(&pdev->dev);
> + data->param = of_device_get_match_data(dev);
> if (!data->param)
> return -ENODEV;
>
> - spin_lock_init(&data->lock);
> + data->map = devm_regmap_init_mmio(dev, base, ®map_config);
> + if (IS_ERR(data->map))
> + return dev_err_probe(dev, PTR_ERR(data->map),
> + "can't init regmap mmio region\n");
>
> data->rcdev.owner = THIS_MODULE;
> - data->rcdev.nr_resets = data->param->reg_count * BITS_PER_REG;
> + data->rcdev.nr_resets = data->param->reg_count * BITS_PER_BYTE
> + * regmap_config.reg_stride;
> data->rcdev.ops = &meson_reset_ops;
> - data->rcdev.of_node = pdev->dev.of_node;
> + data->rcdev.of_node = dev->of_node;
>
> - return devm_reset_controller_register(&pdev->dev, &data->rcdev);
> + return devm_reset_controller_register(dev, &data->rcdev);
> }
>
> static struct platform_driver meson_reset_driver = {
^ permalink raw reply [flat|nested] 15+ messages in thread* Re: [PATCH v2 1/9] reset: amlogic: convert driver to regmap
2024-07-18 12:45 ` Neil Armstrong
@ 2024-07-18 17:19 ` Jerome Brunet
0 siblings, 0 replies; 15+ messages in thread
From: Jerome Brunet @ 2024-07-18 17:19 UTC (permalink / raw)
To: Neil Armstrong
Cc: Philipp Zabel, Stephen Boyd, Jan Dakinevich, linux-kernel,
linux-amlogic, linux-clk
On Thu 18 Jul 2024 at 14:45, Neil Armstrong <neil.armstrong@linaro.org> wrote:
>> +
>> static int meson_reset_reset(struct reset_controller_dev *rcdev,
>> - unsigned long id)
>> + unsigned long id)
>> {
>> struct meson_reset *data =
>> container_of(rcdev, struct meson_reset, rcdev);
>> - unsigned int bank = id / BITS_PER_REG;
>> - unsigned int offset = id % BITS_PER_REG;
>> - void __iomem *reg_addr = data->reg_base + (bank << 2);
>> + unsigned int offset, bit;
>> - writel(BIT(offset), reg_addr);
>> + meson_reset_offset_and_bit(data, id, &offset, &bit);
>> - return 0;
>> + return regmap_update_bits(data->map, offset,
>> + BIT(bit), BIT(bit));
>
> Here, you're converting a:
> writel(BIT())
> to a:
> reg = readl()
> reg |= BIT()
> writel(reg)
>
> so indeed you should use regmap_write(data->map, offset, BIT(bit))
>
Ok the trouble is this particular register which is write only, not
some writel vs regmap problem. The read value is probably undefined.
I should not have changed which the migration anyway.
Thanks for pointing it out, I'll fix that in v3
--
Jerome
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v2 2/9] reset: amlogic: use generic data matching function
2024-07-18 9:57 [PATCH v2 0/9] reset: amlogic: move audio reset drivers out of CCF Jerome Brunet
2024-07-18 9:57 ` [PATCH v2 1/9] reset: amlogic: convert driver to regmap Jerome Brunet
@ 2024-07-18 9:57 ` Jerome Brunet
2024-07-18 9:57 ` [PATCH v2 3/9] reset: amlogic: make parameters unsigned Jerome Brunet
` (7 subsequent siblings)
9 siblings, 0 replies; 15+ messages in thread
From: Jerome Brunet @ 2024-07-18 9:57 UTC (permalink / raw)
To: Philipp Zabel, Stephen Boyd, Neil Armstrong
Cc: Jerome Brunet, Jan Dakinevich, linux-kernel, linux-amlogic,
linux-clk
There is no need to use the DT specific function to get
matching data, use the generic one instead
Suggested-by: Stephen Boyd <sboyd@kernel.org>
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
---
drivers/reset/reset-meson.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/reset/reset-meson.c b/drivers/reset/reset-meson.c
index 8f3d6e9df235..cd7dff5bff61 100644
--- a/drivers/reset/reset-meson.c
+++ b/drivers/reset/reset-meson.c
@@ -129,7 +129,7 @@ static int meson_reset_probe(struct platform_device *pdev)
if (IS_ERR(base))
return PTR_ERR(base);
- data->param = of_device_get_match_data(dev);
+ data->param = device_get_match_data(dev);
if (!data->param)
return -ENODEV;
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH v2 3/9] reset: amlogic: make parameters unsigned
2024-07-18 9:57 [PATCH v2 0/9] reset: amlogic: move audio reset drivers out of CCF Jerome Brunet
2024-07-18 9:57 ` [PATCH v2 1/9] reset: amlogic: convert driver to regmap Jerome Brunet
2024-07-18 9:57 ` [PATCH v2 2/9] reset: amlogic: use generic data matching function Jerome Brunet
@ 2024-07-18 9:57 ` Jerome Brunet
2024-07-18 9:57 ` [PATCH v2 4/9] reset: amlogic: add driver parameters Jerome Brunet
` (6 subsequent siblings)
9 siblings, 0 replies; 15+ messages in thread
From: Jerome Brunet @ 2024-07-18 9:57 UTC (permalink / raw)
To: Philipp Zabel, Stephen Boyd, Neil Armstrong
Cc: Jerome Brunet, Jan Dakinevich, linux-kernel, linux-amlogic,
linux-clk
register count and offset cannot be negative. Use unsigned integer
for this.
Suggested-by: Stephen Boyd <sboyd@kernel.org>
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
---
drivers/reset/reset-meson.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/reset/reset-meson.c b/drivers/reset/reset-meson.c
index cd7dff5bff61..a4705021b8f2 100644
--- a/drivers/reset/reset-meson.c
+++ b/drivers/reset/reset-meson.c
@@ -17,8 +17,8 @@
#include <linux/types.h>
struct meson_reset_param {
- int reg_count;
- int level_offset;
+ unsigned int reg_count;
+ unsigned int level_offset;
};
struct meson_reset {
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH v2 4/9] reset: amlogic: add driver parameters
2024-07-18 9:57 [PATCH v2 0/9] reset: amlogic: move audio reset drivers out of CCF Jerome Brunet
` (2 preceding siblings ...)
2024-07-18 9:57 ` [PATCH v2 3/9] reset: amlogic: make parameters unsigned Jerome Brunet
@ 2024-07-18 9:57 ` Jerome Brunet
2024-07-18 9:57 ` [PATCH v2 5/9] reset: amlogic: use reset number instead of register count Jerome Brunet
` (5 subsequent siblings)
9 siblings, 0 replies; 15+ messages in thread
From: Jerome Brunet @ 2024-07-18 9:57 UTC (permalink / raw)
To: Philipp Zabel, Stephen Boyd, Neil Armstrong
Cc: Jerome Brunet, Jan Dakinevich, linux-kernel, linux-amlogic,
linux-clk
To allow using the same driver for the main reset controller and the
auxiliary ones embedded in the clock controllers, allow to customise
the reset offset, same as the level offset. Also add an option to make
the level reset active low or high.
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
---
drivers/reset/reset-meson.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/drivers/reset/reset-meson.c b/drivers/reset/reset-meson.c
index a4705021b8f2..09b23f320f57 100644
--- a/drivers/reset/reset-meson.c
+++ b/drivers/reset/reset-meson.c
@@ -18,7 +18,9 @@
struct meson_reset_param {
unsigned int reg_count;
+ unsigned int reset_offset;
unsigned int level_offset;
+ bool level_low_reset;
};
struct meson_reset {
@@ -46,6 +48,7 @@ static int meson_reset_reset(struct reset_controller_dev *rcdev,
unsigned int offset, bit;
meson_reset_offset_and_bit(data, id, &offset, &bit);
+ offset += data->param->reset_offset;
return regmap_update_bits(data->map, offset,
BIT(bit), BIT(bit));
@@ -60,9 +63,10 @@ static int meson_reset_level(struct reset_controller_dev *rcdev,
meson_reset_offset_and_bit(data, id, &offset, &bit);
offset += data->param->level_offset;
+ assert ^= data->param->level_low_reset;
return regmap_update_bits(data->map, offset,
- BIT(bit), assert ? 0 : BIT(bit));
+ BIT(bit), assert ? BIT(bit) : 0);
}
static int meson_reset_assert(struct reset_controller_dev *rcdev,
@@ -85,17 +89,23 @@ static const struct reset_control_ops meson_reset_ops = {
static const struct meson_reset_param meson8b_param = {
.reg_count = 8,
+ .reset_offset = 0x0,
.level_offset = 0x7c,
+ .level_low_reset = true,
};
static const struct meson_reset_param meson_a1_param = {
.reg_count = 3,
+ .reset_offset = 0x0,
.level_offset = 0x40,
+ .level_low_reset = true,
};
static const struct meson_reset_param meson_s4_param = {
.reg_count = 6,
+ .reset_offset = 0x0,
.level_offset = 0x40,
+ .level_low_reset = true,
};
static const struct of_device_id meson_reset_dt_ids[] = {
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH v2 5/9] reset: amlogic: use reset number instead of register count
2024-07-18 9:57 [PATCH v2 0/9] reset: amlogic: move audio reset drivers out of CCF Jerome Brunet
` (3 preceding siblings ...)
2024-07-18 9:57 ` [PATCH v2 4/9] reset: amlogic: add driver parameters Jerome Brunet
@ 2024-07-18 9:57 ` Jerome Brunet
2024-07-18 9:57 ` [PATCH v2 6/9] reset: amlogic: add reset status support Jerome Brunet
` (4 subsequent siblings)
9 siblings, 0 replies; 15+ messages in thread
From: Jerome Brunet @ 2024-07-18 9:57 UTC (permalink / raw)
To: Philipp Zabel, Stephen Boyd, Neil Armstrong
Cc: Jerome Brunet, Jan Dakinevich, linux-kernel, linux-amlogic,
linux-clk
The reset driver from audio clock controller may register less
reset than a register can hold. To avoid making any change while
switching to auxiliary support, use the number of reset instead of the
register count to define the bounds of the reset controller.
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
---
drivers/reset/reset-meson.c | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/drivers/reset/reset-meson.c b/drivers/reset/reset-meson.c
index 09b23f320f57..5a5e1c2358b6 100644
--- a/drivers/reset/reset-meson.c
+++ b/drivers/reset/reset-meson.c
@@ -17,7 +17,7 @@
#include <linux/types.h>
struct meson_reset_param {
- unsigned int reg_count;
+ unsigned int reset_num;
unsigned int reset_offset;
unsigned int level_offset;
bool level_low_reset;
@@ -88,21 +88,21 @@ static const struct reset_control_ops meson_reset_ops = {
};
static const struct meson_reset_param meson8b_param = {
- .reg_count = 8,
+ .reset_num = 256,
.reset_offset = 0x0,
.level_offset = 0x7c,
.level_low_reset = true,
};
static const struct meson_reset_param meson_a1_param = {
- .reg_count = 3,
+ .reset_num = 96,
.reset_offset = 0x0,
.level_offset = 0x40,
.level_low_reset = true,
};
static const struct meson_reset_param meson_s4_param = {
- .reg_count = 6,
+ .reset_num = 192,
.reset_offset = 0x0,
.level_offset = 0x40,
.level_low_reset = true,
@@ -149,8 +149,7 @@ static int meson_reset_probe(struct platform_device *pdev)
"can't init regmap mmio region\n");
data->rcdev.owner = THIS_MODULE;
- data->rcdev.nr_resets = data->param->reg_count * BITS_PER_BYTE
- * regmap_config.reg_stride;
+ data->rcdev.nr_resets = data->param->reset_num;
data->rcdev.ops = &meson_reset_ops;
data->rcdev.of_node = dev->of_node;
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH v2 6/9] reset: amlogic: add reset status support
2024-07-18 9:57 [PATCH v2 0/9] reset: amlogic: move audio reset drivers out of CCF Jerome Brunet
` (4 preceding siblings ...)
2024-07-18 9:57 ` [PATCH v2 5/9] reset: amlogic: use reset number instead of register count Jerome Brunet
@ 2024-07-18 9:57 ` Jerome Brunet
2024-07-18 9:57 ` [PATCH v2 7/9] reset: amlogic: move drivers to a dedicated directory Jerome Brunet
` (3 subsequent siblings)
9 siblings, 0 replies; 15+ messages in thread
From: Jerome Brunet @ 2024-07-18 9:57 UTC (permalink / raw)
To: Philipp Zabel, Stephen Boyd, Neil Armstrong
Cc: Jerome Brunet, Jan Dakinevich, linux-kernel, linux-amlogic,
linux-clk
Add a callback to check the status of the level reset, as done in
the reset driver of the audio clock controller.
This is done keep the functionality when the audio reset controller
get migrated to meson-reset.
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
---
drivers/reset/reset-meson.c | 20 ++++++++++++++++++--
1 file changed, 18 insertions(+), 2 deletions(-)
diff --git a/drivers/reset/reset-meson.c b/drivers/reset/reset-meson.c
index 5a5e1c2358b6..b3ef1a1c7cf9 100644
--- a/drivers/reset/reset-meson.c
+++ b/drivers/reset/reset-meson.c
@@ -57,8 +57,7 @@ static int meson_reset_reset(struct reset_controller_dev *rcdev,
static int meson_reset_level(struct reset_controller_dev *rcdev,
unsigned long id, bool assert)
{
- struct meson_reset *data =
- container_of(rcdev, struct meson_reset, rcdev);
+ struct meson_reset *data = container_of(rcdev, struct meson_reset, rcdev);
unsigned int offset, bit;
meson_reset_offset_and_bit(data, id, &offset, &bit);
@@ -69,6 +68,22 @@ static int meson_reset_level(struct reset_controller_dev *rcdev,
BIT(bit), assert ? BIT(bit) : 0);
}
+static int meson_reset_status(struct reset_controller_dev *rcdev,
+ unsigned long id)
+{
+ struct meson_reset *data =
+ container_of(rcdev, struct meson_reset, rcdev);
+ unsigned int val, offset, bit;
+
+ meson_reset_offset_and_bit(data, id, &offset, &bit);
+ offset += data->param->level_offset;
+
+ regmap_read(data->map, offset, &val);
+ val = !!(BIT(bit) & val);
+
+ return val ^ data->param->level_low_reset;
+}
+
static int meson_reset_assert(struct reset_controller_dev *rcdev,
unsigned long id)
{
@@ -85,6 +100,7 @@ static const struct reset_control_ops meson_reset_ops = {
.reset = meson_reset_reset,
.assert = meson_reset_assert,
.deassert = meson_reset_deassert,
+ .status = meson_reset_status,
};
static const struct meson_reset_param meson8b_param = {
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH v2 7/9] reset: amlogic: move drivers to a dedicated directory
2024-07-18 9:57 [PATCH v2 0/9] reset: amlogic: move audio reset drivers out of CCF Jerome Brunet
` (5 preceding siblings ...)
2024-07-18 9:57 ` [PATCH v2 6/9] reset: amlogic: add reset status support Jerome Brunet
@ 2024-07-18 9:57 ` Jerome Brunet
2024-07-18 9:57 ` [PATCH v2 8/9] reset: amlogic: split the device core and platform probe Jerome Brunet
` (2 subsequent siblings)
9 siblings, 0 replies; 15+ messages in thread
From: Jerome Brunet @ 2024-07-18 9:57 UTC (permalink / raw)
To: Philipp Zabel, Stephen Boyd, Neil Armstrong
Cc: Jerome Brunet, Jan Dakinevich, linux-kernel, linux-amlogic,
linux-clk
The meson reset driver will be split in two part, one implemeting the ops,
the other providing the platform driver support. This will be done to
facilitate the addition of the auxiliary bus support.
To avoid making a mess in drivers/reset/ while doing so, move the amlogic
reset drivers to a dedicated directory.
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
---
drivers/reset/Kconfig | 15 +--------------
drivers/reset/Makefile | 3 +--
drivers/reset/amlogic/Kconfig | 13 +++++++++++++
drivers/reset/amlogic/Makefile | 2 ++
.../reset/{ => amlogic}/reset-meson-audio-arb.c | 0
drivers/reset/{ => amlogic}/reset-meson.c | 0
6 files changed, 17 insertions(+), 16 deletions(-)
create mode 100644 drivers/reset/amlogic/Kconfig
create mode 100644 drivers/reset/amlogic/Makefile
rename drivers/reset/{ => amlogic}/reset-meson-audio-arb.c (100%)
rename drivers/reset/{ => amlogic}/reset-meson.c (100%)
diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig
index 36cfdb81cd34..3015fb8bb6e5 100644
--- a/drivers/reset/Kconfig
+++ b/drivers/reset/Kconfig
@@ -139,20 +139,6 @@ config RESET_MCHP_SPARX5
help
This driver supports switch core reset for the Microchip Sparx5 SoC.
-config RESET_MESON
- tristate "Meson Reset Driver"
- depends on ARCH_MESON || COMPILE_TEST
- default ARCH_MESON
- help
- This enables the reset driver for Amlogic Meson SoCs.
-
-config RESET_MESON_AUDIO_ARB
- tristate "Meson Audio Memory Arbiter Reset Driver"
- depends on ARCH_MESON || COMPILE_TEST
- help
- This enables the reset driver for Audio Memory Arbiter of
- Amlogic's A113 based SoCs
-
config RESET_NPCM
bool "NPCM BMC Reset Driver" if COMPILE_TEST
default ARCH_NPCM
@@ -342,6 +328,7 @@ config RESET_ZYNQMP
help
This enables the reset controller driver for Xilinx ZynqMP SoCs.
+source "drivers/reset/amlogic/Kconfig"
source "drivers/reset/starfive/Kconfig"
source "drivers/reset/sti/Kconfig"
source "drivers/reset/hisilicon/Kconfig"
diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile
index 27b0bbdfcc04..bf089176c9f4 100644
--- a/drivers/reset/Makefile
+++ b/drivers/reset/Makefile
@@ -1,5 +1,6 @@
# SPDX-License-Identifier: GPL-2.0
obj-y += core.o
+obj-y += amlogic/
obj-y += hisilicon/
obj-y += starfive/
obj-y += sti/
@@ -20,8 +21,6 @@ obj-$(CONFIG_RESET_K210) += reset-k210.o
obj-$(CONFIG_RESET_LANTIQ) += reset-lantiq.o
obj-$(CONFIG_RESET_LPC18XX) += reset-lpc18xx.o
obj-$(CONFIG_RESET_MCHP_SPARX5) += reset-microchip-sparx5.o
-obj-$(CONFIG_RESET_MESON) += reset-meson.o
-obj-$(CONFIG_RESET_MESON_AUDIO_ARB) += reset-meson-audio-arb.o
obj-$(CONFIG_RESET_NPCM) += reset-npcm.o
obj-$(CONFIG_RESET_NUVOTON_MA35D1) += reset-ma35d1.o
obj-$(CONFIG_RESET_PISTACHIO) += reset-pistachio.o
diff --git a/drivers/reset/amlogic/Kconfig b/drivers/reset/amlogic/Kconfig
new file mode 100644
index 000000000000..7ed9cf50f038
--- /dev/null
+++ b/drivers/reset/amlogic/Kconfig
@@ -0,0 +1,13 @@
+config RESET_MESON
+ tristate "Meson Reset Driver"
+ depends on ARCH_MESON || COMPILE_TEST
+ default ARCH_MESON
+ help
+ This enables the reset driver for Amlogic Meson SoCs.
+
+config RESET_MESON_AUDIO_ARB
+ tristate "Meson Audio Memory Arbiter Reset Driver"
+ depends on ARCH_MESON || COMPILE_TEST
+ help
+ This enables the reset driver for Audio Memory Arbiter of
+ Amlogic's A113 based SoCs
diff --git a/drivers/reset/amlogic/Makefile b/drivers/reset/amlogic/Makefile
new file mode 100644
index 000000000000..55509fc78513
--- /dev/null
+++ b/drivers/reset/amlogic/Makefile
@@ -0,0 +1,2 @@
+obj-$(CONFIG_RESET_MESON) += reset-meson.o
+obj-$(CONFIG_RESET_MESON_AUDIO_ARB) += reset-meson-audio-arb.o
diff --git a/drivers/reset/reset-meson-audio-arb.c b/drivers/reset/amlogic/reset-meson-audio-arb.c
similarity index 100%
rename from drivers/reset/reset-meson-audio-arb.c
rename to drivers/reset/amlogic/reset-meson-audio-arb.c
diff --git a/drivers/reset/reset-meson.c b/drivers/reset/amlogic/reset-meson.c
similarity index 100%
rename from drivers/reset/reset-meson.c
rename to drivers/reset/amlogic/reset-meson.c
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH v2 8/9] reset: amlogic: split the device core and platform probe
2024-07-18 9:57 [PATCH v2 0/9] reset: amlogic: move audio reset drivers out of CCF Jerome Brunet
` (6 preceding siblings ...)
2024-07-18 9:57 ` [PATCH v2 7/9] reset: amlogic: move drivers to a dedicated directory Jerome Brunet
@ 2024-07-18 9:57 ` Jerome Brunet
2024-07-18 9:57 ` [PATCH v2 9/9] reset: amlogic: add auxiliary reset driver support Jerome Brunet
2024-07-18 14:20 ` [PATCH v2 0/9] reset: amlogic: move audio reset drivers out of CCF Jan Dakinevich
9 siblings, 0 replies; 15+ messages in thread
From: Jerome Brunet @ 2024-07-18 9:57 UTC (permalink / raw)
To: Philipp Zabel, Stephen Boyd, Neil Armstrong
Cc: Jerome Brunet, Jan Dakinevich, linux-kernel, linux-amlogic,
linux-clk
To prepare the addition of the auxiliary device support, split
out the device core function from the probe of the platform device.
The device core function will be common to both the platform and auxiliary
driver.
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
---
drivers/reset/amlogic/Kconfig | 10 +-
drivers/reset/amlogic/Makefile | 3 +-
.../{reset-meson.c => reset-meson-core.c} | 101 +++---------------
drivers/reset/amlogic/reset-meson-pltf.c | 92 ++++++++++++++++
drivers/reset/amlogic/reset-meson.h | 24 +++++
5 files changed, 143 insertions(+), 87 deletions(-)
rename drivers/reset/amlogic/{reset-meson.c => reset-meson-core.c} (51%)
create mode 100644 drivers/reset/amlogic/reset-meson-pltf.c
create mode 100644 drivers/reset/amlogic/reset-meson.h
diff --git a/drivers/reset/amlogic/Kconfig b/drivers/reset/amlogic/Kconfig
index 7ed9cf50f038..04c7be0f3165 100644
--- a/drivers/reset/amlogic/Kconfig
+++ b/drivers/reset/amlogic/Kconfig
@@ -1,9 +1,15 @@
+config RESET_MESON_CORE
+ tristate
+ select REGMAP
+
config RESET_MESON
- tristate "Meson Reset Driver"
+ tristate "Meson Reset Platform Driver"
depends on ARCH_MESON || COMPILE_TEST
default ARCH_MESON
+ select REGMAP_MMIO
+ select RESET_MESON_CORE
help
- This enables the reset driver for Amlogic Meson SoCs.
+ This enables the reset platform driver for Amlogic SoCs.
config RESET_MESON_AUDIO_ARB
tristate "Meson Audio Memory Arbiter Reset Driver"
diff --git a/drivers/reset/amlogic/Makefile b/drivers/reset/amlogic/Makefile
index 55509fc78513..0f8f9121b566 100644
--- a/drivers/reset/amlogic/Makefile
+++ b/drivers/reset/amlogic/Makefile
@@ -1,2 +1,3 @@
-obj-$(CONFIG_RESET_MESON) += reset-meson.o
+obj-$(CONFIG_RESET_MESON) += reset-meson-pltf.o
+obj-$(CONFIG_RESET_MESON_CORE) += reset-meson-core.o
obj-$(CONFIG_RESET_MESON_AUDIO_ARB) += reset-meson-audio-arb.o
diff --git a/drivers/reset/amlogic/reset-meson.c b/drivers/reset/amlogic/reset-meson-core.c
similarity index 51%
rename from drivers/reset/amlogic/reset-meson.c
rename to drivers/reset/amlogic/reset-meson-core.c
index b3ef1a1c7cf9..5e23f3212e6d 100644
--- a/drivers/reset/amlogic/reset-meson.c
+++ b/drivers/reset/amlogic/reset-meson-core.c
@@ -1,27 +1,17 @@
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
/*
- * Amlogic Meson Reset Controller driver
+ * Amlogic Meson Reset core functions
*
- * Copyright (c) 2016 BayLibre, SAS.
- * Author: Neil Armstrong <narmstrong@baylibre.com>
+ * Copyright (c) 2024 BayLibre, SAS.
+ * Author: Jerome Brunet <jbrunet@baylibre.com>
*/
-#include <linux/err.h>
-#include <linux/init.h>
-#include <linux/io.h>
-#include <linux/of.h>
+
+#include <linux/device.h>
#include <linux/module.h>
-#include <linux/platform_device.h>
#include <linux/regmap.h>
#include <linux/reset-controller.h>
-#include <linux/slab.h>
-#include <linux/types.h>
-
-struct meson_reset_param {
- unsigned int reset_num;
- unsigned int reset_offset;
- unsigned int level_offset;
- bool level_low_reset;
-};
+
+#include "reset-meson.h"
struct meson_reset {
const struct meson_reset_param *param;
@@ -103,84 +93,27 @@ static const struct reset_control_ops meson_reset_ops = {
.status = meson_reset_status,
};
-static const struct meson_reset_param meson8b_param = {
- .reset_num = 256,
- .reset_offset = 0x0,
- .level_offset = 0x7c,
- .level_low_reset = true,
-};
-
-static const struct meson_reset_param meson_a1_param = {
- .reset_num = 96,
- .reset_offset = 0x0,
- .level_offset = 0x40,
- .level_low_reset = true,
-};
-
-static const struct meson_reset_param meson_s4_param = {
- .reset_num = 192,
- .reset_offset = 0x0,
- .level_offset = 0x40,
- .level_low_reset = true,
-};
-
-static const struct of_device_id meson_reset_dt_ids[] = {
- { .compatible = "amlogic,meson8b-reset", .data = &meson8b_param},
- { .compatible = "amlogic,meson-gxbb-reset", .data = &meson8b_param},
- { .compatible = "amlogic,meson-axg-reset", .data = &meson8b_param},
- { .compatible = "amlogic,meson-a1-reset", .data = &meson_a1_param},
- { .compatible = "amlogic,meson-s4-reset", .data = &meson_s4_param},
- { .compatible = "amlogic,c3-reset", .data = &meson_s4_param},
- { /* sentinel */ },
-};
-MODULE_DEVICE_TABLE(of, meson_reset_dt_ids);
-
-static const struct regmap_config regmap_config = {
- .reg_bits = 32,
- .val_bits = 32,
- .reg_stride = 4,
-};
-
-static int meson_reset_probe(struct platform_device *pdev)
+int meson_reset_probe(struct device *dev, struct regmap *map,
+ const struct meson_reset_param *param)
{
- struct device *dev = &pdev->dev;
struct meson_reset *data;
- void __iomem *base;
data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
if (!data)
return -ENOMEM;
- base = devm_platform_ioremap_resource(pdev, 0);
- if (IS_ERR(base))
- return PTR_ERR(base);
-
- data->param = device_get_match_data(dev);
- if (!data->param)
- return -ENODEV;
-
- data->map = devm_regmap_init_mmio(dev, base, ®map_config);
- if (IS_ERR(data->map))
- return dev_err_probe(dev, PTR_ERR(data->map),
- "can't init regmap mmio region\n");
-
- data->rcdev.owner = THIS_MODULE;
- data->rcdev.nr_resets = data->param->reset_num;
+ data->param = param;
+ data->map = map;
+ data->rcdev.owner = dev->driver->owner;
+ data->rcdev.nr_resets = param->reset_num;
data->rcdev.ops = &meson_reset_ops;
data->rcdev.of_node = dev->of_node;
return devm_reset_controller_register(dev, &data->rcdev);
}
+EXPORT_SYMBOL_NS_GPL(meson_reset_probe, MESON_RESET);
-static struct platform_driver meson_reset_driver = {
- .probe = meson_reset_probe,
- .driver = {
- .name = "meson_reset",
- .of_match_table = meson_reset_dt_ids,
- },
-};
-module_platform_driver(meson_reset_driver);
-
-MODULE_DESCRIPTION("Amlogic Meson Reset Controller driver");
+MODULE_DESCRIPTION("Amlogic Meson Reset Core function");
MODULE_AUTHOR("Neil Armstrong <narmstrong@baylibre.com>");
-MODULE_LICENSE("Dual BSD/GPL");
+MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");
+MODULE_IMPORT_NS(MESON_RESET);
diff --git a/drivers/reset/amlogic/reset-meson-pltf.c b/drivers/reset/amlogic/reset-meson-pltf.c
new file mode 100644
index 000000000000..97e933b4aa34
--- /dev/null
+++ b/drivers/reset/amlogic/reset-meson-pltf.c
@@ -0,0 +1,92 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/*
+ * Amlogic Meson Reset platform driver
+ *
+ * Copyright (c) 2016 BayLibre, SAS.
+ * Author: Neil Armstrong <narmstrong@baylibre.com>
+ */
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+#include <linux/reset-controller.h>
+
+#include "reset-meson.h"
+
+static const struct meson_reset_param meson8b_param = {
+ .reset_num = 256,
+ .reset_offset = 0x0,
+ .level_offset = 0x7c,
+ .level_low_reset = true,
+};
+
+static const struct meson_reset_param meson_a1_param = {
+ .reset_num = 96,
+ .reset_offset = 0x0,
+ .level_offset = 0x40,
+ .level_low_reset = true,
+};
+
+static const struct meson_reset_param meson_s4_param = {
+ .reset_num = 192,
+ .reset_offset = 0x0,
+ .level_offset = 0x40,
+ .level_low_reset = true,
+};
+
+static const struct of_device_id meson_reset_dt_ids[] = {
+ { .compatible = "amlogic,meson8b-reset", .data = &meson8b_param},
+ { .compatible = "amlogic,meson-gxbb-reset", .data = &meson8b_param},
+ { .compatible = "amlogic,meson-axg-reset", .data = &meson8b_param},
+ { .compatible = "amlogic,meson-a1-reset", .data = &meson_a1_param},
+ { .compatible = "amlogic,meson-s4-reset", .data = &meson_s4_param},
+ { .compatible = "amlogic,c3-reset", .data = &meson_s4_param},
+ { /* sentinel */ },
+};
+MODULE_DEVICE_TABLE(of, meson_reset_dt_ids);
+
+static const struct regmap_config regmap_config = {
+ .reg_bits = 32,
+ .val_bits = 32,
+ .reg_stride = 4,
+};
+
+static int meson_reset_pltf_probe(struct platform_device *pdev)
+{
+ const struct meson_reset_param *param;
+ struct device *dev = &pdev->dev;
+ struct regmap *map;
+ void __iomem *base;
+
+ base = devm_platform_ioremap_resource(pdev, 0);
+ if (IS_ERR(base))
+ return PTR_ERR(base);
+
+ param = device_get_match_data(dev);
+ if (!param)
+ return -ENODEV;
+
+ map = devm_regmap_init_mmio(dev, base, ®map_config);
+ if (IS_ERR(map))
+ return dev_err_probe(dev, PTR_ERR(map),
+ "can't init regmap mmio region\n");
+
+ return meson_reset_probe(dev, map, param);
+}
+
+static struct platform_driver meson_reset_pltf_driver = {
+ .probe = meson_reset_pltf_probe,
+ .driver = {
+ .name = "meson_reset",
+ .of_match_table = meson_reset_dt_ids,
+ },
+};
+module_platform_driver(meson_reset_pltf_driver);
+
+MODULE_DESCRIPTION("Amlogic Meson Reset Platform Controller driver");
+MODULE_AUTHOR("Neil Armstrong <narmstrong@baylibre.com>");
+MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");
+MODULE_LICENSE("Dual BSD/GPL");
+MODULE_IMPORT_NS(MESON_RESET);
diff --git a/drivers/reset/amlogic/reset-meson.h b/drivers/reset/amlogic/reset-meson.h
new file mode 100644
index 000000000000..c2e8a5cf2e46
--- /dev/null
+++ b/drivers/reset/amlogic/reset-meson.h
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/*
+ * Copyright (c) 2024 BayLibre, SAS.
+ * Author: Jerome Brunet <jbrunet@baylibre.com>
+ */
+
+#ifndef __MESON_RESET_CORE_H
+#define __MESON_RESET_CORE_H
+
+#include <linux/module.h>
+#include <linux/regmap.h>
+#include <linux/reset-controller.h>
+
+struct meson_reset_param {
+ unsigned int reset_num;
+ unsigned int reset_offset;
+ unsigned int level_offset;
+ bool level_low_reset;
+};
+
+int meson_reset_probe(struct device *dev, struct regmap *map,
+ const struct meson_reset_param *param);
+
+#endif /* __MESON_RESET_CORE_H */
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* [PATCH v2 9/9] reset: amlogic: add auxiliary reset driver support
2024-07-18 9:57 [PATCH v2 0/9] reset: amlogic: move audio reset drivers out of CCF Jerome Brunet
` (7 preceding siblings ...)
2024-07-18 9:57 ` [PATCH v2 8/9] reset: amlogic: split the device core and platform probe Jerome Brunet
@ 2024-07-18 9:57 ` Jerome Brunet
2024-07-24 1:18 ` Jan Dakinevich
2024-07-18 14:20 ` [PATCH v2 0/9] reset: amlogic: move audio reset drivers out of CCF Jan Dakinevich
9 siblings, 1 reply; 15+ messages in thread
From: Jerome Brunet @ 2024-07-18 9:57 UTC (permalink / raw)
To: Philipp Zabel, Stephen Boyd, Neil Armstrong
Cc: Jerome Brunet, Jan Dakinevich, linux-kernel, linux-amlogic,
linux-clk
Add support for the reset controller present in the audio clock
controller of the g12 and sm1 SoC families, using the auxiliary bus.
This is expected to replace the driver currently present directly
within the related clock driver.
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
---
drivers/reset/amlogic/Kconfig | 8 ++
drivers/reset/amlogic/Makefile | 1 +
drivers/reset/amlogic/reset-meson-aux.c | 136 ++++++++++++++++++++
drivers/reset/amlogic/reset-meson-core.c | 25 +++-
drivers/reset/amlogic/reset-meson-pltf.c | 3 +
drivers/reset/amlogic/reset-meson.h | 4 +
include/soc/amlogic/meson-auxiliary-reset.h | 23 ++++
7 files changed, 198 insertions(+), 2 deletions(-)
create mode 100644 drivers/reset/amlogic/reset-meson-aux.c
create mode 100644 include/soc/amlogic/meson-auxiliary-reset.h
diff --git a/drivers/reset/amlogic/Kconfig b/drivers/reset/amlogic/Kconfig
index 04c7be0f3165..ee1c7620a2b1 100644
--- a/drivers/reset/amlogic/Kconfig
+++ b/drivers/reset/amlogic/Kconfig
@@ -11,6 +11,14 @@ config RESET_MESON
help
This enables the reset platform driver for Amlogic SoCs.
+config RESET_MESON_AUX
+ tristate "Meson Reset Platform Driver"
+ depends on ARCH_MESON || COMPILE_TEST
+ select AUXILIARY_BUS
+ select RESET_MESON_CORE
+ help
+ This enables the reset auxiliary driver for Amlogic SoCs.
+
config RESET_MESON_AUDIO_ARB
tristate "Meson Audio Memory Arbiter Reset Driver"
depends on ARCH_MESON || COMPILE_TEST
diff --git a/drivers/reset/amlogic/Makefile b/drivers/reset/amlogic/Makefile
index 0f8f9121b566..5d53a4b11ed9 100644
--- a/drivers/reset/amlogic/Makefile
+++ b/drivers/reset/amlogic/Makefile
@@ -1,3 +1,4 @@
obj-$(CONFIG_RESET_MESON) += reset-meson-pltf.o
+obj-$(CONFIG_RESET_MESON_AUX) += reset-meson-aux.o
obj-$(CONFIG_RESET_MESON_CORE) += reset-meson-core.o
obj-$(CONFIG_RESET_MESON_AUDIO_ARB) += reset-meson-audio-arb.o
diff --git a/drivers/reset/amlogic/reset-meson-aux.c b/drivers/reset/amlogic/reset-meson-aux.c
new file mode 100644
index 000000000000..caf26eb67c14
--- /dev/null
+++ b/drivers/reset/amlogic/reset-meson-aux.c
@@ -0,0 +1,136 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/*
+ * Amlogic Meson Reset Auxiliary driver
+ *
+ * Copyright (c) 2024 BayLibre, SAS.
+ * Author: Jerome Brunet <jbrunet@baylibre.com>
+ */
+
+#include <linux/err.h>
+#include <linux/module.h>
+#include <linux/auxiliary_bus.h>
+#include <linux/regmap.h>
+#include <linux/reset-controller.h>
+#include <linux/slab.h>
+
+#include "reset-meson.h"
+#include <soc/amlogic/meson-auxiliary-reset.h>
+
+static DEFINE_IDA(meson_rst_aux_ida);
+
+struct meson_reset_adev {
+ struct auxiliary_device adev;
+ struct regmap *map;
+};
+
+#define to_meson_reset_adev(_adev) \
+ container_of((_adev), struct meson_reset_adev, adev)
+
+static const struct meson_reset_param meson_g12a_audio_param = {
+ .reset_ops = &meson_reset_toggle_ops,
+ .reset_num = 26,
+ .level_offset = 0x24,
+};
+
+static const struct meson_reset_param meson_sm1_audio_param = {
+ .reset_ops = &meson_reset_toggle_ops,
+ .reset_num = 39,
+ .level_offset = 0x28,
+};
+
+static const struct auxiliary_device_id meson_reset_aux_ids[] = {
+ {
+ .name = "axg-audio-clkc.rst-g12a",
+ .driver_data = (kernel_ulong_t)&meson_g12a_audio_param,
+ }, {
+ .name = "axg-audio-clkc.rst-sm1",
+ .driver_data = (kernel_ulong_t)&meson_sm1_audio_param,
+ }, {}
+};
+MODULE_DEVICE_TABLE(auxiliary, meson_reset_aux_ids);
+
+static int meson_reset_aux_probe(struct auxiliary_device *adev,
+ const struct auxiliary_device_id *id)
+{
+ const struct meson_reset_param *param =
+ (const struct meson_reset_param *)(id->driver_data);
+ struct meson_reset_adev *raux =
+ to_meson_reset_adev(adev);
+
+ return meson_reset_probe(&adev->dev, raux->map, param);
+}
+
+static struct auxiliary_driver meson_reset_aux_driver = {
+ .probe = meson_reset_aux_probe,
+ .id_table = meson_reset_aux_ids,
+};
+module_auxiliary_driver(meson_reset_aux_driver);
+
+static void meson_rst_aux_release(struct device *dev)
+{
+ struct auxiliary_device *adev = to_auxiliary_dev(dev);
+ struct meson_reset_adev *raux =
+ to_meson_reset_adev(adev);
+
+ ida_free(&meson_rst_aux_ida, adev->id);
+ kfree(raux);
+}
+
+static void meson_rst_aux_unregister_adev(void *_adev)
+{
+ struct auxiliary_device *adev = _adev;
+
+ auxiliary_device_delete(adev);
+ auxiliary_device_uninit(adev);
+}
+
+int devm_meson_rst_aux_register(struct device *dev,
+ struct regmap *map,
+ const char *adev_name)
+{
+ struct meson_reset_adev *raux;
+ struct auxiliary_device *adev;
+ int ret;
+
+ raux = kzalloc(sizeof(*raux), GFP_KERNEL);
+ if (!raux)
+ return -ENOMEM;
+
+ ret = ida_alloc(&meson_rst_aux_ida, GFP_KERNEL);
+ if (ret < 0)
+ goto raux_free;
+
+ raux->map = map;
+
+ adev = &raux->adev;
+ adev->id = ret;
+ adev->name = adev_name;
+ adev->dev.parent = dev;
+ adev->dev.release = meson_rst_aux_release;
+ device_set_of_node_from_dev(&adev->dev, dev);
+
+ ret = auxiliary_device_init(adev);
+ if (ret)
+ goto ida_free;
+
+ ret = __auxiliary_device_add(adev, dev->driver->name);
+ if (ret) {
+ auxiliary_device_uninit(adev);
+ return ret;
+ }
+
+ return devm_add_action_or_reset(dev, meson_rst_aux_unregister_adev,
+ adev);
+
+ida_free:
+ ida_free(&meson_rst_aux_ida, adev->id);
+raux_free:
+ kfree(raux);
+ return ret;
+}
+EXPORT_SYMBOL_GPL(devm_meson_rst_aux_register);
+
+MODULE_DESCRIPTION("Amlogic Meson Reset Auxiliary driver");
+MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");
+MODULE_LICENSE("Dual BSD/GPL");
+MODULE_IMPORT_NS(MESON_RESET);
diff --git a/drivers/reset/amlogic/reset-meson-core.c b/drivers/reset/amlogic/reset-meson-core.c
index 5e23f3212e6d..1e5883b27c30 100644
--- a/drivers/reset/amlogic/reset-meson-core.c
+++ b/drivers/reset/amlogic/reset-meson-core.c
@@ -86,12 +86,33 @@ static int meson_reset_deassert(struct reset_controller_dev *rcdev,
return meson_reset_level(rcdev, id, false);
}
-static const struct reset_control_ops meson_reset_ops = {
+static int meson_reset_level_toggle(struct reset_controller_dev *rcdev,
+ unsigned long id)
+{
+ int ret;
+
+ ret = meson_reset_assert(rcdev, id);
+ if (ret)
+ return ret;
+
+ return meson_reset_deassert(rcdev, id);
+}
+
+const struct reset_control_ops meson_reset_ops = {
.reset = meson_reset_reset,
.assert = meson_reset_assert,
.deassert = meson_reset_deassert,
.status = meson_reset_status,
};
+EXPORT_SYMBOL_NS_GPL(meson_reset_ops, MESON_RESET);
+
+const struct reset_control_ops meson_reset_toggle_ops = {
+ .reset = meson_reset_level_toggle,
+ .assert = meson_reset_assert,
+ .deassert = meson_reset_deassert,
+ .status = meson_reset_status,
+};
+EXPORT_SYMBOL_NS_GPL(meson_reset_toggle_ops, MESON_RESET);
int meson_reset_probe(struct device *dev, struct regmap *map,
const struct meson_reset_param *param)
@@ -106,7 +127,7 @@ int meson_reset_probe(struct device *dev, struct regmap *map,
data->map = map;
data->rcdev.owner = dev->driver->owner;
data->rcdev.nr_resets = param->reset_num;
- data->rcdev.ops = &meson_reset_ops;
+ data->rcdev.ops = data->param->reset_ops;
data->rcdev.of_node = dev->of_node;
return devm_reset_controller_register(dev, &data->rcdev);
diff --git a/drivers/reset/amlogic/reset-meson-pltf.c b/drivers/reset/amlogic/reset-meson-pltf.c
index 97e933b4aa34..2bc3ea42c6ec 100644
--- a/drivers/reset/amlogic/reset-meson-pltf.c
+++ b/drivers/reset/amlogic/reset-meson-pltf.c
@@ -16,6 +16,7 @@
#include "reset-meson.h"
static const struct meson_reset_param meson8b_param = {
+ .reset_ops = &meson_reset_ops,
.reset_num = 256,
.reset_offset = 0x0,
.level_offset = 0x7c,
@@ -23,6 +24,7 @@ static const struct meson_reset_param meson8b_param = {
};
static const struct meson_reset_param meson_a1_param = {
+ .reset_ops = &meson_reset_ops,
.reset_num = 96,
.reset_offset = 0x0,
.level_offset = 0x40,
@@ -30,6 +32,7 @@ static const struct meson_reset_param meson_a1_param = {
};
static const struct meson_reset_param meson_s4_param = {
+ .reset_ops = &meson_reset_ops,
.reset_num = 192,
.reset_offset = 0x0,
.level_offset = 0x40,
diff --git a/drivers/reset/amlogic/reset-meson.h b/drivers/reset/amlogic/reset-meson.h
index c2e8a5cf2e46..5ab2ac9ab2e5 100644
--- a/drivers/reset/amlogic/reset-meson.h
+++ b/drivers/reset/amlogic/reset-meson.h
@@ -12,6 +12,7 @@
#include <linux/reset-controller.h>
struct meson_reset_param {
+ const struct reset_control_ops *reset_ops;
unsigned int reset_num;
unsigned int reset_offset;
unsigned int level_offset;
@@ -21,4 +22,7 @@ struct meson_reset_param {
int meson_reset_probe(struct device *dev, struct regmap *map,
const struct meson_reset_param *param);
+extern const struct reset_control_ops meson_reset_ops;
+extern const struct reset_control_ops meson_reset_toggle_ops;
+
#endif /* __MESON_RESET_CORE_H */
diff --git a/include/soc/amlogic/meson-auxiliary-reset.h b/include/soc/amlogic/meson-auxiliary-reset.h
new file mode 100644
index 000000000000..f70dd864ef6a
--- /dev/null
+++ b/include/soc/amlogic/meson-auxiliary-reset.h
@@ -0,0 +1,23 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __SOC_AMLOGIC_MESON_AUX_RESET_H
+#define __SOC_AMLOGIC_MESON_AUX_RESET_H
+
+#include <linux/err.h>
+
+struct device;
+struct regmap;
+
+#if IS_ENABLED(CONFIG_RESET_MESON_AUX)
+int devm_meson_rst_aux_register(struct device *dev,
+ struct regmap *map,
+ const char *adev_name);
+#else
+static inline int devm_meson_rst_aux_register(struct device *dev,
+ struct regmap *map,
+ const char *adev_name)
+{
+ return 0;
+}
+#endif
+
+#endif /* __SOC_AMLOGIC_MESON_AUX_RESET_H */
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread* Re: [PATCH v2 9/9] reset: amlogic: add auxiliary reset driver support
2024-07-18 9:57 ` [PATCH v2 9/9] reset: amlogic: add auxiliary reset driver support Jerome Brunet
@ 2024-07-24 1:18 ` Jan Dakinevich
0 siblings, 0 replies; 15+ messages in thread
From: Jan Dakinevich @ 2024-07-24 1:18 UTC (permalink / raw)
To: Jerome Brunet, Philipp Zabel, Stephen Boyd, Neil Armstrong
Cc: linux-kernel, linux-amlogic, linux-clk
On 7/18/24 12:57, Jerome Brunet wrote:
> Add support for the reset controller present in the audio clock
> controller of the g12 and sm1 SoC families, using the auxiliary bus.
>
> This is expected to replace the driver currently present directly
> within the related clock driver.
>
> Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
> ---
> drivers/reset/amlogic/Kconfig | 8 ++
> drivers/reset/amlogic/Makefile | 1 +
> drivers/reset/amlogic/reset-meson-aux.c | 136 ++++++++++++++++++++
> drivers/reset/amlogic/reset-meson-core.c | 25 +++-
> drivers/reset/amlogic/reset-meson-pltf.c | 3 +
> drivers/reset/amlogic/reset-meson.h | 4 +
> include/soc/amlogic/meson-auxiliary-reset.h | 23 ++++
> 7 files changed, 198 insertions(+), 2 deletions(-)
> create mode 100644 drivers/reset/amlogic/reset-meson-aux.c
> create mode 100644 include/soc/amlogic/meson-auxiliary-reset.h
>
> diff --git a/drivers/reset/amlogic/Kconfig b/drivers/reset/amlogic/Kconfig
> index 04c7be0f3165..ee1c7620a2b1 100644
> --- a/drivers/reset/amlogic/Kconfig
> +++ b/drivers/reset/amlogic/Kconfig
> @@ -11,6 +11,14 @@ config RESET_MESON
> help
> This enables the reset platform driver for Amlogic SoCs.
>
> +config RESET_MESON_AUX
> + tristate "Meson Reset Platform Driver"
Is it correct? I suppose you mean "... Auxiliary Driver", because there
is another "Meson Reset Platform Driver" several lines above.
> + depends on ARCH_MESON || COMPILE_TEST
> + select AUXILIARY_BUS
> + select RESET_MESON_CORE
> + help
> + This enables the reset auxiliary driver for Amlogic SoCs.
> +
> config RESET_MESON_AUDIO_ARB
> tristate "Meson Audio Memory Arbiter Reset Driver"
> depends on ARCH_MESON || COMPILE_TEST
> diff --git a/drivers/reset/amlogic/Makefile b/drivers/reset/amlogic/Makefile
> index 0f8f9121b566..5d53a4b11ed9 100644
> --- a/drivers/reset/amlogic/Makefile
> +++ b/drivers/reset/amlogic/Makefile
> @@ -1,3 +1,4 @@
> obj-$(CONFIG_RESET_MESON) += reset-meson-pltf.o
> +obj-$(CONFIG_RESET_MESON_AUX) += reset-meson-aux.o
> obj-$(CONFIG_RESET_MESON_CORE) += reset-meson-core.o
> obj-$(CONFIG_RESET_MESON_AUDIO_ARB) += reset-meson-audio-arb.o
> diff --git a/drivers/reset/amlogic/reset-meson-aux.c b/drivers/reset/amlogic/reset-meson-aux.c
> new file mode 100644
> index 000000000000..caf26eb67c14
> --- /dev/null
> +++ b/drivers/reset/amlogic/reset-meson-aux.c
> @@ -0,0 +1,136 @@
> +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
> +/*
> + * Amlogic Meson Reset Auxiliary driver
> + *
> + * Copyright (c) 2024 BayLibre, SAS.
> + * Author: Jerome Brunet <jbrunet@baylibre.com>
> + */
> +
> +#include <linux/err.h>
> +#include <linux/module.h>
> +#include <linux/auxiliary_bus.h>
> +#include <linux/regmap.h>
> +#include <linux/reset-controller.h>
> +#include <linux/slab.h>
> +
> +#include "reset-meson.h"
> +#include <soc/amlogic/meson-auxiliary-reset.h>
> +
> +static DEFINE_IDA(meson_rst_aux_ida);
> +
> +struct meson_reset_adev {
> + struct auxiliary_device adev;
> + struct regmap *map;
> +};
> +
> +#define to_meson_reset_adev(_adev) \
> + container_of((_adev), struct meson_reset_adev, adev)
> +
> +static const struct meson_reset_param meson_g12a_audio_param = {
> + .reset_ops = &meson_reset_toggle_ops,
> + .reset_num = 26,
> + .level_offset = 0x24,
> +};
> +
> +static const struct meson_reset_param meson_sm1_audio_param = {
> + .reset_ops = &meson_reset_toggle_ops,
> + .reset_num = 39,
> + .level_offset = 0x28,
> +};
> +
> +static const struct auxiliary_device_id meson_reset_aux_ids[] = {
> + {
> + .name = "axg-audio-clkc.rst-g12a",
> + .driver_data = (kernel_ulong_t)&meson_g12a_audio_param,
> + }, {
> + .name = "axg-audio-clkc.rst-sm1",
> + .driver_data = (kernel_ulong_t)&meson_sm1_audio_param,
> + }, {}
> +};
> +MODULE_DEVICE_TABLE(auxiliary, meson_reset_aux_ids);
> +
> +static int meson_reset_aux_probe(struct auxiliary_device *adev,
> + const struct auxiliary_device_id *id)
> +{
> + const struct meson_reset_param *param =
> + (const struct meson_reset_param *)(id->driver_data);
> + struct meson_reset_adev *raux =
> + to_meson_reset_adev(adev);
> +
> + return meson_reset_probe(&adev->dev, raux->map, param);
> +}
> +
> +static struct auxiliary_driver meson_reset_aux_driver = {
> + .probe = meson_reset_aux_probe,
> + .id_table = meson_reset_aux_ids,
> +};
> +module_auxiliary_driver(meson_reset_aux_driver);
> +
> +static void meson_rst_aux_release(struct device *dev)
> +{
> + struct auxiliary_device *adev = to_auxiliary_dev(dev);
> + struct meson_reset_adev *raux =
> + to_meson_reset_adev(adev);
> +
> + ida_free(&meson_rst_aux_ida, adev->id);
> + kfree(raux);
> +}
> +
> +static void meson_rst_aux_unregister_adev(void *_adev)
> +{
> + struct auxiliary_device *adev = _adev;
> +
> + auxiliary_device_delete(adev);
> + auxiliary_device_uninit(adev);
> +}
> +
> +int devm_meson_rst_aux_register(struct device *dev,
> + struct regmap *map,
> + const char *adev_name)
> +{
> + struct meson_reset_adev *raux;
> + struct auxiliary_device *adev;
> + int ret;
> +
> + raux = kzalloc(sizeof(*raux), GFP_KERNEL);
> + if (!raux)
> + return -ENOMEM;
> +
> + ret = ida_alloc(&meson_rst_aux_ida, GFP_KERNEL);
> + if (ret < 0)
> + goto raux_free;
> +
> + raux->map = map;
> +
> + adev = &raux->adev;
> + adev->id = ret;
> + adev->name = adev_name;
> + adev->dev.parent = dev;
> + adev->dev.release = meson_rst_aux_release;
> + device_set_of_node_from_dev(&adev->dev, dev);
> +
> + ret = auxiliary_device_init(adev);
> + if (ret)
> + goto ida_free;
> +
> + ret = __auxiliary_device_add(adev, dev->driver->name);
> + if (ret) {
> + auxiliary_device_uninit(adev);
> + return ret;
> + }
> +
> + return devm_add_action_or_reset(dev, meson_rst_aux_unregister_adev,
> + adev);
> +
> +ida_free:
> + ida_free(&meson_rst_aux_ida, adev->id);
> +raux_free:
> + kfree(raux);
> + return ret;
> +}
> +EXPORT_SYMBOL_GPL(devm_meson_rst_aux_register);
> +
> +MODULE_DESCRIPTION("Amlogic Meson Reset Auxiliary driver");
> +MODULE_AUTHOR("Jerome Brunet <jbrunet@baylibre.com>");
> +MODULE_LICENSE("Dual BSD/GPL");
> +MODULE_IMPORT_NS(MESON_RESET);
> diff --git a/drivers/reset/amlogic/reset-meson-core.c b/drivers/reset/amlogic/reset-meson-core.c
> index 5e23f3212e6d..1e5883b27c30 100644
> --- a/drivers/reset/amlogic/reset-meson-core.c
> +++ b/drivers/reset/amlogic/reset-meson-core.c
> @@ -86,12 +86,33 @@ static int meson_reset_deassert(struct reset_controller_dev *rcdev,
> return meson_reset_level(rcdev, id, false);
> }
>
> -static const struct reset_control_ops meson_reset_ops = {
> +static int meson_reset_level_toggle(struct reset_controller_dev *rcdev,
> + unsigned long id)
> +{
> + int ret;
> +
> + ret = meson_reset_assert(rcdev, id);
> + if (ret)
> + return ret;
> +
> + return meson_reset_deassert(rcdev, id);
> +}
> +
> +const struct reset_control_ops meson_reset_ops = {
> .reset = meson_reset_reset,
> .assert = meson_reset_assert,
> .deassert = meson_reset_deassert,
> .status = meson_reset_status,
> };
> +EXPORT_SYMBOL_NS_GPL(meson_reset_ops, MESON_RESET);
> +
> +const struct reset_control_ops meson_reset_toggle_ops = {
> + .reset = meson_reset_level_toggle,
> + .assert = meson_reset_assert,
> + .deassert = meson_reset_deassert,
> + .status = meson_reset_status,
> +};
> +EXPORT_SYMBOL_NS_GPL(meson_reset_toggle_ops, MESON_RESET);
>
> int meson_reset_probe(struct device *dev, struct regmap *map,
> const struct meson_reset_param *param)
> @@ -106,7 +127,7 @@ int meson_reset_probe(struct device *dev, struct regmap *map,
> data->map = map;
> data->rcdev.owner = dev->driver->owner;
> data->rcdev.nr_resets = param->reset_num;
> - data->rcdev.ops = &meson_reset_ops;
> + data->rcdev.ops = data->param->reset_ops;
> data->rcdev.of_node = dev->of_node;
>
> return devm_reset_controller_register(dev, &data->rcdev);
> diff --git a/drivers/reset/amlogic/reset-meson-pltf.c b/drivers/reset/amlogic/reset-meson-pltf.c
> index 97e933b4aa34..2bc3ea42c6ec 100644
> --- a/drivers/reset/amlogic/reset-meson-pltf.c
> +++ b/drivers/reset/amlogic/reset-meson-pltf.c
> @@ -16,6 +16,7 @@
> #include "reset-meson.h"
>
> static const struct meson_reset_param meson8b_param = {
> + .reset_ops = &meson_reset_ops,
> .reset_num = 256,
> .reset_offset = 0x0,
> .level_offset = 0x7c,
> @@ -23,6 +24,7 @@ static const struct meson_reset_param meson8b_param = {
> };
>
> static const struct meson_reset_param meson_a1_param = {
> + .reset_ops = &meson_reset_ops,
> .reset_num = 96,
> .reset_offset = 0x0,
> .level_offset = 0x40,
> @@ -30,6 +32,7 @@ static const struct meson_reset_param meson_a1_param = {
> };
>
> static const struct meson_reset_param meson_s4_param = {
> + .reset_ops = &meson_reset_ops,
> .reset_num = 192,
> .reset_offset = 0x0,
> .level_offset = 0x40,
> diff --git a/drivers/reset/amlogic/reset-meson.h b/drivers/reset/amlogic/reset-meson.h
> index c2e8a5cf2e46..5ab2ac9ab2e5 100644
> --- a/drivers/reset/amlogic/reset-meson.h
> +++ b/drivers/reset/amlogic/reset-meson.h
> @@ -12,6 +12,7 @@
> #include <linux/reset-controller.h>
>
> struct meson_reset_param {
> + const struct reset_control_ops *reset_ops;
> unsigned int reset_num;
> unsigned int reset_offset;
> unsigned int level_offset;
> @@ -21,4 +22,7 @@ struct meson_reset_param {
> int meson_reset_probe(struct device *dev, struct regmap *map,
> const struct meson_reset_param *param);
>
> +extern const struct reset_control_ops meson_reset_ops;
> +extern const struct reset_control_ops meson_reset_toggle_ops;
> +
> #endif /* __MESON_RESET_CORE_H */
> diff --git a/include/soc/amlogic/meson-auxiliary-reset.h b/include/soc/amlogic/meson-auxiliary-reset.h
> new file mode 100644
> index 000000000000..f70dd864ef6a
> --- /dev/null
> +++ b/include/soc/amlogic/meson-auxiliary-reset.h
> @@ -0,0 +1,23 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +#ifndef __SOC_AMLOGIC_MESON_AUX_RESET_H
> +#define __SOC_AMLOGIC_MESON_AUX_RESET_H
> +
> +#include <linux/err.h>
> +
> +struct device;
> +struct regmap;
> +
> +#if IS_ENABLED(CONFIG_RESET_MESON_AUX)
> +int devm_meson_rst_aux_register(struct device *dev,
> + struct regmap *map,
> + const char *adev_name);
> +#else
> +static inline int devm_meson_rst_aux_register(struct device *dev,
> + struct regmap *map,
> + const char *adev_name)
> +{
> + return 0;
> +}
> +#endif
> +
> +#endif /* __SOC_AMLOGIC_MESON_AUX_RESET_H */
--
Best regards
Jan Dakinevich
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 0/9] reset: amlogic: move audio reset drivers out of CCF
2024-07-18 9:57 [PATCH v2 0/9] reset: amlogic: move audio reset drivers out of CCF Jerome Brunet
` (8 preceding siblings ...)
2024-07-18 9:57 ` [PATCH v2 9/9] reset: amlogic: add auxiliary reset driver support Jerome Brunet
@ 2024-07-18 14:20 ` Jan Dakinevich
2024-07-18 17:20 ` Jerome Brunet
9 siblings, 1 reply; 15+ messages in thread
From: Jan Dakinevich @ 2024-07-18 14:20 UTC (permalink / raw)
To: Jerome Brunet, Philipp Zabel, Stephen Boyd, Neil Armstrong
Cc: linux-kernel, linux-amlogic, linux-clk
In previous series there was a patch "[PATCH 8/8] clk: amlogic:
axg-audio: use the auxiliary reset driver", but I don't see it here. Did
you removed it, or I missed something?
On 7/18/24 12:57, Jerome Brunet wrote:
> This patchset follows the discussion about having reset driver in the
> clock tree [1]. Ideally those should reside in the reset part of tree.
>
> Also the code of the amlogic reset driver is very similar between the 2
> trees and could use the same driver code.
>
> This patcheset alignes the reset drivers present in the reset and clock
> then adds support for the reset driver of audio clock controller found in
> the g12 and sm1 SoC family to the reset tree, using the auxiliary bus.
>
> The infrastructure put in place is meant to be generic enough so we may
> eventually also move the reset drivers in the meson8b and aoclk clock
> controllers.
>
> Changes since v1 [3]:
> * Fixes formatting errors reported by Stephen.
> * Changed parameters type to unsigned
> * Fix usage of ops passed as parameters, previously ignored.
> * Return 0 instead of an error if reset support is absent
> to properly decouple from the clock and have a weak
> dependency
> * Split the platform and auxiliary modules in 2 distinct modules
> to fix the COMPILE_TEST error reported by ktest robot.
>
> Change since RFC [2]:
> * Move the aux registration helper out of clock too.
>
> [1] https://lore.kernel.org/linux-clk/e3a85852b911fdf16dd9ae158f42b3ef.sboyd@kernel.org
> [2] https://lore.kernel.org/linux-clk/20240516150842.705844-1-jbrunet@baylibre.com
> [3] https://lore.kernel.org/linux-clk/20240710162526.2341399-1-jbrunet@baylibre.com
>
> Jerome Brunet (9):
> reset: amlogic: convert driver to regmap
> reset: amlogic: use generic data matching function
> reset: amlogic: make parameters unsigned
> reset: amlogic: add driver parameters
> reset: amlogic: use reset number instead of register count
> reset: amlogic: add reset status support
> reset: amlogic: move drivers to a dedicated directory
> reset: amlogic: split the device core and platform probe
> reset: amlogic: add auxiliary reset driver support
>
> drivers/reset/Kconfig | 15 +-
> drivers/reset/Makefile | 3 +-
> drivers/reset/amlogic/Kconfig | 27 ++++
> drivers/reset/amlogic/Makefile | 4 +
> .../{ => amlogic}/reset-meson-audio-arb.c | 0
> drivers/reset/amlogic/reset-meson-aux.c | 136 ++++++++++++++++
> drivers/reset/amlogic/reset-meson-core.c | 140 ++++++++++++++++
> drivers/reset/amlogic/reset-meson-pltf.c | 95 +++++++++++
> drivers/reset/amlogic/reset-meson.h | 28 ++++
> drivers/reset/reset-meson.c | 153 ------------------
> include/soc/amlogic/meson-auxiliary-reset.h | 23 +++
> 11 files changed, 455 insertions(+), 169 deletions(-)
> create mode 100644 drivers/reset/amlogic/Kconfig
> create mode 100644 drivers/reset/amlogic/Makefile
> rename drivers/reset/{ => amlogic}/reset-meson-audio-arb.c (100%)
> create mode 100644 drivers/reset/amlogic/reset-meson-aux.c
> create mode 100644 drivers/reset/amlogic/reset-meson-core.c
> create mode 100644 drivers/reset/amlogic/reset-meson-pltf.c
> create mode 100644 drivers/reset/amlogic/reset-meson.h
> delete mode 100644 drivers/reset/reset-meson.c
> create mode 100644 include/soc/amlogic/meson-auxiliary-reset.h
>
--
Best regards
Jan Dakinevich
^ permalink raw reply [flat|nested] 15+ messages in thread* Re: [PATCH v2 0/9] reset: amlogic: move audio reset drivers out of CCF
2024-07-18 14:20 ` [PATCH v2 0/9] reset: amlogic: move audio reset drivers out of CCF Jan Dakinevich
@ 2024-07-18 17:20 ` Jerome Brunet
0 siblings, 0 replies; 15+ messages in thread
From: Jerome Brunet @ 2024-07-18 17:20 UTC (permalink / raw)
To: Jan Dakinevich
Cc: Philipp Zabel, Stephen Boyd, Neil Armstrong, linux-kernel,
linux-amlogic, linux-clk
On Thu 18 Jul 2024 at 17:20, Jan Dakinevich <jan.dakinevich@salutedevices.com> wrote:
> In previous series there was a patch "[PATCH 8/8] clk: amlogic:
> axg-audio: use the auxiliary reset driver", but I don't see it here. Did
> you removed it, or I missed something?
It is meant for another tree and will be sent seperately
>
>
> On 7/18/24 12:57, Jerome Brunet wrote:
>> This patchset follows the discussion about having reset driver in the
>> clock tree [1]. Ideally those should reside in the reset part of tree.
>>
>> Also the code of the amlogic reset driver is very similar between the 2
>> trees and could use the same driver code.
>>
>> This patcheset alignes the reset drivers present in the reset and clock
>> then adds support for the reset driver of audio clock controller found in
>> the g12 and sm1 SoC family to the reset tree, using the auxiliary bus.
>>
>> The infrastructure put in place is meant to be generic enough so we may
>> eventually also move the reset drivers in the meson8b and aoclk clock
>> controllers.
>>
>> Changes since v1 [3]:
>> * Fixes formatting errors reported by Stephen.
>> * Changed parameters type to unsigned
>> * Fix usage of ops passed as parameters, previously ignored.
>> * Return 0 instead of an error if reset support is absent
>> to properly decouple from the clock and have a weak
>> dependency
>> * Split the platform and auxiliary modules in 2 distinct modules
>> to fix the COMPILE_TEST error reported by ktest robot.
>>
>> Change since RFC [2]:
>> * Move the aux registration helper out of clock too.
>>
>> [1] https://lore.kernel.org/linux-clk/e3a85852b911fdf16dd9ae158f42b3ef.sboyd@kernel.org
>> [2] https://lore.kernel.org/linux-clk/20240516150842.705844-1-jbrunet@baylibre.com
>> [3] https://lore.kernel.org/linux-clk/20240710162526.2341399-1-jbrunet@baylibre.com
>>
>> Jerome Brunet (9):
>> reset: amlogic: convert driver to regmap
>> reset: amlogic: use generic data matching function
>> reset: amlogic: make parameters unsigned
>> reset: amlogic: add driver parameters
>> reset: amlogic: use reset number instead of register count
>> reset: amlogic: add reset status support
>> reset: amlogic: move drivers to a dedicated directory
>> reset: amlogic: split the device core and platform probe
>> reset: amlogic: add auxiliary reset driver support
>>
>> drivers/reset/Kconfig | 15 +-
>> drivers/reset/Makefile | 3 +-
>> drivers/reset/amlogic/Kconfig | 27 ++++
>> drivers/reset/amlogic/Makefile | 4 +
>> .../{ => amlogic}/reset-meson-audio-arb.c | 0
>> drivers/reset/amlogic/reset-meson-aux.c | 136 ++++++++++++++++
>> drivers/reset/amlogic/reset-meson-core.c | 140 ++++++++++++++++
>> drivers/reset/amlogic/reset-meson-pltf.c | 95 +++++++++++
>> drivers/reset/amlogic/reset-meson.h | 28 ++++
>> drivers/reset/reset-meson.c | 153 ------------------
>> include/soc/amlogic/meson-auxiliary-reset.h | 23 +++
>> 11 files changed, 455 insertions(+), 169 deletions(-)
>> create mode 100644 drivers/reset/amlogic/Kconfig
>> create mode 100644 drivers/reset/amlogic/Makefile
>> rename drivers/reset/{ => amlogic}/reset-meson-audio-arb.c (100%)
>> create mode 100644 drivers/reset/amlogic/reset-meson-aux.c
>> create mode 100644 drivers/reset/amlogic/reset-meson-core.c
>> create mode 100644 drivers/reset/amlogic/reset-meson-pltf.c
>> create mode 100644 drivers/reset/amlogic/reset-meson.h
>> delete mode 100644 drivers/reset/reset-meson.c
>> create mode 100644 include/soc/amlogic/meson-auxiliary-reset.h
>>
--
Jerome
^ permalink raw reply [flat|nested] 15+ messages in thread