]> www.infradead.org Git - linux.git/commitdiff
clk: mediatek: reset: Support inuput argument index mode
authorRex-BC Chen <rex-bc.chen@mediatek.com>
Mon, 23 May 2022 09:33:35 +0000 (17:33 +0800)
committerStephen Boyd <sboyd@kernel.org>
Thu, 16 Jun 2022 00:24:12 +0000 (17:24 -0700)
There is a large number of mediatek infra reset bits, but we do not use
all of them. In addition, the proper input argement of reset controller
soulde be index.
Therefore, to be compatible with previous drivers and usage, we add
description variables to store the ids which can mapping to index.

To use this mode, we need to put the id in rst_idx_map to map from
index to ids. For example, if we want to input index 1 (this index
is used to set bank 1 bit 14) for svs, we need to declare the reset
controller like this:

In drivers:
static u16 rst_ofs[] = {
        0x120, 0x130, 0x140, 0x150, 0x730,
};

static u16 rst_idx_map[] = {
        0 * 32 + 0,
        1 * 32 + 14,
        ....
};

static const struct mtk_clk_rst_desc clk_rst_desc = {
        .version = MTK_RST_SET_CLR,
        .rst_bank_ofs = rst_ofs,
        .rst_bank_nr = ARRAY_SIZE(rst_ofs),
        .rst_idx_map = rst_idx_map,
        .rst_idx_map_nr = ARRAY_SIZE(rst_idx_map),
};

In dts:
svs: {
        ...
        resets = <&infra 1>;
        ...
};

Signed-off-by: Rex-BC Chen <rex-bc.chen@mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Reviewed-by: NĂ­colas F. R. A. Prado <nfraprado@collabora.com>
Tested-by: NĂ­colas F. R. A. Prado <nfraprado@collabora.com>
Link: https://lore.kernel.org/r/20220523093346.28493-9-rex-bc.chen@mediatek.com
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
drivers/clk/mediatek/reset.c
drivers/clk/mediatek/reset.h

index 11b2f74f121d90c4610b5b6a69234d8e5264767e..89e617ea639318269e4089c4f5506e577b167029 100644 (file)
@@ -98,6 +98,18 @@ static const struct reset_control_ops mtk_reset_ops_set_clr = {
        .reset = mtk_reset_set_clr,
 };
 
+static int reset_xlate(struct reset_controller_dev *rcdev,
+                      const struct of_phandle_args *reset_spec)
+{
+       struct mtk_clk_rst_data *data = to_mtk_clk_rst_data(rcdev);
+
+       if (reset_spec->args[0] >= rcdev->nr_resets ||
+           reset_spec->args[0] >= data->desc->rst_idx_map_nr)
+               return -EINVAL;
+
+       return data->desc->rst_idx_map[reset_spec->args[0]];
+}
+
 void mtk_register_reset_controller(struct device_node *np,
                                   const struct mtk_clk_rst_desc *desc)
 {
@@ -136,10 +148,17 @@ void mtk_register_reset_controller(struct device_node *np,
        data->desc = desc;
        data->regmap = regmap;
        data->rcdev.owner = THIS_MODULE;
-       data->rcdev.nr_resets = desc->rst_bank_nr * RST_NR_PER_BANK;
        data->rcdev.ops = rcops;
        data->rcdev.of_node = np;
 
+       if (data->desc->rst_idx_map_nr > 0) {
+               data->rcdev.of_reset_n_cells = 1;
+               data->rcdev.nr_resets = desc->rst_idx_map_nr;
+               data->rcdev.of_xlate = reset_xlate;
+       } else {
+               data->rcdev.nr_resets = desc->rst_bank_nr * RST_NR_PER_BANK;
+       }
+
        ret = reset_controller_register(&data->rcdev);
        if (ret) {
                pr_err("could not register reset controller: %d\n", ret);
index d991510ae2d86f4cc256db1f2b812bdb58698e84..cc847c67a2fc6a70b22ed9f58535b435f1562d5a 100644 (file)
@@ -28,11 +28,16 @@ enum mtk_reset_version {
  * @version: Reset version which is defined in enum mtk_reset_version.
  * @rst_bank_ofs: Pointer to an array containing base offsets of the reset register.
  * @rst_bank_nr: Quantity of reset bank.
+ * @rst_idx_map:Pointer to an array containing ids if input argument is index.
+ *             This array is not necessary if our input argument does not mean index.
+ * @rst_idx_map_nr: Quantity of reset index map.
  */
 struct mtk_clk_rst_desc {
        enum mtk_reset_version version;
        u16 *rst_bank_ofs;
        u32 rst_bank_nr;
+       u16 *rst_idx_map;
+       u32 rst_idx_map_nr;
 };
 
 /**