Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

reset: imx7: Add plubming to support multiple IP variants

In order to enable supporting i.MX8MQ with this driver, convert it to
expect variant specific bits to be passed via driver data.

Cc: p.zabel@pengutronix.de
Cc: Fabio Estevam <fabio.estevam@nxp.com>
Cc: cphealy@gmail.com
Cc: l.stach@pengutronix.de
Cc: Leonard Crestez <leonard.crestez@nxp.com>
Cc: "A.s. Dong" <aisheng.dong@nxp.com>
Cc: Richard Zhu <hongxing.zhu@nxp.com>
Cc: Rob Herring <robh@kernel.org>
Cc: devicetree@vger.kernel.org
Cc: linux-imx@nxp.com
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>

authored by

Andrey Smirnov and committed by
Philipp Zabel
10590358 77750bc0

+36 -14
+36 -14
drivers/reset/reset-imx7.c
··· 17 17 18 18 #include <linux/mfd/syscon.h> 19 19 #include <linux/mod_devicetable.h> 20 + #include <linux/of_device.h> 20 21 #include <linux/platform_device.h> 21 22 #include <linux/reset-controller.h> 22 23 #include <linux/regmap.h> 23 24 #include <dt-bindings/reset/imx7-reset.h> 24 25 26 + struct imx7_src_signal { 27 + unsigned int offset, bit; 28 + }; 29 + 30 + struct imx7_src_variant { 31 + const struct imx7_src_signal *signals; 32 + unsigned int signals_num; 33 + struct reset_control_ops ops; 34 + }; 35 + 25 36 struct imx7_src { 26 37 struct reset_controller_dev rcdev; 27 38 struct regmap *regmap; 39 + const struct imx7_src_signal *signals; 28 40 }; 29 41 30 42 enum imx7_src_registers { ··· 51 39 SRC_DDRC_RCR = 0x1000, 52 40 }; 53 41 54 - struct imx7_src_signal { 55 - unsigned int offset, bit; 56 - }; 42 + static int imx7_reset_update(struct imx7_src *imx7src, 43 + unsigned long id, unsigned int value) 44 + { 45 + const struct imx7_src_signal *signal = &imx7src->signals[id]; 46 + 47 + return regmap_update_bits(imx7src->regmap, 48 + signal->offset, signal->bit, value); 49 + } 57 50 58 51 static const struct imx7_src_signal imx7_src_signals[IMX7_RESET_NUM] = { 59 52 [IMX7_RESET_A7_CORE_POR_RESET0] = { SRC_A7RCR0, BIT(0) }, ··· 98 81 unsigned long id, bool assert) 99 82 { 100 83 struct imx7_src *imx7src = to_imx7_src(rcdev); 101 - const struct imx7_src_signal *signal = &imx7_src_signals[id]; 102 - unsigned int value = assert ? signal->bit : 0; 84 + const unsigned int bit = imx7src->signals[id].bit; 85 + unsigned int value = assert ? bit : 0; 103 86 104 87 switch (id) { 105 88 case IMX7_RESET_PCIEPHY: ··· 112 95 break; 113 96 114 97 case IMX7_RESET_PCIE_CTRL_APPS_EN: 115 - value = (assert) ? 0 : signal->bit; 98 + value = assert ? 0 : bit; 116 99 break; 117 100 } 118 101 119 - return regmap_update_bits(imx7src->regmap, 120 - signal->offset, signal->bit, value); 102 + return imx7_reset_update(imx7src, id, value); 121 103 } 122 104 123 105 static int imx7_reset_assert(struct reset_controller_dev *rcdev, ··· 131 115 return imx7_reset_set(rcdev, id, false); 132 116 } 133 117 134 - static const struct reset_control_ops imx7_reset_ops = { 135 - .assert = imx7_reset_assert, 136 - .deassert = imx7_reset_deassert, 118 + static const struct imx7_src_variant variant_imx7 = { 119 + .signals = imx7_src_signals, 120 + .signals_num = ARRAY_SIZE(imx7_src_signals), 121 + .ops = { 122 + .assert = imx7_reset_assert, 123 + .deassert = imx7_reset_deassert, 124 + }, 137 125 }; 138 126 139 127 static int imx7_reset_probe(struct platform_device *pdev) ··· 145 125 struct imx7_src *imx7src; 146 126 struct device *dev = &pdev->dev; 147 127 struct regmap_config config = { .name = "src" }; 128 + const struct imx7_src_variant *variant = of_device_get_match_data(dev); 148 129 149 130 imx7src = devm_kzalloc(dev, sizeof(*imx7src), GFP_KERNEL); 150 131 if (!imx7src) 151 132 return -ENOMEM; 152 133 134 + imx7src->signals = variant->signals; 153 135 imx7src->regmap = syscon_node_to_regmap(dev->of_node); 154 136 if (IS_ERR(imx7src->regmap)) { 155 137 dev_err(dev, "Unable to get imx7-src regmap"); ··· 160 138 regmap_attach_dev(dev, imx7src->regmap, &config); 161 139 162 140 imx7src->rcdev.owner = THIS_MODULE; 163 - imx7src->rcdev.nr_resets = IMX7_RESET_NUM; 164 - imx7src->rcdev.ops = &imx7_reset_ops; 141 + imx7src->rcdev.nr_resets = variant->signals_num; 142 + imx7src->rcdev.ops = &variant->ops; 165 143 imx7src->rcdev.of_node = dev->of_node; 166 144 167 145 return devm_reset_controller_register(dev, &imx7src->rcdev); 168 146 } 169 147 170 148 static const struct of_device_id imx7_reset_dt_ids[] = { 171 - { .compatible = "fsl,imx7d-src", }, 149 + { .compatible = "fsl,imx7d-src", .data = &variant_imx7 }, 172 150 { /* sentinel */ }, 173 151 }; 174 152